/** * Notenrechner DOM-Version * Moderne JavaScript DOM-Manipulation mit addEventListener * David & Karo - EIS Projekt */ // Notenmaßstab definieren const NOTENMASSTAB = { 'sehr gut': { min: 90, max: 100, color: '#ff1493' }, 'gut': { min: 75, max: 89, color: '#ff69b4' }, 'befriedigend': { min: 60, max: 74, color: '#ffa500' }, 'ausreichend': { min: 50, max: 59, color: '#ff8c00' }, 'nicht bestanden': { min: 0, max: 49, color: '#dc143c' } }; /** * Berechnet die Note basierend auf der Punktzahl * @param {number} punkte - Erreichte Punktzahl * @param {number} maxPunkte - Maximale Punktzahl (default: 100) * @returns {object} - Enthält Note, Prozentage und Details */ function berechneNote(punkte, maxPunkte = 100) { // Eingabe validieren punkte = parseFloat(punkte); maxPunkte = parseFloat(maxPunkte); if (isNaN(punkte) || isNaN(maxPunkte)) { return { note: 'Fehler', prozent: 0, valid: false, nachricht: 'Bitte geben Sie Zahlen ein!' }; } if (maxPunkte <= 0) { return { note: 'Fehler', prozent: 0, valid: false, nachricht: 'Maximale Punktzahl muss größer als 0 sein!' }; } if (punkte < 0 || punkte > maxPunkte) { return { note: 'Fehler', prozent: 0, valid: false, nachricht: `Punkte müssen zwischen 0 und ${maxPunkte} liegen!` }; } // Prozentage berechnen const prozent = Math.round((punkte / maxPunkte) * 100); // Note basierend auf Prozentage bestimmen let note = 'nicht bestanden'; let noteColor = '#dc143c'; for (const [noteText, range] of Object.entries(NOTENMASSTAB)) { if (prozent >= range.min && prozent <= range.max) { note = noteText; noteColor = range.color; break; } } return { note: note, prozent: prozent, punkte: punkte, maxPunkte: maxPunkte, valid: true, color: noteColor, nachricht: `${punkte} von ${maxPunkte} Punkten (${prozent}%) = ${note}` }; } /** * Validiert die Eingabe */ function validateInput(value, maxValue = 100) { if (value === '' || value === null) { return { valid: false, error: 'Bitte geben Sie eine Punktzahl ein!' }; } const num = parseFloat(value); if (isNaN(num)) { return { valid: false, error: 'Bitte geben Sie eine Zahl ein!' }; } if (num < 0 || num > maxValue) { return { valid: false, error: `Punktzahl muss zwischen 0 und ${maxValue} liegen!` }; } return { valid: true }; } // Warte bis DOM geladen ist document.addEventListener('DOMContentLoaded', function() { // Simple Notenrechner const simplePointsInput = document.getElementById('simple-points'); const simpleMaxInput = document.getElementById('simple-max'); const simpleCalculateBtn = document.getElementById('simple-calculate-btn'); const simpleResult = document.getElementById('simple-result'); const simpleProgressBar = document.getElementById('simple-progress-bar'); // Multiple Notenrechner const addGradeBtn = document.getElementById('add-grade-btn'); const multipleCalculateBtn = document.getElementById('multiple-calculate-btn'); const multipleResetBtn = document.getElementById('multiple-reset-btn'); const gradesContainer = document.getElementById('grades-container'); const multipleResult = document.getElementById('multiple-result'); const multipleAverage = document.getElementById('multiple-average'); // Simple Grade Calculator Event Listener if (simpleCalculateBtn && simplePointsInput) { simpleCalculateBtn.addEventListener('click', function() { calculateSimpleGrade(); }); // Enter-Taste auch zum Berechnen verwenden simplePointsInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') { calculateSimpleGrade(); } }); // Live-Berechnung während des Tippens simplePointsInput.addEventListener('input', function() { updateSimpleGradeLive(); }); simpleMaxInput.addEventListener('input', function() { updateSimpleGradeLive(); }); } // Multiple Grade Calculator Event Listener if (addGradeBtn) { addGradeBtn.addEventListener('click', function() { addGradeInput(); }); } if (multipleCalculateBtn) { multipleCalculateBtn.addEventListener('click', function() { calculateMultipleGrades(); }); } if (multipleResetBtn) { multipleResetBtn.addEventListener('click', function() { resetMultipleCalculator(); }); } // Initiale Grade hinzufügen if (gradesContainer) { addGradeInput(); } /** * Berechnet einfache Note und zeigt Ergebnis */ function calculateSimpleGrade() { const points = simplePointsInput.value; const max = simpleMaxInput.value || 100; // Validierung const validation = validateInput(points, max); if (!validation.valid) { showSimpleError(validation.error); return; } // Berechnung const result = berechneNote(parseFloat(points), parseFloat(max)); if (!result.valid) { showSimpleError(result.nachricht); return; } // Erfolgreiche Anzeige showSimpleSuccess(result); } /** * Live-Aktualisierung während des Tippens */ function updateSimpleGradeLive() { const points = simplePointsInput.value; const max = simpleMaxInput.value || 100; if (points === '') { simpleResult.innerHTML = ''; simpleProgressBar.style.display = 'none'; return; } const validation = validateInput(points, max); if (!validation.valid) { simpleResult.innerHTML = `
⚠️ ${validation.error}
`; simpleProgressBar.style.display = 'none'; return; } const result = berechneNote(parseFloat(points), parseFloat(max)); if (result.valid) { simpleResult.innerHTML = `❌ ${errorMessage}
`; simpleProgressBar.style.display = 'none'; // Reset nach 2 Sekunden setTimeout(() => { simplePointsInput.style.borderColor = ''; simplePointsInput.style.backgroundColor = ''; }, 2000); } /** * Erfolgreiche Anzeige mit Progressbar */ function showSimpleSuccess(result) { simplePointsInput.style.borderColor = 'green'; simplePointsInput.style.backgroundColor = 'rgba(34, 197, 94, 0.1)'; simpleResult.innerHTML = `Punkte: ${result.punkte} / ${result.maxPunkte}
Prozentage: ${result.prozent}%
📊 Fortschritt: ${percent}% – Sehr Gut Bereich
`; } /** * Konvertiert Hex-Farben zu RGB für rgba() */ function hexToRgb(hex) { // Entfernt das # Zeichen hex = hex.replace('#', ''); // Konvertiert zu RGB const r = parseInt(hex.substring(0, 2), 16); const g = parseInt(hex.substring(2, 4), 16); const b = parseInt(hex.substring(4, 6), 16); return `${r}, ${g}, ${b}`; } /** * Neue Grade-Input-Zeile hinzufügen (Multiple) */ function addGradeInput() { if (!gradesContainer) return; const gradeId = Date.now(); const gradeDiv = document.createElement('div'); gradeDiv.className = 'grade-input-group-dom'; gradeDiv.id = `grade-${gradeId}`; gradeDiv.innerHTML = `⚠️ Bitte füllen Sie mindestens eine Note aus!
`; multipleAverage.innerHTML = ''; return; } // Einzelnoten anzeigen mit Progressbars let resultHTML = 'Von ${noten.length} Note(n) – Durchschnitt: ${durchschnittProzent}%