Thank You
Your words genuinely shape what Candles & Oud becomes next. We read every response.
'; } el.innerHTML = html; } ['q2_discovery_enjoyment','q5_scent_world_appeal','q9_layering_appeal','q13_community_value','q14_scent_bar_appeal','q16_newness_rhythm_appeal'].forEach(function(n) { buildScale('scale-' + n.split('_')[0], n); }); // Build Q7 matrix (labelled semantic-differential rows) var q7Rows = [ { name: 'q7_heavy_light', left: 'Heavy', right: 'Light' }, { name: 'q7_masculine_feminine', left: 'Masculine', right: 'Feminine' }, { name: 'q7_occasion_everyday', left: 'Special occasion', right: 'Everyday' }, { name: 'q7_expensive_cheap', left: 'Expensive / exclusive', right: 'Cheap / mass' } ]; (function() { var html = ''; q7Rows.forEach(function(row) { html += '
'; }); document.getElementById('matrix-q7').innerHTML = html; })(); // Build Q11 matrix (item + 1-5 scale) var q11Rows = [ { name: 'q11_feel_exceptional', label: 'Feel exceptional' }, { name: 'q11_feel_confident', label: 'Feel confident' }, { name: 'q11_feel_special', label: 'Feel special' }, { name: 'q11_feel_elevated', label: 'Feel elevated' }, { name: 'q11_feel_yourself', label: 'Feel yourself' } ]; (function() { var html = ''; q11Rows.forEach(function(row) { html += '
'; }); document.getElementById('matrix-q11').innerHTML = html; })(); var allPageEls = Array.prototype.slice.call(form.querySelectorAll('.cbe-page')); var currentIndex = 0; function updateConditionalSections() { var custEl = form.querySelector('input[name="qs1"]:checked'); var isCustomer = custEl && custEl.value === "Yes, I'm a customer"; var block = document.getElementById('sectionH-block'); if (block) block.style.display = isCustomer ? '' : 'none'; } function showStep(idx) { currentIndex = Math.max(0, Math.min(idx, PAGE_ORDER.length - 1)); var pageId = PAGE_ORDER[currentIndex]; allPageEls.forEach(function(el) { el.classList.remove('cbe-page-active'); }); form.querySelector('.cbe-page[data-page="' + pageId + '"]').classList.add('cbe-page-active'); backBtn.style.visibility = currentIndex === 0 ? 'hidden' : 'visible'; nextBtn.textContent = currentIndex === PAGE_ORDER.length - 1 ? 'Submit Survey' : 'Next'; var pct = ((currentIndex + 1) / PAGE_ORDER.length) * 100; progressBar.style.width = pct + '%'; progressLabel.textContent = 'Page ' + (currentIndex + 1) + ' of ' + PAGE_ORDER.length + ' · ' + PAGE_TITLES[pageId]; wrapper.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function validateStep(stepEl) { var firstError = null; var reqWrappers = stepEl.querySelectorAll('.cbe-q[data-required="true"]'); reqWrappers.forEach(function(q) { if (q.offsetParent === null) return; // skip fields hidden inside a collapsed conditional section var names = q.dataset.names.split(','); var ok = true; names.forEach(function(n) { var sel = q.querySelector('select[name="' + n + '"]'); if (sel) { if (!sel.value) ok = false; return; } var textInp = q.querySelector('input[type="text"][name="' + n + '"], input[type="email"][name="' + n + '"], input[type="number"][name="' + n + '"]'); if (textInp) { if (!textInp.value.trim()) ok = false; return; } var checked = q.querySelector('input[name="' + n + '"]:checked'); if (!checked) ok = false; }); if (!ok) { q.classList.add('cbe-error'); if (!firstError) firstError = q; } else { q.classList.remove('cbe-error'); } }); return firstError; } function validateAboutYouExtras(stepEl) { // Email format (field is already required elsewhere; this checks it's well-formed) var emailInput = stepEl.querySelector('input[type="email"][name="email"]'); if (emailInput && emailInput.value.trim()) { var emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailPattern.test(emailInput.value.trim())) { var emailQ = emailInput.closest('.cbe-q'); emailQ.classList.add('cbe-error'); return emailQ; } } // Age: numbers only, sane range, if provided var ageInput = stepEl.querySelector('input[type="number"][name="q27_age_band"]'); if (ageInput && ageInput.value.trim()) { var ageVal = Number(ageInput.value); if (isNaN(ageVal) || !Number.isInteger(ageVal) || ageVal 120) { var ageQ = ageInput.closest('.cbe-q'); ageQ.classList.add('cbe-error'); return ageQ; } } // Gender: if "Other - Specify" is chosen, the specify field is required var genderChecked = stepEl.querySelector('input[name="q27_gender"]:checked'); if (genderChecked && genderChecked.value === 'Other - Specify') { var otherInput = stepEl.querySelector('input[name="q27_gender_other"]'); if (!otherInput || !otherInput.value.trim()) { var genderQ = genderChecked.closest('.cbe-q'); genderQ.classList.add('cbe-error'); return genderQ; } } return null; } function checkRankingDuplicates(stepEl) { var q = stepEl.querySelector('.cbe-q[data-names^="q23_rank"]'); if (!q) return null; var selects = q.querySelectorAll('select'); var vals = []; var dup = false; selects.forEach(function(s) { if (s.value) { if (vals.indexOf(s.value) !== -1) dup = true; vals.push(s.value); } }); if (dup) { q.classList.add('cbe-error'); return q; } q.classList.remove('cbe-error'); return null; } form.addEventListener('change', function(e) { var q = e.target.closest('.cbe-q'); if (q) q.classList.remove('cbe-error'); if (e.target.name === 'q19_pull_factors') { var checked = form.querySelectorAll('input[name="q19_pull_factors"]:checked'); if (checked.length > 2) e.target.checked = false; } if (e.target.name === 'qs1') { updateConditionalSections(); } if (e.target.name === 'q27_gender') { var otherWrap = document.getElementById('cbeGenderOtherWrap'); if (otherWrap) otherWrap.style.display = e.target.value === 'Other - Specify' ? 'block' : 'none'; } }); form.addEventListener('input', function(e) { var q = e.target.closest('.cbe-q'); if (q) q.classList.remove('cbe-error'); }); nextBtn.addEventListener('click', function() { var pageId = PAGE_ORDER[currentIndex]; var stepEl = form.querySelector('.cbe-page[data-page="' + pageId + '"]'); var err = validateStep(stepEl); if (pageId === 'page1') { var extraErr = validateAboutYouExtras(stepEl); if (extraErr && !err) err = extraErr; } if (pageId === 'page4') { var dupErr = checkRankingDuplicates(stepEl); if (dupErr && !err) err = dupErr; } if (err) { err.scrollIntoView({ behavior: 'smooth', block: 'center' }); return; } if (currentIndex === PAGE_ORDER.length - 1) { submitSurvey(); } else { showStep(currentIndex + 1); } }); backBtn.addEventListener('click', function() { showStep(currentIndex - 1); }); var FIELD_ORDER = [ 'full_name','email', 'qs1','qs2', 'q1_signature_scent','q2_discovery_enjoyment','q3_open_to_new', 'q4_home_scent_use','q5_scent_world_appeal','q6_oud_first_words','q7_heavy_light','q7_masculine_feminine','q7_occasion_everyday','q7_expensive_cheap','q8_wear_oud_daily','q9_layering_appeal', 'q10_three_words','q11_feel_exceptional','q11_feel_confident','q11_feel_special','q11_feel_elevated','q11_feel_yourself','q12_feel_exceptional_meaning','q13_community_value', 'q14_scent_bar_appeal','q15_in_person_experience_impact', 'q16_newness_rhythm_appeal','q17_subscription_interest', 'q18_first_drew_you','q19_pull_factors','q20_expected_price','q21_price_sensitivity','q22_gifting_habits', 'q23_rank_customers','q23_rank_creators','q23_rank_founder','q23_rank_experts', 'q24_purchase_frequency','q25_favourite_scents','q26_first_purchase_and_return_driver', 'q27_age_band','q27_gender','q27_gender_other','q28_fragrance_spend' ]; function gv(name) { var ta = form.querySelector('textarea[name="' + name + '"]'); if (ta) return ta.value.trim(); var inp = form.querySelector('input[type="text"][name="' + name + '"], input[type="email"][name="' + name + '"], input[type="number"][name="' + name + '"]'); if (inp) return inp.value.trim(); var sel = form.querySelector('select[name="' + name + '"]'); if (sel) return sel.value; var checkedRadio = form.querySelector('input[type="radio"][name="' + name + '"]:checked'); if (checkedRadio) return checkedRadio.value; var checkedBoxes = form.querySelectorAll('input[type="checkbox"][name="' + name + '"]:checked'); if (checkedBoxes.length) return Array.prototype.map.call(checkedBoxes, function(c) { return c.value; }).join(', '); return ''; } function submitSurvey() { var data = {}; FIELD_ORDER.forEach(function(f) { data[f] = gv(f); }); nextBtn.disabled = true; backBtn.style.pointerEvents = 'none'; nextBtn.innerHTML = 'Submitting...'; var controller = ('AbortController' in window) ? new AbortController() : null; var timeoutId = controller ? setTimeout(function() { controller.abort(); }, 20000) : null; fetch(GOOGLE_SCRIPT_URL, { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), signal: controller ? controller.signal : undefined }) .then(function() { if (timeoutId) clearTimeout(timeoutId); form.style.display = 'none'; nav.style.display = 'none'; thankYou.style.display = 'block'; thankYou.scrollIntoView({ behavior: 'smooth', block: 'start' }); }) .catch(function() { if (timeoutId) clearTimeout(timeoutId); nextBtn.disabled = false; nextBtn.textContent = 'Submit Survey'; backBtn.style.pointerEvents = 'auto'; alert('Something went wrong. Please try again.'); }); } var copyBtn = document.getElementById('cbeCopyBtn'); var voucherCode = document.getElementById('cbeVoucherCode'); if (copyBtn && voucherCode) { copyBtn.addEventListener('click', function() { var code = voucherCode.textContent.trim(); function fallbackCopy(text) { var ta = document.createElement('textarea'); ta.value = text; ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.focus(); ta.select(); try { document.execCommand('copy'); } catch (err) {} document.body.removeChild(ta); } if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(code).catch(function() { fallbackCopy(code); }); } else { fallbackCopy(code); } var originalText = copyBtn.textContent; copyBtn.textContent = 'Copied!'; copyBtn.classList.add('cbe-copied'); setTimeout(function() { copyBtn.textContent = originalText; copyBtn.classList.remove('cbe-copied'); }, 2000); }); } updateConditionalSections(); showStep(0); })();