PageSourceSearch

https://abcfitness.com/wp-content/themes/abcfitness/bov/js/questionnaire.js?ver=16.09.2026.13.40.06

js abcfitness.com collected 2026-10-01 10:43:33 UTC 5,189 bytes, 173 lines download raw bytes

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.