Mar 22, 2026

How to avoid scam

<?php
include('db.php');

// ── AJAX: get single blog with content — MUST be first ──
if (isset($_GET['get_blog'])) {
    $id = (int)$_GET['get_blog'];
    $r = $conn->query("SELECT * FROM blogs WHERE id=$id");
    header('Content-Type: application/json');
    header('Cache-Control: no-cache');
    echo $r ? json_encode($r->fetch_assoc()) : json_encode(['error'=>'not found']);
    exit;
}

// ── DELETE ──
if (isset($_GET['del_blog'])) {
    $id = (int)$_GET['del_blog'];
    $conn->query("DELETE FROM blogs WHERE id=$id");
    header("Location: blog.php?msg=deleted"); exit;
}

// ── SAVE / UPDATE ──
if (isset($_POST['save_blog'])) {
    $id = (int)($_POST['blog_id'] ?? 0);
    $title = $conn->real_escape_string($_POST['title']);
    $slug = $conn->real_escape_string($_POST['slug'] ?? strtolower(preg_replace('/[^a-z0-9]+/','-',trim($_POST['title']))));
    $status = in_array($_POST['status'],['active','inactive']) ? $_POST['status'] : 'active';
    $content = $conn->real_escape_string($_POST['content']);
    $cover = $conn->real_escape_string($_POST['cover_image'] ?? '');
    if ($id) {
        $conn->query("UPDATE blogs SET title='$title',slug='$slug',content='$content',cover_image='$cover',status='$status' WHERE id=$id");
    } else {
        $conn->query("INSERT INTO blogs (title,slug,content,cover_image,status) VALUES ('$title','$slug','$content','$cover','$status')");
    }
    header("Location: blog.php?msg=saved"); exit;
}

// ── FETCH LIST (no content column) ──
$total = $conn->query("SELECT id FROM blogs")->num_rows;
$active_cnt = $conn->query("SELECT id FROM blogs WHERE status='active'")->num_rows;
$res = $conn->query("SELECT id,title,slug,cover_image,status,created_at FROM blogs ORDER BY created_at DESC");
$blogs = [];
while ($r = $res->fetch_assoc()) $blogs[] = $r;

