{"version":3,"names":["$","window","jQuery","isSpanish","document","documentElement","lang","questions","nextLabel","ProgressBar","constructor","_ref","progressBarEl","levelCount","this","$progressBarEl","_levelCount","$bar","find","init","setLevel","level","addClass","percentage","css","concat","complete","ViewSwitch","_ref2","viewSwitchEl","views","$switchEl","Object","keys","reduce","acc","key","_setZindex","firstViewKey","$mounted","values","forEach","el","i","mount","view","RADIO_QUESTION_TEMPLATE","querySelector","content","firstElementChild","RADIO_OPTION_TEMPLATE","CHECKBOX_OPTION_TEMPLATE","RADIO_BUTTON_QUESTION_TEMPLATE","CHECKBOX_BUTTON_QUESTION_TEMPLATE","Question","_ref3","id","type","question","options","color","helperText","subtype","_id","_type","_subtype","_question","_helperText","_options","_color","_inputsName","$element","_arrowKeyPressed","getHeight","outerHeight","hide","removeClass","focusFirstInput","first","focus","appear","setTimeout","removeAttr","getElement","pass","unpass","IMAGES_BASE_URI","_window","LASIK_QUIZ_IMAGES_BASE_URI","ChoiceQuestion","onSelect","fn","_onSelect","_getOptionTemplate","isRadio","isButtonLayout","getView","$questionEl","clone","html","$subheadingEl","remove","$optionListEl","length","$nextBtn","$nextBtnWrapper","append","on","nextButton","optionTemplate","_ref4","text","image","$optionEl","_mapIndexToHex","$inputEl","attr","$imageEl","src","style","_attachEvents","event","$backBtn","activeElement","is","preventDefault","stopPropagation","startsWith","e","target","checked","anyChecked","toArray","some","chk","prop","index","QuizController","_ref5","container","questionObjs","$questionTrackEl","_questions","_currentQuestionIndex","_currentQuestion","currentQuestion","q","forward","isFirstQuestion","isLastQuestion","getCurrentQuestionIndex","getNextIndex","getPreviousIndex","_syncIndexToQuestion","_adjustHeight","nextQuestionIndex","back","prevQuestionIndex","EventEmitter","events","eventName","listener","push","emit","listeners","_len","arguments","args","Array","_key","apply","off","filter","l","ready","ee","$prevBtnEl","$startBtnEl","$submitButton","$viewSwitchEl","$quizView","$welcomeView","$leadView","$formEl","$loadScreen","progressBar","viewController","welcome","quiz","lead","map","qData","qObj","qType","qSubtype","console","log","quizController","hideButton","$button","showLoadingScreen","_quizController$curre","mask","$emailInput","$firstNameInput","$lastNameInput","errors","emailVal","val","test","firstName","lastName","phone","email","optIn","finalResultsPath","fetch","method","cache","headers","body","JSON","stringify","then","r","json","resp","finally","location","href","$formContainer","$focusable","currentIndex","eq"],"sources":["index.js"],"sourcesContent":["/*************************************************************\n * Imports\n *************************************************************/\n// 1. Import both question files\nimport questionsEn from \"../data/questions.json\";\nimport questionsEs from \"../data/questions-es.json\";\n\n// jQuery from window\nconst $ = window.jQuery;\n\n/*************************************************************\n * Detect Language & Define Globals\n *************************************************************/\n// Check if \nconst isSpanish = document.documentElement.lang === \"es-ES\";\n// Use Spanish or English questions\nconst questions = isSpanish ? questionsEs : questionsEn;\n// Where to redirect after submission\nconst resultsPath = isSpanish ? \"/es/cuestionario/resultados\" : \"/quiz/results\";\n// Next button label\nconst nextLabel = isSpanish ? \"Siguiente\" : \"Next\";\n\n/*************************************************************\n * ProgressBar\n *************************************************************/\nexport class ProgressBar {\n constructor({ progressBarEl, levelCount }) {\n this.$progressBarEl = progressBarEl instanceof jQuery ? progressBarEl : $(progressBarEl);\n this._levelCount = levelCount;\n this.$bar = this.$progressBarEl.find('.progress-bar__bar');\n }\n\n init() {\n this.setLevel(0);\n }\n\n setLevel(level) {\n if (level === this._levelCount) {\n this.$bar.addClass('progress-bar__bar--complete');\n }\n const percentage = (level / this._levelCount) * 100;\n this.$bar.css('width', `${percentage}%`);\n }\n\n complete() {\n this.setLevel(this._levelCount);\n }\n}\n\n/*************************************************************\n * ViewSwitch\n *************************************************************/\nexport class ViewSwitch {\n constructor({ viewSwitchEl, views = {} }) {\n this.$switchEl = viewSwitchEl instanceof jQuery ? viewSwitchEl : $(viewSwitchEl);\n this.views = Object.keys(views).reduce((acc, key) => {\n acc[key] = views[key] instanceof jQuery ? views[key] : $(views[key]);\n return acc;\n }, {});\n this._setZindex();\n const firstViewKey = Object.keys(this.views)[0];\n this.$mounted = this.views[firstViewKey];\n }\n\n _setZindex() {\n const viewValues = Object.values(this.views);\n viewValues.forEach((el, i) => {\n el.css('zIndex', i + 1);\n });\n }\n\n mount(view) {\n this.$mounted.addClass('view--exit');\n this.views[view].addClass('view--enter');\n this.$mounted = this.views[view];\n }\n}\n\n/*************************************************************\n * Template References\n *************************************************************/\nexport const RADIO_QUESTION_TEMPLATE = document.querySelector('#radio-question').content.firstElementChild;\nexport const RADIO_OPTION_TEMPLATE = document.querySelector('#radio-question-option').content.firstElementChild;\nexport const CHECKBOX_OPTION_TEMPLATE = document.querySelector('#checkbox-question-option').content.firstElementChild;\nexport const RADIO_BUTTON_QUESTION_TEMPLATE = document.querySelector('#radio-button-question-option').content.firstElementChild;\nexport const CHECKBOX_BUTTON_QUESTION_TEMPLATE = document.querySelector('#checkbox-button-question-option').content.firstElementChild;\n\n/*************************************************************\n * Base Question\n *************************************************************/\nexport class Question {\n constructor({ id, type, question, options, color, helperText, subtype }) {\n this._id = id;\n this._type = type; \n this._subtype = subtype; \n this._question = question;\n this._helperText = helperText;\n this._options = options || [];\n this._color = color;\n this._inputsName = `question-${this._id}`;\n\n this.$element = null;\n this._arrowKeyPressed = false;\n }\n\n getHeight() {\n return this.$element ? this.$element.outerHeight() : 0;\n }\n\n hide() {\n if (this.$element) {\n this.$element.removeClass('question--appear');\n }\n }\n\n focusFirstInput() {\n if (this.$element) {\n this.$element.find('input').first().focus();\n }\n }\n\n appear() {\n if (this.$element) {\n this.$element.addClass('question--appear');\n setTimeout(() => {\n this.$element.find('input').removeAttr('disabled');\n }, 300);\n }\n }\n\n getElement() {\n return this.$element;\n }\n\n pass() {\n if (this.$element) {\n this.$element.addClass('question--pass');\n }\n }\n\n unpass() {\n if (this.$element) {\n this.$element.removeClass('question--pass');\n }\n }\n}\n\n/*************************************************************\n * Constants\n *************************************************************/\nexport const DOB_REGEX = \"^\\\\d{2}\\\\/\\\\d{2}\\\\/\\\\d{4}$\";\n// In your JS file\nexport const IMAGES_BASE_URI =\n // Check if a global variable is defined\n window?.LASIK_QUIZ_IMAGES_BASE_URI\n // If yes, use that\n ? window.LASIK_QUIZ_IMAGES_BASE_URI\n // Otherwise, fallback to old path\n : \"/wp-content/themes/lasik/gutenberg/blocks/lasik-quiz/images\";\n\n\n/*************************************************************\n * ChoiceQuestion (Radio or Checkbox, Bubble or Buttons)\n *************************************************************/\nexport class ChoiceQuestion extends Question {\n onSelect(fn) {\n this._onSelect = fn;\n }\n\n /**\n * Return the correct
  • template for either radio/checkbox + bubble/buttons\n */\n _getOptionTemplate() {\n const isRadio = (this._type === 'radio');\n const isButtonLayout = (this._subtype === 'buttons');\n\n if (isRadio && isButtonLayout) {\n return RADIO_BUTTON_QUESTION_TEMPLATE;\n } else if (isRadio && !isButtonLayout) {\n return RADIO_OPTION_TEMPLATE;\n } else if (!isRadio && isButtonLayout) {\n return CHECKBOX_BUTTON_QUESTION_TEMPLATE;\n } else {\n // checkbox + bubble\n return CHECKBOX_OPTION_TEMPLATE;\n }\n }\n\n /**\n * Build the main question DOM from the #radio-question container,\n * then fill in the Next button (if checkbox) and each option.\n */\n getView() {\n const $questionEl = $(RADIO_QUESTION_TEMPLATE).clone(true, true);\n\n // Question text + helper\n $questionEl.find('.question__heading').html(this._question);\n const $subheadingEl = $questionEl.find('.question__helper-text');\n if (this._helperText) {\n $subheadingEl.html(this._helperText);\n } else {\n $subheadingEl.remove();\n }\n\n $questionEl.addClass(`question--id--${this._id}`);\n const $optionListEl = $questionEl.find('.question__option-list');\n\n // Decide layout\n if (this._subtype === 'buttons') {\n $optionListEl.addClass('question__option-list--buttons');\n } else {\n if (this._options.length % 3) {\n if (this._options.length === 2) {\n $optionListEl.addClass('question__option-list--flex');\n } else {\n $optionListEl.addClass('question__option-list--grid--4');\n }\n }\n }\n\n // If it's a checkbox question, build the Next button using nextLabel\n let $nextBtn = null;\n if (this._type === 'checkbox') {\n const $nextBtnWrapper = $(`\n
    \n \n
    \n `);\n\n $nextBtn = $nextBtnWrapper.find('.question__next-button');\n $questionEl.append($nextBtnWrapper);\n\n // When user clicks Next\n $nextBtn.on('click', () => {\n if (this._onSelect) {\n // We signal that it's a \"nextButton\" event\n this._onSelect({ nextButton: true }, this._type, this._subtype);\n }\n });\n }\n\n // For each option, clone from the correct
  • template\n const optionTemplate = this._getOptionTemplate();\n this._options.forEach(({ text, image, color }, i) => {\n const $optionEl = $(optionTemplate).clone(true, true);\n\n color = color || this._mapIndexToHex(i);\n $optionEl.find('.question__option-bubble-outter').css('backgroundColor', color);\n $optionEl.find('.question__option-bubble').css('backgroundColor', color);\n\n $optionEl.find('.question__option-label, .question__button-option-label').html(text);\n\n // Input config\n const $inputEl = $optionEl.find('input.question__input');\n $inputEl.attr('type', this._type);\n $inputEl.attr('name', this._inputsName);\n\n // If there's an image\n const $imageEl = $optionEl.find('.question__image');\n if (image && typeof image === 'string') {\n $imageEl.attr('src', `${IMAGES_BASE_URI}/${image}`);\n } else if (image && typeof image === 'object') {\n $imageEl.attr('src', `${IMAGES_BASE_URI}/${image.src}`);\n if (image.style) {\n $imageEl.addClass(`question__image--style--${image.style}`);\n }\n } else {\n $imageEl.remove();\n }\n\n this._attachEvents($inputEl, $questionEl, $nextBtn);\n $optionListEl.append($optionEl);\n });\n\n // Accessibility: trap Tab\n $(window).on('keydown', (event) => {\n if (event.key === 'Tab') {\n const $backBtn = $('.back-button');\n if ($(document.activeElement).is($backBtn)) {\n $questionEl.find('input').first().focus();\n } else {\n $backBtn.focus();\n }\n event.preventDefault();\n }\n });\n\n this.$element = $questionEl;\n return this.$element;\n }\n\n _attachEvents($inputEl, $questionEl, $nextBtn) {\n if (!this._onSelect) return;\n\n $inputEl.on('keydown', (event) => {\n event.stopPropagation();\n if (event.key.startsWith('Arrow')) {\n $questionEl.addClass('question--using-keyboard');\n this._arrowKeyPressed = true;\n return;\n }\n if (event.key === 'Enter') {\n this._onSelect(event, this._type, this._subtype);\n }\n });\n\n $inputEl.on('click', (e) => {\n if (this._arrowKeyPressed) {\n this._arrowKeyPressed = false;\n return;\n }\n\n if (this._type === 'radio') {\n // Radio: auto-advance\n if (e.target.checked) {\n this._onSelect(e, this._type, this._subtype);\n }\n } else {\n // Checkbox: do NOT auto-advance\n // Enable Next button once something is selected\n if ($nextBtn) {\n const $allChecks = $questionEl.find('input[type=checkbox]');\n const anyChecked = $allChecks.toArray().some(chk => chk.checked);\n $nextBtn.prop('disabled', !anyChecked);\n }\n }\n });\n }\n\n _mapIndexToHex(index) {\n return ['#00C881', '#06A1B5', '#ffc20e', '#00B374'][index] || '#00C881';\n }\n}\n\n/*************************************************************\n * QuizController\n *************************************************************/\nexport class QuizController {\n constructor({ container, questionObjs }) {\n this.$questionTrackEl = container instanceof jQuery ? container : $(container);\n this._questions = questionObjs;\n this._currentQuestionIndex = -1;\n this._currentQuestion = null;\n }\n\n currentQuestion() {\n return this._currentQuestion;\n }\n\n init() {\n this._questions.forEach((q) => {\n this.$questionTrackEl.append(q.getView());\n });\n this.forward();\n\n setTimeout(() => {\n this.$questionTrackEl.find('input').first().focus();\n }, 300);\n }\n\n isFirstQuestion() {\n return this._currentQuestionIndex === 0;\n }\n\n isLastQuestion() {\n return this._currentQuestionIndex === this._questions.length - 1;\n }\n\n getCurrentQuestionIndex() {\n return this._currentQuestionIndex;\n }\n\n getNextIndex() {\n return this._questions[this._currentQuestionIndex + 1]\n ? this._currentQuestionIndex + 1\n : false;\n }\n\n getPreviousIndex() {\n return this._questions[this._currentQuestionIndex - 1]\n ? this._currentQuestionIndex - 1\n : false;\n }\n\n _syncIndexToQuestion() {\n this._currentQuestion = this._questions[this._currentQuestionIndex];\n }\n\n _adjustHeight() {\n setTimeout(() => {\n if (this._currentQuestion) {\n this.$questionTrackEl.css('height', this._currentQuestion.getHeight() + 'px');\n }\n });\n }\n\n forward() {\n const nextQuestionIndex = this.getNextIndex();\n if (nextQuestionIndex === false) return false;\n if (this._currentQuestion) {\n this._currentQuestion.pass();\n }\n this._currentQuestionIndex = nextQuestionIndex;\n this._syncIndexToQuestion();\n this._currentQuestion.appear();\n this._adjustHeight();\n\n setTimeout(() => {\n this._currentQuestion.focusFirstInput();\n }, 300);\n }\n\n back() {\n const prevQuestionIndex = this.getPreviousIndex();\n if (prevQuestionIndex === false) return false;\n this._currentQuestion.hide();\n this._currentQuestionIndex = prevQuestionIndex;\n this._syncIndexToQuestion();\n this._currentQuestion.unpass();\n this._adjustHeight();\n\n setTimeout(() => {\n this._currentQuestion.focusFirstInput();\n }, 300);\n }\n}\n\n/*************************************************************\n * EventEmitter\n *************************************************************/\nexport class EventEmitter {\n constructor() {\n this.events = {};\n }\n\n on(eventName, listener) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(listener);\n }\n\n emit(eventName, ...args) {\n const listeners = this.events[eventName];\n if (listeners) {\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n }\n\n off(eventName, listener) {\n const listeners = this.events[eventName];\n if (listeners) {\n this.events[eventName] = listeners.filter((l) => l !== listener);\n }\n }\n}\n\n/*************************************************************\n * Main Quiz Script\n *************************************************************/\n$(document).ready(function () {\n // Create the event emitter\n const ee = new EventEmitter();\n\n // DOM Elements\n const $prevBtnEl = $('#prev-btn');\n const $startBtnEl = $('#start-btn');\n const $submitButton = $('#submit-btn');\n const $progressBarEl = $('.progress-bar');\n const $viewSwitchEl = $('.view-switch');\n const $quizView = $('#quiz-view');\n const $welcomeView = $('#welcome-view');\n const $leadView = $('#lead-view');\n const $formEl = $('#form');\n const $questionTrackEl = $('#question-track');\n const $loadScreen = $('#load-screen');\n\n // Build the ProgressBar\n const progressBar = new ProgressBar({\n progressBarEl: $progressBarEl,\n levelCount: questions.length + 2\n });\n progressBar.init();\n\n // Build the ViewSwitch\n const viewController = new ViewSwitch({\n viewSwitchEl: $viewSwitchEl,\n views: {\n welcome: $welcomeView,\n quiz: $quizView,\n lead: $leadView\n }\n });\n\n // Build the question objects\n const questionObjs = questions.map((qData) => {\n const qObj = new ChoiceQuestion(qData);\n\n qObj.onSelect((event, qType, qSubtype) => {\n // If user clicked the Next button on a checkbox question\n if (event?.nextButton) {\n return ee.emit('next');\n }\n\n // If it's a radio question\n if (qType === 'radio') {\n if (qSubtype === 'buttons') {\n ee.emit('next');\n } else {\n setTimeout(() => ee.emit('next'), 300);\n }\n } else {\n // It's a checkbox, do nothing on each click\n console.log('Checkbox. User must click Next to proceed.');\n }\n });\n\n return qObj;\n });\n\n // Build the QuizController\n const quizController = new QuizController({\n container: $questionTrackEl,\n questionObjs\n });\n\n // Helpers\n const hideButton = ($button) => $button.addClass('lasik-quiz-button--hide');\n const showButton = ($button) => $button.removeClass('lasik-quiz-button--hide');\n const showLoadingScreen = () => $loadScreen.addClass('quiz-lead-view__spinner--show');\n const hideLoadingScreen = () => $loadScreen.removeClass('quiz-lead-view__spinner--show');\n\n // Prev Button\n $prevBtnEl.on('click', () => ee.emit('previous'));\n $prevBtnEl.on('keydown', (e) => {\n if (e.key === 'Tab') {\n quizController.currentQuestion()?.getElement().find('input').first().focus();\n }\n });\n\n // jQuery Mask if needed\n $('input[name=\"dob\"]').mask(\"00/00/0000\");\n $('input[name=\"phone\"]').mask(\"(999) 999-9999\");\n\n // Start quiz\n $startBtnEl.on('click', () => ee.emit('start'));\n\n // Form submission\n $formEl.on('submit', (e) => {\n e.preventDefault();\n showLoadingScreen();\n\n // Basic validation\n const $emailInput = $formEl.find('input[name=\"email\"]');\n const $firstNameInput = $formEl.find('input[name=\"first_name\"]');\n const $lastNameInput = $formEl.find('input[name=\"last_name\"]');\n\n let errors = false;\n\n const emailVal = $emailInput.val();\n if (!emailVal || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(emailVal)) {\n $emailInput.addClass('quiz-lead-view__form-input--error');\n errors = true;\n } else {\n $emailInput.removeClass('quiz-lead-view__form-input--error');\n }\n\n if (!$firstNameInput.val()) {\n $firstNameInput.addClass('quiz-lead-view__form-input--error');\n errors = true;\n } else {\n $firstNameInput.removeClass('quiz-lead-view__form-input--error');\n }\n\n if (!$lastNameInput.val()) {\n $lastNameInput.addClass('quiz-lead-view__form-input--error');\n errors = true;\n } else {\n $lastNameInput.removeClass('quiz-lead-view__form-input--error');\n }\n\n if (errors) {\n hideLoadingScreen();\n return;\n }\n\n // Gather data\n const firstName = $firstNameInput.val();\n const lastName = $lastNameInput.val();\n const phone = $formEl.find('input[name=\"phone\"]').val();\n const email = $emailInput.val();\n const optIn = $formEl.find('input[name=\"optIn\"]').is(':checked') ? 'Y' : 'N';\n\n // If Spanish, /es/cuestionario/resultados, else /quiz/results\n const finalResultsPath = isSpanish ? \"/es/cuestionario/resultados\" : \"/quiz/results\";\n\n fetch(\"/wp-json/lasik/v1/quiz-lead\", {\n method: \"POST\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ email, firstName, lastName, phone, optIn })\n })\n .then(r => r.json())\n .then(resp => console.log(\"Response:\", resp))\n .finally(() => {\n window.location.href = finalResultsPath + \"?fname=\" + firstName;\n });\n });\n\n // Pub/Sub\n ee.on('previous', () => {\n quizController.back();\n progressBar.setLevel(quizController.getCurrentQuestionIndex() + 1);\n if (quizController.getPreviousIndex() === false) {\n hideButton($prevBtnEl);\n }\n });\n\n ee.on('next', () => {\n progressBar.setLevel(quizController.getCurrentQuestionIndex() + 1);\n if (quizController.getNextIndex() === false) {\n hideButton($prevBtnEl);\n ee.emit('show-lead');\n $submitButton.prop('disabled', false);\n return;\n }\n quizController.forward();\n if (quizController.getPreviousIndex() !== false) {\n showButton($prevBtnEl);\n }\n });\n\n ee.on('loading', showLoadingScreen);\n\n ee.on('start', () => {\n viewController.mount('quiz');\n quizController.init();\n });\n\n ee.on('show-lead', () => {\n const $formContainer = $('.quiz-lead-view__form');\n setTimeout(() => {\n $formContainer.find('input').first().focus();\n }, 300);\n\n $(window).on('keydown', function (event) {\n if (event.key === 'Tab') {\n const $focusable = $formContainer.find('input,button,select,textarea');\n if ($focusable.length) {\n const currentIndex = $focusable.index($(document.activeElement));\n const $next = $focusable.eq((currentIndex + 1) % $focusable.length);\n $next.focus();\n event.preventDefault();\n }\n }\n });\n viewController.mount('lead');\n });\n});\n"],"mappings":"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","ignoreList":[]}