{"error":"Invalid action"}<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>VieFaucet Pro | Earn Crypto</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
    <style>
        * { font-family: 'Inter', sans-serif; }
        body { background: #0A0C10; color: #EAECEF; }
        .glass-card { background: rgba(20,25,35,0.7); backdrop-filter: blur(12px); border: 1px solid rgba(255,255,255,0.08); border-radius: 1.5rem; }
        .glass-panel { background: rgba(30,35,45,0.6); backdrop-filter: blur(10px); border: 1px solid rgba(0,209,255,0.2); }
        .btn-primary { background: linear-gradient(135deg, #00D1FF 0%, #0076FF 100%); transition: all 0.2s; }
        .btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(0,209,255,0.3); }
        .stat-number { font-family: 'JetBrains Mono', monospace; font-size: 1.8rem; font-weight: 700; }
        .sidebar { position: fixed; top: 0; left: -280px; width: 280px; height: 100%; background: #0E1117; border-right: 1px solid #2a2f38; transition: 0.3s; z-index: 1000; overflow-y: auto; }
        .sidebar.open { left: 0; }
        .overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.6); backdrop-filter: blur(5px); z-index: 999; display: none; }
        .overlay.active { display: block; }
        .menu-item { transition: 0.2s; border-left: 3px solid transparent; }
        .menu-item.active { background: rgba(0,209,255,0.1); border-left-color: #00D1FF; color: #00D1FF; }
        .content-page { display: none; animation: fade 0.25s ease; }
        .content-page.active-page { display: block; }
        @keyframes fade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
        .ptc-card { background: #1a1e24; border-radius: 12px; padding: 1rem; text-align: center; border: 1px solid #2a2f38; transition: 0.2s; }
        .ptc-card:hover { transform: translateY(-3px); border-color: #00D1FF; }
        .modal { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.8); backdrop-filter: blur(8px); z-index: 1100; align-items: center; justify-content: center; }
        .modal.active { display: flex; }
        .modal-content { background: #1a1e2a; border-radius: 1.5rem; padding: 2rem; width: 90%; max-width: 420px; border: 1px solid rgba(0,209,255,0.3); }
        .auth-input { background: #0B0E11; border: 1px solid #2a2f38; border-radius: 1rem; padding: 0.75rem 1rem; color: white; width: 100%; }
        .auth-input:focus { outline: none; border-color: #00D1FF; }
        ::-webkit-scrollbar { width: 5px; }
        ::-webkit-scrollbar-track { background: #1a1e2a; }
        ::-webkit-scrollbar-thumb { background: #00D1FF; }
    </style>
</head>
<body>

<!-- LANDING (görünür başlangıç) -->
<div id="landingContainer" class="min-h-screen flex flex-col">
    <div class="flex-1 flex items-center justify-center px-4 py-12">
        <div class="max-w-4xl w-full text-center">
            <div class="text-xs uppercase text-gray-500 mb-2 flex justify-center gap-4"><span>ADVERTISE</span> <span>FANPAGE</span></div>
            <div class="w-16 h-16 bg-gradient-to-br from-cyan-400 to-blue-600 rounded-2xl flex items-center justify-center mx-auto mb-4"><span class="text-black font-black text-3xl">V</span></div>
            <h1 class="text-5xl md:text-6xl font-extrabold">Vie <span class="text-transparent bg-clip-text bg-gradient-to-r from-cyan-400 to-blue-500">Faucet</span></h1>
            <p class="text-gray-300 text-lg mt-3">High paying — Instant payments — Multiple currencies</p>
            <div class="mt-8 flex flex-wrap justify-center gap-4">
                <div class="glass-panel px-6 py-2 rounded-full"><i class="fas fa-bolt text-cyan-400"></i> Direct Withdraw</div>
                <div class="glass-panel px-6 py-2 rounded-full"><i class="fab fa-btc text-amber-400"></i> FaucetPay</div>
                <div class="glass-panel px-6 py-2 rounded-full"><i class="fas fa-wallet text-cyan-400"></i> Wallet</div>
            </div>
            <div class="mt-10 max-w-sm mx-auto space-y-4">
                <button id="googleBtn" class="w-full flex items-center justify-center gap-3 bg-gray-800/80 border border-gray-700 py-3 rounded-xl"><i class="fab fa-google text-red-400"></i> Login with Google</button>
                <div class="relative"><div class="absolute inset-0 flex items-center"><div class="w-full border-t border-gray-700"></div></div><div class="relative flex justify-center text-xs"><span class="bg-[#0A0C10] px-3 text-gray-500">OR</span></div></div>
                <div class="flex gap-3"><button id="showLoginBtn" class="flex-1 btn-primary py-3 rounded-xl font-semibold">Login</button><button id="showRegBtn" class="flex-1 border border-cyan-500/50 py-3 rounded-xl font-semibold hover:bg-cyan-500/10">Register</button></div>
            </div>
        </div>
    </div>
    <div class="w-full bg-[#0E1117]/80 border-t border-gray-800 py-12 px-4">
        <div class="max-w-6xl mx-auto text-center"><h2 class="text-2xl font-bold">Platform Statistics</h2><div class="grid grid-cols-2 md:grid-cols-4 gap-6 mt-6"><div class="glass-card p-6"><i class="fas fa-users text-cyan-400 text-3xl"></i><div class="stat-number" id="statUsers">0</div><div class="text-gray-400">Total Users</div></div><div class="glass-card p-6"><i class="fas fa-coins text-cyan-400 text-3xl"></i><div class="stat-number" id="statPoints">0</div><div class="text-gray-400">Points Given</div></div><div class="glass-card p-6"><i class="fas fa-money-bill-wave text-cyan-400 text-3xl"></i><div class="stat-number" id="statWithdrawn">0</div><div class="text-gray-400">Points Withdrawn</div></div><div class="glass-card p-6"><i class="fas fa-clock text-cyan-400 text-3xl"></i><div class="stat-number" id="statWithdrawals">0</div><div class="text-gray-400">Withdrawals</div></div></div></div>
    </div>
</div>

<!-- LOGIN MODAL -->
<div id="loginModal" class="modal"><div class="modal-content"><div class="flex justify-between items-center mb-4"><h2 class="text-2xl font-bold">Login</h2><button id="closeLoginModal" class="text-gray-400 text-2xl">&times;</button></div><input type="text" id="loginUser" placeholder="Username" class="auth-input mb-3"><input type="password" id="loginPass" placeholder="Password" class="auth-input mb-4"><button id="doLoginBtn" class="btn-primary w-full py-2 rounded-xl">Login</button></div></div>

<!-- REGISTER MODAL -->
<div id="regModal" class="modal"><div class="modal-content"><div class="flex justify-between items-center mb-4"><h2 class="text-2xl font-bold">Register</h2><button id="closeRegModal" class="text-gray-400 text-2xl">&times;</button></div><input type="text" id="regUser" placeholder="Username" class="auth-input mb-3"><input type="password" id="regPass" placeholder="Password" class="auth-input mb-4"><input type="text" id="refCode" placeholder="Referral code (optional)" class="auth-input mb-4"><button id="doRegBtn" class="btn-primary w-full py-2 rounded-xl">Create Account</button></div></div>

<!-- ANA UYGULAMA (giriş yapınca) -->
<div id="appContainer" class="hidden">
    <div id="sidebarOverlay" class="overlay"></div>
    <div id="sidebar" class="sidebar">
        <div class="p-5 border-b border-gray-800 flex justify-between"><div class="flex items-center gap-2"><div class="w-7 h-7 bg-cyan-500 rounded-full flex items-center justify-center text-black font-bold">V</div><span class="font-bold text-xl">Vie<span class="text-cyan-400">Faucet</span></span></div><button id="closeSidebarBtn" class="text-gray-400"><i class="fas fa-times"></i></button></div>
        <div class="py-4"><button data-page="dashboard" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-chart-line w-5"></i> Dashboard</button><button data-page="faucet" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-tint w-5"></i> Faucet</button><button data-page="ptc" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-mouse-pointer w-5"></i> PTC Ads</button><button data-page="withdraw" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-coins w-5"></i> Withdraw</button><button data-page="transactions" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-history w-5"></i> History</button><button data-page="referrals" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-users w-5"></i> Referrals</button><button data-page="leaderboard" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-trophy w-5"></i> Leaderboard</button><button data-page="profile" class="menu-item w-full text-left px-5 py-3 flex gap-3"><i class="fas fa-user-circle w-5"></i> Profile</button><button id="logoutBtn" class="menu-item w-full text-left px-5 py-3 flex gap-3 text-red-400 mt-4"><i class="fas fa-sign-out-alt w-5"></i> Logout</button></div>
    </div>
    <div class="sticky top-0 z-30 bg-[#0A0C10]/90 backdrop-blur-md border-b border-gray-800 py-3 px-5 flex justify-between"><button id="hamburgerBtn" class="text-2xl text-gray-300"><i class="fas fa-bars"></i></button><div class="flex gap-3"><div class="glass-panel px-3 py-1 rounded-full text-sm"><i class="fas fa-coins text-amber-400"></i> <span id="navPoints">0</span> pts</div><div class="w-8 h-8 rounded-full bg-gradient-to-tr from-cyan-500 to-blue-600 flex items-center justify-center">V</div></div></div>
    <div class="max-w-5xl mx-auto p-4 pb-20">
        <!-- Dashboard -->
        <div id="dashboardPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-3"><i class="fas fa-home text-cyan-400"></i> Dashboard</h2><div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-5"><div class="bg-gray-800/30 p-3 rounded-xl text-center"><i class="fas fa-users text-cyan-400"></i><div class="text-xl font-bold" id="dashUsers">0</div><div class="text-xs">Users</div></div><div class="bg-gray-800/30 p-3 rounded-xl text-center"><i class="fas fa-coins text-cyan-400"></i><div class="text-xl font-bold" id="dashPoints">0</div><div class="text-xs">Points given</div></div><div class="bg-gray-800/30 p-3 rounded-xl text-center"><i class="fas fa-money-bill-wave text-cyan-400"></i><div class="text-xl font-bold" id="dashWithdrawn">0</div><div class="text-xs">Withdrawn</div></div><div class="bg-gray-800/30 p-3 rounded-xl text-center"><i class="fas fa-gift text-cyan-400"></i><div class="text-xl font-bold" id="dashBonusStreak">0</div><div class="text-xs">Daily streak</div></div></div><div class="grid md:grid-cols-2 gap-3"><div class="bg-gray-800/40 p-3 rounded-xl"><i class="fas fa-shield-alt text-cyan-400"></i> <strong>Security</strong><br><span class="text-gray-300">All data encrypted. Captcha protected.</span></div><div class="bg-gray-800/40 p-3 rounded-xl"><i class="fas fa-tasks text-cyan-400"></i> <strong>How to earn</strong><br><span class="text-gray-300">Faucet (+10/60s) · PTC (+5/30s) · Daily bonus · Shortlinks</span></div></div></div></div>
        <!-- Faucet -->
        <div id="faucetPage" class="content-page"><div class="glass-card p-6 text-center"><i class="fas fa-tint text-5xl text-cyan-400"></i><h2 class="text-2xl font-bold mt-2">Faucet</h2><p class="text-gray-400">Claim every 60 seconds → +10 points</p><div class="text-5xl font-mono font-bold my-4 text-cyan-400" id="faucetTimer">00:00</div><div class="g-recaptcha" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI" data-callback="onCaptchaSuccess"></div><button id="faucetClaimBtn" class="btn-primary w-full mt-4 py-3 rounded-xl font-semibold disabled:opacity-50" disabled>Claim Now</button></div></div>
        <!-- PTC -->
        <div id="ptcPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-3"><i class="fas fa-ad text-cyan-400"></i> PTC Ads</h2><div id="ptcGrid" class="grid grid-cols-1 md:grid-cols-3 gap-4"></div></div></div>
        <!-- Withdraw -->
        <div id="withdrawPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-4"><i class="fas fa-exchange-alt text-cyan-400"></i> Withdraw (Multi-Coin)</h2><div class="grid md:grid-cols-2 gap-4"><div><label class="text-sm">Coin</label><select id="coinSelect" class="w-full bg-gray-800 border border-gray-700 rounded-xl px-3 py-2"><option value="BTC">Bitcoin</option><option value="LTC">Litecoin</option><option value="DOGE">Dogecoin</option><option value="SHIB">Shiba Inu</option><option value="SOL">Solana</option></select><div class="text-xs text-gray-500 mt-1" id="rateHint"></div></div><div><label class="text-sm">Points</label><input type="number" id="withdrawAmount" min="100" value="100" class="w-full bg-gray-800 border border-gray-700 rounded-xl px-3 py-2"><div class="text-sm mt-1">You get: <span id="coinPreview" class="font-mono text-cyan-400">0</span></div></div></div><button id="withdrawBtn" class="btn-primary w-full mt-5 py-3 rounded-xl">Request Withdrawal</button><div id="withdrawMsg" class="text-center text-sm mt-3"></div></div></div>
        <!-- Transactions -->
        <div id="transactionsPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-3"><i class="fas fa-history text-cyan-400"></i> Transaction History</h2><div class="overflow-x-auto"><table class="w-full text-sm"><thead class="border-b border-gray-700"><tr><th>Date</th><th>Type</th><th>Amount</th><th>Description</th></thead><tbody id="txTable"></tbody></table></div></div></div>
        <!-- Referrals -->
        <div id="referralsPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-3"><i class="fas fa-users text-cyan-400"></i> Referral Program</h2><p><strong>Your referral link:</strong> <span id="refLink" class="text-cyan-400 break-all"></span></p><p><strong>Referred users:</strong> <span id="refCount">0</span></p><p><strong>Total commission earned:</strong> <span id="refEarned">0</span> points</p><div id="refList"></div></div></div>
        <!-- Leaderboard -->
        <div id="leaderboardPage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-3"><i class="fas fa-trophy text-cyan-400"></i> Leaderboard</h2><div class="overflow-x-auto"><table class="w-full"><thead><tr><th>#</th><th>User</th><th>Points</th></tr></thead><tbody id="leaderboardBody"></tbody></table></div></div></div>
        <!-- Profile -->
        <div id="profilePage" class="content-page"><div class="glass-card p-5"><h2 class="text-xl font-bold mb-4"><i class="fas fa-user-circle text-cyan-400"></i> Profile</h2><div class="flex flex-col items-center"><div class="w-20 h-20 rounded-full bg-gradient-to-br from-cyan-500 to-blue-600 flex items-center justify-center text-3xl font-bold mb-3" id="avatar">V</div><div class="flex gap-2"><input type="text" id="profileUsername" class="bg-gray-800 border border-gray-700 rounded-xl px-3 py-2 text-center"><button id="updateProfileBtn" class="bg-cyan-600 px-4 rounded-xl">Save</button></div></div><div class="grid grid-cols-2 gap-3 mt-5 text-center"><div class="bg-gray-800/30 p-3 rounded-xl"><div class="text-xs">Balance</div><div class="text-2xl font-bold text-cyan-400" id="profilePoints">0</div></div><div class="bg-gray-800/30 p-3 rounded-xl"><div class="text-xs">Total Earned</div><div class="text-2xl font-bold" id="profileTotal">0</div></div><div class="col-span-2 bg-gray-800/30 p-3 rounded-xl"><div class="text-xs">Member since</div><div id="profileDate" class="text-sm">—</div></div></div></div></div>
    </div>
</div>

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
let currentUser = null;
let captchaToken = null;
function onCaptchaSuccess(token) { captchaToken = token; $('#faucetClaimBtn').prop('disabled', false); }
function checkLogin() { $.get('/save.php?action=user', (data) => { if(data.success) { currentUser = data.user; $('#landingContainer').hide(); $('#appContainer').show(); loadDashboard(); loadPoints(); startFaucetTimer(); loadPtc(); loadTransactions(); loadReferrals(); loadLeaderboard(); } else { $('#landingContainer').show(); $('#appContainer').hide(); } }).fail(()=>{ $('#landingContainer').show(); $('#appContainer').hide(); }); }
function loadPoints() { $.get('/save.php?action=user', (data) => { if(data.success) { $('#navPoints').text(data.user.points); $('#profilePoints').text(data.user.points); $('#profileTotal').text(data.user.total_earned); $('#profileDate').text(new Date(data.user.join_date).toLocaleDateString()); $('#avatar').text(data.user.username.charAt(0).toUpperCase()); $('#profileUsername').val(data.user.username); $('#dashBonusStreak').text(data.user.daily_streak || 0); } }); }
function loadDashboard() { $.get('/save.php?action=stats', (data) => { $('#dashUsers').text(data.totalUsers); $('#dashPoints').text(data.totalPoints); $('#dashWithdrawn').text(data.totalWithdrawn); $('#statUsers').text(data.totalUsers); $('#statPoints').text(data.totalPoints); $('#statWithdrawn').text(data.totalWithdrawn); $('#statWithdrawals').text(data.withdrawalCount); }); }
function startFaucetTimer() { setInterval(() => { $.get('/save.php?action=faucet-status', (data) => { if(data.remaining <= 0) { $('#faucetTimer').text('00:00'); } else { let mins = Math.floor(data.remaining/60); let secs = data.remaining%60; $('#faucetTimer').text(`${mins.toString().padStart(2,'0')}:${secs.toString().padStart(2,'0')}`); } }); }, 1000); }
function loadPtc() { $.get('/save.php?action=ptc-ads', (data) => { let html = ''; data.ads.forEach(ad => { let rem = ad.remaining; let canClick = rem <= 0; html += `<div class="ptc-card"><div class="font-bold text-lg">${ad.name}</div><div class="text-xs text-gray-500">${ad.sub}</div><p class="text-sm my-2">${ad.desc}</p><div class="flex justify-center gap-2 my-2"><span class="bg-cyan-500/20 px-2 py-1 rounded-full">+5 pts</span><span class="bg-yellow-500/20 px-2 py-1 rounded-full" id="time_${ad.id}">${canClick ? 'Ready' : rem+'s'}</span></div><button data-id="${ad.id}" class="ptc-click w-full bg-indigo-600 py-2 rounded-lg text-sm" ${!canClick ? 'disabled' : ''}>View Ad</button></div>`; }); $('#ptcGrid').html(html); $('.ptc-click').click(function(){ let adId = $(this).data('id'); $.post('/save.php', {action:'ptc_click', ad_id:adId}, (res) => { if(res.success) { toast('+5 points'); loadPoints(); loadPtc(); } else toast(res.error, true); }).fail(()=>toast('Error',true)); }); setInterval(() => { loadPtc(); }, 2000); }); }
function loadTransactions() { $.get('/save.php?action=transactions', (data) => { let rows = ''; data.forEach(tx => { rows += `<tr><td class="py-2">${new Date(tx.created_at).toLocaleString()}</td><td>${tx.type}</td><td class="${tx.amount>0?'text-green-400':'text-red-400'}">${tx.amount>0?'+':''}${tx.amount}</td><td>${tx.description}</td></tr>`; }); $('#txTable').html(rows); }); }
function loadReferrals() { $.get('/save.php?action=referrals', (data) => { $('#refLink').text(window.location.origin+'/?ref='+data.referralCode); $('#refCount').text(data.count); $('#refEarned').text(data.earned); let list = ''; data.users.forEach(u => { list += `<div class="text-sm">${u.username} joined ${new Date(u.join_date).toLocaleDateString()}</div>`; }); $('#refList').html(list); }); }
function loadLeaderboard() { $.get('/save.php?action=leaderboard', (data) => { let rows = ''; data.forEach((u,i) => { rows += `<tr class="border-b border-gray-800"><td class="py-2">${i+1}</td><td>${u.username}</td><td class="text-right">${u.points}</td></tr>`; }); $('#leaderboardBody').html(rows); }); }
function toast(msg, isErr=false) { let div = $('<div class="fixed bottom-5 right-5 z-50 px-4 py-2 rounded-lg text-white text-sm '+ (isErr ? 'bg-red-600' : 'bg-cyan-600') +'">'+msg+'</div>'); $('body').append(div); setTimeout(()=>div.remove(),3000); }
// Daily bonus
function claimDailyBonus() { $.post('/save.php', {action:'daily_bonus'}, (res) => { if(res.success) toast(`Daily bonus: +${res.bonus} points (streak ${res.streak})`); else toast(res.message || 'Already claimed', true); loadPoints(); loadDashboard(); }); }
// Shortlink
function shortlink() { $.post('/save.php', {action:'shortlink'}, (res) => { if(res.success) toast('+2 points from shortlink'); else toast(res.error, true); loadPoints(); }); }
// Withdraw
$('#withdrawBtn').click(() => { let coin = $('#coinSelect').val(); let points = parseInt($('#withdrawAmount').val()); if(points<100) { toast('Minimum 100 points', true); return; } $.post('/save.php', {action:'withdraw', coin:coin, points:points}, (res) => { if(res.success) { toast('Request submitted, pending admin approval'); loadPoints(); $('#withdrawMsg').html('<span class="text-green-400">✅ Request sent</span>'); setTimeout(()=>$('#withdrawMsg').html(''),3000); } else toast(res.error, true); }); });
$('#faucetClaimBtn').click(() => { if(!captchaToken) { toast('Complete captcha', true); return; } $.post('/save.php', {action:'faucet_claim', captcha:captchaToken}, (res) => { if(res.success) { toast('+10 points'); grecaptcha.reset(); captchaToken=null; $('#faucetClaimBtn').prop('disabled', true); loadPoints(); loadDashboard(); } else toast(res.error, true); }); });
// Update profile
$('#updateProfileBtn').click(() => { let newName = $('#profileUsername').val().trim(); if(!newName) return; $.post('/save.php', {action:'update_profile', username:newName}, (res) => { if(res.success) toast('Username updated'); else toast(res.error, true); loadPoints(); }); });
// Daily bonus button (add to dashboard)
$('#dashBonusStreak').parent().append('<button id="dailyBonusBtn" class="mt-2 btn-primary px-2 py-1 rounded text-xs">Claim Daily Bonus</button>');
$(document).on('click','#dailyBonusBtn', claimDailyBonus);
// Shortlink button (add to faucet page)
$('#faucetPage .glass-card').append('<button id="shortlinkBtn" class="btn-primary w-full mt-2 py-2 rounded-xl">📎 Earn 2 points (Shortlink)</button>');
$(document).on('click','#shortlinkBtn', shortlink);
// Auth modals
$('#showLoginBtn').click(()=>$('#loginModal').addClass('active'));
$('#showRegBtn').click(()=>$('#regModal').addClass('active'));
$('#closeLoginModal, #closeRegModal').click(function(){ $(this).closest('.modal').removeClass('active'); });
$('#doLoginBtn').click(()=>{ let u=$('#loginUser').val(), p=$('#loginPass').val(); $.post('/save.php', {action:'login', username:u, password:p}, (res)=>{ if(res.success) { $('#loginModal').removeClass('active'); checkLogin(); } else toast('Invalid', true); }); });
$('#doRegBtn').click(()=>{ let u=$('#regUser').val(), p=$('#regPass').val(), ref=$('#refCode').val(); $.post('/save.php', {action:'register', username:u, password:p, ref:ref}, (res)=>{ if(res.success) { toast('Registered! Please login'); $('#regModal').removeClass('active'); $('#loginUser').val(u); $('#loginPass').val(p); $('#loginModal').addClass('active'); } else toast(res.error, true); }); });
$('#logoutBtn').click(()=>{ $.post('/save.php', {action:'logout'}, ()=>{ location.reload(); }); });
// Sidebar
$('#hamburgerBtn').click(()=>{ $('#sidebar').addClass('open'); $('#sidebarOverlay').addClass('active'); });
$('#closeSidebarBtn, #sidebarOverlay').click(()=>{ $('#sidebar').removeClass('open'); $('#sidebarOverlay').removeClass('active'); });
$('.menu-item[data-page]').click(function(){ let page=$(this).data('page'); $('.content-page').removeClass('active-page'); $(`#${page}Page`).addClass('active-page'); $('.menu-item').removeClass('active'); $(this).addClass('active'); $('#sidebar').removeClass('open'); $('#sidebarOverlay').removeClass('active'); if(page=='ptc') loadPtc(); if(page=='transactions') loadTransactions(); if(page=='referrals') loadReferrals(); if(page=='leaderboard') loadLeaderboard(); });
// coin preview
$('#coinSelect, #withdrawAmount').on('input change', function(){ let coin=$('#coinSelect').val(); let rates={BTC:0.00000012,LTC:0.0000025,DOGE:0.25,SHIB:120,SOL:0.000008}; let pts=$('#withdrawAmount').val(); let amount=pts*rates[coin]; if(coin=='SHIB') amount=Math.floor(amount); else amount=amount.toFixed(8); $('#coinPreview').text(amount+' '+coin); $('#rateHint').text('1 point = '+rates[coin]+' '+coin); });
$('#googleBtn').click(()=>toast('Demo: Google OAuth not implemented', true));
$(document).ready(()=>{ checkLogin(); setInterval(()=>{ if($('#appContainer').is(':visible')) { loadPoints(); loadDashboard(); } }, 15000); });
</script>
</body>
</html>