{"version":3,"file":"jsFiles.js","sources":["webpack://frontend/./src/vanilla/utils/index.js","webpack://frontend/./src/vanilla/utils/validate_form.js","webpack://frontend/./src/vanilla/feature/forms/validation/getElementsByClassname.js","webpack://frontend/./src/vanilla/feature/forms/validation/getInputs.js","webpack://frontend/./src/vanilla/feature/forms/validation/lockFormSubmissionUntilPassed.js","webpack://frontend/./src/vanilla/feature/forms/validation/onBlurValidateInput.js","webpack://frontend/./src/vanilla/feature/forms/validation/onFocusClearValidation.js","webpack://frontend/./src/vanilla/feature/forms/validation/addValidationToSingleForm.js","webpack://frontend/./src/vanilla/feature/forms/validation/addValidationToForms.js","webpack://frontend/./src/vanilla/feature/navigation/index.js","webpack://frontend/./src/vanilla/feature/my_account/direct-debit.js","webpack://frontend/./src/vanilla/feature/my_account/login_button.js","webpack://frontend/./src/vanilla/feature/my_account/password.js","webpack://frontend/./src/vanilla/index.js","webpack://frontend/./src/vanilla/vendor/index.js","webpack://frontend/./src/vanilla/feature/tooltip/index.js","webpack://frontend/./src/vanilla/feature/my_account/paperless.js","webpack://frontend/./src/vanilla/feature/my_account/smart-meter.js","webpack://frontend/./src/vanilla/feature/my_account/submit.js","webpack://frontend/./src/vanilla/utils/animate_svg.js","webpack://frontend/./src/vanilla/feature/accordion/index.js","webpack://frontend/./src/vanilla/feature/articles/index.js","webpack://frontend/./src/vanilla/feature/coveo/index.js","webpack://frontend/./src/vanilla/feature/dams_and_rainfall/monthly-dam-level-comparison.js","webpack://frontend/./src/vanilla/feature/dams_and_rainfall/monthly-rainfall-comparison.js","webpack://frontend/./src/vanilla/feature/forms/index.js","webpack://frontend/./src/vanilla/feature/image_gallery/index.js","webpack://frontend/./src/vanilla/feature/offers/index.js","webpack://frontend/./src/vanilla/feature/search/index.js","webpack://frontend/./src/vanilla/feature/social/index.js","webpack://frontend/./src/vanilla/feature/tabs/index.js","webpack://frontend/./src/vanilla/feature/my_account/ern.js","webpack://frontend/./src/vanilla/feature/my_account/manage-bill-delivery.js","webpack://frontend/./src/vanilla/feature/my_account/pay-bill-accounts.js","webpack://frontend/./src/vanilla/feature/my_account/payment.js","webpack://frontend/./src/vanilla/feature/my_account/registration.js"],"sourcesContent":["export { validateFormFields } from './validate_form';\r\nexport { animateSvg } from './animate_svg';\r\n\r\nexport function debounce(func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n}\r\n\r\nexport function domLoad(yourFunction) {\r\n if (document.readyState && document.readyState !== 'loading') {\r\n yourFunction();\r\n }\r\n else {\r\n document.addEventListener('DOMContentLoaded', function () {\r\n yourFunction()\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n// move to own\r\n// use with domLoad\r\nexport function maskInputs() {\r\n const numericInputs = document.querySelectorAll('input[inputmode=numeric], input[inputmode=tel]');\r\n for (const numericInput of numericInputs) {\r\n let inputmode = numericInput.getAttribute(\"inputmode\");\r\n numericInput.addEventListener('input', (event) => {\r\n const value = event.target.value;\r\n let max = (numericInput.dataset.max && Number(numericInput.dataset.max)) || 255;\r\n if (value) {\r\n // Update the input value with the masked value\r\n let masked = inputmode === \"numeric\" ? value.replace(/\\D/g, '') : value.replace(/[^0-9\\s]/g, '');\r\n event.target.value = masked.length >= max ? masked.slice(0, max) : masked;\r\n };\r\n });\r\n }\r\n}\r\n// use with domLoad\r\nexport function skipLinks() {\r\n let content = document.querySelector(\"#content\");\r\n let skip = document.querySelector(\"#skip-link\");\r\n if (content && skip) {\r\n skip.addEventListener(\"keydown\", (e) => {\r\n if (e.key === 'Enter' || e.keyCode === 13) {\r\n let selectable = content.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n if (selectable) {\r\n selectable.focus();\r\n selectable.scrollIntoView();\r\n }\r\n }\r\n })\r\n }\r\n}\r\n\r\n// Maybe don't use\r\nexport function loadBelowFold({ script, stylesheet, adjust }) {\r\n if (!adjust) { adjust = 0;}\r\n document.addEventListener('scroll', lazyLoad);\r\n function getScript(source) {\r\n var el = document.createElement('script');\r\n el.src = source;\r\n document.body.appendChild(el);\r\n }\r\n function getStylesheet(source) {\r\n var link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.type = 'text/css';\r\n link.href = source;\r\n document.head.appendChild(link);\r\n }\r\n function lazyLoad() {\r\n var vh = Math.max(\r\n document.documentElement.clientHeight,\r\n window.innerHeight || 0\r\n );\r\n var windowHeight = window.scrollY || window.pageYOffset;\r\n if (windowHeight + adjust > vh) {\r\n stylesheet && getStylesheet(stylesheet);\r\n script && getScript(script);\r\n document.removeEventListener('scroll', lazyLoad);\r\n }\r\n }\r\n lazyLoad();\r\n}\r\n\r\nexport function getNextSibling(elem, selector) {\r\n\r\n // Get the next sibling element\r\n var sibling = elem.nextElementSibling;\r\n\r\n // If there's no selector, return the first sibling\r\n if (!selector) return sibling;\r\n\r\n // If the sibling matches our selector, use it\r\n // If not, jump to the next sibling and continue the loop\r\n while (sibling) {\r\n if (sibling.matches(selector)) return sibling;\r\n sibling = sibling.nextElementSibling\r\n }\r\n\r\n};\r\n\r\nexport function getPreviousSibling(elem, selector) {\r\n\r\n // Get the next sibling element\r\n var sibling = elem.previousElementSibling;\r\n\r\n // If there's no selector, return the first sibling\r\n if (!selector) return sibling;\r\n\r\n // If the sibling matches our selector, use it\r\n // If not, jump to the next sibling and continue the loop\r\n while (sibling) {\r\n if (sibling.matches(selector)) return sibling;\r\n sibling = sibling.previousElementSibling;\r\n }\r\n\r\n};\r\n\r\nexport function postRequest(url, content) {\r\n return window.fetch(url, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(content)\r\n });\r\n}\r\n\r\nexport function getRequest(url) {\r\n return window.fetch(url, { });\r\n}","function validateInput(input) {\r\n let validationMessage = ''\r\n let emailRegEx = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,30}))$/\r\n let phoneNoRegEx = /^[0-9\\+]{1,}[0-9\\-]{3,15}$/\r\n let id = input.getAttribute('id')\r\n let type = input.getAttribute('type')\r\n let required = input.getAttribute('required')\r\n let value = input.value ? input.value.trim() : ''\r\n input.value = value\r\n let classList = input.classList\r\n\r\n //Required Fields\r\n if (required && !value) {\r\n switch (id) {\r\n case 'FirstName':\r\n validationMessage = 'Please enter your first name'\r\n break\r\n case 'LastName':\r\n validationMessage = 'Please enter your last name'\r\n break\r\n case 'PhoneNo':\r\n validationMessage = 'Please enter your phone number'\r\n break\r\n case 'EmailAddress':\r\n validationMessage = 'Please enter your email address'\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n //Email Format\r\n else if (type === 'email' && !emailRegEx.test(value)) {\r\n validationMessage = 'Please enter a valid email address'\r\n } //Phone Format\r\n else if (type === 'tel' && !phoneNoRegEx.test(value)) {\r\n validationMessage = 'Please enter a valid phone number'\r\n } //Phone Length\r\n else if (type === 'tel' && value.length > 15) {\r\n validationMessage = 'Your phone number should be between 8 and 15 digits'\r\n }\r\n\r\n // Remove any pre-existing messages\r\n classList.remove('invalid')\r\n for (let sibling of input.parentNode.children) {\r\n if (sibling !== input) {\r\n input.parentNode.removeChild(sibling)\r\n }\r\n }\r\n\r\n // If we have an error\r\n if (validationMessage.length > 0) {\r\n classList.add('invalid')\r\n input.insertAdjacentHTML(\r\n 'afterend',\r\n '' +\r\n validationMessage +\r\n ''\r\n )\r\n }\r\n}\r\n\r\nexport function validateFormFields(form) {\r\n if (form) {\r\n let inputs = form.querySelectorAll('input')\r\n for (let i = 0; i < inputs.length; i++) {\r\n if (i === inputs.length - 1) {\r\n inputs[i].addEventListener('keyup', () => {\r\n deounce(() => { validateInput(inputs[i]) }, 250)\r\n })\r\n } else {\r\n inputs[i].addEventListener('blur', () => {\r\n validateInput(inputs[i])\r\n })\r\n }\r\n }\r\n }\r\n}\r\n ","const getElementsByClassname = (classname) => {\r\n let elements = document.querySelectorAll(`.${classname}`);\r\n return elements ? elements : [];\r\n}\r\n\r\nexport default getElementsByClassname;\r\n","const getInputs = (form) => {\r\n let inputs = form ? form.querySelectorAll(\"input\") : [];\r\n return inputs;\r\n};\r\n\r\nexport default getInputs;\r\n","import getInputs from \"./getInputs\";\r\n\r\n\r\nconst lockFormSubmissionUntilPassed = ({form, errorClassName}) => {\r\n let inputs = getInputs(form);\r\n let hasErrors = false;\r\n let submit = [];\r\n for(let index = 0; index < inputs.length; index++) {\r\n let input = inputs[index];\r\n if(input.type === \"submit\"){\r\n submit.push(input);\r\n }\r\n let includesError = input.classList.contains(errorClassName);\r\n if(includesError) {\r\n hasErrors = true;\r\n break;\r\n }\r\n }\r\n if(hasErrors && submit.length > 0) {\r\n for(let index = 0; index < submit.length; index++) {\r\n submit[i].disabled = true;\r\n }\r\n }\r\n if(!hasErrors && submit.length > 0) {\r\n for(let index = 0; index < submit.length; index++) {\r\n submit[i].disabled = false;\r\n }\r\n }\r\n}\r\nexport default lockFormSubmissionUntilPassed;\r\n","import lockFormSubmissionUntilPassed from \"./lockFormSubmissionUntilPassed\"\r\n/**onBlurValidateInput\r\n * takes an object conataining the error className and the error message class name\r\n * returns a function that takes an event\r\n * returned function validates input field\r\n * if validation fails -> adds message after input\r\n*/\r\nconst onBlurValidateInput = ({errorClassName, form, hideMessageClassName}) => (e) => {\r\n let input = e.currentTarget;\r\n if(!input){ throw new Error(\"input element is required for validation\")}\r\n if(!input.dataset){ throw new Error(\"dataset required for input validation\")}\r\n let {dataset, value} = input;\r\n let errorMessageElement = input.nextElementSibling;\r\n if(input.hasAttribute('required') && !value && errorMessageElement) {\r\n input.classList.add(errorClassName);\r\n errorMessageElement.classList.remove(hideMessageClassName);\r\n if(dataset.empty){\r\n errorMessageElement.innerText = dataset.empty\r\n }\r\n } else if ( value && \"regex\" in dataset) {\r\n let regex = RegExp(dataset.regex);\r\n let passed = regex.test(value);\r\n if(!passed) {\r\n input.classList.add(errorClassName);\r\n errorMessageElement.classList.remove(hideMessageClassName);\r\n errorMessageElement.innerText = dataset.error;\r\n }else {\r\n input.classList.remove(errorClassName);\r\n errorMessageElement.classList.add(hideMessageClassName);\r\n }\r\n } else if(!input.checkValidity()){\r\n input.classList.add(errorClassName);\r\n errorMessageElement.innerText = dataset.error;\r\n } else {\r\n input.classList.remove(errorClassName);\r\n errorMessageElement.classList.add(hideMessageClassName);\r\n }\r\n lockFormSubmissionUntilPassed({form, errorClassName});\r\n}\r\n\r\nexport default onBlurValidateInput;\r\n"," const onFocusClearValidation = ({errorClassName, hideMessageClassName}) => event => {\r\n let el = event.target;\r\n let errorMessageElement = el.nextElementSibling;\r\n el.classList.remove(errorClassName);\r\n errorMessageElement.classList.add(hideMessageClassName);\r\n}\r\n\r\nexport default onFocusClearValidation;\r\n","import onBlurValidateInput from \"./onBlurValidateInput\";\r\nimport getInputs from \"./getInputs\";\r\nimport onFocusClearValidation from \"./onFocusClearValidation\";\r\n\r\n\r\nconst addValidationToSingleForm = ({form, errorClassName, hideMessageClassName}) => {\r\n const onBlurValidation = onBlurValidateInput({errorClassName, form, hideMessageClassName});\r\n const onFocusValidation = onFocusClearValidation({errorClassName, hideMessageClassName});\r\n let inputs = getInputs(form);\r\n for(let index = 0; index < inputs.length; index++) {\r\n let input = inputs[index];\r\n let ds = input.dataset\r\n if(\"regex\" in ds || input.hasAttribute('required')) {\r\n input.onblur = onBlurValidation;\r\n input.onfocus = onFocusValidation;\r\n }\r\n }\r\n}\r\nexport default addValidationToSingleForm;\r\n","import getElementsByClassname from \"./getElementsByClassname\";\r\nimport addValidationToSingleForm from \"./addValidationToSingleForm\";\r\n\r\n\r\nconst addValidationToForms = ({formClassName, errorClassName, hideMessageClassName}) => {\r\n let forms = getElementsByClassname(formClassName);\r\n for(let i = 0; i < forms.length; i++){\r\n addValidationToSingleForm({form: forms[i], errorClassName, hideMessageClassName})\r\n }\r\n}\r\n\r\nexport default addValidationToForms;\r\n","function setupToogleDraw(btn, draw, toogleIconFn) {\r\n if (!btn || !draw) return;\r\n const focus = draw.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n const btnListener = () => {\r\n draw.toggleAttribute('data-show');\r\n let isShow = draw.hasAttribute('data-show');\r\n toogleIconFn && toogleIconFn(isShow);\r\n btn.setAttribute('aria-expanded', isShow);\r\n if (isShow && focus) {\r\n focus.focus();\r\n }\r\n if (!isShow) {\r\n btn.focus();\r\n }\r\n };\r\n draw.addEventListener(\"click\", function (event) {\r\n event.stopPropagation();\r\n });\r\n\r\n btn.addEventListener(\"click\", btnListener);\r\n}\r\n\r\n\r\nfunction setupShowMoreSearch() {\r\n const searchMobileBtn = document.querySelector(\"#mobileSearchBtn\");\r\n const searchMobileDraw = document.querySelector(\"#mobileSearchDraw\");\r\n if (searchMobileBtn && searchMobileDraw) {\r\n setupToogleDraw(searchMobileBtn, searchMobileDraw, (bool) => {\r\n searchMobileBtn.innerHTML = bool\r\n ? `