403Webshell
Server IP : 69.72.244.102  /  Your IP : 216.73.216.164
Web Server : LiteSpeed
System : Linux s3434.fra1.stableserver.net 4.18.0-513.24.1.lve.2.el8.x86_64 #1 SMP Fri May 24 12:42:50 UTC 2024 x86_64
User : konzalta ( 1271)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/konzalta/constituency.work/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/konzalta/constituency.work/events.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ConstituencyOS – Events</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
  --green:#1a7a4a; --green-light:#e8f5ee; --green-mid:#2d9e63;
  --red:#dc2626; --red-light:#fdecea;
  --amber:#f59e0b; --amber-light:#fffbeb;
  --blue:#2563eb; --blue-light:#eff6ff;
  --purple:#7c3aed; --purple-light:#f5f3ff;
  --teal:#0891b2; --teal-light:#ecfeff;
  --text:#111827; --muted:#6b7280; --light:#9ca3af;
  --border:#e5e7eb; --bg:#f3f4f6; --white:#ffffff;
  --sidebar-w:216px; --radius:10px; --radius-sm:6px;
  --shadow:0 1px 3px rgba(0,0,0,.08);
}
html,body{height:100%;margin:0;padding:0;}
body{font-family:'Inter',sans-serif;font-size:13px;color:var(--text);background:var(--bg);}

/* SIDEBAR */
.sidebar{position:fixed;top:0;left:0;bottom:0;width:var(--sidebar-w);background:var(--white);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;z-index:40;}
.sidebar-logo{display:flex;align-items:center;gap:9px;padding:14px 14px 12px;border-bottom:1px solid var(--border);flex-shrink:0;}
.logo-icon{width:38px;height:38px;background:linear-gradient(135deg,#b91c1c,#1a7a4a);border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0;}
.logo-text strong{display:block;font-size:12.5px;font-weight:700;color:var(--green);}
.logo-text small{font-size:10px;color:var(--muted);line-height:1.3;}
.sidebar-profile{display:flex;align-items:center;gap:9px;padding:11px 14px;border-bottom:1px solid var(--border);flex-shrink:0;}
.s-avatar{width:36px;height:36px;border-radius:50%;background:#374151;color:white;font-weight:600;font-size:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;}
.s-avatar .dot{position:absolute;bottom:1px;right:1px;width:8px;height:8px;border-radius:50%;background:var(--green-mid);border:2px solid white;}
.profile-name{font-size:11.5px;font-weight:600;}.profile-sub{font-size:10.5px;color:var(--muted);}
.sidebar-nav{flex:1;padding:6px 0;}
.nav-item{display:flex;align-items:center;gap:9px;padding:8px 14px;font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;position:relative;transition:background .12s,color .12s;white-space:nowrap;}
.nav-item:hover{background:var(--bg);color:var(--text);}
.nav-item.active{background:var(--green-light);color:var(--green);font-weight:600;}
.nav-item.active::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--green);border-radius:0 2px 2px 0;}
.nav-icon{font-size:14px;width:16px;text-align:center;flex-shrink:0;}
.nav-badge{margin-left:auto;background:var(--red);color:white;font-size:9.5px;font-weight:700;padding:1px 5px;border-radius:10px;}
.nav-new{margin-left:auto;background:var(--green);color:white;font-size:9px;font-weight:700;padding:2px 5px;border-radius:4px;}
.nav-chevron{margin-left:auto;font-size:10px;color:var(--light);}
.sidebar-footer{padding:12px 14px;border-top:1px solid var(--border);flex-shrink:0;}
.help-row{display:flex;align-items:center;gap:9px;cursor:pointer;}
.help-label{font-size:11.5px;font-weight:600;}.help-sub{font-size:10.5px;color:var(--muted);}

/* RIGHT PANEL */
.right-panel{margin-left:var(--sidebar-w);display:flex;flex-direction:column;min-height:100vh;}
.topbar{position:sticky;top:0;z-index:30;height:52px;background:var(--white);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:10px;padding:0 18px;}
.menu-btn{font-size:17px;cursor:pointer;color:var(--muted);}
.const-selector{display:flex;align-items:center;gap:6px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px 10px;cursor:pointer;font-size:12px;font-weight:500;}
.search-top{flex:1;max-width:360px;display:flex;align-items:center;gap:7px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 11px;color:var(--muted);font-size:12px;}
.search-top input{border:none;background:transparent;outline:none;width:100%;font-size:12px;font-family:inherit;}
.search-top kbd{margin-left:auto;font-size:9.5px;background:var(--border);padding:1px 5px;border-radius:3px;font-family:inherit;}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:8px;}
.icon-btn{position:relative;width:32px;height:32px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:15px;}
.icon-btn .bdg{position:absolute;top:-3px;right:-3px;background:var(--red);color:white;font-size:9px;font-weight:700;width:15px;height:15px;border-radius:50%;display:flex;align-items:center;justify-content:center;border:1.5px solid white;}
.icon-btn .bdg.grn{background:var(--green-mid);}
.user-pill{display:flex;align-items:center;gap:7px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:3px 8px;cursor:pointer;font-size:12px;font-weight:500;}

/* CONTENT */
.content{padding:18px 18px 40px;display:flex;flex-direction:column;gap:14px;}

/* UTILS */
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:var(--radius-sm);font-size:12px;font-weight:600;cursor:pointer;border:none;transition:background .15s;}
.btn-primary{background:var(--green);color:white;}.btn-primary:hover{background:var(--green-mid);}
.btn-ghost{background:var(--white);color:var(--text);border:1px solid var(--border);}.btn-ghost:hover{background:var(--bg);}
.page-header{display:flex;align-items:flex-start;justify-content:space-between;}
.page-title{font-size:19px;font-weight:700;}
.page-sub{font-size:12px;color:var(--muted);margin-top:2px;}

