{"version":3,"file":"insurance-group-calculator.min.js","names":["cnfsd_insurance_group_calc","apiUrl","apiSubKey","regNumberField","makeInput","findGroupByRegButton","calcResults","insuranceText","noDataError","registrationNumberError","autocompleteUl","loadingSpinner","foundVehicle","autocompleteUlIsEmpty","vehicles","carDetails","registration","make","model","doors","fuel","year","engine","transmission","insuranceGroup","weight","initialCarDetails","carUiDetails","regUi","makeUi","modelUi","fuelUi","yearUi","engineUi","insGroupUi","answeredQuestions","async","fetchVehicleDetails","apiMethod","apiParams","split","endpoint","URLSearchParams","toString","insuranceGroupCalculator","toggleLoadingSpinner","headers","response","fetch","method","ok","style","display","json","Error","status","error","addErrorMessage","console","getAllFollowingFieldsetSiblings","element","siblings","currentElement","hasAttribute","document","querySelectorAll","nextElementSibling","nodeName","classList","contains","push","resetFieldsets","fieldsetsToReset","forEach","fieldset","fieldsetSelect","querySelector","option","remove","selectedIndex","radio","add","trimQuestion","getElementById","trimSelect","capitaliseFirstLetter","string","charAt","toUpperCase","slice","toLowerCase","addClickListeners","this","addToggleFormListeners","addFindGroupButtonListeners","addAutocompleteMakeListener","button","addEventListener","handleToggleFormButtonClick","getVehicleMakes","event","handleFindGroupButtonClick","autoCompleteMake","handlerFunction","target","dataset","handleMakeSelected","key","preventDefault","addChangeListeners","selectElement","handleSelectChange","form","handleRadioChange","removeErrorClass","addKeyboardInputListeners","value","length","click","e","keyCode","which","test","String","fromCharCode","makesDataLocal","dataName","dataString","localStorage","getItem","JSON","parse","getFromLocalStorage","res","data","stringify","setItem","storeInLocalStorage","populateAutoFillOptions","makes","warn","fragment","createDocumentFragment","index","li","createElement","className","setAttribute","tabIndex","textContent","appendChild","firstChild","removeChild","addFilterToInput","query","options","text","startsWith","matchStart","indexOf","matchEnd","highlightedString","innerHTML","select","question","includes","closest","updateCarDetails","selectedVal","paramsBase","concat","buildQueryParams","additionalParams","handleOptionSelected","populateRadios","engineParams","find","vehicle","ThatchamVehicle","TrimLevelName","Gr50Actual","Gr20Actual","fillInResultsUi","handleAllCarDetailsFound","every","prop","encodeURIComponent","populateTrims","trims","map","populateOptions","questionAnswered","toggleForms","formToShow","formToHide","toggleButtonIsLoading","replace","userRegLength","replaceAll","fillInCarDetailsFromReg","resetUi","buttonClicked","parentElement","getCarUiDetails","field","ManufacturerBrandName","ABIDescription","PrimaryFuelTypeName","CubicCapacity","RegistrationYear","CarWebVehicle","getInsuranceText","groupNumber","textToReturn","insuranceGroupValue","isFromReg","insuranceGroupUi","forms","results","nextQuestion","optionId","nextQuestionId","sort","filter","item","self","opt","nextApiMethod","handleNextQuestion","radiosToPopulate","htmlString","transmissionFieldset","legendText","fuelFieldset","fuelMapper","fuelType","parent","removeAttribute","questionIndex","elementsAfterQuestion","splice","init","endpointSpan","subKeySpan","getApiDetails"],"sources":["insurance-group-calculator/insurance-group-calculator.js"],"mappings":"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","ignoreList":[],"sourcesContent":["const cnfsd_insurance_group_calc = (function () {\r\n\t// API setup vars\r\n\tlet apiUrl;\r\n\tlet apiSubKey;\r\n\r\n\t// DOM Elements\r\n\tlet regNumberField;\r\n\tlet makeInput;\r\n\tlet findGroupByRegButton;\r\n\tlet calcResults;\r\n\tlet insuranceText;\r\n\tlet noDataError;\r\n\tlet registrationNumberError;\r\n\tlet autocompleteUl;\r\n\tlet loadingSpinner;\r\n\r\n\t// Checks if car makes have been added to DOM\r\n\tlet autocompleteUlIsEmpty = true;\r\n\r\n\t// Will hold vehicle information when vehicles are found\r\n\tlet vehicles = [];\r\n\tlet foundVehicle;\r\n\r\n\t// Object that will store all the car details retrieved from the API\r\n\tlet carDetails = {\r\n\t\tregistration: '',\r\n\t\tmake: '',\r\n\t\tmodel: '',\r\n\t\tdoors: '',\r\n\t\tfuel: '',\r\n\t\tyear: '',\r\n\t\tengine: '',\r\n\t\ttransmission: '',\r\n\t\tinsuranceGroup: '',\r\n\t\tweight: 0,\r\n\t};\r\n\r\n\t// Copy the initial state of the carDetails object so that it is easy to reset it later\r\n\tconst initialCarDetails = { ...carDetails };\r\n\r\n\t// Object to store references to DOM elements where car details are shown to the user\r\n\tconst carUiDetails = {\r\n\t\tregUi: '',\r\n\t\tmakeUi: '',\r\n\t\tmodelUi: '',\r\n\t\tfuelUi: '',\r\n\t\tyearUi: '',\r\n\t\tengineUi: '',\r\n\t\tinsGroupUi: '',\r\n\t};\r\n\r\n\t// Keeps track of the questions that have been answered in the manual lookup question set\r\n\tconst answeredQuestions = [];\r\n\r\n\t// Init is called on DOMContentReady\r\n\tfunction init() {\r\n\t\tconst calc = document.querySelector('.mod-insurance-group-calc');\r\n\t\tif (!calc) return;\r\n\r\n\t\t// Assigns a URL to use for all endpoints, based on the current window.location.hostname\r\n\t\tgetApiDetails();\r\n\r\n\t\t// Assign DOM elements\r\n\t\tinsuranceGroupCalculator.getCarUiDetails();\r\n\t\tregNumberField = document.getElementById('regNumber');\r\n\t\tmakeInput = document.getElementById('make');\r\n\t\tcalcResults = document.querySelector('.mod-insurance-group-calc .calc-results');\r\n\t\tinsuranceText = document.getElementById('insGroup-text');\r\n\t\tautocompleteUl = document.getElementById('autocompleteMake');\r\n\t\tloadingSpinner = document.getElementById('loading-spinner');\r\n\t\tnoDataError = document.getElementById('error--no-data');\r\n\t\tregistrationNumberError = document.getElementById('error--registration');\r\n\r\n\t\t// Add all click listeners\r\n\t\tinsuranceGroupCalculator.addClickListeners();\r\n\t\tinsuranceGroupCalculator.addChangeListeners();\r\n\t\tinsuranceGroupCalculator.addKeyboardInputListeners();\r\n\r\n\t\tregNumberField.addEventListener('paste', event => {\r\n\t\t\tevent.preventDefault();\r\n\t\t});\r\n\t}\r\n\r\n\t// HELPER METHOD:: Retrieves the API URL based upon the hostname of where the app is running\r\n\tfunction getApiDetails() {\r\n\t\tconst endpointSpan = document.getElementById('api-endpoint');\r\n\t\tapiUrl = endpointSpan ? endpointSpan.textContent : 'http://localhost:3000/vehicle-lookup';\r\n\t\tconst subKeySpan = document.getElementById('sub-key');\r\n\t\tapiSubKey = subKeySpan ? subKeySpan.textContent : '';\r\n\t}\r\n\r\n\t// HELPER METHOD:: Calls an API endpoint. Takes in the API method to call and the parameters for that method.\r\n\tasync function fetchVehicleDetails(apiMethod, apiParams) {\r\n\t\t// Checks for empty params on reg input\r\n\t\tconst parts = apiParams.split('=');\r\n\t\tconst params = parts[1];\r\n\t\tif (params == '' && apiMethod == 'registration') return [];\r\n\r\n\t\tconst endpoint = `${apiUrl}/${apiMethod}?${new URLSearchParams(apiParams).toString()}`;\r\n\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\r\n\t\ttry {\r\n\t\t\tconst headers = apiSubKey ? { 'Ocp-Apim-Subscription-Key': apiSubKey } : {};\r\n\t\t\tconst response = await fetch(endpoint, { method: 'GET', headers });\r\n\r\n\t\t\tif (response.ok) {\r\n\t\t\t\tif (noDataError.style.display === 'block') noDataError.style.display = 'none';\r\n\t\t\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\t\t\treturn await response.json();\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(response.status);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\t\tif (apiMethod === 'registration') {\r\n\t\t\t\tinsuranceGroupCalculator.addErrorMessage();\r\n\t\t\t}\r\n\t\t\tconsole.error('Fetch error for endpoint:', endpoint, 'Error:', error);\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\t// HELPER METHOD:: Takes in some data to store in local storage\r\n\tfunction storeInLocalStorage(data, dataName) {\r\n\t\ttry {\r\n\t\t\tconst dataString = JSON.stringify(data);\r\n\t\t\tlocalStorage.setItem(dataName, dataString);\r\n\t\t} catch (e) {\r\n\t\t\tconsole.error('Failed to save the data in localStorage:', e);\r\n\t\t}\r\n\t}\r\n\r\n\t// HELPER METHOD:: Retrieves data from local storage if it exists\r\n\tfunction getFromLocalStorage(dataName) {\r\n\t\ttry {\r\n\t\t\tconst dataString = localStorage.getItem(dataName);\r\n\t\t\tif (dataString) {\r\n\t\t\t\treturn JSON.parse(dataString);\r\n\t\t\t} else {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error('Failed to retrieve data from localStorage:', error);\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t// HELPER METHOD:: Looks for all siblings that are of node type \"fieldset\".\r\n\t// Used to reset fieldsets when a user changes a value that they have already entered in the manual search.\r\n\tfunction getAllFollowingFieldsetSiblings(element) {\r\n\t\tlet siblings = [];\r\n\t\tlet currentElement = element;\r\n\r\n\t\t// \"make\" question has been changed\r\n\t\tif (!element.hasAttribute('id')) {\r\n\t\t\tsiblings = [...document.querySelectorAll('.mod-subsection fieldset')];\r\n\t\t\treturn siblings;\r\n\t\t}\r\n\r\n\t\twhile (currentElement.nextElementSibling) {\r\n\t\t\tcurrentElement = currentElement.nextElementSibling;\r\n\r\n\t\t\t// Check if the sibling is a fieldset\r\n\t\t\tif (currentElement.nodeName === 'FIELDSET' && !currentElement.classList.contains('display-none')) {\r\n\t\t\t\tsiblings.push(currentElement);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn siblings;\r\n\t}\r\n\r\n\tfunction resetFieldsets(fieldsetsToReset) {\r\n\t\tfieldsetsToReset.forEach(fieldset => {\r\n\t\t\tconst fieldsetSelect = fieldset.querySelector('select');\r\n\t\t\tif (fieldsetSelect) {\r\n\t\t\t\t// Select\r\n\t\t\t\tconst enabledOptions = fieldsetSelect.querySelectorAll('option:enabled');\r\n\r\n\t\t\t\tenabledOptions.forEach(function (option) {\r\n\t\t\t\t\toption.remove();\r\n\t\t\t\t});\r\n\r\n\t\t\t\tfieldsetSelect.selectedIndex = 0;\r\n\t\t\t} else {\r\n\t\t\t\t// Radio\r\n\t\t\t\tconst allRadios = fieldset.querySelectorAll('input-shell');\r\n\t\t\t\tallRadios.forEach(radio => radio.remove());\r\n\t\t\t}\r\n\t\t\tfieldset.classList.add('display-none');\r\n\t\t});\r\n\t\tconst trimQuestion = document.getElementById('trim-question');\r\n\t\tif (trimQuestion) {\r\n\t\t\tif (!trimQuestion.classList.contains('display-none')) {\r\n\t\t\t\tconst trimSelect = trimQuestion.querySelector('select');\r\n\t\t\t\tif (trimSelect) {\r\n\t\t\t\t\tconst enabledOptions = trimSelect.querySelectorAll('option:enabled');\r\n\r\n\t\t\t\t\tenabledOptions.forEach(function (option) {\r\n\t\t\t\t\t\toption.remove();\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\ttrimSelect.selectedIndex = 0;\r\n\t\t\t\t}\r\n\t\t\t\ttrimQuestion.classList.add('display-none');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction capitaliseFirstLetter(string) {\r\n\t\tif (!string || typeof string !== 'string') return '';\r\n\t\treturn string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n\t}\r\n\r\n\t// MAIN WIDGET FUNCTIONALITY\r\n\tconst insuranceGroupCalculator = {\r\n\t\t// ADDING CLICK LISTENERS\r\n\t\taddClickListeners: function () {\r\n\t\t\tthis.addToggleFormListeners();\r\n\t\t\tthis.addFindGroupButtonListeners();\r\n\t\t\tthis.addAutocompleteMakeListener();\r\n\t\t},\r\n\r\n\t\t// START CLICK LISTENER FUNCTIONS\r\n\t\taddToggleFormListeners: function () {\r\n\t\t\tconst toggleFormButtons = document.querySelectorAll('.makeandmodel, .back-to-reg');\r\n\t\t\ttoggleFormButtons.forEach(button => {\r\n\t\t\t\tbutton.addEventListener('click', insuranceGroupCalculator.handleToggleFormButtonClick);\r\n\t\t\t\tif (button.classList.contains('makeandmodel')) {\r\n\t\t\t\t\tbutton.addEventListener('click', insuranceGroupCalculator.getVehicleMakes);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\taddFindGroupButtonListeners: function () {\r\n\t\t\tfindGroupByRegButton = document.querySelector('#registration-lookup-button');\r\n\t\t\tif (findGroupByRegButton) {\r\n\t\t\t\tfindGroupByRegButton.addEventListener('click', event => {\r\n\t\t\t\t\tinsuranceGroupCalculator.handleFindGroupButtonClick(event);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\taddAutocompleteMakeListener: function () {\r\n\t\t\tconst autoCompleteMake = document.getElementById('autocompleteMake');\r\n\r\n\t\t\tconst handlerFunction = event => {\r\n\t\t\t\tif (event.target.classList.contains('autocomplete__option')) {\r\n\t\t\t\t\tconst make = event.target.dataset.make;\r\n\t\t\t\t\tcarDetails.make = make;\r\n\t\t\t\t\tinsuranceGroupCalculator.handleMakeSelected(event.target.dataset.make);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// Click\r\n\t\t\tautoCompleteMake.addEventListener('click', function (event) {\r\n\t\t\t\thandlerFunction(event);\r\n\t\t\t});\r\n\r\n\t\t\t// On enter or space\r\n\t\t\tautoCompleteMake.addEventListener('keydown', function (event) {\r\n\t\t\t\tif (event.key === 'Enter' || event.key === ' ') {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\thandlerFunction(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t// END CLICK LISTENER FUNCTIONS\r\n\r\n\t\t// ADD CHANGE LISTENER TO FORM SELECTS\r\n\t\taddChangeListeners: function () {\r\n\t\t\tconst formSelects = document.querySelectorAll('#manual-lookup-form select');\r\n\t\t\tformSelects.forEach(selectElement => {\r\n\t\t\t\tselectElement.addEventListener('change', insuranceGroupCalculator.handleSelectChange);\r\n\t\t\t});\r\n\r\n\t\t\tconst form = document.getElementById('manual-lookup-form');\r\n\t\t\tif (form) {\r\n\t\t\t\tform.addEventListener('change', insuranceGroupCalculator.handleRadioChange);\r\n\t\t\t}\r\n\r\n\t\t\tregNumberField.addEventListener('input', insuranceGroupCalculator.removeErrorClass);\r\n\t\t},\r\n\r\n\t\taddKeyboardInputListeners: function () {\r\n\t\t\tregNumberField.addEventListener('keydown', function (event) {\r\n\t\t\t\tif (event.key === 'Enter') {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tif (regNumberField.value.length >= 1) {\r\n\t\t\t\t\t\tfindGroupByRegButton.click();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tmakeInput.addEventListener('keydown', function (event) {\r\n\t\t\t\tif (event.key === 'Enter') event.preventDefault();\r\n\t\t\t});\r\n\r\n\t\t\tregNumberField.addEventListener('keypress', e => {\r\n\t\t\t\tconst key = e.keyCode || e.which || e.key;\r\n\t\t\t\tconst regex = /^[\\w\\s]+$/;\r\n\t\t\t\tif (\r\n\t\t\t\t\tkey !== 190 &&\r\n\t\t\t\t\tkey !== 110 &&\r\n\t\t\t\t\tkey !== 37 &&\r\n\t\t\t\t\tkey !== 38 &&\r\n\t\t\t\t\tkey !== 39 &&\r\n\t\t\t\t\tkey !== 40 &&\r\n\t\t\t\t\tkey !== 8 &&\r\n\t\t\t\t\t!regex.test(String.fromCharCode(key))\r\n\t\t\t\t) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Gets a list of all vehicle makes, this is called on click of the \"Search by make and model\" button\r\n\t\tgetVehicleMakes: async function () {\r\n\t\t\tconst makesDataLocal = getFromLocalStorage('makesData');\r\n\t\t\tlet res;\r\n\t\t\tif (!makesDataLocal) {\r\n\t\t\t\tres = await fetchVehicleDetails('makes', 'vehicleType=0');\r\n\t\t\t\tstoreInLocalStorage(res, 'makesData');\r\n\t\t\t} else {\r\n\t\t\t\tres = makesDataLocal;\r\n\t\t\t}\r\n\r\n\t\t\tinsuranceGroupCalculator.populateAutoFillOptions(res);\r\n\t\t},\r\n\r\n\t\t// This is called within \"getVehicleMakes()\", it populates the select with options for each make of car retrieved from the /makes endpoint\r\n\t\tpopulateAutoFillOptions: function (makes) {\r\n\t\t\tif (!autocompleteUlIsEmpty) return;\r\n\r\n\t\t\tif (!autocompleteUl) {\r\n\t\t\t\tconsole.warn('Autocomplete list not found.');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fragment = document.createDocumentFragment();\r\n\r\n\t\t\tmakes.forEach((make, index) => {\r\n\t\t\t\tconst li = document.createElement('li');\r\n\t\t\t\tli.className = 'autocomplete__option display-none';\r\n\t\t\t\tli.setAttribute('aria-selected', 'false');\r\n\t\t\t\tli.setAttribute('id', `autoCompleteOption-${index}`);\r\n\t\t\t\tli.setAttribute('role', 'option');\r\n\t\t\t\tli.tabIndex = -1;\r\n\t\t\t\tli.dataset.make = make;\r\n\t\t\t\tli.textContent = make;\r\n\r\n\t\t\t\tfragment.appendChild(li);\r\n\t\t\t});\r\n\r\n\t\t\twhile (autocompleteUl.firstChild) {\r\n\t\t\t\tautocompleteUl.removeChild(autocompleteUl.firstChild);\r\n\t\t\t}\r\n\r\n\t\t\tautocompleteUl.appendChild(fragment);\r\n\r\n\t\t\tinsuranceGroupCalculator.addFilterToInput();\r\n\r\n\t\t\tautocompleteUlIsEmpty = false;\r\n\t\t},\r\n\r\n\t\t// Filters the list of makes based on the text added by the user\r\n\t\taddFilterToInput: function () {\r\n\t\t\tif (!makeInput || !autocompleteUl) {\r\n\t\t\t\tconsole.warn('Autocomplete input or list not found.');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tmakeInput.addEventListener('input', function () {\r\n\t\t\t\tconst query = makeInput.value.toLowerCase();\r\n\t\t\t\tconst options = document.querySelectorAll('.autocomplete__option');\r\n\r\n\t\t\t\tif (query.length < 2) {\r\n\t\t\t\t\tautocompleteUl.classList.add('display-none');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tautocompleteUl.classList.remove('display-none');\r\n\t\t\t\t}\r\n\r\n\t\t\t\toptions.forEach(option => {\r\n\t\t\t\t\tconst text = option.textContent.toLowerCase();\r\n\t\t\t\t\tif (text.startsWith(query)) {\r\n\t\t\t\t\t\tconst matchStart = text.indexOf(query);\r\n\t\t\t\t\t\tconst matchEnd = matchStart + query.length;\r\n\t\t\t\t\t\tconst highlightedString = `${option.textContent.slice(0, matchStart)}${option.textContent.slice(matchStart, matchEnd)}${option.textContent.slice(matchEnd)}`;\r\n\t\t\t\t\t\toption.innerHTML = highlightedString;\r\n\t\t\t\t\t\toption.classList.remove('display-none');\r\n\t\t\t\t\t\toption.tabIndex = '0';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\toption.innerHTML = option.textContent;\r\n\t\t\t\t\t\toption.classList.add('display-none');\r\n\t\t\t\t\t\toption.tabIndex = '-1';\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Handles what to do when a select input is changed by the user, based on what select was changed\r\n\t\thandleSelectChange: async function (event) {\r\n\t\t\tconst select = event.target;\r\n\t\t\tconst question = select.options[select.selectedIndex].dataset.question;\r\n\r\n\t\t\tif (answeredQuestions.includes(question)) {\r\n\t\t\t\tconst fieldsetParent = select.closest('fieldset');\r\n\t\t\t\tconst fieldsetsToReset = getAllFollowingFieldsetSiblings(fieldsetParent);\r\n\r\n\t\t\t\t// Reset carDetails properties for everything AFTER changed question in answerQuestions[]\r\n\t\t\t\tinsuranceGroupCalculator.updateCarDetails(question);\r\n\r\n\t\t\t\t// Reset html for every fieldset in fieldsetsToReset\r\n\t\t\t\tresetFieldsets(fieldsetsToReset);\r\n\t\t\t} else {\r\n\t\t\t\tansweredQuestions.push(question);\r\n\t\t\t}\r\n\r\n\t\t\tlet selectedVal = select.value;\r\n\r\n\t\t\tlet paramsBase = 'vehicleType=0&make='.concat(carDetails.make, '&model=').concat(carDetails.model); // Helper function to build query params\r\n\r\n\t\t\tconst buildQueryParams = additionalParams => ''.concat(paramsBase, '&').concat(additionalParams);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tswitch (question) {\r\n\t\t\t\t\tcase 'model':\r\n\t\t\t\t\t\tcarDetails.model = selectedVal;\r\n\t\t\t\t\t\tparamsBase = 'vehicleType=0&make='.concat(carDetails.make, '&model=').concat(carDetails.model); // reset this here as this is the only place that carDetails.model will not be defined first\r\n\r\n\t\t\t\t\t\tawait insuranceGroupCalculator.handleOptionSelected(\r\n\t\t\t\t\t\t\tselectedVal,\r\n\t\t\t\t\t\t\tquestion,\r\n\t\t\t\t\t\t\t'years',\r\n\t\t\t\t\t\t\tbuildQueryParams(''),\r\n\t\t\t\t\t\t\t'year'\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'year':\r\n\t\t\t\t\t\tcarDetails.year = selectedVal;\r\n\t\t\t\t\t\tawait insuranceGroupCalculator.handleOptionSelected(\r\n\t\t\t\t\t\t\tselectedVal,\r\n\t\t\t\t\t\t\tquestion,\r\n\t\t\t\t\t\t\t'doors',\r\n\t\t\t\t\t\t\tbuildQueryParams('manufactureYear='.concat(carDetails.year)),\r\n\t\t\t\t\t\t\t'doors'\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'doors':\r\n\t\t\t\t\t\tcarDetails.doors = selectedVal;\r\n\t\t\t\t\t\tawait insuranceGroupCalculator.populateRadios('transmissions');\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'engine':\r\n\t\t\t\t\t\tcarDetails.engine = selectedVal;\r\n\t\t\t\t\t\tconst engineParams = 'year='\r\n\t\t\t\t\t\t\t.concat(carDetails.year, '&transmission=')\r\n\t\t\t\t\t\t\t.concat(carDetails.transmission, '&fuelType=')\r\n\t\t\t\t\t\t\t.concat(carDetails.fuel, '&engineSize=')\r\n\t\t\t\t\t\t\t.concat(carDetails.engine);\r\n\t\t\t\t\t\tawait insuranceGroupCalculator.handleOptionSelected(\r\n\t\t\t\t\t\t\tselectedVal,\r\n\t\t\t\t\t\t\tquestion,\r\n\t\t\t\t\t\t\t'weights',\r\n\t\t\t\t\t\t\tbuildQueryParams(engineParams),\r\n\t\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t\tfalse\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase 'trim':\r\n\t\t\t\t\t\tif (selectedVal === 'Standard Trim') {\r\n\t\t\t\t\t\t\tselectedVal = null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst foundVehicle = vehicles.find(\r\n\t\t\t\t\t\t\tvehicle => vehicle.ThatchamVehicle.TrimLevelName === selectedVal\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tif (foundVehicle)\r\n\t\t\t\t\t\t\tcarDetails.insuranceGroup = foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t\t\t\t\t? foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t\t\t\t\t: foundVehicle.ThatchamVehicle.Gr20Actual;\r\n\r\n\t\t\t\t\t\tif (!carDetails.insuranceGroup) {\r\n\t\t\t\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t} else if (/^\\D*$/.test(carDetails.insuranceGroup)) {\r\n\t\t\t\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsuranceGroupCalculator.fillInResultsUi();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinsuranceGroupCalculator.handleAllCarDetailsFound();\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error('Error handling select change:', error);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thandleAllCarDetailsFound: async function () {\r\n\t\t\tconst propertiesToCheck = ['make', 'model', 'doors', 'fuel', 'year', 'engine', 'transmission'];\r\n\t\t\tconst allDetailsPresent = propertiesToCheck.every(prop => carDetails[prop] !== '');\r\n\r\n\t\t\tif (!allDetailsPresent) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvehicles = await fetchVehicleDetails(\r\n\t\t\t\t'search-vehicles-with-doors',\r\n\t\t\t\t`vehicleType=0&make=${encodeURIComponent(carDetails.make)}&model=${encodeURIComponent(carDetails.model)}&doors=${carDetails.doors}&fuelType=${encodeURIComponent(carDetails.fuel)}&year=${carDetails.year}&engineSize=${carDetails.engine}&grossWeight=${carDetails.weight}&transmission=${encodeURIComponent(carDetails.transmission)}`\r\n\t\t\t);\r\n\r\n\t\t\tif (!vehicles.length) {\r\n\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (vehicles.length > 1) {\r\n\t\t\t\tinsuranceGroupCalculator.populateTrims();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// At this point, there's exactly one vehicle in the list.\r\n\t\t\tfoundVehicle = vehicles[0];\r\n\t\t\tconst insuranceGroup = foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t? foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t: foundVehicle.ThatchamVehicle.Gr20Actual;\r\n\r\n\t\t\tif (!insuranceGroup || /^\\D*$/.test(insuranceGroup)) {\r\n\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Set insurance group and update UI.\r\n\t\t\tcarDetails.insuranceGroup = insuranceGroup;\r\n\t\t\tinsuranceGroupCalculator.fillInResultsUi();\r\n\t\t},\r\n\r\n\t\tpopulateTrims: function () {\r\n\t\t\tif (vehicles.length === 0) return;\r\n\t\t\tconst trims = vehicles.map(vehicle =>\r\n\t\t\t\tvehicle.ThatchamVehicle.TrimLevelName ? vehicle.ThatchamVehicle.TrimLevelName : 'Standard Trim'\r\n\t\t\t);\r\n\t\t\tif (trims.length === 1) {\r\n\t\t\t\tfoundVehicle = vehicles[0];\r\n\t\t\t\tif (foundVehicle)\r\n\t\t\t\t\tcarDetails.insuranceGroup = foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t\t\t? foundVehicle.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t\t\t: foundVehicle.ThatchamVehicle.Gr20Actual;\r\n\t\t\t\tif (!carDetails.insuranceGroup || /^\\D*$/.test(carDetails.insuranceGroup)) {\r\n\t\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinsuranceGroupCalculator.fillInResultsUi();\r\n\t\t\t\t}\r\n\t\t\t} else if (trims.length > 1) {\r\n\t\t\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\t\t\tinsuranceGroupCalculator.populateOptions(trims, 'trim', 'trimOption', 'trim_controls');\r\n\t\t\t\tdocument.getElementById('trim-question').classList.remove('display-none');\r\n\t\t\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error('NO TRIMS FOUND');\r\n\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thandleRadioChange: async function (event) {\r\n\t\t\tlet res;\r\n\t\t\tconst questionAnswered = event.target.dataset.question;\r\n\r\n\t\t\tif (answeredQuestions.includes(questionAnswered)) {\r\n\t\t\t\tconst fieldsetParent = event.target.closest('fieldset');\r\n\t\t\t\tconst fieldsetsToReset = getAllFollowingFieldsetSiblings(fieldsetParent);\r\n\r\n\t\t\t\t// Reset carDetails properties for everything AFTER changed question in answerQuestions[]\r\n\t\t\t\tinsuranceGroupCalculator.updateCarDetails(questionAnswered);\r\n\r\n\t\t\t\t// Reset html for every fieldset in fieldsetsToReset\r\n\t\t\t\tresetFieldsets(fieldsetsToReset);\r\n\t\t\t} else {\r\n\t\t\t\tif (questionAnswered) answeredQuestions.push(questionAnswered);\r\n\t\t\t}\r\n\r\n\t\t\tswitch (questionAnswered) {\r\n\t\t\t\tcase 'transmissions':\r\n\t\t\t\t\tcarDetails.transmission = event.target.value;\r\n\t\t\t\t\tres = await fetchVehicleDetails(\r\n\t\t\t\t\t\t'fuel',\r\n\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}`\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tawait insuranceGroupCalculator.populateRadios('fuel', res);\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'fuel':\r\n\t\t\t\t\tcarDetails.fuel = event.target.value;\r\n\t\t\t\t\tres = await fetchVehicleDetails(\r\n\t\t\t\t\t\t'engine',\r\n\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}&fuelType=${carDetails.fuel}`\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif (res.length === 1) {\r\n\t\t\t\t\t\tcarDetails.engine = res[0];\r\n\t\t\t\t\t\tif (!answeredQuestions.includes('engine')) answeredQuestions.push('engine');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tinsuranceGroupCalculator.populateOptions(res, 'engine', 'engineOption', 'engine_controls');\r\n\t\t\t\t\t\tdocument.getElementById('engine-question').classList.remove('display-none');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tinsuranceGroupCalculator.handleAllCarDetailsFound();\r\n\t\t},\r\n\r\n\t\ttoggleForms: function () {\r\n\t\t\tconst formToShow = document.querySelector('form.display-none');\r\n\t\t\tconst formToHide = document.querySelector('form:not(form.display-none)');\r\n\t\t\tif (formToShow) formToShow.classList.remove('display-none');\r\n\t\t\tif (formToHide) formToHide.classList.add('display-none');\r\n\t\t},\r\n\r\n\t\thandleFindGroupButtonClick: async function (event) {\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\tlet res;\r\n\r\n\t\t\tinsuranceGroupCalculator.toggleButtonIsLoading();\r\n\r\n\t\t\tcarDetails.registration = regNumberField.value.replace(/\\s+/g, '');\r\n\r\n\t\t\tif (carDetails.registration === '') {\r\n\t\t\t\tinsuranceGroupCalculator.addErrorMessage();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst userRegLength = carDetails.registration.replaceAll(' ', '').length;\r\n\t\t\tif (userRegLength > 7 || userRegLength < 2) {\r\n\t\t\t\tinsuranceGroupCalculator.addErrorMessage();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tinsuranceGroupCalculator.removeErrorClass();\r\n\r\n\t\t\tres = await fetchVehicleDetails('registration', `registrationNumber=${carDetails.registration}`);\r\n\r\n\t\t\tif (res.length === 0 || !res.ThatchamVehicle) {\r\n\t\t\t\tinsuranceGroupCalculator.addErrorMessage();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tinsuranceGroupCalculator.fillInCarDetailsFromReg(res);\r\n\t\t\tinsuranceGroupCalculator.fillInResultsUi(true);\r\n\r\n\t\t\tinsuranceGroupCalculator.toggleButtonIsLoading();\r\n\t\t},\r\n\r\n\t\thandleToggleFormButtonClick: function (e) {\r\n\t\t\te.preventDefault();\r\n\t\t\tinsuranceGroupCalculator.resetUi();\r\n\t\t\tconst buttonClicked = e.target;\r\n\t\t\tinsuranceGroupCalculator.toggleForms();\r\n\t\t\tif (\r\n\t\t\t\tbuttonClicked.classList.contains('back-to-reg') ||\r\n\t\t\t\tbuttonClicked.parentElement.classList.contains('back-to-reg')\r\n\t\t\t) {\r\n\t\t\t\tcalcResults.classList.add('display-none');\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Assigns all the DOM elements where car details where get added to the UI. Assigns them to an object.\r\n\t\tgetCarUiDetails: function () {\r\n\t\t\tconst fields = ['reg', 'make', 'model', 'fuel', 'year', 'engine', 'insGroup'];\r\n\t\t\tfields.forEach(field => {\r\n\t\t\t\tcarUiDetails[`${field}Ui`] = document.getElementById(`car-${field}`);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tfillInCarDetailsFromReg: function (res) {\r\n\t\t\tif (res.ThatchamVehicle.ManufacturerBrandName) carDetails.make = res.ThatchamVehicle.ManufacturerBrandName;\r\n\t\t\tif (res.ThatchamVehicle.ABIDescription) carDetails.model = res.ThatchamVehicle.ABIDescription;\r\n\t\t\tif (res.ThatchamVehicle.PrimaryFuelTypeName) carDetails.fuel = res.ThatchamVehicle.PrimaryFuelTypeName;\r\n\t\t\tif (res.ThatchamVehicle.CubicCapacity) carDetails.engine = res.ThatchamVehicle.CubicCapacity;\r\n\t\t\tif (res.ThatchamVehicle.RegistrationYear) carDetails.year = res.CarWebVehicle.RegistrationYear;\r\n\t\t\tcarDetails.insuranceGroup = res.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t? res.ThatchamVehicle.Gr50Actual\r\n\t\t\t\t: res.ThatchamVehicle.Gr20Actual;\r\n\t\t},\r\n\r\n\t\tgetInsuranceText: function (groupNumber) {\r\n\t\t\tlet textToReturn;\r\n\t\t\tif (groupNumber >= 1 && groupNumber <= 10) {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"1-10\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t} else if (groupNumber >= 11 && groupNumber <= 20) {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"11-20\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t} else if (groupNumber >= 21 && groupNumber <= 30) {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"21-30\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t} else if (groupNumber >= 31 && groupNumber <= 40) {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"31-40\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t} else if (groupNumber >= 41 && groupNumber <= 50) {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"41-50\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t} else {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"NA\"]').dataset\r\n\t\t\t\t\t.insuranceGroupValue;\r\n\t\t\t}\r\n\t\t\treturn textToReturn;\r\n\t\t},\r\n\r\n\t\tfillInResultsUi: function (isFromReg = false) {\r\n\t\t\tconst fuelMapper = {\r\n\t\t\t\t1: 'Petrol',\r\n\t\t\t\t2: 'Diesel',\r\n\t\t\t\t3: 'Electric',\r\n\t\t\t\t4: 'Biofuel',\r\n\t\t\t\t5: 'Hydrogen',\r\n\t\t\t\t6: 'CNG',\r\n\t\t\t\t7: 'Unknown',\r\n\t\t\t};\r\n\t\t\tconst registration = carDetails.registration.toUpperCase();\r\n\t\t\tconst make = capitaliseFirstLetter(carDetails.make);\r\n\t\t\tconst model = capitaliseFirstLetter(carDetails.model);\r\n\t\t\tconst fuel = isFromReg ? carDetails.fuel : fuelMapper[carDetails.fuel];\r\n\t\t\tconst year = carDetails.year;\r\n\t\t\tconst engine = carDetails.engine;\r\n\t\t\tif (carDetails.registration && registration !== '') carUiDetails.regUi.textContent = `${registration},`;\r\n\t\t\tif (carDetails.make && make !== '') carUiDetails.makeUi.textContent = `${make},`;\r\n\t\t\tif (carDetails.model && model !== '') carUiDetails.modelUi.textContent = `${model},`;\r\n\t\t\tif (carDetails.fuel && fuel !== '' && fuel !== 'Unknown') carUiDetails.fuelUi.textContent = `${fuel},`;\r\n\t\t\tif (carDetails.year && year !== '') carUiDetails.yearUi.textContent = `${year},`;\r\n\t\t\tif (carDetails.engine && engine !== '') carUiDetails.engineUi.textContent = `${engine}`;\r\n\t\t\tif (carDetails.insuranceGroup && !/^\\D*$/.test(carDetails.insuranceGroup)) {\r\n\t\t\t\tconst insuranceGroupUi = carDetails.insuranceGroup.replace(/[^0-9]/g, '');\r\n\t\t\t\tcarUiDetails.insGroupUi.textContent = `${insuranceGroupUi}/`;\r\n\r\n\t\t\t\t// Add text to page\r\n\t\t\t\tinsuranceText.textContent = insuranceGroupCalculator.getInsuranceText(insuranceGroupUi);\r\n\r\n\t\t\t\tconst forms = document.querySelectorAll('.mod-insurance-group-calc form');\r\n\t\t\t\tif (forms) {\r\n\t\t\t\t\tforms.forEach(form => {\r\n\t\t\t\t\t\tform.classList.add('display-none');\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tconst results = document.querySelector('.mod-insurance-group-calc .calc-results');\r\n\t\t\t\tif (results) results.classList.remove('display-none');\r\n\t\t\t} else {\r\n\t\t\t\tnoDataError.style.display = 'block';\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thandleMakeSelected: async function (make) {\r\n\t\t\tif (answeredQuestions.includes('make')) {\r\n\t\t\t\tconst fieldset = document.querySelector('#manual-lookup-form > fieldset');\r\n\t\t\t\tconst fieldsetsToReset = getAllFollowingFieldsetSiblings(fieldset);\r\n\t\t\t\tresetFieldsets(fieldsetsToReset);\r\n\t\t\t\tinsuranceGroupCalculator.updateCarDetails('make');\r\n\t\t\t} else {\r\n\t\t\t\tansweredQuestions.push('make');\r\n\t\t\t}\r\n\r\n\t\t\tautocompleteUl.classList.add('display-none');\r\n\t\t\tdocument.getElementById('make').value = make;\r\n\r\n\t\t\tconst res = await fetchVehicleDetails('models', `vehicleType=0&make=${carDetails.make}`);\r\n\r\n\t\t\tinsuranceGroupCalculator.populateOptions(res, 'model', 'modelOption', 'model_controls');\r\n\t\t\tdocument.getElementById('model-question').classList.remove('display-none');\r\n\t\t},\r\n\r\n\t\tpopulateOptions: function (options, nextQuestion, optionId, nextQuestionId) {\r\n\t\t\tconst fragment = document.createDocumentFragment();\r\n\r\n\t\t\toptions.sort();\r\n\r\n\t\t\toptions = options.filter((item, index, self) => self.indexOf(item) === index);\r\n\r\n\t\t\toptions.forEach((option, index) => {\r\n\t\t\t\tconst opt = document.createElement('option');\r\n\t\t\t\topt.setAttribute('data-question', nextQuestion);\r\n\t\t\t\topt.setAttribute('id', `${optionId}-${index}`);\r\n\t\t\t\topt.setAttribute('value', option);\r\n\t\t\t\topt.textContent = option;\r\n\r\n\t\t\t\tfragment.appendChild(opt);\r\n\t\t\t});\r\n\r\n\t\t\tdocument.getElementById(nextQuestionId).appendChild(fragment);\r\n\t\t},\r\n\r\n\t\thandleOptionSelected: async function (\r\n\t\t\tvalue,\r\n\t\t\toption,\r\n\t\t\tnextApiMethod,\r\n\t\t\tapiParams,\r\n\t\t\tnextQuestion,\r\n\t\t\thandleNextQuestion = true\r\n\t\t) {\r\n\t\t\t// Add question to answeredQuestions\r\n\t\t\tif (!answeredQuestions.includes(option)) {\r\n\t\t\t\tif (option) answeredQuestions.push(option);\r\n\t\t\t}\r\n\r\n\t\t\tcarDetails[option] = value;\r\n\t\t\tconst res = await fetchVehicleDetails(nextApiMethod, apiParams);\r\n\r\n\t\t\tif (handleNextQuestion) {\r\n\t\t\t\t// If response only has 1 option then we do not need to ask user the question, move onto the next question.\r\n\t\t\t\tif (res.length === 1) {\r\n\t\t\t\t\tswitch (option) {\r\n\t\t\t\t\t\tcase 'year':\r\n\t\t\t\t\t\t\tcarDetails.doors = res[0];\r\n\t\t\t\t\t\t\tif (!answeredQuestions.includes('doors')) answeredQuestions.push('doors');\r\n\t\t\t\t\t\t\tawait insuranceGroupCalculator.populateRadios('transmissions');\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'model':\r\n\t\t\t\t\t\t\tawait insuranceGroupCalculator.handleOptionSelected(\r\n\t\t\t\t\t\t\t\tres[0],\r\n\t\t\t\t\t\t\t\t'year',\r\n\t\t\t\t\t\t\t\t'doors',\r\n\t\t\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&manufactureYear=${res[0]}`,\r\n\t\t\t\t\t\t\t\t'doors'\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinsuranceGroupCalculator.populateOptions(\r\n\t\t\t\t\t\tres,\r\n\t\t\t\t\t\tnextQuestion,\r\n\t\t\t\t\t\t`${option}Option`,\r\n\t\t\t\t\t\t`${nextQuestion}_controls`\r\n\t\t\t\t\t);\r\n\t\t\t\t\tdocument.getElementById(`${nextQuestion}-question`).classList.remove('display-none');\r\n\t\t\t\t}\r\n\t\t\t} else if (!handleNextQuestion) {\r\n\t\t\t\tif (res.length) {\r\n\t\t\t\t\tcarDetails.weight = res[0];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tpopulateRadios: async function (radiosToPopulate, data = null) {\r\n\t\t\tlet res;\r\n\t\t\tlet htmlString;\r\n\r\n\t\t\tswitch (radiosToPopulate) {\r\n\t\t\t\tcase 'transmissions':\r\n\t\t\t\t\tlet transmissionFieldset;\r\n\r\n\t\t\t\t\tres = await fetchVehicleDetails(\r\n\t\t\t\t\t\t'transmissions',\r\n\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}`\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif (res.length === 1) {\r\n\t\t\t\t\t\tcarDetails.transmission = res[0];\r\n\t\t\t\t\t\tif (!answeredQuestions.includes('transmissions')) answeredQuestions.push('transmissions');\r\n\t\t\t\t\t\tres = await fetchVehicleDetails(\r\n\t\t\t\t\t\t\t'fuel',\r\n\t\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}`\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tawait insuranceGroupCalculator.populateRadios('fuel', res);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttransmissionFieldset = document.getElementById('transmissions-question');\r\n\t\t\t\t\t\tconst legendText = transmissionFieldset.querySelector('legend').textContent;\r\n\t\t\t\t\t\thtmlString = `${legendText ? legendText : 'Transmission type'}`;\r\n\r\n\t\t\t\t\t\tres.forEach(transmission => {\r\n\t\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t\t\tAPI returns 1,2 or 3 for transmission types. 1 = manual, 2 = automatic, 3 = unknown\r\n\t\t\t\t\t\t\t*/\r\n\t\t\t\t\t\t\tif (transmission === 3) return;\r\n\t\t\t\t\t\t\thtmlString += `\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t`;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\ttransmissionFieldset.innerHTML = htmlString;\r\n\t\t\t\t\t\ttransmissionFieldset.classList.remove('display-none');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'fuel':\r\n\t\t\t\t\tif (data.length === 1) {\r\n\t\t\t\t\t\tcarDetails.fuel = data[0];\r\n\t\t\t\t\t\tif (!answeredQuestions.includes('fuel')) answeredQuestions.push('fuel');\r\n\t\t\t\t\t\tres = await fetchVehicleDetails(\r\n\t\t\t\t\t\t\t'engine',\r\n\t\t\t\t\t\t\t`vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}&fuelType=${carDetails.fuel}`\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\tif (res.length === 1) {\r\n\t\t\t\t\t\t\tcarDetails.engine = res[0];\r\n\t\t\t\t\t\t\tif (!answeredQuestions.includes('engine')) answeredQuestions.push('engine');\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsuranceGroupCalculator.populateOptions(res, 'engine', 'engineOption', 'engine_controls');\r\n\t\t\t\t\t\t\tdocument.getElementById('engine-question').classList.remove('display-none');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconst fuelFieldset = document.getElementById('fuel-question');\r\n\t\t\t\t\t\tconst legendText = fuelFieldset.querySelector('legend').textContent;\r\n\t\t\t\t\t\thtmlString = `${legendText ? legendText : 'Fuel type'}`;\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t\tVehicle fuel type (petrol = 1, diesel = 2, electric = 3, biofuel = 4, hydrogen = 5, CNG = 6, unknown = 7)\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tconst fuelMapper = {\r\n\t\t\t\t\t\t\t1: 'Petrol',\r\n\t\t\t\t\t\t\t2: 'Diesel',\r\n\t\t\t\t\t\t\t3: 'Electric',\r\n\t\t\t\t\t\t\t4: 'Biofuel',\r\n\t\t\t\t\t\t\t5: 'Hydrogen',\r\n\t\t\t\t\t\t\t6: 'CNG',\r\n\t\t\t\t\t\t\t7: 'Unknown',\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tdata.forEach(fuelType => {\r\n\t\t\t\t\t\t\tif (fuelType === 7) return;\r\n\t\t\t\t\t\t\thtmlString += `\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t`;\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tfuelFieldset.innerHTML = htmlString;\r\n\t\t\t\t\t\tfuelFieldset.classList.remove('display-none');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttoggleButtonIsLoading: function () {\r\n\t\t\tif (!findGroupByRegButton) return;\r\n\t\t\tif (findGroupByRegButton.classList.contains('btn--loading')) {\r\n\t\t\t\tfindGroupByRegButton.classList.remove('btn--loading');\r\n\t\t\t} else {\r\n\t\t\t\tfindGroupByRegButton.classList.add('btn--loading');\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttoggleLoadingSpinner: function (apiMethod) {\r\n\t\t\t// Spinner is in the button if using registration\r\n\t\t\tif (apiMethod === 'registration' || apiMethod === 'weights') return;\r\n\r\n\t\t\tif (loadingSpinner.classList.contains('display-none')) {\r\n\t\t\t\tloadingSpinner.classList.remove('display-none');\r\n\t\t\t\tloadingSpinner.setAttribute('aria-hidden', 'false');\r\n\t\t\t} else {\r\n\t\t\t\tloadingSpinner.classList.add('display-none');\r\n\t\t\t\tloadingSpinner.setAttribute('aria-hidden', 'true');\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\taddErrorMessage() {\r\n\t\t\tinsuranceGroupCalculator.toggleButtonIsLoading();\r\n\t\t\tregNumberField.parentElement.classList.add('error');\r\n\t\t\tregNumberField.setAttribute('aria-invalid', 'true');\r\n\t\t\tregistrationNumberError.style.display = 'block';\r\n\t\t},\r\n\r\n\t\tremoveErrorClass: function () {\r\n\t\t\tconst parent = regNumberField.parentElement;\r\n\t\t\tregistrationNumberError.style.display = 'none';\r\n\t\t\tregNumberField.removeAttribute('aria-invalid');\r\n\t\t\tparent.classList.remove('error');\r\n\t\t},\r\n\r\n\t\tupdateCarDetails: function (questionAnswered) {\r\n\t\t\tconst questionIndex = answeredQuestions.indexOf(questionAnswered);\r\n\r\n\t\t\tconst elementsAfterQuestion = answeredQuestions.slice(questionIndex + 1);\r\n\r\n\t\t\tif (elementsAfterQuestion.length > 0) {\r\n\t\t\t\tansweredQuestions.splice(questionIndex + 1);\r\n\r\n\t\t\t\telementsAfterQuestion.forEach(question => {\r\n\t\t\t\t\tif (carDetails[question]) {\r\n\t\t\t\t\t\tif (question === 'weight') {\r\n\t\t\t\t\t\t\tcarDetails[question] = 0;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tcarDetails[question] = '';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tresetUi: function () {\r\n\t\t\t// Set carDetails back to it's initial empty state\r\n\t\t\tcarDetails = { ...initialCarDetails };\r\n\t\t\t// Reset reg input\r\n\t\t\tregNumberField.value = '';\r\n\t\t\t// Reset all DOM elements that show car details\r\n\t\t\tconst fields = ['reg', 'make', 'model', 'fuel', 'year', 'engine', 'insGroup'];\r\n\t\t\tfields.forEach(field => {\r\n\t\t\t\tcarUiDetails[`${field}Ui`].textContent = '';\r\n\t\t\t});\r\n\t\t\t// Reset make field\r\n\t\t\tdocument.getElementById('make').value = '';\r\n\t\t\t// Reset all select elements\r\n\t\t\tconst selects = ['model_controls', 'year_controls', 'doors_controls', 'engine_controls', 'trim_controls'];\r\n\t\t\tselects.forEach(select => {\r\n\t\t\t\tconst selectElement = document.getElementById(select);\r\n\t\t\t\tconst enabledOptions = selectElement.querySelectorAll('option:enabled');\r\n\t\t\t\tenabledOptions.forEach(function (option) {\r\n\t\t\t\t\toption.remove();\r\n\t\t\t\t});\r\n\t\t\t\tselectElement.selectedIndex = 0;\r\n\t\t\t});\r\n\t\t\t// Reset all radio elements\r\n\t\t\tconst radios = ['transmissions-question', 'fuel-question'];\r\n\t\t\tradios.forEach(radio => {\r\n\t\t\t\tconst question = document.getElementById(radio);\r\n\t\t\t\tconst allRadios = question.querySelectorAll('input-shell');\r\n\t\t\t\tallRadios.forEach(radio => radio.remove());\r\n\t\t\t});\r\n\t\t\t// Add display none to all sub questions\r\n\t\t\tdocument\r\n\t\t\t\t.querySelectorAll('.mod-insurance-group-calc .mod-subsection fieldset')\r\n\t\t\t\t.forEach(fieldset => fieldset.classList.add('display-none'));\r\n\t\t\t// Remove reg error message\r\n\t\t\tinsuranceGroupCalculator.removeErrorClass();\r\n\t\t\t// Remove any other errors\r\n\t\t\tnoDataError.style.display = 'none';\r\n\t\t},\r\n\t};\r\n\r\n\treturn {\r\n\t\tinit: init,\r\n\t\ttoggleButtonIsLoading: insuranceGroupCalculator.toggleButtonIsLoading,\r\n\t\ttoggleLoadingSpinner: insuranceGroupCalculator.toggleLoadingSpinner,\r\n\t};\r\n})();\r\n\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n\tcnfsd_insurance_group_calc.init();\r\n});\r\n"]}