Files
html/youtube-factory.html

706 lines
54 KiB
HTML

<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>WEVADS - YouTube Factory</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6;--yt:#ff0000}
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:12px}
.mono{font-family:'JetBrains Mono',monospace}
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:14px 20px;display:flex;justify-content:space-between;align-items:center}
.hdr h1{font-size:18px;font-weight:700;margin-left:80px}.hdr h1 span{color:var(--rd)}
.wrap{padding:16px 20px;max-width:1500px;margin:0 auto}
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:16px}
.sc{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;text-align:center;cursor:pointer;transition:all .2s}
.sc:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.3);border-color:var(--rd)}
.sc .n{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700}.sc .l{font-size:9px;text-transform:uppercase;color:var(--d);margin-top:4px}.sc .delta{font-size:9px;margin-top:3px}
.g2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
.cd{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px}
table{width:100%;border-collapse:collapse;font-size:11px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-cy{background:rgba(34,211,238,.15);color:var(--cy)}.badge-pu{background:rgba(167,139,250,.15);color:var(--pu)}.badge-yt{background:rgba(255,0,0,.12);color:var(--rd)}
.btn{padding:8px 16px;border-radius:6px;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;font-size:10px;font-weight:600;transition:all .2s;text-decoration:none}.btn:hover{border-color:var(--rd);transform:translateY(-1px)}
.btn-yt{background:rgba(255,0,0,.12);border-color:var(--rd);color:var(--rd)}
.tabs{display:flex;gap:2px;margin-bottom:14px;border-bottom:1px solid var(--b)}.tab{padding:8px 16px;cursor:pointer;font-size:10px;font-weight:600;text-transform:uppercase;color:var(--d);border-bottom:2px solid transparent}.tab:hover{color:var(--t)}.tab.active{color:var(--rd);border-color:var(--rd)}
.panel{display:none}.panel.active{display:block}
.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);z-index:9999;justify-content:center;align-items:center}.modal-box{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:20px;max-width:950px;width:92%;max-height:82vh;overflow-y:auto}
.channel-card{background:var(--s2);border:1px solid var(--b);border-radius:10px;padding:14px;margin-bottom:10px;display:flex;align-items:center;gap:14px;cursor:pointer;transition:all .2s}
.channel-card:hover{border-color:var(--rd);transform:translateX(4px)}
.channel-card .icon{font-size:28px;width:44px;text-align:center}
.channel-card .info{flex:1}.channel-card .info .name{font-weight:700;font-size:13px}.channel-card .info .meta{font-size:10px;color:var(--d);margin-top:2px}
.channel-card .stats-row{display:flex;gap:14px;font-family:'JetBrains Mono',monospace;font-size:11px}
.channel-card .stats-row span{display:flex;flex-direction:column;align-items:center}.channel-card .stats-row .v{font-weight:700;font-size:14px}.channel-card .stats-row .k{font-size:8px;color:var(--d);text-transform:uppercase}
.bar{height:8px;border-radius:4px;background:var(--s2);overflow:hidden}.bar-fill{height:100%;border-radius:4px}
@media(max-width:900px){.stats{grid-template-columns:repeat(3,1fr)}.g2,.g3{grid-template-columns:1fr}}
</style>
<link rel="stylesheet" href="wevads-global.css?v1770777318">
</head><body>
<div class="hdr"><div><h1>▶️ <span>YouTube Factory</span></h1><div style="color:var(--d);font-size:11px;margin-top:4px">Channel management — video pipeline — ad revenue — affiliate tracking — audience growth</div></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-yt">▶ YOUTUBE</span><a href="menu.html" class="btn">Menu</a><a href="operations-overview.html" class="btn">← Overview</a></div></div>
<div class="wrap">
<!-- KPIs -->
<div class="stats">
<div class="sc" onclick="drill('channels')"><div class="n" style="color:var(--rd)">7</div><div class="l">Channels ▼</div><div class="delta">5 niches</div></div>
<div class="sc" onclick="drill('subs')"><div class="n" style="color:var(--am)">58,800</div><div class="l">Subscribers ▼</div><div class="delta" style="color:var(--gn)">total subs</div></div>
<div class="sc" onclick="drill('views')"><div class="n" style="color:var(--cy)">4,030,000</div><div class="l">Total Views ▼</div><div class="delta">325,400 video views</div></div>
<div class="sc" onclick="drill('videos')"><div class="n" style="color:var(--bl)">10</div><div class="l">Videos ▼</div><div class="delta">published</div></div>
<div class="sc" onclick="drill('revenue')"><div class="n" style="color:var(--gn)">$2,820</div><div class="l">Total Revenue ▼</div><div class="delta">$736 ad + $2,084 aff</div></div>
<div class="sc" onclick="drill('monthly')"><div class="n" style="color:var(--pk)">$8,480</div><div class="l">Monthly Rev ▼</div><div class="delta">from channels</div></div>
</div>
<!-- TABS -->
<div class="tabs">
<div class="tab active" onclick="showTab('channels')">▶ Channels</div>
<div class="tab" onclick="showTab('videos')">🎬 Videos</div>
<div class="tab" onclick="showTab('revenue')">💰 Revenue</div>
<div class="tab" onclick="showTab('actions')">⚡ Actions</div>
</div>
<!-- CHANNELS -->
<div class="panel active" id="tab-channels">
<div class="channel-card" onclick="drillChannel(4)">
<div class="icon">🇫🇷</div>
<div class="info">
<div class="name">Finance Facile FR</div>
<div class="meta">finance · FR · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">18,500</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">1,450,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">210</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$2,800</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(1)">
<div class="icon">🇫🇷</div>
<div class="info">
<div class="name">WEVADS Assurance FR [DEMO]</div>
<div class="meta">insurance · FR · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">12,400</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">890,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">145</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$1,850</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(6)">
<div class="icon">🇫🇷</div>
<div class="info">
<div class="name">Mutuelle Sante Tips</div>
<div class="meta">health · FR · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">9,800</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">680,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">120</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$1,500</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(2)">
<div class="icon">🇩🇪</div>
<div class="info">
<div class="name">WEVADS Vergleich DE [DEMO]</div>
<div class="meta">insurance · DE · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">8,200</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">520,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">98</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$1,200</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(3)">
<div class="icon">🇬🇧</div>
<div class="info">
<div class="name">WEVADS Insurance EN [DEMO]</div>
<div class="meta">insurance · EN · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">5,600</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">310,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">72</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$680</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(5)">
<div class="icon">🇩🇪</div>
<div class="info">
<div class="name">Energie Sparen DE</div>
<div class="meta">energy · DE · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">4,300</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">180,000</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">45</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$450</span><span class="k">$/mo</span></span>
</div>
</div>
<div class="channel-card" onclick="drillChannel(7)">
<div class="icon">🇫🇷</div>
<div class="info">
<div class="name">WEVADS</div>
<div class="meta"> · FR · <span class="badge badge-gn">ACTIVE</span></div>
</div>
<div class="stats-row">
<span><span class="v" style="color:var(--am)">0</span><span class="k">Subs</span></span>
<span><span class="v" style="color:var(--cy)">0</span><span class="k">Views</span></span>
<span><span class="v" style="color:var(--bl)">0</span><span class="k">Vids</span></span>
<span><span class="v" style="color:var(--gn)">$0</span><span class="k">$/mo</span></span>
</div>
</div>
</div>
<!-- VIDEOS -->
<div class="panel" id="tab-videos">
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--bl)">🎬 Published Videos</h3>
<table><thead><tr><th>Title</th><th>Channel</th><th>Views</th><th>Likes</th><th>Comments</th><th>Ad Rev</th><th>Aff Rev</th><th>Total</th><th>Date</th></tr></thead><tbody>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Investir en Bourse: Guide Debutant</td>
<td style="font-size:10px">Finance Facile FR</td>
<td class="mono" style="color:var(--cy)">52,000</td>
<td class="mono">2,080</td>
<td class="mono">312</td>
<td class="mono" style="color:var(--am)">$125.00</td>
<td class="mono" style="color:var(--gn)">$380.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$505.00</td>
<td style="font-size:10px;color:var(--d)">2026-02-09</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Comment Choisir Son Assurance Auto en 2026</td>
<td style="font-size:10px">WEVADS Assurance FR [DEMO]</td>
<td class="mono" style="color:var(--cy)">45,200</td>
<td class="mono">1,820</td>
<td class="mono">234</td>
<td class="mono" style="color:var(--am)">$89.50</td>
<td class="mono" style="color:var(--gn)">$245.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$334.50</td>
<td style="font-size:10px;color:var(--d)">2026-02-08</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Les Meilleurs Livrets 2026</td>
<td style="font-size:10px">Finance Facile FR</td>
<td class="mono" style="color:var(--cy)">41,000</td>
<td class="mono">1,640</td>
<td class="mono">205</td>
<td class="mono" style="color:var(--am)">$98.00</td>
<td class="mono" style="color:var(--gn)">$290.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$388.00</td>
<td style="font-size:10px;color:var(--d)">2026-02-07</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Top 5 Mutuelles Santé Pas Cher</td>
<td style="font-size:10px">WEVADS Assurance FR [DEMO]</td>
<td class="mono" style="color:var(--cy)">38,400</td>
<td class="mono">1,540</td>
<td class="mono">189</td>
<td class="mono" style="color:var(--am)">$72.30</td>
<td class="mono" style="color:var(--gn)">$198.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$270.30</td>
<td style="font-size:10px;color:var(--d)">2026-02-06</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Quelle Mutuelle Choisir Apres 50 Ans</td>
<td style="font-size:10px">Mutuelle Sante Tips</td>
<td class="mono" style="color:var(--cy)">35,600</td>
<td class="mono">1,424</td>
<td class="mono">178</td>
<td class="mono" style="color:var(--am)">$82.00</td>
<td class="mono" style="color:var(--gn)">$210.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$292.00</td>
<td style="font-size:10px;color:var(--d)">2026-02-08</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Strom Vergleich: 500 EUR Sparen</td>
<td style="font-size:10px">WEVADS Vergleich DE [DEMO]</td>
<td class="mono" style="color:var(--cy)">31,500</td>
<td class="mono">1,260</td>
<td class="mono">156</td>
<td class="mono" style="color:var(--am)">$78.40</td>
<td class="mono" style="color:var(--gn)">$220.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$298.40</td>
<td style="font-size:10px;color:var(--d)">2026-02-05</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Assurance Habitation: Les Pieges a Eviter</td>
<td style="font-size:10px">WEVADS Assurance FR [DEMO]</td>
<td class="mono" style="color:var(--cy)">28,900</td>
<td class="mono">1,156</td>
<td class="mono">145</td>
<td class="mono" style="color:var(--am)">$54.80</td>
<td class="mono" style="color:var(--gn)">$156.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$210.80</td>
<td style="font-size:10px;color:var(--d)">2026-02-04</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Kfz Versicherung Vergleich 2026</td>
<td style="font-size:10px">WEVADS Vergleich DE [DEMO]</td>
<td class="mono" style="color:var(--cy)">22,100</td>
<td class="mono">884</td>
<td class="mono">98</td>
<td class="mono" style="color:var(--am)">$65.20</td>
<td class="mono" style="color:var(--gn)">$180.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$245.20</td>
<td style="font-size:10px;color:var(--d)">2026-02-07</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Best Car Insurance UK 2026</td>
<td style="font-size:10px">WEVADS Insurance EN [DEMO]</td>
<td class="mono" style="color:var(--cy)">18,200</td>
<td class="mono">728</td>
<td class="mono">87</td>
<td class="mono" style="color:var(--am)">$42.50</td>
<td class="mono" style="color:var(--gn)">$120.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$162.50</td>
<td style="font-size:10px;color:var(--d)">2026-02-07</td>
</tr>
<tr>
<td style="font-weight:600;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">Stromanbieterwechsel Schritt fuer Schritt</td>
<td style="font-size:10px">Energie Sparen DE</td>
<td class="mono" style="color:var(--cy)">12,500</td>
<td class="mono">500</td>
<td class="mono">62</td>
<td class="mono" style="color:var(--am)">$28.00</td>
<td class="mono" style="color:var(--gn)">$85.00</td>
<td class="mono" style="color:var(--pk);font-weight:700">$113.00</td>
<td style="font-size:10px;color:var(--d)">2026-02-06</td>
</tr>
</tbody></table>
</div>
</div>
<!-- REVENUE -->
<div class="panel" id="tab-revenue">
<div class="g2">
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--gn)">💰 Revenue Breakdown</h3>
<table><thead><tr><th>Source</th><th>Amount</th><th>%</th></tr></thead><tbody>
<tr><td style="font-weight:600">📺 Ad Revenue</td><td class="mono" style="color:var(--am)">$735.70</td><td>26.1%</td></tr>
<tr><td style="font-weight:600">🔗 Affiliate Revenue</td><td class="mono" style="color:var(--gn)">$2,084.00</td><td>73.9%</td></tr>
<tr style="font-weight:700;border-top:2px solid var(--b)"><td>Total</td><td class="mono" style="color:var(--pk)">$2,819.70</td><td>100%</td></tr>
</tbody></table>
</div>
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--am)">📊 Revenue by Niche</h3>
<table><thead><tr><th>Niche</th><th>Channels</th><th>Subs</th><th>Monthly Rev</th></tr></thead><tbody>
<tr><td style="font-weight:600">insurance</td><td class="mono">3</td><td class="mono">26,200</td><td class="mono" style="color:var(--gn)">$3,730/mo</td></tr>
<tr><td style="font-weight:600">finance</td><td class="mono">1</td><td class="mono">18,500</td><td class="mono" style="color:var(--gn)">$2,800/mo</td></tr>
<tr><td style="font-weight:600">health</td><td class="mono">1</td><td class="mono">9,800</td><td class="mono" style="color:var(--gn)">$1,500/mo</td></tr>
<tr><td style="font-weight:600">energy</td><td class="mono">1</td><td class="mono">4,300</td><td class="mono" style="color:var(--gn)">$450/mo</td></tr>
<tr><td style="font-weight:600"></td><td class="mono">1</td><td class="mono">0</td><td class="mono" style="color:var(--gn)">$0/mo</td></tr>
</tbody></table>
</div>
</div>
<div class="cd" style="margin-top:12px">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--bl)">🌍 Revenue by Language</h3>
<table><thead><tr><th>Language</th><th>Channels</th><th>Subs</th></tr></thead><tbody>
<tr><td style="font-weight:600">🇫🇷 FR</td><td class="mono">4</td><td class="mono">40,700</td></tr>
<tr><td style="font-weight:600">🇩🇪 DE</td><td class="mono">2</td><td class="mono">12,500</td></tr>
<tr><td style="font-weight:600">🇬🇧 EN</td><td class="mono">1</td><td class="mono">5,600</td></tr>
</tbody></table>
</div>
</div>
<!-- ACTIONS -->
<div class="panel" id="tab-actions">
<div class="g3">
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--rd)">▶ New Channel</h3>
<div style="margin-bottom:8px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Channel Name</label><input id="ch_name" type="text" placeholder="WEVADS Finance FR" style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px"></div>
<div style="margin-bottom:8px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Niche</label><select id="ch_niche" style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px"><option>insurance</option><option>finance</option><option>health</option><option>tech</option><option>crypto</option></select></div>
<div style="margin-bottom:10px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Language</label><select id="ch_lang" style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px"><option value="fr">🇫🇷 FR</option><option value="de">🇩🇪 DE</option><option value="en">🇬🇧 EN</option><option value="es">🇪🇸 ES</option></select></div>
<button class="btn btn-yt" style="width:100%;padding:10px" onclick="createChannel()">▶ Create Channel</button>
</div>
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--bl)">🎬 New Video</h3>
<div style="margin-bottom:8px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Channel</label><select id="vid_ch" style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px"><option value="4">Finance Facile FR</option><option value="1">WEVADS Assurance FR [DEMO]</option><option value="6">Mutuelle Sante Tips</option><option value="2">WEVADS Vergleich DE [DEMO]</option><option value="3">WEVADS Insurance EN [DEMO]</option><option value="5">Energie Sparen DE</option><option value="7">WEVADS</option></select></div>
<div style="margin-bottom:8px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Title</label><input id="vid_title" type="text" placeholder="Top 5 Insurance Tips" style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px"></div>
<div style="margin-bottom:10px"><label style="font-size:9px;color:var(--d);text-transform:uppercase;display:block;margin-bottom:3px">Description</label><textarea id="vid_desc" rows="2" placeholder="Description..." style="width:100%;padding:8px;background:var(--s2);border:1px solid var(--b);border-radius:6px;color:var(--t);font-size:11px;resize:none"></textarea></div>
<button class="btn" style="width:100%;padding:10px;background:rgba(96,165,250,.12);border-color:var(--bl);color:var(--bl)" onclick="createVideo()">🎬 Create Video</button>
</div>
<div class="cd">
<h3 style="font-size:13px;margin-bottom:10px;color:var(--gn)">📊 Quick Stats</h3>
<table><thead><tr><th>Metric</th><th>Value</th></tr></thead><tbody>
<tr><td>Active Channels</td><td class="mono" style="color:var(--rd)">7</td></tr>
<tr><td>Published Videos</td><td class="mono">10</td></tr>
<tr><td>Total Subscribers</td><td class="mono" style="color:var(--am)">58,800</td></tr>
<tr><td>Total Views</td><td class="mono" style="color:var(--cy)">4,030,000</td></tr>
<tr><td>Ad Revenue</td><td class="mono" style="color:var(--am)">$735.70</td></tr>
<tr><td>Affiliate Revenue</td><td class="mono" style="color:var(--gn)">$2,084.00</td></tr>
<tr><td>Monthly Channel Rev</td><td class="mono" style="color:var(--pk)">$8,480/mo</td></tr>
</tbody></table>
</div>
</div>
</div>
</div>
<!-- DRILL MODAL -->
<div class="modal" id="drillModal" onclick="if(event.target===this)this.style.display='none'"><div class="modal-box"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px"><h3 id="drillTitle" style="font-size:14px;color:var(--rd)"></h3><button onclick="document.getElementById('drillModal').style.display='none'" style="background:none;border:none;color:var(--rd);font-size:18px;cursor:pointer"></button></div><div id="drillContent" style="font-size:11px"></div></div></div>
<script>
var YT_API='/api/youtube-channels.php';
function showTab(id){document.querySelectorAll('.tab').forEach(function(t){t.classList.remove('active')});document.querySelectorAll('.panel').forEach(function(p){p.classList.remove('active')});document.getElementById('tab-'+id).classList.add('active');event.target.classList.add('active')}
async function drill(type){
var m=document.getElementById('drillModal'),tt=document.getElementById('drillTitle'),ct=document.getElementById('drillContent');
m.style.display='flex';ct.innerHTML='<div style="text-align:center;padding:40px;color:var(--d)">Loading...<\/div>';
try{
var r=await fetch(YT_API+'?action=dashboard');
var d=await r.json();
var html='';
var tot=d.totals||{};var vtot=d.video_totals||{};
html+='<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px">';
html+='<div class="cd" style="text-align:center"><div style="font-size:18px;font-weight:700;color:var(--rd)">'+(tot.channels||0)+'<\/div><div class="l">Channels<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:18px;font-weight:700;color:var(--am)">'+Number(tot.subs||0).toLocaleString()+'<\/div><div class="l">Subscribers<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:18px;font-weight:700;color:var(--cy)">'+Number(tot.views||0).toLocaleString()+'<\/div><div class="l">Views<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:18px;font-weight:700;color:var(--gn)">$'+Number((parseFloat(vtot.ad_rev||0)+parseFloat(vtot.aff_rev||0)).toFixed(0)).toLocaleString()+'<\/div><div class="l">Revenue<\/div><\/div><\/div>';
if(type==='channels'||type==='subs'){
tt.textContent='▶ YouTube Channels';
html+='<table><thead><tr><th>Channel<\/th><th>Niche<\/th><th>Lang<\/th><th>Subs<\/th><th>Views<\/th><th>Videos<\/th><th>$/mo<\/th><th>Status<\/th><\/tr><\/thead><tbody>';
(d.channels||[]).forEach(function(c){
html+='<tr><td style="font-weight:600">'+c.channel_name+'<\/td><td>'+c.niche+'<\/td><td>'+c.language.toUpperCase()+'<\/td><td class="mono" style="color:var(--am)">'+Number(c.subscribers).toLocaleString()+'<\/td><td class="mono">'+Number(c.total_views).toLocaleString()+'<\/td><td class="mono">'+c.videos_count+'<\/td><td class="mono" style="color:var(--gn)">$'+Number(c.monthly_revenue).toLocaleString()+'<\/td><td><span class="badge badge-'+(c.status==='active'?'gn':'rd')+'">'+c.status.toUpperCase()+'<\/span><\/td><\/tr>';
});
html+='<\/tbody><\/table>';
} else if(type==='videos'||type==='views'){
tt.textContent='🎬 Videos Performance';
html+='<table><thead><tr><th>Title<\/th><th>Channel<\/th><th>Views<\/th><th>Likes<\/th><th>Ad $<\/th><th>Aff $<\/th><th>Total<\/th><\/tr><\/thead><tbody>';
(d.videos||[]).forEach(function(v){
var t=parseFloat(v.ad_revenue||0)+parseFloat(v.affiliate_revenue||0);
html+='<tr><td style="font-weight:600;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+v.title+'<\/td><td style="font-size:10px">'+v.channel_name+'<\/td><td class="mono" style="color:var(--cy)">'+Number(v.views).toLocaleString()+'<\/td><td class="mono">'+Number(v.likes).toLocaleString()+'<\/td><td class="mono" style="color:var(--am)">$'+(+v.ad_revenue||0).toFixed(2)+'<\/td><td class="mono" style="color:var(--gn)">$'+(+v.affiliate_revenue||0).toFixed(2)+'<\/td><td class="mono" style="color:var(--pk);font-weight:700">$'+t.toFixed(2)+'<\/td><\/tr>';
});
html+='<\/tbody><\/table>';
} else if(type==='revenue'||type==='monthly'){
tt.textContent='💰 Revenue Analysis';
var adR=parseFloat(vtot.ad_rev||0);var affR=parseFloat(vtot.aff_rev||0);var totalR=adR+affR;
html+='<div class="g2" style="margin-bottom:12px"><div class="cd" style="text-align:center"><div style="font-size:24px;font-weight:700;color:var(--am)">$'+adR.toFixed(2)+'<\/div><div class="l">Ad Revenue<\/div><\/div><div class="cd" style="text-align:center"><div style="font-size:24px;font-weight:700;color:var(--gn)">$'+affR.toFixed(2)+'<\/div><div class="l">Affiliate Revenue<\/div><\/div><\/div>';
html+='<div class="cd" style="text-align:center;margin-bottom:12px"><div style="font-size:28px;font-weight:700;color:var(--pk)">$'+totalR.toFixed(2)+'<\/div><div class="l">Total Revenue<\/div><\/div>';
html+='<h4 style="color:var(--d);margin:10px 0 8px">Revenue by Channel<\/h4><table><thead><tr><th>Channel<\/th><th>Monthly<\/th><th>Subs<\/th><\/tr><\/thead><tbody>';
(d.channels||[]).forEach(function(c){html+='<tr><td style="font-weight:600">'+c.channel_name+'<\/td><td class="mono" style="color:var(--gn)">$'+Number(c.monthly_revenue).toLocaleString()+'/mo<\/td><td class="mono">'+Number(c.subscribers).toLocaleString()+'<\/td><\/tr>';});
html+='<\/tbody><\/table>';
}
ct.innerHTML=html;
}catch(e){ct.innerHTML='<div style="color:var(--rd)">Error: '+e.message+'<\/div>';}
}
async function drillChannel(id){
var m=document.getElementById('drillModal'),tt=document.getElementById('drillTitle'),ct=document.getElementById('drillContent');
m.style.display='flex';ct.innerHTML='<div style="text-align:center;padding:40px;color:var(--d)">Loading channel...<\/div>';
try{
var r=await fetch(YT_API+'?action=channel&id='+id);
var d=await r.json();
var ch=d.channel||{};var vids=d.videos||[];
tt.textContent='▶ '+ch.channel_name;
var html='<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px">';
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--am)">'+Number(ch.subscribers||0).toLocaleString()+'<\/div><div class="l">Subscribers<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--cy)">'+Number(ch.total_views||0).toLocaleString()+'<\/div><div class="l">Views<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--bl)">'+(ch.videos_count||0)+'<\/div><div class="l">Videos<\/div><\/div>';
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--gn)">$'+Number(ch.monthly_revenue||0).toLocaleString()+'<\/div><div class="l">$/month<\/div><\/div><\/div>';
html+='<div style="margin-bottom:10px;color:var(--d)">Niche: <strong>'+ch.niche+'<\/strong> · Language: <strong>'+ch.language+'<\/strong> · Status: <span class="badge badge-'+(ch.status==='active'?'gn':'rd')+'">'+ch.status+'<\/span><\/div>';
if(vids.length){
html+='<h4 style="color:var(--cy);margin:8px 0">🎬 Videos ('+vids.length+')<\/h4>';
html+='<table><thead><tr><th>Title<\/th><th>Views<\/th><th>Likes<\/th><th>Comments<\/th><th>Ad $<\/th><th>Aff $<\/th><th>Date<\/th><\/tr><\/thead><tbody>';
vids.forEach(function(v){var t=parseFloat(v.ad_revenue||0)+parseFloat(v.affiliate_revenue||0);html+='<tr><td style="font-weight:600">'+v.title+'<\/td><td class="mono" style="color:var(--cy)">'+Number(v.views||0).toLocaleString()+'<\/td><td class="mono">'+Number(v.likes||0).toLocaleString()+'<\/td><td class="mono">'+(v.comments||0)+'<\/td><td class="mono" style="color:var(--am)">$'+(+v.ad_revenue||0).toFixed(2)+'<\/td><td class="mono" style="color:var(--gn)">$'+(+v.affiliate_revenue||0).toFixed(2)+'<\/td><td style="font-size:10px;color:var(--d)">'+(v.published_at||'').substring(0,10)+'<\/td><\/tr>';});
html+='<\/tbody><\/table>';
} else { html+='<div style="text-align:center;color:var(--d);padding:20px">No videos yet<\/div>'; }
ct.innerHTML=html;
}catch(e){ct.innerHTML='<div style="color:var(--rd)">'+e.message+'<\/div>';}
}
async function createChannel(){
var n=document.getElementById('ch_name').value;if(!n){alert('Channel name required');return;}
var niche=document.getElementById('ch_niche').value;
var lang=document.getElementById('ch_lang').value;
try{
var r=await fetch(YT_API+'?action=create_channel',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({channel_name:n,niche:niche,language:lang})});
var d=await r.json();
if(d.status==='success'){alert('Channel created! ID: '+d.id);location.reload();}else{alert('Error: '+(d.error||'unknown'));}
}catch(e){alert('Error: '+e.message);}
}
async function createVideo(){
var ch=document.getElementById('vid_ch').value;
var t=document.getElementById('vid_title').value;if(!t){alert('Title required');return;}
var desc=document.getElementById('vid_desc').value;
try{
var r=await fetch(YT_API+'?action=create_video',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({channel_id:ch,title:t,description:desc})});
var d=await r.json();
if(d.status==='success'){alert('Video created! ID: '+d.id);location.reload();}else{alert('Error: '+(d.error||'unknown'));}
}catch(e){alert('Error: '+e.message);}
}
</script>
<script src="arsenal-common.js?v1770778169"></script>
<!-- WEVADS UNIVERSAL DRILL-DOWN v2 -->
<div id="uDrill" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.88);z-index:10000;overflow-y:auto;padding:30px 20px">
<div style="max-width:1000px;margin:0 auto;background:#0c1220;border:1px solid #1e293b;border-radius:12px;padding:20px;box-shadow:0 25px 50px rgba(0,0,0,.5)">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
<h2 id="uDT" style="color:#22d3ee;font-size:16px;font-family:'DM Sans',sans-serif;margin:0">🔍 Drill Down</h2>
<div style="display:flex;gap:8px;align-items:center">
<input id="uDQ" placeholder="Recherche universelle..." style="width:220px;padding:6px 12px;background:#060a14;border:1px solid #1e293b;border-radius:6px;color:#e2e8f0;font-size:11px;font-family:'DM Sans',sans-serif" onkeyup="if(event.key==='Enter')uSearch()">
<button onclick="uSearch()" style="padding:6px 12px;background:rgba(34,211,238,.15);border:1px solid #22d3ee;border-radius:6px;color:#22d3ee;cursor:pointer;font-size:10px;font-weight:600">Search</button>
<button onclick="document.getElementById('uDrill').style.display='none'" style="background:none;border:1px solid #1e293b;border-radius:6px;padding:6px 10px;color:#e2e8f0;font-size:16px;cursor:pointer;line-height:1">&times;</button>
</div></div>
<div id="uDB" style="color:#e2e8f0;font-size:12px;font-family:'DM Sans',sans-serif;max-height:70vh;overflow-y:auto"></div>
<div id="uDP" style="margin-top:10px;text-align:center"></div>
</div></div>
<script>
(function(){
var API='/api/universal-drill.php';
var TH='text-align:left;padding:6px 8px;color:#64748b;font-size:9px;text-transform:uppercase;border-bottom:1px solid #1e293b';
var TD='padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3);font-size:11px';
var CY='color:#22d3ee';var GN='color:#34d399';var AM='color:#fbbf24';var RD='color:#f87171';var PK='color:#f472b6';var BL='color:#60a5fa';
function show(){document.getElementById('uDrill').style.display='block'}
function setT(t){document.getElementById('uDT').innerHTML=t}
function setB(h){document.getElementById('uDB').innerHTML=h}
function nt(s,c){return '<span style="display:inline-block;padding:2px 6px;border-radius:4px;font-size:9px;font-weight:600;background:rgba('+(c==='g'?'52,211,153':c==='r'?'248,113,113':c==='a'?'251,191,36':c==='b'?'96,165,250':'167,139,250')+',.15);color:var(--'+(c==='g'?'gn':c==='r'?'rd':c==='a'?'am':c==='b'?'bl':'pu')+',#'+(c==='g'?'34d399':c==='r'?'f87171':c==='a'?'fbbf24':c==='b'?'60a5fa':'a78bfa')+')">'+s+'<\/span>'}
function stBadge(s){s=(s||'').toLowerCase();return s==='active'||s==='verified'||s==='inbox'?nt(s,'g'):s==='disabled'||s==='suspended'||s==='blocked'||s==='spam'||s==='hard'?nt(s,'r'):s==='warming'||s==='pending'?nt(s,'a'):nt(s,'b')}
function pager(action,page,pages,extra){
var h='';var args=extra||'';
if(page>1) h+='<button onclick="'+action+'('+(page-1)+',\''+args+'\')" style="margin:4px;padding:4px 14px;background:#1e293b;border:1px solid #2d3748;color:#e2e8f0;border-radius:4px;cursor:pointer;font-size:11px">← Prev<\/button>';
h+='<span style="color:#64748b;font-size:11px;margin:0 8px">Page '+page+'/'+Math.min(pages,999)+'<\/span>';
if(page<pages) h+='<button onclick="'+action+'('+(page+1)+',\''+args+'\')" style="margin:4px;padding:4px 14px;background:#1e293b;border:1px solid #2d3748;color:#e2e8f0;border-radius:4px;cursor:pointer;font-size:11px">Next →<\/button>';
document.getElementById('uDP').innerHTML=h;
}
function tbl(headers,rows,renderRow){
var h='<table style="width:100%;border-collapse:collapse"><tr>';
headers.forEach(function(hd){h+='<th style="'+TH+'">'+hd+'<\/th>'});
h+='<\/tr>';rows.forEach(function(r){h+=renderRow(r)});
return h+'<\/table>';
}
function fmt(n){return (n||0).toLocaleString()}
// === DRILL ISP (contacts) ===
window.drillISP=function(isp,pg){
pg=pg||1;show();setT('📧 ISP: <b style="'+CY+'">'+isp+'<\/b>');setB('Loading...');
fetch(API+'?action=drill_isp&isp='+encodeURIComponent(isp)+'&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+CY+'">'+fmt(d.total)+' contacts<\/div>'+
tbl(['Email','Name','Status','Source'],d.contacts||[],function(c){
return '<tr><td style="'+TD+';'+CY+'">'+c.email+'<\/td><td style="'+TD+'">'+(c.first_name||'-')+'<\/td><td style="'+TD+'">'+stBadge(c.status)+'<\/td><td style="'+TD+'">'+(c.source||'-')+'<\/td><\/tr>';
}));
pager('_dI',d.page,d.pages,isp);
}).catch(function(e){setB('Error: '+e)});
};
window._dI=function(pg,isp){drillISP(isp,pg)};
// === DRILL OFFERS ===
window.drillOffers=function(pg){
pg=pg||1;show();setT('💰 Offers');setB('Loading...');
fetch(API+'?action=drill_offers&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+AM+'">'+fmt(d.total)+' offers<\/div>'+
tbl(['#','Name','Status','Payout','Network','Country'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b style="cursor:pointer;'+CY+';text-decoration:underline" onclick="drillOffer('+r.id+')">'+r.name+'<\/b><\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+';'+GN+';font-weight:700">$'+(r.payout||0)+'<\/td><td style="'+TD+'">'+(r.network||'-')+'<\/td><td style="'+TD+'">'+(r.country||'-')+'<\/td><\/tr>';
}));
pager('drillOffers',d.page,d.pages);
});
};
window.drillOffer=function(id){
show();setT('💰 Offer #'+id);setB('Loading...');
fetch(API+'?action=drill_offer&id='+id).then(r=>r.json()).then(function(d){
var o=d.offer||{};
var h='<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px"><div style="background:#111827;border:1px solid #1e293b;border-radius:8px;padding:12px"><b>'+o.name+'<\/b><br><span style="'+GN+'">$'+(o.payout||0)+'<\/span> — '+(o.network||'-')+' — '+(o.country||'-')+'<br>Status: '+stBadge(o.status)+'<\/div>';
h+='<div style="background:#111827;border:1px solid #1e293b;border-radius:8px;padding:12px">Creatives: <b style="'+PK+'">'+((d.creatives||[]).length)+'<\/b><br>Configs: <b style="'+BL+'">'+((d.configs||[]).length)+'<\/b><\/div><\/div>';
if((d.creatives||[]).length){
h+='<h3 style="color:#f472b6;font-size:12px;margin-bottom:8px">🎨 Creatives<\/h3>'+
tbl(['#','Name','Subject','Score','Status','O','C','Conv'],d.creatives,function(c){
return '<tr><td style="'+TD+'">'+c.id+'<\/td><td style="'+TD+'">'+c.creative_name+'<\/td><td style="'+TD+';max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+(c.subject_line||'-')+'<\/td><td style="'+TD+';'+GN+';font-weight:700">'+(c.score||0)+'<\/td><td style="'+TD+'">'+stBadge(c.status)+'<\/td><td style="'+TD+'">'+(c.opens||0)+'<\/td><td style="'+TD+'">'+(c.clicks||0)+'<\/td><td style="'+TD+';'+AM+'">'+(c.conversions||0)+'<\/td><\/tr>';
});
}
setB(h);document.getElementById('uDP').innerHTML='';
});
};
// === DRILL CREATIVES ===
window.drillCreatives=function(pg,status){
pg=pg||1;show();setT('🎨 Creatives'+(status?' ('+status+')':''));setB('Loading...');
fetch(API+'?action=drill_creatives&page='+pg+(status?'&status='+status:'')).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+PK+'">'+fmt(d.total)+' creatives<\/div>'+
tbl(['#','Name','Subject','Offer','Score','Status','Winner'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'">'+r.creative_name+'<\/td><td style="'+TD+';max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+(r.subject_line||'-')+'<\/td><td style="'+TD+';color:#64748b">'+(r.offer||'-')+'<\/td><td style="'+TD+';'+GN+';font-weight:700">'+(r.score||0)+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+'">'+(r.is_winner?'⭐':'')+'<\/td><\/tr>';
}));
pager('_dCr',d.page,d.pages,status||'');
});
};
window._dCr=function(pg,s){drillCreatives(pg,s)};
// === DRILL OFFICE ===
window.drillOffice=function(pg,status){
pg=pg||1;show();setT('🏢 Office Accounts'+(status?' ('+status+')':''));setB('Loading...');
fetch(API+'?action=drill_office&page='+pg+(status?'&status='+status:'')).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+BL+'">'+fmt(d.total)+' accounts<\/div>'+
tbl(['#','Name','Tenant','Status','Step','Exchange','Domains'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b>'+r.name+'<\/b><\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.tenant_domain||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+'">'+(r.current_step||0)+'/8<\/td><td style="'+TD+'">'+(r.exchange_configured?'✅':'❌')+'<\/td><td style="'+TD+'">'+(r.domains_count||0)+'<\/td><\/tr>';
}));
pager('_dOf',d.page,d.pages,status||'');
});
};
window._dOf=function(pg,s){drillOffice(pg,s)};
// === DRILL CONFIGS ===
window.drillConfigs=function(pg,filter){
pg=pg||1;show();setT('⚡ Brain Configs'+(filter?' ('+filter+')':''));setB('Loading...');
fetch(API+'?action=drill_configs&page='+pg+(filter?'&filter='+filter:'')).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+AM+'">'+fmt(d.total)+' configs<\/div>'+
tbl(['#','Name','Method','ISP','Status','Winner','Score','Sent','Inbox%'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b>'+(r.config_name||'-')+'<\/b><\/td><td style="'+TD+'">'+(r.send_method||'-')+'<\/td><td style="'+TD+';'+CY+'">'+(r.isp_target||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+'">'+(r.is_winner?'🏆':'')+'<\/td><td style="'+TD+';'+GN+'">'+(r.score||0)+'<\/td><td style="'+TD+'">'+fmt(r.total_sent)+'<\/td><td style="'+TD+'">'+(r.inbox_rate||0)+'%<\/td><\/tr>';
}));
pager('_dCf',d.page,d.pages,filter||'');
});
};
window._dCf=function(pg,f){drillConfigs(pg,f)};
// === DRILL WARMUP ===
window.drillWarmup=function(pg){
pg=pg||1;show();setT('🔥 Warmup Accounts');setB('Loading...');
fetch(API+'?action=drill_warmup&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+AM+'">'+fmt(d.total)+' warming<\/div>'+
tbl(['#','Email','Status','Day','Daily Vol','Created'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+';'+CY+'">'+(r.email||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+'">'+(r.current_day||0)+'<\/td><td style="'+TD+'">'+(r.daily_volume||0)+'<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.created_at||'').substring(0,10)+'<\/td><\/tr>';
}));
pager('drillWarmup',d.page,d.pages);
});
};
// === DRILL SENDS ===
window.drillSends=function(pg){
pg=pg||1;show();setT('📤 Send Log');setB('Loading...');
fetch(API+'?action=drill_sends&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px">'+fmt(d.total)+' sends<\/div>'+
tbl(['#','Recipient','ISP','Method','From','Subject','Status','Date'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+';'+CY+'">'+(r.recipient||'-')+'<\/td><td style="'+TD+'">'+(r.isp||'-')+'<\/td><td style="'+TD+'">'+(r.send_method||'-')+'<\/td><td style="'+TD+';font-size:10px">'+(r.from_email||'-')+'<\/td><td style="'+TD+';max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+(r.subject||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.created_at||'').substring(0,16)+'<\/td><\/tr>';
}));
pager('drillSends',d.page,d.pages);
});
};
// === DRILL DOMAINS ===
window.drillDomains=function(pg,dtype){
pg=pg||1;dtype=dtype||'office';show();setT('🌐 Domains ('+dtype+')');setB('Loading...');
fetch(API+'?action=drill_domains&dtype='+dtype+'&page='+pg).then(r=>r.json()).then(function(d){
var heads=dtype==='ptr'?['#','IP','PTR Domain','Hostname','Status','Inbox%','Sent']:dtype==='office'?['#','Domain','Status','Account']:['#','Domain/User','Status'];
setB('<div style="margin-bottom:8px;'+BL+'">'+fmt(d.total)+' '+dtype+' domains<\/div>'+
tbl(heads,d.rows||[],function(r){
if(dtype==='ptr') return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+';font-family:monospace">'+r.ip_address+'<\/td><td style="'+TD+';'+CY+'">'+(r.ptr_domain||'-')+'<\/td><td style="'+TD+'">'+(r.ptr_hostname||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+';'+GN+'">'+(r.inbox_rate||0)+'%<\/td><td style="'+TD+'">'+fmt(r.total_sent)+'<\/td><\/tr>';
if(dtype==='office') return '<tr><td style="'+TD+'">'+(r.id||'')+'<\/td><td style="'+TD+';'+CY+'"><b>'+(r.domain_name||'')+'<\/b><\/td><td style="'+TD+'">'+stBadge(r.verification_status||r.status)+'<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.account||'')+'<\/td><\/tr>';
return '<tr><td style="'+TD+'">'+(r.id||'')+'<\/td><td style="'+TD+';'+CY+'">'+(r.domain_name||r.username||'')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><\/tr>';
}));
pager('_dDm',d.page,d.pages,dtype);
});
};
window._dDm=function(pg,t){drillDomains(pg,t)};
// === DRILL BOUNCES ===
window.drillBounces=function(pg){
pg=pg||1;show();setT('🛡️ Bounces');setB('Loading...');
fetch(API+'?action=drill_bounces&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+RD+'">'+fmt(d.total)+' bounces<\/div>'+
tbl(['#','Recipient','ISP','Type','Code','Message','Date'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+';'+CY+'">'+(r.recipient||'-')+'<\/td><td style="'+TD+'">'+(r.isp||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.bounce_type)+'<\/td><td style="'+TD+'">'+(r.smtp_code||'-')+'<\/td><td style="'+TD+';max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#64748b">'+(r.smtp_message||'-')+'<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.bounced_at||'').substring(0,16)+'<\/td><\/tr>';
}));
pager('drillBounces',d.page,d.pages);
});
};
// === DRILL CONVERSIONS ===
window.drillConversions=function(pg){
pg=pg||1;show();setT('💰 Conversions');setB('Loading...');
fetch(API+'?action=drill_conversions&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+GN+'">'+fmt(d.total)+' conversions<\/div>'+
tbl(['#','Sub1','Sub2','Sub3','Payout','Source','Date'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'">'+(r.sub1||'-')+'<\/td><td style="'+TD+'">'+(r.sub2||'-')+'<\/td><td style="'+TD+'">'+(r.sub3||'-')+'<\/td><td style="'+TD+';'+GN+';font-weight:700">$'+(r.payout||0)+'<\/td><td style="'+TD+'">'+(r.source||'-')+'<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.created_at||'').substring(0,16)+'<\/td><\/tr>';
}));
pager('drillConversions',d.page,d.pages);
});
};
// === DRILL PERSONAS ===
window.drillPersonas=function(pg){
pg=pg||1;show();setT('🎭 Personas');setB('Loading...');
fetch(API+'?action=drill_personas&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+PK+'">'+fmt(d.total)+' personas<\/div>'+
tbl(['#','Name','Email','Country','Gender','Status'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b>'+(r.first_name||'')+' '+(r.last_name||'')+'<\/b><\/td><td style="'+TD+';'+CY+'">'+(r.email||'-')+'<\/td><td style="'+TD+'">'+(r.country||'-')+'<\/td><td style="'+TD+'">'+(r.gender||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><\/tr>';
}));
pager('drillPersonas',d.page,d.pages);
});
};
// === DRILL SEEDS ===
window.drillSeeds=function(pg){
pg=pg||1;show();setT('🌱 Seeds');setB('Loading...');
fetch(API+'?action=drill_seeds&page='+pg).then(r=>r.json()).then(function(d){
setB('<div style="margin-bottom:8px;'+AM+'">'+fmt(d.total)+' seeds<\/div>'+
tbl(['#','Email','ISP','Status','Inbox%','Last Check'],d.rows||[],function(r){
return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+';'+CY+'">'+(r.email||'-')+'<\/td><td style="'+TD+'">'+(r.isp||'-')+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+';'+GN+'">'+(r.inbox_rate||0)+'%<\/td><td style="'+TD+';color:#64748b;font-size:10px">'+(r.last_check||'-')+'<\/td><\/tr>';
}));
pager('drillSeeds',d.page,d.pages);
});
};
// === UNIVERSAL SEARCH ===
window.uSearch=function(){
var q=document.getElementById('uDQ').value;if(!q)return;
show();setT('🔍 Search: <b>'+q+'<\/b>');setB('Searching...');
fetch(API+'?action=search&q='+encodeURIComponent(q)).then(r=>r.json()).then(function(d){
var res=d.results||{};var h='';
if(res.contacts&&res.contacts.length){h+='<h3 style="color:#22d3ee;font-size:12px;margin:10px 0 6px">📧 Contacts ('+res.contacts.length+')<\/h3>'+tbl(['Email','ISP','Status'],res.contacts,function(r){return '<tr><td style="'+TD+';'+CY+'">'+r.email+'<\/td><td style="'+TD+'">'+r.isp+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><\/tr>'});}
if(res.offers&&res.offers.length){h+='<h3 style="color:#fbbf24;font-size:12px;margin:10px 0 6px">💰 Offers ('+res.offers.length+')<\/h3>'+tbl(['#','Name','Status','Payout'],res.offers,function(r){return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b style="cursor:pointer;'+CY+'" onclick="drillOffer('+r.id+')">'+r.name+'<\/b><\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><td style="'+TD+';'+GN+'">$'+r.payout+'<\/td><\/tr>'});}
if(res.accounts&&res.accounts.length){h+='<h3 style="color:#60a5fa;font-size:12px;margin:10px 0 6px">🏢 Accounts ('+res.accounts.length+')<\/h3>'+tbl(['#','Name','Tenant','Status'],res.accounts,function(r){return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'"><b>'+r.name+'<\/b><\/td><td style="'+TD+'">'+r.tenant_domain+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><\/tr>'});}
if(res.domains&&res.domains.length){h+='<h3 style="color:#f59e0b;font-size:12px;margin:10px 0 6px">🌐 Domains ('+res.domains.length+')<\/h3>'+tbl(['Domain','Status'],res.domains,function(r){return '<tr><td style="'+TD+';'+CY+'">'+r.domain_name+'<\/td><td style="'+TD+'">'+stBadge(r.verification_status)+'<\/td><\/tr>'});}
if(res.creatives&&res.creatives.length){h+='<h3 style="color:#f472b6;font-size:12px;margin:10px 0 6px">🎨 Creatives ('+res.creatives.length+')<\/h3>'+tbl(['#','Name','Subject','Status'],res.creatives,function(r){return '<tr><td style="'+TD+'">'+r.id+'<\/td><td style="'+TD+'">'+r.creative_name+'<\/td><td style="'+TD+'">'+r.subject_line+'<\/td><td style="'+TD+'">'+stBadge(r.status)+'<\/td><\/tr>'});}
if(!h) h='<div style="text-align:center;color:#64748b;padding:20px">No results for "'+q+'"<\/div>';
setB(h);document.getElementById('uDP').innerHTML='';
});
};
// === AUTO-DETECT DRILLABLE ELEMENTS ===
function autoWire(){
// ISP names in tables
var isps=['gmail','hotmail','spectrum','t-online','gmx','web.de','videotron','yahoo','aol','orange','free','sfr','comcast','outlook','live','msn','laposte','wanadoo','numericable','cox','att','verizon','charter'];
document.querySelectorAll('td,span.n,div').forEach(function(el){
var t=(el.textContent||'').trim().toLowerCase();
// ISP drill
if(isps.indexOf(t)!==-1 && !el.dataset.wired){
el.dataset.wired='1';el.style.cursor='pointer';el.style.color='#22d3ee';el.style.textDecoration='underline';
el.onclick=function(e){e.stopPropagation();drillISP(t)};
}
});
// Numbers that look like KPIs - make stat cards clickable
document.querySelectorAll('.sc,.funnel-step,.pipe-step').forEach(function(card){
if(card.dataset.wired) return; card.dataset.wired='1';
var label=(card.querySelector('.l')||{}).textContent||'';label=label.toLowerCase();
var fn=null;
if(label.match(/warming|warmup/)) fn=function(){drillWarmup()};
else if(label.match(/seed/)) fn=function(){drillSeeds()};
else if(label.match(/contact/)) fn=function(){drillISP('gmail')};
else if(label.match(/offer/)) fn=function(){drillOffers()};
else if(label.match(/creative/)) fn=function(){drillCreatives()};
else if(label.match(/config/)) fn=function(){drillConfigs()};
else if(label.match(/winner/)) fn=function(){drillConfigs(1,'winner')};
else if(label.match(/active\s*(config|brain)/i)) fn=function(){drillConfigs(1,'active')};
else if(label.match(/office|o365|tenant/)) fn=function(){drillOffice()};
else if(label.match(/domain/)) fn=function(){drillDomains()};
else if(label.match(/bounce/)) fn=function(){drillBounces()};
else if(label.match(/conver/)) fn=function(){drillConversions()};
else if(label.match(/persona/)) fn=function(){drillPersonas()};
else if(label.match(/send|sent|capacity/)) fn=function(){drillSends()};
else if(label.match(/graph/)) fn=function(){window.drillGraphSends?drillGraphSends():drillSends()};
else if(label.match(/ptr/)) fn=function(){drillDomains(1,'ptr')};
else if(label.match(/cloudflare|cf\b/)) fn=function(){drillDomains(1,'cloudflare')};
else if(label.match(/freedns/)) fn=function(){drillDomains(1,'freedns')};
else if(label.match(/inbox/)) fn=function(){window.drillInbox?drillInbox():drillSeeds()};
if(fn){card.style.cursor='pointer';card.title='Click to drill down';card.addEventListener('click',fn);
card.style.transition='border-color .2s';card.addEventListener('mouseenter',function(){this.style.borderColor='#22d3ee'});
card.addEventListener('mouseleave',function(){this.style.borderColor=''});
}
});
}
// Wire on load + on tab switch
setTimeout(autoWire,600);
setTimeout(autoWire,2000);
document.addEventListener('click',function(){setTimeout(autoWire,500)});
// Keyboard shortcut: Ctrl+K for universal search
document.addEventListener('keydown',function(e){if((e.ctrlKey||e.metaKey)&&e.key==='k'){e.preventDefault();show();document.getElementById('uDQ').focus()}});
})();
</script>
</body></html>