/* STAT STRIP */
.stat-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
.sstat{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:13px 15px;cursor:pointer;transition:box-shadow .15s;}
.sstat:hover,.sstat.active-filter{box-shadow:0 0 0 2px var(--green-light);border-color:var(--green);}
.sstat-val{font-size:22px;font-weight:700;line-height:1.1;}
.sstat-lbl{font-size:11px;color:var(--muted);margin-top:2px;}
.sstat-sub{font-size:10.5px;margin-top:4px;}

/* VIEW SWITCHER + FILTERS */
.controls{display:flex;align-items:center;gap:10px;background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;}
.search-bar{flex:1;display:flex;align-items:center;gap:7px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 11px;}
.search-bar input{border:none;background:transparent;outline:none;width:100%;font-size:12px;font-family:inherit;color:var(--text);}
.fsel{display:flex;align-items:center;gap:5px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 10px;font-size:12px;white-space:nowrap;}
.fsel select{border:none;background:transparent;outline:none;font-size:12px;font-family:inherit;color:var(--text);cursor:pointer;}
.view-toggle{display:flex;gap:2px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px;}
.vt{width:28px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:13px;color:var(--muted);}
.vt.active{background:var(--white);color:var(--text);box-shadow:var(--shadow);}

/* MAIN LAYOUT: calendar + list */
.events-layout{display:grid;grid-template-columns:1fr 340px;gap:14px;align-items:start;}

/* CALENDAR */
.calendar-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;}
.cal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border);}
.cal-nav{display:flex;align-items:center;gap:10px;}
.cal-nav-btn{width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;}
.cal-nav-btn:hover{background:var(--border);}
.cal-month{font-size:14px;font-weight:700;}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);}
.cal-dow{text-align:center;padding:8px 4px;font-size:10.5px;font-weight:600;color:var(--muted);}
.cal-day{min-height:72px;border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:6px 5px;cursor:pointer;transition:background .1s;position:relative;}
.cal-day:nth-child(7n){border-right:none;}
.cal-day:hover{background:#f9fafb;}
.cal-day.other-month{background:var(--bg);}
.cal-day.today .cal-day-num{background:var(--green);color:white;border-radius:50%;width:22px;height:22px;display:flex;align-items:center;justify-content:center;}
.cal-day.selected{background:var(--green-light);}
.cal-day-num{font-size:12px;font-weight:600;margin-bottom:4px;width:22px;height:22px;display:flex;align-items:center;justify-content:center;}
.cal-day.other-month .cal-day-num{color:var(--light);}
.cal-event-dot{font-size:10px;padding:1px 5px;border-radius:3px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;font-weight:500;line-height:1.4;}
.cal-more{font-size:9.5px;color:var(--muted);padding-left:2px;cursor:pointer;}

/* EVENT LIST / CARDS */
.event-list{display:flex;flex-direction:column;gap:0;}
.event-section-label{font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;padding:10px 0 6px;}
.event-item{display:flex;gap:12px;padding:12px 14px;background:var(--white);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:8px;cursor:pointer;transition:box-shadow .15s;}
.event-item:hover{box-shadow:0 4px 12px rgba(0,0,0,.08);border-color:var(--green-mid);}
.event-date-box{flex-shrink:0;width:46px;text-align:center;border-radius:var(--radius-sm);overflow:hidden;}
.edb-month{font-size:9.5px;font-weight:700;text-transform:uppercase;color:white;padding:3px 0;}
.edb-day{font-size:22px;font-weight:800;padding:4px 0;background:var(--white);line-height:1;}
.event-body{flex:1;min-width:0;}
.ev-title{font-size:13px;font-weight:700;margin-bottom:3px;}
.ev-meta{font-size:11px;color:var(--muted);display:flex;flex-wrap:wrap;gap:8px;margin-bottom:6px;}
.ev-meta span{display:flex;align-items:center;gap:3px;}
.ev-desc{font-size:11.5px;color:var(--muted);line-height:1.5;}
.ev-tag{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:600;padding:2px 8px;border-radius:20px;}
.ev-footer{display:flex;align-items:center;justify-content:space-between;margin-top:8px;}
.ev-attendees{font-size:11px;color:var(--muted);}
.ev-status{font-size:10px;font-weight:700;padding:2px 8px;border-radius:20px;}
.ev-status.upcoming{background:var(--blue-light);color:var(--blue);}
.ev-status.today{background:var(--green-light);color:var(--green);}
.ev-status.past{background:var(--bg);color:var(--muted);}
.ev-status.cancelled{background:var(--red-light);color:var(--red);}

/* RIGHT SIDEBAR: upcoming + mini agenda */
.right-col{display:flex;flex-direction:column;gap:12px;}
.mini-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;}
.mini-card-hdr{padding:12px 14px;border-bottom:1px solid var(--border);font-size:12.5px;font-weight:600;display:flex;align-items:center;justify-content:space-between;}
.view-link{font-size:11px;color:var(--green);font-weight:500;cursor:pointer;}
.agenda-item{display:flex;align-items:flex-start;gap:10px;padding:10px 14px;border-bottom:1px solid var(--border);}
.agenda-item:last-child{border-bottom:none;}
.agenda-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;margin-top:3px;}
.agenda-time{font-size:11px;font-weight:600;color:var(--muted);width:52px;flex-shrink:0;}
.agenda-title{font-size:12px;font-weight:600;}
.agenda-loc{font-size:10.5px;color:var(--muted);margin-top:1px;}
.cat-list{padding:10px 14px;display:flex;flex-direction:column;gap:6px;}
.cat-row{display:flex;align-items:center;justify-content:space-between;font-size:12px;}
.cat-dot-wrap{display:flex;align-items:center;gap:7px;}
.cat-dot{width:10px;height:10px;border-radius:50%;}
.cat-count{font-weight:700;}

