(function (){
'use strict';
const uuid=()=> {
if(window.crypto&&typeof window.crypto.randomUUID==='function'){
return window.crypto.randomUUID();
}
const bytes=new Uint8Array(16);
window.crypto.getRandomValues(bytes);
bytes[6]=(bytes[6] & 0x0f) | 0x40;
bytes[8]=(bytes[8] & 0x3f) | 0x80;
const hex=Array.from(bytes, (value)=> value.toString(16).padStart(2, '0')).join('');
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
};
const emitAccepted=(data)=> {
if(!data.receipt_id||sessionStorage.getItem(`pn-lead-event:${data.receipt_id}`)){
return;
}
window.dataLayer=window.dataLayer||[];
window.dataLayer.push({
event: 'pn_lead_created',
receipt_id: data.receipt_id,
source_code: data.source_code,
service: data.service,
requested_action: data.requested_action,
delivery_state: data.delivery_state
});
sessionStorage.setItem(`pn-lead-event:${data.receipt_id}`, '1');
};
const clearErrors=(form)=> {
form.querySelectorAll('[aria-invalid="true"]').forEach((field)=> field.removeAttribute('aria-invalid'));
const summary=form.querySelector('.pn-suite-form-errors');
summary.hidden=true;
summary.textContent='';
};
const showErrors=(form, message, errors)=> {
const summary=form.querySelector('.pn-suite-form-errors');
const messages=errors ? Object.values(errors):[];
summary.textContent=[message, ...messages].filter(Boolean).join(' ');
summary.hidden=false;
const names=errors ? Object.keys(errors):[];
names.forEach((name)=> {
const field=form.elements.namedItem(name);
if(field instanceof HTMLElement){
field.setAttribute('aria-invalid', 'true');
}});
const first=form.querySelector('[aria-invalid="true"]');
(first||summary).focus({ preventScroll: false });
};
const closeReport=(dialog)=> {
const frame=dialog.querySelector('iframe');
if(dialog.open){
dialog.close();
}
frame.src='about:blank';
};
const openReport=(form, url, trigger)=> {
const shell=form.closest('.pn-suite-intake-shell');
const dialog=shell ? shell.nextElementSibling:null;
if(!(dialog instanceof HTMLDialogElement)||typeof dialog.showModal!=='function'){
window.open(url, '_blank', 'noopener,noreferrer');
return;
}
const frame=dialog.querySelector('iframe');
const full=dialog.querySelector('.pn-suite-report-open');
frame.src=url;
full.href=url;
dialog.showModal();
dialog.querySelector('.pn-suite-report-close').focus();
dialog.addEventListener('close', ()=> trigger.focus(), { once: true });
};
const antiSpamToken=async (form, formData)=> {
const provider=form.dataset.antiSpamProvider||'';
if(provider==='turnstile'){
return formData.get('cf-turnstile-response')||'';
}
if(provider==='recaptcha_v3'){
if(!window.grecaptcha||typeof window.grecaptcha.ready!=='function'||!form.dataset.antiSpamSiteKey){
throw new Error('anti-spam-unavailable');
}
return new Promise((resolve, reject)=> {
window.grecaptcha.ready(()=> {
window.grecaptcha.execute(form.dataset.antiSpamSiteKey, { action: 'pn_suite_lead_submit' }).then(resolve).catch(reject);
});
});
}
return '';
};
const boot=()=> document.querySelectorAll('.pn-suite-lead-form').forEach((form)=> {
if(form.dataset.pnReady==='1') return;
form.dataset.pnReady='1';
form.elements.source_url.value=window.location.href;
form.elements.form_started_at.value=String(Math.floor(Date.now() / 1000));
form.elements.idempotency_key.value=uuid();
const shell=form.closest('.pn-suite-intake-shell');
const dialog=shell ? shell.nextElementSibling:null;
if(dialog instanceof HTMLDialogElement){
dialog.querySelector('.pn-suite-report-close').addEventListener('click', ()=> closeReport(dialog));
dialog.addEventListener('cancel', (event)=> {
event.preventDefault();
closeReport(dialog);
});
}
form.addEventListener('submit', async (event)=> {
event.preventDefault();
clearErrors(form);
const status=form.querySelector('.pn-suite-form-status');
const button=form.querySelector('button[type="submit"]');
const label=form.dataset.submitLabel||button.textContent;
if(!form.checkValidity()){
const firstInvalid=form.querySelector(':invalid');
showErrors(form, 'Check the highlighted fields and try again.', null);
if(firstInvalid) firstInvalid.focus();
return;
}
status.textContent='Securing your request…';
status.dataset.state='loading';
button.disabled=true;
button.setAttribute('aria-busy', 'true');
button.textContent='Securing request…';
try {
const formData=new FormData(form);
const protectionToken=await antiSpamToken(form, formData);
const payload=Object.fromEntries(formData.entries());
payload.consent=form.elements.consent.checked;
payload.anti_spam_token=protectionToken;
payload.anti_spam_provider=form.dataset.antiSpamProvider||'';
payload.referrer_class=document.referrer ? 'referral':'direct';
const headers={
'Content-Type': 'application/json',
'X-PN-Form-Nonce': form.dataset.formNonce
};
if(form.dataset.restNonce) headers['X-WP-Nonce']=form.dataset.restNonce;
const response=await fetch(form.dataset.endpoint, {
method: 'POST',
credentials: 'same-origin',
headers,
body: JSON.stringify(payload)
});
const data=await response.json();
if(!response.ok){
showErrors(form, data.message||'The request could not be sent.', data.errors||null);
throw new Error('handled');
}
status.textContent=`${data.message} Reference: ${data.receipt_id}`;
status.dataset.state='success';
emitAccepted(data);
if(data.report_url) openReport(form, data.report_url, button);
form.reset();
form.elements.source_url.value=window.location.href;
form.elements.form_started_at.value=String(Math.floor(Date.now() / 1000));
form.elements.idempotency_key.value=uuid();
if(form.dataset.antiSpamProvider==='turnstile'&&window.turnstile&&typeof window.turnstile.reset==='function') window.turnstile.reset();
} catch (error){
if(!(error instanceof Error)||error.message!=='handled'){
status.textContent='The request could not be sent. Your entries are still here; please try again.';
status.dataset.state='error';
}} finally {
button.disabled=false;
button.removeAttribute('aria-busy');
button.textContent=label;
}});
});
if(document.readyState==='loading') document.addEventListener('DOMContentLoaded', boot);
else boot();
}());