⭐ Facebook Stars Tracker

💖 Facebook Stars Tracker

Track who sends the most stars in your group 💕

📊 Dashboard
➕ Add Stars
👤 My Stats
🏆 Leaderboard
📋 History
👥 Members
📈 Reports

🔥 Top 10 Stars Senders (All Time)

RankNameStars SentStars ReceivedLast Active

➕ Add New Star Entry

👥 Quick Add Member

👤

Enter Your Name

Type your name to see your personal stars report

🏅 Full Leaderboard

RankNameStars SentStars ReceivedNet

📋 All Star Entries

#SenderReceiverStarsDateNoteDel

👥 All Members

NameTotal SentTotal ReceivedActions
📤
Export to CSV
Download all data as Excel
🖨️
Print Report
Print leaderboard report
🏆
Export Leaderboard
Top senders as CSV
📄
Download PDF
Full report as PDF file
👤
My Stats PDF
Personal report as PDF

📊 Monthly Stars Chart

📅 Monthly Breakdown

MonthTotal StarsEntriesTop Sender
'; var w=window.open('','_blank'); if(!w){alert('Popups are blocked. Please allow popups in your browser settings and try again.');return;} w.document.write(html);w.document.close(); w.onload=function(){w.print();}; toast('🖨️ Print window opened!'); }function renderChart(){ var sel=document.getElementById('chartYear'); var years=getYears();var curVal=sel.value; sel.innerHTML=years.map(function(y){return '';}).join(''); var year=sel.value||years[0]; var monthly=Array(12).fill(0); data.forEach(function(e){if(e.date.slice(0,4)===year){var m=parseInt(e.date.slice(5,7))-1;monthly[m]+=parseInt(e.stars);}}); var max=Math.max.apply(null,monthly)||1; document.getElementById('chartContainer').innerHTML='
'+monthly.map(function(v,i){ var h=Math.round((v/max)*180); return '
'+(v||'')+'
'+monthNames[i]+'
'; }).join('')+'
'; }function renderMonthly(){ var year=document.getElementById('chartYear').value||new Date().getFullYear().toString(); var rows=[]; for(var m=0;m<12;m++){ var mStr=year+'-'+(m<9?'0':'')+(m+1); var entries=data.filter(function(e){return e.date.slice(0,7)===mStr;}); if(!entries.length)continue; var total=entries.reduce(function(s,e){return s+parseInt(e.stars);},0); var ss=getSenderStats(entries); rows.push(''+monthNames[m]+' '+year+'⭐ '+total+''+entries.length+''+(ss[0]?esc(ss[0].name):'—')+''+(ss[0]?' (⭐'+ss[0].sent+')':'')+''); } document.getElementById('monthlyBody').innerHTML=rows.length?rows.join(''):'No data for this year'; }function getYears(){ var years=new Set(); data.forEach(function(e){years.add(e.date.slice(0,4));}); if(!years.size)years.add(new Date().getFullYear().toString()); return Array.from(years).sort().reverse(); }document.getElementById('chartYear').addEventListener('change',function(){renderChart();renderMonthly();});// ========== PDF EXPORT ========== function buildPDFWindow(htmlContent, title){ var w = window.open('', '_blank'); if(!w){ alert('Popups are blocked. Please allow popups in your browser settings, then try again.'); return null; } var fullHtml = ''+title+''; fullHtml += ''; fullHtml += '
'; fullHtml += '💖 To save as PDF: Click the button below or press Ctrl+P → Select Save as PDF'; fullHtml += ''; fullHtml += '
'; fullHtml += htmlContent; fullHtml += ''; fullHtml += ''; w.document.write(fullHtml); w.document.close(); return w; }function exportFullPDF(){ if(!data.length){alert('No data found! Please add some star entries first using the ➕ Add Stars tab.');return;} var stats = getSenderStats(data); var totalStars = data.reduce(function(s,e){return s+parseInt(e.stars);},0); var todayStars = filterData('today').reduce(function(s,e){return s+parseInt(e.stars);},0); var monthStars = filterData('month').reduce(function(s,e){return s+parseInt(e.stars);},0); var now = new Date().toLocaleDateString(); var html = '';// Header html += '

💖 Facebook Stars Tracker — Full Report

'; html += '
Generated: '+now+'  •  Total Entries: '+data.length+'
';// Summary stats html += '
'; html += '
⭐ '+totalStars+'
Total Stars
'; html += '
'+todayStars+'
Today
'; html += '
'+monthStars+'
This Month
'; html += '
'+stats.length+'
Members
'; html += '
'+data.length+'
Entries
'; html += '
';// Top 3 podium if(stats.length >= 1){ html += '