/* DETAIL OVERLAY */
.detail-overlay{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100;display:none;}
.detail-overlay.open{display:flex;align-items:flex-start;justify-content:flex-end;}
.detail-panel{width:440px;height:100%;background:var(--white);box-shadow:-4px 0 24px rgba(0,0,0,.12);display:flex;flex-direction:column;overflow:hidden;}
.dp-hdr{padding:16px 18px;border-bottom:1px solid var(--border);flex-shrink:0;}
.dp-hdr-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;}
.dp-close{width:28px;height:28px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;}
.dp-title{font-size:16px;font-weight:700;}
.dp-body{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:16px;}
.dp-sect{font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;}
.dp-row{display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px;}
.dp-row:last-child{border-bottom:none;}
.dp-key{color:var(--muted);}.dp-val{font-weight:500;text-align:right;}
.dp-desc-box{background:var(--bg);border-radius:var(--radius-sm);padding:10px 12px;font-size:12px;line-height:1.6;}
.checklist{display:flex;flex-direction:column;gap:6px;}
.cl-item{display:flex;align-items:center;gap:8px;font-size:12px;padding:6px 10px;background:var(--bg);border-radius:var(--radius-sm);cursor:pointer;}
.cl-check{width:16px;height:16px;border-radius:4px;border:2px solid var(--border);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:9px;}
.cl-item.done .cl-check{background:var(--green);border-color:var(--green);color:white;}
.cl-item.done span{text-decoration:line-through;color:var(--muted);}
.dp-footer{padding:14px 18px;border-top:1px solid var(--border);display:flex;gap:8px;flex-shrink:0;}
.dp-footer .btn{flex:1;justify-content:center;}
</style>
</head>
<body>

<!-- SIDEBAR -->
<aside class="sidebar">
  <div class="sidebar-logo">
    <div class="logo-icon">πŸ›οΈ</div>
    <div class="logo-text"><strong>ConstituencyOS</strong><small>Everything in your constituency,<br>in one place.</small></div>
  </div>
  <div class="sidebar-profile">
    <div class="s-avatar">DM<div class="dot"></div></div>
    <div><div class="profile-name">Hon. David Mwangi, MP</div><div class="profile-sub">Embakasi South</div></div>
  </div>
  <nav class="sidebar-nav">
    <div class="nav-item" onclick="location.href='index.html'"><span class="nav-icon">🏠</span>Dashboard</div>
    <div class="nav-item" onclick="location.href='constituents.html'"><span class="nav-icon">πŸ‘₯</span>Constituents</div>
    <div class="nav-item" onclick="location.href='complaints.html'"><span class="nav-icon">πŸ“‹</span>Complaints<span class="nav-badge">9</span></div>
    <div class="nav-item" onclick="location.href='projects.html'"><span class="nav-icon">πŸ“</span>Projects</div>
    <div class="nav-item" onclick="location.href='bursaries.html'"><span class="nav-icon">πŸŽ“</span>Bursaries</div>
    <div class="nav-item" onclick="location.href='events.html'"><span class="nav-icon">πŸ“…</span>Events</div>
    <div class="nav-item" onclick="location.href='social_protection.html'"><span class="nav-icon">πŸ›‘οΈ</span>Social Protection</div>
    <div class="nav-item" onclick="location.href='ward_management.html'"><span class="nav-icon">🏘️</span>Ward Management</div>
    <div class="nav-item" onclick="location.href='finance.html'"><span class="nav-icon">πŸ’°</span>Finance</div>
    <div class="nav-item" onclick="location.href='documents.html'"><span class="nav-icon">πŸ“„</span>Documents</div>
    <div class="nav-item" onclick="location.href='staff_management.html'"><span class="nav-icon">πŸ‘€</span>Staff Management</div>
    <div class="nav-item" onclick="location.href='reports_analytics.html'"><span class="nav-icon">πŸ“Š</span>Reports & Analytics</div>
    <div class="nav-item active"><span class="nav-icon">πŸ€–</span>AI Assistant<span class="nav-new">New</span></div>
    <div class="nav-item" onclick="location.href='settings.html'"><span class="nav-icon">βš™οΈ</span>Settings</div>
    <div class="nav-item" onclick="location.href='public_portal.html'"><span class="nav-icon">🌐</span>Public Portal</div>
  </nav>
  <div class="sidebar-footer">
    <div class="help-row"><span>❓</span><div><div class="help-label">Need Help?</div><div class="help-sub">Contact Support</div></div></div>
  </div>
</aside>

