diff --git a/resources/[tools]/nordi_license/html/script.js b/resources/[tools]/nordi_license/html/script.js index 66d984978..eca5c8326 100644 --- a/resources/[tools]/nordi_license/html/script.js +++ b/resources/[tools]/nordi_license/html/script.js @@ -1,4 +1,6 @@ let currentLicense = null; +let isCardFlipped = false; +let cameraStream = null; // Event Listener für Nachrichten von FiveM window.addEventListener('message', function(event) { @@ -8,6 +10,12 @@ window.addEventListener('message', function(event) { case 'showLicense': showLicense(data.data); break; + case 'hideLicense': + closeLicense(); + break; + case 'openCamera': + openCamera(); + break; } }); @@ -17,75 +25,301 @@ function showLicense(data) { const container = document.getElementById('license-container'); const card = document.getElementById('license-card'); - // Lizenztyp-spezifische Klasse hinzufügen - card.className = 'license-card ' + data.license.license_type; + // Loading anzeigen + showLoading(); - // Header befüllen - document.querySelector('.license-title').textContent = data.config.label; - document.querySelector('.license-icon').className = 'license-icon ' + data.config.icon; - - // Lizenzinformationen befüllen - document.getElementById('license-name').textContent = data.license.name || 'N/A'; - document.getElementById('license-birthday').textContent = data.license.birthday || 'N/A'; - document.getElementById('license-gender').textContent = formatGender(data.license.gender) || 'N/A'; - document.getElementById('license-issue').textContent = data.license.issue_date || 'N/A'; - document.getElementById('license-expire').textContent = data.license.expire_date || 'N/A'; - - // Klassen anzeigen (nur bei Führerschein) - const classesRow = document.getElementById('license-classes-row'); - if (data.license.classes && data.license.classes !== '[]') { - try { - const classes = JSON.parse(data.license.classes); - if (classes && classes.length > 0) { - document.getElementById('license-classes').textContent = classes.join(', '); - classesRow.style.display = 'flex'; - } else { - classesRow.style.display = 'none'; - } - } catch (e) { - classesRow.style.display = 'none'; - } - } else { - classesRow.style.display = 'none'; - } - - // Status anzeigen - const statusElement = document.getElementById('license-status'); - if (data.license.is_active) { - statusElement.textContent = '✅ Gültig'; - statusElement.className = 'license-status active'; - } else { - statusElement.textContent = '❌ Ungültig'; - statusElement.className = 'license-status inactive'; - } - - // Container anzeigen - container.classList.remove('hidden'); + 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); } - // Foto anzeigen +// Spieler-Foto anzeigen +function displayPlayerPhoto(license) { const photoImg = document.getElementById('player-photo'); const photoPlaceholder = document.getElementById('photo-placeholder'); - if (data.license.photo_url && data.license.photo_url !== '') { - // Echtes Foto anzeigen - photoImg.src = data.license.photo_url; - photoImg.classList.remove('hidden'); - photoPlaceholder.classList.add('hidden'); + 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 { - // Platzhalter anzeigen photoImg.classList.add('hidden'); photoPlaceholder.classList.remove('hidden'); } +} -// Geschlecht formatieren -function formatGender(gender) { - const genderMap = { - 'male': 'Männlich', - 'female': 'Weiblich', - 'other': 'Divers' - }; - return genderMap[gender] || gender; +// 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 = '