🏆 Top 3 Stars Senders

'; html += '
'; var podium = [ {data: stats[1]||null, cls:'second', crown:'🥈', label:'2nd Place'}, {data: stats[0]||null, cls:'first', crown:'👑', label:'1st Place'}, {data: stats[2]||null, cls:'third', crown:'🥉', label:'3rd Place'} ]; podium.forEach(function(p){ if(!p.data){html+='
';return;} html+='
'; html+='
'+p.crown+'
'; html+='
'+esc(p.data.name)+'
'; html+='
⭐ '+p.data.sent+'
'; html+='
'+p.label+'
'; html+='
'; }); html += '
'; }// Full leaderboard html += '

🏅 Full Leaderboard

'; html += ''; stats.forEach(function(s,i){ var net=s.sent-s.received; var medal=i===0?'🥇':i===1?'🥈':i===2?'🥉':(i+1)+'.'; var netColor=net>0?'color:#e91e8c':net<0?'color:#9333ea':'color:#888'; html+=''; }); html += '
RankNameStars SentStars ReceivedNet
'+medal+''+esc(s.name)+'⭐ '+s.sent+'📩 '+s.received+''+(net>0?'+':'')+net+'
';// Monthly summary var monthNames=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var year = new Date().getFullYear().toString(); var hasMonthly = false; var monthlyHtml = ''; for(var m=0;m<12;m++){ var mStr=year+'-'+(m<9?'0':'')+(m+1); var entries=data.filter(function(e){return e.date.slice(0,7)===mStr;}); if(!entries.length)continue; hasMonthly=true; var total=entries.reduce(function(s,e){return s+parseInt(e.stars);},0); var ss=getSenderStats(entries); monthlyHtml+=''; } monthlyHtml += '
MonthTotal StarsEntriesTop Sender
'+monthNames[m]+' '+year+'⭐ '+total+''+entries.length+''+(ss[0]?esc(ss[0].name)+' (⭐'+ss[0].sent+')':'—')+'
'; if(hasMonthly){ html += '

📅 Monthly Summary — '+year+'

'; html += monthlyHtml; }// Complete history html += '

📋 Complete History ('+data.length+' entries)

'; html += ''; var sorted = data.slice().sort(function(a,b){return b.id-a.id;}); sorted.forEach(function(e,i){ html+=''; }); html += '
#SenderReceiverStarsDateNote
'+(i+1)+''+esc(e.sender)+''+esc(e.receiver)+'⭐ '+e.stars+''+e.date+''+(e.note||'—')+'
';buildPDFWindow(html, 'Stars Tracker — Full Report'); toast('📄 PDF report opened! Press Ctrl+P to save.'); }function exportMyStatsPDF(){ var name = localStorage.getItem('fbMyName')||''; if(!name){ name = prompt('Enter your name to generate your personal PDF report:'); if(!name) return; } if(!data.length){alert('No data found! Please add some star entries first.');return;}var sentEntries = data.filter(function(e){return e.sender.toLowerCase()===name.toLowerCase();}).sort(function(a,b){return b.id-a.id;}); var recvEntries = data.filter(function(e){return e.receiver.toLowerCase()===name.toLowerCase();}).sort(function(a,b){return b.id-a.id;}); var totalSent = sentEntries.reduce(function(s,e){return s+parseInt(e.stars);},0); var totalRecv = recvEntries.reduce(function(s,e){return s+parseInt(e.stars);},0); var net = totalSent - totalRecv; var allStats = getSenderStats(data); var myRank = allStats.findIndex(function(s){return s.name.toLowerCase()===name.toLowerCase();}); myRank = myRank >= 0 ? (myRank+1) : '—';var html = ''; html += '

💖 My Stars Report — '+esc(name)+'

'; html += '
Generated: '+new Date().toLocaleDateString()+'  •  Leaderboard Rank: #'+myRank+'
';// Summary html += '
'; html += '
⭐ '+totalSent+'
Stars Sent
'; html += '
📩 '+totalRecv+'
Stars Received
'; html += '
'+(net>=0?'+':'')+net+'
Net Balance
'; html += '
#'+myRank+'
My Rank
'; html += '
'+sentEntries.length+'
Times Sent
'; html += '
'+recvEntries.length+'
Times Received
'; html += '
';// Stars I sent html += '