<!-- RIGHT PANEL -->
<div class="right-panel">
  <header class="topbar">
    <span class="menu-btn">☰</span>
    <div class="const-selector"><span style="font-size:13px">πŸ›οΈ</span>Embakasi South Constituency<span style="font-size:10px;color:var(--muted)">β–Ό</span></div>
    <div class="search-top"><span>πŸ”</span><input type="text" placeholder="Search for anything…"><kbd>⌘K</kbd></div>
    <div class="topbar-right">
      <div class="icon-btn">πŸ””<div class="bdg">8</div></div>
      <div class="icon-btn">βœ‰οΈ<div class="bdg grn">3</div></div>
      <div class="user-pill"><div class="s-avatar" style="width:26px;height:26px;font-size:10px">DM</div>Hon. David Mwangi<span style="font-size:10px;color:var(--muted)">β–Ό</span></div>
    </div>
  </header>

  <main class="content">

    <div class="page-header">
      <div>
        <div class="page-title">Events</div>
        <div class="page-sub">Schedule and manage all constituency events, barazas, and engagements</div>
      </div>
      <div style="display:flex;gap:8px;">
        <button class="btn btn-ghost">⬇ Export</button>
        <button class="btn btn-primary" onclick="openNewEvent()">οΌ‹ New Event</button>
      </div>
    </div>

    <!-- Stat Strip -->
    <div class="stat-strip">
      <div class="sstat active-filter" onclick="filterStatus('all',this)">
        <div class="sstat-val" id="cnt-all">0</div>
        <div class="sstat-lbl">Total Events</div>
        <div class="sstat-sub" style="color:var(--muted)">This month</div>
      </div>
      <div class="sstat" onclick="filterStatus('today',this)">
        <div class="sstat-val" style="color:var(--green)" id="cnt-today">0</div>
        <div class="sstat-lbl">Today</div>
        <div class="sstat-sub" style="color:var(--green)">Happening now</div>
      </div>
      <div class="sstat" onclick="filterStatus('upcoming',this)">
        <div class="sstat-val" style="color:var(--blue)" id="cnt-upcoming">0</div>
        <div class="sstat-lbl">Upcoming</div>
        <div class="sstat-sub" style="color:var(--muted)">Next 30 days</div>
      </div>
      <div class="sstat" onclick="filterStatus('past',this)">
        <div class="sstat-val" style="color:var(--muted)" id="cnt-past">0</div>
        <div class="sstat-lbl">Past Events</div>
        <div class="sstat-sub" style="color:var(--muted)">This month</div>
      </div>
    </div>

    <!-- Controls -->
    <div class="controls">
      <div class="search-bar"><span>πŸ”</span><input type="text" id="searchInput" placeholder="Search events…" oninput="applyFilters()"></div>
      <div class="fsel">πŸ“‚ <select id="catFilter" onchange="applyFilters()">
        <option value="">All Categories</option>
        <option>Baraza</option><option>Community Meeting</option><option>Fundraiser</option>
        <option>School Event</option><option>Health Camp</option><option>Sports</option>
        <option>Church / Religious</option><option>Government</option>
      </select></div>
      <div class="fsel">🏘️ <select id="wardFilter" onchange="applyFilters()">
        <option value="">All Wards</option>
        <option>Pipeline Ward</option><option>Imara Daima</option><option>Mabatini Ward</option>
        <option>Umoja Ward</option><option>Kwa Njenga Ward</option><option>Mihango Ward</option>
      </select></div>
      <div class="view-toggle">
        <div class="vt active" id="vt-split" onclick="setView('split')" title="Calendar + List">πŸ“…</div>
        <div class="vt" id="vt-list" onclick="setView('list')" title="List only">☰</div>
      </div>
    </div>

    <!-- Main Layout -->
    <div class="events-layout" id="eventsLayout">

      <!-- LEFT: Calendar + Event List -->
      <div style="display:flex;flex-direction:column;gap:14px;">

        <!-- Calendar -->
        <div class="calendar-card">
          <div class="cal-header">
            <div class="cal-nav">
              <div class="cal-nav-btn" onclick="changeMonth(-1)">β€Ή</div>
              <div class="cal-month" id="calMonthLabel"></div>
              <div class="cal-nav-btn" onclick="changeMonth(1)">β€Ί</div>
            </div>
            <button class="btn btn-ghost" style="font-size:11px;padding:5px 10px;" onclick="goToday()">Today</button>
          </div>
          <div class="cal-grid" id="calDows"></div>
          <div class="cal-grid" id="calGrid"></div>
        </div>

        <!-- Event list below calendar -->
        <div>
          <div style="font-size:14px;font-weight:700;margin-bottom:10px;" id="listLabel">All Events</div>
          <div id="eventList"></div>
        </div>
      </div>

      <!-- RIGHT: Agenda + Categories -->
      <div class="right-col">

        <!-- Today's agenda -->
        <div class="mini-card">
          <div class="mini-card-hdr">
            Today's Schedule
            <span class="view-link">20 May 2024</span>
          </div>
          <div id="todayAgenda"></div>
        </div>

        <!-- Categories breakdown -->
        <div class="mini-card">
          <div class="mini-card-hdr">Events by Category</div>
          <div class="cat-list" id="catBreakdown"></div>
        </div>

        <!-- Quick add -->
        <div class="mini-card">
          <div class="mini-card-hdr">Quick Add Event</div>
          <div style="padding:12px 14px;display:flex;flex-direction:column;gap:8px;">
            <input id="qa-title" type="text" placeholder="Event title…" style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;font-size:12px;font-family:inherit;outline:none;width:100%;" onfocus="this.style.borderColor='var(--green)'" onblur="this.style.borderColor='var(--border)'">
            <input id="qa-date" type="date" style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;font-size:12px;font-family:inherit;outline:none;width:100%;" onfocus="this.style.borderColor='var(--green)'" onblur="this.style.borderColor='var(--border)'">
            <input id="qa-time" type="time" style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;font-size:12px;font-family:inherit;outline:none;width:100%;" onfocus="this.style.borderColor='var(--green)'" onblur="this.style.borderColor='var(--border)'">
            <select id="qa-cat" style="border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;font-size:12px;font-family:inherit;outline:none;width:100%;">
              <option>Baraza</option><option>Community Meeting</option><option>Fundraiser</option>
              <option>School Event</option><option>Health Camp</option><option>Sports</option>
              <option>Church / Religious</option><option>Government</option>
            </select>
            <button class="btn btn-primary" style="width:100%;justify-content:center;" onclick="quickAdd()">οΌ‹ Add Event</button>
          </div>
        </div>

      </div>
    </div>

  </main>
</div>

