.twb-deghsha-form-wrapper * {
margin: 0;
padding: 0;
box-sizing: border-box;
}.twb-deghsha-form-wrapper {
font-family: inherit;
max-width: 520px;
margin: 0 auto;
}.twb-deghsha-form-box {
background: #ffffff;
border: 1px solid #e8e0d4;
border-radius: 14px;
padding: 36px 30px 32px;
position: relative;
overflow: hidden;
}.twb-deghsha-form-header {
text-align: center;
margin-bottom: 26px;
}.twb-deghsha-form-header h3 {
font-weight: 700;
font-size: 21px;
color: #2c2017;
margin-bottom: 5px;
}.twb-deghsha-form-header p {
font-size: 13px;
color: #9a8d7f;
}/* ── Fields ── */
.twb-deghsha-field {
margin-bottom: 16px;
}.twb-deghsha-field label {
display: block;
font-size: 12px;
font-weight: 600;
color: #6b5d4f;
margin-bottom: 5px;
text-transform: uppercase;
letter-spacing: 0.8px;
}.twb-deghsha-field input,
.twb-deghsha-field select,
.twb-deghsha-field textarea {
width: 100%;
padding: 12px 14px;
background: #faf8f5;
border: 1px solid #ddd5ca;
border-radius: 8px;
color: #2c2017;
font-family: inherit;
font-size: 14px;
transition: border-color 0.2s, box-shadow 0.2s;
outline: none;
-webkit-appearance: none;
}.twb-deghsha-field input::placeholder,
.twb-deghsha-field textarea::placeholder {
color: #bfb5a7;
}.twb-deghsha-field input:focus,
.twb-deghsha-field select:focus,
.twb-deghsha-field textarea:focus {
border-color: #c19153;
box-shadow: 0 0 0 3px rgba(193, 145, 83, 0.1);
}.twb-deghsha-field select {
cursor: pointer;
color: #bfb5a7;
}.twb-deghsha-field select.twb-selected {
color: #2c2017;
}.twb-deghsha-row {
display: flex;
gap: 12px;
}.twb-deghsha-row .twb-deghsha-field {
flex: 1;
}/* ── Button ── */
.twb-deghsha-submit-btn {
width: 100%;
padding: 14px;
background: #c19153;
border: none;
border-radius: 8px;
color: #fff;
font-family: inherit;
font-size: 15px;
font-weight: 700;
letter-spacing: 0.5px;
cursor: pointer;
transition: background 0.2s, transform 0.15s;
margin-top: 4px;
}.twb-deghsha-submit-btn:hover {
background: #a87b44;
transform: translateY(-1px);
}.twb-deghsha-submit-btn:active { transform: translateY(0); }.twb-deghsha-submit-btn:disabled {
opacity: 0.55;
cursor: not-allowed;
transform: none;
}.twb-deghsha-spinner {
display: inline-block;
width: 16px; height: 16px;
border: 2.5px solid rgba(255,255,255,0.35);
border-top-color: #fff;
border-radius: 50%;
animation: twb-spin 0.6s linear infinite;
vertical-align: middle;
margin-right: 6px;
}@keyframes twb-spin { to { transform: rotate(360deg); } }/* ── Validation ── */
.twb-deghsha-field-error input,
.twb-deghsha-field-error select,
.twb-deghsha-field-error textarea {
border-color: #d9534f !important;
background: #fef7f7 !important;
}.twb-deghsha-error-msg {
font-size: 11px;
color: #d9534f;
margin-top: 4px;
display: none;
}.twb-deghsha-field-error .twb-deghsha-error-msg {
display: block;
}/* ── Success ── */
.twb-deghsha-success {
text-align: center;
padding: 44px 24px;
display: none;
}.twb-deghsha-success-icon {
width: 64px; height: 64px;
border-radius: 50%;
background: #c19153;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 18px;
animation: twb-pop 0.45s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}.twb-deghsha-success-icon svg { width: 32px; height: 32px; }@keyframes twb-pop {
0% { transform: scale(0); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}.twb-deghsha-success h3 {
font-weight: 700;
font-size: 22px;
color: #2c2017;
margin-bottom: 10px;
}.twb-deghsha-success p {
font-size: 14px;
color: #7a6e60;
line-height: 1.7;
max-width: 360px;
margin: 0 auto;
}.twb-deghsha-success p strong { color: #2c2017; }@media (max-width: 480px) {
.twb-deghsha-form-box { padding: 28px 18px 24px; }
.twb-deghsha-row { flex-direction: column; gap: 0; }
}
(function() {
// ── WordPress REST endpoint — no need to change unless your site URL changes ──
var PHP_RELAY_URL = 'https://www.theweddingbiryani.com/wp-json/twb/v1/submit';var form = document.getElementById('twbDeghshaForm');
var formView = document.getElementById('twbDeghshaFormView');
var successView = document.getElementById('twbDeghshaSuccess');
var submitBtn = document.getElementById('twbDeghshaSubmitBtn');
var userName = document.getElementById('twbDeghshaUserName');// Select color fix
form.querySelectorAll('select').forEach(function(sel) {
sel.addEventListener('change', function() {
this.classList.toggle('twb-selected', !!this.value);
});
});// ── Date constraints: min tomorrow, max 1 year ──
var dateInput = document.getElementById('twb-dg-date');
var minDate = new Date();
minDate.setDate(minDate.getDate() + 1);
var maxDate = new Date();
maxDate.setFullYear(maxDate.getFullYear() + 1);
dateInput.setAttribute('min', minDate.toISOString().split('T')[0]);
dateInput.setAttribute('max', maxDate.toISOString().split('T')[0]);// ── Phone: digits only, max 10, block leading 0-5 ──
document.getElementById('twb-dg-phone').addEventListener('input', function() {
this.value = this.value.replace(/\D/g, '').slice(0, 10);
});// ── Name: letters, spaces, dots only ──
document.getElementById('twb-dg-name').addEventListener('input', function() {
this.value = this.value.replace(/[^a-zA-Z\s.]/g, '');
});// ── Guests: digits only, max 5 chars ──
document.getElementById('twb-dg-guests').addEventListener('input', function() {
this.value = this.value.replace(/\D/g, '').slice(0, 5);
});// ── Disposable / junk email domains ──
var blockedDomains = [
'mailinator.com','guerrillamail.com','tempmail.com','throwaway.email',
'yopmail.com','sharklasers.com','guerrillamailblock.com','grr.la',
'dispostable.com','trashmail.com','fakeinbox.com','tempail.com',
'maildrop.cc','10minutemail.com','getnada.com','mohmal.com'
];// Valid TLDs (common ones — catches typos like .con .cmo .xyx)
var validTLDs = [
'com','in','co.in','org','net','edu','gov','io','co','info','biz',
'me','us','uk','co.uk','ca','au','com.au','de','fr','jp','cn',
'ru','br','za','ae','sg','nz','tech','dev','app','ai','xyz',
'online','store','shop','site','club','pro','live','gmail','outlook',
'ac.in','edu.in','org.in','net.in','gen.in','firm.in','ind.in'
];function isValidEmail(email) {
// Basic structure
if (!/^[a-zA-Z0-9](?:[a-zA-Z0-9._+-]*[a-zA-Z0-9])?@[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/.test(email)) return false;
// No consecutive dots
if (/\.{2,}/.test(email)) return false;
// Extract domain
var domain = email.split('@')[1].toLowerCase();
// Block disposable
if (blockedDomains.indexOf(domain) !== -1) return false;
// Check TLD
var parts = domain.split('.');
var tld2 = parts.slice(-2).join('.');
var tld1 = parts[parts.length - 1];
if (validTLDs.indexOf(tld2) === -1 && validTLDs.indexOf(tld1) === -1) return false;
return true;
}function isValidPhone(phone) {
// Indian mobile: starts with 6-9, exactly 10 digits
if (!/^[6-9]\d{9}$/.test(phone)) return false;
// Block obvious fakes (all same digit, sequential)
if (/^(\d)\1{9}$/.test(phone)) return false; // 9999999999
if (/^(0123456789|1234567890|9876543210)$/.test(phone)) return false;
return true;
}function isValidDate(val) {
var selected = new Date(val + 'T00:00:00');
var min = new Date(); min.setDate(min.getDate() + 1); min.setHours(0,0,0,0);
var max = new Date(); max.setFullYear(max.getFullYear() + 1); max.setHours(23,59,59,999);
return selected >= min && selected <= max;
}// ── Quantity-to-servings map (1kg = ~7 pax) ──
var qtyServes = { '5 Kg': 35, '10 Kg': 70, '15 Kg': 105, '20 Kg': 140, '25 Kg': 175, '30 Kg+': 210 };// ━━━ VALIDATION ━━━
function setError(field, msg) {
var parent = field.closest('.twb-deghsha-field');
var errEl = parent.querySelector('.twb-deghsha-error-msg');
if (msg) {
parent.classList.add('twb-deghsha-field-error');
if (errEl) errEl.textContent = msg;
return false;
} else {
parent.classList.remove('twb-deghsha-field-error');
return true;
}
}function validateField(field) {
var val = (field.value || '').trim();// Required check
if (field.hasAttribute('required') && !val) {
return setError(field, 'This field is required');
}if (!val) return setError(field, null);// ── Name ──
if (field.name === 'name') {
if (val.length 60) return setError(field, 'Name is too long');
if (!/^[a-zA-Z\s.]+$/.test(val)) return setError(field, 'Letters only please');
if (!/[a-zA-Z]{2,}/.test(val)) return setError(field, 'Please enter a valid name');
}// ── Phone ──
if (field.type === 'tel') {
if (val.length < 10) return setError(field, 'Enter all 10 digits');
if (!/^[6-9]/.test(val)) return setError(field, 'Indian numbers start with 6, 7, 8 or 9');
if (!isValidPhone(val)) return setError(field, 'This doesn\'t look like a real number');
}// ── Email ──
if (field.type === 'email') {
if (!isValidEmail(val)) {
var domain = val.split('@')[1] || '';
if (blockedDomains.indexOf(domain.toLowerCase()) !== -1) {
return setError(field, 'Please use a real email, not a temporary one');
}
if (domain && !/\.\w{2,}$/.test(domain)) {
return setError(field, 'Check your email domain — looks like a typo');
}
return setError(field, 'Enter a valid email address');
}
}// ── Event Date ──
if (field.name === 'eventDate') {
if (!isValidDate(val)) {
var sel = new Date(val + 'T00:00:00');
var now = new Date(); now.setHours(0,0,0,0);
if (sel < now) return setError(field, 'Date cannot be in the past');
var min = new Date(); min.setDate(min.getDate() + 1);
if (sel < min) return setError(field, 'Please select a future date');
return setError(field, 'Date cannot be more than 1 year ahead');
}
}// ── Guests ──
if (field.name === 'guests') {
var g = parseInt(val);
if (isNaN(g) || g 10000) return setError(field, 'For 10,000+ guests, please call us directly');
}// ── Biryani Type ──
if (field.name === 'biryaniType') {
if (!val) return setError(field, 'Please select a biryani type');
}// ── Quantity ──
if (field.name === 'quantity') {
if (!val) return setError(field, 'Please select quantity');
}return setError(field, null);
}// Live validation on blur
form.querySelectorAll('input, select').forEach(function(el) {
el.addEventListener('blur', function() { validateField(this); });
});// ── Cross-field: Qty vs Guests mismatch warning ──
var qtySelect = document.getElementById('twb-dg-qty');
var guestsInput = document.getElementById('twb-dg-guests');function checkQtyGuestMatch() {
var qty = qtySelect.value;
var guests = parseInt(guestsInput.value);
if (!qty || !guests || isNaN(guests)) return;
var serves = qtyServes[qty] || 0;
// If qty serves way less than guest count, warn on qty field
if (guests > serves * 1.5) {
setError(qtySelect, qty + ' serves ~' + serves + ' pax. You have ' + guests + ' guests — consider more.');
}
}qtySelect.addEventListener('change', function() {
validateField(this);
checkQtyGuestMatch();
});
guestsInput.addEventListener('blur', function() {
validateField(this);
checkQtyGuestMatch();
});// Spam guard
var formLoadTime = Date.now();// ━━━ SUBMIT ━━━
form.addEventListener('submit', function(e) {
e.preventDefault();// Bot check
if (Date.now() - formLoadTime < 2500) return;var allValid = true;
form.querySelectorAll('[required]').forEach(function(field) {
if (!validateField(field)) allValid = false;
});if (!allValid) {
var firstErr = form.querySelector('.twb-deghsha-field-error');
if (firstErr) firstErr.scrollIntoView({ behavior: 'smooth', block: 'center' });
return;
}var data = {
formName: 'Deghsha Biryani Form',
name: form.name.value.trim(),
phone: form.phone.value.trim(),
email: form.email.value.trim(),
eventDate: form.eventDate.value,
guests: form.guests.value,
biryaniType: form.biryaniType.value,
quantity: form.quantity.value,
timestamp: new Date().toLocaleString('en-IN', { timeZone: 'Asia/Kolkata' })
};// Show success immediately — don't wait for the server
userName.textContent = data.name.split(' ')[0];
formView.style.display = 'none';
successView.style.display = 'block';// Fire and forget — sheet + email happen in the background
fetch(PHP_RELAY_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
}).catch(function() {});
});
})();