📤 Stars I Sent ('+sentEntries.length+' entries • Total: ⭐ '+totalSent+')

'; if(!sentEntries.length){ html += '

No stars sent yet.

'; } else { html += ''; sentEntries.forEach(function(e,i){html+='';}); html += '
#Sent ToStarsDateNote
'+(i+1)+''+esc(e.receiver)+'⭐ '+e.stars+''+e.date+''+(e.note||'—')+'
'; }// Stars received html += '

📩 Stars I Received ('+recvEntries.length+' entries • Total: 📩 '+totalRecv+')

'; if(!recvEntries.length){ html += '

No stars received yet.

'; } else { html += ''; recvEntries.forEach(function(e,i){html+='';}); html += '
#Received FromStarsDateNote
'+(i+1)+''+esc(e.sender)+'📩 '+e.stars+''+e.date+''+(e.note||'—')+'
'; }// Exchange per person var exchange={}; sentEntries.forEach(function(e){var k=e.receiver;if(!exchange[k])exchange[k]={name:k,iSent:0,theySent:0};exchange[k].iSent+=parseInt(e.stars);}); recvEntries.forEach(function(e){var k=e.sender;if(!exchange[k])exchange[k]={name:k,iSent:0,theySent:0};exchange[k].theySent+=parseInt(e.stars);}); var exArr=Object.values(exchange).sort(function(a,b){return(b.iSent+b.theySent)-(a.iSent+a.theySent);}); if(exArr.length){ html += '

🤝 Stars Exchange Per Person

'; html += ''; exArr.forEach(function(p){ var bal=p.iSent-p.theySent; var bc=bal>0?'color:#e91e8c':bal<0?'color:#9333ea':'color:#888'; html+=''; }); html += '
PersonI SentThey Sent MeBalance
'+esc(p.name)+'⭐ '+p.iSent+'📩 '+p.theySent+''+(bal>0?'+':'')+bal+'
'; }buildPDFWindow(html, 'My Stars Report — '+name); toast('📄 Your personal PDF opened! Press Ctrl+P to save.'); }function toast(msg,type){ var t=document.getElementById('toast'); t.textContent=msg;t.style.background=type==='error'?'#ef4444':'#22c55e'; t.classList.add('show');setTimeout(function(){t.classList.remove('show');},3000); }function esc(str){return String(str||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');} ⭐ Facebook Stars Tracker
⭐ 💖 ⭐ 💖 ⭐ 💖 ⭐
🔒
Stars Tracker
Enter your password to continue
❌ Wrong password. Please try again.
💕 ✨ 💕 ✨ 💕 ✨ 💕

🔑 Change Password

💖 Facebook Stars Tracker

Track who sends the most stars in your group 💕

📊 Dashboard
➕ Add Stars
👤 My Stats
🏆 Leaderboard
📋 History
👥 Members
📈 Reports

🔥 Top 10 Stars Senders (All Time)

RankNameStars SentStars ReceivedLast Active

➕ Add New Star Entry

👥 Quick Add Member

👤

Enter Your Name

Type your name to see your personal stars report

🏅 Full Leaderboard

RankNameStars SentStars ReceivedNet

📋 All Star Entries

#SenderReceiverStarsDateNoteDel

👥 All Members

NameTotal SentTotal ReceivedActions
📤
Export to CSV
Download all data
🖨️
Print Report
Print leaderboard
🏆
Export Leaderboard
Top senders as CSV
📄
Download PDF
Full report as PDF
👤
My Stats PDF
Personal PDF report

📊 Monthly Stars Chart

📅 Monthly Breakdown

