Enregistrement de Garantie
Enregistrez votre garantie en quelques clics
👤
Informations Client
🛴
Informations Produit
📸
Preuves d’achat
Prenez une photo de votre facture ou bon d’achat
💡 Conseil : Utilisez « Caméra » pour capturer en direct
Prenez une photo du compteur kilométrique à 0 km
💡 Conseil : Utilisez « Caméra » pour capturer en direct
Conditions de Garantie
Avant de soumettre ce formulaire, veuillez lire et accepter les conditions suivantes :
⚠️ En cas d’ouverture préalable par un autre réparateur, de traces d’humidité ou d’eau, ou de dommages liés à un accident ou à une mauvaise utilisation, la réparation ne pourra pas être prise en charge au titre de la garantie.
La garantie couvre uniquement les défauts de fabrication et exclut toute intervention due à un mauvais usage, choc, oxydation ou tentative de réparation non autorisée.
function trottiOpenTermsModal(instance) {
var suffix = instance > 0 ? '_' + instance : '';
var modal = document.getElementById('trotti-terms-modal' + suffix);
if (modal) {
modal.classList.add('trotti-terms-modal--open');
document.body.style.overflow = 'hidden';
}
}
function trottiCloseTermsModal(instance) {
var suffix = instance > 0 ? '_' + instance : '';
var modal = document.getElementById('trotti-terms-modal' + suffix);
if (modal) {
modal.classList.remove('trotti-terms-modal--open');
document.body.style.overflow = 'auto';
}
}
function trottiSyncTermsCheckbox(instance) {
var suffix = instance > 0 ? '_' + instance : '';
var modalCheckbox = document.getElementById('accept_terms_modal' + suffix);
var formCheckbox = document.getElementById('accept_terms' + suffix);
if (modalCheckbox && formCheckbox) {
formCheckbox.checked = modalCheckbox.checked;
}
}
// Fermer la modal en cliquant en dehors
window.addEventListener('click', function(event) {
if (event.target.classList.contains('trotti-terms-modal')) {
var modalId = event.target.id;
var instance = 0;
if (modalId.indexOf('_') !== -1) {
var parts = modalId.split('_');
if (parts.length > 1) {
instance = parseInt(parts[parts.length - 1]) || 0;
}
}
trottiCloseTermsModal(instance);
}
});
// Gestion de la caméra
var trottiCameraState = {
'proof': { stream: null, instance: 0 },
'odometer': { stream: null, instance: 0 }
};
function trottiOpenCamera(type, instance) {
var suffix = instance > 0 ? '_' + instance : '';
var videoElement = document.getElementById(type + '_preview' + suffix);
if (!videoElement) {
alert('Élément vidéo introuvable.');
return;
}
// Vérifier le support du navigateur
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
alert('Votre navigateur ne supporte pas l\'accès à la caméra.');
return;
}
navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } })
.then(function(stream) {
trottiCameraState[type].stream = stream;
trottiCameraState[type].instance = instance;
videoElement.srcObject = stream;
videoElement.style.display = 'block';
// Cacher le placeholder et le bouton de caméra
document.getElementById(type + '_placeholder' + suffix).style.display = 'none';
document.getElementById(type + '_camera_btn' + suffix).style.display = 'none';
// Afficher le bouton de capture et masquer le retake initialement
document.getElementById(type + '_capture_btn' + suffix).style.display = 'inline-block';
document.getElementById(type + '_retake_btn' + suffix).style.display = 'none';
})
.catch(function(err) {
console.error('Erreur d\'accès à la caméra:', err);
alert('Impossible d\'accéder à la caméra. Assurez-vous d\'avoir accordé les permissions.');
});
}
function trottiCaptureFrame(type, instance) {
var suffix = instance > 0 ? '_' + instance : '';
var videoElement = document.getElementById(type + '_preview' + suffix);
var canvasElement = document.getElementById(type + '_canvas' + suffix);
var imgElement = document.getElementById(type + (type === 'proof' ? '_image' : '_image') + suffix);
// determine file input id (matches fallback file input)
var fileInputId = (type === 'proof') ? 'proof_of_purchase' + suffix : 'odometer_image_input' + suffix;
var inputElement = document.getElementById(fileInputId);
if (!videoElement || !canvasElement || !imgElement || !inputElement) {
alert('Éléments de capture introuvables.');
return;
}
var context = canvasElement.getContext('2d');
canvasElement.width = videoElement.videoWidth || 640;
canvasElement.height = videoElement.videoHeight || 480;
context.drawImage(videoElement, 0, 0, canvasElement.width, canvasElement.height);
// Convertir en Blob puis créer un File pour l'ajouter à l'input file
canvasElement.toBlob(function(blob) {
if (!blob) {
alert('Erreur lors de la capture.');
return;
}
var filename = (type === 'proof') ? 'proof.jpg' : 'odometer.jpg';
try {
var file = new File([blob], filename, { type: 'image/jpeg' });
var dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
inputElement.files = dataTransfer.files; // this makes the file available in $_FILES on submit
} catch (e) {
// Fallback pour anciens navigateurs
try {
var dt = new ClipboardEvent('').clipboardData || new DataTransfer();
dt.items.add(blob);
inputElement.files = dt.files;
} catch (err) {
// As last resort, set the image as data URL into a hidden input (server must accept it)
console.warn('Impossible d\'assigner le fichier à l\'input file:', err);
}
}
// Afficher l'image capturée
var imageUrl = URL.createObjectURL(blob);
imgElement.src = imageUrl;
imgElement.style.display = 'block';
// Cacher la vidéo
videoElement.style.display = 'none';
canvasElement.style.display = 'none';
// Arrêter la caméra
if (trottiCameraState[type].stream) {
trottiCameraState[type].stream.getTracks().forEach(function(track) {
track.stop();
});
}
// Gérer les boutons
var camBtn = document.getElementById(type + '_camera_btn' + suffix);
var capBtn = document.getElementById(type + '_capture_btn' + suffix);
var retakeBtn = document.getElementById(type + '_retake_btn' + suffix);
if (camBtn) camBtn.style.display = 'inline-block';
if (capBtn) capBtn.style.display = 'none';
if (retakeBtn) retakeBtn.style.display = 'inline-block';
}, 'image/jpeg', 0.8);
}
function trottiCancelCapture(type, instance) {
var suffix = instance > 0 ? '_' + instance : '';
var videoElement = document.getElementById(type + '_preview' + suffix);
var imgElement = document.getElementById(type + (type === 'proof' ? '_image' : '_image') + suffix);
var fileInputId = (type === 'proof') ? 'proof_of_purchase' + suffix : 'odometer_image_input' + suffix;
var inputElement = document.getElementById(fileInputId);
var placeholderElement = document.getElementById(type + '_placeholder' + suffix);
// Vider l'entrée (files)
if (inputElement) {
try {
var dt = new DataTransfer();
inputElement.files = dt.files;
} catch (e) {
inputElement.value = '';
}
}
// Réinitialiser l'affichage
if (imgElement) imgElement.style.display = 'none';
if (videoElement) videoElement.style.display = 'none';
if (placeholderElement) placeholderElement.style.display = 'block';
// Afficher le bouton caméra
var camBtn = document.getElementById(type + '_camera_btn' + suffix);
var capBtn = document.getElementById(type + '_capture_btn' + suffix);
var retakeBtn = document.getElementById(type + '_retake_btn' + suffix);
if (camBtn) camBtn.style.display = 'inline-block';
if (capBtn) capBtn.style.display = 'none';
if (retakeBtn) retakeBtn.style.display = 'none';
}
// Progressive enhancement: on desktop show webcam UI and hide file inputs
document.addEventListener('DOMContentLoaded', function() {
try {
var isMobile = /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
var support = !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia && window.DataTransfer);
if (!isMobile && support) {
// Show proof desktop containers
document.querySelectorAll('[id^="proof_desktop_container"]').forEach(function(container) {
container.style.display = 'block';
var suffix = container.id.replace('proof_desktop_container', '');
var fileInput = document.getElementById('proof_of_purchase' + suffix);
if (fileInput) fileInput.style.display = 'none';
});
// Show odometer desktop containers
document.querySelectorAll('[id^="odometer_desktop_container"]').forEach(function(container) {
container.style.display = 'block';
var suffix = container.id.replace('odometer_desktop_container', '');
var fileInput = document.getElementById('odometer_image_input' + suffix);
if (fileInput) fileInput.style.display = 'none';
});
}
} catch (e) {
console.warn('Progressive enhancement init failed', e);
}
});