<!-- DETAIL PANEL -->
<div class="detail-overlay" id="detailOverlay" onclick="closeDetail(event)">
  <div class="detail-panel">
    <div class="dp-hdr">
      <div class="dp-hdr-top">
        <div id="dp-tag"></div>
        <div class="dp-close" onclick="closeDetailDirect()">βœ•</div>
      </div>
      <div class="dp-title" id="dp-title"></div>
    </div>
    <div class="dp-body">
      <div>
        <div class="dp-sect">Event Details</div>
        <div class="dp-row"><span class="dp-key">Date</span><span class="dp-val" id="dp-date"></span></div>
        <div class="dp-row"><span class="dp-key">Time</span><span class="dp-val" id="dp-time"></span></div>
        <div class="dp-row"><span class="dp-key">Venue</span><span class="dp-val" id="dp-venue"></span></div>
        <div class="dp-row"><span class="dp-key">Ward</span><span class="dp-val" id="dp-ward"></span></div>
        <div class="dp-row"><span class="dp-key">Category</span><span class="dp-val" id="dp-cat"></span></div>
        <div class="dp-row"><span class="dp-key">Expected Attendance</span><span class="dp-val" id="dp-attendance"></span></div>
        <div class="dp-row"><span class="dp-key">Organiser</span><span class="dp-val" id="dp-organiser"></span></div>
        <div class="dp-row"><span class="dp-key">Status</span><span class="dp-val" id="dp-status"></span></div>
      </div>
      <div>
        <div class="dp-sect">Description</div>
        <div class="dp-desc-box" id="dp-desc"></div>
      </div>
      <div>
        <div class="dp-sect">Preparation Checklist</div>
        <div class="checklist" id="dp-checklist"></div>
      </div>
    </div>
    <div class="dp-footer">
      <button class="btn btn-ghost" style="flex:1;justify-content:center;" onclick="closeDetailDirect()">Close</button>
      <button class="btn btn-ghost" style="flex:1;justify-content:center;" id="dp-cancel-btn">🚫 Cancel Event</button>
      <button class="btn btn-primary" style="flex:1;justify-content:center;" id="dp-edit-btn">✏️ Edit</button>
    </div>
  </div>
</div>

<script>
const CAT_COLORS = {
  'Baraza':'#1a7a4a','Community Meeting':'#2563eb','Fundraiser':'#d97706',
  'School Event':'#7c3aed','Health Camp':'#dc2626','Sports':'#0891b2',
  'Church / Religious':'#be185d','Government':'#374151'
};
const CAT_BG = {
  'Baraza':'#e8f5ee','Community Meeting':'#eff6ff','Fundraiser':'#fffbeb',
  'School Event':'#f5f3ff','Health Camp':'#fdecea','Sports':'#ecfeff',
  'Church / Religious':'#fdf2f8','Government':'#f3f4f6'
};
const CAT_ICONS = {
  'Baraza':'πŸ›οΈ','Community Meeting':'πŸ‘₯','Fundraiser':'πŸ’°',
  'School Event':'🏫','Health Camp':'πŸ₯','Sports':'⚽',
  'Church / Religious':'β›ͺ','Government':'🏒'
};

// Today = 20 May 2024
const TODAY = new Date(2024, 4, 20);