MonthTotal StarsEntriesTop Sender
'; var w=window.open('','_blank');if(!w){alert('Popups blocked!');return;}w.document.write(html);w.document.close();w.onload=function(){w.print();};toast('Print opened!'); }function renderChart(){ var sel=document.getElementById('chartYear'),years=getYears(),curVal=sel.value; sel.innerHTML=years.map(function(y){return '';}).join(''); var year=sel.value||years[0]; var monthly=Array(12).fill(0); data.forEach(function(e){if(e.date.slice(0,4)===year){var m=parseInt(e.date.slice(5,7))-1;monthly[m]+=parseInt(e.stars);}}); var max=Math.max.apply(null,monthly)||1; document.getElementById('chartContainer').innerHTML='
'+monthly.map(function(v,i){var h=Math.round((v/max)*180);return '
'+(v||'')+'
'+monthNames[i]+'
';}).join('')+'
'; } function renderMonthly(){ var year=document.getElementById('chartYear').value||new Date().getFullYear().toString(); var rows=[]; for(var m=0;m<12;m++){var mStr=year+'-'+(m<9?'0':'')+(m+1);var entries=data.filter(function(e){return e.date.slice(0,7)===mStr;});if(!entries.length)continue;var total=entries.reduce(function(s,e){return s+parseInt(e.stars);},0);var ss=getSenderStats(entries);rows.push(''+monthNames[m]+' '+year+'⭐ '+total+''+entries.length+''+(ss[0]?esc(ss[0].name):'—')+''+(ss[0]?' (⭐'+ss[0].sent+')':'')+'');} document.getElementById('monthlyBody').innerHTML=rows.length?rows.join(''):'No data for this year'; } function getYears(){var years=new Set();data.forEach(function(e){years.add(e.date.slice(0,4));});if(!years.size)years.add(new Date().getFullYear().toString());return Array.from(years).sort().reverse();} document.getElementById('chartYear').addEventListener('change',function(){renderChart();renderMonthly();});function buildPDFWin(html,title){ var w=window.open('','_blank');if(!w){alert('Popups blocked!');return null;} var full=''+title+''; full+='
To save as PDF: press Ctrl+PSave as PDF
'; full+=html+'
💖 Facebook Stars Tracker — '+new Date().toLocaleDateString()+'
'; w.document.write(full);w.document.close();return w; }function exportFullPDF(){ if(!data.length){alert('No data!');return;} var stats=getSenderStats(data); var ts=data.reduce(function(s,e){return s+parseInt(e.stars);},0); var tds=filterData('today').reduce(function(s,e){return s+parseInt(e.stars);},0); var ms=filterData('month').reduce(function(s,e){return s+parseInt(e.stars);},0); var html='

💖 Facebook Stars Tracker — Full Report

Generated: '+new Date().toLocaleDateString()+' • '+data.length+' entries
'; html+='
⭐ '+ts+'
Total
'+tds+'
Today
'+ms+'
This Month
'+stats.length+'
Members
'; html+='

🏅 Full Leaderboard

'; stats.forEach(function(s,i){var net=s.sent-s.received,m=i===0?'🥇':i===1?'🥈':i===2?'🥉':(i+1)+'.';html+='';}); html+='
RankNameSentReceivedNet
'+m+''+esc(s.name)+'⭐ '+s.sent+'📩 '+s.received+''+(net>0?'+':'')+net+'
'; html+='

📋 History

'; data.slice().sort(function(a,b){return b.id-a.id;}).forEach(function(e,i){html+='';}); html+='
#SenderReceiverStarsDateNote
'+(i+1)+''+esc(e.sender)+''+esc(e.receiver)+'⭐ '+e.stars+''+e.date+''+(e.note||'—')+'
'; buildPDFWin(html,'Stars Tracker — Full Report');toast('PDF opened!'); }function exportMyStatsPDF(){ var name=localStorage.getItem('fbMyName')||''; if(!name){name=prompt('Enter your name:');if(!name)return;} if(!data.length){alert('No data!');return;} var se=data.filter(function(e){return e.sender.toLowerCase()===name.toLowerCase();}); var re=data.filter(function(e){return e.receiver.toLowerCase()===name.toLowerCase();}); var ts=se.reduce(function(s,e){return s+parseInt(e.stars);},0); var tr=re.reduce(function(s,e){return s+parseInt(e.stars);},0); var net=ts-tr; var allStats=getSenderStats(data),rank=allStats.findIndex(function(s){return s.name.toLowerCase()===name.toLowerCase();}); rank=rank>=0?(rank+1):'—'; var html='

💖 My Stars Report — '+esc(name)+'

Generated: '+new Date().toLocaleDateString()+' • Rank: #'+rank+'
'; html+='
⭐ '+ts+'
Sent
📩 '+tr+'
Received
'+(net>=0?'+':'')+net+'
Net
#'+rank+'
Rank
'; buildPDFWin(html,'My Stars Report — '+name);toast('Personal PDF opened!'); }function toast(msg,type){var t=document.getElementById('toast');t.textContent=msg;t.style.background=type==='error'?'#ef4444':'linear-gradient(135deg,#e91e8c,#9333ea)';t.classList.add('show');setTimeout(function(){t.classList.remove('show');},3000);} function esc(str){return String(str||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');}

Kucing Pink