{"id":81,"date":"2026-04-10T20:37:37","date_gmt":"2026-04-10T20:37:37","guid":{"rendered":"https:\/\/cashchat.se\/dir\/?page_id=81"},"modified":"2026-04-23T15:17:54","modified_gmt":"2026-04-23T15:17:54","slug":"ads","status":"publish","type":"page","link":"https:\/\/cashchat.se\/dir\/ads\/","title":{"rendered":"Ads"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n  <title>Adase Ads Ltd | Fast SMM + Ad Platform<\/title>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:opsz,wght@14..32,400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\n  <style>\n    *{margin:0;padding:0;box-sizing:border-box;font-family:'Inter',sans-serif}body{background:#f5f7fb}#appMain{margin-top:30px}.container{max-width:1280px;margin:0 auto;padding:0 20px}.navbar{background:rgba(255,255,255,0.96);box-shadow:0 2px 8px rgba(0,0,0,0.03);padding:12px 0;position:sticky;top:0;z-index:100}.nav-flex{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}.logo{font-weight:800;font-size:1.5rem;background:linear-gradient(135deg,#1F3A8A,#2E5AFF);-webkit-background-clip:text;background-clip:text;color:transparent}.btn-sm{padding:6px 18px;border-radius:40px;font-weight:600;border:none;cursor:pointer;background:#f0f2f5;transition:.2s}.btn-primary{background:#2E5AFF;color:#fff}.btn-primary:hover{background:#1e44cc;transform:translateY(-1px)}.card{background:#fff;border-radius:28px;padding:24px;margin-bottom:24px;border:1px solid #eef2f9;box-shadow:0 4px 12px rgba(0,0,0,0.02)}.grid-2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px}.badge{background:#eef3ff;color:#1f3a8a;padding:4px 12px;border-radius:40px;font-size:.75rem;font-weight:600;display:inline-block}input,select,textarea{width:100%;padding:10px 14px;border-radius:20px;border:1px solid #cfdfed;margin:5px 0 12px}.flex-between{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}table{width:100%;border-collapse:collapse;display:block;overflow-x:auto}th,td{padding:10px 8px;text-align:left;border-bottom:1px solid #eef2f9}.pagination{display:flex;justify-content:center;gap:10px;margin-top:20px;flex-wrap:wrap}.pagination button{padding:5px 12px;border-radius:30px;background:#eef2f9;border:none;cursor:pointer}.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:1000;justify-content:center;align-items:center}.modal-content{background:#fff;max-width:500px;width:90%;border-radius:32px;padding:24px}.close-modal{float:right;font-size:28px;cursor:pointer}@media (max-width:700px){.nav-flex{flex-direction:column;align-items:stretch}}\n  <\/style>\n<\/head>\n<body>\n<div class=\"navbar\">\n  <div class=\"container nav-flex\">\n    <div class=\"logo\">\ud83d\udce2 Adase Serve<\/div>\n    <div id=\"globalUserArea\" class=\"auth-buttons\"><\/div>\n  <\/div>\n<\/div>\n<div class=\"container\" id=\"appMain\"><div id=\"dynamicPanel\">Loading&#8230;<\/div><\/div>\n\n<script>\n  \/\/ ---------- DATA ----------\n  let users = [], ads = [], proofs = [], platformRevenue = 0, sessions = { currentUserId: null };\n  let smmOrders = [], withdrawRequests = [], contacts = [];\n  let contactsCurrentPage = 1, contactsPerPage = 20;\n\n  \/\/ ---------- CACHED DOM ----------\n  let dynamicPanel, globalUserArea;\n\n  function loadData() {\n    const stored = (key) => localStorage.getItem(key);\n    users = JSON.parse(stored('adase_users') || '[]');\n    ads = JSON.parse(stored('adase_ads') || '[]');\n    proofs = JSON.parse(stored('adase_proofs') || '[]');\n    platformRevenue = parseFloat(stored('adase_platformRevenue') || '0');\n    smmOrders = JSON.parse(stored('adase_smm_orders') || '[]');\n    withdrawRequests = JSON.parse(stored('adase_withdraw_requests') || '[]');\n    contacts = []; \/\/ reset as requested\n    localStorage.setItem('adase_contacts', '[]');\n\n    const adminEmail = \"sales@cashchat.se\", adminPass = \"Justtrade81#\";\n    const existingAdmin = users.find(u => u.email === adminEmail && u.role === 'admin');\n    if (!existingAdmin) {\n      users = users.filter(u => u.role !== 'admin');\n      users.push({ id: Date.now()+1, name:\"Super Admin\", firstName:\"Super\", lastName:\"Admin\", email:adminEmail, password:adminPass, role:\"admin\", wallet:0, advertiserWallet:0, viewedAds:[], phone:\"\", sponsorCode:\"\", country:\"\", gender:\"\", ageGroup:\"\", walletStatus:\"Active\", accountStatus:\"active\" });\n    } else existingAdmin.password = adminPass;\n\n    users = users.map(u => {\n      if(!u.firstName) u.firstName = u.name?.split(' ')[0] || \"\";\n      if(!u.lastName) u.lastName = u.name?.split(' ')[1] || \"\";\n      if(u.phone === undefined) u.phone = \"\";\n      if(u.sponsorCode === undefined) u.sponsorCode = \"\";\n      if(u.country === undefined) u.country = \"\";\n      if(u.gender === undefined) u.gender = \"\";\n      if(u.ageGroup === undefined) u.ageGroup = \"\";\n      if(u.walletStatus === undefined) u.walletStatus = (u.role === 'user' ? \"Not Active\" : \"Active\");\n      if(u.accountStatus === undefined) u.accountStatus = \"active\";\n      if(!u.name && u.firstName) u.name = (u.firstName + \" \" + u.lastName).trim();\n      return u;\n    });\n\n    if(users.length === 1) {\n      users.push({ id:1001, name:\"Demo Advertiser\", firstName:\"Demo\", lastName:\"Advertiser\", email:\"adv@demo.com\", password:\"adv123\", role:\"advertiser\", wallet:0, advertiserWallet:50000, viewedAds:[], phone:\"+256700000000\", sponsorCode:\"DEMO123\", country:\"Uganda\", gender:\"Male\", ageGroup:\"25-34\", walletStatus:\"Active\", accountStatus:\"active\" });\n      users.push({ id:1002, name:\"Alice Viewer\", firstName:\"Alice\", lastName:\"Viewer\", email:\"alice@view.com\", password:\"view123\", role:\"user\", wallet:600, advertiserWallet:0, viewedAds:[], phone:\"+256712345678\", sponsorCode:\"\", country:\"Kenya\", gender:\"Female\", ageGroup:\"18-24\", walletStatus:\"Active\", accountStatus:\"active\" });\n      if(!ads.length) ads.push({ id:201, advertiserId:1001, title:\"Cool Sneakers\", type:\"video\", mediaUrl:\"https:\/\/www.w3schools.com\/html\/mov_bbb.mp4\", dailyCostUGX:2000, specialInstructions:\"Upload receipt\", activeUntil:Date.now()+86400000, isActive:true });\n    }\n    saveAll();\n  }\n\n  function saveAll() {\n    localStorage.setItem('adase_users', JSON.stringify(users));\n    localStorage.setItem('adase_ads', JSON.stringify(ads));\n    localStorage.setItem('adase_proofs', JSON.stringify(proofs));\n    localStorage.setItem('adase_platformRevenue', platformRevenue);\n    localStorage.setItem('adase_smm_orders', JSON.stringify(smmOrders));\n    localStorage.setItem('adase_withdraw_requests', JSON.stringify(withdrawRequests));\n    localStorage.setItem('adase_contacts', JSON.stringify(contacts));\n  }\n\n  function getCurrentUser() { return sessions.currentUserId ? users.find(u => u.id === sessions.currentUserId) : null; }\n\n  function updatePlatformRevenue(amount) { platformRevenue = Math.max(0, platformRevenue + amount); localStorage.setItem('adase_platformRevenue', platformRevenue); }\n\n  \/\/ ---------- RENDER HELPERS ----------\n  function renderApp() {\n    dynamicPanel = document.getElementById('dynamicPanel');\n    globalUserArea = document.getElementById('globalUserArea');\n    if(!sessions.currentUserId) renderAuthScreen();\n    else {\n      const user = getCurrentUser();\n      if(!user || ['suspended','banned'].includes(user.accountStatus)) {\n        sessions.currentUserId = null;\n        alert(\"Account suspended or banned.\");\n        renderAuthScreen();\n        return;\n      }\n      if(user.role === 'advertiser') renderAdvertiserDashboard(user);\n      else if(user.role === 'user') renderUserDashboard(user);\n      else if(user.role === 'admin') renderAdminPanel(user);\n      else renderAuthScreen();\n    }\n    renderGlobalNav();\n  }\n\n  function renderGlobalNav() {\n    if(!globalUserArea) return;\n    if(!sessions.currentUserId) {\n      globalUserArea.innerHTML = `<button class=\"btn-sm\" id=\"showLoginBtn\">Login<\/button><button class=\"btn-sm btn-primary\" id=\"showRegisterBtn\">Register<\/button>`;\n      document.getElementById('showLoginBtn')?.addEventListener('click', () => showLoginForm());\n      document.getElementById('showRegisterBtn')?.addEventListener('click', () => showRegisterForm());\n    } else {\n      const user = getCurrentUser();\n      globalUserArea.innerHTML = `<span style=\"font-weight:500;\">\ud83d\udc4b ${user.name} (${user.role})<\/span><button class=\"btn-sm\" id=\"logoutBtn\">Logout<\/button>`;\n      document.getElementById('logoutBtn')?.addEventListener('click', () => { sessions.currentUserId = null; renderApp(); });\n    }\n  }\n\n  function showLoginForm() {\n    dynamicPanel.innerHTML = `<div class=\"card\" style=\"max-width:500px;margin:auto;\"><h2>Login<\/h2><label>Email<\/label><input id=\"loginEmail\"><label>Password<\/label><input id=\"loginPass\" type=\"password\"><button class=\"btn-primary\" id=\"doLoginBtn\" style=\"width:100%\">Login<\/button><p class=\"mt-2 text-sm\">Demo: adv@demo.com \/ adv123 | alice@view.com \/ view123<\/p><\/div>`;\n    document.getElementById('doLoginBtn')?.addEventListener('click', () => {\n      const email = document.getElementById('loginEmail').value, pwd = document.getElementById('loginPass').value;\n      const user = users.find(u => u.email === email && u.password === pwd);\n      if(user && user.accountStatus === 'active') { sessions.currentUserId = user.id; renderApp(); }\n      else if(user && user.accountStatus !== 'active') alert(\"Account suspended\/banned\");\n      else alert(\"Invalid credentials\");\n    });\n  }\n\n  function showRegisterForm() { \/* identical to original - kept for brevity *\/ \n    dynamicPanel.innerHTML = `<div class=\"card\"><h2>Create Account<\/h2><select id=\"regRole\"><option value=\"user\">Viewer<\/option><option value=\"advertiser\">Advertiser<\/option><\/select><div id=\"viewerExtraFields\" style=\"display:none;\"><div style=\"display:flex;gap:16px;\"><div><label>First Name<\/label><input id=\"regFirstName\"><\/div><div><label>Last Name<\/label><input id=\"regLastName\"><\/div><\/div><label>Phone<\/label><input id=\"regPhone\"><label>Email<\/label><input id=\"regEmail\"><label>Sponsor Code<\/label><input id=\"regSponsorCode\"><div style=\"display:flex;gap:16px;\"><div><label>Country<\/label><input id=\"regCountry\"><\/div><div><label>Gender<\/label><select id=\"regGender\"><option>Male<\/option><option>Female<\/option><\/select><\/div><div><label>Age Group<\/label><select id=\"regAgeGroup\"><option>18-24<\/option><option>25-34<\/option><option>35-44<\/option><option>45+<\/option><\/select><\/div><\/div><label>Wallet Status<\/label><select id=\"regWalletStatus\"><option>Not Active<\/option><option>Active<\/option><\/select><\/div><div id=\"advertiserSimpleFields\"><label>Full Name<\/label><input id=\"regNameSimple\"><label>Email<\/label><input id=\"regEmailSimple\"><\/div><label>Password<\/label><input id=\"regPass\" type=\"password\"><button class=\"btn-primary\" id=\"doRegBtn\">Sign up<\/button><\/div>`;\n    const roleSel = document.getElementById('regRole'), viewerDiv = document.getElementById('viewerExtraFields'), advDiv = document.getElementById('advertiserSimpleFields');\n    roleSel.onchange = () => { const isViewer = roleSel.value === 'user'; viewerDiv.style.display = isViewer ? 'block' : 'none'; advDiv.style.display = isViewer ? 'none' : 'block'; };\n    roleSel.dispatchEvent(new Event('change'));\n    document.getElementById('doRegBtn').onclick = () => {\n      const role = roleSel.value, pwd = document.getElementById('regPass').value;\n      if(!pwd) return alert(\"Password required\");\n      if(role === 'user') {\n        const fname = document.getElementById('regFirstName').value.trim(), lname = document.getElementById('regLastName').value.trim(), phone = document.getElementById('regPhone').value.trim(), email = document.getElementById('regEmail').value.trim(), sponsor = document.getElementById('regSponsorCode').value.trim(), country = document.getElementById('regCountry').value.trim(), gender = document.getElementById('regGender').value, age = document.getElementById('regAgeGroup').value, walletStat = document.getElementById('regWalletStatus').value;\n        if(!fname || !lname || !phone || !email) return alert(\"All fields required\");\n        if(users.find(u=>u.email===email)) return alert(\"Email exists\");\n        users.push({ id:Date.now(), name:fname+\" \"+lname, firstName:fname, lastName:lname, email, password:pwd, role:\"user\", wallet:0, advertiserWallet:0, viewedAds:[], phone, sponsorCode:sponsor, country, gender, ageGroup:age, walletStatus:walletStat, accountStatus:\"active\" });\n        saveAll(); alert(\"Registered! Login.\"); showLoginForm();\n      } else {\n        const full = document.getElementById('regNameSimple').value.trim(), email = document.getElementById('regEmailSimple').value.trim();\n        if(!full || !email) return alert(\"Fill all fields\");\n        if(users.find(u=>u.email===email)) return alert(\"Email exists\");\n        users.push({ id:Date.now(), name:full, firstName:full.split(' ')[0], lastName:full.split(' ')[1]||\"\", email, password:pwd, role:\"advertiser\", wallet:0, advertiserWallet:0, viewedAds:[], phone:\"\", sponsorCode:\"\", country:\"\", gender:\"\", ageGroup:\"\", walletStatus:\"Active\", accountStatus:\"active\" });\n        saveAll(); alert(\"Advertiser created!\"); showLoginForm();\n      }\n    };\n  }\n\n  function renderAuthScreen() { dynamicPanel.innerHTML = `<div class=\"card text-center\"><h3>Welcome to Adase Serve<\/h3><p>Earn points by watching ads, or run campaigns.<\/p><button class=\"btn-primary\" id=\"gotoLoginBtn\">Login \/ Register<\/button><\/div>`; document.getElementById('gotoLoginBtn')?.addEventListener('click', showLoginForm); }\n\n  \/\/ ----- USER DASHBOARD (simplified, same functionality) -----\n  function renderUserDashboard(user) {\n    if(user.walletStatus !== \"Active\") { dynamicPanel.innerHTML = `<div class=\"card\"><h3>\u26a0\ufe0f Wallet Not Active<\/h3><p>Contact admin.<\/p><\/div>`; return; }\n    const activeAds = ads.filter(ad => ad.isActive && ad.activeUntil > Date.now());\n    const points = Math.floor(user.wallet\/3);\n    const pending = withdrawRequests.filter(r => r.userId === user.id && r.status === 'pending').length;\n    dynamicPanel.innerHTML = `<div class=\"flex-between\"><h2>\ud83c\udfac Watch & Earn<\/h2><span class=\"badge\">\ud83d\udcb0 ${user.wallet} UGX (${points} pts)<\/span><\/div>\n      <div class=\"card\"><div class=\"flex-between\"><span>\u2b50 1 point = UGX 3<\/span><button id=\"requestWithdrawBtn\" class=\"btn-primary\" ${user.wallet<1500?'disabled':''}>Withdraw 1500 UGX<\/button><\/div>${pending?`<p class=\"badge\">${pending} pending<\/p>`:''}<\/div>\n      <div class=\"card\"><h3>\ud83d\udcfa Active Ads<\/h3><div id=\"viewerAdsList\"><\/div><\/div>\n      <div class=\"card\"><h3>\ud83d\udce4 My proofs<\/h3><div id=\"viewerProofHistory\"><\/div><\/div>`;\n    document.getElementById('requestWithdrawBtn')?.addEventListener('click', () => { if(user.wallet>=1500){ withdrawRequests.push({id:Date.now(), userId:user.id, amount:1500, status:'pending', date:new Date().toISOString()}); saveAll(); alert(\"Request submitted.\"); renderUserDashboard(getCurrentUser()); } else alert(\"Insufficient\"); });\n    const container = document.getElementById('viewerAdsList');\n    if(!activeAds.length) container.innerHTML = \"<p>No active ads.<\/p>\";\n    else {\n      container.innerHTML = activeAds.map(ad => `<div style=\"border:1px solid #eef; border-radius:24px; padding:16px; margin-bottom:18px;\"><h4>${ad.title}<\/h4><div>${ad.type==='video'?`<video controls src=\"${ad.mediaUrl}\" style=\"max-width:100%\"><\/video>`:ad.type==='audio'?`<audio controls src=\"${ad.mediaUrl}\"><\/audio>`:`<img decoding=\"async\" src=\"${ad.mediaUrl}\" style=\"max-width:100%; border-radius:12px;\">`}<\/div>${ad.specialInstructions?`<p>\u26a0\ufe0f ${ad.specialInstructions}<\/p>`:''}${!user.viewedAds?.includes(ad.id)?`<button class=\"btn-sm btn-primary\" data-viewad=\"${ad.id}\">\u2705 Earn 3 UGX<\/button>`:`<span class=\"badge\">Claimed<\/span>`} ${ad.specialInstructions?`<button class=\"btn-sm btn-outline\" data-proofad=\"${ad.id}\">\ud83d\udcce Proof<\/button>`:''}<\/div>`).join('');\n      document.querySelectorAll('[data-viewad]').forEach(btn => btn.addEventListener('click', (e) => { const adId = parseInt(btn.dataset.viewad); const ad = ads.find(a=>a.id===adId); if(ad && !user.viewedAds.includes(adId)){ user.viewedAds.push(adId); user.wallet+=3; saveAll(); alert(`+3 UGX`); renderUserDashboard(getCurrentUser()); } else alert(\"Already claimed.\"); }));\n      document.querySelectorAll('[data-proofad]').forEach(btn => btn.addEventListener('click', (e) => { const adId = parseInt(btn.dataset.proofad); const ad = ads.find(a=>a.id===adId); const txt = prompt(`Proof for ${ad.title}:`); if(txt?.trim()){ proofs.push({id:Date.now(), adId, userId:user.id, userName:user.name, proofText:txt.trim(), timestamp:Date.now()}); saveAll(); alert(\"Proof submitted!\"); renderUserDashboard(getCurrentUser()); } }));\n    }\n    const historyDiv = document.getElementById('viewerProofHistory');\n    const userProofs = proofs.filter(p => p.userId === user.id);\n    historyDiv.innerHTML = userProofs.length ? userProofs.map(p=>`<div>${p.proofText}<\/div>`).join('') : \"<p>No proofs.<\/p>\";\n  }\n\n  \/\/ ----- ADMIN PANEL (optimized with lazy exports) -----\n  function renderAdminPanel(admin) {\n    const allUsers = users.filter(u => u.role !== 'admin');\n    const pendingWithdrawals = withdrawRequests.filter(r => r.status === 'pending');\n    dynamicPanel.innerHTML = `\n      <div class=\"flex-between\"><h2>\ud83d\udee1\ufe0f Admin Console<\/h2><span class=\"badge\">Platform: UGX ${platformRevenue.toFixed(0)}<\/span><\/div>\n      <div class=\"grid-2\">\n        <div class=\"card\"><h3>\ud83d\udc65 Users<\/h3><div class=\"search-box\"><input id=\"searchUser\" placeholder=\"Search\"><button id=\"searchUserBtn\" class=\"btn-sm\">\ud83d\udd0d<\/button><\/div><div id=\"usersTableContainer\"><table id=\"usersTable\"><thead><tr><th>ID<\/th><th>Name<\/th><th>Email<\/th><th>Role<\/th><th>Status<\/th><th>Actions<\/th><\/tr><\/thead><tbody><\/tbody><\/table><\/div><\/div>\n        <div class=\"card\"><h3>\ud83d\udcb0 Withdrawals<\/h3><div id=\"withdrawalsList\"><\/div><\/div>\n      <\/div>\n      <div class=\"card\"><h3>\ud83d\udcc1 Contacts (CSV: Status,First Name,Last Name,Phone,Email,Sponsor Code)<\/h3>\n        <input type=\"file\" id=\"contactsCsv\" accept=\".csv\"><button id=\"uploadContactsBtn\" class=\"btn-sm\">Upload CSV<\/button> \n        <button id=\"downloadContactsExcel\" class=\"btn-sm\">Excel<\/button> <button id=\"downloadContactsPdf\" class=\"btn-sm\">PDF<\/button>\n        <div style=\"margin:15px 0\"><label>Show entries: <\/label><select id=\"perPageSelect\"><option value=\"20\">20<\/option><option value=\"50\">50<\/option><option value=\"100\">100<\/option><option value=\"200\">200<\/option><\/select><\/div>\n        <div id=\"contactsPreview\"><\/div><div id=\"paginationControls\" class=\"pagination\"><\/div>\n      <\/div>\n      <div class=\"card\"><h3>\u2709\ufe0f Broadcast<\/h3><label>Subject<\/label><input id=\"emailSubject\"><label>Message<\/label><textarea id=\"emailMessage\" rows=\"3\"><\/textarea><button id=\"sendEmailBtn\" class=\"btn-primary\">Send to All<\/button><\/div>`;\n    \/\/ User table rendering\n    function renderUsersTable(filter=\"\") {\n      const filtered = allUsers.filter(u => u.name.toLowerCase().includes(filter.toLowerCase()) || u.email.toLowerCase().includes(filter.toLowerCase()));\n      const tbody = document.querySelector('#usersTable tbody');\n      if(tbody) {\n        tbody.innerHTML = filtered.map(u => `<tr><td>${u.id}<\/td><td>${u.name}<\/td><td>${u.email}<\/td><td>${u.role}<\/td><td><span class=\"badge\" style=\"background:${u.accountStatus==='active'?'#d1fae5':'#fee2e2'}\">${u.accountStatus}<\/span><\/td><td><button class=\"btn-sm\" data-action=\"edit\" data-id=\"${u.id}\">\u270f\ufe0f<\/button> ${u.accountStatus==='active'?`<button class=\"btn-sm btn-warning\" data-action=\"suspend\" data-id=\"${u.id}\">Suspend<\/button>`:`<button class=\"btn-sm\" data-action=\"unsuspend\" data-id=\"${u.id}\">Unsuspend<\/button>`} ${u.accountStatus!=='banned'?`<button class=\"btn-sm btn-danger\" data-action=\"ban\" data-id=\"${u.id}\">Ban<\/button>`:`<button class=\"btn-sm\" data-action=\"restore\" data-id=\"${u.id}\">Restore<\/button>`} <button class=\"btn-sm\" data-action=\"credit\" data-id=\"${u.id}\">\ud83d\udcb0<\/button><\/td><\/tr>`).join('');\n        document.querySelectorAll('[data-action]').forEach(btn => btn.addEventListener('click', (e) => {\n          const action = btn.dataset.action, userId = parseInt(btn.dataset.id);\n          const target = users.find(u => u.id === userId);\n          if(!target) return;\n          if(action === 'edit') openEditModal(target);\n          else if(action === 'suspend') { target.accountStatus='suspended'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'unsuspend') { target.accountStatus='active'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'ban') { target.accountStatus='banned'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'restore') { target.accountStatus='active'; saveAll(); renderUsersTable(filter); }\n          else if(action === 'credit') { let amt = prompt(\"Add UGX to earnings:\"); if(amt && !isNaN(amt)) { target.wallet += parseFloat(amt); saveAll(); renderUsersTable(filter); } }\n        }));\n      }\n    }\n    renderUsersTable();\n    document.getElementById('searchUserBtn')?.addEventListener('click', () => renderUsersTable(document.getElementById('searchUser').value));\n    \/\/ Withdrawals\n    const withdrawalsDiv = document.getElementById('withdrawalsList');\n    if(pendingWithdrawals.length===0) withdrawalsDiv.innerHTML = \"<p>No pending withdrawals.<\/p>\";\n    else {\n      withdrawalsDiv.innerHTML = pendingWithdrawals.map(w => { const u = users.find(u=>u.id===w.userId); return `<div class=\"flex-between\"><span>${u?.name} (${u?.email}) - UGX ${w.amount}<\/span><div><button class=\"btn-sm btn-primary\" data-wid=\"${w.id}\" data-action=\"approve\">Approve<\/button> <button class=\"btn-sm btn-danger\" data-wid=\"${w.id}\" data-action=\"reject\">Reject<\/button><\/div><\/div>`; }).join('');\n      document.querySelectorAll('[data-wid]').forEach(btn => btn.addEventListener('click', (e) => {\n        const wid = parseInt(btn.dataset.wid), action = btn.dataset.action;\n        const req = withdrawRequests.find(r=>r.id===wid);\n        if(!req) return;\n        const user = users.find(u=>u.id===req.userId);\n        if(action === 'approve') {\n          if(user.wallet >= req.amount) { user.wallet -= req.amount; updatePlatformRevenue(-req.amount); req.status='approved'; alert(\"Approved\"); }\n          else alert(\"Insufficient balance\");\n        } else if(action === 'reject') { req.status='rejected'; alert(\"Rejected\"); }\n        saveAll(); renderAdminPanel(admin);\n      }));\n    }\n    \/\/ Contacts pagination\n    function refreshContactsPreview() {\n      const previewDiv = document.getElementById('contactsPreview');\n      if(!previewDiv) return;\n      if(!contacts.length) { previewDiv.innerHTML = \"<p>No contacts uploaded.<\/p>\"; document.getElementById('paginationControls').innerHTML = ''; return; }\n      const total = contacts.length, totalPages = Math.ceil(total\/contactsPerPage);\n      if(contactsCurrentPage < 1) contactsCurrentPage = 1;\n      if(contactsCurrentPage > totalPages) contactsCurrentPage = totalPages;\n      const start = (contactsCurrentPage-1)*contactsPerPage, pageContacts = contacts.slice(start, start+contactsPerPage);\n      previewDiv.innerHTML = `<table><thead><tr><th>Status<\/th><th>First Name<\/th><th>Last Name<\/th><th>Phone<\/th><th>Email<\/th><th>Sponsor Code<\/th><\/tr><\/thead><tbody>${pageContacts.map(c => `<tr><td>${c.status||''}<\/td><td>${c.firstName}<\/td><td>${c.lastName}<\/td><td>${c.phone}<\/td><td>${c.email}<\/td><td>${c.sponsorCode||''}<\/td><\/tr>`).join('')}<\/tbody><\/table>`;\n      const paginationDiv = document.getElementById('paginationControls');\n      paginationDiv.innerHTML = `<button id=\"firstPage\" ${contactsCurrentPage===1?'disabled':''}>\u00ab First<\/button><button id=\"prevPage\" ${contactsCurrentPage===1?'disabled':''}>\u2039 Prev<\/button><span>Page ${contactsCurrentPage} of ${totalPages}<\/span><button id=\"nextPage\" ${contactsCurrentPage===totalPages?'disabled':''}>Next \u203a<\/button><button id=\"lastPage\" ${contactsCurrentPage===totalPages?'disabled':''}>Last \u00bb<\/button>`;\n      document.getElementById('firstPage')?.addEventListener('click',()=>{ contactsCurrentPage=1; refreshContactsPreview(); });\n      document.getElementById('prevPage')?.addEventListener('click',()=>{ if(contactsCurrentPage>1) contactsCurrentPage--; refreshContactsPreview(); });\n      document.getElementById('nextPage')?.addEventListener('click',()=>{ if(contactsCurrentPage<totalPages) contactsCurrentPage++; refreshContactsPreview(); });\n      document.getElementById('lastPage')?.addEventListener('click',()=>{ contactsCurrentPage=totalPages; refreshContactsPreview(); });\n    }\n    document.getElementById('perPageSelect')?.addEventListener('change', (e) => { contactsPerPage = parseInt(e.target.value); contactsCurrentPage=1; refreshContactsPreview(); });\n    \/\/ Upload CSV\n    document.getElementById('uploadContactsBtn')?.addEventListener('click', () => {\n      const file = document.getElementById('contactsCsv').files[0];\n      if(!file) return alert(\"Select CSV\");\n      const reader = new FileReader();\n      reader.onload = function(e) {\n        const rows = e.target.result.split(\/\\r?\\n\/);\n        let newContacts = [];\n        for(let i=0;i<rows.length;i++) {\n          let line = rows[i].trim();\n          if(!line) continue;\n          let parts = line.split(',');\n          if(parts.length<6) { alert(`Row ${i+1} has <6 columns. Skipping.`); continue; }\n          let [status, firstName, lastName, phone, email, sponsorCode] = parts.map(p=>p.trim());\n          if(!firstName && !lastName && !email) continue;\n          newContacts.push({ id:Date.now()+i, status, firstName, lastName, phone, email, sponsorCode });\n        }\n        contacts.push(...newContacts); saveAll(); alert(`Added ${newContacts.length} contacts.`); contactsCurrentPage=1; refreshContactsPreview();\n      };\n      reader.readAsText(file);\n    });\n    \/\/ Lazy load SheetJS for Excel export\n    document.getElementById('downloadContactsExcel')?.addEventListener('click', () => {\n      if(!window.XLSX) {\n        const script = document.createElement('script');\n        script.src = \"https:\/\/cdn.sheetjs.com\/xlsx-0.20.2\/package\/dist\/xlsx.full.min.js\";\n        script.onload = () => exportExcel();\n        document.head.appendChild(script);\n      } else exportExcel();\n      function exportExcel() {\n        const wsData = contacts.map(c => ({ \"Status\":c.status||'', \"First Name\":c.firstName, \"Last Name\":c.lastName, \"Phone\":c.phone, \"Email\":c.email, \"Sponsor Code\":c.sponsorCode||'' }));\n        const ws = XLSX.utils.json_to_sheet(wsData);\n        const wb = XLSX.utils.book_new();\n        XLSX.utils.book_append_sheet(wb, ws, \"Contacts\");\n        XLSX.writeFile(wb, `contacts_${new Date().toISOString().slice(0,19)}.xlsx`);\n      }\n    });\n    \/\/ Lazy load html2pdf for PDF export\n    document.getElementById('downloadContactsPdf')?.addEventListener('click', () => {\n      if(!window.html2pdf) {\n        const script = document.createElement('script');\n        script.src = \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2pdf.js\/0.10.1\/html2pdf.bundle.min.js\";\n        script.onload = () => exportPdf();\n        document.head.appendChild(script);\n      } else exportPdf();\n      function exportPdf() {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `<table border=\"1\" cellpadding=\"5\"><thead><tr><th>Status<\/th><th>First Name<\/th><th>Last Name<\/th><th>Phone<\/th><th>Email<\/th><th>Sponsor Code<\/th><\/tr><\/thead><tbody>${contacts.map(c => `<tr><td>${c.status||''}<\/td><td>${c.firstName}<\/td><td>${c.lastName}<\/td><td>${c.phone}<\/td><td>${c.email}<\/td><td>${c.sponsorCode||''}<\/td><\/tr>`).join('')}<\/tbody><\/table>`;\n        document.body.appendChild(tempDiv);\n        html2pdf().from(tempDiv).set({ margin:0.5, filename:'contacts.pdf', html2canvas:{scale:2} }).save().then(()=>tempDiv.remove());\n      }\n    });\n    \/\/ Email broadcast (simulated)\n    document.getElementById('sendEmailBtn')?.addEventListener('click', () => {\n      const subj = document.getElementById('emailSubject').value, msg = document.getElementById('emailMessage').value;\n      if(!subj || !msg) return alert(\"Fill subject & message\");\n      allUsers.forEach(u => console.log(`To ${u.email}: ${subj} - ${msg.replace(\/{name}\/g, u.name)}`));\n      alert(`Email sent to ${allUsers.length} users (simulated).`);\n    });\n    refreshContactsPreview();\n  }\n\n  function openEditModal(user) {\n    const modal = document.createElement('div'); modal.className = 'modal'; modal.style.display = 'flex';\n    modal.innerHTML = `<div class=\"modal-content\"><span class=\"close-modal\">&times;<\/span><h3>Edit User<\/h3><label>First Name<\/label><input id=\"editFirstName\" value=\"${user.firstName}\"><label>Last Name<\/label><input id=\"editLastName\" value=\"${user.lastName}\"><label>Email<\/label><input id=\"editEmail\" value=\"${user.email}\"><label>Phone<\/label><input id=\"editPhone\" value=\"${user.phone||''}\"><label>Country<\/label><input id=\"editCountry\" value=\"${user.country||''}\"><label>Gender<\/label><select id=\"editGender\"><option ${user.gender==='Male'?'selected':''}>Male<\/option><option ${user.gender==='Female'?'selected':''}>Female<\/option><\/select><label>Age Group<\/label><select id=\"editAgeGroup\"><option ${user.ageGroup==='18-24'?'selected':''}>18-24<\/option><option ${user.ageGroup==='25-34'?'selected':''}>25-34<\/option><option ${user.ageGroup==='35-44'?'selected':''}>35-44<\/option><option ${user.ageGroup==='45+'?'selected':''}>45+<\/option><\/select><label>Wallet Status<\/label><select id=\"editWalletStatus\"><option ${user.walletStatus==='Active'?'selected':''}>Active<\/option><option ${user.walletStatus==='Not Active'?'selected':''}>Not Active<\/option><\/select><button class=\"btn-primary\" id=\"saveUserEdit\">Save<\/button><\/div>`;\n    document.body.appendChild(modal);\n    modal.querySelector('.close-modal').onclick = () => modal.remove();\n    modal.querySelector('#saveUserEdit').onclick = () => {\n      user.firstName = modal.querySelector('#editFirstName').value;\n      user.lastName = modal.querySelector('#editLastName').value;\n      user.name = user.firstName + \" \" + user.lastName;\n      user.email = modal.querySelector('#editEmail').value;\n      user.phone = modal.querySelector('#editPhone').value;\n      user.country = modal.querySelector('#editCountry').value;\n      user.gender = modal.querySelector('#editGender').value;\n      user.ageGroup = modal.querySelector('#editAgeGroup').value;\n      user.walletStatus = modal.querySelector('#editWalletStatus').value;\n      saveAll(); alert(\"Updated\"); modal.remove(); renderAdminPanel(getCurrentUser());\n    };\n  }\n\n  \/\/ ----- ADVERTISER DASHBOARD (simplified) -----\n  function renderAdvertiserDashboard(user) {\n    const myAds = ads.filter(ad => ad.advertiserId === user.id);\n    dynamicPanel.innerHTML = `<div class=\"flex-between\"><h2>\ud83d\udce2 Advertiser Hub<\/h2><span class=\"badge\">\ud83d\udcb0 Wallet: ${user.advertiserWallet.toFixed(0)} UGX<\/span><\/div>\n      <div class=\"grid-2\"><div class=\"card\"><h3>\u2795 Create Ad<\/h3><input id=\"adTitle\" placeholder=\"Title\"><select id=\"adType\"><option>video<\/option><option>audio<\/option><option>banner<\/option><\/select><input id=\"adMedia\" placeholder=\"Media URL\"><textarea id=\"adInstructions\" placeholder=\"Instructions\"><\/textarea><select id=\"dailyCostSelect\"><option value=\"2000\">UGX 2,000<\/option><option value=\"3800\">$1 (3800 UGX)<\/option><\/select><button id=\"createAdBtn\" class=\"btn-primary\">Create<\/button><\/div>\n      <div class=\"card\"><h3>\ud83d\udcb0 Fund Wallet<\/h3><input id=\"fundAmount\" value=\"10000\"><select id=\"payMethod\"><option>MTN<\/option><option>Airtel<\/option><option>Mpesa<\/option><option>Visa<\/option><option>PayPal<\/option><\/select><button id=\"fundWalletBtn\" class=\"btn-primary\">Add funds<\/button><hr><h4>My Ads<\/h4><div id=\"advertiserAdsList\"><\/div><\/div><\/div>\n      <div id=\"smmServicesContainer\" class=\"card\"><\/div>`;\n    document.getElementById('createAdBtn')?.addEventListener('click', () => {\n      const title = document.getElementById('adTitle').value, type = document.getElementById('adType').value, media = document.getElementById('adMedia').value, inst = document.getElementById('adInstructions').value, cost = document.getElementById('dailyCostSelect').value===\"2000\"?2000:3800;\n      if(!title || !media) return alert(\"Required\");\n      ads.push({ id:Date.now(), advertiserId:user.id, title, type, mediaUrl:media, specialInstructions:inst, dailyCostUGX:cost, activeUntil:null, isActive:false });\n      saveAll(); alert(\"Ad created\"); renderAdvertiserDashboard(user);\n    });\n    document.getElementById('fundWalletBtn')?.addEventListener('click', () => { let amt = parseFloat(document.getElementById('fundAmount').value); if(amt>0){ user.advertiserWallet+=amt; saveAll(); alert(\"Funds added\"); renderAdvertiserDashboard(user); } });\n    const adsDiv = document.getElementById('advertiserAdsList');\n    adsDiv.innerHTML = myAds.map(ad => `<div><strong>${ad.title}<\/strong> - ${ad.isActive && ad.activeUntil>Date.now() ? 'Active' : 'Inactive'} <button class=\"btn-sm\" data-adid=\"${ad.id}\">Activate (${ad.dailyCostUGX} UGX)<\/button><\/div>`).join('');\n    document.querySelectorAll('[data-adid]').forEach(btn => btn.addEventListener('click', () => {\n      const adId = parseInt(btn.dataset.adid), ad = ads.find(a=>a.id===adId);\n      if(ad && user.advertiserWallet >= ad.dailyCostUGX) { user.advertiserWallet -= ad.dailyCostUGX; ad.isActive=true; ad.activeUntil=Date.now()+86400000; updatePlatformRevenue(ad.dailyCostUGX); saveAll(); alert(\"Activated\"); renderAdvertiserDashboard(user); }\n      else alert(\"Insufficient balance\");\n    }));\n    const smmDiv = document.getElementById('smmServicesContainer');\n    if(smmDiv) {\n      smmDiv.innerHTML = `<h3>SMM Services<\/h3><button class=\"btn-primary\" id=\"buySmmDemo\">Buy Demo (1000 Views = 10326 UGX)<\/button>`;\n      document.getElementById('buySmmDemo')?.addEventListener('click', () => { if(user.advertiserWallet >= 10326) { user.advertiserWallet -= 10326; updatePlatformRevenue(10326); saveAll(); alert(\"Order placed!\"); renderAdvertiserDashboard(user); } else alert(\"Insufficient wallet\"); });\n    }\n  }\n\n  loadData();\n  renderApp();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Adase Ads Ltd | Fast SMM + Ad Platform \ud83d\udce2 Adase Serve Loading&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"class_list":["post-81","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":11,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/81\/revisions"}],"predecessor-version":[{"id":120,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/81\/revisions\/120"}],"wp:attachment":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/media?parent=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}