(function (){
'use strict';
var CFG=window.CLP_DATA||{};
var form=document.querySelector('[data-clp-form]');
if(!form) return;
var TOTAL=4;
var product=form.getAttribute('data-product')||(CFG.product||'per');
var current=1;
var started=false;
var completed=false;
var panes=form.querySelectorAll('.cleerly-lp__pane');
var bar=form.querySelector('[data-clp-progress]');
var stepLabel=form.querySelector('[data-clp-step-current]');
var btnPrev=form.querySelector('[data-clp-prev]');
var btnNext=form.querySelector('[data-clp-next]');
var btnSubmit=form.querySelector('[data-clp-submit]');
var feedback=form.querySelector('[data-clp-feedback]');
var done=form.querySelector('[data-clp-done]');
var STORAGE='clp_lead_' + product;
var UTM=(function (){
var keys=['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'gclid'];
var params=new URLSearchParams(window.location.search);
var stored={};
try { stored=JSON.parse(localStorage.getItem('clp_utm')||'{}'); } catch (e){}
var changed=false;
keys.forEach(function (k){ var v=params.get(k); if(v){ stored[k]=v; changed=true; }});
if(changed){ try { localStorage.setItem('clp_utm', JSON.stringify(stored)); } catch (e){}}
if(!stored.utm_source) stored.utm_source='cleerly';
try { if(/tracking_debug=1/.test(window.location.search)) window.__clp_utm=stored; } catch (e){}
return stored;
})();
function uuid(){
if(window.crypto&&crypto.randomUUID) return crypto.randomUUID();
return 'xxxxxxxxyxxxx4xxx'.replace(/[xy]/g, function (c){
var r=(Math.random() * 16) | 0;
return (c==='x' ? r:(r & 0x3) | 0x8).toString(16);
}) + Date.now().toString(16);
}
function sessionId(){
var id=localStorage.getItem('clp_session');
if(!id){ id=uuid(); try { localStorage.setItem('clp_session', id); } catch (e){}}
return id;
}
var GTM = !!CFG.gtmEnabled;
function track(name, params){
if(GTM) return;
params=params||{};
params.lp_product=product;
window.dataLayer=window.dataLayer||[];
window.dataLayer.push(Object.assign({ event: name }, params));
if(typeof window.gtag==='function') window.gtag('event', name, params);
}
var STEP_NAMES={ 1: 'objectif', 2: 'montant', 3: 'contact_pref', 4: 'coordonnees' };
function collect(){
var data={};
['objectif', 'montant', 'contact_pref', 'creneau_moment'].forEach(function (n){
var el=form.querySelector('input[name="' + n + '"]:checked');
if(el) data[n]=el.value;
});
['prenom', 'nom', 'email', 'phone'].forEach(function (n){
var el=form.querySelector('[name="' + n + '"]');
if(el&&el.value) data[n]=el.value.trim();
});
var consent=form.querySelector('[name="consent"]');
data.consent=consent&&consent.checked ? 1:0;
Object.keys(UTM).forEach(function (k){ if(UTM[k]) data[k]=UTM[k]; });
return data;
}
function save(){ try { localStorage.setItem(STORAGE, JSON.stringify(collect())); } catch (e){}}
function restore(){
var raw;
try { raw=localStorage.getItem(STORAGE); } catch (e){ return; }
if(!raw) return;
var data;
try { data=JSON.parse(raw); } catch (e){ return; }
Object.keys(data).forEach(function (k){
if(k==='consent') return;
var radios=form.querySelectorAll('input[type="radio"][name="' + k + '"]');
if(radios.length){
[].forEach.call(radios, function (r){ if(r.value===data[k]) r.checked=true; });
return;
}
var field=form.querySelector('[name="' + k + '"]');
if(field) field.value=data[k];
});
toggleContactSub();
}
function refreshNonce(){
return fetch(CFG.ajaxUrl + '?action=clp_get_nonce', {
method: 'GET', credentials: 'same-origin'
})
.then(function (r){ return r.json().catch(function (){ return {};});})
.then(function (j){
if(j&&j.success&&j.data&&j.data.nonce){
CFG.nonce=j.data.nonce;
return true;
}
return false;
})
.catch(function (){ return false; });
}
function doPost(action, extra){
var body=new FormData();
body.append('action', action);
body.append('nonce', CFG.nonce||'');
body.append('session_uuid', sessionId());
body.append('product', product);
body.append('answers', JSON.stringify(collect()));
Object.keys(extra||{}).forEach(function (k){ body.append(k, extra[k]); });
return fetch(CFG.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body })
.then(function (r){
return r.json().catch(function (){ return {};})
.then(function (j){ j.__status=r.status; return j; });
});
}
function post(action, extra){
return doPost(action, extra).then(function (res){
var staleNonce=res&&(res.__status===403
|| (res.data&&/session/i.test(res.data.message||'')));
if(!staleNonce) return res;
return refreshNonce().then(function (refreshed){
if(!refreshed) return res;
return doPost(action, extra);
});
});
}
function sendPartial(step){ post('clp_partial_lead', { step: step });}
function reportError(type){
try {
var body=new FormData();
body.append('action', 'clp_report_error');
body.append('error_type', type);
body.append('session_uuid', sessionId());
body.append('product', product);
body.append('step', current);
body.append('source_url', window.location.href);
body.append('answers', JSON.stringify(collect()));
if(navigator.sendBeacon){
navigator.sendBeacon(CFG.ajaxUrl, body);
}else{
fetch(CFG.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body, keepalive: true })
.catch(function (){});
}} catch (e){}}
function fireConversions(){
if(GTM) return;
var data=collect();
if(typeof window.gtag==='function'){
if(CFG.enhanced&&(data.email||data.phone)){
window.gtag('set', 'user_data', { email: data.email||'', phone_number: data.phone||'' });
}
if(CFG.adsId&&CFG.adsLabel){
window.gtag('event', 'conversion', { send_to: CFG.adsId + '/' + CFG.adsLabel });
}}
if(typeof window.fbq==='function') window.fbq('track', 'Lead');
}
function paneOf(step){ return form.querySelector('.cleerly-lp__pane[data-step="' + step + '"]'); }
function validateStep(step){
if(step===1) return !!form.querySelector('input[name="objectif"]:checked');
if(step===2) return !!form.querySelector('input[name="montant"]:checked');
if(step===3){
var pref=form.querySelector('input[name="contact_pref"]:checked');
if(!pref) return false;
if(pref.value==='rappel') return !!form.querySelector('input[name="creneau_moment"]:checked');
return true;
}
if(step===4) return validateContact(false);
return true;
}
function setFieldError(field, msg){
var wrap=field.closest('.cleerly-lp__field');
if(!wrap) return;
var slot=wrap.querySelector('[data-clp-error]');
wrap.classList.toggle('has-error', !!msg);
if(slot) slot.textContent=msg||'';
}
function validateContact(showErrors){
var ok=true;
var checks=[
['prenom', function (v){ return v.length >=2; }, 'Indiquez votre prénom.'],
['nom', function (v){ return v.length >=2; }, 'Indiquez votre nom.'],
['email', function (v){ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); }, 'Email invalide.'],
['phone', function (v){ return (v.replace(/[^0-9]/g, '').length >=8); }, 'Numéro invalide.']
];
checks.forEach(function (c){
var field=form.querySelector('[name="' + c[0] + '"]');
if(!field) return;
var valid=c[1](field.value.trim());
if(!valid) ok=false;
if(showErrors) setFieldError(field, valid ? '':c[2]);
});
var consent=form.querySelector('[name="consent"]');
if(consent&&!consent.checked){
ok=false;
if(showErrors){ var lab=consent.closest('.cleerly-lp__consent'); if(lab) lab.classList.add('has-error'); }}else if(consent){
var lab2=consent.closest('.cleerly-lp__consent'); if(lab2) lab2.classList.remove('has-error');
}
return ok;
}
function updateMontantQuestion(){
var legend=form.querySelector('[data-clp-q-montant]');
if(!legend) return;
var obj=form.querySelector('input[name="objectif"]:checked');
var transfer=obj&&obj.value.indexOf('PER existant')!==-1;
legend.textContent=transfer
? legend.getAttribute('data-q-transfer')
: legend.getAttribute('data-q-default');
}
function refreshNav(){
var valid=validateStep(current);
if(btnNext) btnNext.disabled = !valid;
if(btnSubmit){ btnSubmit.disabled = !valid; updateSubmitLabel(); }
updateMontantQuestion();
}
function show(step){
current=step;
if(done) done.hidden=true;
panes.forEach(function (p){
var on=parseInt(p.getAttribute('data-step'), 10)===step;
p.hidden = !on;
p.classList.toggle('is-active', on);
});
if(bar) bar.style.width=Math.round((step - 1) / (TOTAL - 1) * 100) + '%';
if(stepLabel) stepLabel.textContent=step;
if(btnPrev) btnPrev.hidden=step===1;
if(btnNext) btnNext.hidden=step===TOTAL;
if(btnSubmit) btnSubmit.hidden=step!==TOTAL;
if(feedback) feedback.hidden=true;
refreshNav();
var first=paneOf(step)&&paneOf(step).querySelector('input, select, textarea');
if(first&&step > 1){ try { first.focus({ preventScroll: true });} catch (e){}}
}
function toggleContactSub(){
var pref=form.querySelector('input[name="contact_pref"]:checked');
form.querySelectorAll('[data-clp-when]').forEach(function (el){
el.hidden = !pref||el.getAttribute('data-clp-when')!==pref.value;
});
}
var SUBMIT_LABELS={
rappel: 'Être rappelé gratuitement',
creneau: 'Confirmer mon rendez-vous',
info: 'Recevoir les informations'
};
function updateSubmitLabel(){
if(!btnSubmit) return;
var pref=form.querySelector('input[name="contact_pref"]:checked');
btnSubmit.textContent=(pref&&SUBMIT_LABELS[pref.value])||'Envoyer ma demande';
}
function next(){
if(!validateStep(current)){ refreshNav(); return; }
track('lp_step_' + current);
if(window.clpGtm) window.clpGtm.formStep(current, STEP_NAMES[current]);
sendPartial(current);
if(current < TOTAL) show(current + 1);
}
function prev(){ if(current > 1) show(current - 1); }
function submit(e){
e.preventDefault();
if(!validateContact(true)){ refreshNav(); return; }
btnSubmit.disabled=true;
var prev=btnSubmit.textContent;
btnSubmit.textContent='Envoi…';
post('clp_submit', { step: TOTAL }).then(function (res){
if(res&&res.success){
completed=true;
var d=collect();
if(window.clpGtm){
window.clpGtm.generateLead({
lead_id:      sessionId(),
objectif:     d.objectif||'',
email:        d.email||'',
phone_number: d.phone||''
});
}
track('form_' + product.replace(/-/g, '_'), { value: 1 });
track('generate_lead', { value: 1 });
fireConversions();
try { localStorage.removeItem(STORAGE); } catch (e2){}
[].forEach.call(form.querySelectorAll('.cleerly-lp__pane, .cleerly-lp__form-nav, .cleerly-lp__form-progress, .cleerly-lp__form-stepinfo'), function (n){ n.hidden=true; });
if(done) done.hidden=false;
}else{
var msg=(res&&res.data&&res.data.message)||'';
var status=res&&res.__status;
var type='unknown';
if(status===403||/session/i.test(msg))             type='nonce_stale';
else if(status >=500&&status < 600)                 type='server_5xx';
else if(status===422||/invalide|champ/i.test(msg)) type='validation';
reportError(type);
if(feedback){ feedback.hidden=false; feedback.textContent=msg||"Une erreur est survenue. Réessayez."; }
btnSubmit.disabled=false;
btnSubmit.textContent=prev;
}}).catch(function (){
reportError('network');
if(feedback){ feedback.hidden=false; feedback.textContent="Connexion impossible. Réessayez."; }
btnSubmit.disabled=false;
btnSubmit.textContent=prev;
});
}
function markStarted(){
if(started) return;
started=true;
if(window.clpGtm) window.clpGtm.formStart();
}
form.addEventListener('focusin', markStarted, { once: true });
form.addEventListener('change', function (){ markStarted(); save(); toggleContactSub(); refreshNav(); });
form.addEventListener('input', function (e){
markStarted();
save();
if(current===4&&e.target.closest('.cleerly-lp__field.has-error')) validateContact(true);
refreshNav();
});
if(btnNext) btnNext.addEventListener('click', next);
if(btnPrev) btnPrev.addEventListener('click', prev);
form.addEventListener('submit', submit);
window.addEventListener('beforeunload', function (){
if(started&&!completed) track('lp_form_abandoned', { lp_step: current });
});
window.addEventListener('clp:prefill', function (e){
var det=(e&&e.detail)||{};
['objectif', 'montant'].forEach(function (k){
if(!det[k]) return;
[].forEach.call(form.querySelectorAll('input[type="radio"][name="' + k + '"]'), function (r){
if(r.value===det[k]) r.checked=true;
});
});
started=true;
save();
var both=form.querySelector('input[name="objectif"]:checked')&&form.querySelector('input[name="montant"]:checked');
show(both ? 3:1);
});
restore();
show(1);
track('lp_view');
refreshNonce();
})();