My Digital Habits & Detox Goals
Overall Detox Goals
Track Detox Progress & Reflect
Overall Reflection for the Week/Period
Past Reflections & Insights
No reflections saved yet.
Alternative Activity Library & Settings
Manage Alternative (Non-Digital) Activities
Your Alternative Activity Library:
Manage Detox Types
Your Custom Detox Types:
Select a date to track & reflect.
'; return; }
const sessionsForDate = dds_scheduledDetoxSessions.filter(s => s.date === date);
if (sessionsForDate.length === 0) { area.innerHTML = `
No detox sessions scheduled for ${new Date(date+"T00:00:00Z").toLocaleDateString()}.
`; return; }
sessionsForDate.forEach(session => {
const div = document.createElement('div');
div.className = 'dds-section'; // Re-use section style for clarity
const detoxType = dds_detoxTypes.find(dt => dt.id === session.typeId);
const reflection = session.reflection || {};
div.innerHTML = `
${session.name} (${session.startTime} - ${session.endTime}) ${detoxType?detoxType.name:''}
`;
area.appendChild(div);
});
}
function dds_updateSessionReflection(sessionId, field, value) {
const sessionIndex = dds_scheduledDetoxSessions.findIndex(s => s.id === sessionId);
if (sessionIndex > -1) {
if (field === 'status') {
dds_scheduledDetoxSessions[sessionIndex].status = value;
// Show/hide reflection fields based on new status
const parentDiv = document.getElementById(`status-${sessionId}`).closest('.dds-section');
const reflectionFields = parentDiv.querySelectorAll('.dds-form-group:not(:first-child)'); // Get all but status field
reflectionFields.forEach(rf => rf.style.display = (value === 'Completed' || value === 'Partially') ? 'block' : 'none');
} else {
if (!dds_scheduledDetoxSessions[sessionIndex].reflection) dds_scheduledDetoxSessions[sessionIndex].reflection = {};
dds_scheduledDetoxSessions[sessionIndex].reflection[field] = value;
}
dds_saveData();
}
}
function dds_getWeekKeyForReflection(dateStr){ /* Uses YYYY-Www format */
const date = new Date(dateStr + "T00:00:00Z");
date.setUTCDate(date.getUTCDate() + 4 - (date.getUTCDay() || 7)); // Set to Thursday of current week
const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
const weekNo = Math.ceil((((date - yearStart) / 86400000) + 1) / 7);
return `${date.getUTCFullYear()}-W${String(weekNo).padStart(2,'0')}`;
}
function dds_savePeriodReflection(){
const trackDate = document.getElementById('dds-trackReflectDate').value;
if(!trackDate) { alert("Please select a date to associate this reflection with its week."); return; }
const weekKey = dds_getWeekKeyForReflection(trackDate);
dds_periodReflections[weekKey] = document.getElementById('dds-periodReflectionNotes').value;
dds_saveData();
alert(`Reflection for week ${weekKey} saved.`);
dds_renderPastReflections();
}
function dds_loadPeriodReflection() {
const trackDate = document.getElementById('dds-trackReflectDate').value;
if(!trackDate) return;
const weekKey = dds_getWeekKeyForReflection(trackDate);
document.getElementById('dds-periodReflectionNotes').value = dds_periodReflections[weekKey] || '';
}
function dds_renderPastReflections(){
const listEl = document.getElementById('dds-pastReflectionsList'); listEl.innerHTML = '';
const sortedWeeks = Object.keys(dds_periodReflections).sort().reverse(); // Show most recent first
if (sortedWeeks.length === 0) {listEl.innerHTML = '
No past weekly reflections found.'; return;}
sortedWeeks.slice(0,5).forEach(weekKey => { // Show last 5
const li = document.createElement('li');
li.innerHTML = `
Week ${weekKey}:${dds_periodReflections[weekKey].substring(0,100)}...
`;
listEl.appendChild(li);
});
}
// --- Activity Library & Settings Tab ---
function dds_initActivitiesSettingsTab(){
dds_renderAltActivityLibraryList();
dds_renderCustomDetoxTypesList();
dds_populateAltActivityCategory(); // Ensure category dropdown is populated
}
function dds_populateAltActivityCategory(){ /* For activity library form */
const selectEl = document.getElementById('dds-altActivityCategory');
// Options are hardcoded in HTML, no need to populate unless dynamic
}
document.getElementById('dds-altActivityForm').onsubmit = (e) => { /* Standard CRUD */
e.preventDefault();
const id = document.getElementById('dds-altActivityId').value;
const name = document.getElementById('dds-altActivityName').value.trim();
if(!name) { alert("Activity name required."); return;}
const activityData = {
id: id || dds_generateId(), name,
category: document.getElementById('dds-altActivityCategory').value,
isDefault: id ? dds_altActivities.find(a=>a.id===id).isDefault : false
};
if (id) dds_altActivities = dds_altActivities.map(a => a.id === id ? activityData : a);
else dds_altActivities.push(activityData);
dds_saveData(); dds_renderAltActivityLibraryList(); dds_resetAltActivityForm();
dds_populateAltActivitySelect(); // Update dropdown in plan tab
};
function dds_resetAltActivityForm(){document.getElementById('dds-altActivityForm').reset(); document.getElementById('dds-altActivityId').value=''; document.getElementById('dds-cancelAltActivityEditBtn').style.display='none';}
function dds_renderAltActivityLibraryList(){
const listEl = document.getElementById('dds-altActivityLibraryList'); listEl.innerHTML = '';
if(dds_altActivities.length === 0) { listEl.innerHTML = '
Your alternative activity library is empty.'; return;}
dds_altActivities.forEach(act => {
const li = document.createElement('li');
li.innerHTML = `
${act.name} (${act.category}) ${act.isDefault?'(Default)':''}
${!act.isDefault ? `` : ''}
`;
listEl.appendChild(li);
});
}
function dds_editAltActivity(id){const act=dds_altActivities.find(a=>a.id===id); if(!act)return; document.getElementById('dds-altActivityId').value=act.id; document.getElementById('dds-altActivityName').value=act.name; document.getElementById('dds-altActivityCategory').value=act.category; document.getElementById('dds-cancelAltActivityEditBtn').style.display='inline-block';}
function dds_deleteAltActivity(id){
// Check if used in any planned sessions' altActivityIds array
if(dds_scheduledDetoxSessions.some(s => (s.altActivityIds || []).includes(id))) {
alert("Cannot delete: This activity is planned for one or more detox sessions. Remove it from plans first."); return;
}
if(confirm('Delete this activity?')){dds_altActivities = dds_altActivities.filter(a=>a.id!==id); dds_saveData(); dds_renderAltActivityLibraryList(); dds_populateAltActivitySelect();}
}
// Manage Detox Types
document.getElementById('dds-detoxTypeManagementForm').onsubmit = (e) => {
e.preventDefault(); const name = document.getElementById('dds-manageDetoxTypeName').value.trim();
if(!name || dds_detoxTypes.some(dt => dt.name.toLowerCase() === name.toLowerCase())) { alert(name?"Type already exists.":"Name required."); return;}
dds_detoxTypes.push({id:dds_generateId(), name:name, isDefault:false});
dds_saveData(); dds_renderCustomDetoxTypesList(); dds_populateDetoxTypeSelect(); document.getElementById('dds-detoxTypeManagementForm').reset();
};
function dds_renderCustomDetoxTypesList(){
const listEl = document.getElementById('dds-customDetoxTypesList'); listEl.innerHTML = '';
const customTypes = dds_detoxTypes.filter(dt => !dt.isDefault);
if(customTypes.length === 0){listEl.innerHTML = '
No custom detox types added.'; return;}
customTypes.forEach(dt => {
const li = document.createElement('li');
li.innerHTML = `
${dt.name} `;
listEl.appendChild(li);
});
}
function dds_deleteCustomDetoxType(id){
if(dds_scheduledDetoxSessions.some(s => s.typeId === id)){alert("Cannot delete: Type used in scheduled sessions."); return;}
if(confirm("Delete this custom detox type?")){dds_detoxTypes = dds_detoxTypes.filter(dt=>dt.id!==id); dds_saveData(); dds_renderCustomDetoxTypesList(); dds_populateDetoxTypeSelect();}
}
// --- PDF Download ---
document.getElementById('dds-downloadPdfBtn').onclick = async () => {
const weekStart = document.getElementById('dds-scheduleWeekStart').value; // Use the week currently shown in planner for context
if (!weekStart) { alert("Please select a week in the 'Plan & Schedule' tab to generate a report for."); return; }
const { jsPDF } = window.jspdf; const pdf = new jsPDF('p', 'mm', 'a4');
let currentY = 15; const margin = 15; const contentWidth = pdf.internal.pageSize.getWidth() - 2*margin;
pdf.setFontSize(18); pdf.setTextColor('#80CBC4');
pdf.text("Digital Detox Plan & Summary", pdf.internal.pageSize.getWidth() / 2, currentY, { align: 'center' });
currentY += 8;
pdf.setFontSize(10); pdf.setTextColor('#00796B');
const weekEndDate = new Date(weekStart + "T00:00:00Z"); weekEndDate.setUTCDate(weekEndDate.getUTCDate() + 6);
pdf.text(`Plan for Week: ${new Date(weekStart+"T00:00:00Z").toLocaleDateString()} - ${weekEndDate.toLocaleDateString()}`, pdf.internal.pageSize.getWidth() / 2, currentY, { align: 'center'});
currentY += 10;
// User Habits Summary (Brief)
pdf.setFontSize(12); pdf.setTextColor('#80CBC4'); pdf.text("My Digital Habits & Goals:", margin, currentY); currentY +=6;
pdf.setFontSize(9); pdf.setTextColor('#37474F');
pdf.text(`- Distracting Activities: ${(dds_userHabits.distractingApps || "Not specified").substring(0,100)}...`, margin, currentY); currentY+=5;
pdf.text(`- Desired Benefits: ${(dds_userHabits.desiredBenefits.join(', ') || "Not specified").substring(0,100)}...`, margin, currentY); currentY+=5;
pdf.text(`- General Detox Ideas: ${(dds_userHabits.generalDetoxTypes || "Not specified").substring(0,100)}...`, margin, currentY); currentY+=8;
// Scheduled Detox Sessions for the week
pdf.setFontSize(12); pdf.setTextColor('#80CBC4'); pdf.text("Scheduled Detox Sessions for the Week:", margin, currentY); currentY +=6;
const sessionsForWeek = dds_scheduledDetoxSessions.filter(s => {
const sessionDate = new Date(s.date + "T00:00:00Z");
return sessionDate >= new Date(weekStart + "T00:00:00Z") && sessionDate <= weekEndDate;
}).sort((a,b) => new Date(a.date+"T"+a.startTime) - new Date(b.date+"T"+b.startTime));
if(sessionsForWeek.length > 0) {
const body = sessionsForWeek.map(s => {
const dt = dds_detoxTypes.find(dtt => dtt.id === s.typeId);
const altActs = (s.altActivityIds || []).map(id => dds_altActivities.find(aa=>aa.id===id)?.name).filter(name=>name).join(', ');
return [
new Date(s.date+"T00:00:00Z").toLocaleDateString('en-US',{weekday:'short'}),
s.name,
dt ? dt.name : '-',
`${s.startTime}-${s.endTime}`,
altActs.substring(0,40) + (altActs.length > 40 ? '...' : '')
];
});
pdf.autoTable({
head: [["Day", "Session Purpose", "Detox Type", "Time", "Alternative Activities"]],
body: body, startY: currentY, theme:'grid', headStyles:{fillColor:'#E0F2F1', textColor:'#00796B'}, styles:{fontSize:8, cellPadding:1.2},
columnStyles: {0:{cellWidth:15}, 4:{cellWidth: 'auto'}}
});
currentY = pdf.lastAutoTable.finalY + 7;
} else { pdf.setFontSize(9); pdf.text("No detox sessions scheduled for this week.", margin, currentY); currentY+=6; }
// Reflections (if any for this week)
const weekKeyPdf = dds_getWeekKeyForReflection(weekStart);
const reflection = dds_periodReflections[weekKeyPdf];
if (reflection) {
if (currentY > pdf.internal.pageSize.getHeight() - 30) {pdf.addPage(); currentY=margin;}
pdf.setFontSize(12); pdf.setTextColor('#80CBC4'); pdf.text(`Reflection for Week ${weekKeyPdf.split('-W')[1]}:`, margin, currentY); currentY +=6;
pdf.setFontSize(9); pdf.setTextColor('#37474F');
const lines = pdf.splitTextToSize(reflection, contentWidth);
pdf.text(lines, margin, currentY);
}
pdf.save(`Digital_Detox_Plan_Week_${weekStart}.pdf`);
};
// --- Initial Load ---
document.addEventListener('DOMContentLoaded', () => {
dds_openTab(null, dds_tabs[0]);
const firstTabButton = document.querySelector(`.dds-tab-button[onclick*="'${dds_tabs[0]}'"]`);
if (firstTabButton) firstTabButton.classList.add('active');
else console.error("First tab button not found for initial activation.");
dds_updateNavButtons();
});