';
}function setLoading(btn, on){
if(!btn) return;
const text = qs(btn, '.ps-send-text');
if(on){
btn.disabled = true;
btn.dataset.prev = text ? text.textContent : '';
if(text) text.textContent = 'Sending...';
if(!qs(btn,'.ps-spin')) btn.insertAdjacentHTML('afterbegin','');
} else {
btn.disabled = false;
const spin = qs(btn, '.ps-spin');
if(spin) spin.remove();
if(text) text.textContent = btn.dataset.prev || 'Submit Request';
}
}function initFloatingLabels(wrap){
qsa(wrap, '.ps-field').forEach(function(field){
const input = qs(field, '.ps-input');
if(!input) return;function update(){
const val = (input.value || '').trim();
if(val !== '') field.classList.add('ps-filled');
else field.classList.remove('ps-filled');
}input.addEventListener('focus', function(){ field.classList.add('ps-focused'); });
input.addEventListener('blur', function(){ field.classList.remove('ps-focused'); });
input.addEventListener('input', update);
update();
});
}function getCityFromPath(){
const path = (location.pathname || '').toLowerCase();
const rules = [
{ key: '/dammam', city: 'Dammam' },
{ key: '/khobar', city: 'Al Khobar' },
{ key: '/dhahran', city: 'Dhahran' },
{ key: '/jubail', city: 'Jubail' },
{ key: '/riyadh', city: 'Riyadh' },
{ key: '/jeddah', city: 'Jeddah' }
];
for (const r of rules) if (path.includes(r.key)) return r.city;
return '';
}function initLocationInjection(wrap){
const city = getCityFromPath();
if(!city) return;
const title = qs(wrap, '.ps-cta-title');
const lead = qs(wrap, '.ps-cta-lead');
if(title) title.textContent = 'Get a Free Quote for Parking Shades in ' + city;
if(lead) lead.textContent = 'Fast installation in ' + city + ' and nearby areas. Share your details and get a clear quotation with no obligation.';
}function setTs(form){
const ts = qs(form, 'input[name="ps_ts"]');
if(ts) ts.value = String(Math.floor(Date.now()/1000));
}document.addEventListener('DOMContentLoaded', function(){
qsa(document, '[data-ps-cta]').forEach(function(wrap){
const form = qs(wrap, '.ps-cta-form');
if(!form) return;const statusBox = qs(form, '.ps-status');
const sendBtn = qs(form, '.ps-send');
const redirectTo = qs(form, 'input[name="redirect_to"]');
if(redirectTo) redirectTo.value = location.href;initFloatingLabels(wrap);
initLocationInjection(wrap);
setTs(form);form.addEventListener('submit', async function(e){
e.preventDefault();const fd = new FormData(form);
fd.set('ps_ts', String(Math.floor(Date.now()/1000)));const name = safeText(fd.get('name'));
const phone = safeText(fd.get('phone'));
const email = safeText(fd.get('email'));if(!name || !phone || !email){
setStatus(statusBox, 'err', 'Please fill in your name, mobile number, and email address.');
return;
}setLoading(sendBtn, true);
setStatus(statusBox, 'ok', 'Sending your request...');
fireTracking('cta_submit', { form_location: fd.get('form_location') || 'CTA' });const postUrl = form.getAttribute('action') || 'https://parkingshadesdammam.com/wp-admin/admin-post.php';try{
const res = await fetch(postUrl, {
method:'POST',
body: fd,
credentials:'same-origin',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json',
'Cache-Control': 'no-cache'
}
});const ct = (res.headers.get('content-type') || '').toLowerCase();
if(!ct.includes('application/json')){
await res.text().catch(()=>{});
setStatus(statusBox, 'err', 'Server returned non-JSON response. Disable cache for admin-post.php or check security rules.');
setLoading(sendBtn, false);
return;
}const data = await res.json();if(res.ok && data && data.ok){
setStatus(statusBox, 'ok', data.msg || 'Request sent successfully. Our team will contact you soon.');
fireTracking('generate_lead', { form_location: fd.get('form_location') || 'CTA' });
fireTracking('lead', { form_location: fd.get('form_location') || 'CTA' });form.reset();
initFloatingLabels(wrap);
setTs(form);
setLoading(sendBtn, false);
return;
}setStatus(statusBox, 'err', (data && data.msg) ? data.msg : 'Sending failed. Please try again.');
fireTracking('cta_fail', { form_location: fd.get('form_location') || 'CTA' });
setLoading(sendBtn, false);}catch(err){
setStatus(statusBox, 'err', 'Connection issue. Please try again.');
fireTracking('cta_fail', { form_location: fd.get('form_location') || 'CTA', reason:'network' });
setLoading(sendBtn, false);
}
});
});
});
})();