const EVENTS = [
  {id:'EVT-001',title:'Constituency Staff Meeting',date:'2024-05-20',time:'8:00 AM',venue:'Parliamentary Office, Nairobi',ward:'All Wards',category:'Government',status:'today',attendance:30,organiser:'Office of Hon. David Mwangi',desc:'Monthly staff briefing covering project updates, complaints resolution progress, and upcoming constituency engagements.',checklist:[{task:'Prepare agenda',done:true},{task:'Send staff invites',done:true},{task:'Print project reports',done:true},{task:'Book conference room',done:true}]},
  {id:'EVT-002',title:'School Opening – St. Bakhita Primary',date:'2024-05-20',time:'10:00 AM',venue:'Umoja II Primary School',ward:'Umoja Ward',category:'School Event',status:'today',attendance:500,organiser:'School Board & MP Office',desc:'Official opening of the newly constructed school block at St. Bakhita Primary. The MP will officially open 4 new classrooms funded through the CDF.',checklist:[{task:'Ribbon-cutting ceremony prepared',done:true},{task:'Students in formation',done:true},{task:'Media invited',done:true},{task:'Speech prepared',done:true}]},
  {id:'EVT-003',title:'Baraza – Pipeline Ward',date:'2024-05-20',time:'1:00 PM',venue:'Pipeline Ward Office',ward:'Pipeline Ward',category:'Baraza',status:'today',attendance:200,organiser:'Ward Administrator',desc:'Public baraza for Pipeline Ward residents to raise issues directly with the MP and ward officials. Key agenda items include water supply, road maintenance, and bursary disbursements.',checklist:[{task:'Venue set up',done:true},{task:'Public announcement via PA',done:true},{task:'Register of attendees',done:false},{task:'Minutes taker assigned',done:false}]},
  {id:'EVT-004',title:'Fundraiser – Youth Group',date:'2024-05-20',time:'4:00 PM',venue:'Mihango Social Hall',ward:'Mihango Ward',category:'Fundraiser',status:'today',attendance:150,organiser:'Mihango Youth Empowerment Group',desc:'Fundraising harambee for the Mihango Youth Empowerment Group to raise funds for a youth centre and start-up capital for youth enterprises in the ward.',checklist:[{task:'Invite dignitaries',done:true},{task:'Entertainment booked',done:true},{task:'Pledge cards printed',done:false},{task:'PA system set up',done:false}]},
  {id:'EVT-005',title:'Church Service – ACK Imara',date:'2024-05-20',time:'6:30 PM',venue:'ACK Imara Daima Church',ward:'Imara Daima',category:'Church / Religious',status:'today',attendance:300,organiser:'ACK Imara Daima',desc:'Special thanksgiving service for the completion of Imara Daima Dispensary. The MP will be the guest of honour.',checklist:[{task:'Confirm attendance with church',done:true},{task:'Prepare remarks',done:true}]},
  {id:'EVT-006',title:'Youth Empowerment Forum',date:'2024-05-22',time:'9:00 AM',venue:'Umoja Community Hall',ward:'Umoja Ward',category:'Community Meeting',status:'upcoming',attendance:400,organiser:'MP Office & NYS',desc:'Full-day youth empowerment forum covering entrepreneurship, skills training opportunities, and government youth programmes. Guest speakers from KUSCCO, NYS, and Ajira Digital.',checklist:[{task:'Book venue',done:true},{task:'Confirm speakers',done:true},{task:'Print brochures',done:false},{task:'Coordinate with NYS',done:false},{task:'Set up registration desk',done:false}]},
  {id:'EVT-007',title:'Health Camp – Free Medical Services',date:'2024-05-25',time:'8:00 AM',venue:'Kwa Njenga Primary School Grounds',ward:'Kwa Njenga Ward',category:'Health Camp',status:'upcoming',attendance:800,organiser:'MP Office & MOH',desc:'Free medical camp offering general consultation, eye testing, dental checks, HIV testing, immunisation, and blood pressure screening for Kwa Njenga residents.',checklist:[{task:'Coordinate with MOH',done:true},{task:'Source medical supplies',done:true},{task:'Recruit volunteer doctors',done:true},{task:'Community announcements',done:false},{task:'Tents and equipment',done:false}]},
  {id:'EVT-008',title:'Mabatini Ward Baraza',date:'2024-05-28',time:'2:00 PM',venue:'Mabatini Social Hall',ward:'Mabatini Ward',category:'Baraza',status:'upcoming',attendance:250,organiser:'Ward Administrator',desc:'Quarterly baraza for Mabatini Ward. Agenda includes health centre upgrade update, solar street lights feedback, bursary payments, and drainage works.',checklist:[{task:'Send public notice',done:false},{task:'Prepare project updates',done:false},{task:'Book venue',done:true}]},
  {id:'EVT-009',title:'Inter-Ward Football Tournament',date:'2024-06-01',time:'9:00 AM',venue:'Umoja Sports Ground',ward:'Umoja Ward',category:'Sports',status:'upcoming',attendance:1000,organiser:'Embakasi South Sports Committee',desc:'Annual inter-ward football tournament featuring teams from all 6 wards. Trophy and cash prizes for winners. Proceeds go to the youth sports fund.',checklist:[{task:'Register teams',done:true},{task:'Book referee',done:false},{task:'Source trophies & medals',done:false},{task:'Arrange first aid',done:false}]},
  {id:'EVT-010',title:'CDF Accountability Forum',date:'2024-06-05',time:'10:00 AM',venue:'Mihango Community Centre',ward:'Mihango Ward',category:'Government',status:'upcoming',attendance:300,organiser:'MP Office',desc:'Public forum to account for CDF expenditure in FY 2023/2024. Project updates, budget statements, and Q&A with residents.',checklist:[{task:'Prepare financial statements',done:false},{task:'Print project photo reports',done:false},{task:'Notify ward reps',done:false},{task:'Book venue',done:true}]},
  {id:'EVT-011',title:'School Prize Giving – Pipeline Primary',date:'2024-06-08',time:'10:00 AM',venue:'Kiandutu Primary School',ward:'Pipeline Ward',category:'School Event',status:'upcoming',attendance:600,organiser:'Kiandutu Primary School',desc:'Annual prize giving day and talent show for Kiandutu Primary School. MP to give prizes to top students and officially launch the new library.',checklist:[{task:'Confirm MP attendance',done:true},{task:'Prepare speech',done:false},{task:'Source prizes',done:false}]},
  {id:'EVT-012',title:'Imara Daima Dispensary Handover',date:'2024-06-12',time:'11:00 AM',venue:'Imara Daima Dispensary',ward:'Imara Daima',category:'Government',status:'upcoming',attendance:200,organiser:'MP Office & MOH',desc:'Official handover ceremony of the newly completed Imara Daima Dispensary to the Ministry of Health for operation.',checklist:[{task:'Invite County Governor',done:false},{task:'MOH acceptance documents',done:false},{task:'Media invitation',done:false},{task:'Prepare remarks',done:false}]},
  {id:'EVT-013',title:'Kwa Njenga Baraza',date:'2024-05-15',time:'3:00 PM',venue:'Kware Community Grounds',ward:'Kwa Njenga Ward',category:'Baraza',status:'past',attendance:180,organiser:'Ward Administrator',desc:'Ward baraza covering drainage works update, illegal dumping at the river bank, and market stall allocation.',checklist:[{task:'All tasks completed',done:true}]},
  {id:'EVT-014',title:'Bursary Awards Ceremony',date:'2024-05-10',time:'9:00 AM',venue:'Mihango Primary School Hall',ward:'All Wards',category:'School Event',status:'past',attendance:450,organiser:'MP Office & Education Dept',desc:'Bursary cheque presentation ceremony for FY 2023/2024 beneficiaries across all wards. 1,892 students received awards.',checklist:[{task:'All tasks completed',done:true}]},
  {id:'EVT-015',title:'Road Project Launch – Mihango',date:'2024-05-08',time:'10:00 AM',venue:'Mihango Road Junction',ward:'Mihango Ward',category:'Government',status:'past',attendance:120,organiser:'MP Office & Roads Dept',desc:'Official groundbreaking for the Mihango Road rehabilitation project. Tarmacking of 6.5km of road funded through CDF and national government.',checklist:[{task:'All tasks completed',done:true}]},
];

let filtered = [...EVENTS];
let activeStatus = 'all';
let currentMonth = 4; // May (0-indexed)
let currentYear = 2024;
let currentEvent = null;
let currentView = 'split';

function catTag(cat, status){
  const color = CAT_COLORS[cat]||'#374151';
  const bg = CAT_BG[cat]||'#f3f4f6';
  return `<span class="ev-tag" style="background:${bg};color:${color}">${CAT_ICONS[cat]||'πŸ“…'} ${cat}</span>`;
}
function statusTag(s){
  const map = {today:'today',upcoming:'upcoming',past:'past',cancelled:'cancelled'};
  const lbl = {today:'Today',upcoming:'Upcoming',past:'Past',cancelled:'Cancelled'};
  return `<span class="ev-status ${map[s]||'upcoming'}">${lbl[s]||s}</span>`;
}

