Standard Deviation & Variance Calculator
Results will appear here after calculation.
${result.error}
`; downloadBtn.style.display = 'none'; calculationResult = null; return; } const dataTypeText = result.dataType === 'population' ? 'Population' : 'Sample'; const varianceSymbol = result.dataType === 'population' ? '\u03C3\u00B2' : 's\u00B2'; // σ² or s² const stdDevSymbol = result.dataType === 'population' ? '\u03C3' : 's'; // σ or s resultsDiv.innerHTML = `Results (${dataTypeText})
`; resultsDiv.innerHTML += `Count (n): ${result.count}
`; resultsDiv.innerHTML += `Sum (Σx): ${formatNumber(result.sum)}
`; resultsDiv.innerHTML += `Mean (${dataTypeText === 'Population' ? '\u03BC' : 'x\u0304'}): ${formatNumber(result.mean)}
`; // μ or x̄ resultsDiv.innerHTML += `Sum of Squares (Σx²): ${formatNumber(result.sumSq)}
`; resultsDiv.innerHTML += `Variance (${varianceSymbol}): ${formatNumber(result.variance)}
`; resultsDiv.innerHTML += `Standard Deviation (${stdDevSymbol}): ${formatNumber(result.stdDev)}
`; calculationResult = result; // Store for PDF downloadBtn.style.display = 'inline-block'; // Show download button } // --- Generate and Download PDF --- function downloadPDF() { if (!calculationResult || calculationResult.error) return; const doc = new jsPDF(); const { count, sum, sumSq, mean, variance, stdDev, dataType } = calculationResult; // --- Get Colors --- const styles = getComputedStyle(document.querySelector('.sdv-calculator-container')); const primaryColor = styles.getPropertyValue('--sdv-primary-color').trim(); const textColor = styles.getPropertyValue('--sdv-text-color').trim(); const labelColor = styles.getPropertyValue('--sdv-label-color').trim(); // --- PDF Content --- const lineHeight = 7; const margin = 15; let currentY = 20; // Title doc.setFontSize(18); doc.setTextColor(primaryColor); doc.text("Statistical Calculation Results", doc.internal.pageSize.getWidth() / 2, currentY, { align: 'center' }); currentY += lineHeight * 1.5; // Data Type doc.setFontSize(12); doc.setTextColor(textColor); doc.text(`Data Type: ${dataType === 'population' ? 'Population' : 'Sample'}`, margin, currentY); currentY += lineHeight * 2; // Results Table (simple text alignment) const results = [ { label: "Count (n):", value: count }, { label: "Sum (Σx):", value: formatNumber(sum) }, { label: `Mean (${dataType === 'Population' ? 'μ' : 'x̄'}):`, value: formatNumber(mean) }, { label: "Sum of Squares (Σx²):", value: formatNumber(sumSq) }, { label: `Variance (${dataType === 'population' ? 'σ²' : 's²'}):`, value: formatNumber(variance) }, { label: `Standard Deviation (${dataType === 'population' ? 'σ' : 's'}):`, value: formatNumber(stdDev) } ]; doc.setFontSize(11); const labelX = margin; const valueX = doc.internal.pageSize.getWidth() / 2; // Position values around the middle results.forEach(item => { doc.setFont("helvetica", "bold"); doc.setTextColor(labelColor); doc.text(item.label, labelX, currentY); doc.setFont("courier", "normal"); // Use monospace for values doc.setTextColor(textColor); doc.text(item.value, valueX, currentY); currentY += lineHeight * 1.5; // Increase spacing between lines }); // --- Save PDF --- doc.save('statistics_results.pdf'); } // --- Event Listeners --- calculateBtn.addEventListener('click', () => { const parseResult = parseData(); const selectedType = document.querySelector('input[name="sdv-datatype"]:checked').value; if (parseResult.error) { displayResults({ error: parseResult.error }); } else { const statsResult = calculateStats(parseResult.data, selectedType); displayResults(statsResult); } }); downloadBtn.addEventListener('click', downloadPDF); // Clear error messages when input changes dataInput.addEventListener('input', () => { if (resultsDiv.querySelector('.sdv-error')) { resultsDiv.innerHTML = 'Results will appear here after calculation.
'; downloadBtn.style.display = 'none'; calculationResult = null; } }); // --- Initial Setup --- resultsDiv.innerHTML = 'Enter data, select data type, and click "Calculate".
'; downloadBtn.style.display = 'none'; // Ensure download button is hidden initially })(); // IIFE