{"id":91,"date":"2026-04-19T15:38:49","date_gmt":"2026-04-19T15:38:49","guid":{"rendered":"https:\/\/cashchat.se\/dir\/?page_id=91"},"modified":"2026-04-23T14:16:01","modified_gmt":"2026-04-23T14:16:01","slug":"access","status":"publish","type":"page","link":"https:\/\/cashchat.se\/dir\/access\/","title":{"rendered":"Access"},"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 | Complete Ad + SMM Platform<\/title>\n  <!-- Font Awesome + Google Fonts -->\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:opsz,wght@14..32,300;400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n  <!-- SheetJS for Excel export -->\n  <script src=\"https:\/\/cdn.sheetjs.com\/xlsx-0.20.2\/package\/dist\/xlsx.full.min.js\"><\/script>\n  <!-- html2pdf for PDF export (lightweight) -->\n  <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2pdf.js\/0.10.1\/html2pdf.bundle.min.js\" integrity=\"sha512-GsLlZN\/3F2ErC5ifS5QtgpiJtWd43JWSuIgh7mbzZ8zBps+dvLusV+eNQATqgA\/HdeKFVgA5v3S\/cIrLF7QnIg==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\n  <style>\n    * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', sans-serif; }\n    body { background: #f5f7fb; color: #1a2634; padding-bottom: 40px; }\n    .container { max-width: 1280px; margin: 0 auto; padding: 0 20px; }\n    .navbar { background: white; box-shadow: 0 4px 12px rgba(0,0,0,0.03); padding: 16px 0; position: sticky; top: 0; z-index: 100; background: rgba(255,255,255,0.96); }\n    .nav-flex { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }\n    .logo { font-weight: 800; font-size: 1.7rem; background: linear-gradient(135deg, #1F3A8A, #2E5AFF); -webkit-background-clip: text; background-clip: text; color: transparent; }\n    .auth-buttons { display: flex; gap: 12px; flex-wrap: wrap; }\n    .btn-sm { padding: 8px 20px; border-radius: 40px; font-weight: 600; border: none; cursor: pointer; background: #f0f2f5; transition: 0.2s; }\n    .btn-primary { background: #2E5AFF; color: white; box-shadow: 0 2px 6px rgba(46,90,255,0.2); }\n    .btn-primary:hover { background: #1e44cc; transform: translateY(-1px);}\n    .btn-outline { background: transparent; border: 1px solid #2E5AFF; color: #2E5AFF; }\n    .btn-danger { background: #dc2626; color: white; }\n    .btn-danger:hover { background: #b91c1c; }\n    .btn-warning { background: #f59e0b; color: white; }\n    .card { background: white; border-radius: 28px; padding: 24px; margin-bottom: 24px; box-shadow: 0 8px 20px rgba(0,0,0,0.02), 0 2px 6px rgba(0,0,0,0.05); border: 1px solid #eef2f9; }\n    .grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; }\n    .badge { background: #eef3ff; color: #1f3a8a; padding: 4px 12px; border-radius: 40px; font-size: 0.75rem; font-weight: 600; display: inline-block; }\n    input, select, textarea { width: 100%; padding: 12px 16px; border-radius: 20px; border: 1px solid #cfdfed; background: white; font-size: 0.9rem; margin-top: 6px; margin-bottom: 16px; }\n    label { font-weight: 600; font-size: 0.85rem; }\n    hr { margin: 20px 0; border: 0; height: 1px; background: #eef2f9; }\n    .flex-between { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }\n    table { width: 100%; border-collapse: collapse; overflow-x: auto; display: block; }\n    th, td { text-align: left; padding: 12px 8px; border-bottom: 1px solid #eef2f9; }\n    .search-box { margin-bottom: 20px; display: flex; gap: 12px; flex-wrap: wrap; align-items: flex-end; }\n    .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; }\n    .modal-content { background: white; max-width: 500px; width: 90%; border-radius: 32px; padding: 24px; max-height: 80vh; overflow-y: auto; }\n    .close-modal { float: right; font-size: 28px; cursor: pointer; }\n    @media (max-width: 700px) { .nav-flex { flex-direction: column; align-items: stretch; } .auth-buttons { justify-content: center; } }\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\" style=\"margin-top: 30px;\">Loading&#8230;<\/div><\/div>\n\n<script>\n  \/\/ ---------- DATA MODELS ----------\n  let users = [];\n  let ads = [];\n  let proofs = [];\n  let platformRevenue = 0;\n  let sessions = { currentUserId: null, currentUserRole: null };\n  let smmOrders = [];\n  let withdrawRequests = []; \/\/ { id, userId, amount, status, date }\n  let contacts = []; \/\/ for uploaded contacts\n\n  function loadData() {\n    const storedUsers = localStorage.getItem('adase_users');\n    const storedAds = localStorage.getItem('adase_ads');\n    const storedProofs = localStorage.getItem('adase_proofs');\n    const storedPlatform = localStorage.getItem('adase_platformRevenue');\n    const storedOrders = localStorage.getItem('adase_smm_orders');\n    const storedWithdraw = localStorage.getItem('adase_withdraw_requests');\n    const storedContacts = localStorage.getItem('adase_contacts');\n    users = storedUsers ? JSON.parse(storedUsers) : [];\n    ads = storedAds ? JSON.parse(storedAds) : [];\n    proofs = storedProofs ? JSON.parse(storedProofs) : [];\n    platformRevenue = storedPlatform ? parseFloat(storedPlatform) : 0;\n    smmOrders = storedOrders ? JSON.parse(storedOrders) : [];\n    withdrawRequests = storedWithdraw ? JSON.parse(storedWithdraw) : [];\n    contacts = storedContacts ? JSON.parse(storedContacts) : [];\n\n    \/\/ Admin credentials: sales@cashchat.se \/ Justtrade81#\n    const adminEmail = \"sales@cashchat.se\";\n    const 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({ \n        id: Date.now() + 1, \n        name: \"Super Admin\", firstName: \"Super\", lastName: \"Admin\",\n        email: adminEmail, password: adminPass, role: \"admin\", \n        wallet: 0, advertiserWallet: 0, viewedAds: [],\n        phone: \"\", sponsorCode: \"\", country: \"\", gender: \"\", ageGroup: \"\", walletStatus: \"Active\",\n        accountStatus: \"active\"\n      });\n    } else {\n      existingAdmin.password = adminPass;\n      const idx = users.findIndex(u => u.id === existingAdmin.id);\n      if (idx !== -1) users[idx] = existingAdmin;\n    }\n\n    \/\/ Ensure all users have new fields\n    users = users.map(u => {\n      if (!u.firstName) u.firstName = u.name ? u.name.split(' ')[0] : u.name || \"\";\n      if (!u.lastName) u.lastName = u.name ? (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    \/\/ Seed demo data if needed\n    if (users.length === 1) {\n      users.push({ \n        id: 1001, name: \"Demo Advertiser\", firstName: \"Demo\", lastName: \"Advertiser\",\n        email: \"adv@demo.com\", password: \"adv123\", role: \"advertiser\", wallet: 0, \n        advertiserWallet: 50000, viewedAds: [], phone: \"+256700000000\", sponsorCode: \"DEMO123\",\n        country: \"Uganda\", gender: \"Male\", ageGroup: \"25-34\", walletStatus: \"Active\", accountStatus: \"active\"\n      });\n      users.push({ \n        id: 1002, name: \"Alice Viewer\", firstName: \"Alice\", lastName: \"Viewer\",\n        email: \"alice@view.com\", password: \"view123\", role: \"user\", wallet: 600, \n        advertiserWallet: 0, viewedAds: [], phone: \"+256712345678\", sponsorCode: \"\",\n        country: \"Kenya\", gender: \"Female\", ageGroup: \"18-24\", walletStatus: \"Active\", accountStatus: \"active\"\n      });\n      if (ads.length === 0) {\n        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    }\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() {\n    if (!sessions.currentUserId) return null;\n    return users.find(u => u.id === sessions.currentUserId);\n  }\n\n  function updatePlatformRevenue(amountChange) {\n    platformRevenue += amountChange;\n    if (platformRevenue < 0) platformRevenue = 0;\n    localStorage.setItem('adase_platformRevenue', platformRevenue);\n  }\n\n  function renderApp() {\n    if (!sessions.currentUserId) renderAuthScreen();\n    else {\n      const user = getCurrentUser();\n      if (!user || user.accountStatus === 'suspended' || user.accountStatus === 'banned') {\n        sessions.currentUserId = null;\n        alert(\"Your account is suspended or banned. Contact admin.\");\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    const area = document.getElementById('globalUserArea');\n    if (!sessions.currentUserId) {\n      area.innerHTML = `<button class=\"btn-sm\" id=\"showLoginBtn\">Login<\/button>\n                        <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      area.innerHTML = `<span style=\"font-weight:500;\">\ud83d\udc4b ${user.name} (${user.role})<\/span>\n                        <button class=\"btn-sm\" id=\"logoutBtn\">Logout<\/button>`;\n      document.getElementById('logoutBtn')?.addEventListener('click', () => {\n        sessions.currentUserId = null;\n        renderApp();\n      });\n    }\n  }\n\n  function showLoginForm() {\n    const panel = document.getElementById('dynamicPanel');\n    panel.innerHTML = `\n      <div class=\"card\" style=\"max-width:500px; margin:auto;\">\n        <h2>Login to Adase<\/h2>\n        <label>Email<\/label><input type=\"email\" id=\"loginEmail\" placeholder=\"email\">\n        <label>Password<\/label><input type=\"password\" id=\"loginPass\">\n        <button class=\"btn-primary\" id=\"doLoginBtn\" style=\"width:100%\">Login<\/button>\n        <p style=\"margin-top:12px;\">Demo: advertiser@demo.com \/ adv123 | viewer: alice@view.com \/ view123<\/p>\n      <\/div>`;\n    document.getElementById('doLoginBtn')?.addEventListener('click', () => {\n      const email = document.getElementById('loginEmail').value;\n      const pwd = document.getElementById('loginPass').value;\n      const user = users.find(u => u.email === email && u.password === pwd);\n      if (user && user.accountStatus === 'active') {\n        sessions.currentUserId = user.id;\n        renderApp();\n      } else if (user && (user.accountStatus === 'suspended' || user.accountStatus === 'banned')) {\n        alert(\"Account suspended or banned. Contact admin.\");\n      } else alert(\"Invalid credentials\");\n    });\n  }\n\n  \/\/ Registration form (same as before, simplified)\n  function showRegisterForm() {\n    const panel = document.getElementById('dynamicPanel');\n    panel.innerHTML = `\n      <div class=\"card\" style=\"max-width:700px; margin:auto;\">\n        <h2>Create Account<\/h2>\n        <label>Role<\/label>\n        <select id=\"regRole\"><option value=\"user\">Viewer (earn points)<\/option><option value=\"advertiser\">Advertiser (run ads + SMM)<\/option><\/select>\n        <div id=\"viewerExtraFields\" style=\"display:none;\">\n          <div class=\"form-row\" style=\"display:flex; gap:16px;\"><div><label>First Name *<\/label><input id=\"regFirstName\"><\/div><div><label>Last Name *<\/label><input id=\"regLastName\"><\/div><\/div>\n          <label>Phone Number *<\/label><input id=\"regPhone\" type=\"tel\">\n          <label>Email *<\/label><input id=\"regEmail\" type=\"email\">\n          <label>Sponsor Code<\/label><input id=\"regSponsorCode\" placeholder=\"Optional\"><a href=\"https:\/\/cashchatbank.com\" target=\"_blank\" style=\"font-size:12px; display:block;\">\ud83d\udd17 Apply for sponsor code<\/a>\n          <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><option>Other<\/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>\n          <label>Wallet Status<\/label><select id=\"regWalletStatus\"><option value=\"Not Active\">Not Active<\/option><option value=\"Active\">Active<\/option><\/select>\n        <\/div>\n        <div id=\"advertiserSimpleFields\" style=\"display:block;\"><label>Full Name *<\/label><input id=\"regNameSimple\"><label>Email *<\/label><input id=\"regEmailSimple\"><\/div>\n        <label>Password *<\/label><input id=\"regPass\" type=\"password\">\n        <button class=\"btn-primary\" id=\"doRegBtn\" style=\"width:100%; margin-top:16px;\">Sign up<\/button>\n      <\/div>`;\n    const roleSelect = document.getElementById('regRole');\n    const viewerDiv = document.getElementById('viewerExtraFields');\n    const advertiserDiv = document.getElementById('advertiserSimpleFields');\n    roleSelect.addEventListener('change', () => {\n      const isViewer = roleSelect.value === 'user';\n      viewerDiv.style.display = isViewer ? 'block' : 'none';\n      advertiserDiv.style.display = isViewer ? 'none' : 'block';\n    });\n    roleSelect.dispatchEvent(new Event('change'));\n    document.getElementById('doRegBtn')?.addEventListener('click', () => {\n      const role = roleSelect.value;\n      const password = document.getElementById('regPass').value;\n      if (!password) return alert(\"Password required\");\n      if (role === 'user') {\n        const firstName = document.getElementById('regFirstName').value.trim();\n        const lastName = document.getElementById('regLastName').value.trim();\n        const phone = document.getElementById('regPhone').value.trim();\n        const email = document.getElementById('regEmail').value.trim();\n        const sponsorCode = document.getElementById('regSponsorCode').value.trim();\n        const country = document.getElementById('regCountry').value.trim();\n        const gender = document.getElementById('regGender').value;\n        const ageGroup = document.getElementById('regAgeGroup').value;\n        const walletStatus = document.getElementById('regWalletStatus').value;\n        if (!firstName || !lastName || !phone || !email) return alert(\"All fields required\");\n        if (users.find(u => u.email === email)) return alert(\"Email exists\");\n        const newId = users.length + 1000;\n        users.push({ id: newId, name: firstName+\" \"+lastName, firstName, lastName, email, password, role: 'user', wallet: 0, advertiserWallet: 0, viewedAds: [], phone, sponsorCode, country, gender, ageGroup, walletStatus, accountStatus: 'active' });\n        saveAll();\n        alert(\"Registration successful! Login.\");\n        showLoginForm();\n      } else {\n        const fullName = document.getElementById('regNameSimple').value.trim();\n        const email = document.getElementById('regEmailSimple').value.trim();\n        if (!fullName || !email) return alert(\"Fill all fields\");\n        if (users.find(u => u.email === email)) return alert(\"Email exists\");\n        const newId = users.length + 1000;\n        users.push({ id: newId, name: fullName, firstName: fullName.split(' ')[0], lastName: fullName.split(' ')[1]||\"\", email, password, role: 'advertiser', wallet: 0, advertiserWallet: 0, viewedAds: [], phone: \"\", sponsorCode: \"\", country: \"\", gender: \"\", ageGroup: \"\", walletStatus: \"Active\", accountStatus: 'active' });\n        saveAll();\n        alert(\"Advertiser account created!\");\n        showLoginForm();\n      }\n    });\n  }\n\n  function renderAuthScreen() {\n    const panel = document.getElementById('dynamicPanel');\n    panel.innerHTML = `<div class=\"card\" style=\"text-align:center;\"><h3>Welcome to Adase Serve<\/h3><p>Earn points by watching ads, or run campaigns & buy SMM services.<\/p><div style=\"margin-top:20px;\"><button class=\"btn-primary\" id=\"gotoLoginBtn\">Login \/ Register<\/button><\/div><\/div>`;\n    document.getElementById('gotoLoginBtn')?.addEventListener('click', () => showLoginForm());\n  }\n\n  \/\/ ----- USER DASHBOARD (with withdrawal request instead of instant) -----\n  function renderUserDashboard(user) {\n    if (user.walletStatus !== \"Active\") {\n      const panel = document.getElementById('dynamicPanel');\n      panel.innerHTML = `<div class=\"card\"><h3>\u26a0\ufe0f Wallet Not Active<\/h3><p>Your wallet is ${user.walletStatus}. Contact admin to activate.<\/p><\/div>`;\n      return;\n    }\n    const activeAds = ads.filter(ad => ad.isActive && ad.activeUntil > Date.now());\n    const points = Math.floor(user.wallet \/ 3);\n    const pendingRequests = withdrawRequests.filter(r => r.userId === user.id && r.status === 'pending').length;\n    const panel = document.getElementById('dynamicPanel');\n    panel.innerHTML = `\n      <div class=\"flex-between\"><h2>\ud83c\udfac Watch & Earn<\/h2><span class=\"badge\">\ud83d\udcb0 Earnings: ${user.wallet.toFixed(0)} UGX (${points} points)<\/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' : ''}>Request Withdrawal (500 points = 1500 UGX)<\/button><\/div>${pendingRequests > 0 ? `<p class=\"badge\">You have ${pendingRequests} pending withdrawal request(s).<\/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    `;\n    document.getElementById('requestWithdrawBtn')?.addEventListener('click', () => {\n      if (user.wallet >= 1500) {\n        withdrawRequests.push({ id: Date.now(), userId: user.id, amount: 1500, status: 'pending', date: new Date().toISOString() });\n        saveAll();\n        alert(\"Withdrawal request submitted. Admin will approve.\");\n        renderUserDashboard(getCurrentUser());\n      } else alert(\"Insufficient balance\");\n    });\n    const adsContainer = document.getElementById('viewerAdsList');\n    if (activeAds.length === 0) adsContainer.innerHTML = \"<p>No active ads.<\/p>\";\n    else {\n      adsContainer.innerHTML = activeAds.map(ad => {\n        const viewed = user.viewedAds?.includes(ad.id);\n        return `<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>`:`<div><img decoding=\"async\" src=\"${ad.mediaUrl}\" style=\"max-width:100%; border-radius:12px;\"><\/div>`}<\/div>${ad.specialInstructions?`<p>\u26a0\ufe0f ${ad.specialInstructions}<\/p>`:''}${!viewed?`<button class=\"btn-sm btn-primary\" data-viewad=\"${ad.id}\">\u2705 Earn 3 UGX (1 point)<\/button>`:`<span class=\"badge\">\u2713 Claimed<\/span>`} ${ad.specialInstructions?`<button class=\"btn-sm btn-outline\" data-proofad=\"${ad.id}\">\ud83d\udcce Submit proof<\/button>`:''}<\/div>`;\n      }).join('');\n      document.querySelectorAll('[data-viewad]').forEach(btn => {\n        btn.addEventListener('click', (e) => {\n          const adId = parseInt(btn.getAttribute('data-viewad'));\n          const ad = ads.find(a => a.id === adId);\n          if (ad && !user.viewedAds.includes(adId)) {\n            user.viewedAds.push(adId);\n            user.wallet += 3;\n            const idx = users.findIndex(u => u.id === user.id);\n            users[idx].wallet = user.wallet;\n            users[idx].viewedAds = user.viewedAds;\n            saveAll();\n            alert(`+3 UGX earned for \"${ad.title}\"`);\n            renderUserDashboard(getCurrentUser());\n          } else alert(\"Already claimed.\");\n        });\n      });\n      document.querySelectorAll('[data-proofad]').forEach(btn => {\n        btn.addEventListener('click', (e) => {\n          const adId = parseInt(btn.getAttribute('data-proofad'));\n          const ad = ads.find(a => a.id === adId);\n          const proofText = prompt(`Proof for \"${ad.title}\":\\n${ad.specialInstructions || ''}\\nEnter details:`);\n          if (proofText?.trim()) {\n            proofs.push({ id: Date.now(), adId, userId: user.id, userName: user.name, proofText: proofText.trim(), timestamp: Date.now() });\n            saveAll();\n            alert(\"Proof submitted!\");\n            renderUserDashboard(getCurrentUser());\n          }\n        });\n      });\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 class=\"proof-item\">${p.proofText}<\/div>`).join('') : \"<p>No proofs sent.<\/p>\";\n  }\n\n  \/\/ ----- ADMIN PANEL (full management) -----\n  function renderAdminPanel(admin) {\n    const allUsers = users.filter(u => u.role !== 'admin');\n    const pendingWithdrawals = withdrawRequests.filter(r => r.status === 'pending');\n    const panel = document.getElementById('dynamicPanel');\n    panel.innerHTML = `\n      <div class=\"flex-between\"><h2>\ud83d\udee1\ufe0f Admin Console<\/h2><span class=\"badge\">Platform Balance: UGX ${platformRevenue.toFixed(0)}<\/span><\/div>\n      <div class=\"grid-2\">\n        <div class=\"card\"><h3>\ud83d\udc65 User Management<\/h3><div class=\"search-box\"><input type=\"text\" id=\"searchUser\" placeholder=\"Search by name\/email\"><button id=\"searchUserBtn\" class=\"btn-sm\">\ud83d\udd0d Search<\/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 Withdrawal Requests<\/h3><div id=\"withdrawalsList\"><\/div><\/div>\n      <\/div>\n      <div class=\"card\"><h3>\ud83d\udcc1 Contacts Upload \/ Download<\/h3><input type=\"file\" id=\"contactsCsv\" accept=\".csv\"><button id=\"uploadContactsBtn\" class=\"btn-sm\">Upload CSV<\/button> <button id=\"downloadContactsExcel\" class=\"btn-sm\">Download Excel<\/button> <button id=\"downloadContactsPdf\" class=\"btn-sm\">Download PDF<\/button><div id=\"contactsPreview\" style=\"margin-top:16px;\"><\/div><\/div>\n      <div class=\"card\"><h3>\u2709\ufe0f Email 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 Users<\/button><\/div>\n    `;\n    \/\/ Render user table with actions\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 => `\n          <tr>\n            <td>${u.id}<\/td><td>${u.name}<\/td><td>${u.email}<\/td><td>${u.role}<\/td>\n            <td><span class=\"badge\" style=\"background:${u.accountStatus==='active'?'#d1fae5':'#fee2e2'}\">${u.accountStatus}<\/span><\/td>\n            <td>\n              <button class=\"btn-sm\" data-action=\"edit\" data-id=\"${u.id}\">\u270f\ufe0f Edit<\/button>\n              ${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>`}\n              ${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>`}\n              <button class=\"btn-sm\" data-action=\"credit\" data-id=\"${u.id}\">\ud83d\udcb0 Top Up<\/button>\n            <\/td>\n          <\/tr>\n        `).join('');\n        \/\/ Attach event listeners\n        document.querySelectorAll('[data-action]').forEach(btn => {\n          btn.addEventListener('click', (e) => {\n            const action = btn.getAttribute('data-action');\n            const userId = parseInt(btn.getAttribute('data-id'));\n            const targetUser = users.find(u => u.id === userId);\n            if (!targetUser) return;\n            if (action === 'edit') openEditModal(targetUser);\n            else if (action === 'suspend') { targetUser.accountStatus = 'suspended'; saveAll(); renderUsersTable(filter); }\n            else if (action === 'unsuspend') { targetUser.accountStatus = 'active'; saveAll(); renderUsersTable(filter); }\n            else if (action === 'ban') { targetUser.accountStatus = 'banned'; saveAll(); renderUsersTable(filter); }\n            else if (action === 'restore') { targetUser.accountStatus = 'active'; saveAll(); renderUsersTable(filter); }\n            else if (action === 'credit') {\n              let amount = prompt(\"Enter amount (UGX) to add to user's earnings wallet:\", \"1000\");\n              if (amount && !isNaN(amount)) {\n                targetUser.wallet += parseFloat(amount);\n                saveAll();\n                alert(`Added ${amount} UGX to ${targetUser.name}'s wallet.`);\n                renderUsersTable(filter);\n              }\n            }\n          });\n        });\n      }\n    }\n    renderUsersTable();\n    document.getElementById('searchUserBtn')?.addEventListener('click', () => {\n      const term = document.getElementById('searchUser').value;\n      renderUsersTable(term);\n    });\n    \/\/ Withdrawals management\n    const withdrawalsDiv = document.getElementById('withdrawalsList');\n    function renderWithdrawals() {\n      if (pendingWithdrawals.length === 0) withdrawalsDiv.innerHTML = \"<p>No pending withdrawals.<\/p>\";\n      else {\n        withdrawalsDiv.innerHTML = pendingWithdrawals.map(w => {\n          const u = users.find(u => u.id === w.userId);\n          return `<div class=\"flex-between\" style=\"border-bottom:1px solid #eee; padding:8px;\"><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>`;\n        }).join('');\n        document.querySelectorAll('[data-wid]').forEach(btn => {\n          btn.addEventListener('click', (e) => {\n            const wid = parseInt(btn.getAttribute('data-wid'));\n            const action = btn.getAttribute('data-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) {\n                user.wallet -= req.amount;\n                updatePlatformRevenue(-req.amount);\n                req.status = 'approved';\n                alert(`Withdrawal approved. ${req.amount} UGX deducted.`);\n              } else alert(\"User insufficient balance.\");\n            } else if (action === 'reject') {\n              req.status = 'rejected';\n              alert(\"Withdrawal rejected.\");\n            }\n            saveAll();\n            renderAdminPanel(admin);\n          });\n        });\n      }\n    }\n    renderWithdrawals();\n    \/\/ Contacts upload\/download\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 text = e.target.result;\n        const rows = text.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          let name = parts[0]?.trim() || \"Unknown\";\n          let email = parts[1]?.trim() || \"\";\n          let phone = parts[2]?.trim() || \"\";\n          if (email) newContacts.push({ id: Date.now()+i, name, email, phone });\n        }\n        contacts.push(...newContacts);\n        saveAll();\n        alert(`Added ${newContacts.length} contacts.`);\n        showContactsPreview();\n      };\n      reader.readAsText(file);\n    });\n    function showContactsPreview() {\n      const previewDiv = document.getElementById('contactsPreview');\n      if (contacts.length === 0) previewDiv.innerHTML = \"<p>No contacts uploaded.<\/p>\";\n      else {\n        let html = `<table><thead><tr><th>Name<\/th><th>Email<\/th><th>Phone<\/th><\/tr><\/thead><tbody>`;\n        contacts.forEach(c => html += `<tr><td>${c.name}<\/td><td>${c.email}<\/td><td>${c.phone}<\/td><\/tr>`);\n        html += `<\/tbody><\/table>`;\n        previewDiv.innerHTML = html;\n      }\n    }\n    showContactsPreview();\n    document.getElementById('downloadContactsExcel')?.addEventListener('click', () => {\n      const ws = XLSX.utils.json_to_sheet(contacts.map(c=>({Name:c.name,Email:c.email,Phone:c.phone})));\n      const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, \"Contacts\"); XLSX.writeFile(wb, `contacts.xlsx`);\n    });\n    document.getElementById('downloadContactsPdf')?.addEventListener('click', () => {\n      const element = document.getElementById('contactsPreview');\n      if (!element || contacts.length === 0) return alert(\"No contacts\");\n      html2pdf().from(element).set({ margin: 0.5, filename: 'contacts.pdf', html2canvas: { scale: 2 } }).save();\n    });\n    \/\/ Email broadcast\n    document.getElementById('sendEmailBtn')?.addEventListener('click', () => {\n      const subj = document.getElementById('emailSubject').value;\n      const msg = document.getElementById('emailMessage').value;\n      if (!subj || !msg) return alert(\"Fill subject & message\");\n      allUsers.forEach(u => console.log(`\ud83d\udce7 To ${u.email}: ${subj} - ${msg.replace(\/{name}\/g, u.name)}`));\n      alert(`Email simulation sent to ${allUsers.length} users.`);\n    });\n  }\n\n  \/\/ Edit modal\n  function openEditModal(user) {\n    const modal = document.createElement('div');\n    modal.className = 'modal';\n    modal.style.display = 'flex';\n    modal.innerHTML = `<div class=\"modal-content\"><span class=\"close-modal\">&times;<\/span><h3>Edit User<\/h3>\n      <label>First Name<\/label><input id=\"editFirstName\" value=\"${user.firstName}\">\n      <label>Last Name<\/label><input id=\"editLastName\" value=\"${user.lastName}\">\n      <label>Email<\/label><input id=\"editEmail\" value=\"${user.email}\">\n      <label>Phone<\/label><input id=\"editPhone\" value=\"${user.phone || ''}\">\n      <label>Country<\/label><input id=\"editCountry\" value=\"${user.country || ''}\">\n      <label>Gender<\/label><select id=\"editGender\"><option ${user.gender==='Male'?'selected':''}>Male<\/option><option ${user.gender==='Female'?'selected':''}>Female<\/option><option ${user.gender==='Other'?'selected':''}>Other<\/option><\/select>\n      <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>\n      <label>Wallet Status<\/label><select id=\"editWalletStatus\"><option ${user.walletStatus==='Active'?'selected':''}>Active<\/option><option ${user.walletStatus==='Not Active'?'selected':''}>Not Active<\/option><\/select>\n      <button id=\"saveUserEdit\" class=\"btn-primary\">Save Changes<\/button>\n    <\/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();\n      alert(\"User updated\");\n      modal.remove();\n      renderAdminPanel(getCurrentUser());\n    };\n  }\n\n  \/\/ ----- Advertiser Dashboard (simplified, same as before) -----\n  function renderAdvertiserDashboard(user) {\n    const myAds = ads.filter(ad => ad.advertiserId === user.id);\n    const panel = document.getElementById('dynamicPanel');\n    panel.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 (\u22483800 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;\n      const type = document.getElementById('adType').value;\n      const media = document.getElementById('adMedia').value;\n      const instructions = document.getElementById('adInstructions').value;\n      const 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: instructions, dailyCostUGX: cost, activeUntil: null, isActive: false });\n      saveAll(); alert(\"Ad created\"); renderAdvertiserDashboard(user);\n    });\n    document.getElementById('fundWalletBtn')?.addEventListener('click', () => {\n      let amt = parseFloat(document.getElementById('fundAmount').value);\n      if (amt > 0) { user.advertiserWallet += amt; saveAll(); alert(\"Funds added\"); renderAdvertiserDashboard(user); }\n    });\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 => {\n      btn.addEventListener('click', () => {\n        const adId = parseInt(btn.getAttribute('data-adid'));\n        const ad = ads.find(a => a.id === adId);\n        if (ad && user.advertiserWallet >= ad.dailyCostUGX) {\n          user.advertiserWallet -= ad.dailyCostUGX; ad.isActive = true; ad.activeUntil = Date.now()+86400000; updatePlatformRevenue(ad.dailyCostUGX); saveAll();\n          alert(\"Activated\"); renderAdvertiserDashboard(user);\n        } else alert(\"Insufficient balance\");\n      });\n    });\n    \/\/ SMM panel\n    const smmContainer = document.getElementById('smmServicesContainer');\n    if (smmContainer) {\n      const servicesData = [{ category:\"Uganda Services\", icon:\"fas fa-flag\", services:[{id:6004,name:\"TikTok Real Views\", rate:10326, min:1000, max:1000000}] }];\n      smmContainer.innerHTML = `<h3>SMM Services<\/h3><button class=\"btn-primary\" id=\"buySmmDemo\">Buy Demo (1000 Views = 10326 UGX)<\/button>`;\n      document.getElementById('buySmmDemo')?.addEventListener('click', () => {\n        if (user.advertiserWallet >= 10326) {\n          user.advertiserWallet -= 10326; updatePlatformRevenue(10326); saveAll();\n          alert(\"Order placed! 1000 TikTok Views purchased.\");\n          renderAdvertiserDashboard(user);\n        } else alert(\"Insufficient wallet\");\n      });\n    }\n  }\n\n  loadData();\n  renderApp();\n<\/script>\n<\/body>\n<\/html>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Adase Ads Ltd | Complete Ad + SMM 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-91","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/91","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=91"}],"version-history":[{"count":4,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/91\/revisions"}],"predecessor-version":[{"id":112,"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/pages\/91\/revisions\/112"}],"wp:attachment":[{"href":"https:\/\/cashchat.se\/dir\/wp-json\/wp\/v2\/media?parent=91"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}