1/** 2 * Questionnaire 3 * 4 * Drives the multi-step inline questionnaire rendered by [questionnaire] shortcode. 5 * Terminal answers open the corresponding Marketo form in a MicroModal dialog. 6 * 7 */ 8(function () { 9 var ANSWER_FORM_MAP = { 10 C: "form1", 11 D: "form2", 12 E: "form3", 13 G: "form4", 14 H: "form5", 15 }; 16 var ANSWER_STEP_MAP = { A: "2a", B: "2b", F: "3" }; 17 18 // How many question steps exist at maximum depth (used for progress bar) 19 var MAX_STEPS = 3; 20 21 // Step key -> depth index (1-based) 22 var STEP_DEPTH = { 1: 1, "2a": 2, "2b": 2, 3: 3 }; 23 24 var MODAL_ID = "questionnaire-form-modal"; 25 var POD_ID = "//lp.abcfitness.com"; 26 var MUNCHKIN_ID = "705-YXV-112"; 27 28 var loadedFormId = null; 29 var formModal = null; 30 var modalFormEl = null; 31 32 function init() { 33 formModal = document.getElementById(MODAL_ID); 34 if (!formModal) return; 35 36 modalFormEl = formModal.querySelector("[data-questionnaire-modal-form]"); 37 38 var wrappers = d.getAll("[data-questionnaire]"); 39 if (!wrappers.length) return; 40 41 wrappers.forEach(function (wrapper) { 42 initWrapper(wrapper); 43 }); 44 } 45 46 function initWrapper(wrapper) { 47 var stepHistory = []; 48 49 function updateProgress(step, percent) { 50 var progressBar = step.querySelector("[data-questionnaire-progress]"); 51 if (!progressBar) return; 52 progressBar.value = percent; 53 } 54 55 function showStep(key, clearSelections) { 56 var steps = wrapper.querySelectorAll("[data-questionnaire-step]"); 57 steps.forEach(function (el) { 58 el.hidden = true; 59 }); 60 var step = wrapper.querySelector( 61 '[data-questionnaire-step="' + key + '"]' 62 ); 63 if (step) { 64 step.hidden = false; 65 if (clearSelections !== false) { 66 // Clear any previously selected radio so submit stays disabled 67 step.querySelectorAll('input[type="radio"]').forEach(function (r) { 68 r.checked = false; 69 }); 70 } 71 updateSubmitState(step); 72 var depth = STEP_DEPTH[key] || 1; 73 updateProgress(step, Math.round((depth / MAX_STEPS) * 100)); 74 } 75 } 76 77 function updateSubmitState(step) { 78 var submit = step.querySelector("[data-questionnaire-submit]"); 79 if (!submit) return; 80 var checked = step.querySelector('input[type="radio"]:checked'); 81 submit.disabled = !checked; 82 } 83 84 // Radio change -> enable submit 85 d.delegate("change", wrapper, 'input[type="radio"]', function (e) { 86 var step = e.target.closest("[data-questionnaire-step]"); 87 if (step) updateSubmitState(step); 88 }); 89 90 // Submit button -> advance 91 d.delegate("click", wrapper, "[data-questionnaire-submit]", function (e) { 92 var step = e.target.closest("[data-questionnaire-step]"); 93 if (!step) return; 94 var checked = step.querySelector('input[type="radio"]:checked'); 95 if (!checked) return; 96 97 var answer = checked.value; 98 99 stepHistory.push(step.dataset.questionnaireStep); 100 101 if (ANSWER_STEP_MAP[answer]) { 102 showStep(ANSWER_STEP_MAP[answer]); 103 } else if (ANSWER_FORM_MAP[answer]) { 104 var slot = ANSWER_FORM_MAP[answer]; 105 var dataKey = 106 "questionnaire" + slot.charAt(0).toUpperCase() + slot.slice(1); 107 var formId = wrapper.dataset[dataKey]; 108 if (formId) { 109 updateProgress(step, 100); 110 openFormModal(Number(formId)); 111 } 112 } 113 }); 114 115 // Back button -> previous step (preserve existing selection) 116 d.delegate("click", wrapper, "[data-questionnaire-back]", function () { 117 if (stepHistory.length) showStep(stepHistory.pop(), false); 118 }); 119 120 // Show step 1 on init 121 showStep("1"); 122 } 123 124 function openFormModal(formId) { 125 modalFormEl.dataset.formId = formId; 126 loadMarketoForm(formId); 127 MicroModal.show(MODAL_ID, { 128 onShow: function () { 129 d.get("body").classList.add("is-modal-open"); 130 }, 131 onClose: function () { 132 d.get("body").classList.remove("is-modal-open"); 133 loadedFormId = null; 134 }, 135 openClass: "is-open", 136 disableScroll: true, 137 awaitOpenAnimation: true, 138 awaitCloseAnimation: true, 139 }); 140 } 141 142 function loadMarketoForm(formId) { 143 if (loadedFormId === formId) return; 144 145 var freshForm = document.createElement("form"); 146 freshForm.className = 147 "marketo-form questionnaire-modal-form marketo-layout1"; 148 freshForm.id = "mktoForm_" + formId; 149 freshForm.setAttribute("data-questionnaire-modal-form", ""); 150 freshForm.setAttribute("data-prefill", ""); 151 freshForm.setAttribute("data-formid", formId); 152 modalFormEl.parentNode.replaceChild(freshForm, modalFormEl); 153 modalFormEl = freshForm; 154 155 function doLoad() { 156 MktoForms2.loadForm(POD_ID, MUNCHKIN_ID, formId, function () { 157 freshForm.id = ""; 158 loadedFormId = formId; 159 }); 160 } 161 162 // If MktoForms2 is already available, load immediately. 163 // Otherwise queue via window.onMktoReady (drained by marketo-forms.js). 164 if (typeof MktoForms2 !== "undefined") { 165 doLoad(); 166 } else { 167 window.onMktoReady = window.onMktoReady || []; 168 window.onMktoReady.push(doLoad); 169 } 170 } 171 172 init(); 173})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.