Sunday 12/21/2025 sports Picks free
Besure to check out the locks picks page , 5$ and 10$ memberships
Sports Picks Tracker
Add a Pick
Add Pick
Clear Day
If your blog platform blocks inline JS, this version is safe: it uses event listeners (no inline onclick) so Delete/Wipe work everywhere.
League
Matchup
Your Pick
Result
Actions
Edit Pick
✕
Save Changes
Cancel
Tip: results (Win/Loss) stay attached to this pick unless you change the date filter and move it.
Picks: ${s.totalPicks}
Wins: ${s.wins}
Losses: ${s.losses}
Pending: ${s.pending}
Win %: ${s.pct}%
`;
els.dayLabel.textContent = `Showing picks for ${d} • Record (decided only): ${s.wins}-${s.losses}`;
}
function renderTable(allItems){
const items = filteredForDay(allItems);
els.rows.innerHTML = items.map(it => {
const st = computeStatus(it);
const statusLabel = st === “win” ? “✅ WIN” : st === “loss” ? “❌ LOSS” : “⏳ PENDING”;
const teamALogo = isValidLogo(it.logoA) ? ` ` : ` `;
const teamBLogo = isValidLogo(it.logoB) ? ` ` : ` `;
const pickName = it.pick === “A” ? it.teamA : it.teamB;
return `
${safeText(it.sport) || “— “}
${teamALogo}
${escapeHtml(it.teamA)} vs ${escapeHtml(it.teamB)}
${it.notes ? `
${escapeHtml(it.notes)}
` : `
`}
${teamBLogo}
🎯 ${escapeHtml(pickName)}
${statusLabel}
Winner: A
Winner: B
Clear
Edit
Delete
`;
}).join(“”) || `
No picks found for this date/filter. Add one on the left.
`;
}
function rerender(){
const all = loadData();
renderPills(all);
renderTable(all);
}
function addPick(){
const item = {
id: uid(),
sport: safeText(els.sport.value),
date: getSelectedDate(),
teamA: safeText(els.teamA.value),
teamB: safeText(els.teamB.value),
logoA: safeText(els.logoA.value),
logoB: safeText(els.logoB.value),
pick: els.pick.value, // “A” or “B”
notes: safeText(els.notes.value),
resultWinner: “”, // pending initially
createdAt: Date.now()
};
if(!item.teamA || !item.teamB){
alert(“Please enter both Team A and Team B.”);
return;
}
const all = loadData();
all.push(item);
saveData(all);
els.teamA.value = “”;
els.teamB.value = “”;
els.logoA.value = “”;
els.logoB.value = “”;
els.notes.value = “”;
els.teamA.focus();
rerender();
}
function clearDay(){
const d = getSelectedDate();
if(!confirm(`Clear ALL picks for ${d}?`)) return;
const all = loadData().filter(it => it.date !== d);
saveData(all);
rerender();
}
function wipeAll(){
if(!confirm(“Wipe ALL saved picks (all dates) from this browser?”)) return;
localStorage.removeItem(STORAGE_KEY);
rerender();
}
function setWinner(id, winner){
const all = loadData();
const idx = all.findIndex(x => x.id === id);
if(idx === -1) return;
all[idx].resultWinner = winner; // “”, “A”, “B”
saveData(all);
rerender();
}
function removePick(id){
if(!confirm(“Delete this pick?”)) return;
const all = loadData().filter(x => x.id !== id);
saveData(all);
rerender();
}
function openEditModal(id){
const all = loadData();
const it = all.find(x => x.id === id);
if(!it) return;
currentEditId = id;
els.mSport.value = it.sport || “”;
els.mDate.value = it.date || todayISO;
els.mTeamA.value = it.teamA || “”;
els.mTeamB.value = it.teamB || “”;
els.mLogoA.value = it.logoA || “”;
els.mLogoB.value = it.logoB || “”;
els.mPick.value = it.pick || “A”;
els.mNotes.value = it.notes || “”;
els.modalOverlay.style.display = “flex”;
els.mTeamA.focus();
}
function closeEditModal(){
currentEditId = null;
els.modalOverlay.style.display = “none”;
}
function saveEdit(){
if(!currentEditId) return;
const all = loadData();
const idx = all.findIndex(x => x.id === currentEditId);
if(idx === -1) return;
const updated = {
…all[idx],
sport: safeText(els.mSport.value),
date: safeText(els.mDate.value) || todayISO,
teamA: safeText(els.mTeamA.value),
teamB: safeText(els.mTeamB.value),
logoA: safeText(els.mLogoA.value),
logoB: safeText(els.mLogoB.value),
pick: (els.mPick.value === “B”) ? “B” : “A”,
notes: safeText(els.mNotes.value)
};
if(!updated.teamA || !updated.teamB){
alert(“Team A and Team B are required.”);
return;
}
all[idx] = updated;
saveData(all);
// if you changed the date, the table view might move—keep the UI consistent:
els.date.value = updated.date;
closeEditModal();
rerender();
}
// Button handlers (no inline onclick)
els.addBtn.addEventListener(“click”, addPick);
els.clearDayBtn.addEventListener(“click”, clearDay);
els.wipeAllBtn.addEventListener(“click”, wipeAll);
els.search.addEventListener(“input”, rerender);
els.filterStatus.addEventListener(“change”, rerender);
els.date.addEventListener(“change”, rerender);
// Table event delegation (Delete / Winner / Edit)
els.rows.addEventListener(“click”, (e)=>{
const btn = e.target.closest(“button[data-action]”);
if(!btn) return;
const tr = btn.closest(“tr[data-id]”);
const id = tr?.getAttribute(“data-id”);
if(!id) return;
const action = btn.getAttribute(“data-action”);
if(action === “winnerA”) setWinner(id, “A”);
else if(action === “winnerB”) setWinner(id, “B”);
else if(action === “clearWinner”) setWinner(id, “”);
else if(action === “delete”) removePick(id);
else if(action === “edit”) openEditModal(id);
});
// Modal handlers
els.closeModalBtn.addEventListener(“click”, closeEditModal);
els.cancelEditBtn.addEventListener(“click”, closeEditModal);
els.saveEditBtn.addEventListener(“click”, saveEdit);
els.modalOverlay.addEventListener(“click”, (e)=>{
if(e.target === els.modalOverlay) closeEditModal();
});
document.addEventListener(“keydown”, (e)=>{
if(e.key === “Escape” && els.modalOverlay.style.display === “flex”) closeEditModal();
});
// Export/Import
els.exportBtn.addEventListener(“click”, ()=>{
const all = loadData();
const blob = new Blob([JSON.stringify(all, null, 2)], {type:”application/json”});
const a = document.createElement(“a”);
a.href = URL.createObjectURL(blob);
a.download = “sports-picks-export.json”;
document.body.appendChild(a);
a.click();
a.remove();
});
els.importBtn.addEventListener(“click”, ()=> els.importFile.click());
els.importFile.addEventListener(“change”, async (e)=>{
const file = e.target.files?.[0];
if(!file) return;
try{
const text = await file.text();
const imported = JSON.parse(text);
if(!Array.isArray(imported)) throw new Error(“Invalid format (expected an array).”);
const cleaned = imported.map(it => ({
id: it.id || uid(),
sport: safeText(it.sport),
date: safeText(it.date) || todayISO,
teamA: safeText(it.teamA),
teamB: safeText(it.teamB),
logoA: safeText(it.logoA),
logoB: safeText(it.logoB),
pick: (it.pick === “B”) ? “B” : “A”,
notes: safeText(it.notes),
resultWinner: (it.resultWinner === “A” || it.resultWinner === “B”) ? it.resultWinner : “”,
createdAt: it.createdAt || Date.now()
})).filter(it => it.teamA && it.teamB);
const all = loadData().concat(cleaned);
saveData(all);
alert(`Imported ${cleaned.length} picks.`);
rerender();
}catch(err){
alert(“Import failed: ” + err.message);
}finally{
els.importFile.value = “”;
}
});
// first render
rerender();
})();