{"version":3,"file":"insurance-group-calculator.min.js","names":["cnfsd_insurance_group_calc","apiUrl","apiSubKey","apiRetryCount","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","response","fetch","method","headers","ok","style","display","json","console","error","status","Error","statusText","toggleButtonIsLoading","parentElement","classList","add","setAttribute","getAllFollowingFieldsetSiblings","element","siblings","currentElement","hasAttribute","document","querySelectorAll","nextElementSibling","nodeName","contains","push","resetFieldsets","fieldsetsToReset","forEach","fieldset","fieldsetSelect","querySelector","option","remove","selectedIndex","radio","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","makesDataLocal","dataName","dataString","localStorage","getItem","JSON","parse","getFromLocalStorage","res","data","stringify","setItem","e","storeInLocalStorage","populateAutoFillOptions","makes","warn","fragment","createDocumentFragment","index","li","createElement","className","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","test","fillInResultsUi","handleAllCarDetailsFound","every","prop","encodeURIComponent","populateTrims","trims","map","populateOptions","questionAnswered","toggleForms","formToShow","formToHide","replace","fillInCarDetailsFromReg","resetUi","buttonClicked","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\r\n\t// API setup vars\r\n\tlet apiUrl;\r\n\tlet apiSubKey;\r\n\tlet apiRetryCount = 0;\r\n\tconst maxRetries = 2;\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\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\t\t\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\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\t\r\n\t// HELPER METHOD:: Calls an API endpoint. Takes in the API method to call and the parameters for that method. \r\n\t// This also adds logic to try the endpoint another 2 times if the first fails.\r\n\tasync function fetchVehicleDetails(apiMethod, apiParams) {\r\n\r\n // Checks for empty params on reg input\r\n const parts = apiParams.split('=');\r\n const params = parts[1];\r\n if (params == '' && apiMethod == 'registration') return []\r\n\r\n\t\tconst endpoint = `${apiUrl}/${apiMethod}?${new URLSearchParams(apiParams).toString()}`;\r\n\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\ttry {\r\n\t\t\tlet response;\r\n\t \r\n\t\t \twhile (apiRetryCount < maxRetries) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (apiSubKey !== \"\") {\r\n\t\t\t\t\t\tresponse = await fetch(endpoint, {\r\n\t\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t\t\t'Ocp-Apim-Subscription-Key': apiSubKey\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tresponse = await fetch(endpoint);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (response.ok) {\r\n\t\t\t\t\t\tif (noDataError.style.display === \"block\") noDataError.style.display = \"none\";\r\n\t\t\t\t\t\tapiRetryCount = 0;\r\n\t\t\t\t\t\tinsuranceGroupCalculator.toggleLoadingSpinner();\r\n\t\t\t\t\t\treturn response.json();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconsole.error(`Request failed with status: ${response.status}, retrying (${apiRetryCount + 1}/${maxRetries})...`);\r\n\t\t\t\t\t\tapiRetryCount++;\r\n\t\t\t\t\t\tif (apiRetryCount >= maxRetries) {\r\n apiRetryCount = 0;\r\n\t\t\t\t\t\t\tthrow new Error(`HTTP error after ${maxRetries} attempts: ${response.statusText}, URL: ${endpoint}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error(`Request failed with error: ${error}, retrying (${apiRetryCount + 1}/${maxRetries})...`);\r\n\t\t\t\t\tapiRetryCount++;\r\n\r\n\t\t\t\t\tnoDataError.style.display = \"block\";\r\n\t\t\t\r\n\t\t\t\t\tif (apiRetryCount >= maxRetries) {\r\n apiRetryCount = 0;\r\n\t\t\t\t\t\tthrow new Error(`HTTP error after ${maxRetries} attempts: ${error}, URL: ${endpoint}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t \r\n\t\t\t// If the code reaches this point without a successful response, throw an error\r\n\t\t\tthrow new Error(`HTTP error! Status: ${response && response.status}, URL: ${endpoint}`);\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.toggleButtonIsLoading();\r\n\t\t\t\tregNumberField.parentElement.classList.add(\"error\");\r\n\t\t\t\tregNumberField.setAttribute(\"aria-invalid\", \"true\");\r\n\t\t\t\tregistrationNumberError.style.display = \"block\";\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\t\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\t\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 const dataString = localStorage.getItem(dataName);\r\n\t\t if (dataString) {\r\n\t\t\treturn JSON.parse(dataString);\r\n\t\t } else {\r\n\t\t\treturn null;\r\n\t\t }\r\n\t\t} catch (error) {\r\n\t\t console.error('Failed to retrieve data from localStorage:', error);\r\n\t\t return 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\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\t\t\t\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\t\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\t\t\t\t\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\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\t\t\t\t\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\t \r\n\t// MAIN WIDGET FUNCTIONALITY\r\n\tconst insuranceGroupCalculator = {\r\n\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\t\t \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 button.addEventListener('click', insuranceGroupCalculator.handleToggleFormButtonClick);\r\n\t\t\t if (button.classList.contains(\"makeandmodel\")) {\r\n\t\t\t\t button.addEventListener(\"click\", insuranceGroupCalculator.getVehicleMakes);\r\n\t\t\t }\r\n\t\t\t});\r\n\t\t},\r\n\t\t \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\t\t \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\t\t \r\n\t\t\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 selectElement.addEventListener(\"change\", insuranceGroupCalculator.handleSelectChange);\r\n\t\t\t});\r\n\t\t \r\n\t\t\tconst form = document.getElementById(\"manual-lookup-form\");\r\n\t\t\tif (form) {\r\n\t\t\t form.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});\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\t\t\t\r\n\t\t\tinsuranceGroupCalculator.populateAutoFillOptions(res);\r\n\t\t\t\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\r\n\t\t\tif (!autocompleteUlIsEmpty) return;\r\n\r\n\t\t\tif (!autocompleteUl) {\r\n\t\t\t console.warn('Autocomplete list not found.');\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \r\n\t\t\tconst fragment = document.createDocumentFragment();\r\n\t\t \r\n\t\t\tmakes.forEach((make, index) => {\r\n\t\t\t const li = document.createElement('li');\r\n\t\t\t li.className = \"autocomplete__option display-none\";\r\n\t\t\t li.setAttribute('aria-selected', 'false');\r\n\t\t\t li.setAttribute('id', `autoCompleteOption-${index}`);\r\n\t\t\t li.setAttribute('role', 'option');\r\n\t\t\t li.tabIndex = -1;\r\n\t\t\t li.dataset.make = make;\r\n\t\t\t li.textContent = make;\r\n\t\t \r\n\t\t\t fragment.appendChild(li);\r\n\t\t\t});\r\n\t\t \r\n\t\t\twhile (autocompleteUl.firstChild) {\r\n\t\t\t autocompleteUl.removeChild(autocompleteUl.firstChild);\r\n\t\t\t}\r\n\t\t\r\n\t\t\tautocompleteUl.appendChild(fragment);\r\n\t\t \r\n\t\t\tinsuranceGroupCalculator.addFilterToInput();\r\n\r\n\t\t\tautocompleteUlIsEmpty = false;\r\n\t\t},\t\t\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 \r\n\t\t\tif (!makeInput || !autocompleteUl) {\r\n\t\t\t console.warn('Autocomplete input or list not found.');\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \r\n\t\t\tmakeInput.addEventListener('input', function() {\r\n\t\t\t const query = makeInput.value.toLowerCase();\r\n\t\t\t const options = document.querySelectorAll('.autocomplete__option');\r\n\t\t \r\n\t\t\t if (query.length < 2) {\r\n\t\t\t\tautocompleteUl.classList.add(\"display-none\");\r\n\t\t\t\treturn;\r\n\t\t\t } else {\r\n\t\t\t\tautocompleteUl.classList.remove(\"display-none\");\r\n\t\t\t }\r\n\t\t \r\n\t\t\t options.forEach(option => {\r\n\t\t\t\tconst text = option.textContent.toLowerCase();\r\n\t\t\t\tif (text.startsWith(query)) {\r\n\t\t\t\t const matchStart = text.indexOf(query);\r\n\t\t\t\t const matchEnd = matchStart + query.length;\r\n\t\t\t\t const highlightedString = `${option.textContent.slice(0, matchStart)}${option.textContent.slice(matchStart, matchEnd)}${option.textContent.slice(matchEnd)}`;\r\n\t\t\t\t option.innerHTML = highlightedString;\r\n\t\t\t\t option.classList.remove(\"display-none\");\r\n\t\t\t\t option.tabIndex = \"0\";\r\n\t\t\t\t} else {\r\n\t\t\t\t option.innerHTML = option.textContent;\r\n\t\t\t\t option.classList.add(\"display-none\");\r\n\t\t\t\t option.tabIndex = \"-1\";\r\n\t\t\t\t}\r\n\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\t\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\t \r\n\t\t\tconst buildQueryParams = additionalParams => \"\".concat(paramsBase, \"&\").concat(additionalParams);\r\n\t \r\n\t\t\ttry {\r\n\t\t\t switch (question) {\r\n\t\t\t\tcase \"model\":\r\n\t\t\t\t carDetails.model = selectedVal;\r\n\t\t\t\t paramsBase = \"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\t \r\n\t\t\t\t await insuranceGroupCalculator.handleOptionSelected(selectedVal, question, \"years\", buildQueryParams(\"\"), \"year\");\r\n\t\t\t\t break;\r\n\t \r\n\t\t\t\tcase \"year\":\r\n\t\t\t\t carDetails.year = selectedVal;\r\n\t\t\t\t await insuranceGroupCalculator.handleOptionSelected(selectedVal, question, \"doors\", buildQueryParams(\"manufactureYear=\".concat(carDetails.year)), \"doors\");\r\n\t\t\t\t break;\r\n\t \r\n\t\t\t\tcase \"doors\":\r\n\t\t\t\t carDetails.doors = selectedVal;\r\n\t\t\t\t await insuranceGroupCalculator.populateRadios(\"transmissions\");\r\n\t\t\t\t break;\r\n\t \r\n\t\t\t\tcase \"engine\":\r\n\t\t\t\t carDetails.engine = selectedVal;\r\n\t\t\t\t const engineParams = \"year=\".concat(carDetails.year, \"&transmission=\").concat(carDetails.transmission, \"&fuelType=\").concat(carDetails.fuel, \"&engineSize=\").concat(carDetails.engine);\r\n\t\t\t\t await insuranceGroupCalculator.handleOptionSelected(selectedVal, question, \"weights\", buildQueryParams(engineParams), \"\", false);\r\n\t\t\t\t break;\r\n\t \r\n\t\t\t\tcase \"trim\":\r\n\t\t\t\t if (selectedVal === \"Standard Trim\") {\r\n\t\t\t\t\tselectedVal = null;\r\n\t\t\t\t }\r\n\t \r\n\t\t\t\t const foundVehicle = vehicles.find(vehicle => vehicle.ThatchamVehicle.TrimLevelName === selectedVal);\r\n\t\t\t\t if (foundVehicle) carDetails.insuranceGroup = foundVehicle.ThatchamVehicle.Gr50Actual ? foundVehicle.ThatchamVehicle.Gr50Actual : foundVehicle.ThatchamVehicle.Gr20Actual;\r\n\t \r\n\t\t\t\t if (!carDetails.insuranceGroup) {\r\n\t\t\t\t\tnoDataError.style.display = \"block\";\r\n\t\t\t\t\treturn;\r\n\t\t\t\t } else if (/^\\D*$/.test(carDetails.insuranceGroup)) {\r\n\t\t\t\t\tnoDataError.style.display = \"block\";\r\n\t\t\t\t\treturn;\r\n\t\t\t\t } else {\r\n\t\t\t\t\tinsuranceGroupCalculator.fillInResultsUi();\r\n\t\t\t\t }\r\n\t \r\n\t\t\t\t break;\r\n\t \r\n\t\t\t\tdefault:\r\n\t\t\t\t return;\r\n\t\t\t }\r\n\t \r\n\t\t\t insuranceGroupCalculator.handleAllCarDetailsFound();\r\n\t\t\t} catch (error) {\r\n\t\t\t console.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\t\t \r\n\t\t\tif (!allDetailsPresent) {\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \r\n\t\t\tvehicles = await fetchVehicleDetails(\r\n\t\t\t \"search-vehicles-with-doors\",\r\n\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\t\t \r\n\t\t\tif (!vehicles.length) {\r\n\t\t\t noDataError.style.display = \"block\";\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \r\n\t\t\tif (vehicles.length > 1) {\r\n\t\t\t insuranceGroupCalculator.populateTrims();\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \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 ? foundVehicle.ThatchamVehicle.Gr50Actual : foundVehicle.ThatchamVehicle.Gr20Actual;\r\n\t\t \r\n\t\t\tif (!insuranceGroup || /^\\D*$/.test(insuranceGroup)) {\r\n\t\t\t noDataError.style.display = \"block\";\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t \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\t\t \r\n\t\tpopulateTrims: function() {\r\n\t\t\tif (vehicles.length === 0) return;\r\n\t\t\tconst trims = vehicles.map(vehicle => vehicle.ThatchamVehicle.TrimLevelName ? vehicle.ThatchamVehicle.TrimLevelName : \"Standard Trim\");\r\n\t\t\tif (trims.length === 1) {\r\n\t\t\t\tfoundVehicle = vehicles[0];\r\n\t\t\t\tif (foundVehicle) carDetails.insuranceGroup = foundVehicle.ThatchamVehicle.Gr50Actual ? foundVehicle.ThatchamVehicle.Gr50Actual : 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(\"fuel\", `vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}`);\r\n\t\t\t\t\t\r\n\t\t\t\t\tawait insuranceGroupCalculator.populateRadios(\"fuel\", res);\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\tcarDetails.fuel = event.target.value;\r\n\t\t\t\t\tres = await fetchVehicleDetails(\"engine\", `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\t\t\t\t\tif (res.length === 1) {\t\t\t\t\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\");\t\r\n\t\t\t\t\t\tdocument.getElementById(\"engine-question\").classList.remove(\"display-none\");\r\n\t\t\t\t\t}\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\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\t\t\t\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\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.toggleButtonIsLoading();\r\n\t\t\t\tregNumberField.parentElement.classList.add(\"error\");\r\n\t\t\t\tregNumberField.setAttribute(\"aria-invalid\", \"true\");\r\n\t\t\t\tregistrationNumberError.style.display = \"block\";\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tinsuranceGroupCalculator.fillInCarDetailsFromReg(res);\r\n\t\t\tinsuranceGroupCalculator.fillInResultsUi(true);\t\r\n\t\t\t\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 insuranceGroupCalculator.resetUi();\r\n\t\t\tconst buttonClicked = e.target;\r\n\t\t\tinsuranceGroupCalculator.toggleForms();\r\n\t\t\tif (buttonClicked.classList.contains(\"back-to-reg\") || buttonClicked.parentElement.classList.contains(\"back-to-reg\")) {\r\n\t\t\t\tcalcResults.classList.add(\"display-none\");\r\n\t\t\t}\r\n\t\t},\r\n\t\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\t\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 ? res.ThatchamVehicle.Gr50Actual : 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.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.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.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.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.insuranceGroupValue;\r\n\t\t\t} else {\r\n\t\t\t\ttextToReturn = document.querySelector('span[data-insurance-group-key=\"NA\"]').dataset.insuranceGroupValue;\r\n\t\t\t}\r\n\t\t\treturn textToReturn;\r\n\t\t},\r\n\t\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))) {\t\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\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\t\t\t\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\t\r\n\t\t},\r\n\r\n\t\tpopulateOptions: function(options, nextQuestion, optionId, nextQuestionId) {\r\n\t\t\t\r\n\t\t\tlet 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\tlet 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\t\t\r\n\t\t\tdocument.getElementById(nextQuestionId).appendChild(fragment);\r\n\t\t},\r\n\r\n\t\thandleOptionSelected: async function(value, option, nextApiMethod, apiParams, nextQuestion, handleNextQuestion = true) {\r\n\t\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\t\t\t\r\n\t\t\tcarDetails[option] = value;\r\n\t\t\tlet 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(res[0], \"year\", \"doors\", `vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&manufactureYear=${res[0]}`, \"doors\");\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(res, nextQuestion, `${option}Option`, `${nextQuestion}_controls`);\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(\"transmissions\", `vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}`);\r\n\t\t\t\t\t\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(\"fuel\", `vehicleType=0&make=${carDetails.make}&model=${carDetails.model}&year=${carDetails.year}&transmission=${carDetails.transmission}`);\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/*\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(\"engine\", `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\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\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\t\t\t\t\t\t\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\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\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\tlet questionIndex = answeredQuestions.indexOf(questionAnswered);\r\n\r\n\t\t\tlet elementsAfterQuestion = answeredQuestions.slice(questionIndex + 1)\r\n\r\n\t\t\tif (elementsAfterQuestion.length > 0) {\r\n\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.querySelectorAll(\".mod-insurance-group-calc .mod-subsection fieldset\").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\n\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n\tcnfsd_insurance_group_calc.init();\r\n});"]}