$flash_msg = $_GET['msg'] ?? '';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alensio Admin — Blog</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-lite.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-lite.min.js"></script>
<style>
:root{--bg:#060a12;--surface:#0d1420;--card:#111927;--border:#1e2d42;--accent:#00d4ff;--accent2:#7c3aed;--green:#00e896;--red:#ff4b6e;--warn:#ffb547;--text:#e8f0fe;--muted:#6b7fa3;--fh:'Syne',sans-serif;--fb:'DM Sans',sans-serif}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--text);font-family:var(--fb);min-height:100vh;overflow-x:hidden}

.hdr{position:sticky;top:0;z-index:200;background:rgba(6,10,18,0.97);backdrop-filter:blur(20px);border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 16px;height:60px;gap:10px}
.hbg{background:none;border:none;color:var(--text);cursor:pointer;padding:6px;display:flex;flex-direction:column;gap:5px;flex-shrink:0}
.hbg span{display:block;width:22px;height:2px;background:currentColor;border-radius:2px}
.logo{font-family:var(--fh);font-weight:800;font-size:20px;color:var(--accent)}
.logo sub{font-size:11px;color:var(--muted);font-family:var(--fb);font-weight:400;margin-left:4px}
.sp{flex:1}
.hbtn{border:none;padding:9px 16px;border-radius:9px;cursor:pointer;font-size:13px;font-family:var(--fb);font-weight:700;transition:all .2s;text-decoration:none;display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.hbtn.g{background:rgba(0,232,150,.12);border:1px solid rgba(0,232,150,.3);color:var(--green)}
.hbtn.g:hover{background:var(--green);color:#000}

.nov{position:fixed;inset:0;background:rgba(0,0,0,.72);z-index:300;opacity:0;pointer-events:none;transition:opacity .3s;backdrop-filter:blur(4px)}
.nov.open{opacity:1;pointer-events:all}
.ndr{position:fixed;left:0;top:0;bottom:0;width:270px;background:var(--surface);border-right:1px solid var(--border);z-index:400;transform:translateX(-100%);transition:transform .35s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;overflow-y:auto}
.ndr.open{transform:translateX(0)}
.nhd{padding:18px 20px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;background:var(--surface);z-index:1}
.nlogo{font-family:var(--fh);font-weight:800;font-size:20px;color:var(--accent)}
.nlogo span{color:var(--text)}
.ncl{background:none;border:none;color:var(--muted);cursor:pointer;font-size:18px;padding:4px 8px;border-radius:6px}
.ncl:hover{background:var(--card);color:var(--text)}
.nbadge{padding:12px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--border);background:rgba(0,212,255,.04)}
.nav-av{width:38px;height:38px;border-radius:50%;background:linear-gradient(135deg,var(--accent2),var(--accent));display:flex;align-items:center;justify-content:center;font-family:var(--fh);font-weight:800;font-size:15px;color:#fff;flex-shrink:0}
.nsec{padding:8px 18px 3px;font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:1px}
.nl{display:flex;align-items:center;justify-content:space-between;padding:11px 18px;color:var(--muted);font-size:13px;font-weight:500;text-decoration:none;border-left:3px solid transparent;transition:all .2s}
.nl:hover{color:var(--text);background:rgba(0,212,255,.05);border-left-color:var(--accent)}
.nl.active{color:var(--accent);background:rgba(0,212,255,.07);border-left-color:var(--accent)}
.nll{display:flex;align-items:center;gap:10px}
.nl .ico{font-size:14px;width:16px;text-align:center}
.narr{font-size:13px;opacity:.35}
.nl:hover .narr,.nl.active .narr{color:var(--accent);opacity:1}
.nbot{padding:14px 18px;border-top:1px solid var(--border);margin-top:auto;font-size:11px;color:var(--muted);text-align:center}

.main{padding:22px 18px;max-width:1200px;margin:0 auto}
.phd{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:22px}
.phd h1{font-family:var(--fh);font-size:24px;font-weight:800}
.phd p{color:var(--muted);font-size:13px;margin-top:4px}

.flash{padding:11px 16px;border-radius:9px;font-size:13px;font-weight:600;margin-bottom:16px;display:flex;align-items:center;gap:8px;background:rgba(0,232,150,.1);border:1px solid rgba(0,232,150,.3);color:var(--green)}

.srow{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;margin-bottom:20px}
.sc{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.sc-l{font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:5px}
.sc-v{font-family:var(--fh);font-size:26px;font-weight:800}

/* SEARCH & FILTER BAR */
.filter-bar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px;align-items:center}
.filter-bar input,.filter-bar select{background:var(--surface);border:1px solid var(--border);color:var(--text);padding:9px 12px;border-radius:9px;font-family:var(--fb);font-size:13px;outline:none;transition:border-color .2s}
.filter-bar input:focus,.filter-bar select:focus{border-color:var(--accent)}
.search-input{flex:1;min-width:180px}
.filter-bar input[type=date]{min-width:140px}

.sec{background:var(--surface);border:1px solid var(--border);border-radius:14px;overflow:hidden;margin-bottom:20px}
.sec-hd{padding:14px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.sec-t{font-family:var(--fh);font-size:13px;font-weight:700;display:flex;align-items:center;gap:7px}
.cnt{background:rgba(0,232,150,.1);color:var(--green);padding:2px 9px;border-radius:20px;font-size:10px;font-weight:700}

.tw{overflow-x:auto;-webkit-overflow-scrolling:touch}
table{width:100%;border-collapse:collapse;min-width:420px}
th{text-align:left;padding:10px 14px;font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;border-bottom:1px solid var(--border);background:rgba(0,0,0,.12);white-space:nowrap}
td{padding:11px 14px;border-bottom:1px solid var(--border);font-size:13px;vertical-align:middle}
tr:last-child td{border-bottom:none}
tr:hover td{background:rgba(0,212,255,.02)}
.cover-thumb{width:50px;height:36px;border-radius:6px;object-fit:cover;background:var(--card);display:block;border:1px solid var(--border)}
.cover-thumb-ph{width:50px;height:36px;border-radius:6px;background:var(--card);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:16px}
.sbadge{padding:3px 9px;border-radius:20px;font-size:10px;font-weight:700;text-transform:uppercase;display:inline-block}
.sbadge.active{background:rgba(0,232,150,.12);color:var(--green)}
.sbadge.inactive{background:rgba(255,75,110,.12);color:var(--red)}
.acts{display:flex;gap:6px;align-items:center}
.abtn{padding:5px 11px;border-radius:6px;border:none;cursor:pointer;font-family:var(--fb);font-size:11px;font-weight:700;transition:all .2s;display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.abtn.e{background:rgba(124,58,237,.1);color:#a78bfa;border:1px solid rgba(124,58,237,.2)}
.abtn.e:hover{background:var(--accent2);color:#fff}
.abtn.d{background:rgba(255,75,110,.1);color:var(--red);border:1px solid rgba(255,75,110,.2)}
.abtn.d:hover{background:var(--red);color:#fff}
.empty{text-align:center;padding:40px;color:var(--muted);font-size:13px}
.hidden-row{display:none}

/* MODAL */
.modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.88);z-index:1000;align-items:flex-end;justify-content:center;padding:0;backdrop-filter:blur(6px)}
.modal.show{display:flex}
@media(min-width:600px){.modal{align-items:center;padding:14px}}
.mbox{background:var(--surface);border:1px solid var(--border);width:100%;display:flex;flex-direction:column;animation:sup .3s ease;border-radius:20px 20px 0 0;max-height:94vh}
@media(min-width:600px){.mbox{border-radius:18px;max-width:900px;max-height:92vh}}
.mbox.sm{max-width:380px}
@keyframes sup{from{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1}}
.mhd{padding:15px 18px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;flex-shrink:0}
.mhd h3{font-family:var(--fh);font-size:15px;font-weight:700}
.mcl{background:none;border:none;color:var(--muted);font-size:18px;cursor:pointer;padding:3px 7px;border-radius:6px;line-height:1}
.mcl:hover{background:var(--card);color:var(--text)}
.mbdy{padding:18px;overflow-y:auto;flex:1;-webkit-overflow-scrolling:touch}
.mftr{padding:13px 18px;border-top:1px solid var(--border);display:flex;gap:8px;flex-shrink:0;background:var(--surface)}
.mftr button,.mftr a{flex:1;padding:13px;border-radius:10px;border:none;cursor:pointer;font-family:var(--fb);font-size:14px;font-weight:700;display:flex;align-items:center;justify-content:center;gap:6px;transition:all .2s;text-decoration:none}
.mbtn-c{background:var(--card);border:1px solid var(--border)!important;color:var(--text);flex:0 0 auto!important;min-width:90px!important}
.mbtn-c:hover{border-color:var(--accent)!important;color:var(--accent)}
.mbtn-pp{background:var(--accent2);color:#fff}
.mbtn-pp:hover{opacity:.85}
.mbtn-r{background:rgba(255,75,110,.12);color:var(--red);border:1px solid rgba(255,75,110,.3)!important}
.mbtn-r:hover{background:var(--red);color:#fff}

.fg{margin-bottom:12px}
.fl{font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;display:block;margin-bottom:5px}
.fi{background:var(--bg);border:1px solid var(--border);color:var(--text);padding:10px 12px;border-radius:8px;font-family:var(--fb);font-size:13px;outline:none;width:100%;transition:border-color .2s}
.fi:focus{border-color:var(--accent)}
.egrid{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-bottom:12px}

/* Cover upload row */
.cover-row{display:flex;gap:8px;align-items:flex-end}
.cover-row .fi{flex:1}
.upload-btn{background:var(--card);border:1px solid var(--border);color:var(--text);padding:10px 14px;border-radius:8px;cursor:pointer;font-family:var(--fb);font-size:12px;font-weight:600;white-space:nowrap;transition:all .2s;flex-shrink:0}
.upload-btn:hover{border-color:var(--accent);color:var(--accent)}

/* Upload overlay */
#uploadOverlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:9999;flex-direction:column;align-items:center;justify-content:center;backdrop-filter:blur(5px)}
.spinner{width:44px;height:44px;border:4px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:sp .8s linear infinite}
@keyframes sp{to{transform:rotate(360deg)}}

/* Summernote */
.note-editor.note-frame{border:1px solid var(--border)!important;border-radius:10px!important;overflow:hidden}
.note-toolbar{background:var(--card)!important;border-bottom:1px solid var(--border)!important;flex-wrap:wrap!important;padding:4px!important}
.note-editable{background:#fff!important;color:#111!important;min-height:260px!important}
.note-statusbar{background:var(--card)!important;border-top:1px solid var(--border)!important}
.note-btn{background:var(--surface)!important;border:1px solid var(--border)!important;color:var(--text)!important;font-size:11px!important}

/* Confirm modal */
.cico{font-size:44px;text-align:center;margin-bottom:10px}
.cmsg{text-align:center;color:var(--muted);font-size:13px;line-height:1.7}

/* Toast */
.tc{position:fixed;bottom:20px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none}
.toast{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:11px 15px;display:flex;align-items:center;gap:9px;min-width:220px;box-shadow:0 8px 24px rgba(0,0,0,.4);animation:tIn .3s ease;font-size:13px;font-weight:500;pointer-events:all}
.toast.hiding{animation:tOut .3s ease forwards}
@keyframes tIn{from{transform:translateX(110%)}to{transform:translateX(0)}}
@keyframes tOut{to{transform:translateX(110%);opacity:0}}
.toast.s{border-left:3px solid var(--green)}.toast.e{border-left:3px solid var(--red)}.toast.i{border-left:3px solid var(--accent)}

@media(max-width:600px){
  .main{padding:14px 12px}
  .phd{flex-direction:column}
  .egrid{grid-template-columns:1fr}
  table{min-width:340px}
  th:nth-child(1),td:nth-child(1){display:none}
  .filter-bar input[type=date]{display:none}
}
</style>
</head>
<body>

<!-- UPLOAD OVERLAY -->
<div id="uploadOverlay">
  <div class="spinner"></div>
  <p style="margin-top:16px;font-weight:700;color:var(--text);font-size:13px;letter-spacing:1px">UPLOADING TO CLOUDINARY…</p>
</div>

<!-- HEADER -->
<header class="hdr">
  <button class="hbg" onclick="tnav()"><span></span><span></span><span></span></button>
  <div class="logo">Alensio <sub>Admin</sub></div>
  <div class="sp"></div>
  <button class="hbtn g" onclick="openEd(null)">+ New Post</button>
</header>

<!-- NAV -->
<div class="nov" id="nov" onclick="tnav()"></div>
<nav class="ndr" id="ndr">
  <div class="nhd"><div class="nlogo">Alensio <span>Admin</span></div><button class="ncl" onclick="tnav()">✕</button></div>
  <div class="nbadge"><div class="nav-av">A</div><div><div style="font-weight:600;font-size:13px">Administrator</div><div style="font-size:11px;color:var(--accent);text-transform:uppercase;letter-spacing:.5px">Super Admin</div></div></div>
  <div class="nsec">Main</div>
  <a class="nl" href="index.php"><div class="nll"><span class="ico">📊</span>Dashboard</div><span class="narr">›</span></a>
  <a class="nl" href="users.php"><div class="nll"><span class="ico">👥</span>Users</div><span class="narr">›</span></a>
  <a class="nl" href="user_kyc.php"><div class="nll"><span class="ico">🪪</span>User KYC</div><span class="narr">›</span></a>
  <a class="nl" href="transactions.html"><div class="nll"><span class="ico">💳</span>Transactions</div><span class="narr">›</span></a>
  <a class="nl" href="c2cv2.html"><div class="nll"><span class="ico">🔄</span>C2C V2</div><span class="narr">›</span></a>
  <a class="nl" href="support.php"><div class="nll"><span class="ico">🎫</span>Support</div><span class="narr">›</span></a>
  <div class="nsec">Content</div>
  <a class="nl active" href="blog.php"><div class="nll"><span class="ico">📝</span>Blog</div><span class="narr">›</span></a>
  <a class="nl" href="policy.php"><div class="nll"><span class="ico">📜</span>Policies</div><span class="narr">›</span></a>
  <div class="nsec">System</div>
  <a class="nl" href="system_data.php"><div class="nll"><span class="ico">⚙️</span>System Data</div><span class="narr">›</span></a>
  <a class="nl" href="settings.html"><div class="nll"><span class="ico">🛠</span>Settings</div><span class="narr">›</span></a>
  <div class="nbot">Alensio Admin v2.0</div>
</nav>

<!-- MAIN -->
<main class="main">
  <div class="phd">
    <div><h1>Blog Manager</h1><p>Create, edit and manage all blog posts</p></div>
    <button class="hbtn g" onclick="openEd(null)">+ New Post</button>
  </div>

  <?php if ($flash_msg === 'saved'): ?>
  <div class="flash">✅ Blog post saved and published!</div>
  <?php elseif ($flash_msg === 'deleted'): ?>
  <div class="flash" style="background:rgba(255,75,110,.08);border-color:rgba(255,75,110,.3);color:var(--red)">🗑 Post deleted.</div>
  <?php endif; ?>

  <!-- STATS -->
  <div class="srow">
    <div class="sc"><div class="sc-l">Total Posts</div><div class="sc-v" style="color:var(--accent)"><?= $total ?></div></div>
    <div class="sc"><div class="sc-l">Active</div><div class="sc-v" style="color:var(--green)"><?= $active_cnt ?></div></div>
    <div class="sc"><div class="sc-l">Inactive</div><div class="sc-v" style="color:var(--muted)"><?= $total - $active_cnt ?></div></div>
  </div>

  <!-- BLOG LIST -->
  <div class="sec">
    <div class="sec-hd">
      <div class="sec-t">📝 All Posts <span class="cnt"><?= $total ?></span></div>
    </div>

    <!-- SEARCH & FILTER -->
    <div style="padding:14px 16px;border-bottom:1px solid var(--border)">
      <div class="filter-bar">
        <input type="text" class="search-input" id="searchInput" placeholder="🔍 Search by title or slug…" oninput="filterBlogs()">
        <input type="date" id="filterDate" onchange="filterBlogs()" title="Filter by date">
        <select id="filterStatus" onchange="filterBlogs()">
          <option value="">All Status</option>
          <option value="active">Active</option>
          <option value="inactive">Inactive</option>
        </select>
      </div>
    </div>

    <div class="tw">
      <table>
        <thead>
          <tr><th>Cover</th><th>Title</th><th>Status</th><th>Date</th><th>Actions</th></tr>
        </thead>
        <tbody id="blogTableBody">
          <?php if (empty($blogs)): ?>
          <tr><td colspan="5" class="empty">No posts yet — click "+ New Post" to create one</td></tr>
          <?php else: foreach ($blogs as $b): ?>
          <tr class="blog-row"
              data-title="<?= strtolower(htmlspecialchars($b['title'])) ?>"
              data-status="<?= $b['status'] ?>"
              data-date="<?= date('Y-m-d', strtotime($b['created_at'])) ?>">
            <td>
              <?php if ($b['cover_image']): ?>
              <img src="<?= htmlspecialchars($b['cover_image']) ?>" class="cover-thumb" alt="Cover" onerror="this.style.display='none'">
              <?php else: ?>
              <div class="cover-thumb-ph">📄</div>
              <?php endif; ?>
            </td>
            <td>
              <strong><?= htmlspecialchars($b['title']) ?></strong><br>
              <span style="font-size:11px;color:var(--muted)">/blog/<?= htmlspecialchars($b['slug']) ?></span>
            </td>
            <td><span class="sbadge <?= $b['status'] ?>"><?= strtoupper($b['status']) ?></span></td>
            <td style="font-size:11px;color:var(--muted);white-space:nowrap"><?= date('d M Y', strtotime($b['created_at'])) ?></td>
            <td>
              <div class="acts">
                <button class="abtn e" onclick="loadAndEdit(<?= $b['id'] ?>)">✏️ Edit</button>
                <button class="abtn d" onclick="delBlog(<?= $b['id'] ?>, '<?= addslashes(htmlspecialchars($b['title'])) ?>')">🗑 Del</button>
              </div>
            </td>
          </tr>
          <?php endforeach; endif; ?>
        </tbody>
      </table>
      <div id="noResults" style="display:none;text-align:center;padding:40px;color:var(--muted);font-size:13px">No posts match your search.</div>
    </div>
  </div>
</main>

<!-- EDITOR MODAL -->
<div class="modal" id="edModal">
  <div class="mbox">
    <div class="mhd"><h3 id="edTitle">New Blog Post</h3><button class="mcl" onclick="cm('edModal')">✕</button></div>
    <form method="POST" id="edForm" style="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden">
      <div class="mbdy" style="overflow-y:auto;flex:1">
        <input type="hidden" name="blog_id" id="bid" value="">
        <div class="egrid">
          <div class="fg" style="margin:0">
            <label class="fl">Post Title *</label>
            <input type="text" name="title" id="btitle" class="fi" required placeholder="e.g. Bitcoin Growth in 2025" oninput="autoSlug(this.value)">
          </div>
          <div class="fg" style="margin:0">
            <label class="fl">Status</label>
            <select name="status" id="bstatus" class="fi">
              <option value="active">Active</option>
              <option value="inactive">Inactive</option>
            </select>
          </div>
        </div>
        <div class="fg">
          <label class="fl">URL Slug</label>
          <input type="text" name="slug" id="bslug" class="fi" required placeholder="bitcoin-growth-2025">
        </div>
        <div class="fg">
          <label class="fl">Cover Image</label>
          <div class="cover-row">
            <input type="text" name="cover_image" id="bcover" class="fi" placeholder="Paste URL or click Upload →">
            <input type="file" id="coverFile" style="display:none" accept="image/*" onchange="uploadCover(this)">
            <button type="button" class="upload-btn" onclick="document.getElementById('coverFile').click()">📷 Upload</button>
          </div>
          <div id="coverPreviewWrap" style="margin-top:8px;display:none">
            <img id="coverPreview" style="max-height:80px;border-radius:8px;border:1px solid var(--border)" src="" alt="Preview">
          </div>
        </div>
        <div class="fg" style="margin-bottom:0">
          <label class="fl">Content — full rich editor (text, images, links, tables, videos)</label>
          <textarea id="snote" name="content"></textarea>
        </div>
      </div>
      <div class="mftr">
        <button type="button" class="mbtn-c" onclick="cm('edModal')" style="flex:0 0 100px">Cancel</button>
        <button type="submit" name="save_blog" class="mbtn-pp">🚀 Publish Post</button>
      </div>
    </form>
  </div>
</div>

<!-- CONFIRM DELETE -->
<div class="modal" id="cfmModal">
  <div class="mbox sm">
    <div class="mhd"><h3>Delete Post?</h3><button class="mcl" onclick="cm('cfmModal')">✕</button></div>
    <div class="mbdy">
      <div class="cico">🗑</div>
      <div class="cmsg" id="cfmMsg"></div>
    </div>
    <div class="mftr">
      <button class="mbtn-c" onclick="cm('cfmModal')" style="flex:0 0 90px">Cancel</button>
      <a class="mbtn-r" id="cfmLink" href="#">Delete</a>
    </div>
  </div>
</div>

<!-- LOADING MODAL -->
<div class="modal" id="loadModal" style="z-index:1100">
  <div style="color:#fff;font-size:14px;display:flex;align-items:center;gap:12px">
    <div style="width:28px;height:28px;border:3px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:sp .8s linear infinite"></div>
    Loading post…
  </div>
</div>

<div class="tc" id="tc"></div>

<script>
const cloudName = "dtzqlduqx";
const uploadPreset = "gatesz";

function tnav(){document.getElementById('ndr').classList.toggle('open');document.getElementById('nov').classList.toggle('open');}
function cm(id){document.getElementById(id).classList.remove('show');}
function om(id){document.getElementById(id).classList.add('show');}
document.querySelectorAll('.modal').forEach(m=>m.addEventListener('click',e=>{if(e.target===m)m.classList.remove('show');}));

function toast(msg,t='i'){
  const ic={s:'✅',e:'❌',i:'ℹ️'};
  const el=document.createElement('div');el.className='toast '+t;
  el.innerHTML='<span>'+ic[t]+'</span><span style="flex:1">'+msg+'</span>';
  document.getElementById('tc').appendChild(el);
  setTimeout(()=>{el.classList.add('hiding');setTimeout(()=>el.remove(),300);},4000);
}

// ── SEARCH & FILTER ──
function filterBlogs(){
  const q=document.getElementById('searchInput').value.toLowerCase().trim();
  const status=document.getElementById('filterStatus').value;
  const date=document.getElementById('filterDate').value;
  let visible=0;
  document.querySelectorAll('.blog-row').forEach(row=>{
    const titleMatch=!q||row.dataset.title.includes(q);
    const statusMatch=!status||row.dataset.status===status;
    const dateMatch=!date||row.dataset.date===date;
    const show=titleMatch&&statusMatch&&dateMatch;
    row.style.display=show?'':'none';
    if(show)visible++;
  });
  document.getElementById('noResults').style.display=visible===0?'block':'none';
}

// ── EDITOR ──
let edReady=false;
function initEditor(){
  if(edReady)return;
  $('#snote').summernote({
    height:280,
    placeholder:'Write your full blog post here… Add text, images, links, tables, videos…',
    callbacks:{
      onImageUpload:function(files){uploadImgEditor(files[0]);}
    },
    toolbar:[
      ['style',['style']],
      ['font',['bold','underline','italic','clear','fontsize']],
      ['color',['color']],
      ['para',['ul','ol','paragraph']],
      ['table',['table']],
      ['insert',['link','picture','video','hr']],
      ['view',['fullscreen','codeview']]
    ]
  });
  edReady=true;
}

function openEd(blog){
  initEditor();
  document.getElementById('bid').value='';
  document.getElementById('btitle').value='';
  document.getElementById('bslug').value='';
  document.getElementById('bstatus').value='active';
  document.getElementById('bcover').value='';
  document.getElementById('coverPreviewWrap').style.display='none';
  document.getElementById('edTitle').textContent='Create New Post';
  document.getElementById('bslug').removeAttribute('data-m');
  $('#snote').summernote('code','');
  om('edModal');
}

function loadAndEdit(id){
  om('loadModal');
  fetch('blog.php?get_blog='+id)
    .then(r=>r.json())
    .then(d=>{
      cm('loadModal');
      if(!d.id){toast('Failed to load post','e');return;}
      initEditor();
      document.getElementById('bid').value=d.id;
      document.getElementById('btitle').value=d.title;
      document.getElementById('bslug').value=d.slug;
      document.getElementById('bstatus').value=d.status||'active';
      document.getElementById('bcover').value=d.cover_image||'';
      document.getElementById('bslug').setAttribute('data-m','1');
      // show cover preview
      if(d.cover_image){
        document.getElementById('coverPreview').src=d.cover_image;
        document.getElementById('coverPreviewWrap').style.display='block';
      } else {
        document.getElementById('coverPreviewWrap').style.display='none';
      }
      document.getElementById('edTitle').textContent='Edit: '+d.title;
      $('#snote').summernote('code',d.content||'');
      om('edModal');
    })
    .catch(()=>{cm('loadModal');toast('Network error loading post','e');});
}

// ── AUTO SLUG ──
function autoSlug(v){
  const el=document.getElementById('bslug');
  if(!el.getAttribute('data-m'))el.value=v.toLowerCase().replace(/[^a-z0-9\s-]/g,'').replace(/\s+/g,'-').replace(/-+/g,'-');
}
document.addEventListener('DOMContentLoaded',()=>{
  document.getElementById('bslug').addEventListener('input',function(){this.setAttribute('data-m','1');});
  // Show cover preview when URL typed
  document.getElementById('bcover').addEventListener('input',function(){
    if(this.value){document.getElementById('coverPreview').src=this.value;document.getElementById('coverPreviewWrap').style.display='block';}
    else{document.getElementById('coverPreviewWrap').style.display='none';}
  });
});

// ── UPLOAD COVER via CLOUDINARY ──
async function uploadCover(input){
  const file=input.files[0];if(!file)return;
  document.getElementById('uploadOverlay').style.display='flex';
  const fd=new FormData();fd.append('file',file);fd.append('upload_preset',uploadPreset);
  try{
    const res=await fetch('https://api.cloudinary.com/v1_1/'+cloudName+'/auto/upload',{method:'POST',body:fd});
    const data=await res.json();
    if(data.secure_url){
      document.getElementById('bcover').value=data.secure_url;
      document.getElementById('coverPreview').src=data.secure_url;
      document.getElementById('coverPreviewWrap').style.display='block';
      toast('Cover uploaded!','s');
    } else { toast('Upload failed: '+(data.error?.message||'Unknown'),'e'); }
  }catch(e){toast('Upload error: '+e.message,'e');}
  finally{document.getElementById('uploadOverlay').style.display='none';input.value='';}
}

// ── UPLOAD IMAGE IN EDITOR via CLOUDINARY ──
async function uploadImgEditor(file){
  document.getElementById('uploadOverlay').style.display='flex';
  const fd=new FormData();fd.append('file',file);fd.append('upload_preset',uploadPreset);
  try{
    const res=await fetch('https://api.cloudinary.com/v1_1/'+cloudName+'/auto/upload',{method:'POST',body:fd});
    const data=await res.json();
    if(data.secure_url){$('#snote').summernote('insertImage',data.secure_url);toast('Image inserted!','s');}
    else{toast('Upload failed','e');}
  }catch(e){toast('Upload error','e');}
  finally{document.getElementById('uploadOverlay').style.display='none';}
}

// ── DELETE ──
function delBlog(id,name){
  document.getElementById('cfmMsg').innerHTML='Delete post <strong>'+name+'</strong>? This cannot be undone.';
  document.getElementById('cfmLink').href='?del_blog='+id;
  om('cfmModal');
}

<?php if ($flash_msg): ?>
setTimeout(()=>toast('<?= $flash_msg==='saved'?'Post published!':'Post deleted.' ?>','<?= $flash_msg==='saved'?'s':'i' ?>'),300);
<?php endif; ?>
</script>
</body>
</html>