function applyFilters(){
  const q = document.getElementById('searchInput').value.toLowerCase();
  const cat = document.getElementById('catFilter').value;
  const ward = document.getElementById('wardFilter').value;
  filtered = EVENTS.filter(e=>{
    if(activeStatus!=='all' && e.status!==activeStatus) return false;
    if(cat && e.category!==cat) return false;
    if(ward && e.ward!==ward && e.ward!=='All Wards') return false;
    if(q && !`${e.title} ${e.venue} ${e.ward} ${e.organiser}`.toLowerCase().includes(q)) return false;
    return true;
  });
  renderEventList();
  renderCalendar();
}

function filterStatus(s, el){
  activeStatus = s;
  document.querySelectorAll('.sstat').forEach(x=>x.classList.remove('active-filter'));
  el.classList.add('active-filter');
  applyFilters();
}

function updateCounts(){
  document.getElementById('cnt-all').textContent = EVENTS.length;
  document.getElementById('cnt-today').textContent = EVENTS.filter(e=>e.status==='today').length;
  document.getElementById('cnt-upcoming').textContent = EVENTS.filter(e=>e.status==='upcoming').length;
  document.getElementById('cnt-past').textContent = EVENTS.filter(e=>e.status==='past').length;
}

function renderEventList(){
  const container = document.getElementById('eventList');
  const label = document.getElementById('listLabel');

  const groups = {};
  filtered.forEach(e=>{
    const g = e.status==='today'?'Today':e.status==='upcoming'?'Upcoming':e.status==='past'?'Past Events':'Cancelled';
    if(!groups[g]) groups[g]=[];
    groups[g].push(e);
  });

  const order = ['Today','Upcoming','Past Events','Cancelled'];
  let html = '';
  order.forEach(g=>{
    if(!groups[g]) return;
    html += `<div class="event-section-label">${g}</div>`;
    html += groups[g].map(e=>{
      const d = new Date(e.date);
      const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
      const color = CAT_COLORS[e.category]||'#374151';
      return `
      <div class="event-item" onclick="openDetail('${e.id}')">
        <div class="event-date-box">
          <div class="edb-month" style="background:${color}">${months[d.getMonth()]}</div>
          <div class="edb-day" style="color:${color}">${d.getDate()}</div>
        </div>
        <div class="event-body">
          <div class="ev-title">${e.title}</div>
          <div class="ev-meta">
            <span>πŸ• ${e.time}</span>
            <span>πŸ“ ${e.venue}</span>
            <span>🏘️ ${e.ward}</span>
          </div>
          <div class="ev-footer">
            ${catTag(e.category)}
            <div style="display:flex;align-items:center;gap:8px;">
              <span class="ev-attendees">πŸ‘₯ ${e.attendance.toLocaleString()} expected</span>
              ${statusTag(e.status)}
            </div>
          </div>
        </div>
      </div>`;
    }).join('');
  });

  if(!html) html = '<div style="text-align:center;padding:40px;color:var(--muted)"><div style="font-size:32px;margin-bottom:8px">πŸ“…</div><div style="font-weight:600;color:var(--text)">No events found</div><div style="font-size:12px;margin-top:4px">Try adjusting your filters</div></div>';
  container.innerHTML = html;
  label.textContent = filtered.length + ' Event' + (filtered.length!==1?'s':'') + (activeStatus!=='all'?' Β· '+activeStatus:'');
}

function renderCalendar(){
  const firstDay = new Date(currentYear, currentMonth, 1);
  const lastDay = new Date(currentYear, currentMonth+1, 0);
  const months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
  document.getElementById('calMonthLabel').textContent = months[currentMonth]+' '+currentYear;

  // Day of week headers
  const dowContainer = document.getElementById('calDows');
  const dows = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
  dowContainer.innerHTML = dows.map(d=>`<div class="cal-dow">${d}</div>`).join('');

  // Build grid
  const grid = document.getElementById('calGrid');
  let cells = '';
  let startDow = firstDay.getDay();

  // Previous month fill
  const prevLast = new Date(currentYear, currentMonth, 0).getDate();
  for(let i=startDow-1; i>=0; i--){
    cells += `<div class="cal-day other-month"><div class="cal-day-num">${prevLast-i}</div></div>`;
  }

  // Current month
  for(let d=1; d<=lastDay.getDate(); d++){
    const dateStr = `${currentYear}-${String(currentMonth+1).padStart(2,'0')}-${String(d).padStart(2,'0')}`;
    const dayEvents = EVENTS.filter(e=>e.date===dateStr);
    const isToday = d===20 && currentMonth===4 && currentYear===2024;
    cells += `<div class="cal-day${isToday?' today':''}" onclick="selectDay('${dateStr}')">
      <div class="cal-day-num">${d}</div>
      ${dayEvents.slice(0,2).map(e=>`<div class="cal-event-dot" style="background:${CAT_BG[e.category]};color:${CAT_COLORS[e.category]};cursor:pointer" onclick="event.stopPropagation();openDetail('${e.id}')">${CAT_ICONS[e.category]} ${e.title}</div>`).join('')}
      ${dayEvents.length>2?`<div class="cal-more">+${dayEvents.length-2} more</div>`:''}
    </div>`;
  }

  // Next month fill
  const totalCells = startDow + lastDay.getDate();
  const remainder = totalCells % 7;
  if(remainder>0){
    for(let d=1; d<=7-remainder; d++){
      cells += `<div class="cal-day other-month"><div class="cal-day-num">${d}</div></div>`;
    }
  }

  grid.innerHTML = cells;
}

