let currentLicense = null; let isCardFlipped = false; let cameraStream = null; // Event Listener für Nachrichten von FiveM window.addEventListener('message', function(event) { const data = event.data; switch(data.action) { case 'showLicense': showLicense(data.data); break; case 'hideLicense': closeLicense(); break; case 'openCamera': openCamera(); break; } }); // Lizenz anzeigen function showLicense(data) { currentLicense = data; const container = document.getElementById('license-container'); const card = document.getElementById('license-card'); // Loading anzeigen showLoading(); setTimeout(() => { // Lizenztyp-spezifische Klasse hinzufügen card.className = 'license-card ' + data.license.license_type; // Header befüllen document.getElementById('license-title').textContent = data.config.label; document.getElementById('license-icon').className = 'license-icon ' + data.config.icon; // Persönliche Daten document.getElementById('license-name').textContent = data.license.name || 'N/A'; document.getElementById('license-birthday').textContent = formatDate(data.license.birthday) || 'N/A'; document.getElementById('license-gender').textContent = formatGender(data.license.gender) || 'N/A'; // Dokument-Informationen document.getElementById('license-issue').textContent = formatDate(data.license.issue_date) || 'N/A'; document.getElementById('license-expire').textContent = formatDate(data.license.expire_date) || 'N/A'; document.getElementById('license-id').textContent = '#' + (data.license.id || '000000').toString().padStart(6, '0'); document.getElementById('license-issuer').textContent = data.license.issued_by_name || 'Behörde'; // Foto anzeigen displayPlayerPhoto(data.license); // Klassen anzeigen (nur bei Führerschein) displayLicenseClasses(data.license); // Status und Gültigkeit displayLicenseStatus(data.license); displayValidityIndicator(data.license); // Rückseite vorbereiten prepareBackSide(data.license); // Container anzeigen hideLoading(); container.classList.remove('hidden'); // Sound-Effekt playSound('card-flip-sound'); // Notification showNotification('Lizenz geladen', 'success'); }, 500); } // Spieler-Foto anzeigen function displayPlayerPhoto(license) { const photoImg = document.getElementById('player-photo'); const photoPlaceholder = document.getElementById('photo-placeholder'); if (license.photo_url && license.photo_url !== '') { photoImg.src = license.photo_url; photoImg.onload = function() { photoImg.classList.remove('hidden'); photoPlaceholder.classList.add('hidden'); }; photoImg.onerror = function() { photoImg.classList.add('hidden'); photoPlaceholder.classList.remove('hidden'); }; } else { photoImg.classList.add('hidden'); photoPlaceholder.classList.remove('hidden'); } } // Lizenz-Klassen anzeigen function displayLicenseClasses(license) { const classesRow = document.getElementById('license-classes-row'); const classesElement = document.getElementById('license-classes'); if (license.license_type === 'drivers_license' && license.classes && license.classes !== '[]') { try { const classes = JSON.parse(license.classes); if (classes && classes.length > 0) { classesElement.textContent = classes.join(', '); classesRow.style.display = 'flex'; return; } } catch (e) { console.error('Fehler beim Parsen der Klassen:', e); } } classesRow.style.display = 'none'; } // Lizenz-Status anzeigen function displayLicenseStatus(license) { const statusElement = document.getElementById('license-status'); const statusIcon = statusElement.querySelector('.status-icon'); const statusText = statusElement.querySelector('.status-text'); // Ablaufdatum prüfen let isExpired = false; let isExpiringSoon = false; if (license.expire_date) { const expireDate = new Date(license.expire_date); const today = new Date(); const daysUntilExpire = Math.ceil((expireDate - today) / (1000 * 60 * 60 * 24)); isExpired = daysUntilExpire < 0; isExpiringSoon = daysUntilExpire <= 30 && daysUntilExpire >= 0; } // Status setzen if (!license.is_active || isExpired) { statusElement.className = 'license-status inactive'; statusIcon.className = 'status-icon fas fa-times-circle'; statusText.textContent = isExpired ? 'Abgelaufen' : 'Ungültig'; } else if (isExpiringSoon) { statusElement.className = 'license-status warning'; statusIcon.className = 'status-icon fas fa-exclamation-triangle'; statusText.textContent = 'Läuft bald ab'; } else { statusElement.className = 'license-status active'; statusIcon.className = 'status-icon fas fa-check-circle'; statusText.textContent = 'Gültig'; } } // Gültigkeits-Indikator anzeigen function displayValidityIndicator(license) { const validityFill = document.getElementById('validity-fill'); const validityText = document.getElementById('validity-text'); if (!license.expire_date) { validityText.textContent = 'Unbegrenzt gültig'; validityFill.style.width = '100%'; validityFill.style.backgroundColor = '#4CAF50'; return; } const issueDate = new Date(license.issue_date); const expireDate = new Date(license.expire_date); const today = new Date(); const totalDays = Math.ceil((expireDate - issueDate) / (1000 * 60 * 60 * 24)); const remainingDays = Math.ceil((expireDate - today) / (1000 * 60 * 60 * 24)); const percentage = Math.max(0, Math.min(100, (remainingDays / totalDays) * 100)); validityFill.style.width = percentage + '%'; if (remainingDays < 0) { validityText.textContent = 'Abgelaufen'; validityFill.style.backgroundColor = '#f44336'; } else if (remainingDays <= 30) { validityText.textContent = `Noch ${remainingDays} Tage gültig`; validityFill.style.backgroundColor = '#ff9800'; } else { validityText.textContent = `Noch ${remainingDays} Tage gültig`; validityFill.style.backgroundColor = '#4CAF50'; } } // Rückseite vorbereiten function prepareBackSide(license) { const classesGrid = document.getElementById('classes-grid'); const restrictionsList = document.getElementById('restrictions-list'); const notesText = document.getElementById('notes-text'); // Klassen-Grid für Führerschein if (license.license_type === 'drivers_license' && license.classes) { try { const classes = JSON.parse(license.classes); classesGrid.innerHTML = ''; const classDescriptions = { 'A': 'Motorräder', 'A1': 'Leichte Motorräder', 'A2': 'Mittlere Motorräder', 'B': 'PKW', 'BE': 'PKW mit Anhänger', 'C': 'LKW', 'CE': 'LKW mit Anhänger', 'D': 'Bus', 'DE': 'Bus mit Anhänger' }; classes.forEach(cls => { const classItem = document.createElement('div'); classItem.className = 'class-item'; classItem.innerHTML = `
Keine Klassen verfügbar
'; } } else { classesGrid.innerHTML = 'Nicht zutreffend
'; } // Beschränkungen (Beispiel) restrictionsList.innerHTML = '