{"version":3,"file":"js/main.bundle.js","mappings":"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","sources":["webpack://login/./src/index.ts"],"sourcesContent":["import './style.scss';\ndocument.addEventListener('DOMContentLoaded', init);\n/**\n * Initialize the script\n */\nfunction init() {\n isAccountNewlyCreated();\n checkUrlFragment();\n setupSteps();\n setupLogin();\n setupForgotPassword();\n setupOtp();\n setupChangePassword();\n setupCreateAccount();\n setupModals();\n window.addEventListener('hashchange', checkUrlFragment);\n}\n/**\n * Check if account is newly created\n */\nfunction isAccountNewlyCreated() {\n const urlParams = new URLSearchParams(window.location.search);\n const accountCreated = urlParams.get('konto-skapat');\n if (!isNullOrUndefined(accountCreated)) {\n const successBox = document.querySelector('[data-id=\"create-account-success\"]');\n successBox?.classList.add('alert--active');\n }\n}\nfunction checkUrlFragment() {\n let fragment = window.location.hash;\n fragment = fragment.replace('#', '');\n if (fragment === 'glomt-losenord') {\n updateSliderPosition(2);\n }\n else if (fragment === 'skapa-konto') {\n updateSliderPosition(5);\n }\n}\n/**\n * Setup steps\n */\nfunction setupSteps() {\n const stepBtns = document.querySelectorAll('[data-button]');\n stepBtns.forEach((btn) => {\n if (!(btn instanceof HTMLElement)) {\n return;\n }\n btn.addEventListener('click', () => {\n const targetStep = parseInt(btn.dataset.targetStep ?? '', 10);\n updateSliderPosition(targetStep);\n });\n });\n}\n/**\n * Setup login functionality\n */\nfunction setupLogin() {\n const inputEmail = document.querySelector('input[type=\"email\"][name=\"username\"]');\n const inputPassword = document.querySelector('input[type=\"password\"][name=\"password\"]');\n const btnLogin = document.querySelector('[data-id=\"btn-login\"]');\n const btnLoginBankId = document.querySelector('[data-id=\"btn-bankid\"]');\n const errorBox = document.querySelector('[data-id=\"login-error\"]');\n if (!(inputEmail instanceof HTMLInputElement) ||\n !(inputPassword instanceof HTMLInputElement) ||\n !(btnLogin instanceof HTMLDivElement) ||\n !(btnLoginBankId instanceof HTMLAnchorElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n btnLogin?.addEventListener('click', (e) => {\n void btnLoginClick(btnLogin, inputEmail, inputPassword, errorBox);\n });\n btnLoginBankId?.addEventListener('click', () => {\n setBtnLoadingState(btnLoginBankId, true);\n });\n inputEmail?.addEventListener('keyup', (e) => {\n inputEmailKeyup(e, btnLogin);\n });\n inputEmail?.addEventListener('keydown', (e) => {\n inputEmailKeyDown(e, inputPassword);\n });\n inputPassword?.addEventListener('keyup', (e) => {\n inputPasswordKeyUp(e, btnLogin);\n });\n inputPassword?.addEventListener('keydown', (e) => {\n inputPasswordKeyDown(e, inputEmail);\n });\n}\n/**\n * Handle login button click\n *\n * @param btnLogin HTMLDivElement - Login button\n * @param inputEmail HTMLInputElement - Email input\n * @param inputPassword HTMLInputElement - Password input\n * @param errorBox HTMLDivElement - Error box\n */\nasync function btnLoginClick(btnLogin, inputEmail, inputPassword, errorBox) {\n if (btnLogin.dataset.clicked === 'true') {\n return;\n }\n const username = inputEmail.value.trim();\n const password = inputPassword.value.trim();\n if (isNullOrWhitespace(username) || isNullOrWhitespace(password)) {\n errorBox.classList.add('alert--active');\n return;\n }\n setBtnLoadingState(btnLogin, true);\n try {\n const response = await window.fetch('/custom/authenticate/login/index.aspx/DoLogin', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ email: username, password, personalNumber: '' })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed?.StatusCode !== 200) {\n throw dataParsed;\n }\n // Extract the redirect URL from the current page's query parameters\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('redirect')) {\n const redirectUrl = urlParams.get('redirect');\n console.log(redirectUrl);\n if (redirectUrl !== null) {\n window.location.href = `/?redirect=${encodeURIComponent(redirectUrl)}`;\n }\n }\n window.location.href = '/?logged-in';\n }\n catch (error) {\n console.error(error);\n setBtnLoadingState(btnLogin, false);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n}\n/**\n * Handle keyup event on email input\n *\n * @param e Event\n * @param btnLogin HTMLDivElement\n */\nfunction inputEmailKeyup(e, btnLogin) {\n if (!(e instanceof KeyboardEvent)) {\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n btnLogin.click();\n }\n}\n/**\n * Handle keydown event on email input\n *\n * @param e Event\n * @param inputPassword HTMLInputElement\n */\nfunction inputEmailKeyDown(e, inputPassword) {\n if (!(e instanceof KeyboardEvent)) {\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n inputPassword.focus();\n }\n}\n/**\n * Handle keyup event on password input\n *\n * @param e Event\n * @param btnLogin HTMLDivElement\n */\nfunction inputPasswordKeyUp(e, btnLogin) {\n if (!(e instanceof KeyboardEvent)) {\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n btnLogin.click();\n }\n}\n/**\n * Handle keydown event on password input\n *\n * @param e Event\n * @param inputEmail HTMLInputElement\n */\nfunction inputPasswordKeyDown(e, inputEmail) {\n if (!(e instanceof KeyboardEvent)) {\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n inputEmail.focus();\n }\n}\n/**\n * Setup forgot password functionality\n */\nfunction setupForgotPassword() {\n const sendBtn = document.querySelector('[data-id=\"btn-reset-password\"]');\n const emailInput = document.querySelector('[data-id=\"input-reset-password\"]');\n const errorBox = document.querySelector('[data-id=\"password-reset-error\"]');\n if (!(sendBtn instanceof HTMLDivElement) ||\n !(emailInput instanceof HTMLInputElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n sendBtn.addEventListener('click', (e) => {\n void sendBtnClick(sendBtn, emailInput, errorBox);\n });\n emailInput.addEventListener('keyup', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n void sendBtnClick(sendBtn, emailInput, errorBox);\n }\n });\n emailInput.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n });\n}\n/**\n * Handle send button click\n *\n * @param sendBtn HTMLDivElement\n * @param emailInput HTMLInputElement\n * @param errorBox HTMLDivElement\n */\nasync function sendBtnClick(sendBtn, emailInput, errorBox) {\n if (sendBtn.dataset.clicked === 'true' || emailInput.value === '') {\n return;\n }\n setBtnLoadingState(sendBtn, true);\n try {\n const response = await window.fetch('/custom/authenticate/login/index.aspx/ResetPassword', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n email: emailInput.value\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed.StatusCode !== 200) {\n throw dataParsed;\n }\n updateSliderPosition(parseInt(sendBtn.dataset.targetStep ?? '0'));\n removeErrorMessage(errorBox);\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n finally {\n setBtnLoadingState(sendBtn, false);\n }\n}\n/**\n * Setup one time password functionality\n */\nfunction setupOtp() {\n const input = document.querySelector('[data-id=\"one-time-code\"]');\n const sendBtn = document.querySelector('[data-id=\"btn-send-otp\"]');\n const errorBox = document.querySelector('[data-id=\"otp-error\"]');\n if (!(input instanceof HTMLInputElement) ||\n !(sendBtn instanceof HTMLDivElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n input.addEventListener('input', () => {\n const selectionStart = input.selectionStart ?? 0;\n input.style.setProperty('--_otp-digit', selectionStart.toString()); // update css variable to show input position\n });\n sendBtn.addEventListener('click', (e) => {\n void btnSendOtpClick(sendBtn, input, errorBox);\n });\n}\n/**\n * Handle send otp button click\n *\n * @param sendBtn HTMLDivElement\n * @param otpInput HTMLInputElement\n * @param errorBox HTMLDivElement\n */\nasync function btnSendOtpClick(sendBtn, otpInput, errorBox) {\n if (sendBtn.dataset.clicked === 'true' || otpInput.value.length !== 6) {\n return;\n }\n try {\n const emailInput = document.querySelector('[data-id=\"input-reset-password\"]');\n if (!(emailInput instanceof HTMLInputElement)) {\n throw new Error('E-postadress saknas eller är ogiltig');\n }\n const email = emailInput.value ?? '';\n const otp = parseInt(otpInput.value);\n if (isNullOrWhitespace(email)) {\n throw Error('E-postadress saknas eller är ogiltig');\n }\n else if (isNaN(otp) || otp.toString().length !== 6) {\n throw Error('Koden du angav är inte giltig');\n }\n setBtnLoadingState(sendBtn, true);\n const response = await window.fetch('/custom/authenticate/login/index.aspx/ValidateOtp', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n email,\n code: otp\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed?.StatusCode !== 200) {\n throw dataParsed;\n }\n if (dataParsed?.StatusCode === 200) {\n updateSliderPosition(parseInt(sendBtn.dataset.targetStep ?? ''));\n removeErrorMessage(errorBox);\n }\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n finally {\n setBtnLoadingState(sendBtn, false);\n }\n}\n/**\n * Setup change password functionality\n */\nfunction setupChangePassword() {\n const btnConfirm = document.querySelector('[data-id=\"btn-update-password\"]');\n const inputNewPassword = document.querySelector('input[type=\"password\"][name=\"new-password\"]');\n const inputConfirmPassword = document.querySelector('input[type=\"password\"][name=\"new-password-confirm\"]');\n const inputOtp = document.querySelector('[data-id=\"one-time-code\"]');\n const inputEmail = document.querySelector('[data-id=\"input-reset-password\"]');\n const errorBox = document.querySelector('[data-id=\"new-password-error\"]');\n if (!(btnConfirm instanceof HTMLDivElement) ||\n !(inputNewPassword instanceof HTMLInputElement) ||\n !(inputConfirmPassword instanceof HTMLInputElement) ||\n !(inputOtp instanceof HTMLInputElement) ||\n !(inputEmail instanceof HTMLInputElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n btnConfirm.addEventListener('click', (e) => {\n void btnConfirmNewPasswordClick(btnConfirm, inputNewPassword, inputConfirmPassword, inputOtp, inputEmail, errorBox);\n });\n inputNewPassword.addEventListener('keydown', (event) => {\n if (event.key === 'Tab') {\n event.preventDefault();\n inputConfirmPassword.focus();\n }\n });\n inputNewPassword.addEventListener('keyup', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n btnConfirm.click();\n }\n });\n inputConfirmPassword.addEventListener('keydown', (event) => {\n if (event.key === 'Tab') {\n event.preventDefault();\n inputNewPassword.focus();\n }\n });\n inputConfirmPassword.addEventListener('keyup', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n btnConfirm.click();\n }\n });\n}\n/**\n * Handle confirm new password button click\n *\n * @param btnConfirm HTMLDivElement\n * @param inputNewPassword HTMLInputElement\n * @param inputConfirmPassword HTMLInputElement\n * @param inputOtp HTMLInputElement\n * @param inputEmail HTMLInputElement\n * @param errorBox HTMLDivElement\n */\nasync function btnConfirmNewPasswordClick(btnConfirm, inputNewPassword, inputConfirmPassword, inputOtp, inputEmail, errorBox) {\n if (btnConfirm.dataset.clicked === 'true' || inputNewPassword.value === '' || inputConfirmPassword.value === '') {\n return;\n }\n try {\n const p1 = inputNewPassword.value;\n const p2 = inputConfirmPassword.value;\n const otp = parseInt(inputOtp.value);\n const email = inputEmail.value;\n if (p1 !== p2) {\n throw Error('Lösenorden matchar inte');\n }\n else if (isNaN(otp) || otp.toString().length !== 6) {\n throw Error('Koden du angav är inte giltig');\n }\n else if (isNullOrWhitespace(email)) {\n throw Error('E-postadress saknas eller är ogiltig');\n }\n setBtnLoadingState(btnConfirm, true);\n const response = await window.fetch('/custom/authenticate/login/index.aspx/UpdatePassword', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n email,\n password: p1,\n otp\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed?.StatusCode !== 200) {\n throw dataParsed;\n }\n newPasswordSuccess();\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n finally {\n setBtnLoadingState(btnConfirm, false);\n }\n}\n/**\n * Show success message after changing password\n */\nfunction newPasswordSuccess() {\n const successBox = document.querySelector('[data-id=\"new-password-success\"]');\n successBox?.classList.add('alert--active');\n updateSliderPosition(1);\n}\nfunction setupCreateAccount() {\n setupFirstStep();\n setupSecondStep();\n setupThirdStep();\n /**\n * Setup first step of create account\n */\n function setupFirstStep() {\n const btnNext = document.querySelector('[data-id=\"btn-create-account-proceed\"]');\n const inputCompanyNumber = document.querySelector('input[name=\"create-account-company-number\"]');\n const inputPersonalNumber = document.querySelector('input[name=\"create-account-personal-number\"]');\n const errorBox = document.querySelector('[data-id=\"create-account-error\"]');\n if (!(btnNext instanceof HTMLDivElement) ||\n !(inputCompanyNumber instanceof HTMLInputElement) ||\n !(inputPersonalNumber instanceof HTMLInputElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n btnNext.addEventListener('click', (e) => {\n void btnCreateAccountProceedStep1Click(btnNext, inputCompanyNumber, inputPersonalNumber, errorBox);\n });\n inputCompanyNumber.addEventListener('input', () => {\n inputCompanyNumber.value = inputCompanyNumber.value.replace(/\\D/g, ''); // Remove all non-numeric characters\n });\n inputCompanyNumber.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputPersonalNumber.focus();\n }\n });\n inputCompanyNumber.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountProceedStep1Click(btnNext, inputCompanyNumber, inputPersonalNumber, errorBox);\n }\n });\n inputPersonalNumber.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputCompanyNumber.focus();\n }\n });\n inputPersonalNumber.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountProceedStep1Click(btnNext, inputCompanyNumber, inputPersonalNumber, errorBox);\n }\n });\n }\n /**\n * Setup second step of create account\n */\n function setupSecondStep() {\n const inputEmail = document.querySelector('input[name=\"create-account-email\"]');\n const inputPhone = document.querySelector('input[name=\"create-account-phone\"]');\n const btnNext = document.querySelector('[data-id=\"btn-create-account-proceed-2\"]');\n const errorBox = document.querySelector('[data-id=\"create-account-error-2\"]');\n if (!(inputEmail instanceof HTMLInputElement) ||\n !(inputPhone instanceof HTMLInputElement) ||\n !(btnNext instanceof HTMLDivElement) ||\n !(errorBox instanceof HTMLDivElement)) {\n return;\n }\n btnNext.addEventListener('click', () => {\n void btnCreateAccountProceedStep2Click(btnNext, inputEmail, inputPhone, errorBox);\n });\n inputEmail.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputPhone.focus();\n }\n });\n inputEmail.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountProceedStep2Click(btnNext, inputEmail, inputPhone, errorBox);\n }\n });\n inputPhone.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputEmail.focus();\n }\n });\n inputPhone.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountProceedStep2Click(btnNext, inputEmail, inputPhone, errorBox);\n }\n });\n }\n function setupThirdStep() {\n const inputPassword = document.querySelector('input[name=\"create-account-password\"]');\n const inputConfirmPassword = document.querySelector('input[name=\"create-account-password-confirm\"]');\n const inputTerms = document.querySelector('input[name=\"create-account-terms\"]');\n const btnCreate = document.querySelector('[data-id=\"btn-create-account\"]');\n const errorBox = document.querySelector('[data-id=\"create-account-error-3\"]');\n const reqUppercase = document.querySelector('[data-password-req=\"uppercase\"]');\n const reqNumber = document.querySelector('[data-password-req=\"number\"]');\n const reqLength = document.querySelector('[data-password-req=\"length\"]');\n if (!(inputPassword instanceof HTMLInputElement) ||\n !(inputConfirmPassword instanceof HTMLInputElement) ||\n !(inputTerms instanceof HTMLInputElement) ||\n !(btnCreate instanceof HTMLDivElement) ||\n !(errorBox instanceof HTMLDivElement) ||\n !(reqUppercase instanceof HTMLElement) ||\n !(reqNumber instanceof HTMLElement) ||\n !(reqLength instanceof HTMLElement)) {\n return;\n }\n inputPassword.addEventListener('input', (e) => {\n if (e.target === null || !(e.target instanceof HTMLInputElement)) {\n return;\n }\n e.target.value = e.target.value.replace(/\\s/g, '').trim(); // remove all whitespace\n const hasUpperCase = /[A-Z]/.test(e.target.value);\n const hasNumber = /\\d/.test(e.target.value);\n const hasLength = e.target.value.length >= 6;\n reqUppercase.classList.toggle('valid', hasUpperCase);\n reqNumber.classList.toggle('valid', hasNumber);\n reqLength.classList.toggle('valid', hasLength);\n if (inputConfirmPassword.value !== '') {\n inputConfirmPassword.dispatchEvent(new Event('input'));\n }\n });\n inputConfirmPassword.addEventListener('input', (e) => {\n if (e.target === null || !(e.target instanceof HTMLInputElement)) {\n return;\n }\n e.target.value = e.target.value.replace(/\\s/g, '').trim(); // remove all whitespace\n });\n inputPassword.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputConfirmPassword.focus();\n }\n });\n inputPassword.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountClick(btnCreate, inputPassword, inputConfirmPassword, inputTerms, errorBox);\n }\n });\n inputConfirmPassword.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n inputPassword.focus();\n }\n });\n inputConfirmPassword.addEventListener('keyup', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void btnCreateAccountClick(btnCreate, inputPassword, inputConfirmPassword, inputTerms, errorBox);\n }\n });\n btnCreate.addEventListener('click', () => {\n void btnCreateAccountClick(btnCreate, inputPassword, inputConfirmPassword, inputTerms, errorBox);\n });\n }\n}\n/**\n * Handle create account proceed button click\n *\n * @param btn HTMLDivElement\n * @param inputCompanyNumber HTMLInputElement\n * @param inputPersonalNumber HTMLInputElement\n * @param errorBox HTMLDivElement\n * @returns Promise\n */\nasync function btnCreateAccountProceedStep1Click(btn, inputCompanyNumber, inputPersonalNumber, errorBox) {\n if (btn.dataset.clicked === 'true') {\n return;\n }\n setBtnLoadingState(btn, true);\n try {\n const companyNumber = inputCompanyNumber.value.trim();\n const personalNumber = inputPersonalNumber.value.trim();\n if (isNullOrWhitespace(companyNumber)) {\n throw Error('Fyll i företagsnummer');\n }\n if (isNaN(parseInt(companyNumber))) {\n throw Error('Företagsnumret är inte giltigt');\n }\n if (isNullOrWhitespace(personalNumber)) {\n throw Error('Fyll i personnummer');\n }\n const response = await window.fetch('/custom/authenticate/login/index.aspx/ValidateCreateAccountCompanyAndPersonalNumber', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n companyNumber,\n personalNumber\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed.StatusCode !== 200) {\n throw dataParsed;\n }\n if (typeof dataParsed.Message !== 'object') {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n if (isPersonObject(dataParsed.Message)) {\n updateCreateAccountFields(dataParsed.Message);\n }\n updateSliderPosition(parseInt(btn.dataset.targetStep ?? '0'));\n removeErrorMessage(errorBox);\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n finally {\n setBtnLoadingState(btn, false);\n }\n}\nasync function btnCreateAccountProceedStep2Click(btn, inputEmail, inputPhone, errorBox) {\n if (btn.dataset.clicked === 'true') {\n return;\n }\n setBtnLoadingState(btn, true);\n try {\n const email = inputEmail.value.trim();\n const phone = inputPhone.value.trim().replace(/[\\s-]+/g, ''); // Remove all whitespace and hyphens\n if (isNullOrWhitespace(email) || !isValidEmail(email)) {\n throw Error('Fyll i en giltig e-postadress');\n }\n if (isNullOrWhitespace(phone) || !isValidPhone(phone)) {\n throw Error('Fyll i ett giltigt telefonnummer');\n }\n const response = await window.fetch('/custom/authenticate/login/index.aspx/ValidateCreateAccountEmailAndPhone', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n email,\n phone\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed.StatusCode !== 200) {\n throw dataParsed;\n }\n updateSliderPosition(parseInt(btn.dataset.targetStep ?? '0'));\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n window.scrollTo(0, 0); // scroll to top of page\n }\n finally {\n setBtnLoadingState(btn, false);\n }\n}\nasync function btnCreateAccountClick(btn, inputPassword, inputPasswordConfirm, inputTerms, errorBox) {\n if (btn.dataset.clicked === 'true') {\n return;\n }\n setBtnLoadingState(btn, true);\n try {\n if (!inputTerms.checked) {\n throw Error('Du måste acceptera villkoren för att skapa ett konto');\n }\n const hasUpperCase = /[A-Z]/.test(inputPassword.value);\n const hasNumber = /\\d/.test(inputPassword.value);\n const hasLength = inputPassword.value.length >= 6;\n if (!hasUpperCase || !hasNumber || !hasLength) {\n throw Error('Lösenordet måste innehålla minst 6 tecken, varav minst en siffra och en stor bokstav');\n }\n if (inputPassword.value !== inputPasswordConfirm.value) {\n throw Error('Lösenorden matchar inte');\n }\n const inputCompanyNumber = document.querySelector('input[name=\"create-account-company-number\"]');\n const inputPersonalNumber = document.querySelector('input[name=\"create-account-personal-number\"]');\n const inputEmail = document.querySelector('input[name=\"create-account-email\"]');\n const inputPhone = document.querySelector('input[name=\"create-account-phone\"]');\n if (!(inputCompanyNumber instanceof HTMLInputElement) ||\n !(inputPersonalNumber instanceof HTMLInputElement) ||\n !(inputEmail instanceof HTMLInputElement) ||\n !(inputPhone instanceof HTMLInputElement)) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const response = await window.fetch('/custom/authenticate/login/index.aspx/CreateAccount', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n companyNumber: inputCompanyNumber.value,\n personalNumber: inputPersonalNumber.value,\n email: inputEmail.value,\n phone: inputPhone.value,\n password: inputPassword.value\n })\n });\n if (!response.ok) {\n throw Error('Ett oväntat fel uppstod. Ladda om sidan eller försök igen senare.');\n }\n const data = await response.json();\n const dataParsed = JSON.parse(data.d);\n if (dataParsed.StatusCode !== 200) {\n throw dataParsed;\n }\n window.dataLayer = isNullOrUndefined(window.dataLayer) ? [] : window.dataLayer;\n window.dataLayer.push({\n event: 'account_created'\n });\n window.location.href = '/logga-in?konto-skapat';\n }\n catch (error) {\n console.error(error);\n const errorMessage = error instanceof Error\n ? error.message\n : isBackendError(error)\n ? error.Message\n : 'Ett oväntat fel uppstod. Försök igen senare.';\n setErrorMessage(errorBox, errorMessage);\n }\n finally {\n setBtnLoadingState(btn, false);\n }\n}\n/**\n * Update create account fields with data from backend\n *\n * @param data PersonObject\n */\nfunction updateCreateAccountFields(data) {\n const inputDummyIds = [\n { id: '[data-id=\"create-account-first-name\"]', value: data.FirstName },\n { id: '[data-id=\"create-account-last-name\"]', value: data.LastName },\n { id: '[data-id=\"create-account-role\"]', value: data.Position === '' ? 'Ej satt' : data.Position },\n { id: '[data-id=\"create-account-company\"]', value: data.Company }\n ];\n const inputs = [\n {\n id: 'input[name=\"create-account-email\"]',\n value: data.Email\n },\n {\n id: 'input[name=\"create-account-phone\"]',\n value: data.MobilePhone\n }\n ];\n inputDummyIds.forEach((i) => {\n const p = document.querySelector(i.id);\n if (!(p instanceof HTMLParagraphElement)) {\n return;\n }\n p.textContent = i.value;\n });\n inputs.forEach((i) => {\n const input = document.querySelector(i.id);\n if (!(input instanceof HTMLInputElement)) {\n return;\n }\n input.value = i.value;\n });\n}\n/**\n * Setup modals\n */\nfunction setupModals() {\n const modalBtns = document.querySelectorAll('[data-modal-target]');\n modalBtns.forEach((btn) => {\n if (!(btn instanceof HTMLElement)) {\n return;\n }\n const modal = document.querySelector(`[data-id=\"${btn.dataset.modalTarget}\"]`);\n if (modal === null) {\n return;\n }\n btn.addEventListener('click', () => {\n modal.classList.add('modal--open');\n });\n const inner = modal.querySelector('.modal__inner');\n const closeBtns = modal.querySelectorAll('[data-id=\"modal-close\"]');\n if (inner === null) {\n return;\n }\n modal.addEventListener('click', (e) => {\n if (!(e.target instanceof Node)) {\n return;\n }\n if (inner.contains(e.target)) {\n return;\n }\n modal.classList.remove('modal--open');\n });\n closeBtns.forEach((closeBtn) => {\n closeBtn.addEventListener('click', () => {\n modal.classList.remove('modal--open');\n });\n });\n });\n}\n/**\n * Update slider position to show current step\n *\n * @param currentStep\n */\nfunction updateSliderPosition(currentStep) {\n const steps = document.querySelectorAll('[data-step]');\n const stepWrapper = document.querySelector('[data-step-wrapper]');\n if (!(stepWrapper instanceof HTMLDivElement)) {\n return;\n }\n const thisStep = steps[currentStep];\n steps.forEach((step) => {\n if (!(step instanceof HTMLDivElement)) {\n return;\n }\n step.classList.remove('step--visible');\n if (step === thisStep) {\n step.classList.add('step--visible');\n }\n });\n const slideWidth = steps[0].clientWidth;\n stepWrapper.style.transform = `translateX(${-slideWidth * currentStep}px)`;\n}\n/**\n * Set loading state of a custom button\n *\n * @param btn\n * @param isLoading\n */\nfunction setBtnLoadingState(btn, isLoading) {\n const btnText = btn.querySelector('span');\n const btnSpinner = btn.querySelector('i');\n if (isLoading) {\n btn.dataset.clicked = 'true';\n btnText.classList.add('hidden');\n btnSpinner?.classList.remove('hidden');\n return;\n }\n btn.dataset.clicked = 'false';\n btnText.classList.remove('hidden');\n btnSpinner?.classList.add('hidden');\n}\n/**\n * Sett error message in error box\n *\n * @param errorBox\n * @param message\n */\nfunction setErrorMessage(errorBox, message) {\n const errorBoxText = errorBox.querySelector('span');\n if (errorBoxText === null) {\n return;\n }\n errorBoxText.innerHTML = message;\n errorBox.classList.add('alert--active');\n}\n/**\n * Remove error message from error box\n *\n * @param errorBox\n */\nfunction removeErrorMessage(errorBox) {\n errorBox.classList.remove('alert--active');\n}\n/**\n * Check if string is null or whitespace\n *\n * @param input\n */\nfunction isNullOrWhitespace(input) {\n if (input === null || input === undefined) {\n return true;\n }\n return input.trim().length === 0;\n}\n/**\n * Check if value is null or undefined\n */\nfunction isNullOrUndefined(value) {\n return value === null || value === undefined;\n}\n/**\n * Validate email\n *\n * @param email\n * @returns boolean\n */\nfunction isValidEmail(email) {\n return /^(([^<>()[\\]\\\\.,;:\\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,}))$/.test(email);\n}\n/**\n * Validate Swedish phone number\n *\n * @param phone\n * @returns boolean\n */\nfunction isValidPhone(phone) {\n return /^(([+]46)\\s*(7|07)|07)[02369]\\s*(\\d{4})\\s*(\\d{3})$/.test(phone);\n}\n/**\n * Check if error is a backend error\n *\n * @param error unknown\n * @returns boolean\n */\nfunction isBackendError(error) {\n return (typeof error === 'object' &&\n error !== null &&\n 'Message' in error &&\n typeof error.Message === 'string' &&\n 'StatusCode' in error &&\n typeof error.StatusCode === 'number');\n}\n/**\n * Check if object is a person object\n *\n * @param obj unknown\n * @returns boolean\n */\nfunction isPersonObject(obj) {\n return (typeof obj === 'object' &&\n obj !== null &&\n 'Company' in obj &&\n typeof obj.Company === 'string' &&\n 'Email' in obj &&\n typeof obj.Email === 'string' &&\n 'FirstName' in obj &&\n typeof obj.FirstName === 'string' &&\n 'LastName' in obj &&\n typeof obj.LastName === 'string' &&\n 'MobilePhone' in obj &&\n typeof obj.MobilePhone === 'string' &&\n 'Position' in obj &&\n typeof obj.Position === 'string');\n}\n"],"names":["checkUrlFragment","fragment","window","location","hash","replace","updateSliderPosition","async","sendBtnClick","sendBtn","emailInput","errorBox","dataset","clicked","value","setBtnLoadingState","response","fetch","method","headers","body","JSON","stringify","email","ok","Error","data","json","dataParsed","parse","d","StatusCode","parseInt","targetStep","removeErrorMessage","error","console","setErrorMessage","message","isBackendError","Message","btnCreateAccountProceedStep1Click","btn","inputCompanyNumber","inputPersonalNumber","companyNumber","trim","personalNumber","isNullOrWhitespace","isNaN","obj","Company","Email","FirstName","LastName","MobilePhone","Position","inputDummyIds","id","inputs","forEach","i","p","document","querySelector","HTMLParagraphElement","textContent","input","HTMLInputElement","updateCreateAccountFields","btnCreateAccountProceedStep2Click","inputEmail","inputPhone","phone","test","isValidEmail","isValidPhone","scrollTo","btnCreateAccountClick","inputPassword","inputPasswordConfirm","inputTerms","checked","hasUpperCase","hasNumber","hasLength","length","password","dataLayer","isNullOrUndefined","push","event","href","currentStep","steps","querySelectorAll","stepWrapper","HTMLDivElement","thisStep","step","classList","remove","add","slideWidth","clientWidth","style","transform","isLoading","btnText","btnSpinner","errorBoxText","innerHTML","addEventListener","urlParams","URLSearchParams","search","get","successBox","isAccountNewlyCreated","HTMLElement","btnLogin","btnLoginBankId","HTMLAnchorElement","e","username","has","redirectUrl","log","encodeURIComponent","btnLoginClick","KeyboardEvent","key","preventDefault","click","inputEmailKeyup","focus","inputEmailKeyDown","inputPasswordKeyUp","inputPasswordKeyDown","setupLogin","setupForgotPassword","selectionStart","setProperty","toString","otpInput","otp","code","btnSendOtpClick","setupOtp","btnConfirm","inputNewPassword","inputConfirmPassword","inputOtp","p1","p2","newPasswordSuccess","btnConfirmNewPasswordClick","setupChangePassword","setupFirstStep","btnNext","setupSecondStep","setupThirdStep","btnCreate","reqUppercase","reqNumber","reqLength","target","toggle","dispatchEvent","Event","setupCreateAccount","modal","modalTarget","inner","closeBtns","Node","contains","closeBtn"],"sourceRoot":""}