My Digital Habits & Detox Goals

Digital Usage Self-Assessment

Overall Detox Goals

Plan & Schedule Detox Sessions

Add New Detox Session to Schedule

Weekly Detox Schedule

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(); });
      Scroll to Top