{"id":18,"date":"2026-09-03T06:24:49","date_gmt":"2026-09-03T06:24:49","guid":{"rendered":"https:\/\/angels-devils.adilbannar.my\/index.php\/admin\/"},"modified":"2026-09-03T06:24:49","modified_gmt":"2026-09-03T06:24:49","slug":"admin","status":"publish","type":"page","link":"https:\/\/angels-devils.adilbannar.my\/index.php\/admin\/","title":{"rendered":"Admin Panel"},"content":{"rendered":"<script>\nwindow.srpInitialUser = null;\n<\/script>\n<script src=\"https:\/\/angels-devils.adilbannar.my\/wp-content\/plugins\/street-rp\/assets\/js\/srp-svg-icons.js\"><\/script>\n<div class=\"srp-section\">\n    <h1 class=\"srp-section-title\">ADMIN <span class=\"accent\">PANEL<\/span><\/h1>\n    <p class=\"srp-section-subtitle\" id=\"srpAdminSub\">Manage whitelist applications, tickets and server<\/p>\n\n    <div id=\"srpAdminDenied\" style=\"display:none;\">\n        <div class=\"srp-card\" style=\"text-align:center;padding:48px;\">\n            <h3 style=\"margin-bottom:12px;color:var(--srp-red);\">Access Denied<\/h3>\n            <p style=\"color:var(--srp-gray);\">You do not have admin privileges to access this panel.<\/p>\n        <\/div>\n    <\/div>\n\n    <div id=\"srpAdminNotLogged\" style=\"display:none;\">\n        <div class=\"srp-card\" style=\"text-align:center;padding:48px;\">\n            <h3 style=\"margin-bottom:12px;color:var(--srp-red);\">Login Required<\/h3>\n            <p style=\"color:var(--srp-gray);margin-bottom:20px;\">Please login with Discord to access the admin panel.<\/p>\n            <a href=\"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/srp\/v1\/auth\/discord\" class=\"srp-btn srp-btn-discord\">Login with Discord<\/a>\n        <\/div>\n    <\/div>\n\n    <div id=\"srpAdminContent\" style=\"display:none;\">\n        <div id=\"srpAdminStats\" style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-bottom:32px;\"><\/div>\n\n        <div style=\"display:flex;gap:8px;margin-bottom:24px;flex-wrap:wrap;\" id=\"srpAdminNavTabs\">\n            <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminTab('whitelist')\" id=\"srpTabWhitelist\" style=\"flex:1;min-width:160px;justify-content:center;display:none;\">Whitelist Applications<\/button>\n            <button class=\"srp-btn\" onclick=\"srpAdminTab('tickets')\" id=\"srpTabTickets\" style=\"flex:1;min-width:160px;justify-content:center;display:none;background:var(--srp-darker);border-color:var(--srp-border);color:var(--srp-gray);\">Support Tickets<\/button>\n            <button class=\"srp-btn\" onclick=\"srpAdminTab('gang')\" id=\"srpTabGang\" style=\"flex:1;min-width:160px;justify-content:center;display:none;background:var(--srp-darker);border-color:var(--srp-border);color:var(--srp-gray);\">Gang Applications<\/button>\n            <button class=\"srp-btn\" onclick=\"srpAdminTab('rules')\" id=\"srpTabRules\" style=\"flex:1;min-width:160px;justify-content:center;display:none;background:var(--srp-darker);border-color:var(--srp-border);color:var(--srp-gray);\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" style=\"margin-right:6px;\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/><\/svg> Server Rules<\/button>\n            <button class=\"srp-btn\" onclick=\"srpAdminTab('permissions')\" id=\"srpTabPerms\" style=\"flex:1;min-width:160px;justify-content:center;display:none;background:var(--srp-darker);border-color:var(--srp-border);color:var(--srp-gray);\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" style=\"margin-right:6px;\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg> Roles & Permissions<\/button>\n        <\/div>\n\n        <div id=\"srpAdminRulesPanel\" style=\"display:none;\">\n            <div class=\"srp-card\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;flex-wrap:wrap;gap:12px;\">\n                    <div>\n                        <h2 style=\"margin:0 0 4px;font-size:22px;display:flex;align-items:center;gap:10px;\">\n                            <span>\ud83d\udcdc<\/span> Server Rules Manager\n                        <\/h2>\n                        <p style=\"color:var(--srp-gray);margin:0;font-size:14px;\">Add, edit, or remove server rules and categories displayed in the 3-column grid on the Rules page<\/p>\n                    <\/div>\n                    <div style=\"display:flex;gap:10px;flex-wrap:wrap;\">\n                        <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminOpenRuleModal(0)\" style=\"padding:8px 18px;font-size:13px;display:flex;align-items:center;gap:6px;\">\n                            <span>\u2795 Add New Rule<\/span>\n                        <\/button>\n                        <button class=\"srp-btn\" onclick=\"srpAdminOpenCategoryModal()\" style=\"padding:8px 16px;font-size:13px;background:#181824;border-color:var(--srp-cyan,#a855f7);color:var(--srp-cyan,#a855f7);display:flex;align-items:center;gap:6px;\">\n                            <span>\ud83d\udcc1 Manage Categories<\/span>\n                        <\/button>\n                        <button class=\"srp-btn\" onclick=\"srpAdminSeedRules()\" style=\"padding:8px 14px;font-size:13px;background:#1e1e2d;border-color:#333;\">\n                            <span>\ud83d\udd04 Reset Defaults<\/span>\n                        <\/button>\n                    <\/div>\n                <\/div>\n\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px;background:#0e0e14;padding:12px 16px;border-radius:10px;border:1px solid var(--srp-border);\">\n                    <div style=\"display:flex;gap:12px;align-items:center;flex:1;min-width:240px;\">\n                        <input type=\"text\" id=\"srpAdminRulesSearch\" placeholder=\"Filter rules by title or keyword...\" oninput=\"srpAdminRenderRulesTable()\" style=\"flex:1;max-width:360px;padding:8px 14px;background:#14141d;border:1px solid #282836;border-radius:6px;color:#fff;font-size:13px;\">\n                        <select id=\"srpAdminRulesCatFilter\" onchange=\"srpAdminRenderRulesTable()\" style=\"padding:8px 14px;border-radius:6px;border:1px solid #282836;background:#14141d;color:#fff;font-size:13px;\">\n                            <option value=\"all\">All Categories<\/option>\n                        <\/select>\n                    <\/div>\n                    <div style=\"font-size:13px;color:#888;\" id=\"srpAdminRulesCount\">0 rules<\/div>\n                <\/div>\n\n                <div id=\"srpAdminRulesTableContainer\" style=\"overflow-x:auto;\">\n                    <!-- Populated dynamically by JS -->\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"srpAdminWhitelistPanel\" style=\"display:none;\">\n            <div class=\"srp-card\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px;\">\n                    <h2 style=\"margin:0;\">Whitelist Applications<\/h2>\n                    <div style=\"display:flex;gap:8px;\">\n                        <select id=\"srpAdminFilter\" onchange=\"srpAdminLoadApps()\" style=\"padding:8px 12px;border-radius:var(--srp-radius);border:1px solid var(--srp-border);background:var(--srp-darker);color:var(--srp-white);\">\n                            <option value=\"\">All<\/option>\n                            <option value=\"pending\" selected>Pending<\/option>\n                            <option value=\"approved\">Approved<\/option>\n                            <option value=\"rejected\">Rejected<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n                <div id=\"srpAdminAppsList\"><\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"srpAdminTicketsPanel\" style=\"display:none;\">\n            <div class=\"srp-card\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px;\">\n                    <h2 style=\"margin:0;\">Support Tickets<\/h2>\n                    <div style=\"display:flex;gap:8px;\">\n                        <select id=\"srpAdminTicketFilter\" onchange=\"srpAdminLoadTickets()\" style=\"padding:8px 12px;border-radius:var(--srp-radius);border:1px solid var(--srp-border);background:var(--srp-darker);color:var(--srp-white);\">\n                            <option value=\"\">All<\/option>\n                            <option value=\"open\" selected>Open<\/option>\n                            <option value=\"in-progress\">In Progress<\/option>\n                            <option value=\"closed\">Closed<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n                <div id=\"srpAdminTicketsList\"><\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"srpAdminGangPanel\" style=\"display:none;\">\n            <div class=\"srp-card\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px;\">\n                    <h2 style=\"margin:0;\">Gang Applications<\/h2>\n                    <div style=\"display:flex;gap:8px;\">\n                        <select id=\"srpAdminGangFilter\" onchange=\"srpAdminLoadGangApps()\" style=\"padding:8px 12px;border-radius:var(--srp-radius);border:1px solid var(--srp-border);background:var(--srp-darker);color:var(--srp-white);\">\n                            <option value=\"\">All<\/option>\n                            <option value=\"pending\" selected>Pending<\/option>\n                            <option value=\"approved\">Approved<\/option>\n                            <option value=\"rejected\">Rejected<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n                <div id=\"srpAdminGangAppsList\"><\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"srpAdminPermsPanel\" style=\"display:none;\">\n            <div class=\"srp-card\" style=\"margin-bottom:24px;\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;flex-wrap:wrap;gap:12px;\">\n                    <div>\n                        <h2 style=\"margin:0 0 4px;font-size:22px;display:flex;align-items:center;gap:10px;\">\n                            <span>\ud83d\udc51<\/span> Roles & Team Permissions\n                        <\/h2>\n                        <p style=\"color:var(--srp-gray);margin:0;font-size:14px;\">Configure Discord Role IDs and staff team access permissions<\/p>\n                    <\/div>\n                    <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminSavePerms()\" id=\"srpBtnSavePerms\">Save All Permissions<\/button>\n                <\/div>\n\n                <div style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;margin-bottom:28px;\">\n                    <!-- Owner \/ Founder Roles -->\n                    <div style=\"background:rgba(255,215,0,0.04);border:1px solid rgba(255,215,0,0.25);border-radius:12px;padding:20px;\">\n                        <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px;\">\n                            <span style=\"font-size:22px;\">\ud83d\udc51<\/span>\n                            <div>\n                                <h3 style=\"margin:0;font-size:16px;color:#ffd700;\">Owner \/ Founder Roles<\/h3>\n                                <div style=\"font-size:12px;color:#888;\">Full master access to all tabs, settings, and permissions<\/div>\n                            <\/div>\n                        <\/div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;\">Discord Role IDs (comma-separated):<\/label>\n                        <input type=\"text\" id=\"srpRoleOwnerIds\" placeholder=\"e.g. 123456789012345678, 987654321098765432\" style=\"width:100%;padding:10px 14px;border-radius:8px;border:1px solid #333;background:#08080c;color:#fff;font-family:monospace;font-size:13px;\">\n                    <\/div>\n\n                    <!-- Whitelist Team Roles -->\n                    <div style=\"background:rgba(168, 85, 247, 0.04);border:1px solid rgba(168, 85, 247, 0.25);border-radius:12px;padding:20px;\">\n                        <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px;\">\n                            <span style=\"font-size:22px;\">\ud83d\udccb<\/span>\n                            <div>\n                                <h3 style=\"margin:0;font-size:16px;color:#a855f7;\">Whitelist Team Roles<\/h3>\n                                <div style=\"font-size:12px;color:#888;\">Staff who review whitelist applications<\/div>\n                            <\/div>\n                        <\/div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;\">Discord Role IDs (comma-separated):<\/label>\n                        <input type=\"text\" id=\"srpRoleWhitelistIds\" placeholder=\"e.g. 123456789012345678\" style=\"width:100%;padding:10px 14px;border-radius:8px;border:1px solid #333;background:#08080c;color:#fff;font-family:monospace;font-size:13px;\">\n                    <\/div>\n\n                    <!-- Gang Team Roles -->\n                    <div style=\"background:rgba(192,132,252,0.04);border:1px solid rgba(192,132,252,0.25);border-radius:12px;padding:20px;\">\n                        <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px;\">\n                            <span style=\"font-size:22px;\">\u2694\ufe0f<\/span>\n                            <div>\n                                <h3 style=\"margin:0;font-size:16px;color:#c084fc;\">Gang Team Roles<\/h3>\n                                <div style=\"font-size:12px;color:#888;\">Staff who review gang applications<\/div>\n                            <\/div>\n                        <\/div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;\">Discord Role IDs (comma-separated):<\/label>\n                        <input type=\"text\" id=\"srpRoleGangIds\" placeholder=\"e.g. 123456789012345678\" style=\"width:100%;padding:10px 14px;border-radius:8px;border:1px solid #333;background:#08080c;color:#fff;font-family:monospace;font-size:13px;\">\n                    <\/div>\n\n                    <!-- Support Team Roles -->\n                    <div style=\"background:rgba(96,165,250,0.04);border:1px solid rgba(96,165,250,0.25);border-radius:12px;padding:20px;\">\n                        <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px;\">\n                            <span style=\"font-size:22px;\">\ud83c\udfab<\/span>\n                            <div>\n                                <h3 style=\"margin:0;font-size:16px;color:#60a5fa;\">Support Team Roles<\/h3>\n                                <div style=\"font-size:12px;color:#888;\">Staff who handle player support tickets<\/div>\n                            <\/div>\n                        <\/div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;\">Discord Role IDs (comma-separated):<\/label>\n                        <input type=\"text\" id=\"srpRoleSupportIds\" placeholder=\"e.g. 123456789012345678\" style=\"width:100%;padding:10px 14px;border-radius:8px;border:1px solid #333;background:#08080c;color:#fff;font-family:monospace;font-size:13px;\">\n                    <\/div>\n\n                    <!-- General Admin Roles -->\n                    <div style=\"background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.15);border-radius:12px;padding:20px;\">\n                        <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px;\">\n                            <span style=\"font-size:22px;\">\ud83d\udee1\ufe0f<\/span>\n                            <div>\n                                <h3 style=\"margin:0;font-size:16px;color:#f1f1f6;\">General Admin Roles<\/h3>\n                                <div style=\"font-size:12px;color:#888;\">General server staff administrators<\/div>\n                            <\/div>\n                        <\/div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;\">Discord Role IDs (comma-separated):<\/label>\n                        <input type=\"text\" id=\"srpRoleAdminIds\" placeholder=\"e.g. 123456789012345678\" style=\"width:100%;padding:10px 14px;border-radius:8px;border:1px solid #333;background:#08080c;color:#fff;font-family:monospace;font-size:13px;\">\n                    <\/div>\n                <\/div>\n\n                <!-- Permission Matrix Table -->\n                <div style=\"margin-top:20px;border-top:1px solid rgba(255,255,255,0.08);padding-top:24px;\">\n                    <h3 style=\"margin:0 0 6px;font-size:17px;color:#fff;\">Team Capability Permissions<\/h3>\n                    <p style=\"color:#888;font-size:13px;margin:0 0 16px;\">Toggle which features and panels each staff team is permitted to manage.<\/p>\n                    \n                    <div style=\"overflow-x:auto;\">\n                        <table style=\"width:100%;border-collapse:collapse;text-align:left;font-size:14px;background:#0d0d12;border-radius:8px;overflow:hidden;border:1px solid #222;\">\n                            <thead>\n                                <tr style=\"background:#14141d;border-bottom:1px solid #282836;color:#aaa;\">\n                                    <th style=\"padding:14px 16px;\">Staff Team<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">Whitelist Apps<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">Support Tickets<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">Gang Apps<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">VIP Store<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">Rules Images<\/th>\n                                    <th style=\"padding:14px 16px;text-align:center;\">Form Builder<\/th>\n                                <\/tr>\n                            <\/thead>\n                            <tbody id=\"srpPermsMatrixBody\">\n                                <!-- Populated dynamically by JS -->\n                            <\/tbody>\n                        <\/table>\n                    <\/div>\n                <\/div>\n\n                <div style=\"margin-top:24px;display:flex;justify-content:flex-end;gap:12px;\">\n                    <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminSavePerms()\" style=\"padding:12px 28px;font-size:15px;font-weight:700;\">Save All Permissions<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"srpAdminReviewModal\" style=\"display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.85);z-index:9999;overflow-y:auto;\">\n    <div style=\"max-width:600px;margin:60px auto;background:#1a1a1a;border:1px solid #333;border-radius:12px;padding:28px;\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;\">\n            <h2 style=\"margin:0;color:var(--srp-white);\" id=\"srpReviewModalTitle\">Review<\/h2>\n            <button onclick=\"document.getElementById('srpAdminReviewModal').style.display='none'\" style=\"background:none;border:none;color:#888;font-size:28px;cursor:pointer;line-height:1;\">&times;<\/button>\n        <\/div>\n        <div id=\"srpAdminReviewContent\"><\/div>\n        <div id=\"srpAdminRejectSection\">\n            <div style=\"margin-top:20px;\">\n                <label style=\"display:block;margin-bottom:6px;color:#888;font-size:13px;\">Reject Reason (for rejection only):<\/label>\n                <textarea id=\"srpAdminRejectReason\" style=\"width:100%;min-height:80px;background:#111;border:1px solid #333;color:#fff;border-radius:6px;padding:10px;font-size:14px;\"><\/textarea>\n            <\/div>\n            <div style=\"margin-top:16px;display:flex;gap:12px;\">\n                <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminReviewApp('approved')\" style=\"background:#22c55e;border-color:#22c55e;flex:1;justify-content:center;\">Approve<\/button>\n                <button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminReviewApp('rejected')\" style=\"background:#dc2626;border-color:#dc2626;flex:1;justify-content:center;\">Reject<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"srpAdminTicketModal\" style=\"display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.85);z-index:9999;overflow-y:auto;backdrop-filter:blur(4px);\">\n    <div style=\"max-width:780px;width:94%;margin:40px auto;background:#0e0e14;border:1px solid #282836;border-radius:14px;overflow:hidden;box-shadow:0 24px 60px rgba(0,0,0,0.8);\">\n        <!-- Modal Header -->\n        <div style=\"display:flex;justify-content:space-between;align-items:center;padding:20px 24px;background:#14141d;border-bottom:1px solid #222230;\">\n            <div style=\"display:flex;align-items:center;gap:12px;min-width:0;\">\n                <span id=\"srpAdminModalTicketId\" style=\"font-size:13px;font-weight:700;color:var(--srp-cyan);background:rgba(168, 85, 247, 0.1);padding:4px 10px;border-radius:6px;\">#0<\/span>\n                <h3 id=\"srpAdminModalTicketSubject\" style=\"margin:0;font-size:17px;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\">Ticket Conversation<\/h3>\n            <\/div>\n            <div style=\"display:flex;align-items:center;gap:10px;\">\n                <span id=\"srpAdminModalTicketStatus\"><\/span>\n                <button onclick=\"document.getElementById('srpAdminTicketModal').style.display='none'\" style=\"background:none;border:none;color:#888;font-size:26px;cursor:pointer;line-height:1;padding:0 4px;\">&times;<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Ticket Meta Bar -->\n        <div id=\"srpAdminTicketInfoBar\" style=\"display:flex;justify-content:space-between;align-items:center;padding:12px 24px;background:#101018;border-bottom:1px solid #1c1c28;font-size:13px;color:#888;flex-wrap:wrap;gap:8px;\">\n            <div style=\"display:flex;gap:16px;align-items:center;\">\n                <span>User: <strong id=\"srpAdminModalTicketUser\" style=\"color:#fff;\">-<\/strong><\/span>\n                <span>Category: <strong id=\"srpAdminModalTicketCategory\" style=\"color:var(--srp-cyan);\">-<\/strong><\/span>\n                <span>Created: <span id=\"srpAdminModalTicketTime\">-<\/span><\/span>\n            <\/div>\n            <div style=\"display:flex;gap:8px;\">\n                <button class=\"srp-btn\" id=\"srpBtnTicketClose\" onclick=\"srpAdminTicketClose()\" style=\"padding:4px 12px;font-size:12px;background:rgba(34,197,94,0.15);border-color:rgba(34,197,94,0.3);color:#22c55e;\">Close Ticket<\/button>\n                <button class=\"srp-btn\" id=\"srpBtnTicketReopen\" onclick=\"srpAdminTicketReopen()\" style=\"padding:4px 12px;font-size:12px;background:rgba(245,158,11,0.15);border-color:rgba(245,158,11,0.3);color:#f59e0b;display:none;\">Reopen<\/button>\n                <button class=\"srp-btn\" id=\"srpBtnTicketDelete\" onclick=\"srpAdminTicketDelete()\" style=\"padding:4px 12px;font-size:12px;background:rgba(220,38,38,0.15);border-color:rgba(220,38,38,0.3);color:#ef4444;display:none;\">Delete<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Chat Messages Stream -->\n        <div id=\"srpAdminTicketChatStream\" style=\"height:380px;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:14px;background:#09090e;\">\n            <div style=\"text-align:center;color:#666;padding:40px;\">Loading conversation...<\/div>\n        <\/div>\n\n        <!-- Chat Reply Composer -->\n        <div style=\"padding:16px 24px;background:#14141d;border-top:1px solid #222230;\">\n            <div style=\"display:flex;gap:12px;align-items:flex-end;\">\n                <textarea id=\"srpAdminTicketReplyMsg\" placeholder=\"Type your staff reply here... (Shift+Enter for new line)\" style=\"flex:1;min-height:54px;max-height:120px;background:#0a0a0f;border:1px solid #282836;color:#fff;border-radius:8px;padding:12px 14px;font-size:14px;resize:vertical;font-family:inherit;\" onkeydown=\"if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();srpAdminTicketReply();}\"><\/textarea>\n                <button class=\"srp-btn srp-btn-red\" id=\"srpAdminBtnSendReply\" onclick=\"srpAdminTicketReply()\" style=\"padding:14px 22px;font-weight:700;display:flex;align-items:center;gap:6px;flex-shrink:0;\">\n                    <span>Send Reply<\/span>\n                    <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M22 2L11 13\"\/><path d=\"M22 2l-7 20-4-9-9-4 20-7z\"\/><\/svg>\n                <\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"srpGangReviewModal\" style=\"display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.85);z-index:9999;overflow-y:auto;\">\n    <div style=\"max-width:600px;margin:60px auto;background:#1a1a1a;border:1px solid #333;border-radius:12px;padding:28px;\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;\">\n            <h2 style=\"margin:0;color:var(--srp-white);\" id=\"srpGangReviewTitle\">Review Gang Application<\/h2>\n            <button onclick=\"document.getElementById('srpGangReviewModal').style.display='none'\" style=\"background:none;border:none;color:#888;font-size:28px;cursor:pointer;line-height:1;\">&times;<\/button>\n        <\/div>\n        <div id=\"srpGangReviewContent\"><\/div>\n        <div id=\"srpGangRejectSection\">\n            <div style=\"margin-top:20px;\">\n                <label style=\"display:block;margin-bottom:6px;color:#888;font-size:13px;\">Reject Reason (for rejection only):<\/label>\n                <textarea id=\"srpGangRejectReason\" style=\"width:100%;min-height:80px;background:#111;border:1px solid #333;color:#fff;border-radius:6px;padding:10px;font-size:14px;\"><\/textarea>\n            <\/div>\n            <div style=\"margin-top:16px;display:flex;gap:12px;\">\n                <button class=\"srp-btn\" onclick=\"srpGangReviewAction('approved')\" style=\"background:#22c55e;border-color:#22c55e;flex:1;justify-content:center;\">Approve<\/button>\n                <button class=\"srp-btn srp-btn-red\" onclick=\"srpGangReviewAction('rejected')\" style=\"background:#dc2626;border-color:#dc2626;flex:1;justify-content:center;\">Reject<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"srpAdminRuleModal\" style=\"display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.85);z-index:9999;overflow-y:auto;backdrop-filter:blur(4px);\">\n    <div style=\"max-width:820px;width:94%;margin:30px auto;background:#121218;border:1px solid #282836;border-radius:14px;overflow:hidden;box-shadow:0 24px 60px rgba(0,0,0,0.85);\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;padding:18px 24px;background:#181824;border-bottom:1px solid #282838;\">\n            <h3 id=\"srpAdminRuleModalTitle\" style=\"margin:0;font-size:18px;color:#fff;\">Add Server Rule<\/h3>\n            <button onclick=\"document.getElementById('srpAdminRuleModal').style.display='none'\" style=\"background:none;border:none;color:#888;font-size:26px;cursor:pointer;line-height:1;\">&times;<\/button>\n        <\/div>\n\n        <div style=\"padding:24px;\">\n            <input type=\"hidden\" id=\"srpModalRuleId\" value=\"0\">\n\n            <!-- Category Selector -->\n            <div style=\"background:#161622;padding:16px;border-radius:10px;border:1px solid #28283a;margin-bottom:18px;\">\n                <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:8px;font-weight:600;\">Assign To Category:<\/label>\n                <div style=\"display:flex;gap:10px;align-items:center;\">\n                    <select id=\"srpModalRuleCategorySelect\" onchange=\"srpAdminOnModalCategoryChange()\" style=\"flex:1;padding:10px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:14px;\">\n                        <!-- Filled by JS -->\n                    <\/select>\n                    <button type=\"button\" onclick=\"srpAdminOpenCategoryModal()\" class=\"srp-btn\" style=\"padding:8px 14px;font-size:12px;background:#1e1e2d;border-color:var(--srp-cyan,#a855f7);color:var(--srp-cyan,#a855f7);white-space:nowrap;\">\n                        \u2795 Manage \/ New Category\n                    <\/button>\n                <\/div>\n            <\/div>\n\n            <!-- Vector SVG Icon Picker -->\n            <div style=\"background:#161622;padding:16px;border-radius:10px;border:1px solid #28283a;margin-bottom:18px;\">\n                <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;flex-wrap:wrap;gap:12px;\">\n                    <div style=\"display:flex;align-items:center;gap:12px;\">\n                        <div id=\"srpModalRuleSvgPreview\" style=\"width:52px;height:52px;border-radius:12px;background:rgba(168, 85, 247, 0.08);border:2px solid var(--srp-cyan,#a855f7);color:var(--srp-cyan,#a855f7);display:flex;align-items:center;justify-content:center;box-shadow:0 0 16px rgba(168, 85, 247, 0.25);\">\n                            <!-- SVG Preview -->\n                        <\/div>\n                        <div>\n                            <div style=\"font-size:13px;font-weight:700;color:#fff;\">Vector SVG Icon<\/div>\n                            <input type=\"text\" id=\"srpModalRuleEmoji\" value=\"scale\" oninput=\"srpAdminUpdateRuleIconPreview(this.value)\" placeholder=\"e.g. shield, scale, swords, car, skull...\" style=\"margin-top:4px;padding:5px 10px;background:#09090e;border:1px solid #282836;border-radius:6px;color:#fff;font-size:12px;width:180px;\">\n                        <\/div>\n                    <\/div>\n\n                    <!-- SVG Icon Category Tabs -->\n                    <div style=\"display:flex;gap:4px;flex-wrap:wrap;\" id=\"srpEmojiTabButtons\">\n                        <button type=\"button\" class=\"srp-btn\" onclick=\"srpSelectEmojiTab('rp', this)\" style=\"padding:5px 11px;font-size:11.5px;background:var(--srp-cyan,#a855f7);color:#000;font-weight:700;\">Roleplay<\/button>\n                        <button type=\"button\" class=\"srp-btn\" onclick=\"srpSelectEmojiTab('crime', this)\" style=\"padding:5px 11px;font-size:11.5px;background:#111;color:#aaa;\">Combat & Crime<\/button>\n                        <button type=\"button\" class=\"srp-btn\" onclick=\"srpSelectEmojiTab('vehicles', this)\" style=\"padding:5px 11px;font-size:11.5px;background:#111;color:#aaa;\">Vehicles<\/button>\n                        <button type=\"button\" class=\"srp-btn\" onclick=\"srpSelectEmojiTab('services', this)\" style=\"padding:5px 11px;font-size:11.5px;background:#111;color:#aaa;\">Law & EMS<\/button>\n                        <button type=\"button\" class=\"srp-btn\" onclick=\"srpSelectEmojiTab('vip', this)\" style=\"padding:5px 11px;font-size:11.5px;background:#111;color:#aaa;\">VIP & Badges<\/button>\n                    <\/div>\n                <\/div>\n\n                <div style=\"display:grid;grid-template-columns:repeat(auto-fill, minmax(105px, 1fr));gap:8px;max-height:140px;overflow-y:auto;padding:8px;background:#0d0d14;border-radius:8px;border:1px solid #222230;\" id=\"srpModalEmojiPalette\">\n                    <!-- SVG items rendered by JS -->\n                <\/div>\n            <\/div>\n\n            <!-- Title Inputs -->\n            <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px;\">\n                <div>\n                    <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Rule Title (English):<\/label>\n                    <input type=\"text\" id=\"srpModalRuleTitle\" placeholder=\"e.g. Always Stay In Character (IC)\" style=\"width:100%;padding:10px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:14px;\">\n                <\/div>\n                <div>\n                    <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Rule Title (Arabic \/ Optional):<\/label>\n                    <input type=\"text\" id=\"srpModalRuleTitleAr\" placeholder=\"e.g. \u0627\u0644\u0628\u0642\u0627\u0621 \u062f\u0627\u0626\u0645\u0627\u064b \u062f\u0627\u062e\u0644 \u0627\u0644\u0634\u062e\u0635\u064a\u0629\" dir=\"rtl\" style=\"width:100%;padding:10px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:14px;\">\n                <\/div>\n            <\/div>\n\n            <!-- Description Inputs -->\n            <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px;\">\n                <div>\n                    <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Description (English):<\/label>\n                    <textarea id=\"srpModalRuleDesc\" rows=\"4\" placeholder=\"Rule explanation...\" style=\"width:100%;padding:10px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:13.5px;line-height:1.5;\"><\/textarea>\n                <\/div>\n                <div>\n                    <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Description (Arabic \/ Optional):<\/label>\n                    <textarea id=\"srpModalRuleDescAr\" rows=\"4\" placeholder=\"\u0634\u0631\u062d \u062a\u0641\u0635\u064a\u0644\u064a \u0644\u0644\u0642\u0627\u0646\u0648\u0646...\" dir=\"rtl\" style=\"width:100%;padding:10px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:13.5px;line-height:1.5;\"><\/textarea>\n                <\/div>\n            <\/div>\n\n            <div style=\"display:flex;gap:20px;align-items:center;margin-top:10px;\">\n                <div>\n                    <label style=\"font-size:12px;color:#aaa;font-weight:600;margin-right:8px;\">Sort Order:<\/label>\n                    <input type=\"number\" id=\"srpModalRuleOrder\" value=\"10\" style=\"width:70px;padding:8px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:6px;\">\n                <\/div>\n                <div>\n                    <label style=\"font-size:13px;color:#fff;display:inline-flex;align-items:center;gap:6px;cursor:pointer;\">\n                        <input type=\"checkbox\" id=\"srpModalRuleActive\" checked>\n                        Active (Visible on website)\n                    <\/label>\n                <\/div>\n                <div style=\"margin-left:auto;display:flex;gap:10px;\">\n                    <button class=\"srp-btn\" onclick=\"document.getElementById('srpAdminRuleModal').style.display='none'\" style=\"background:#222;border-color:#333;\">Cancel<\/button>\n                    <button class=\"srp-btn srp-btn-red\" id=\"srpBtnSaveRuleModal\" onclick=\"srpAdminSaveRule()\">Save Rule<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Category Management Modal -->\n<div id=\"srpAdminCategoryModal\" style=\"display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.85);z-index:10000;overflow-y:auto;backdrop-filter:blur(5px);\">\n    <div style=\"max-width:760px;width:94%;margin:30px auto;background:#121218;border:1px solid #282836;border-radius:14px;overflow:hidden;box-shadow:0 24px 60px rgba(0,0,0,0.85);\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;padding:18px 24px;background:#181824;border-bottom:1px solid #282838;\">\n            <h3 id=\"srpCatModalHeading\" style=\"margin:0;font-size:18px;color:#fff;\">\ud83d\udcc1 Manage Rule Categories<\/h3>\n            <button onclick=\"document.getElementById('srpAdminCategoryModal').style.display='none'\" style=\"background:none;border:none;color:#888;font-size:26px;cursor:pointer;line-height:1;\">&times;<\/button>\n        <\/div>\n\n        <div style=\"padding:24px;\">\n            <!-- Add \/ Edit Category Form -->\n            <div style=\"background:#161622;padding:18px;border-radius:10px;border:1px solid #28283a;margin-bottom:22px;\">\n                <h4 id=\"srpCatFormTitle\" style=\"margin:0 0 14px;color:var(--srp-cyan,#a855f7);font-size:15px;\">\u2795 Add New Category<\/h4>\n                <input type=\"hidden\" id=\"srpCatOldSlug\" value=\"\">\n\n                <div style=\"display:grid;grid-template-columns:120px 1fr 1fr;gap:14px;margin-bottom:14px;align-items:flex-end;\">\n                    <div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">SVG Icon<\/label>\n                        <div style=\"display:flex;gap:6px;align-items:center;\">\n                            <div id=\"srpCatSvgPreview\" style=\"width:42px;height:42px;border-radius:8px;background:rgba(168, 85, 247, 0.08);border:1px solid var(--srp-cyan,#a855f7);color:var(--srp-cyan,#a855f7);display:flex;align-items:center;justify-content:center;flex-shrink:0;\">\n                            <\/div>\n                            <input type=\"text\" id=\"srpCatEmojiInput\" value=\"file-text\" oninput=\"srpAdminUpdateCatIconPreview(this.value)\" placeholder=\"icon ID\" style=\"font-size:12px;width:70px;height:42px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;padding:4px 6px;\">\n                        <\/div>\n                    <\/div>\n                    <div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Category Name<\/label>\n                        <input type=\"text\" id=\"srpCatNameInput\" placeholder=\"e.g. Crime & Robbery Rules\" oninput=\"srpAdminAutoCategorySlug()\" style=\"width:100%;height:42px;padding:8px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:14px;\">\n                    <\/div>\n                    <div>\n                        <label style=\"display:block;font-size:12px;color:#aaa;margin-bottom:6px;font-weight:600;\">Category Slug (ID)<\/label>\n                        <input type=\"text\" id=\"srpCatSlugInput\" placeholder=\"e.g. crime_robberies\" style=\"width:100%;height:42px;padding:8px 12px;background:#09090e;border:1px solid #282836;color:#fff;border-radius:8px;font-size:14px;\">\n                    <\/div>\n                <\/div>\n\n                <div style=\"display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;\">\n                    <div style=\"font-size:12px;color:#888;\">Quick pick SVG icon: <span id=\"srpCatQuickEmojis\" style=\"display:inline-flex;gap:6px;vertical-align:middle;margin-left:6px;\"><\/span><\/div>\n                    <div style=\"display:flex;gap:8px;\">\n                        <button type=\"button\" id=\"srpCatCancelEditBtn\" onclick=\"srpAdminResetCategoryForm()\" class=\"srp-btn\" style=\"padding:6px 14px;font-size:12px;background:#222;display:none;\">Cancel<\/button>\n                        <button type=\"button\" id=\"srpCatSaveBtn\" onclick=\"srpAdminSaveCategory()\" class=\"srp-btn srp-btn-red\" style=\"padding:6px 18px;font-size:13px;\">Save Category<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Existing Categories List -->\n            <h4 style=\"margin:0 0 12px;font-size:15px;color:#fff;\">Existing Categories<\/h4>\n            <div id=\"srpAdminCategoryTableContainer\" style=\"overflow-x:auto;\">\n                <!-- Populated dynamically by JS -->\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\nvar srpAdminCurrentAppId = null;\nvar srpAdminCurrentTicketId = null;\nvar srpGangCurrentAppId = null;\nvar srpAdminIsOwnerFounder = false;\n\nfunction srpAdminTab(tab) {\n    var wl = document.getElementById('srpAdminWhitelistPanel');\n    var tk = document.getElementById('srpAdminTicketsPanel');\n    var ga = document.getElementById('srpAdminGangPanel');\n    var rl = document.getElementById('srpAdminRulesPanel');\n    var pm = document.getElementById('srpAdminPermsPanel');\n    var btnWl = document.getElementById('srpTabWhitelist');\n    var btnTk = document.getElementById('srpTabTickets');\n    var btnGa = document.getElementById('srpTabGang');\n    var btnRl = document.getElementById('srpTabRules');\n    var btnPm = document.getElementById('srpTabPerms');\n\n    var inactive = 'flex:1;min-width:160px;justify-content:center;background:var(--srp-darker);border-color:var(--srp-border);color:var(--srp-gray);';\n    var active = 'flex:1;min-width:160px;justify-content:center;';\n\n    if (wl) wl.style.display = 'none';\n    if (tk) tk.style.display = 'none';\n    if (ga) ga.style.display = 'none';\n    if (rl) rl.style.display = 'none';\n    if (pm) pm.style.display = 'none';\n\n    if (btnWl) btnWl.style.cssText = inactive;\n    if (btnTk) btnTk.style.cssText = inactive;\n    if (btnGa) btnGa.style.cssText = inactive;\n    if (btnRl) btnRl.style.cssText = inactive;\n    if (btnPm) btnPm.style.cssText = inactive;\n\n    if (tab === 'whitelist') {\n        if (wl) wl.style.display = 'block';\n        if (btnWl) btnWl.style.cssText = active;\n        srpAdminLoadApps();\n    } else if (tab === 'tickets') {\n        if (tk) tk.style.display = 'block';\n        if (btnTk) btnTk.style.cssText = active;\n        srpAdminLoadTickets();\n    } else if (tab === 'gang') {\n        if (ga) ga.style.display = 'block';\n        if (btnGa) btnGa.style.cssText = active;\n        srpAdminLoadGangApps();\n    } else if (tab === 'rules') {\n        if (rl) rl.style.display = 'block';\n        if (btnRl) btnRl.style.cssText = active;\n        srpAdminLoadRules();\n    } else if (tab === 'permissions') {\n        if (pm) pm.style.display = 'block';\n        if (btnPm) btnPm.style.cssText = active;\n        srpAdminLoadPermissions();\n    }\n}\n\nfunction srpAdminLoadStats() {\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/stats';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(s){\n        document.getElementById('srpAdminStats').innerHTML =\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:var(--srp-red);margin:0 0 4px;\">'+s.total_users+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Total Users<\/p><\/div>' +\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:var(--srp-warning);margin:0 0 4px;\">'+s.pending_apps+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Pending Apps<\/p><\/div>' +\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:var(--srp-success);margin:0 0 4px;\">'+s.approved_apps+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Approved<\/p><\/div>' +\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:var(--srp-red);margin:0 0 4px;\">'+s.rejected_apps+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Rejected<\/p><\/div>' +\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:#3b82f6;margin:0 0 4px;\">'+s.open_tickets+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Open Tickets<\/p><\/div>' +\n            '<div class=\"srp-card\" style=\"text-align:center;padding:20px;\"><h2 style=\"color:#8b5cf6;margin:0 0 4px;\">'+(s.pending_gang_apps||0)+'<\/h2><p style=\"color:var(--srp-gray);margin:0;font-size:13px;\">Gang Apps Pending<\/p><\/div>';\n    })\n    .catch(function(){});\n}\n\nfunction srpAdminLoadApps() {\n    var status = document.getElementById('srpAdminFilter').value;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/applications';\n    var params = [];\n    if (status) params.push('status=' + status);\n    if (token) params.push('srp_token=' + encodeURIComponent(token));\n    if (params.length) url += '?' + params.join('&');\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(apps){\n        var el = document.getElementById('srpAdminAppsList');\n        if (!apps.length) {\n            el.innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-gray);\">No applications found.<\/div>';\n            return;\n        }\n        var html = '';\n        apps.forEach(function(a) {\n            var badge = '';\n            if (a.status === 'pending') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(245,158,11,0.15);color:#f59e0b;\">Pending<\/span>';\n            else if (a.status === 'approved') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(34,197,94,0.15);color:#22c55e;\">Approved<\/span>';\n            else badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(220,38,38,0.15);color:#ef4444;\">Rejected<\/span>';\n\n            html += '<div style=\"display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--srp-border);flex-wrap:wrap;gap:8px;\">';\n            html += '<div style=\"display:flex;align-items:center;gap:12px;min-width:0;\">';\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;min-width:30px;\">#' + a.id + '<\/span>';\n            html += '<span style=\"font-weight:600;\">' + (a.username || 'Unknown') + '<\/span>';\n            if (a.fivem_name) html += '<span style=\"color:var(--srp-gray);font-size:13px;\">(' + a.fivem_name + ')<\/span>';\n            html += '<\/div>';\n            html += '<div style=\"display:flex;align-items:center;gap:12px;\">';\n            html += badge;\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;\">' + (a.created_at || '') + '<\/span>';\n            html += '<button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminOpenReview(' + a.id + ')\" style=\"padding:6px 16px;font-size:13px;\">Review<\/button>';\n            html += '<\/div><\/div>';\n        });\n        el.innerHTML = html;\n    })\n    .catch(function(){\n        document.getElementById('srpAdminAppsList').innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-red);\">Error loading applications.<\/div>';\n    });\n}\n\nfunction srpAdminOpenReview(id) {\n    srpAdminCurrentAppId = id;\n    document.getElementById('srpReviewModalTitle').textContent = 'Review Application';\n    document.getElementById('srpAdminRejectSection').style.display = 'block';\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/applications';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(apps){\n        var app = apps.find(function(a){return a.id == id;});\n        if (!app) return;\n        var html = '<div style=\"display:grid;gap:12px;\">';\n        var fields = [\n            ['Username', app.username],\n            ['IRL Name', app.real_name || '-'],\n            ['IRL Age', app.real_age || '-'],\n            ['RP Name', app.fivem_name || '-'],\n            ['RP Age', app.rp_age || '-'],\n            ['Experience', app.experience || '-'],\n            ['Story of Character', app.why_join || '-'],\n            ['Steam Link', app.steam_link || '-'],\n            ['Rules Understood', app.rules_understood ? 'Yes' : 'No']\n        ];\n        fields.forEach(function(f){\n            html += '<div style=\"display:flex;gap:12px;padding:10px;background:#111;border-radius:6px;\">';\n            html += '<span style=\"color:#888;min-width:140px;font-size:13px;font-weight:600;\">' + f[0] + '<\/span>';\n            html += '<span style=\"color:#fff;font-size:14px;\">' + f[1] + '<\/span><\/div>';\n        });\n        html += '<\/div>';\n        document.getElementById('srpAdminReviewContent').innerHTML = html;\n        document.getElementById('srpAdminReviewModal').style.display = 'block';\n    });\n}\n\nfunction srpAdminReviewApp(action) {\n    if (!srpAdminCurrentAppId) return;\n    if (action === 'rejected' && !document.getElementById('srpAdminRejectReason').value.trim()) {\n        srpToast('Please provide a reject reason.', 'error');\n        return;\n    }\n    var token = srpGetToken();\n    var url = srpAjax.url + 'whitelist\/review';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    var data = {application_id: srpAdminCurrentAppId, action: action, reason: document.getElementById('srpAdminRejectReason').value.trim()};\n    if (token) data.srp_token = token;\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify(data)\n    })\n    .then(function(r){return r.json().then(function(b){return{status:r.ok,body:b};});})\n    .then(function(res){\n        document.getElementById('srpAdminReviewModal').style.display = 'none';\n        if (res.status && res.body.ok) {\n            srpToast('Application ' + action + ' successfully!', 'success');\n            srpAdminLoadApps();\n            srpAdminLoadStats();\n        } else {\n            var errMsg = (res.body && (res.body.error || res.body.message)) || 'Error (code: ' + (res.status || '?') + ')';\n            srpToast('Error: ' + errMsg, 'error');\n        }\n    })\n    .catch(function(){\n        srpToast('Network error', 'error');\n    });\n}\n\nfunction srpAdminLoadTickets() {\n    var status = document.getElementById('srpAdminTicketFilter').value;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets';\n    var params = [];\n    if (status) params.push('status=' + status);\n    if (token) params.push('srp_token=' + encodeURIComponent(token));\n    if (params.length) url += '?' + params.join('&');\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(tickets){\n        var el = document.getElementById('srpAdminTicketsList');\n        if (!tickets.length) {\n            el.innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-gray);\">No tickets found.<\/div>';\n            return;\n        }\n        var html = '';\n        tickets.forEach(function(t) {\n            var badge = '';\n            if (t.status === 'open') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(34,197,94,0.15);color:#22c55e;\">Open<\/span>';\n            else if (t.status === 'in-progress') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(59,130,246,0.15);color:#3b82f6;\">In Progress<\/span>';\n            else badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(107,114,128,0.15);color:#6b7280;\">Closed<\/span>';\n\n            var userAvatar = t.user_avatar;\n            var avatarImg = userAvatar ? '<img decoding=\"async\" src=\"' + srpAdminEsc(userAvatar) + '\" style=\"width:34px;height:34px;border-radius:50%;object-fit:cover;border:2px solid rgba(168, 85, 247, 0.3);flex-shrink:0;\">' : '<div style=\"width:34px;height:34px;border-radius:50%;background:#1e293b;border:2px solid #334155;display:flex;align-items:center;justify-content:center;font-weight:700;color:#fff;font-size:12px;flex-shrink:0;\">' + (t.username ? t.username.charAt(0).toUpperCase() : '?') + '<\/div>';\n\n            html += '<div style=\"display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--srp-border);flex-wrap:wrap;gap:8px;\">';\n            html += '<div style=\"display:flex;align-items:center;gap:12px;min-width:0;flex:1;\">';\n            html += avatarImg;\n            html += '<div style=\"min-width:0;flex:1;\">';\n            html += '<div style=\"display:flex;align-items:center;gap:10px;margin-bottom:4px;\">';\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;\">#' + t.id + '<\/span>';\n            html += '<span style=\"font-weight:600;\">' + (t.username || 'Unknown') + '<\/span>';\n            html += badge;\n            html += '<\/div>';\n            html += '<div style=\"font-weight:600;color:var(--srp-white);\">' + (t.subject || '-') + '<\/div>';\n            html += '<div style=\"color:var(--srp-gray);font-size:13px;margin-top:2px;\">' + (t.category || 'general') + ' &middot; ' + (t.reply_count || 0) + ' replies<\/div>';\n            if (t.first_message) {\n                var preview = t.first_message.length > 100 ? t.first_message.substring(0, 100) + '...' : t.first_message;\n                html += '<div style=\"color:var(--srp-gray);font-size:12px;margin-top:4px;font-style:italic;\">\"' + preview + '\"<\/div>';\n            }\n            html += '<\/div><\/div>';\n            html += '<div style=\"display:flex;align-items:center;gap:8px;flex-shrink:0;\">';\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;margin-right:4px;\">' + (t.created_at || '') + '<\/span>';\n            html += '<button class=\"srp-btn srp-btn-red\" onclick=\"srpAdminOpenTicket(' + t.id + ')\" style=\"padding:6px 16px;font-size:13px;\">View<\/button>';\n            if (srpAdminIsOwnerFounder) {\n                html += '<button class=\"srp-btn\" onclick=\"srpAdminTicketDelete(' + t.id + ')\" style=\"padding:6px 12px;font-size:13px;background:rgba(220,38,38,0.15);border-color:rgba(220,38,38,0.3);color:#ef4444;\" title=\"Delete Ticket\">Delete<\/button>';\n            }\n            html += '<\/div><\/div>';\n        });\n        el.innerHTML = html;\n    })\n    .catch(function(){\n        document.getElementById('srpAdminTicketsList').innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-red);\">Error loading tickets.<\/div>';\n    });\n}\n\nfunction srpAdminOpenTicket(id) {\n    srpAdminCurrentTicketId = id;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(tickets){\n        var t = tickets.find(function(x){return x.id == id;});\n        if (!t) return;\n\n        document.getElementById('srpAdminModalTicketId').textContent = '#' + t.id;\n        document.getElementById('srpAdminModalTicketSubject').textContent = t.subject || 'Support Ticket';\n        var userEl = document.getElementById('srpAdminModalTicketUser');\n        if (userEl) {\n            var modalAv = t.user_avatar ? '<img decoding=\"async\" src=\"' + srpAdminEsc(t.user_avatar) + '\" style=\"width:20px;height:20px;border-radius:50%;object-fit:cover;vertical-align:middle;margin-right:6px;\">' : '';\n            userEl.innerHTML = modalAv + srpAdminEsc(t.username || 'User');\n        }\n        document.getElementById('srpAdminModalTicketCategory').textContent = (t.category || 'general').toUpperCase();\n        document.getElementById('srpAdminModalTicketTime').textContent = t.created_at || '-';\n\n        var statusBadge = '';\n        var btnClose = document.getElementById('srpBtnTicketClose');\n        var btnReopen = document.getElementById('srpBtnTicketReopen');\n        var btnDelete = document.getElementById('srpBtnTicketDelete');\n\n        if (t.status === 'open') {\n            statusBadge = '<span style=\"padding:4px 12px;border-radius:50px;font-size:11px;font-weight:700;background:rgba(34,197,94,0.15);color:#22c55e;border:1px solid rgba(34,197,94,0.3);\">Open<\/span>';\n            if (btnClose) btnClose.style.display = 'inline-flex';\n            if (btnReopen) btnReopen.style.display = 'none';\n        } else if (t.status === 'in-progress') {\n            statusBadge = '<span style=\"padding:4px 12px;border-radius:50px;font-size:11px;font-weight:700;background:rgba(59,130,246,0.15);color:#3b82f6;border:1px solid rgba(59,130,246,0.3);\">In Progress<\/span>';\n            if (btnClose) btnClose.style.display = 'inline-flex';\n            if (btnReopen) btnReopen.style.display = 'none';\n        } else {\n            statusBadge = '<span style=\"padding:4px 12px;border-radius:50px;font-size:11px;font-weight:700;background:rgba(107,114,128,0.15);color:#9ca3af;border:1px solid rgba(107,114,128,0.3);\">Closed<\/span>';\n            if (btnClose) btnClose.style.display = 'none';\n            if (btnReopen) btnReopen.style.display = 'inline-flex';\n        }\n        if (btnDelete) {\n            btnDelete.style.display = srpAdminIsOwnerFounder ? 'inline-flex' : 'none';\n        }\n        document.getElementById('srpAdminModalTicketStatus').innerHTML = statusBadge;\n\n        document.getElementById('srpAdminTicketModal').style.display = 'block';\n        srpAdminLoadTicketConversation(id, t.username);\n    });\n}\n\nfunction srpAdminEsc(str) {\n    if (!str) return '';\n    var div = document.createElement('div');\n    div.appendChild(document.createTextNode(str));\n    return div.innerHTML;\n}\n\nfunction srpAdminLoadTicketConversation(ticketId, ticketUsername) {\n    var stream = document.getElementById('srpAdminTicketChatStream');\n    if (!stream) return;\n    stream.innerHTML = '<div style=\"text-align:center;color:#888;padding:40px;\">Loading conversation...<\/div>';\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'tickets\/messages?ticket_id=' + encodeURIComponent(ticketId);\n    if (token) url += '&srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(messages){\n        stream.innerHTML = '';\n        if (!messages || !messages.length) {\n            stream.innerHTML = '<div style=\"text-align:center;color:#666;padding:40px;font-size:13px;\">No messages found in this ticket.<\/div>';\n            return;\n        }\n\n        messages.forEach(function(m){\n            var isUserMsg = (ticketUsername && m.sender_name === ticketUsername);\n            var msgDiv = document.createElement('div');\n            msgDiv.style.cssText = 'display:flex;gap:12px;align-items:flex-start;max-width:85%;' + (isUserMsg ? 'align-self:flex-start;' : 'align-self:flex-end;flex-direction:row-reverse;');\n\n            var initial = m.sender_name ? m.sender_name.charAt(0).toUpperCase() : '?';\n            var avatarBg = isUserMsg ? '#1e293b' : 'linear-gradient(135deg, #ef4444, #991b1b)';\n            var avatarBorder = isUserMsg ? '#334155' : '#dc2626';\n\n            var bubbleBg = isUserMsg ? '#14141f' : '#1c1724';\n            var bubbleBorder = isUserMsg ? '1px solid #28283a' : '1px solid rgba(239,68,68,0.3)';\n            var textColor = '#f1f5f9';\n\n            var roleTag = isUserMsg ? '<span style=\"font-size:11px;color:#94a3b8;font-weight:500;\">(Player)<\/span>' : '<span style=\"font-size:10px;color:#ef4444;background:rgba(239,68,68,0.15);padding:2px 6px;border-radius:4px;font-weight:700;\">STAFF<\/span>';\n\n            var avatarHtml = m.sender_avatar \n                ? '<img decoding=\"async\" src=\"' + srpAdminEsc(m.sender_avatar) + '\" alt=\"' + srpAdminEsc(m.sender_name || '') + '\" style=\"width:36px;height:36px;border-radius:50%;border:2px solid ' + avatarBorder + ';object-fit:cover;flex-shrink:0;\">'\n                : '<div style=\"width:36px;height:36px;border-radius:50%;background:' + avatarBg + ';border:2px solid ' + avatarBorder + ';display:flex;align-items:center;justify-content:center;font-weight:700;color:#fff;font-size:14px;flex-shrink:0;\">' + initial + '<\/div>';\n\n            var contentHtml = '<div style=\"display:flex;flex-direction:column;' + (isUserMsg ? 'align-items:flex-start;' : 'align-items:flex-end;') + '\">' +\n                '<div style=\"display:flex;gap:8px;align-items:center;margin-bottom:4px;font-size:12px;\">' +\n                    '<strong style=\"color:#fff;\">' + srpAdminEsc(m.sender_name || 'Unknown') + '<\/strong>' +\n                    roleTag +\n                    '<span style=\"color:#64748b;font-size:11px;\">' + (m.created_at || '') + '<\/span>' +\n                '<\/div>' +\n                '<div style=\"background:' + bubbleBg + ';border:' + bubbleBorder + ';color:' + textColor + ';padding:12px 16px;border-radius:12px;font-size:14px;line-height:1.5;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 8px rgba(0,0,0,0.3);\">' +\n                    srpAdminEsc(m.message || '').replace(\/\\n\/g, '<br>') +\n                '<\/div>' +\n            '<\/div>';\n\n            msgDiv.innerHTML = avatarHtml + contentHtml;\n            stream.appendChild(msgDiv);\n        });\n\n        stream.scrollTop = stream.scrollHeight;\n    })\n    .catch(function(){\n        stream.innerHTML = '<div style=\"color:var(--srp-red);padding:20px;text-align:center;\">Failed to load conversation history.<\/div>';\n    });\n}\n\nfunction srpAdminTicketReply() {\n    if (!srpAdminCurrentTicketId) return;\n    var input = document.getElementById('srpAdminTicketReplyMsg');\n    var msg = input.value.trim();\n    if (!msg) { srpToast('Type a message first.', 'error'); return; }\n\n    var btn = document.getElementById('srpAdminBtnSendReply');\n    if (btn) btn.disabled = true;\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets\/reply';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({ticket_id: srpAdminCurrentTicketId, message: msg})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (btn) btn.disabled = false;\n        if (res.ok) {\n            srpToast('Reply sent!', 'success');\n            input.value = '';\n            var userText = (document.getElementById('srpAdminModalTicketUser') ? document.getElementById('srpAdminModalTicketUser').textContent : '');\n            srpAdminLoadTicketConversation(srpAdminCurrentTicketId, userText);\n            srpAdminLoadTickets();\n        } else {\n            srpToast('Error: ' + (res.error || 'Unknown'), 'error');\n        }\n    })\n    .catch(function(){\n        if (btn) btn.disabled = false;\n        srpToast('Network error', 'error');\n    });\n}\n\nfunction srpAdminTicketClose() {\n    if (!srpAdminCurrentTicketId) return;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets\/status';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({ticket_id: srpAdminCurrentTicketId, status: 'closed'})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res.ok) {\n            srpToast('Ticket marked as closed.', 'success');\n            srpAdminOpenTicket(srpAdminCurrentTicketId);\n            srpAdminLoadTickets();\n            srpAdminLoadStats();\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\nfunction srpAdminTicketReopen() {\n    if (!srpAdminCurrentTicketId) return;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets\/status';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({ticket_id: srpAdminCurrentTicketId, status: 'open'})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res.ok) {\n            srpToast('Ticket reopened!', 'success');\n            srpAdminOpenTicket(srpAdminCurrentTicketId);\n            srpAdminLoadTickets();\n            srpAdminLoadStats();\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\nfunction srpAdminTicketDelete(ticketId) {\n    var tid = ticketId || srpAdminCurrentTicketId;\n    if (!tid) return;\n    if (!confirm('Are you sure you want to permanently delete Ticket #' + tid + ' and all of its messages? This cannot be undone.')) {\n        return;\n    }\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/tickets\/delete';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({ticket_id: tid})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpToast('Ticket #' + tid + ' deleted permanently.', 'success');\n            var modal = document.getElementById('srpAdminTicketModal');\n            if (modal) modal.style.display = 'none';\n            srpAdminCurrentTicketId = null;\n            srpAdminLoadTickets();\n            srpAdminLoadStats();\n        } else {\n            srpToast('Error: ' + ((res && (res.error || res.message)) || 'Failed to delete ticket'), 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error while deleting ticket', 'error'); });\n}\n\nfunction srpAdminLoadGangApps() {\n    var status = document.getElementById('srpAdminGangFilter').value;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/gang-apps';\n    var params = [];\n    if (status) params.push('status=' + status);\n    if (token) params.push('srp_token=' + encodeURIComponent(token));\n    if (params.length) url += '?' + params.join('&');\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(apps){\n        var el = document.getElementById('srpAdminGangAppsList');\n        if (!apps.length) {\n            el.innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-gray);\">No gang applications found.<\/div>';\n            return;\n        }\n        var html = '';\n        apps.forEach(function(a) {\n            var badge = '';\n            if (a.status === 'pending') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(245,158,11,0.15);color:#f59e0b;\">Pending<\/span>';\n            else if (a.status === 'approved') badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(34,197,94,0.15);color:#22c55e;\">Approved<\/span>';\n            else badge = '<span style=\"padding:3px 10px;border-radius:50px;font-size:11px;font-weight:700;text-transform:uppercase;background:rgba(220,38,38,0.15);color:#ef4444;\">Rejected<\/span>';\n\n            html += '<div style=\"display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--srp-border);flex-wrap:wrap;gap:8px;\">';\n            html += '<div style=\"display:flex;align-items:center;gap:12px;min-width:0;\">';\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;min-width:30px;\">#' + a.id + '<\/span>';\n            html += '<span style=\"font-weight:600;\">' + (a.username || 'Unknown') + '<\/span>';\n            html += '<span style=\"color:#8b5cf6;font-size:13px;font-weight:700;\">' + (a.gang_name || '') + '<\/span>';\n            html += '<\/div>';\n            html += '<div style=\"display:flex;align-items:center;gap:12px;\">';\n            html += badge;\n            html += '<span style=\"color:var(--srp-gray);font-size:12px;\">' + (a.created_at || '') + '<\/span>';\n            html += '<button class=\"srp-btn srp-btn-red\" onclick=\"srpOpenGangReview(' + a.id + ')\" style=\"padding:6px 16px;font-size:13px;\">Review<\/button>';\n            html += '<\/div><\/div>';\n        });\n        el.innerHTML = html;\n    })\n    .catch(function(){\n        document.getElementById('srpAdminGangAppsList').innerHTML = '<div style=\"text-align:center;padding:40px;color:var(--srp-red);\">Error loading gang applications.<\/div>';\n    });\n}\n\nfunction srpOpenGangReview(id) {\n    srpGangCurrentAppId = id;\n    document.getElementById('srpGangReviewTitle').textContent = 'Review Gang Application';\n    document.getElementById('srpGangRejectSection').style.display = 'block';\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/gang-apps';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(apps){\n        var app = apps.find(function(a){return a.id == id;});\n        if (!app) return;\n        var html = '<div style=\"display:grid;gap:12px;\">';\n        var fields = [\n            ['Username', app.username],\n            ['Gang Name', app.gang_name],\n            ['Discord ID', app.discord_id],\n            ['Members', app.members_discord],\n            ['Concept & Background', app.concept_background],\n            ['Motivation', app.motivation]\n        ];\n        fields.forEach(function(f){\n            var val = f[1] || '-';\n            if (val.length > 500) val = val.substring(0, 500) + '...';\n            html += '<div style=\"padding:10px;background:#111;border-radius:6px;\">';\n            html += '<div style=\"color:#888;font-size:13px;font-weight:600;margin-bottom:4px;\">' + f[0] + '<\/div>';\n            html += '<div style=\"color:#fff;font-size:14px;white-space:pre-wrap;\">' + val + '<\/div><\/div>';\n        });\n        html += '<\/div>';\n        document.getElementById('srpGangReviewContent').innerHTML = html;\n        document.getElementById('srpGangReviewModal').style.display = 'block';\n    });\n}\n\nfunction srpGangReviewAction(action) {\n    if (!srpGangCurrentAppId) return;\n    if (action === 'rejected' && !document.getElementById('srpGangRejectReason').value.trim()) {\n        srpToast('Please provide a reject reason.', 'error');\n        return;\n    }\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/gang-review';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n    var data = {application_id: srpGangCurrentAppId, action: action, reason: document.getElementById('srpGangRejectReason').value.trim()};\n    if (token) data.srp_token = token;\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify(data)\n    })\n    .then(function(r){return r.json().then(function(b){return{status:r.ok,body:b};});})\n    .then(function(res){\n        document.getElementById('srpGangReviewModal').style.display = 'none';\n        if (res.status && res.body.ok) {\n            srpToast('Gang application ' + action + '!', 'success');\n            srpAdminLoadGangApps();\n            srpAdminLoadStats();\n        } else {\n            var errMsg = (res.body && (res.body.error || res.body.message)) || 'Error';\n            srpToast('Error: ' + errMsg, 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\nfunction srpAdminLoadPermissions() {\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/permissions';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (!res || !res.ok) return;\n        var r = res.roles || {};\n        var p = res.permissions || {};\n\n        if (document.getElementById('srpRoleOwnerIds')) document.getElementById('srpRoleOwnerIds').value = r.owner_role_ids || '';\n        if (document.getElementById('srpRoleWhitelistIds')) document.getElementById('srpRoleWhitelistIds').value = r.whitelist_role_ids || '';\n        if (document.getElementById('srpRoleGangIds')) document.getElementById('srpRoleGangIds').value = r.gang_role_ids || '';\n        if (document.getElementById('srpRoleSupportIds')) document.getElementById('srpRoleSupportIds').value = r.support_role_ids || '';\n        if (document.getElementById('srpRoleAdminIds')) document.getElementById('srpRoleAdminIds').value = r.admin_role_ids || '';\n\n        var teams = [\n            {key: 'owner', name: '\ud83d\udc51 Owner \/ Founder', color: '#ffd700', badge: 'rgba(255,215,0,0.15)', disabled: true},\n            {key: 'whitelist', name: '\ud83d\udccb Whitelist Team', color: '#a855f7', badge: 'rgba(168, 85, 247, 0.15)'},\n            {key: 'gang', name: '\u2694\ufe0f Gang Team', color: '#c084fc', badge: 'rgba(192,132,252,0.15)'},\n            {key: 'support', name: '\ud83c\udfab Support Team', color: '#60a5fa', badge: 'rgba(96,165,250,0.15)'},\n            {key: 'admin', name: '\ud83d\udee1\ufe0f General Admin', color: '#e2e8f0', badge: 'rgba(255,255,255,0.15)'}\n        ];\n\n        var caps = [\n            {key: 'whitelist', label: 'Whitelist Apps'},\n            {key: 'tickets', label: 'Support Tickets'},\n            {key: 'gang', label: 'Gang Apps'},\n            {key: 'vip', label: 'VIP Store'},\n            {key: 'rules', label: 'Rules Images'},\n            {key: 'form_fields', label: 'Form Builder'}\n        ];\n\n        var tbody = document.getElementById('srpPermsMatrixBody');\n        if (!tbody) return;\n\n        var html = '';\n        teams.forEach(function(t){\n            var teamCaps = p[t.key] || [];\n            html += '<tr style=\"border-bottom:1px solid #1a1a24;\">';\n            html += '<td style=\"padding:14px 16px;font-weight:600;color:' + t.color + ';\"><span style=\"padding:4px 10px;border-radius:6px;background:' + t.badge + ';\">' + t.name + '<\/span><\/td>';\n            caps.forEach(function(c){\n                var isChecked = (t.key === 'owner' || teamCaps.indexOf(c.key) !== -1);\n                var isDis = t.disabled ? ' disabled checked' : '';\n                html += '<td style=\"padding:14px 16px;text-align:center;\">';\n                html += '<input type=\"checkbox\" data-team=\"' + t.key + '\" data-cap=\"' + c.key + '\" ' + (isChecked ? 'checked' : '') + isDis + ' style=\"width:18px;height:18px;cursor:pointer;accent-color:var(--srp-red);\">';\n                html += '<\/td>';\n            });\n            html += '<\/tr>';\n        });\n        tbody.innerHTML = html;\n    })\n    .catch(function(){});\n}\n\nfunction srpAdminSavePerms() {\n    var btn = document.getElementById('srpBtnSavePerms');\n    if (btn) btn.textContent = 'Saving...';\n\n    var roles = {\n        owner_role_ids: (document.getElementById('srpRoleOwnerIds') ? document.getElementById('srpRoleOwnerIds').value.trim() : ''),\n        whitelist_role_ids: (document.getElementById('srpRoleWhitelistIds') ? document.getElementById('srpRoleWhitelistIds').value.trim() : ''),\n        gang_role_ids: (document.getElementById('srpRoleGangIds') ? document.getElementById('srpRoleGangIds').value.trim() : ''),\n        support_role_ids: (document.getElementById('srpRoleSupportIds') ? document.getElementById('srpRoleSupportIds').value.trim() : ''),\n        admin_role_ids: (document.getElementById('srpRoleAdminIds') ? document.getElementById('srpRoleAdminIds').value.trim() : ''),\n    };\n\n    var permissions = {\n        owner: ['whitelist', 'tickets', 'gang', 'vip', 'rules', 'form_fields', 'settings', 'logs', 'permissions'],\n        whitelist: [],\n        gang: [],\n        support: [],\n        admin: []\n    };\n\n    var checkboxes = document.querySelectorAll('#srpPermsMatrixBody input[type=\"checkbox\"]');\n    checkboxes.forEach(function(cb){\n        var t = cb.getAttribute('data-team');\n        var c = cb.getAttribute('data-cap');\n        if (t && c && cb.checked && t !== 'owner') {\n            if (!permissions[t]) permissions[t] = [];\n            permissions[t].push(c);\n        }\n    });\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/permissions';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    var data = Object.assign({}, roles, {permissions: permissions});\n    if (token) data.srp_token = token;\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify(data)\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (btn) btn.textContent = 'Save All Permissions';\n        if (res && res.ok) {\n            srpToast('Permissions & Roles saved successfully!', 'success');\n        } else {\n            srpToast('Error: ' + ((res && (res.error || res.message)) || 'Failed to save'), 'error');\n        }\n    })\n    .catch(function(){\n        if (btn) btn.textContent = 'Save All Permissions';\n        srpToast('Network error while saving permissions', 'error');\n    });\n}\n\n\/\/ \u2500\u2500\u2500 SERVER RULES & CATEGORY MANAGEMENT \u2500\u2500\u2500\nvar srpAdminAllRules = [];\nvar srpAdminRulesCategories = [];\nvar srpActiveEmojiTab = 'rp';\n\nfunction srpRenderSvgSafe(val, size, color) {\n    if (window.srpSvgIcons && window.srpSvgIcons.getSvg) {\n        return window.srpSvgIcons.getSvg(val, size, color);\n    }\n    return val || '\u2696\ufe0f';\n}\n\nfunction srpAdminUpdateRuleIconPreview(val) {\n    var preview = document.getElementById('srpModalRuleSvgPreview');\n    if (preview) {\n        preview.innerHTML = srpRenderSvgSafe(val, 28, 'var(--srp-cyan, #a855f7)');\n    }\n}\n\nfunction srpAdminUpdateCatIconPreview(val) {\n    var preview = document.getElementById('srpCatSvgPreview');\n    if (preview) {\n        preview.innerHTML = srpRenderSvgSafe(val, 24, 'var(--srp-cyan, #a855f7)');\n    }\n}\n\nfunction srpSelectEmojiTab(tabName, btn) {\n    srpActiveEmojiTab = tabName;\n    if (btn) {\n        var buttons = document.querySelectorAll('#srpEmojiTabButtons button');\n        buttons.forEach(function(b){\n            b.style.background = '#111';\n            b.style.color = '#aaa';\n            b.style.fontWeight = 'normal';\n        });\n        btn.style.background = 'var(--srp-cyan, #a855f7)';\n        btn.style.color = '#000';\n        btn.style.fontWeight = '700';\n    }\n    srpRenderEmojiPalette(tabName);\n}\n\nfunction srpRenderEmojiPalette(tabName) {\n    var container = document.getElementById('srpModalEmojiPalette');\n    if (!container) return;\n    var list = (window.srpSvgIcons && window.srpSvgIcons.categories && window.srpSvgIcons.categories[tabName]) \n               ? window.srpSvgIcons.categories[tabName].list \n               : ['theater', 'shield', 'scale', 'gavel', 'swords', 'crosshair', 'skull', 'car', 'heart', 'crown'];\n    \n    var html = '';\n    list.forEach(function(iconKey){\n        var svg = srpRenderSvgSafe(iconKey, 20, 'var(--srp-cyan, #a855f7)');\n        html += '<button type=\"button\" onclick=\"srpAdminSetRuleIcon(\\'' + iconKey + '\\')\" style=\"background:#12121c;border:1px solid #28283a;border-radius:8px;padding:8px 6px;cursor:pointer;color:#fff;display:flex;align-items:center;gap:6px;transition:all 0.15s;\" onmouseover=\"this.style.borderColor=\\'var(--srp-cyan,#a855f7)\\';this.style.background=\\'#1c1c2b\\'\" onmouseout=\"this.style.borderColor=\\'#28283a\\';this.style.background=\\'#12121c\\'\" title=\"Use ' + iconKey + '\">';\n        html += '  <span style=\"display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0;\">' + svg + '<\/span>';\n        html += '  <span style=\"font-size:11px;color:#cbd5e1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\">' + iconKey + '<\/span>';\n        html += '<\/button>';\n    });\n    container.innerHTML = html;\n}\n\nfunction srpAdminSetRuleIcon(iconKey) {\n    var input = document.getElementById('srpModalRuleEmoji');\n    if (input) input.value = iconKey;\n    srpAdminUpdateRuleIconPreview(iconKey);\n}\n\nfunction srpAdminLoadRules() {\n    srpRenderEmojiPalette('rp');\n    srpAdminUpdateRuleIconPreview('scale');\n    srpAdminUpdateCatIconPreview('file-text');\n\n    var container = document.getElementById('srpAdminRulesTableContainer');\n    if (container) container.innerHTML = '<div style=\"text-align:center;padding:40px;color:#888;\"><span class=\"srp-loading\"><\/span> Loading server rules & categories...<\/div>';\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {credentials:'same-origin'})\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpAdminAllRules = res.rules || [];\n            srpAdminRulesCategories = res.categories || [];\n            srpAdminPopulateRuleCategoriesFilter();\n            srpAdminRenderRulesTable();\n        } else {\n            if (container) container.innerHTML = '<div style=\"color:var(--srp-red);padding:30px;text-align:center;\">Failed to load rules.<\/div>';\n        }\n    })\n    .catch(function(){\n        if (container) container.innerHTML = '<div style=\"color:var(--srp-red);padding:30px;text-align:center;\">Network error loading rules.<\/div>';\n    });\n}\n\nfunction srpAdminPopulateRuleCategoriesFilter() {\n    var filterSelect = document.getElementById('srpAdminRulesCatFilter');\n    var modalSelect = document.getElementById('srpModalRuleCategorySelect');\n\n    if (filterSelect) {\n        var html = '<option value=\"all\">\u2728 All Categories<\/option>';\n        srpAdminRulesCategories.forEach(function(c){\n            html += '<option value=\"' + c.category_slug + '\">' + c.category_name + '<\/option>';\n        });\n        filterSelect.innerHTML = html;\n    }\n\n    if (modalSelect) {\n        var mHtml = '';\n        srpAdminRulesCategories.forEach(function(c){\n            mHtml += '<option value=\"' + c.category_slug + '\" data-name=\"' + srpAdminEsc(c.category_name) + '\" data-emoji=\"' + (c.category_emoji || 'file-text') + '\">' + c.category_name + '<\/option>';\n        });\n        modalSelect.innerHTML = mHtml;\n    }\n\n    var quickCont = document.getElementById('srpCatQuickEmojis');\n    if (quickCont) {\n        var qIcons = ['theater', 'file-text', 'swords', 'crosshair', 'car', 'shield-alert', 'heart', 'crown', 'shield', 'gem'];\n        var qHtml = '';\n        qIcons.forEach(function(ic){\n            var svg = srpRenderSvgSafe(ic, 18, 'var(--srp-cyan, #a855f7)');\n            qHtml += '<button type=\"button\" onclick=\"document.getElementById(\\'srpCatEmojiInput\\').value=\\'' + ic + '\\';srpAdminUpdateCatIconPreview(\\'' + ic + '\\');\" style=\"background:#181824;border:1px solid #28283a;border-radius:6px;padding:4px 8px;cursor:pointer;color:#fff;display:inline-flex;align-items:center;justify-content:center;\" title=\"Use ' + ic + '\">' + svg + '<\/button>';\n        });\n        quickCont.innerHTML = qHtml;\n    }\n}\n\n\/\/ \u2500\u2500\u2500 RENDER RULES GROUPED BY CATEGORY \u2500\u2500\u2500\nfunction srpAdminRenderRulesTable() {\n    var query = (document.getElementById('srpAdminRulesSearch') ? document.getElementById('srpAdminRulesSearch').value.toLowerCase().trim() : '');\n    var selectedCat = (document.getElementById('srpAdminRulesCatFilter') ? document.getElementById('srpAdminRulesCatFilter').value : 'all');\n    var container = document.getElementById('srpAdminRulesTableContainer');\n    if (!container) return;\n\n    var filtered = srpAdminAllRules.filter(function(r){\n        var matchCat = (selectedCat === 'all' || r.category_slug === selectedCat);\n        if (!matchCat) return false;\n        if (!query) return true;\n        return (r.title || '').toLowerCase().indexOf(query) !== -1 ||\n               (r.title_ar || '').toLowerCase().indexOf(query) !== -1 ||\n               (r.description || '').toLowerCase().indexOf(query) !== -1 ||\n               (r.category_name || '').toLowerCase().indexOf(query) !== -1;\n    });\n\n    if (document.getElementById('srpAdminRulesCount')) {\n        document.getElementById('srpAdminRulesCount').textContent = filtered.length + ' rules total (' + srpAdminRulesCategories.length + ' categories)';\n    }\n\n    if (!filtered.length) {\n        container.innerHTML = '<div style=\"text-align:center;padding:50px;color:var(--srp-gray);font-size:14px;\">No rules found matching search\/filter. Click \"\u2795 Add New Rule\" to create one!<\/div>';\n        return;\n    }\n\n    \/\/ Group filtered rules by category_slug\n    var grouped = {};\n    srpAdminRulesCategories.forEach(function(cat){\n        if (selectedCat === 'all' || selectedCat === cat.category_slug) {\n            grouped[cat.category_slug] = {\n                meta: cat,\n                rules: []\n            };\n        }\n    });\n\n    filtered.forEach(function(r){\n        if (!grouped[r.category_slug]) {\n            grouped[r.category_slug] = {\n                meta: { category_slug: r.category_slug, category_name: r.category_name || r.category_slug, category_emoji: r.category_emoji || 'file-text' },\n                rules: []\n            };\n        }\n        grouped[r.category_slug].rules.push(r);\n    });\n\n    var html = '';\n    Object.keys(grouped).forEach(function(slug){\n        var group = grouped[slug];\n        var meta = group.meta;\n        var rules = group.rules;\n        var catSvg = srpRenderSvgSafe(meta.category_emoji || 'file-text', 22, 'var(--srp-cyan, #a855f7)');\n\n        html += '<div style=\"background:#101017;border:1px solid #232332;border-radius:12px;margin-bottom:24px;overflow:hidden;box-shadow:0 8px 24px rgba(0,0,0,0.3);\">';\n        \n        \/\/ Category Header\n        html += '<div style=\"display:flex;justify-content:space-between;align-items:center;padding:14px 20px;background:linear-gradient(90deg, #161622, #11111a);border-bottom:1px solid #232332;flex-wrap:wrap;gap:10px;\">';\n        html += '  <div style=\"display:flex;align-items:center;gap:12px;\">';\n        html += '    <span style=\"display:flex;align-items:center;justify-content:center;width:42px;height:42px;background:rgba(168, 85, 247, 0.06);border:1px solid rgba(168, 85, 247, 0.25);border-radius:10px;color:var(--srp-cyan,#a855f7);box-shadow:0 0 12px rgba(168, 85, 247, 0.15);\">' + catSvg + '<\/span>';\n        html += '    <div>';\n        html += '      <h3 style=\"margin:0;font-size:16px;color:#fff;font-weight:700;\">' + srpAdminEsc(meta.category_name) + ' <span style=\"font-size:11px;color:#888;font-weight:normal;background:#09090e;padding:2px 8px;border-radius:4px;border:1px solid #222;margin-left:6px;\">#' + slug + '<\/span><\/h3>';\n        html += '      <div style=\"font-size:12px;color:var(--srp-gray);\">' + rules.length + ' rules in this category<\/div>';\n        html += '    <\/div>';\n        html += '  <\/div>';\n\n        \/\/ Category Actions\n        html += '  <div style=\"display:flex;gap:8px;align-items:center;\">';\n        html += '    <button type=\"button\" class=\"srp-btn\" onclick=\"srpAdminOpenRuleModal(0, \\'' + slug + '\\')\" style=\"padding:6px 12px;font-size:12px;background:rgba(168, 85, 247, 0.1);border-color:var(--srp-cyan,#a855f7);color:var(--srp-cyan,#a855f7);\">\u2795 Add Rule Here<\/button>';\n        html += '    <button type=\"button\" class=\"srp-btn\" onclick=\"srpAdminEditCategoryDirect(\\'' + slug + '\\', \\'' + srpAdminEsc(meta.category_name) + '\\', \\'' + (meta.category_emoji || 'file-text') + '\\')\" style=\"padding:6px 10px;font-size:12px;background:#1e1e2d;border-color:#333;\" title=\"Edit Category\">\u270f\ufe0f Edit Cat<\/button>';\n        html += '    <button type=\"button\" class=\"srp-btn\" onclick=\"srpAdminDeleteCategory(\\'' + slug + '\\')\" style=\"padding:6px 10px;font-size:12px;background:rgba(220,38,38,0.15);border-color:rgba(220,38,38,0.3);color:#ef4444;\" title=\"Delete Category and its rules\">\ud83d\uddd1\ufe0f<\/button>';\n        html += '  <\/div>';\n        html += '<\/div>';\n\n        \/\/ Rules List under this category\n        if (!rules.length) {\n            html += '<div style=\"padding:24px;text-align:center;color:#666;font-size:13px;\">No rules in this category yet. Click \"\u2795 Add Rule Here\" above to add one.<\/div>';\n        } else {\n            html += '<div style=\"display:grid;grid-template-columns:repeat(auto-fill, minmax(320px, 1fr));gap:14px;padding:16px;\">';\n            rules.forEach(function(r){\n                var statusTag = r.is_active ? '<span style=\"color:#22c55e;font-size:11px;font-weight:700;\">\u25cf Active<\/span>' : '<span style=\"color:#888;font-size:11px;\">\u25cf Inactive<\/span>';\n                var ruleSvg = srpRenderSvgSafe(r.emoji || 'scale', 20, 'var(--srp-cyan, #a855f7)');\n\n                html += '<div style=\"background:#15151e;border:1px solid #232330;border-radius:10px;padding:16px;display:flex;flex-direction:column;justify-content:space-between;position:relative;\">';\n                html += '  <div>';\n                html += '    <div style=\"display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px;\">';\n                html += '      <div style=\"width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:rgba(168, 85, 247, 0.06);border:1px solid rgba(168, 85, 247, 0.2);color:var(--srp-cyan,#a855f7);box-shadow:0 0 10px rgba(168, 85, 247, 0.1);\">' + ruleSvg + '<\/div>';\n                html += '      <div style=\"display:flex;gap:6px;align-items:center;\">';\n                html += '        <span style=\"font-size:11px;color:#71717a;background:#0d0d14;padding:2px 6px;border-radius:4px;\">Order: ' + r.sort_order + '<\/span>';\n                html += '        ' + statusTag;\n                html += '      <\/div>';\n                html += '    <\/div>';\n                html += '    <h4 style=\"margin:0 0 6px;color:#fff;font-size:14.5px;line-height:1.35;\">' + srpAdminEsc(r.title) + '<\/h4>';\n                if (r.title_ar) html += '<div style=\"font-size:12px;color:#888;margin-bottom:8px;\" dir=\"rtl\">' + srpAdminEsc(r.title_ar) + '<\/div>';\n                html += '    <p style=\"margin:0;font-size:12.5px;color:#9ca3af;line-height:1.5;\">' + srpAdminEsc(r.description.length > 130 ? r.description.substring(0, 130) + '...' : r.description) + '<\/p>';\n                html += '  <\/div>';\n                html += '  <div style=\"margin-top:14px;padding-top:10px;border-top:1px solid #1f1f2a;display:flex;justify-content:flex-end;gap:8px;\">';\n                html += '    <button class=\"srp-btn\" onclick=\"srpAdminOpenRuleModal(' + r.id + ')\" style=\"padding:4px 10px;font-size:11.5px;background:#1e1e2d;border-color:#333;\">\u270f\ufe0f Edit<\/button>';\n                html += '    <button class=\"srp-btn\" onclick=\"srpAdminDeleteRule(' + r.id + ')\" style=\"padding:4px 8px;font-size:11.5px;background:rgba(220,38,38,0.15);border-color:rgba(220,38,38,0.3);color:#ef4444;\">\ud83d\uddd1\ufe0f<\/button>';\n                html += '  <\/div>';\n                html += '<\/div>';\n            });\n            html += '<\/div>';\n        }\n\n        html += '<\/div>';\n    });\n\n    container.innerHTML = html;\n}\n\n\/\/ \u2500\u2500\u2500 RULE MODAL HANDLERS \u2500\u2500\u2500\nfunction srpAdminOpenRuleModal(ruleId, defaultCategorySlug) {\n    srpRenderEmojiPalette(srpActiveEmojiTab || 'rp');\n    srpAdminPopulateRuleCategoriesFilter();\n\n    document.getElementById('srpModalRuleId').value = ruleId || 0;\n    document.getElementById('srpAdminRuleModalTitle').textContent = ruleId ? 'Edit Server Rule #' + ruleId : 'Add New Server Rule';\n\n    var catSelect = document.getElementById('srpModalRuleCategorySelect');\n\n    if (ruleId) {\n        var r = srpAdminAllRules.find(function(x){ return x.id == ruleId; });\n        if (r) {\n            if (catSelect) catSelect.value = r.category_slug;\n            var currentIcon = r.emoji || 'scale';\n            document.getElementById('srpModalRuleEmoji').value = currentIcon;\n            srpAdminUpdateRuleIconPreview(currentIcon);\n            document.getElementById('srpModalRuleTitle').value = r.title || '';\n            document.getElementById('srpModalRuleTitleAr').value = r.title_ar || '';\n            document.getElementById('srpModalRuleDesc').value = r.description || '';\n            document.getElementById('srpModalRuleDescAr').value = r.description_ar || '';\n            document.getElementById('srpModalRuleOrder').value = r.sort_order || 10;\n            document.getElementById('srpModalRuleActive').checked = !!r.is_active;\n        }\n    } else {\n        if (catSelect && defaultCategorySlug) {\n            catSelect.value = defaultCategorySlug;\n        }\n        document.getElementById('srpModalRuleEmoji').value = 'scale';\n        srpAdminUpdateRuleIconPreview('scale');\n        document.getElementById('srpModalRuleTitle').value = '';\n        document.getElementById('srpModalRuleTitleAr').value = '';\n        document.getElementById('srpModalRuleDesc').value = '';\n        document.getElementById('srpModalRuleDescAr').value = '';\n        document.getElementById('srpModalRuleOrder').value = (srpAdminAllRules.length + 1) * 10;\n    }\n    document.getElementById('srpAdminRuleModal').style.display = 'block';\n}\n\nfunction srpAdminSaveRule() {\n    var title = document.getElementById('srpModalRuleTitle').value.trim();\n    var desc = document.getElementById('srpModalRuleDesc').value.trim();\n    if (!title || !desc) {\n        srpToast('Rule title and description are required.', 'error');\n        return;\n    }\n\n    var catSelect = document.getElementById('srpModalRuleCategorySelect');\n    var selectedOpt = catSelect ? catSelect.options[catSelect.selectedIndex] : null;\n    var catSlug = catSelect ? catSelect.value : 'roleplay';\n    var catName = selectedOpt ? selectedOpt.getAttribute('data-name') : 'Roleplay Rules';\n    var catEmoji = selectedOpt ? selectedOpt.getAttribute('data-emoji') : '\ud83d\udcdc';\n\n    var id = parseInt(document.getElementById('srpModalRuleId').value) || 0;\n    var emoji = document.getElementById('srpModalRuleEmoji').value.trim() || '\u2696\ufe0f';\n    var titleAr = document.getElementById('srpModalRuleTitleAr').value.trim();\n    var descAr = document.getElementById('srpModalRuleDescAr').value.trim();\n    var order = parseInt(document.getElementById('srpModalRuleOrder').value) || 0;\n    var active = document.getElementById('srpModalRuleActive').checked ? 1 : 0;\n\n    var btn = document.getElementById('srpBtnSaveRuleModal');\n    if (btn) btn.disabled = true;\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules\/save';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    var data = {\n        id: id,\n        category_name: catName,\n        category_slug: catSlug,\n        category_emoji: catEmoji,\n        emoji: emoji,\n        title: title,\n        title_ar: titleAr,\n        description: desc,\n        description_ar: descAr,\n        sort_order: order,\n        is_active: active\n    };\n    if (token) data.srp_token = token;\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify(data)\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (btn) btn.disabled = false;\n        if (res && res.ok) {\n            srpToast(id ? 'Rule updated successfully!' : 'New rule added!', 'success');\n            document.getElementById('srpAdminRuleModal').style.display = 'none';\n            srpAdminLoadRules();\n        } else {\n            srpToast('Error: ' + ((res && (res.error || res.message)) || 'Save failed'), 'error');\n        }\n    })\n    .catch(function(){\n        if (btn) btn.disabled = false;\n        srpToast('Network error while saving rule', 'error');\n    });\n}\n\nfunction srpAdminDeleteRule(id) {\n    if (!id) return;\n    if (!confirm('Are you sure you want to delete this rule?')) return;\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules\/delete';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({id: id, srp_token: token})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpToast('Rule deleted.', 'success');\n            srpAdminLoadRules();\n        } else {\n            srpToast('Error deleting rule.', 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\n\/\/ \u2500\u2500\u2500 CATEGORY MANAGEMENT HANDLERS \u2500\u2500\u2500\nfunction srpAdminOpenCategoryModal() {\n    srpAdminResetCategoryForm();\n    srpAdminRenderCategoriesTable();\n    document.getElementById('srpAdminCategoryModal').style.display = 'block';\n}\n\nfunction srpAdminAutoCategorySlug() {\n    var oldSlug = document.getElementById('srpCatOldSlug').value;\n    if (!oldSlug) {\n        var name = document.getElementById('srpCatNameInput').value;\n        document.getElementById('srpCatSlugInput').value = name.toLowerCase().replace(\/[^a-z0-9]+\/g, '_').replace(\/^_+|_+$\/g, '');\n    }\n}\n\nfunction srpAdminResetCategoryForm() {\n    document.getElementById('srpCatOldSlug').value = '';\n    document.getElementById('srpCatNameInput').value = '';\n    document.getElementById('srpCatSlugInput').value = '';\n    document.getElementById('srpCatEmojiInput').value = '\ud83d\udcdc';\n    document.getElementById('srpCatFormTitle').textContent = '\u2795 Add New Category';\n    document.getElementById('srpCatCancelEditBtn').style.display = 'none';\n    document.getElementById('srpCatSaveBtn').textContent = 'Save Category';\n}\n\nfunction srpAdminEditCategoryDirect(slug, name, emoji) {\n    srpAdminOpenCategoryModal();\n    document.getElementById('srpCatOldSlug').value = slug;\n    document.getElementById('srpCatNameInput').value = name;\n    document.getElementById('srpCatSlugInput').value = slug;\n    document.getElementById('srpCatEmojiInput').value = emoji || '\ud83d\udcdc';\n    document.getElementById('srpCatFormTitle').textContent = '\u270f\ufe0f Edit Category: ' + name;\n    document.getElementById('srpCatCancelEditBtn').style.display = 'inline-block';\n    document.getElementById('srpCatSaveBtn').textContent = 'Update Category';\n}\n\nfunction srpAdminSaveCategory() {\n    var name = document.getElementById('srpCatNameInput').value.trim();\n    var slug = document.getElementById('srpCatSlugInput').value.trim();\n    var emoji = document.getElementById('srpCatEmojiInput').value.trim() || '\ud83d\udcdc';\n    var oldSlug = document.getElementById('srpCatOldSlug').value.trim();\n\n    if (!name || !slug) {\n        srpToast('Category name and slug are required.', 'error');\n        return;\n    }\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules\/categories\/save';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    var data = { old_slug: oldSlug, name: name, slug: slug, emoji: emoji };\n    if (token) data.srp_token = token;\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify(data)\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpToast(oldSlug ? 'Category updated!' : 'New category created!', 'success');\n            srpAdminResetCategoryForm();\n            srpAdminLoadRules();\n            setTimeout(srpAdminRenderCategoriesTable, 500);\n        } else {\n            srpToast('Error: ' + ((res && (res.error || res.message)) || 'Failed to save category'), 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error while saving category', 'error'); });\n}\n\nfunction srpAdminDeleteCategory(slug) {\n    if (!slug) return;\n    if (!confirm('Are you sure you want to delete category \"' + slug + '\" and ALL rules inside it? This action cannot be undone!')) return;\n\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules\/categories\/delete';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({ slug: slug, srp_token: token })\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpToast('Category and its rules deleted.', 'success');\n            srpAdminLoadRules();\n            setTimeout(srpAdminRenderCategoriesTable, 500);\n        } else {\n            srpToast('Error deleting category', 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\nfunction srpAdminRenderCategoriesTable() {\n    var container = document.getElementById('srpAdminCategoryTableContainer');\n    if (!container) return;\n\n    if (!srpAdminRulesCategories.length) {\n        container.innerHTML = '<div style=\"text-align:center;padding:20px;color:#888;\">No categories found. Add one above!<\/div>';\n        return;\n    }\n\n    var html = '<table style=\"width:100%;border-collapse:collapse;text-align:left;font-size:13.5px;\">';\n    html += '<thead><tr style=\"background:#14141d;border-bottom:1px solid #282836;color:#aaa;\">';\n    html += '<th style=\"padding:10px 12px;width:50px;text-align:center;\">Icon<\/th>';\n    html += '<th style=\"padding:10px 12px;\">Category Name<\/th>';\n    html += '<th style=\"padding:10px 12px;\">Slug (ID)<\/th>';\n    html += '<th style=\"padding:10px 12px;text-align:center;\">Rules<\/th>';\n    html += '<th style=\"padding:10px 12px;text-align:right;width:140px;\">Actions<\/th>';\n    html += '<\/tr><\/thead><tbody>';\n\n    srpAdminRulesCategories.forEach(function(c){\n        var count = srpAdminAllRules.filter(function(r){ return r.category_slug === c.category_slug; }).length;\n        var rowCatSvg = srpRenderSvgSafe(c.category_emoji || 'file-text', 20, 'var(--srp-cyan, #a855f7)');\n        html += '<tr style=\"border-bottom:1px solid #1c1c28;\">';\n        html += '<td style=\"padding:12px;text-align:center;vertical-align:middle;\"><span style=\"display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:rgba(168, 85, 247, 0.06);border:1px solid rgba(168, 85, 247, 0.2);\">' + rowCatSvg + '<\/span><\/td>';\n        html += '<td style=\"padding:12px;vertical-align:middle;font-weight:700;color:#fff;\">' + srpAdminEsc(c.category_name) + '<\/td>';\n        html += '<td style=\"padding:12px;vertical-align:middle;color:#888;\"><code>' + srpAdminEsc(c.category_slug) + '<\/code><\/td>';\n        html += '<td style=\"padding:12px;text-align:center;vertical-align:middle;\"><span style=\"background:#1e1e2d;padding:2px 8px;border-radius:4px;font-size:12px;color:var(--srp-cyan,#a855f7);\">' + count + ' rules<\/span><\/td>';\n        html += '<td style=\"padding:12px;text-align:right;vertical-align:middle;\">';\n        html += '<button type=\"button\" class=\"srp-btn\" onclick=\"srpAdminEditCategoryDirect(\\'' + c.category_slug + '\\', \\'' + srpAdminEsc(c.category_name) + '\\', \\'' + (c.category_emoji || 'file-text') + '\\')\" style=\"padding:4px 10px;font-size:11.5px;margin-right:6px;background:#1e1e2d;border-color:#333;\">Edit<\/button>';\n        html += '<button type=\"button\" class=\"srp-btn\" onclick=\"srpAdminDeleteCategory(\\'' + c.category_slug + '\\')\" style=\"padding:4px 8px;font-size:11.5px;background:rgba(220,38,38,0.15);border-color:rgba(220,38,38,0.3);color:#ef4444;\">Delete<\/button>';\n        html += '<\/td><\/tr>';\n    });\n\n    html += '<\/tbody><\/table>';\n    container.innerHTML = html;\n}\n\nfunction srpAdminSeedRules() {\n    if (!confirm('Reset all rules to defaults? This will restore standard server rules and categories.')) return;\n    var token = srpGetToken();\n    var url = srpAjax.url + 'admin\/rules\/seed';\n    if (token) url += '?srp_token=' + encodeURIComponent(token);\n\n    fetch(url, {\n        method: 'POST',\n        headers: {'Content-Type': 'application\/json'},\n        credentials: 'same-origin',\n        body: JSON.stringify({srp_token: token})\n    })\n    .then(function(r){return r.json();})\n    .then(function(res){\n        if (res && res.ok) {\n            srpToast('Default rules & categories restored successfully!', 'success');\n            srpAdminLoadRules();\n        } else {\n            srpToast('Error restoring defaults', 'error');\n        }\n    })\n    .catch(function(){ srpToast('Network error', 'error'); });\n}\n\nfunction srpAdminInitWithUser(user) {\n    if (!user || !user.id) {\n        document.getElementById('srpAdminNotLogged').style.display = 'block';\n        return;\n    }\n\n    var perms = user.permissions || {};\n    var r = (user.role || '').toLowerCase();\n    var isStaff = user.is_staff || user.is_owner || perms.whitelist || perms.tickets || perms.gang || perms.permissions || perms.rules_images || perms.rules;\n    if (!isStaff && r !== 'admin' && r !== 'owner' && r !== 'founder' && r !== 'staff') {\n        document.getElementById('srpAdminDenied').style.display = 'block';\n        return;\n    }\n\n    document.getElementById('srpAdminDenied').style.display = 'none';\n    document.getElementById('srpAdminNotLogged').style.display = 'none';\n    document.getElementById('srpAdminContent').style.display = 'block';\n    srpAdminIsOwnerFounder = (user.is_owner || perms.permissions || r === 'owner' || r === 'founder' || r === 'admin');\n\n    \/\/ Toggle Tab Buttons according to Permissions\n    var canWl = !!perms.whitelist || srpAdminIsOwnerFounder || r === 'admin';\n    var canTk = !!perms.tickets || srpAdminIsOwnerFounder || r === 'admin';\n    var canGa = !!perms.gang || srpAdminIsOwnerFounder || r === 'admin';\n    var canRl = srpAdminIsOwnerFounder || !!perms.rules || !!perms.rules_images || r === 'admin';\n    var canPm = srpAdminIsOwnerFounder || !!perms.permissions;\n\n    var btnWl = document.getElementById('srpTabWhitelist');\n    var btnTk = document.getElementById('srpTabTickets');\n    var btnGa = document.getElementById('srpTabGang');\n    var btnRl = document.getElementById('srpTabRules');\n    var btnPm = document.getElementById('srpTabPerms');\n\n    if (btnWl) btnWl.style.display = canWl ? 'inline-flex' : 'none';\n    if (btnTk) btnTk.style.display = canTk ? 'inline-flex' : 'none';\n    if (btnGa) btnGa.style.display = canGa ? 'inline-flex' : 'none';\n    if (btnRl) btnRl.style.display = canRl ? 'inline-flex' : 'none';\n    if (btnPm) btnPm.style.display = canPm ? 'inline-flex' : 'none';\n\n    srpAdminLoadStats();\n\n    \/\/ Automatically open the first permitted tab\n    if (canWl) {\n        srpAdminTab('whitelist');\n    } else if (canTk) {\n        srpAdminTab('tickets');\n    } else if (canGa) {\n        srpAdminTab('gang');\n    } else if (canRl) {\n        srpAdminTab('rules');\n    } else if (canPm) {\n        srpAdminTab('permissions');\n    }\n}\n\ndocument.addEventListener('DOMContentLoaded', function(){\n    if (window.srpInitialUser && window.srpInitialUser.id) {\n        srpAdminInitWithUser(window.srpInitialUser);\n    }\n    srpCheckAuth(function(user){\n        if (user && user.id) {\n            srpAdminInitWithUser(user);\n        } else if (!window.srpInitialUser || !window.srpInitialUser.id) {\n            document.getElementById('srpAdminNotLogged').style.display = 'block';\n        }\n    });\n\n    var lang = (document.cookie.split(';').find(function(c){return c.trim().startsWith('srp_lang=');})||'').split('=')[1]||'en';\n    if(lang==='ar'){\n        document.getElementById('srpAdminSub').textContent='\u0625\u062f\u0627\u0631\u0629 \u0637\u0644\u0628\u0627\u062a \u0627\u0644\u0648\u064a\u062a\u0644\u0633\u062a \u0648\u0627\u0644\u062a\u0630\u0627\u0643\u0631 \u0648\u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0648\u0627\u0644\u0642\u0648\u0627\u0646\u064a\u0646';\n    }\n\n    \/\/ Live polling for tickets and open ticket conversation\n    setInterval(function(){\n        if (srpAdminCurrentTicketId) {\n            var modal = document.getElementById('srpAdminTicketModal');\n            if (modal && modal.style.display === 'flex') {\n                var userText = (document.getElementById('srpAdminModalTicketUser') ? document.getElementById('srpAdminModalTicketUser').textContent : '');\n                srpAdminLoadTicketConversation(srpAdminCurrentTicketId, userText);\n            }\n        }\n        var ticketsTab = document.getElementById('srpTabTickets');\n        if (ticketsTab && ticketsTab.classList.contains('active')) {\n            srpAdminLoadTickets();\n        }\n    }, 4000);\n});\n<\/script>\n\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":{"footnotes":""},"class_list":["post-18","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/pages\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":0,"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/pages\/18\/revisions"}],"wp:attachment":[{"href":"https:\/\/angels-devils.adilbannar.my\/index.php\/wp-json\/wp\/v2\/media?parent=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}