{"version":3,"file":"life-expectancy-calculator.min.js","names":["sInputKeyValidationHelper","cnfsd_lec_calc","calc","form","result","button","restartButton","currentYear","resultCard","bannerStep","bannerTitle","totalBannerSteps","jsonData","enterYourAge","selectYourBirthSex","yearsOldResultText","agesBetween","calculateBannerProgress","progress","document","querySelector","stepWidth","parseInt","innerHTML","style","width","calculateLifeExpectancy","lifeExpectencyObject","userAge","lifeExpectency","Math","floor","throwError","fieldset","errorId","errorMessageContent","classList","contains","errorMessage","id","add","querySelectorAll","forEach","input","setAttribute","swapUi","toggle","init","async","getElementById","getAttribute","JSON","parse","Date","getFullYear","addEventListener","e","preventDefault","ageFieldGroup","birthSexFieldGroup","birthSexChecked","ageInput","length","value","trim","lifeExpectancy","birthSex","male","female","calcResult","createElement","replace","getResultYearsOldText","insertBefore","showResults","radios","textInputs","currentLifeExpectancy","checked","remove","restartCalc","radio","fieldGroup","closest","inputs","removeAttribute","removeFieldErrors","createInputListeners"],"sources":["life-expectancy-calculator/life-expectancy-calculator.js"],"mappings":"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","ignoreList":[],"sourcesContent":["import { sInputKeyValidationHelper } from '../../shared.min.js';\r\n\r\nconst cnfsd_lec_calc = (function () {\r\n\tlet calc,\r\n\t\tform,\r\n\t\tresult,\r\n\t\tbutton,\r\n\t\trestartButton,\r\n\t\tcurrentYear,\r\n\t\tresultCard,\r\n\t\tbannerStep,\r\n\t\tbannerTitle,\r\n\t\ttotalBannerSteps,\r\n\t\tjsonData,\r\n\t\tenterYourAge,\r\n\t\tselectYourBirthSex,\r\n\t\tyearsOldResultText,\r\n\t\tagesBetween;\r\n\r\n\tasync function init() {\r\n\t\tcalc = document.getElementById('cnfsd-lec-calc');\r\n\t\tform = calc.querySelector('#cnfsd_lec-form');\r\n\t\tjsonData = form.getAttribute('data-calc-json');\r\n\t\tjsonData = JSON.parse(jsonData);\r\n\t\tresult = calc.querySelector('#cnfsd_lec-result');\r\n\t\tbutton = form.querySelector('button.btn--arrow');\r\n\t\trestartButton = calc.querySelector('a.arrow-link');\r\n\t\tcurrentYear = new Date().getFullYear();\r\n\t\tresultCard = calc.querySelector('.card--dark');\r\n\t\tbannerStep = calc.querySelector('.banner-current-progress');\r\n\t\tbannerTitle = calc.querySelector('.banner-title');\r\n\t\ttotalBannerSteps = 2;\r\n\t\tenterYourAge = calc.querySelector('#enter-your-age').innerHTML;\r\n\t\tselectYourBirthSex = calc.querySelector('#select-your-birth-sex').innerHTML;\r\n\t\tyearsOldResultText = calc.querySelector('#years-old-result-text').innerHTML;\r\n\t\tagesBetween = 'Enter an age between 1 and 90 years old';\r\n\r\n\t\tbutton.addEventListener('click', e => {\r\n\t\t\t// START FUNCTION\r\n\t\t\te.preventDefault();\r\n\t\t\tshowResults();\r\n\t\t});\r\n\r\n\t\trestartButton.addEventListener('click', e => {\r\n\t\t\t// START FUNCTION\r\n\t\t\te.preventDefault();\r\n\t\t\trestartCalc();\r\n\t\t});\r\n\r\n\t\tcreateInputListeners();\r\n\r\n\t\tcalculateBannerProgress();\r\n\t}\r\n\r\n\tfunction calculateBannerProgress() {\r\n\t\tconst progress = document.querySelector('.banner__progress-bar__bar'),\r\n\t\t\t//CALC WIDTH OF EACH STEP IN THE PROCESS\r\n\t\t\tstepWidth = `${(100 / totalBannerSteps) * parseInt(bannerStep.innerHTML)}%`;\r\n\t\tprogress.style.width = stepWidth;\r\n\t}\r\n\r\n\tfunction createInputListeners() {\r\n\t\tconst textInputs = form.querySelectorAll('input[type=\"text\"]');\r\n\t\tconst radios = form.querySelectorAll('input[type=\"radio\"]');\r\n\r\n\t\t//ADD E LISTENER TO REMOVE ERROR ON CHANGE\r\n\t\tradios.forEach(radio => {\r\n\t\t\tradio.addEventListener('change', () => removeFieldErrors(radio));\r\n\t\t});\r\n\r\n\t\ttextInputs.forEach(input => {\r\n\t\t\tsInputKeyValidationHelper(input, 'numeric', input.closest('.field-group'));\r\n\t\t});\r\n\t}\r\n\r\n\tfunction restartCalc() {\r\n\t\tconst radios = form.querySelectorAll('input[type=radio]'),\r\n\t\t\ttextInputs = form.querySelectorAll('input[type=text]'),\r\n\t\t\tcurrentLifeExpectancy = resultCard.querySelector('h2.display');\r\n\r\n\t\tradios.forEach(input => {\r\n\t\t\tinput.checked = false;\r\n\t\t});\r\n\r\n\t\ttextInputs.forEach(input => {\r\n\t\t\tinput.value = '';\r\n\t\t});\r\n\r\n\t\t//SWAP UI\r\n\t\tswapUi();\r\n\r\n\t\t//BANNER PROGRESS\r\n\t\tbannerStep.innerHTML = 1;\r\n\t\tbannerTitle.innerHTML = form.getAttribute('data-title');\r\n\t\tcalculateBannerProgress();\r\n\r\n\t\t//REMOVE CURRENT CALCULATED LIFE EXPECTANCY\r\n\t\tcurrentLifeExpectancy.remove();\r\n\t}\r\n\r\n\tfunction getLifeExpectancy(birthSex, userAge) {\r\n\t\t//GETS THE OBJECT OF THE NEXT 5 YEARS OF LIFE EXPECTANCY\r\n\t\t// Checking to see which gender is selected.\r\n\t\tif (birthSex === 'male') {\r\n\t\t\treturn calculateLifeExpectancy(jsonData.male[userAge], userAge);\r\n\t\t} else {\r\n\t\t\treturn calculateLifeExpectancy(jsonData.female[userAge], userAge);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction calculateLifeExpectancy(lifeExpectencyObject, userAge) {\r\n\t\tfor (const lifeExpectency in lifeExpectencyObject) {\r\n\t\t\tif (currentYear === parseInt(lifeExpectency, 10)) {\r\n\t\t\t\t// Adding on the current age as the json data, gives life expectancy from the current age.\r\n\t\t\t\treturn Math.floor(lifeExpectencyObject[lifeExpectency] + parseInt(userAge));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction showResults() {\r\n\t\tconst [ageFieldGroup, birthSexFieldGroup] = form.querySelectorAll('.field-group'),\r\n\t\t\tbirthSexChecked = form.querySelectorAll('input:checked'),\r\n\t\t\tageInput = document.getElementById('lec-age');\r\n\r\n\t\t//THROW ERROR IF SKIPPED INPUTS\r\n\t\tif (\r\n\t\t\t!birthSexChecked.length ||\r\n\t\t\tageInput.value.trim() === '' ||\r\n\t\t\tparseInt(ageInput.value) > 90 ||\r\n\t\t\tparseInt(ageInput.value) < 1\r\n\t\t) {\r\n\t\t\tif (parseInt(ageInput.value) > 90 || parseInt(ageInput.value) < 1)\r\n\t\t\t\tthrowError(ageFieldGroup, 'lec-age--error', agesBetween);\r\n\t\t\tif (ageInput.value.trim() === '') throwError(ageFieldGroup, 'lec-age--error', enterYourAge);\r\n\t\t\tif (!birthSexChecked.length) throwError(birthSexFieldGroup, 'lec-birthsex--error', selectYourBirthSex);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst lifeExpectancy = getLifeExpectancy(birthSexChecked[0].value, ageInput.value),\r\n\t\t\tcalcResult = document.createElement('h2');\r\n\r\n\t\t//SET LIFE EXPECTANCY\r\n\t\tcalcResult.classList.add('display');\r\n\t\tcalcResult.innerHTML = getResultYearsOldText(lifeExpectancy);\r\n\t\tresultCard.insertBefore(calcResult, restartButton);\r\n\r\n\t\t//SWAP UI\r\n\t\tswapUi();\r\n\r\n\t\t//BANNER FUNCTIONALITY\r\n\t\tbannerStep.innerHTML = 2;\r\n\t\tbannerTitle.innerHTML = result.getAttribute('data-title');\r\n\t\tcalculateBannerProgress();\r\n\t}\r\n\r\n\tfunction getResultYearsOldText(lifeExpectancy) {\r\n\t\treturn yearsOldResultText.replace('{result}', lifeExpectancy);\r\n\t}\r\n\r\n\tfunction throwError(fieldset, errorId, errorMessageContent) {\r\n\t\t//IF ERROR EXISTS\r\n\t\tif (fieldset.classList.contains('field-group--error')) return;\r\n\r\n\t\t//SET ERROR MESSAGE\r\n\t\tconst errorMessage = fieldset.querySelector('.error-message');\r\n\t\terrorMessage.innerHTML = errorMessageContent;\r\n\t\terrorMessage.id = errorId;\r\n\r\n\t\t//SET FIELDGROUP TO ERROR CLASS\r\n\t\tfieldset.classList.add('field-group--error');\r\n\r\n\t\t//RED BORDERS\r\n\t\tconst inputs = fieldset.querySelectorAll('input');\r\n\t\tinputs.forEach(input => {\r\n\t\t\tinput.setAttribute('aria-invalid', true);\r\n\t\t\tinput.setAttribute('aria-errormessage', errorId);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction removeFieldErrors(input) {\r\n\t\tconst fieldGroup = input.closest('.field-group');\r\n\t\tif (!fieldGroup.classList.contains('field-group--error')) return; //IF NO ERROR EXIT FUNCTION\r\n\t\tconst inputs = fieldGroup.querySelectorAll('input');\r\n\t\t//REMOVE ERROR MESSAGE\r\n\t\tfieldGroup.classList.remove('field-group--error');\r\n\r\n\t\t//REMOVE ATTRIBUTES\r\n\t\tinputs.forEach(input => {\r\n\t\t\tinput.removeAttribute('aria-invalid');\r\n\t\t\tinput.removeAttribute('aria-errormessage');\r\n\t\t});\r\n\t}\r\n\r\n\tfunction swapUi() {\r\n\t\tresult.classList.toggle('display-none');\r\n\t\tform.classList.toggle('display-none');\r\n\t}\r\n\r\n\treturn {\r\n\t\tinit: init,\r\n\t};\r\n})();\r\n\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n\tcnfsd_lec_calc.init();\r\n});\r\n"]}