169 lines
5.7 KiB
Plaintext
169 lines
5.7 KiB
Plaintext
(function() {
|
|
'use strict';
|
|
|
|
console.log('🔧 DataLayer universel chargé');
|
|
|
|
// Arrêter sur les pages de confirmation
|
|
if (window.location.href.includes('confirmation')) {
|
|
console.log('⏭️ Page de confirmation - script ignoré');
|
|
return;
|
|
}
|
|
|
|
// Attendre le formulaire avec plus de patience
|
|
function waitForForm(maxAttempts = 100) {
|
|
let attempts = 0;
|
|
|
|
const checkInterval = setInterval(function() {
|
|
attempts++;
|
|
const form = document.getElementById('oscar_school_form');
|
|
|
|
if (form) {
|
|
clearInterval(checkInterval);
|
|
console.log('✅ Formulaire trouvé après', attempts, 'tentatives');
|
|
initializeDataLayer(form);
|
|
} else if (attempts >= maxAttempts) {
|
|
clearInterval(checkInterval);
|
|
console.log('⏱️ Formulaire non trouvé après ' + (maxAttempts * 200 / 1000) + ' secondes');
|
|
}
|
|
}, 200);
|
|
}
|
|
|
|
function initializeDataLayer(form) {
|
|
console.log('📊 Initialisation tracking DataLayer');
|
|
|
|
// Fonction SHA-256
|
|
async function sha256(value) {
|
|
if (!value) return '';
|
|
try {
|
|
const encoder = new TextEncoder();
|
|
const data = encoder.encode(value.trim().toLowerCase());
|
|
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
} catch (error) {
|
|
console.error('❌ Erreur hashage:', error);
|
|
return '';
|
|
}
|
|
}
|
|
|
|
// Récupérer texte d'un select
|
|
function getSelectText(selectId) {
|
|
const select = document.getElementById(selectId);
|
|
if (select && select.selectedIndex >= 0 && select.options[select.selectedIndex]) {
|
|
return select.options[select.selectedIndex].text;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
// Fonction principale de capture
|
|
async function captureAndPushDataLayer() {
|
|
console.log('📝 Capture des données formulaire');
|
|
|
|
// Vérifier consentement CNIL
|
|
const consentCheckbox = document.querySelector('input[name="cnil"]');
|
|
if (!consentCheckbox || !consentCheckbox.checked) {
|
|
console.warn('⚠️ Pas de consentement CNIL - dataLayer non envoyé');
|
|
return;
|
|
}
|
|
|
|
// Récupération des champs (compatible tous formulaires)
|
|
const typeRaw = (document.querySelector('input[name="type_formulaire"]') || {}).value || '';
|
|
const emailRaw = (document.getElementById('email') || {}).value || '';
|
|
const portableRaw = (document.getElementById('portable') || {}).value || '';
|
|
const villeRaw = (document.getElementById('ville') || {}).value || '';
|
|
const codePostalRaw = (document.getElementById('codepostal') || document.getElementById('code_postal') || {}).value || '';
|
|
const campusRaw = (document.getElementById('campus_selection') || {}).value || '';
|
|
|
|
// Selects (texte, pas value)
|
|
const statusRaw = getSelectText('OscarContactJeSuisRefIdField');
|
|
const formationRaw = getSelectText('formation');
|
|
|
|
// Pays
|
|
const paysSelect = document.getElementById('pays');
|
|
let paysNom = '';
|
|
if (paysSelect && paysSelect.selectedIndex > 0) {
|
|
paysNom = paysSelect.options[paysSelect.selectedIndex].text;
|
|
}
|
|
|
|
console.log('📦 Données:', {
|
|
type: typeRaw,
|
|
status: statusRaw,
|
|
campus: campusRaw,
|
|
formation: formationRaw,
|
|
hasEmail: !!emailRaw,
|
|
hasPhone: !!portableRaw
|
|
});
|
|
|
|
// Hashage
|
|
const emailHash = await sha256(emailRaw);
|
|
const portableHash = await sha256(portableRaw);
|
|
const codePostalHash = await sha256(codePostalRaw);
|
|
|
|
// Construction dataLayer
|
|
const dataLayerObject = {
|
|
event: 'form_submit',
|
|
type: typeRaw.trim().toLowerCase(),
|
|
je_suis: statusRaw.trim(),
|
|
sha256_email_address: emailHash,
|
|
sha256_phone_number: portableHash,
|
|
sha256_postal_code: codePostalHash,
|
|
ville: villeRaw.trim(),
|
|
pays: paysNom,
|
|
campus: campusRaw.trim(),
|
|
formation: formationRaw.trim()
|
|
};
|
|
|
|
// Push dataLayer
|
|
window.dataLayer = window.dataLayer || [];
|
|
window.dataLayer.push(dataLayerObject);
|
|
|
|
console.log('🚀 DataLayer push réussi:', dataLayerObject);
|
|
}
|
|
|
|
// Attacher aux événements submit du FORMULAIRE
|
|
form.addEventListener('submit', async function(event) {
|
|
console.log('📝 Event: form submit');
|
|
await captureAndPushDataLayer();
|
|
});
|
|
|
|
// Attacher AUSSI aux boutons (pour formulaire contact)
|
|
const desktopBtn = document.getElementById('desktop-submit-btn');
|
|
const mobileBtn = document.getElementById('mobile-submit-btn');
|
|
|
|
if (desktopBtn) {
|
|
desktopBtn.addEventListener('click', async function(e) {
|
|
console.log('📝 Event: desktop button click');
|
|
await captureAndPushDataLayer();
|
|
});
|
|
}
|
|
|
|
if (mobileBtn) {
|
|
mobileBtn.addEventListener('click', async function(e) {
|
|
console.log('📝 Event: mobile button click');
|
|
await captureAndPushDataLayer();
|
|
});
|
|
}
|
|
|
|
// Boutons submit classiques (JPO, candidature)
|
|
const submitButtons = form.querySelectorAll('button[type="submit"]');
|
|
submitButtons.forEach(btn => {
|
|
btn.addEventListener('click', async function(e) {
|
|
console.log('📝 Event: submit button click');
|
|
// Ne pas empêcher l'événement, juste capturer
|
|
await captureAndPushDataLayer();
|
|
});
|
|
});
|
|
|
|
console.log('✅ Tracking activé sur tous les événements');
|
|
}
|
|
|
|
// Démarrage
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
waitForForm();
|
|
});
|
|
} else {
|
|
waitForForm();
|
|
}
|
|
})();
|