Astrophotography Target Planner & Equipment Checklist

Astrophotography Target Planner

Exposure Calculation & Pre-Session Checklist

Total Integration: 0.0 Hours

Deep Sky Observation Plan

Session Date: --- | Location: N/A

Telescope: N/A | Camera: N/A


1. Target List & Integration Time

ID Target Name (NGC/M) RA / Dec (J2000) Exposure (min) Total Integration
TOTAL PLANNED HOURS

2. Pre-Session Equipment Checklist

  • No items checked.

Session Context & Gear Specs


Target Log (Deep Sky Objects)

Total integration time is calculated by: (Number of Subs) x (Exposure Time per Sub).


Current Targets

Pre-Session Checklist

Ensure critical components and procedures are ready for deployment.

Log is empty.

"; return; } apnData.targets.forEach(t => { const totalIntegrationMin = (t.exposureSec * t.subs) / 60; const row = document.createElement('div'); row.className = 'apn-target-row'; row.innerHTML = `
${t.name} (${t.exposureSec}s x ${t.subs} subs)
${totalIntegrationMin.toFixed(0)} min
`; outputs.targetListEditor.appendChild(row); }); } function renderChecklist() { // Render the list of tasks for the PDF output (Tab 1) outputs.checklistList.innerHTML = apnData.checklist.map(item => `
  • `).join(''); // Render the interactive checklist editor (Tab 4) outputs.checklistEditor.innerHTML = apnData.checklist.map((item, index) => `
    `).join(''); } // --- 5. EVENT LISTENERS & ACTIONS --- function attachListeners() { // Meta Inputs const metaInputs = Object.values(inputs).filter(i => !i.id.includes('inp-')); metaInputs.forEach(inp => inp.addEventListener('input', renderAll)); // Buttons document.getElementById('btn-add-target').addEventListener('click', addTarget); document.getElementById('btn-add-checklist-item').addEventListener('click', addChecklistItem); } function addTarget() { const name = inputs.targetName.value.trim(); const ra = inputs.ra.value.trim(); const dec = inputs.dec.value.trim(); const exposureSec = parseInt(inputs.exposureSec.value) || 0; const subs = parseInt(inputs.subs.value) || 0; if (!name || !ra || !dec || exposureSec <= 0 || subs <= 0) { alert("Name, Coordinates, Exposure (Sec), and Number of Subs are required."); return; } const newTarget = { id: Date.now(), name: name, ra: ra, dec: dec, exposureSec: exposureSec, subs: subs }; apnData.targets.push(newTarget); // Clear inputs inputs.targetName.value = ""; inputs.ra.value = ""; inputs.dec.value = ""; renderAll(); } window.removeTarget = function(id) { if(confirm("Remove this target?")) { apnData.targets = apnData.targets.filter(t => t.id !== id); renderAll(); } }; window.addChecklistItem = function() { const text = inputs.newChecklistItem.value.trim(); if (!text) return; apnData.checklist.push({ id: Date.now(), text: text, checked: false }); inputs.newChecklistItem.value = ""; renderAll(); }; window.updateChecklistStatus = function(checkbox, index) { apnData.checklist[index].checked = checkbox.checked; renderAll(); }; // --- 6. TAB NAVIGATION --- window.apnSwitchTab = function(tabId) { document.querySelectorAll('.apn-tab-pane').forEach(p => p.classList.remove('active')); document.querySelectorAll('.apn-tab-btn').forEach(b => b.classList.remove('active')); document.getElementById(tabId).classList.add('active'); document.querySelector(`.apn-tab-btn[data-tab="${tabId}"]`).classList.add('active'); document.getElementById('astro-planner-tool').scrollIntoView({behavior: 'smooth'}); }; document.querySelectorAll('.apn-tab-btn').forEach(btn => { btn.addEventListener('click', function() { apnSwitchTab(this.dataset.tab); }); }); // --- 7. PDF EXPORT --- const btnDown = document.getElementById('apn-download-btn'); if(btnDown) { btnDown.addEventListener('click', function() { renderAll(); const element = document.getElementById('apn-render-area'); const filename = (inputs.sessionDate.value || 'Astro_Plan').replace(/\s+/g,'_'); const opt = { margin: 0.4, filename: `${filename}_Session_Plan.pdf`, image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true }, jsPDF: { unit: 'in', format: 'letter', orientation: 'landscape' } // Landscape for wide tables }; const origText = btnDown.innerText; btnDown.innerText = "Generating Plan..."; html2pdf().set(opt).from(element).save().then(() => { // Restore button text document.getElementById('apn-download-btn').innerText = origText; }); }); } // Start init(); });
    Scroll to Top