function selectDay(dateStr){
  const dayEvents = EVENTS.filter(e=>e.date===dateStr);
  if(dayEvents.length===1){ openDetail(dayEvents[0].id); return; }
  if(dayEvents.length>1){
    filtered = dayEvents;
    renderEventList();
    document.getElementById('listLabel').textContent = `Events on ${dateStr}`;
  }
}

function changeMonth(dir){
  currentMonth += dir;
  if(currentMonth>11){currentMonth=0;currentYear++;}
  if(currentMonth<0){currentMonth=11;currentYear--;}
  renderCalendar();
}

function goToday(){
  currentMonth=4; currentYear=2024; renderCalendar();
}

function renderTodayAgenda(){
  const todayEvts = EVENTS.filter(e=>e.status==='today').sort((a,b)=>a.time.localeCompare(b.time));
  document.getElementById('todayAgenda').innerHTML = todayEvts.length ? todayEvts.map(e=>`
    <div class="agenda-item" onclick="openDetail('${e.id}')" style="cursor:pointer">
      <div class="agenda-time">${e.time.replace(':00','')}</div>
      <div class="agenda-dot" style="background:${CAT_COLORS[e.category]}"></div>
      <div>
        <div class="agenda-title">${e.title}</div>
        <div class="agenda-loc">πŸ“ ${e.venue.split(',')[0]}</div>
      </div>
    </div>
  `).join('') : '<div style="padding:14px;font-size:12px;color:var(--muted);text-align:center">No events today</div>';
}

function renderCatBreakdown(){
  const counts = {};
  EVENTS.forEach(e=>{ counts[e.category]=(counts[e.category]||0)+1; });
  const sorted = Object.entries(counts).sort((a,b)=>b[1]-a[1]);
  document.getElementById('catBreakdown').innerHTML = sorted.map(([cat,cnt])=>`
    <div class="cat-row">
      <div class="cat-dot-wrap">
        <div class="cat-dot" style="background:${CAT_COLORS[cat]}"></div>
        <span>${CAT_ICONS[cat]} ${cat}</span>
      </div>
      <span class="cat-count">${cnt}</span>
    </div>
  `).join('');
}

function openDetail(id){
  currentEvent = EVENTS.find(e=>e.id===id);
  const e = currentEvent;
  const color = CAT_COLORS[e.category];
  const bg = CAT_BG[e.category];
  document.getElementById('dp-tag').innerHTML = catTag(e.category)+' '+statusTag(e.status);
  document.getElementById('dp-title').textContent = e.title;
  document.getElementById('dp-date').textContent = new Date(e.date).toLocaleDateString('en-GB',{weekday:'long',day:'numeric',month:'long',year:'numeric'});
  document.getElementById('dp-time').textContent = e.time;
  document.getElementById('dp-venue').textContent = e.venue;
  document.getElementById('dp-ward').textContent = e.ward;
  document.getElementById('dp-cat').textContent = e.category;
  document.getElementById('dp-attendance').textContent = e.attendance.toLocaleString()+' people';
  document.getElementById('dp-organiser').textContent = e.organiser;
  document.getElementById('dp-status').innerHTML = statusTag(e.status);
  document.getElementById('dp-desc').textContent = e.desc;
  document.getElementById('dp-checklist').innerHTML = e.checklist.map((c,i)=>`
    <div class="cl-item ${c.done?'done':''}" onclick="toggleCheck('${e.id}',${i})">
      <div class="cl-check">${c.done?'βœ“':''}</div>
      <span>${c.task}</span>
    </div>
  `).join('');
  document.getElementById('detailOverlay').classList.add('open');
}

function toggleCheck(eventId, idx){
  const ev = EVENTS.find(e=>e.id===eventId);
  if(ev){ ev.checklist[idx].done = !ev.checklist[idx].done; openDetail(eventId); }
}

function closeDetail(e){ if(e.target===document.getElementById('detailOverlay')) closeDetailDirect(); }
function closeDetailDirect(){ document.getElementById('detailOverlay').classList.remove('open'); }

function setView(v){
  currentView = v;
  document.getElementById('vt-split').classList.toggle('active', v==='split');
  document.getElementById('vt-list').classList.toggle('active', v==='list');
  const layout = document.getElementById('eventsLayout');
  if(v==='list'){
    layout.style.gridTemplateColumns = '1fr';
    layout.querySelector('.right-col').style.display = 'none';
  } else {
    layout.style.gridTemplateColumns = '1fr 340px';
    layout.querySelector('.right-col').style.display = 'flex';
  }
}

function openNewEvent(){ alert('New Event form β€” would open a full modal in the complete build.'); }

function quickAdd(){
  const title = document.getElementById('qa-title').value.trim();
  const date = document.getElementById('qa-date').value;
  const time = document.getElementById('qa-time').value;
  const cat = document.getElementById('qa-cat').value;
  if(!title||!date){ alert('Please enter a title and date.'); return; }
  const now = new Date(date);
  const status = now < TODAY ? 'past' : now.toDateString()===TODAY.toDateString() ? 'today' : 'upcoming';
  const fmt = time ? (parseInt(time)>=12?(parseInt(time)-12||12)+':'+time.split(':')[1]+' PM':parseInt(time)+':'+time.split(':')[1]+' AM') : '9:00 AM';
  EVENTS.unshift({id:'EVT-'+String(Date.now()).slice(-4),title,date,time:fmt,venue:'TBD',ward:'All Wards',category:cat,status,attendance:0,organiser:'MP Office',desc:'',checklist:[]});
  document.getElementById('qa-title').value='';
  document.getElementById('qa-date').value='';
  document.getElementById('qa-time').value='';
  updateCounts(); applyFilters(); renderCalendar(); renderTodayAgenda(); renderCatBreakdown();
}

// Init
updateCounts();
renderCalendar();
renderTodayAgenda();
renderCatBreakdown();
applyFilters();
</script>
</body>
</html>

Youez - 2016 - github.com/yon3zu
LinuXploit