{"version":3,"file":"index.0e4afdea.js","sources":["../../../frontend/js/donation/validators.js","../../../frontend/js/http.js","../../../frontend/js/utils.js","../../../frontend/js/billecta.js","../../../frontend/js/donation/constants.js","../../../frontend/js/tracking.js","../../../frontend/js/donation/donation.js","../../../frontend/js/error-handler.js","../../../frontend/js/spar.js","../../../frontend/js/share.js","../../../frontend/js/copy.js","../../../frontend/js/video.js","../../../frontend/js/checkout.js","../../../frontend/js/certificate.js","../../../frontend/js/gallery.js","../../../frontend/js/slider.js","../../../frontend/js/wc-validation.js","../../../frontend/js/video-player.js","../../../frontend/js/fade-image.js","../../../frontend/js/tm-register-lead.js","../../../frontend/js/index.js","../../../frontend/js/agroforestry.js","../../../frontend/js/cookie.js","../../../frontend/js/menu.js","../../../frontend/js/site-list-toggle.js","../../../frontend/js/scroll-lock.js","../../../frontend/js/submenu.js","../../../frontend/js/minicart.js","../../../frontend/js/embed-message.js"],"sourcesContent":["import { helpers } from 'vuelidate/lib/validators';\nimport luhn from 'luhn';\n\n// Same validation is used in backend, src/validators.php\nexport const isValidSSN = value => {\n if (!value) return true;\n\n // Remove all non-digits characters\n value = value.replace(/\\D/g, '');\n if (value.length !== 12) {\n return false;\n }\n if (value.length === 12) {\n value = value.slice(2);\n }\n\n const month = value.substring(2, 4);\n const day = value.substring(4, 6);\n if (month > 12 || day > 31) {\n return false;\n }\n\n return luhn.validate(value);\n};\n\n// Same validation is used in backend, src/validators.php\nexport const isValidSwedishOrganizationNumber = value => {\n if (!value) {\n return false;\n }\n\n if (!value.match(/^\\d{6}-?\\d{4}$/)) {\n return false;\n }\n\n value = value.replace(/\\D/, '').slice(-10);\n return luhn.validate(value);\n};\n\nexport const optional = () => {\n return true;\n};\n\nexport const manualAddress = (value, fields) => {\n if (fields.obfuscatedAddress || value) {\n return true;\n }\n\n return false;\n};\n\nexport const isClearingNo = value => {\n // Remove all dashes and check if it is a number\n value = value.replace(/\\-/g, '');\n if(isNaN(value)) {\n return false;\n }\n\n const minLength = 4;\n let maxLength = 4;\n // Banks where clearing no starting with 8 have an extra digit\n if(value.substring(0, 1) === '8') {\n maxLength = 5;\n }\n return value.length >= minLength && value.length <= maxLength;\n};\n\nexport const isAccountNo = value => {\n // Remove all dashes and spaces and check if it is a number\n value = value.replace(/\\s|\\-/g, '');\n if(isNaN(value)) {\n return false;\n }\n\n // Different lengths depending on bank\n const minLength = 7;\n const maxLength = 10;\n return value.length >= minLength && value.length <= maxLength;\n};\n\nexport const isDate = value => {\n return /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(value);\n};\n\nexport const isMinToday = value => {\n const today = new Date();\n const date = new Date(value);\n if (today.getFullYear() !== date.getFullYear()) {\n return today.getFullYear() < date.getFullYear();\n }\n if (today.getMonth() !== date.getMonth()) {\n return today.getMonth() < date.getMonth();\n }\n return today.getDate() <= date.getDate();\n};\n\nexport const validateIf = (validation, condition) => {\n if (!condition) return true;\n\n return value => validation(value);\n};\n\nexport const maxRows = rows => value => {\n return value.split('\\n').length <= rows;\n};\n","const status = response => {\n if (response.status >= 200 && response.status < 300) {\n return Promise.resolve(response)\n } else {\n return Promise.reject(response)\n }\n}\n\nconst json = response => {\n return response.json()\n}\n\nexport default {\n post: (url, data = {}, options = {}) => {\n const defaultArgs = {\n method: 'POST',\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n };\n\n if (typeof JSSettings !== \"undefined\") {\n defaultArgs.headers[\"X-WP-Nonce\"] = JSSettings.nonce\n }\n\n return fetch(url, {...defaultArgs, ...options})\n .then(status)\n .then(json)\n },\n\n get: (url, data = null, options = {}) => {\n const defaultArgs = {};\n\n if (data) {\n const query = Object.keys(data)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(data[k]))\n .join('&');\n\n url = url + (url.match(/\\?/) ? '&' : '?') + query\n }\n\n return fetch(url, {...defaultArgs, ...options})\n .then(status)\n .then(json)\n }\n}","/**\n * Repeats a function that return a promise until it\n * resolve something else than \"repeat\" or is\n * rejected with reject(\"reject\")\n *\n * @param func - a function that resolve a promise\n * @param param - param to pass to the passed func\n * @param timeout - Timeout in microseconds (when to stop polling)\n * @param interval - How often the poll should run, in microseconds\n *\n * @returns {Promise}\n */\nexport function awaitPollStatus(func, param, timeout = null, interval = null) {\n let endTime = Number(new Date()) + (timeout || 2 * 60 * 1000);\n interval = interval || 3000;\n\n function _poll(resolve, reject) {\n if (Number(new Date()) > endTime) {\n reject('Timeout');\n return;\n }\n\n func(param).then(x => {\n if (x === 'repeat') {\n setTimeout(_poll, interval, resolve, reject)\n } else {\n resolve(x);\n }\n }).catch((e) => {\n if (e === 'reject') {\n reject()\n } else {\n setTimeout(_poll, interval, resolve, reject)\n }\n })\n }\n\n return new Promise(_poll);\n}\n","import http from './http'\nimport {awaitPollStatus} from \"./utils\";\n\nclass EventListener{\n onReceivedQR = (qr) => {console.log(\"Received unhandeled event `onReceivedQR` with data: \" + qr)}\n onReceivedBankIdAutoStartToken = (token) => {console.log(\"Received unhandeled event `onReceivedBankIdAutoStartToken` with data: \" + token)}\n onReceivedBankAccountStatus = () => {console.log(\"Received bank account status\")}\n onReceivedSigningFingerprintStatus = () => {console.log(\"Received signing fingerprint status\")}\n onReceivedCurrentDevice = (currentDevice) => {console.log(\"Received if BankId is on current device\")}\n}\n\nexport const eventListener = new EventListener()\n\nfunction getBankAccounts(bank, ssn, otherDevice) {\n const url = \"/wp-json/billecta/v1/bank/accounts/initiate/\" + bank + '/' + ssn + '?otherDevice=' + otherDevice\n\n const currentDevice = otherDevice === true ? false : true;\n eventListener.onReceivedCurrentDevice(currentDevice);\n\n return new Promise((resolve, reject) => {\n http.post(url).then(x => {\n const publicId = x['PublicId'];\n\n eventListener.onReceivedBankAccountInititate(publicId);\n\n awaitPollStatus(getBankAccountStatus, publicId).then(response => {\n resolve(parseBankAccountStatusResponse(response))\n }).catch(x => reject(x))\n\n }).catch(x => reject(x))\n })\n}\n\nfunction parseBankAccountStatusResponse(response) {\n return response['AccountNumbers'].filter(x => (\n x['AutogiroCompatible'] === 'Approved'\n )).map(x => ({\n clearingNo: x['ClearingNo'],\n accountNo: x['AccountNo'],\n name: x['Name'],\n }))\n}\n\nfunction resumeBankAccount(publicId) {\n return new Promise((resolve, reject) => {\n awaitPollStatus(getBankAccountStatus, publicId).then(response => {\n resolve(parseBankAccountStatusResponse(response))\n }).catch(x => reject(x))\n });\n}\n\nconst getAccountStatusUrl = (publicId) =>\n \"/wp-json/billecta/v1/bank/accounts/\" + publicId\n\nfunction getBankAccountStatus(publicId) {\n const url = getAccountStatusUrl(publicId)\n\n return new Promise((resolve, reject) => {\n http.get(url).then(x => {\n eventListener.onReceivedBankAccountStatus();\n\n if (x['QR']) {\n eventListener.onReceivedQR(x['QR'])\n }\n\n if (x['BankIdAutostartToken']) {\n eventListener.onReceivedBankIdAutoStartToken(x['BankIdAutostartToken'])\n }\n\n if (x && x['Status'] === 'Waiting') {\n resolve('repeat')\n } else if (x && x['Status'] === 'Success') {\n resolve(x)\n } else {\n reject(x)\n }\n }).catch(x => reject(x))\n })\n}\n\nfunction getSigningFingerprint(ssn, currentDevice) {\n const url = \"/wp-json/billecta/v1/bankid/sign/initiate/\" + ssn + '?currentDevice=' + currentDevice\n\n eventListener.onReceivedCurrentDevice(currentDevice);\n\n return new Promise((resolve, reject) => {\n http.post(url).then(x => {\n awaitPollStatus(getSigningFingerprintStatus, x['ReferenceToken']).then(response => {\n resolve(response)\n }).catch(x => reject(x))\n }).catch(x => reject(x))\n })\n}\n\nfunction getSigningFingerprintStatus(publicId) {\n const url = \"/wp-json/billecta/v1/bankid/sign/\" + publicId\n\n return new Promise((resolve, reject) => {\n http.get(url).then(x => {\n eventListener.onReceivedSigningFingerprintStatus();\n\n if (x['QR']) {\n eventListener.onReceivedQR(x['QR'])\n }\n\n if (x['AutoStartToken']) {\n eventListener.onReceivedBankIdAutoStartToken(x['AutoStartToken'])\n }\n\n if (x && ['Started', 'Waiting', 'UserSign', 'OutstandingTransaction'].indexOf(x['Status']) !== -1) {\n resolve('repeat')\n } else if (x && x['Status'] === 'Complete') {\n resolve(x)\n } else {\n reject(x)\n }\n }).catch(x => reject(x))\n })\n}\n\nexport default {\n getBankAccounts,\n resumeBankAccount,\n getSigningFingerprint\n}\n","export const GIFT_TYPE_STANDARD = 'standard';\nexport const GIFT_TYPE_MONTHLY = 'monthly';\nexport const GIFT_TYPE_MEMORIAL = 'memorial';\nexport const GIFT_TYPE_SHOP = 'checkout';\nexport const GIFT_TYPE_MEMORIAL_BUSINESS = 'memorial_company';\nexport const GIFT_TYPE_TREE = 'tree';\nexport const GIFT_TYPE_TREE_BUSINESS = 'tree_company';\nexport const GIFT_TYPE_BUSINESS = 'business';\nexport const GIFT_TYPE_CLIMATE_COMPENSATION = 'climate_compensation';\nexport const GIFT_TYPE_CLIMATE_COMPENSATION_PERSONAL =\n 'climate_compensation_personal';\n\nlet _GIFT_TYPE_TRACKING_NAMES = {};\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_STANDARD] = 'engangsgava';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_MONTHLY] = 'manadsgivare';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_BUSINESS] = 'foretagsgava';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_MEMORIAL] = 'minnesgava';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_SHOP] = 'checkout';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_MEMORIAL_BUSINESS] = 'minnesgava foretag';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_TREE] = 'gebortettträd';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_TREE_BUSINESS] = 'gebortettträd foretag';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_CLIMATE_COMPENSATION] =\n 'klimatkompensation foretag';\n_GIFT_TYPE_TRACKING_NAMES[GIFT_TYPE_CLIMATE_COMPENSATION_PERSONAL] =\n 'klimatkompensation privat';\n\nexport const GIFT_TYPE_TRACKING_NAMES = _GIFT_TYPE_TRACKING_NAMES;\n\nexport const SECTION_TRACKING_NAMES = {\n amount: 'belopp',\n treeCount: 'belopp',\n cart: 'varukorg',\n payment: 'betalsatt',\n certificate: 'gavobevis',\n personal: 'personuppgifter',\n company: 'foretagsuppgifter',\n automaticPayment: 'autogiroregistrering'\n};\n\nexport const XHR_STATUS_IDLE = 'idle';\nexport const XHR_STATUS_LOADING = 'loading';\nexport const XHR_STATUS_SUCCESS = 'success';\nexport const XHR_STATUS_ERROR = 'error';\nexport const XHR_STATUS_EMPTY = 'empty';\n","import {GIFT_TYPE_TRACKING_NAMES} from './donation/constants'\n\nexport function trackEvent(event, category = null, action = null, label = null, extra = {}) {\n let data = {event, ...extra};\n\n if (category) {\n data['eventCategory'] = category;\n }\n if (action) {\n data['eventAction'] = action;\n }\n if (label !== null) { // Allow empty strings since it might be on purpose\n data['eventLabel'] = label;\n }\n data = {...data, ...extra}\n\n if (window.dataLayer) {\n window.dataLayer.push(data);\n }\n}\n\nexport function trackCart(event, actionField = null, products = null, extra = {}) {\n let data = {event, ...extra};\n let ecommerce = {\n [event]: {}\n }\n\n if (actionField) {\n ecommerce[event]['actionField'] = actionField;\n }\n if (products) {\n ecommerce[event]['products'] = products;\n }\n data = {...data, ecommerce}\n\n if (window.dataLayer) {\n window.dataLayer.push(data);\n }\n}\n\nexport default {\n trackEvent,\n trackCart,\n GIFT_TYPE_TRACKING_NAMES,\n}","import Vue from 'vue';\nimport Vuelidate from 'vuelidate';\nimport VueLocalStorage from 'vue-localstorage';\nimport {\n email,\n numeric,\n decimal,\n required,\n requiredIf,\n maxLength\n} from 'vuelidate/lib/validators';\nimport Iti from 'intl-tel-input';\nimport Velocity from 'velocity-animate';\nimport {\n optional,\n isValidSSN,\n isValidSwedishOrganizationNumber,\n isClearingNo,\n isAccountNo,\n isDate,\n isMinToday,\n validateIf,\n maxRows\n} from './validators';\nimport * as Sentry from '@sentry/browser';\n\nimport billecta, {eventListener as billectaEventListener} from '../billecta';\nimport http from '../http';\nimport getSparPerson from '../spar';\nimport { trackEvent, trackCart } from '../tracking';\nimport Logger from '../error-handler';\n\nimport {\n GIFT_TYPE_TRACKING_NAMES,\n SECTION_TRACKING_NAMES,\n XHR_STATUS_IDLE,\n XHR_STATUS_LOADING,\n XHR_STATUS_SUCCESS,\n XHR_STATUS_ERROR,\n XHR_STATUS_EMPTY,\n} from './constants';\n\nconst logger = new Logger();\n\nlet V = Velocity;\n\nVue.use(Vuelidate);\nVue.use(VueLocalStorage, { name: 'store' });\n\nconst Donation = el => {\n // Settings from wp\n const {\n type,\n postId,\n orderId,\n customerId,\n campaignCode,\n legalAgreement,\n sectionsData,\n currency,\n locale,\n certificatePrintCost,\n certificateTextMaxLength,\n certificateTextMaxRows,\n certificateFromMaxLength,\n certificateShowFromName,\n amount,\n amounts,\n minAmount,\n allowDecimalAmounts,\n externalAmount,\n defaultPayment,\n quantity,\n minQuantity,\n certificateImages,\n isClimateCompensation,\n trackingName,\n cartInfo,\n isLoggedIn,\n leadGuid,\n } = settings;\n const sections = Object.keys(sectionsData);\n\n const sectionValidate = sections\n .map(s => `groups.${s}`);\n\n const forms = {\n section: sectionValidate\n };\n\n const defaultGroups = Object.assign(\n {},\n ...sections.map(i => ({ [i]: false }))\n );\n\n let defaultAmounts = amounts.map(a => parseFloat(a));\n\n let useCustomAmount = false;\n let customAmount = '';\n\n const defaultAmountIndex = Math.floor(amounts.length / 2);\n let defaultAmount = defaultAmounts[defaultAmountIndex]\n ? defaultAmounts[defaultAmountIndex]\n : amount;\n\n if (externalAmount) {\n defaultAmount = externalAmount;\n useCustomAmount = !defaultAmounts.includes(externalAmount);\n customAmount = useCustomAmount ? defaultAmount : '';\n }\n\n const defaultQuantity = parseInt(quantity || 1);\n const defaultTotalCost = defaultAmount * defaultQuantity;\n\n const certificateImagesAreSelectable =\n certificateImages && certificateImages.length > 0;\n const defaultCertificateImage = certificateImagesAreSelectable\n ? certificateImages[0]\n : {};\n\n // Set order states depending on if they include the specific section\n const isCompanyOrder = sections.includes('company');\n const isCertificateOrder = sections.includes('certificate');\n const isTreeOrder = sections.includes('treeCount');\n const isMonthlyOrder = sections.includes('automaticPayment');\n\n const intlTelUtils =\n 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.15/js/utils.js';\n const intlTelLoaded = window.intlTelInputGlobals.loadUtils(intlTelUtils);\n\n var app = new Vue({\n el: '#vue',\n directives: {\n intltelinput: {\n inserted: (el, _binding, vnode) => {\n const vueApp = vnode.context;\n const input = el.querySelector('input[type=\"tel\"]');\n const countryKey = `${input.name}Country`;\n const sanitizedKey = `${input.name}Sanitized`;\n\n let defaultCountry = 'SE';\n if (\n vueApp.fields &&\n vueApp.fields[countryKey] &&\n vueApp.fields[countryKey].iso2\n ) {\n defaultCountry = vueApp.fields[countryKey].iso2;\n }\n\n const options = {\n separateDialCode: true,\n initialCountry: defaultCountry\n };\n if (input.name === 'swishPhone') {\n options.onlyCountries = ['SE'];\n options.allowDropdown = false;\n } else {\n options.preferredCountries = ['SE'];\n }\n\n const iti = new Iti(input, options);\n\n intlTelLoaded.then(() => {\n vueApp.fields[sanitizedKey] = iti.getNumber();\n vueApp.fields[\n countryKey\n ] = iti.getSelectedCountryData();\n\n input.addEventListener('countrychange', () => {\n vueApp.fields[\n countryKey\n ] = iti.getSelectedCountryData();\n });\n });\n },\n update: (el, _binding, vnode) => {\n const input = el.querySelector('input[type=\"tel\"]');\n\n const countryKey = `${input.name}Country`;\n const sanitizedKey = `${input.name}Sanitized`;\n const isValidKey = `${input.name}IsValid`;\n\n const iti = window.intlTelInputGlobals.getInstance(input);\n\n const number = iti.getNumber()\n vnode.context.fields[isValidKey] = !number || window.intlTelInputUtils.isValidNumber(number);\n vnode.context.fields[sanitizedKey] = number;\n vnode.context.fields[countryKey] = iti.getSelectedCountryData();\n }\n }\n },\n data: {\n type: type,\n postId: postId,\n orderId: orderId,\n campaignCode: campaignCode,\n currency: currency,\n locale: locale,\n activeSection: sections[0],\n sections: sections,\n amounts: defaultAmounts,\n minAmount: parseInt(minAmount),\n certificatePrintCost: parseInt(certificatePrintCost),\n certificateTextMaxLength: parseInt(certificateTextMaxLength),\n certificateTextMaxRows: parseInt(certificateTextMaxRows),\n quantity: quantity || 0,\n currentSubmit: '',\n trackingName: trackingName,\n\n certificateImages: certificateImages,\n certificateImagesAreSelectable: certificateImagesAreSelectable,\n selectedCertificateImage: defaultCertificateImage,\n selectedCertificateImageStyle: {backgroundImage: `url('${defaultCertificateImage.src}')` },\n\n obfuscatedAddress: {\n firstName: '',\n lastName: '',\n address: '',\n postalCode: '',\n city: ''\n },\n\n fields: {\n amount: defaultAmount,\n customAmount,\n\n quantity: defaultQuantity,\n treeCount: defaultQuantity,\n\n ssn: '',\n sparId: '',\n\n firstName: '',\n lastName: '',\n address: '',\n address2: '',\n postalCode: '',\n city: '',\n companyName: '',\n companyRegistrationNumber: '',\n email: '',\n phone: '',\n phoneSanitized: '',\n phoneIsValid: false,\n phoneCountry: {},\n\n showShippingFields: false,\n shippingFirstName: '',\n shippingLastName: '',\n shippingAddress: '',\n shippingAddress2: '',\n shippingPostalCode: '',\n shippingCity: '',\n\n payment: defaultPayment,\n\n swishPhone: '',\n swishPhoneSanitized: '',\n swishPhoneIsValid: '',\n swishPhoneCountry: {},\n\n certificate: false,\n certificateOther: false,\n certificateName: '',\n certificateFromName: '',\n certificateMessage: '',\n certificateImageId: defaultCertificateImage.ID,\n\n recipientEmail: '',\n recipientSelect: '',\n recipientDate: '',\n recipientSelectedDate: 'memorial',\n memorialOrderData: [],\n recipientName: '',\n recipientAddress: '',\n recipientAddress2: '',\n recipientPostalCode: '',\n recipientCity: '',\n\n // For automatic payments\n bank: '',\n bankAccountNumberSelected: '',\n clearingNo: '',\n accountNo: ''\n },\n billectaIsPolling: false,\n billectaBankAccountPublicId: null,\n billectaQRCode: null,\n billectaBankIdAutoStartToken: null,\n billectaCurrentDevice: false,\n bankIdUrl: 'bankid://',\n\n digitalSignature: null,\n\n showPreviewModal: false,\n previewType: 'digital',\n\n useCustomAmount,\n\n showAddressFields: (isLoggedIn !== true) ? false : true,\n showAccountFields: false,\n showObfuscatedAddress: false,\n showSparLoader: false,\n showSparError: false,\n showMissingAddressError: false,\n\n showCertificateName: !isTreeOrder,\n\n isSwishPhone: false,\n isOtherCertificate: false,\n isPrintCertificate: false,\n\n allowSwishPhoneOverride: true,\n\n xhrStatusOrderStatus: XHR_STATUS_IDLE,\n xhrStatusBankAccount: XHR_STATUS_IDLE,\n xhrStatusSubmit: XHR_STATUS_IDLE,\n xhrStatusSubmitDonorToBe: XHR_STATUS_IDLE,\n xhrStatusMessageType: type,\n\n submitErrorMessage: '',\n bankAccountNumbers: [],\n\n showBankIDLoadingSpinner: false,\n openBankIDOnCurrentDevice: false,\n\n totalCost: defaultTotalCost,\n\n error: false,\n touchedGroups: Object.assign({}, defaultGroups),\n groupError: Object.assign({}, defaultGroups),\n hideFieldError: '',\n\n groups: {\n amount: ['fields.amount'],\n cart: ['fields.amount'],\n personal: [\n 'fields.ssn',\n 'fields.sparId',\n 'fields.email',\n 'fields.phone',\n 'fields.firstName',\n 'fields.lastName',\n 'fields.address',\n 'fields.postalCode',\n 'fields.city',\n 'fields.shippingFirstName',\n 'fields.shippingLastName',\n 'fields.shippingAddress',\n 'fields.shippingAddress2',\n 'fields.shippingPostalCode',\n 'fields.shippingCity'\n ],\n company: [\n 'fields.email',\n 'fields.phone',\n 'fields.companyName',\n 'fields.companyRegistrationNumber',\n 'fields.firstName',\n 'fields.lastName',\n 'fields.address',\n 'fields.postalCode',\n 'fields.city',\n 'fields.shippingFirstName',\n 'fields.shippingLastName',\n 'fields.shippingAddress',\n 'fields.shippingAddress2',\n 'fields.shippingPostalCode',\n 'fields.shippingCity'\n ],\n payment: ['fields.payment', 'fields.swishPhone'],\n automaticPayment: [\n 'fields.bankAccountNumberSelected',\n 'fields.bank',\n 'fields.clearingNo',\n 'fields.accountNo'\n ],\n certificate: [\n 'fields.certificate',\n 'fields.certificateOther',\n 'fields.certificateName',\n 'fields.certificateMessage',\n 'fields.certificateFromName',\n 'fields.recipientEmail',\n 'fields.recipientSelect',\n 'fields.recipientDate',\n 'fields.recipientSelectedDate',\n 'fields.memorialOrderData',\n 'fields.recipientName',\n 'fields.recipientAddress',\n 'fields.recipientAddress2',\n 'fields.recipientPostalCode',\n 'fields.recipientCity',\n 'fields.certificateImageId'\n ],\n treeCount: ['fields.treeCount']\n }\n },\n\n validations() {\n // Multiple validations with requiredIf doesn't work, custom validateIf used instead\n\n const reqAddress = requiredIf(\n () => this.showAddressFields || this.activeSection === 'company'\n );\n const reqShippingAddress = requiredIf(\n () => this.fields.showShippingFields\n )\n return {\n fields: {\n amount: {\n decimal,\n minValue: v => v >= this.minAmount,\n required\n },\n customAmount: {\n requiredIf: requiredIf(() => this.useCustomAmount),\n validateCustomAmount: validateIf(\n numeric,\n this.useCustomAmount\n )\n },\n\n quantity: {\n numeric,\n minValue: v => v >= minQuantity,\n required\n },\n treeCount: {\n numeric,\n minValue: v => v >= minQuantity,\n required\n },\n\n ssn: {\n requiredIf: requiredIf(() => !isLoggedIn),\n validateSSN: validateIf(isValidSSN, isLoggedIn || !isLoggedIn)\n },\n sparId: {\n requiredIf: requiredIf(() => !this.showAddressFields),\n },\n\n firstName: {\n requiredIf: reqAddress\n },\n lastName: {\n requiredIf: reqAddress\n },\n\n companyName: { required },\n companyRegistrationNumber: {\n requiredIf: requiredIf(() => !isLoggedIn),\n validateCompanyRegistrationNumber: validateIf(\n isValidSwedishOrganizationNumber,\n !isLoggedIn\n ),\n },\n\n address: { requiredIf: reqAddress },\n address2: { optional },\n postalCode: { requiredIf: reqAddress },\n city: { requiredIf: reqAddress },\n email: {\n email,\n required,\n },\n phone: {\n phone: () => this.fields.phoneIsValid,\n requiredIf: requiredIf(() => isLoggedIn !== true),\n },\n\n showShippingFields: { optional },\n shippingFirstName: { requiredIf: reqShippingAddress },\n shippingLastName: { requiredIf: reqShippingAddress },\n shippingAddress: { requiredIf: reqShippingAddress },\n shippingAddress2: { optional },\n shippingPostalCode: { requiredIf: reqShippingAddress },\n shippingCity: { requiredIf: reqShippingAddress },\n\n payment: { required },\n swishPhone: {\n requiredIf: requiredIf(() => this.isSwishPhone),\n validateSwishPhone: () => this.fields.swishPhoneIsValid || !this.isSwishPhone\n },\n\n bank: {\n requiredIf: requiredIf(() => !this.showAccountFields)\n },\n bankAccountNumberSelected: {\n requiredIf: requiredIf(() => !this.showAccountFields)\n },\n clearingNo: {\n requiredIf: requiredIf(() => this.showAccountFields),\n validateClearingNo: validateIf(\n isClearingNo,\n this.showAccountFields,\n )\n },\n accountNo: {\n requiredIf: requiredIf(() => this.showAccountFields),\n validateClearingNo: validateIf(\n isAccountNo,\n this.showAccountFields,\n )\n },\n\n certificate: { optional },\n certificateOther: { optional },\n certificateName: {\n requiredIf: requiredIf(() => this.showCertificateName)\n },\n certificateImageId: {\n requiredIf: requiredIf(\n () => this.certificateImagesAreSelectable\n )\n },\n certificateFromName: {\n requiredIf: requiredIf(() => certificateShowFromName),\n validateRequiredFromName: validateIf(\n maxLength(certificateFromMaxLength),\n certificateShowFromName,\n )\n },\n certificateMessage: {\n requiredIf: requiredIf(() => this.showCertificateName),\n maxLength: maxLength(this.certificateTextMaxLength),\n maxRows: maxRows(this.certificateTextMaxRows)\n },\n\n recipientEmail: {\n requiredIf: requiredIf(() => this.isOtherCertificate),\n validateRequiredEmail: validateIf(\n email,\n this.isOtherCertificate\n )\n },\n recipientSelect: { optional },\n recipientDate: {\n requiredIf: requiredIf(() => this.isPrintCertificate),\n validateRequiredDate: validateIf(\n isDate,\n this.isPrintCertificate\n ),\n validateRequiredMinToday: validateIf(\n isMinToday,\n this.isPrintCertificate\n )\n },\n recipientSelectedDate: { optional },\n recipientName: {\n requiredIf: requiredIf(() => this.isPrintCertificate)\n },\n recipientAddress: {\n requiredIf: requiredIf(() => this.isPrintCertificate)\n },\n recipientAddress2: { optional },\n recipientPostalCode: {\n requiredIf: requiredIf(() => this.isPrintCertificate)\n },\n recipientCity: {\n requiredIf: requiredIf(() => this.isPrintCertificate)\n },\n memorialOrderData: { optional },\n\n },\n groups: this.groups,\n forms: forms\n };\n },\n\n watch: {\n fields: {\n handler() {\n this.setStore();\n this.groupError = Object.assign({}, defaultGroups);\n },\n deep: true\n },\n 'fields.payment'(val) {\n this.isSwishPhone = val === 'swish';\n },\n 'fields.amount'() {\n this.updateTotalCost();\n },\n 'fields.customAmount'() {\n this.updateTotalCost();\n },\n 'fields.certificateOther'(val) {\n this.isOtherCertificate = val;\n },\n 'fields.certificate'(val) {\n this.isPrintCertificate = val;\n\n this.updateTotalCost();\n },\n 'billectaBankIdAutoStartToken'(val) {\n this.bankIdUrl = val\n ? 'bankid:///?autostarttoken=' + val + '&redirect=null'\n : '';\n\n if (this.bankIdUrl && app.billectaCurrentDevice) {\n if (!this.openBankIDOnCurrentDevice) {\n this.openBankIDOnCurrentDevice = true;\n window.location.href = this.bankIdUrl;\n }\n }\n },\n 'fields.quantity'() {\n this.updateTotalCost();\n },\n 'fields.certificateImageId'() {\n const image = this.findCertificateImage(\n this.fields.certificateImageId\n );\n if (image) {\n this.selectedCertificateImage = image;\n this.selectedCertificateImageStyle = {\n backgroundImage: `url('${image.src}')`\n };\n }\n },\n 'fields.recipientSelectedDate'() {\n this.memorialOrderDateSelected(this.fields);\n },\n },\n\n filters: {\n convertLineBreaks: val => {\n const str = $('
')\n .html(val)\n .text();\n return str.replace(new RegExp('\\r?\\n', 'g'), '
');\n },\n formatAmount: val => {\n let amount = parseFloat(val);\n if (isNaN(amount)) {\n amount = 0;\n }\n\n const options = {\n currency: currency,\n style: 'currency'\n };\n\n if (!allowDecimalAmounts) {\n options.minimumFractionDigits = 0;\n options.maximumFractionDigits = 0;\n }\n return amount.toLocaleString(locale, options);\n }\n },\n\n created: function() {\n const store = JSON.parse(this.$store.get(this.type));\n if (isClimateCompensation) {\n store.fields.amount = this.amounts[0];\n }\n\n // If store exists and not expired, remove and reset order data to storage\n if (store && store.expire > Date.now()) {\n if (type === 'checkout') {\n // Since we read amount from sessions the local storage value may not be\n // correct on pageload for cart checkouts\n store.fields.amount = this.fields.amount;\n }\n\n this.xhrStatusOrderStatus = XHR_STATUS_LOADING;\n\n if (store.validateOnCreate) {\n this.$v.fields.$touch();\n }\n\n this.$store.remove(this.type);\n\n // Set order id if received from backend\n if (this.orderId !== '') {\n store.orderId = this.orderId;\n }\n\n // If user goes back from payment the same order should be updated\n // But only if order hasn't a successful payment\n if (store.orderId !== '') {\n this.getOrderStatus(store.orderId)\n .then(status => {\n this.xhrStatusOrderStatus = XHR_STATUS_IDLE;\n if (status === 'pending') {\n this.setData(store);\n } else if(status === 'cancelled') {\n // Remove order id, but keep order info\n store.orderId = '';\n this.setData(store);\n }\n })\n .catch(e => {\n this.xhrStatusOrderStatus = XHR_STATUS_ERROR;\n logger.error('Donation.getOrderStatus failed', e);\n });\n } else {\n this.xhrStatusOrderStatus = XHR_STATUS_IDLE;\n this.setData(store);\n }\n } else { // Store doesn't exist or is expired\n this.xhrStatusOrderStatus = XHR_STATUS_IDLE;\n }\n\n if (isTreeOrder) {\n this.onTreeCountUpdate();\n }\n\n if (this.$store.get('billectaBankAccountPublicId')) {\n this.getBankAccounts();\n }\n },\n\n methods: {\n onChangeFocusOut (e) {\n if(e.target.name === 'certificateName'){\n this.getMemorialOrderData(this.fields.certificateName, this.fields);\n }\n },\n onChangeAmount: function(_e) {\n this.useCustomAmount = false;\n this.hideFieldError = '';\n },\n onClickCustomAmount: function() {\n if (!this.useCustomAmount) {\n this.$refs.inputCustomAmount.focus();\n this.fields.amount = this.fields.customAmount;\n this.useCustomAmount = true;\n this.hideFieldError = '';\n }\n },\n onInputCustomAmount: function() {\n this.fields.amount = this.fields.customAmount;\n this.hideFieldError = 'customAmount';\n },\n onChangeCustomAmount: function() {\n this.fields.amount = this.fields.customAmount;\n this.hideFieldError = '';\n },\n onInputField: function(e) {\n if (this.$v.fields[e.target.name].$error) {\n this.hideFieldError = e.target.name;\n }\n if (e.target.name === 'treeCount') {\n this.onTreeCountUpdate();\n }\n },\n onChangeField: function(e) {\n this.hideFieldError = '';\n this.$v.fields[e.target.name].$touch();\n if (e.target.name === 'swishPhone') {\n this.onSwishPhoneChange();\n }\n if (e.target.name === 'phone') {\n this.copyPhoneToSwish();\n }\n },\n formatSSN: function() {\n let value = this.fields.ssn.replace(/\\D/g, '');\n if (value.length === 10) {\n let prefix = '19';\n const date = new Date();\n const currentYear = date\n .getFullYear()\n .toString()\n .substring(2);\n const ssnYear = this.fields.ssn.substring(0, 2);\n if (parseInt(ssnYear) <= parseInt(currentYear)) {\n prefix = '20';\n }\n return `${prefix}${value}`;\n }\n\n return value;\n },\n\n toggleAddress: function() {\n this.showAddressFields = !this.showAddressFields;\n if (this.showAddressFields && this.$v.fields.ssn.$invalid) {\n this.fields.ssn = '';\n }\n if (this.showAddressFields) {\n this.showObfuscatedAddress = false;\n this.showMissingAddressError = false;\n }\n this.showSparError = false;\n this.setStore();\n },\n toggleAccount: function() {\n this.showAccountFields = !this.showAccountFields;\n this.setStore();\n },\n togglePreviewModal: function() {\n this.showPreviewModal = !this.showPreviewModal;\n $('body,html').toggleClass(\n 'js-state-no-scroll',\n this.showPreviewModal\n );\n },\n togglePreviewType: function(type) {\n this.previewType = type;\n },\n onEnterSection: function(el, done) {\n V(el.parentElement, 'scroll', {\n duration: 500,\n offset: -100,\n delay: 200\n });\n V(el, 'slideDown', { duration: 500, complete: done });\n },\n onAfterEnterSection: function(el) {\n V(el.parentElement, 'scroll', { duration: 500, offset: -100 });\n },\n onLeaveSection: function(el, done) {\n V(el, 'slideUp', { duration: 200, complete: done });\n },\n onEnterExpandable: function(el, done) {\n V(el, 'slideDown', {\n duration: 300,\n easing: 'easeOutQuart',\n complete: done\n });\n },\n onLeaveExpandable: function(el, done) {\n V(el, 'slideUp', {\n duration: 200,\n easing: 'easeOutQuart',\n complete: done\n });\n },\n onClickChangeSection: function(section) {\n this.activeSection = section;\n this.setStore();\n },\n onClickNextSection: function(section = false) {\n this.$v.groups[section].$touch();\n\n if (!section) {\n this.activeSection = '';\n return;\n }\n\n this.touchedGroups[section] = true;\n\n if (this.$v.groups[section].$invalid) {\n this.groupError[section] = true;\n\n if (\n section === 'personal' &&\n !this.showAddressFields &&\n this.$v.fields.sparId.$invalid\n ) {\n this.showMissingAddressError = true;\n }\n return;\n }\n\n this.groupError[section] = false;\n\n this.trackOnClickNextSection(section);\n\n const currentIndex = this.sections.indexOf(this.activeSection);\n const nextItems = this.sections.slice(currentIndex + 1);\n const nextUntouchedItem = nextItems.find(x => {\n return !this.touchedGroups[x] || this.$v.groups[x].$invalid;\n });\n this.activeSection = nextUntouchedItem;\n this.setStore();\n },\n\n onClickAddress() {\n if (!this.fields.ssn.length || this.$v.fields.ssn.$invalid) {\n logger.error(\n 'User tried to get address without a SSN, should not be possible'\n );\n return;\n }\n\n this.showAddressFields = false;\n this.showObfuscatedAddress = false;\n this.showSparLoader = true;\n this.showSparError = false;\n this.showMissingAddressError = false;\n\n getSparPerson(this.formatSSN())\n .then(response => {\n this.showObfuscatedAddress = true;\n this.showSparLoader = false;\n this.showSparError = false;\n this.fields.sparId = response.sparId;\n this.obfuscatedAddress = response.obfuscate;\n })\n .catch(e => {\n logger.error('getSparPerson failed', e);\n this.showObfuscatedAddress = false;\n this.showSparLoader = false;\n this.showSparError = true;\n this.fields.sparId = '';\n });\n },\n onSwishPhoneChange() {\n if (this.allowSwishPhoneOverride) {\n this.allowSwishPhoneOverride = false;\n }\n },\n copyPhoneToSwish() {\n // Only copy regular phone number if country code also is swedish\n const allowCopy =\n this.fields.swishPhone === '' &&\n this.allowSwishPhoneOverride;\n if (\n allowCopy &&\n this.fields.phoneCountry &&\n this.fields.phoneCountry.iso2 === 'se'\n ) {\n this.fields.swishPhone = this.fields.phone;\n }\n },\n onTreeCountUpdate(diff = 0) {\n const count = parseInt(this.fields.treeCount) + diff;\n if (count > 0) {\n this.fields.treeCount =\n parseInt(this.fields.treeCount) + diff;\n }\n this.fields.quantity = parseInt(this.fields.treeCount);\n },\n onClickChangeDonation(type, url) {\n // Set store for the type to navigate to\n this.setStore(type, true);\n window.location.href = url;\n },\n parseParamsToQuery(params) {\n const arr = Object.keys(params)\n .filter(p => params[p] !== '')\n .map(p => `${p}=${params[p]}`);\n\n if (arr.length <= 0) {\n return '';\n }\n return '?' + arr.join('&');\n },\n parseQueryToParams(query) {\n let params = {};\n query\n .replace('?', '')\n .split('&')\n .map(q => {\n const p = q.split('=');\n params[p[0]] = p[1] || '';\n });\n return params;\n },\n findCertificateImage(imageId) {\n if (imageId === null || this.certificateImages === undefined) {\n return {};\n }\n\n const id = parseInt(imageId);\n const image = this.certificateImages.find(x => {\n return x.ID === id;\n });\n return image || {};\n },\n getCertificateImageUrl(imageId) {\n if (!certificateImagesAreSelectable) return {};\n\n const image = this.findCertificateImage(imageId);\n return image.src || {};\n },\n clickSubmit(val, currentDevice = false) {\n this.currentSubmit = val;\n this.currentDevice = currentDevice;\n this.showBankIDLoadingSpinner = true;\n\n if (this.type === 'checkout') {\n trackCart('checkout', {step: 4}, cartInfo)\n }\n },\n onSubmit(e) {\n // Follow formactions on certain actions\n if(['certificate-pdf', 'update-cart'].indexOf(this.currentSubmit) !== -1) {\n return;\n }\n\n e.preventDefault();\n\n if (this.$v.forms.section.$invalid) {\n this.error = true;\n return;\n }\n this.error = false;\n\n const data = this.prepareData();\n\n this.xhrStatusSubmit = XHR_STATUS_LOADING;\n\n V(this.$refs.loaderScrollTo, 'scroll', {\n duration: 500,\n offset: 0,\n delay: 200\n });\n this.$refs.submitButton.blur();\n\n if (this.currentDevice){\n this.openBankIDOnCurrentDevice = false;\n this.billectaBankIdAutoStartToken = null;\n }\n\n this.maybeGetFingerprint(this.type, data, this.currentDevice)\n .then(_response => this.submitDonation(data))\n .then(response => {\n window.location = response.redirect;\n this.showBankIDLoadingSpinner = false;\n })\n .catch(e => {\n logger.error('Donation.maybeGetFingerprint failed', e);\n this.xhrStatusSubmit = XHR_STATUS_ERROR;\n this.submitErrorMessage = e.message;\n this.showBankIDLoadingSpinner = false;\n });\n },\n submitDonation(data) {\n this.xhrStatusSubmit = XHR_STATUS_LOADING;\n\n if (this.digitalSignature) {\n data.digitalSignature = this.digitalSignature;\n }\n\n return new Promise((resolve, reject) => {\n const url = '/wp-json/donation/v1/donation/';\n http.post(url, data)\n .then(response => {\n if(response.orderId) {\n this.orderId = response.orderId;\n }\n this.setStore();\n\n if(response.error || !response.redirect) {\n reject(response);\n this.xhrStatusSubmit = XHR_STATUS_ERROR;\n } else {\n resolve(response);\n }\n })\n .catch(e => {\n logger.error('Donation.submitDonation failed', e);\n this.xhrStatusSubmit = XHR_STATUS_ERROR;\n reject(e);\n });\n });\n },\n\n maybeGetFingerprint(_data, data, currentDevice) {\n this.xhrStatusMessageType = this.type;\n\n return new Promise((resolve, reject) => {\n if (isMonthlyOrder) {\n billecta\n .getSigningFingerprint(this.formatSSN(), currentDevice)\n .then(response => {\n this.billectaQRCode = null;\n this.billectaIsPolling = false;\n this.billectaBankIdAutoStartToken = null;\n this.digitalSignature = JSON.stringify(\n response\n );\n })\n .then(_response => {\n resolve();\n })\n .catch(e => {\n this.billectaQRCode = null;\n this.billectaIsPolling = false;\n this.billectaBankIdAutoStartToken = null;\n reject(e);\n });\n } else {\n resolve();\n }\n });\n },\n updateTotalCost() {\n let total = this.fields.amount * this.fields.quantity;\n if (isCertificateOrder && this.isPrintCertificate) {\n total += this.certificatePrintCost;\n }\n this.totalCost = total;\n },\n\n setStore(type = this.type, validateOnCreate = false) {\n const store = {\n fields: Object.assign({}, this.fields),\n\n useCustomAmount: this.useCustomAmount,\n showAddressFields: this.showAddressFields,\n showAccountFields: this.showAccountFields,\n showObfuscatedAddress: this.showObfuscatedAddress,\n obfuscatedAddress: this.obfuscatedAddress,\n allowSwishPhoneOverride: this.allowSwishPhoneOverride,\n\n billectaBankAccountPublicId: this.billectaBankAccountPublicId,\n\n touchedGroups: this.touchedGroups,\n activeSection: this.activeSection,\n\n orderId: this.orderId,\n\n expire: Date.now() + 3600000\n };\n\n // Reset some fields that should not be stored\n store.fields.bankAccountNumberSelected = '';\n store.fields.clearingNo = '';\n store.fields.accountNo = '';\n\n if (validateOnCreate) {\n store.validateOnCreate = true;\n }\n\n // Save to local storage\n this.$store.set(type, JSON.stringify(store));\n },\n\n getBankAccountsThisDevice() {\n this.showBankIDLoadingSpinner = true;\n this.getBankAccounts(false)\n },\n getBankAccountsOtherDevice() {\n this.showBankIDLoadingSpinner = true;\n this.getBankAccounts(true)\n },\n getBankAccounts(otherDevice = false) {\n\n if (!this.fields.bank) {\n logger.error('Bank is not selected');\n return;\n }\n\n if (!this.fields.ssn.length || this.$v.fields.ssn.$invalid) {\n logger.error(\n 'User tried to get their bank accounts without a SSN, should not be possible'\n );\n return;\n }\n\n this.showAccountFields = false;\n this.xhrStatusBankAccount = XHR_STATUS_LOADING;\n\n const ongoingRequestPublicId = this.$store.get('billectaBankAccountPublicId');\n\n const promise = ongoingRequestPublicId\n ? billecta.resumeBankAccount(ongoingRequestPublicId)\n : billecta.getBankAccounts(this.fields.bank, this.formatSSN(), otherDevice);\n\n promise.then(response => {\n this.billectaQRCode = null;\n this.billectaIsPolling = false;\n this.billectaBankIdAutoStartToken = null;\n this.$store.remove('billectaBankAccountPublicId');\n if (response.length) {\n this.xhrStatusBankAccount = XHR_STATUS_SUCCESS;\n this.bankAccountNumbers = response;\n } else {\n this.xhrStatusBankAccount = XHR_STATUS_EMPTY;\n }\n this.showBankIDLoadingSpinner = false;\n })\n .catch(e => {\n this.xhrStatusBankAccount = XHR_STATUS_ERROR;\n this.billectaQRCode = null;\n this.billectaIsPolling = null;\n this.billectaBankIdAutoStartToken = null;\n this.$store.remove('billectaBankAccountPublicId');\n logger.error('billecta.getBankAccounts failed', e);\n this.showBankIDLoadingSpinner = false;\n logger.error('Donation.getOrderStatus failed', e);\n });\n },\n\n getOrderStatus(orderId) {\n return new Promise((resolve, reject) => {\n http.get('/wp-json/transaction/v1/status/' + orderId)\n .then(x => {\n if (!x.success) {\n reject(x);\n } else if (x.status) {\n resolve(x.status);\n } else {\n reject(x);\n }\n })\n .catch(x => {\n reject(x);\n });\n });\n },\n\n updateFields: function(data) {\n Object.keys(data).map(key => {\n let value = data[key];\n if (value === 'false') {\n value = false;\n } else if (value === 'true') {\n value = true;\n }\n this.fields[key] = value;\n });\n },\n\n setData: function(data) {\n this.orderId = data.orderId;\n // this.isLoggedIn = data.isLoggedIn;\n\n this.fields = data.fields;\n this.useCustomAmount = data.useCustomAmount;\n\n this.isOtherCertificate = data.isOtherCertificate;\n this.isPrintCertificate = data.isPrintCertificate;\n\n this.showAddressFields = data.showAddressFields;\n this.showAccountFields = data.showAccountFields;\n this.showObfuscatedAddress = data.showObfuscatedAddress;\n this.obfuscatedAddress = data.obfuscatedAddress;\n this.allowSwishPhoneOverride = data.allowSwishPhoneOverride;\n\n this.touchedGroups = data.touchedGroups;\n\n if (!this.showAddressFields && !this.$v.fields.ssn.$invalid && !this.obfuscatedAddress) {\n this.showMissingAddressError = true;\n }\n\n // Open the first section which is either active or invalid\n const group = sections.find(s => {\n return (\n this.$v.groups[s].$invalid || data.activeSection === s\n );\n });\n if (group !== undefined) {\n this.activeSection = group;\n }\n },\n\n\n prepareData() {\n const fields = this.fields;\n\n const data = {\n orderId: this.orderId,\n postId: this.postId,\n customerId: customerId,\n type: this.type,\n campaignCode: this.campaignCode,\n amount: this.useCustomAmount\n ? parseInt(fields.customAmount)\n : fields.amount,\n email: fields.email,\n phone: fields.phone,\n phoneCountry: fields.phoneCountry,\n phoneSanitized: fields.phoneSanitized,\n quantity: fields.quantity,\n leadGuid,\n };\n\n // Force total cost to make sure it is same as displayed on frontend\n if (isClimateCompensation) {\n data.totalCost = Math.round(this.totalCost);\n }\n\n if (this.showAddressFields || isCompanyOrder) {\n data.firstName = fields.firstName;\n data.lastName = fields.lastName;\n data.address = fields.address;\n data.address2 = fields.address2;\n data.postalCode = fields.postalCode;\n data.city = fields.city;\n } else if (!this.showAddressFields && !isCompanyOrder) {\n data.sparId = fields.sparId;\n }\n\n if (this.fields.showShippingFields) {\n data.shippingFirstName = fields.shippingFirstName;\n data.shippingLastName = fields.shippingLastName;\n data.shippingAddress = fields.shippingAddress;\n data.shippingAddress2 = fields.shippingAddress2;\n data.shippingPostalCode = fields.shippingPostalCode;\n data.shippingCity = fields.shippingCity;\n }\n\n if (isMonthlyOrder) {\n data.payment = 'automatic_payment_gateway';\n data.bank = fields.bank;\n data.legalAgreement = legalAgreement;\n\n if (this.showAccountFields) {\n data.clearingNo = fields.clearingNo;\n data.accountNo = fields.accountNo;\n } else {\n const account = this.bankAccountNumbers[\n fields.bankAccountNumberSelected\n ];\n data.clearingNo = account.clearingNo;\n data.accountNo = account.accountNo;\n }\n } else {\n data.payment = fields.payment;\n }\n\n if (isCompanyOrder) {\n data.companyName = fields.companyName;\n data.companyRegistrationNumber =\n fields.companyRegistrationNumber;\n } else {\n data.ssn = fields.ssn;\n }\n\n if (isCertificateOrder) {\n if (this.isPrintCertificate) {\n data.certificate = 'print';\n } else {\n data.certificate = 'digital';\n }\n\n data.certificateMessage = fields.certificateMessage;\n data.certificateName = fields.certificateName;\n data.certificateFromName = fields.certificateFromName;\n data.certificateImageId = fields.certificateImageId;\n\n if (this.isOtherCertificate) {\n data.certificateOther = 'digital';\n data.recipientEmail = fields.recipientEmail;\n }\n if (this.isPrintCertificate) {\n data.recipientSelect = fields.recipientSelect;\n data.recipientDate = fields.recipientDate;\n data.recipientSelectedDate = fields.recipientSelectedDate;\n data.recipientName = fields.recipientName;\n data.recipientAddress = fields.recipientAddress;\n data.recipientAddress2 = fields.recipientAddress2;\n data.recipientPostalCode = fields.recipientPostalCode;\n data.recipientCity = fields.recipientCity;\n }\n }\n\n if (isTreeOrder) {\n data.treeCount = fields.treeCount;\n }\n\n if (fields.payment === 'swish') {\n data.swishPhone = fields.swishPhone;\n data.swishPhoneCountry = fields.swishPhoneCountry;\n data.swishPhoneSanitized = fields.swishPhoneSanitized;\n }\n\n return data;\n },\n\n trackOnClickNextSection(group) {\n let category = GIFT_TYPE_TRACKING_NAMES[this.type];\n if(this.trackingName !== '' && this.trackingName !== null) {\n category = trackingName;\n }\n const action = SECTION_TRACKING_NAMES[group];\n\n let label = null;\n if (action === 'belopp') {\n label = this.fields.amount * this.fields.quantity;\n } else if (action === 'betalsatt') {\n label = this.fields.payment;\n } else if (action === 'gavobevis') {\n // Change\n if (this.isPrintCertificate) {\n label = 'tryckt';\n } else {\n label = 'digitalt';\n }\n } else if (\n action === 'personuppgifter' ||\n action === 'foretagsuppgifter' ||\n action === 'autogiroregistrering'\n ) {\n label = '';\n }\n\n if (category !== 'checkout') {\n trackEvent('checkoutSteps', category, action, label);\n } else {\n let step = 0;\n switch (action) {\n case 'varukorg':\n step = 1;\n break;\n case 'personuppgifter':\n case 'foretagsuppgifter':\n step = 2;\n break;\n case 'betalsatt':\n step = 3;\n break;\n }\n\n trackCart('checkout', {step: step}, cartInfo)\n }\n },\n\n getMemorialOrderData: function(name, fields) {\n fetch('/wp-json/memorial/v1/name/'+name)\n .then(response => response.json())\n .then(data => {\n fields.memorialOrderData = data;\n });\n },\n\n memorialOrderDateSelected: function(fields) {\n $.each(fields.memorialOrderData, function(_key, value) {\n if(fields.recipientSelectedDate === value.orderId) {\n fields.recipientDate = value.recipientDate;\n fields.recipientName = value.recipientName;\n fields.recipientAddress = value.recipientAddress1;\n fields.recipientAddress2 = value.recipientAddress2;\n fields.recipientPostalCode = value.recipientPostalCode;\n fields.recipientCity = value.recipientCity;\n }\n })\n\n },\n }\n });\n\n // This will enable the button in the UI when AutoStartToken is received OR after few seconds.\n // it is implemented like this because we do not know if the bank supports AutoStartToken or not\n let _pollingTimeout = null;\n billectaEventListener.onReceivedSigningFingerprintStatus = () => {\n if (!app.billectaIsPolling && _pollingTimeout === null) {\n setTimeout(() => {\n app.billectaIsPolling = true;\n _pollingTimeout = null;\n }, 9500)\n }\n }\n\n billectaEventListener.onReceivedBankAccountStatus = () => {\n if (!app.billectaIsPolling && _pollingTimeout === null) {\n // Some banks are rather slow with generating the autostarttoken, 9500 should give the app\n // 3 polls to before lighting the button. Hopefully we have the token by then.\n setTimeout(() => {\n app.billectaIsPolling = true;\n _pollingTimeout = null;\n }, 9500);\n }\n }\n\n billectaEventListener.onReceivedBankAccountInititate = (publicId) => {\n app.$store.set('billectaBankAccountPublicId', publicId);\n }\n\n billectaEventListener.onReceivedCurrentDevice = (currentDevice) => {\n app.billectaCurrentDevice = currentDevice;\n }\n\n billectaEventListener.onReceivedQR = (qr) => {\n app.billectaQRCode = qr\n app.billectaIsPolling = true\n }\n\n billectaEventListener.onReceivedBankIdAutoStartToken = (token) => {\n app.billectaBankIdAutoStartToken = token\n app.billectaIsPolling = true\n }\n};\n\nexport default Donation;\n","import * as Sentry from '@sentry/browser';\nimport { Integrations } from \"@sentry/tracing\";\n\nexport function init() {\n Sentry.init({\n ...window.SENTRY_SDK_CONFIG,\n\n integrations: [new Integrations.BrowserTracing()],\n });\n}\nexport default class Logger {\n error(message, extra = null) {\n if (extra) {\n Sentry.setContext('error context', {extra})\n }\n Sentry.captureMessage(message, Sentry.Severity.Error);\n }\n}\n\n","import http from './http'\n\nfunction getSparPerson(ssn) {\n const url = '/wp-json/spar/v1/obfuscate/ssn/' + ssn\n return new Promise((resolve, reject) => {\n http.post(url).then(x => {\n if(!x.success) {\n reject(x);\n } else {\n let address = x.obfuscate.currentAddress.Utdelningsadress2;\n let address2 = '';\n if(x.obfuscate.currentAddress.Utdelningsadress1) {\n address2 = address;\n address = x.obfuscate.currentAddress.Utdelningsadress1;\n }\n\n resolve({\n sparId: x.spar_id,\n obfuscate: {\n firstName: x.obfuscate.personDetails.Fornamn,\n lastName: x.obfuscate.personDetails.Efternamn,\n address: address,\n address2: address2,\n postalCode: x.obfuscate.currentAddress.PostNr,\n city: x.obfuscate.currentAddress.Postort,\n }\n });\n }\n }).catch(x => reject(x))\n })\n}\n\nexport default getSparPerson\n","/* global $ */\n\nconst toggleShare = function($el) {\n const url = $el.data('url');\n\n let style = 'toolbar,scrollbars,resizable,top=100,left=100,width=800';\n style += ',height=500';\n\n window.open(url, '_blank', style);\n}\n\nexport default {\n toggleShare\n}\n","import copy from 'clipboard-copy';\n\nconst copyData = ($el) => {\n const text = $el.data('copy');\n\n $el.addClass('js-state-copied');\n copy(text);\n\n setTimeout(() => {\n $el.removeClass('js-state-copied');\n }, 10000);\n\n}\n\nexport default {\n copyData\n}","/* global $ */\n\nconst Video = (el) => {\n const $el = $(el);\n\n $el.click((e) => {\n const iframe = $el.find('iframe')[0];\n if (!iframe) {\n return;\n }\n\n e.preventDefault();\n $el.addClass('js-state-video-active');\n iframe.src += '&autoplay=1';\n\n });\n};\n\nexport default Video;\n","/* global $, server_resp */\n\nimport http from './http'\nimport { awaitPollStatus } from \"./utils\";\n\nconst Checkout = () => {\n const {\n type,\n paymentMethod,\n orderId,\n completedUrl,\n paymentUrl,\n } = checkoutLoader;\n if(type !== 'swish' && type !== 'payex') {\n return;\n }\n\n const func = type === 'swish' ? pollSwish : pollPayex;\n\n awaitPollStatus(func, orderId, 3 * 60 * 1000, 3000).then(x => {\n window.location = completedUrl;\n }).catch(x => {\n window.location = paymentUrl;\n });\n};\n\nconst pollPayex = (orderId) => {\n return new Promise((resolve, reject) => {\n http.get('/wp-json/transaction/v1/status/' + orderId).then(x => {\n if(!x.success) {\n reject('reject');\n } else if(x.status === 'completed') {\n resolve(x);\n } else if(x.status === 'pending') {\n resolve('repeat');\n } else {\n reject('reject');\n }\n }).catch(x => {\n reject(x);\n });\n });\n};\n\nconst pollSwish = (orderId) => {\n\treturn new Promise((resolve, reject) => {\n\t\thttp.get('/wp-json/transaction/v1/status/' + orderId).then(x => {\n\t\t\tif(!x.success) {\n\t\t\t\treject('reject');\n\t\t\t} else if(x.status === 'completed') {\n\t\t\t\tresolve(x);\n\t\t\t} else if(x.status === 'pending') {\n\t\t\t\tresolve('repeat');\n\t\t\t} else {\n\t\t\t\treject('reject');\n\t\t\t}\n\t\t}).catch(x => {\n\t\t\treject(x);\n\t\t});\n\t});\n};\n\nexport default Checkout;\n","/* global $ */\n\nconst CertificateForm = (el) => {\n const self = this;\n\n const $el = $(el);\n const $form = $el.closest('form');\n $el.find('#certificateOther').change(function(e) {\n const show = $(this).is(':checked');\n $el.find($(this).data('toggle')).slideToggle(show);\n });\n\n const $msgField = $el.find('[name=certificateMessage]');\n const $fromField = $el.find('[name=certificateFromName]');\n const $quantityField = $form.find('[name=quantity]');\n\n const $modal = $el.find('.js-modal');\n $el.find('.js-modal-open').click((e) => {\n e.preventDefault();\n $modal.fadeIn(() => {\n $modal.addClass('js-state-open');\n const message = $msgField.val().replace(/[\\r\\n]/g, '
');\n $el.find('.js-modal-message').html(message);\n\n const quantity = $quantityField.val();\n if(quantity > 1) {\n $el.find('.js-modal-quantity').show().find('span').text(quantity);\n } else {\n $el.find('.js-modal-quantity').hide().find('span').text('');\n }\n\n if($fromField.length) {\n const fromName = $fromField.val();\n const fromText = $fromField.data('text').replace('%s', fromName);\n $el.find('.js-modal-from-name').text(fromText);\n }\n });\n });\n\n $el.find('.js-modal-close').click(() => {\n $modal.removeClass('js-state-open');\n $modal.fadeOut('slow');\n });\n\n const $previewToggle = $el.find('.js-preview');\n $previewToggle.find('button').click(function(e) {\n e.preventDefault();\n const $btn = $(this);\n if($btn.hasClass('js-state-active')) {\n return;\n }\n\n const val = $btn.data('type');\n $previewToggle.find('button').removeClass('js-state-active');\n $btn.addClass('js-state-active');\n $previewToggle.find('[data-preview]').hide();\n $previewToggle.find(`[data-preview=\"${val}\"]`).show();\n });\n\n $msgField.change(() => {\n const value = $msgField.val();\n const maxRows = $msgField.data('maxrows') || 7;\n let error = false;\n if(value.split('\\n').length > maxRows) {\n error = true;\n }\n if(value === '' || value.length > $msgField.attr('maxlength')) {\n error = true;\n }\n\n showFieldError($msgField, error);\n });\n\n $fromField.change(() => {\n const value = $fromField.val();\n let error = false;\n if(value === '' || value.length > $fromField.attr('maxlength')) {\n error = true;\n }\n\n showFieldError($fromField, error);\n });\n};\n\nconst showFieldError = ($el, error) => {\n const $errorMsg = $el.next('.js-error-msg');\n if(error) {\n $errorMsg.slideDown();\n $el.addClass('js-state-error');\n } else {\n $el.removeClass('js-state-error');\n if($errorMsg.is(':visible')) {\n $errorMsg.slideUp();\n }\n }\n};\n\nconst DigitalCertificate = (el) => {\n const $el = $(el);\n const $more = $el.find('.js-certificate-more');\n $more.click(() => {\n $('html, body').animate({\n scrollTop: 80\n });\n });\n\n $(window).scroll(() => {\n const top = $(document).scrollTop();\n if(top >= 50) {\n $el.addClass('js-state-more-active');\n } else {\n $el.removeClass('js-state-more-active');\n }\n });\n};\n\nconst UnloadDigitalCertificate = (el) => {\n const $el = $(el);\n const $more = $el.find('.js-certificate-more');\n if($more.length) {\n $(window).scrollTop(0);\n }\n};\n\nexport { CertificateForm, DigitalCertificate, UnloadDigitalCertificate };\n","import { reloadSlider, goToSlide } from './slider';\n\nconst Gallery = (el) => {\n const $el = $(el);\n const $modal = $el.find('.js-modal');\n $el.find('.js-modal-open').click((e) => {\n e.preventDefault();\n\n const i = $(e.currentTarget).data('index');\n const $slider = $modal.find('.js-slider-list');\n\n $modal.fadeIn(() => {\n $modal.addClass('js-state-open');\n\n reloadSlider($slider);\n goToSlide($slider, i);\n });\n });\n\n $modal.find('.js-modal-close').click(() => {\n $modal.removeClass('js-state-open');\n $modal.fadeOut('slow');\n });\n}\n\nexport default Gallery;\n","// Import jquery like this for slick-carousel to work\nimport $ from 'jquery';\nimport 'slick-carousel';\n\nconst Slider = (el) => {\n var isIE11 = !!window.MSInputMethodContext && !!document.documentMode;\n if (isIE11) $('body').addClass('browser-IE');\n\n const $el = $(el);\n const $slider = $el.find('.js-slider-list');\n const $prev = $el.find('.js-slider-prev');\n const $next = $el.find('.js-slider-next');\n $slider.slick({\n centerMode: true,\n centerPadding: 0,\n nextArrow: $next,\n prevArrow: $prev,\n });\n}\n\nconst reloadSlider = (el) => {\n const $el = $(el);\n $el.slick('setPosition');\n}\n\nconst goToSlide = (el, i) => {\n const $el = $(el);\n $el.slick('slickGoTo', i);\n}\n\nexport { Slider, reloadSlider, goToSlide };\n","import {isValidSwedishOrganizationNumber, isValidSSN} from \"./donation/validators\";\n\nexport function wcValidationSwedishSSN() {\n const wrapper = $(this).closest('.form-row');\n if (isValidSSN($(this).val())) {\n wrapper.addClass('woocommerce-validated');\n } else {\n wrapper.addClass('woocommerce-invalid');\n }\n}\n\nexport function wcValidationSwedishOrganizationNumber() {\n const wrapper = $(this).closest('.form-row');\n if (isValidSwedishOrganizationNumber($(this).val())) {\n wrapper.addClass('woocommerce-validated');\n } else {\n wrapper.addClass('woocommerce-invalid');\n }\n}\n","/* global $ */\n\nlet videoBgPlayer = null;\nlet playerBgType = null;\nlet videoModalPlayer = null;\nlet playerModalType = null;\n\nlet youtubeApiPromise = null;\nlet vimeoApiPromise = null;\n\nconst parseUrl = url => {\n let a = document.createElement('a');\n a.href = url;\n return a;\n};\n\nconst injectJsApi = scriptUrl => {\n let tag = document.createElement('script');\n tag.src = scriptUrl;\n\n let firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n return new Promise(resolve => {\n tag.addEventListener('load', () => {\n resolve();\n });\n });\n};\n\nconst getDomElements = $el => {\n const $player = $('.js-video-player');\n const $modal = $('.js-video-modal');\n const $wrapper = $el.parent();\n const $controlButton = $('.js-video-control');\n const $modalButtonOpen = $('.js-video-modal-open');\n const $modalButtonClose = $modal.find('.js-video-modal-close');\n\n return {\n player: $player,\n modal: $modal,\n wrapper: $wrapper,\n controlButton: $controlButton,\n modalButtonOpen: $modalButtonOpen,\n modalButtonClose: $modalButtonClose,\n playText: $controlButton.data('play'),\n pauseText: $controlButton.data('pause'),\n };\n};\n\nwindow.youtubeReadyFunction = [];\n\nwindow.onYouTubeIframeAPIReady = function() {\n window.youtubeReadyFunction.map(x => x());\n}\n\nconst YouTubePlayer = async ($el, url, id, asBg = true) => {\n const urlParts = url.match(\n /(youtu\\.be\\/|youtube\\.com\\/(watch\\?(.*&)?v=|(embed|v)\\/))([^\\?&\"'>]+)/\n );\n const videoId = urlParts[5];\n await youtubeApiPromise;\n\n let $videoContainer = $(`#${id}`);\n $videoContainer.empty();\n\n let innerContainer = document.createElement('div');\n const videoContainerInnerId = (innerContainer.id = `${id}-inner`);\n const elements = getDomElements($el);\n\n $videoContainer.append(innerContainer);\n\n if(asBg) {\n window.youtubeReadyFunction.push(function() {\n playerBgType = 'youtube';\n window.player = videoBgPlayer = new window.YT.Player(videoContainerInnerId, {\n videoId: videoId,\n playerVars: {\n controls: 0,\n loop: 1,\n playlist: videoId,\n modestbranding: 1,\n showInfo: 0,\n mute: 1,\n rel: 0\n },\n events: {\n onReady: () => {\n videoBgPlayer.playVideo();\n setTimeout(() => {\n elements.wrapper.removeClass('paused');\n }, 800);\n },\n onStateChange: (state) => {\n if(state === 'playing') {\n showPauseButton(elements);\n elements.wrapper.removeClass('paused');\n } else if(state === 'paused') {\n showPlayButton(elements);\n }\n },\n }\n });\n });\n\n elements.controlButton.click(() => {\n if (videoBgPlayer.getPlayerState() === 1) {\n videoBgPlayer.pauseVideo();\n } else {\n videoBgPlayer.playVideo();\n }\n });\n\n if ($(window).width() < 768){\n videoBgPlayer.pauseVideo();\n showPlayButton(elements);\n }\n\n } else {\n window.youtubeReadyFunction.push(function() {\n playerModalType = 'youtube';\n window.modalPlayer = videoModalPlayer = new window.YT.Player(videoContainerInnerId, {\n videoId: videoId,\n playerVars: {},\n });\n });\n }\n};\n\nconst VimeoPlayer = async ($el, url, id, asBg = true) => {\n await vimeoApiPromise;\n\n let $videoContainer = $(`#${id}`);\n $videoContainer.empty();\n $videoContainer.addClass('FeaturedContent__VimeoVideoContainer');\n\n const elements = getDomElements($el);\n\n if(asBg) {\n let options = {\n url: url,\n loop: 1,\n autoplay: 1,\n background: 1,\n title: 0,\n byline: 0,\n controls: 0,\n muted: 1,\n quality: '4K',\n };\n\n playerBgType = 'vimeo';\n videoBgPlayer = new Vimeo.Player(id, options);\n\n videoBgPlayer.on('play', function() {\n elements.wrapper.removeClass('paused');\n showPauseButton(elements);\n });\n\n videoBgPlayer.on('pause', function() {\n showPlayButton(elements);\n });\n\n elements.controlButton.click(() => {\n videoBgPlayer.getPaused().then((paused) => {\n if(paused) {\n videoBgPlayer.play();\n } else {\n videoBgPlayer.pause();\n }\n });\n });\n\n if ($(window).width() < 768){\n videoBgPlayer.pause();\n showPlayButton(elements);\n }\n\n } else {\n let options = {\n url: url\n };\n\n playerModalType = 'vimeo';\n videoModalPlayer = new Vimeo.Player(id, options);\n }\n};\n\nconst showPauseButton = (elements) => {\n elements.controlButton.find('span').text(elements.pauseText)\n elements.controlButton.addClass('js-state-pause').removeClass('js-state-play');\n};\n\nconst showPlayButton = (elements) => {\n elements.controlButton.find('span').text(elements.playText)\n elements.controlButton.addClass('js-state-play').removeClass('js-state-pause');\n};\n\nconst initVideo = ($el, url, id, asBg = true) => {\n let player;\n if (url.indexOf('youtube.com') > -1) {\n player = YouTubePlayer;\n if (!youtubeApiPromise) {\n youtubeApiPromise = injectJsApi('//www.youtube.com/player_api');\n }\n } else if (url.indexOf('vimeo.com') > -1) {\n player = VimeoPlayer;\n if (!vimeoApiPromise) {\n vimeoApiPromise = injectJsApi('//player.vimeo.com/api/player.js');\n }\n } else {\n console.warn(\n `Error: video player functionality not implemented for provider: ${\n parseUrl(url).host\n }`\n );\n return;\n }\n\n player($el, url, id, asBg);\n};\n\nconst resizeVideo = () => {\n var iframeImage = $('.video-bg__player');\n\n $(window).on('load resize', function(){\n var w = $(window).width(),\n h = $(window).height();\n\n const isPortrait = w/h < 16/9;\n iframeImage.toggleClass('js-state-portrait', isPortrait);\n iframeImage.toggleClass('js-state-landscape', !isPortrait);\n\n });\n}\n\nconst VideoPlayer = el => {\n const $el = $(el);\n const url = $el.data('video-url');\n initVideo($el, url, 'video-bg');\n resizeVideo();\n};\n\nconst VideoModal = el => {\n const $el = $(el);\n const elements = getDomElements($el);\n\n const url = $el.find('iframe').attr('src');\n initVideo($el, url, 'video-modal', false);\n\n elements.modalButtonOpen.click(() => {\n elements.modal.addClass('js-state-open');\n $('body,html').addClass('js-state-no-scroll');\n if(videoBgPlayer) {\n if(playerBgType === 'vimeo') {\n videoBgPlayer.pause();\n } else if(playerBgType === 'youtube') {\n videoBgPlayer.pauseVideo();\n }\n }\n });\n\n elements.modalButtonClose.click(() => {\n elements.modal.removeClass('js-state-open');\n $('body,html').removeClass('js-state-no-scroll');\n if(videoBgPlayer) {\n if(playerBgType === 'vimeo') {\n videoBgPlayer.pause();\n } else if(playerBgType === 'youtube') {\n videoBgPlayer.pauseVideo();\n }\n }\n if(videoModalPlayer) {\n if(playerModalType === 'vimeo') {\n videoModalPlayer.pause();\n } else if(playerModalType === 'youtube') {\n videoModalPlayer.pauseVideo();\n }\n }\n });\n};\n\nexport { VideoPlayer, VideoModal };\n","\nconst showImage = (el) => {\n var windowHeight = $(window).height();\n $(el).each(function(){\n var thisPos = $(this).offset().top;\n var topOfWindow = $(window).scrollTop();\n if (topOfWindow + windowHeight - 200 > thisPos ) {\n $(this).addClass(\"fadeInImage\");\n }\n });\n}\n\nconst fadeImage = () => {\n $(document).ready(function(){\n showImage('img');\n });\n $(window).scroll(function() {\n showImage('img');\n });\n};\n\nexport default fadeImage;\n","import Vue from 'vue';\nimport Vuelidate from 'vuelidate';\nimport {\n decimal,\n numeric,\n required,\n requiredIf,\n} from 'vuelidate/lib/validators';\nimport Iti from 'intl-tel-input';\nimport Velocity from 'velocity-animate';\nimport http from './http';\nimport {\n validateIf,\n} from './donation/validators';\nimport {\n XHR_STATUS_IDLE,\n XHR_STATUS_LOADING,\n XHR_STATUS_ERROR,\n} from './donation/constants';\nimport Logger from './error-handler';\n\nlet V = Velocity;\n\nVue.use(Vuelidate);\n\nconst TMRegisterLead = _el => {\n // Settings from wp\n const {\n amounts,\n sectionsData,\n currency,\n locale,\n allowDecimalAmounts,\n pageUrl,\n pageId,\n minAmount,\n } = settings;\n\n const type = \"\";\n\n const defaultAmounts = [...amounts];\n const defaultAmount = defaultAmounts[1];\n\n const sections = Object.keys(sectionsData);\n const sectionValidate = sections\n .map(s => `groups.${s}`)\n //.concat('groups.gdpr');\n\n const forms = {\n section: sectionValidate\n };\n\n const defaultGroups = Object.assign(\n {},\n ...sections.map(i => ({ [i]: false }))\n );\n\n const intlTelUtils =\n 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.15/js/utils.js';\n const intlTelLoaded = window.intlTelInputGlobals.loadUtils(intlTelUtils);\n\n var _app = new Vue({\n el: '#tm-register-lead',\n directives: {\n intltelinput: {\n inserted: (el, _binding, vnode) => {\n const vueApp = vnode.context;\n const input = el.querySelector('input[type=\"tel\"]');\n const countryKey = `${input.name}Country`;\n const sanitizedKey = `${input.name}Sanitized`;\n\n let defaultCountry = 'SE';\n if (\n vueApp.fields &&\n vueApp.fields[countryKey] &&\n vueApp.fields[countryKey].iso2\n ) {\n defaultCountry = vueApp.fields[countryKey].iso2;\n }\n\n const options = {\n separateDialCode: true,\n initialCountry: defaultCountry\n };\n if (input.name === 'swishPhone') {\n options.onlyCountries = ['SE'];\n options.allowDropdown = false;\n } else {\n options.preferredCountries = ['SE'];\n }\n\n const iti = new Iti(input, options);\n\n intlTelLoaded.then(() => {\n vueApp.fields[sanitizedKey] = iti.getNumber();\n vueApp.fields[\n countryKey\n ] = iti.getSelectedCountryData();\n\n input.addEventListener('countrychange', () => {\n vueApp.fields[\n countryKey\n ] = iti.getSelectedCountryData();\n });\n });\n },\n update: (el, _binding, vnode) => {\n const input = el.querySelector('input[type=\"tel\"]');\n const countryKey = `${input.name}Country`;\n const sanitizedKey = `${input.name}Sanitized`;\n const isValidKey = `${input.name}IsValid`;\n\n const iti = window.intlTelInputGlobals.getInstance(input);\n\n vnode.context.fields[sanitizedKey] = iti.getNumber();\n vnode.context.fields[isValidKey] = window.intlTelInputUtils.isValidNumber(iti.getNumber());\n vnode.context.fields[\n countryKey\n ] = iti.getSelectedCountryData();\n }\n }\n },\n data: {\n type,\n amounts: defaultAmounts,\n minAmount,\n useCustomAmount: false,\n hideFieldError: '',\n activeSection: sections[0],\n sections: sections,\n fields: {\n amount: defaultAmount,\n phone: '',\n phoneSanitized: false,\n phoneIsValid: false,\n customAmount: '',\n },\n groups: {\n amount: ['fields.amount'],\n phone: ['fields.phone'],\n },\n touchedGroups: {...defaultGroups},\n groupError: {...defaultGroups},\n error: false,\n\n // XHR\n xhrStatusOrderStatus: XHR_STATUS_IDLE,\n xhrStatusBankAccount: XHR_STATUS_IDLE,\n xhrStatusSubmit: XHR_STATUS_IDLE,\n xhrStatusMessageType: type,\n submitErrorMessage: '',\n },\n validations() {\n return {\n fields: {\n amount: {\n decimal,\n minValue: v => v >= this.minAmount,\n required,\n },\n customAmount: {\n requiredIf: requiredIf(() => this.useCustomAmount),\n validateCustomAmount: validateIf(\n numeric,\n this.useCustomAmount\n )\n },\n phone: {\n validatePhone: () =>this.fields.phoneIsValid,\n required,\n }\n },\n groups: this.groups,\n forms: forms,\n }\n },\n watch: {\n },\n filters: {\n formatAmount: val => {\n let amount = parseFloat(val);\n if (isNaN(amount)) {\n amount = 0;\n }\n\n const options = {\n currency: currency,\n style: 'currency'\n };\n\n if (!allowDecimalAmounts) {\n options.minimumFractionDigits = 0;\n options.maximumFractionDigits = 0;\n }\n return amount.toLocaleString(locale, options);\n }\n },\n methods: {\n setData: function(data) {\n this.fields = data.fields;\n },\n onClickCustomAmount: function() {\n if (!this.useCustomAmount) {\n this.$refs.inputCustomAmount.focus();\n this.fields.amount = this.fields.customAmount;\n this.useCustomAmount = true;\n this.hideFieldError = '';\n }\n },\n onChangeAmount: function(_e) {\n this.useCustomAmount = false;\n this.hideFieldError = '';\n },\n onInputCustomAmount: function() {\n this.fields.amount = this.fields.customAmount;\n this.hideFieldError = 'customAmount';\n },\n onChangeCustomAmount: function() {\n this.fields.amount = this.fields.customAmount;\n this.hideFieldError = '';\n },\n onEnterSection: function(el, done) {\n V(el.parentElement, 'scroll', {\n duration: 500,\n offset: -100,\n delay: 200\n });\n V(el, 'slideDown', { duration: 500, complete: done });\n },\n onInputField: function(e) {\n if (this.$v.fields[e.target.name].$error) {\n this.hideFieldError = e.target.name;\n }\n },\n onChangeField: function(e) {\n this.hideFieldError = '';\n this.$v.fields[e.target.name].$touch();\n },\n onClickChangeSection: function(section) {\n this.activeSection = section;\n },\n onClickNextSection: function(section = false) {\n this.$v.groups[section].$touch();\n\n if (!section) {\n this.activeSection = '';\n return;\n }\n\n this.touchedGroups[section] = true;\n\n if (this.$v.groups[section].$invalid) {\n this.groupError[section] = true;\n\n if (\n section === 'personal' &&\n !this.showAddressFields &&\n this.$v.fields.sparId.$invalid\n ) {\n this.showMissingAddressError = true;\n }\n return;\n }\n\n this.groupError[section] = false;\n\n // this.trackOnClickNextSection(section);\n\n const currentIndex = this.sections.indexOf(this.activeSection);\n const nextItems = this.sections.slice(currentIndex + 1);\n const nextUntouchedItem = nextItems.find(x => {\n return !this.touchedGroups[x] || this.$v.groups[x].$invalid;\n });\n this.activeSection = nextUntouchedItem || 'gdpr';\n // this.setStore();\n },\n onAfterEnterSection: function(el) {\n V(el.parentElement, 'scroll', { duration: 500, offset: -100 });\n },\n onLeaveSection: function(el, done) {\n V(el, 'slideUp', { duration: 200, complete: done });\n },\n onEnterExpandable: function(el, done) {\n V(el, 'slideDown', {\n duration: 300,\n easing: 'easeOutQuart',\n complete: done\n });\n },\n onLeaveExpandable: function(el, done) {\n V(el, 'slideUp', {\n duration: 200,\n easing: 'easeOutQuart',\n complete: done\n });\n },\n onSubmit(e) {\n e.preventDefault();\n\n const fields = this.fields;\n const data = {\n amount: (\n this.useCustomAmount\n ? parseInt(fields.customAmount)\n : fields.amount\n ),\n phone: fields.phoneSanitized,\n submittedFrom: pageId,\n }\n\n this.xhrStatusSubmit = XHR_STATUS_LOADING;\n\n this.$refs.submitButton.blur();\n\n const url = '/wp-json/tm-lead/v1/lead/';\n http.post(url, data)\n .then(response => {\n if (response.error) {\n this.submitErrorMessage = response.message;\n this.xhrStatusSubmit = XHR_STATUS_ERROR;\n console.log('exti');\n return;\n }\n\n window.location = pageUrl+\"?success=1#tm-register-lead\";\n return response;\n })\n .catch(e => {\n this.submitErrorMessage = e.message;\n this.xhrStatusSubmit = XHR_STATUS_ERROR;\n });\n }\n }\n });\n}\n\nexport default TMRegisterLead;\n","/* global $ */\n/* eslint no-unused-vars: 0 */\nimport 'whatwg-fetch';\n\nimport Donation from './donation/donation';\nimport Agroforestry from './agroforestry';\nimport Cookie from './cookie';\nimport Share from './share';\nimport Copy from './copy';\nimport Video from './video';\nimport Checkout from './checkout';\nimport {\n CertificateForm,\n DigitalCertificate,\n UnloadDigitalCertificate\n} from './certificate';\nimport { MenuToggle } from './menu';\nimport { SiteListToggle } from './site-list-toggle';\nimport {ScrollLock} from './scroll-lock';\nimport tracking from './tracking';\nimport { Slider } from './slider';\nimport Gallery from './gallery';\nimport Submenu from './submenu';\nimport Minicart from './minicart';\nimport { init as initErrorHandler } from './error-handler';\nimport {\n wcValidationSwedishOrganizationNumber,\n wcValidationSwedishSSN\n} from './wc-validation';\nimport { VideoPlayer, VideoModal } from './video-player';\nimport FadeImage from './fade-image';\nimport TMRegisterLead from './tm-register-lead';\nimport EmbedMessage from './embed-message';\n\ninitErrorHandler();\n\nwindow.tracking = tracking;\n$(document).ready(() => {\n\n const $agroforestry = $('.js-agroforestry');\n if ($agroforestry.length) {\n $agroforestry.map((i, v) => Agroforestry(v));\n }\n\n const $cookie = $('.js-cookie');\n if ($cookie.length) {\n $cookie.map((i, v) => Cookie(v));\n }\n\n const $video = $('.js-video');\n if ($video.length) {\n $video.map((i, v) => Video(v));\n }\n\n const $checkout = $('.js-checkout-loader');\n if ($checkout.length) {\n Checkout();\n }\n\n const $certificateForm = $('.js-certificate-form');\n if ($certificateForm.length) {\n $certificateForm.map((i, v) => CertificateForm(v));\n }\n\n const $digitialCertificate = $('.js-digital-certificate');\n if ($digitialCertificate.length) {\n $digitialCertificate.map((i, v) => DigitalCertificate(v));\n }\n\n const $menuToggle = $('.js-menu-toggle, .js-menu-cover');\n if ($menuToggle.length) {\n $menuToggle.map((i, v) => MenuToggle(v));\n }\n\n const $siteListToggle = $('.js-site-toggle');\n if ($siteListToggle.length) {\n $siteListToggle.map((i, v) => SiteListToggle(v));\n }\n\n const $scrollLock = $('.js-menu-toggle, .js-menu-cover');\n if ($scrollLock.length) {\n $scrollLock.map((i, v) => ScrollLock(v));\n }\n\n const $slider = $('.js-slider');\n if ($slider.length) {\n $slider.map((i, v) => Slider(v));\n }\n\n const $gallery = $('.js-gallery');\n if ($gallery.length) {\n $gallery.map((i, v) => Gallery(v));\n }\n\n const $submenu = $('.js-submenu');\n if ($submenu.length) {\n $submenu.map((i, v) => Submenu(v));\n }\n\n const $minicart = $('.js-minicart');\n if ($minicart.length) {\n $minicart.map((i, v) => Minicart(v));\n }\n\n $('.validate-swedish-organization-number input').blur(\n wcValidationSwedishOrganizationNumber\n );\n $('.validate-swedish-ssn input').blur(wcValidationSwedishSSN);\n\n const $videoPlayer = $('.js-video-player');\n if ($videoPlayer.length) {\n $videoPlayer.map((i, v) => VideoPlayer(v));\n }\n\n const $videoModal = $('.js-video-modal');\n if ($videoModal.length) {\n $videoModal.map((i, v) => VideoModal(v, false));\n }\n\n const $fadeImage = $('.page-template-template-reportage');\n if ($fadeImage.length) {\n $fadeImage.map((i, v) => FadeImage(v, false));\n }\n\n const $embedMessage = $('.js-embed-message');\n if ($embedMessage.length) {\n $embedMessage.map((i, v) => EmbedMessage(v));\n }\n\n /**\n * .js-share and .js-copy is binded on click like this\n * because they are injected on the page via ajax through\n * gravityforms on submission, hence we need to bind on\n * document. We probably should refactor this to always\n * show a hidden share-button on initial rendering and\n * display it on submit instead. Would be cleaner and\n * this approach is probably bad for frontend performance\n */\n\n $(document).on(\"click\", \".js-share\", (e) => {\n e.preventDefault();\n\n const $el = $(e.currentTarget);\n Share.toggleShare($el);\n });\n\n $(document).on(\"click\", \".js-copy\", (e) => {\n const $el = $(e.currentTarget);\n Copy.copyData($el);\n });\n});\n\n$(window).on('beforeunload', () => {\n const $digitialCertificate = $('.js-digital-certificate');\n if ($digitialCertificate.length) {\n $digitialCertificate.map((i, v) => UnloadDigitalCertificate(v));\n }\n});\n\nconst $donation = $('#vue');\nif ($donation.length) {\n Donation('#vue');\n}\n\nconst $tmRegisterLead = $('#tm-register-lead');\nif ($tmRegisterLead.length) {\n console.log('hi');\n TMRegisterLead('#tm-register-lead');\n}\n","/* global $ */\n\nconst Agroforestry = (el) => {\n const $el = $(el);\n\n let $open = null;\n\n $el.find('.js-agroforestry-click').click((e) => {\n e.preventDefault();\n const $toggle = $($(e.target).data('toggle'));\n if($toggle.length) {\n $toggle.fadeIn(() => {\n $open = $toggle;\n $toggle.find('.js-agroforestry-close').click(() => {\n $toggle.fadeOut(() => {\n $toggle.find('.js-agroforestry-close').unbind('click');\n $open = null;\n });\n });\n });\n }\n });\n\n $(document).click((ev) => {\n if($open !== null) {\n const $parent = $open.children().first();\n if($parent.has(ev.target).length === 0 && !$parent.is(ev.target)) {\n $open.fadeOut(() => {\n $open.find('.js-agroforestry-close').unbind('click');\n $open = null;\n });\n }\n }\n });\n};\n\nexport default Agroforestry;\n","/* global $ */\n\nimport Cookies from 'js-cookie';\n\nconst Cookie = (el) => {\n const $el = $(el);\n\n $el.removeClass('js-state-cookie-initial').hide();\n\n const isClosed = Cookies.get('cookie-popup-closed_1');\n if (isClosed === undefined) {\n $el.slideDown();\n }\n\n $el.find('.js-cookie-close').click(function (e) {\n e.preventDefault();\n $(el).slideUp('fast');\n Cookies.set('cookie-popup-closed_1', 'true', {expires: 365});\n });\n};\n\n\nexport default Cookie;\n","const MenuToggle = (el) => {\n const $el = $(el)\n $el.click(() => {\n $('body').toggleClass('js-state-menu-open');\n })\n \n}\n\nexport { MenuToggle }","const SiteListToggle = (el) => {\n const $el = $(el)\n $el.click(() => {\n $('.site-list').toggleClass('site-list__toggleOpen');\n $('.js-toggle').toggle('slow');\n })\n\n}\n\nexport { SiteListToggle }\n","\nconst ScrollLock = (el) => {\n const $el = $(el)\n $el.click(() => {\n $('body').toggleClass('js-scroll-lock');\n })\n\n}\n\nexport { ScrollLock }\n","const Submenu = (el) => {\n const $el = $(el);\n $el.change(() => {\n const val = $el.val();\n const url = window.location.href;\n if(val !== '' && val !== url) {\n window.location = val;\n }\n }); \n}\n\nexport default Submenu;","/* global $ */\n\nconst Minicart = (el) => {\n let $el = $(el);\n $el.click(function (e) {\n e.preventDefault();\n\n $('body').toggleClass('js-state-open-minicart');\n });\n};\n\nexport default Minicart;\n","import $ from 'jquery';\n\nconst EmbedMessage = (el) => {\n const $el = $(el);\n const $button = $el.find('.js-embed-button');\n\n $button.click((e) => {\n const content = $el.data('content');\n $el.html(content);\n $el.addClass('js-state-video-active');\n });\n}\n\nexport default EmbedMessage;\n"],"names":["isValidSSN","value","replace","length","slice","month","substring","day","luhn","validate","isValidSwedishOrganizationNumber","match","optional","isClearingNo","isNaN","maxLength","isAccountNo","isDate","test","isMinToday","today","Date","date","getFullYear","getMonth","getDate","validateIf","validation","condition","status","response","Promise","resolve","reject","json","url","data","options","defaultArgs","method","headers","body","JSON","stringify","JSSettings","nonce","fetch","__spreadValues","then","query","Object","keys","map","encodeURIComponent","k","join","func","param","timeout","interval","endTime","Number","x","_poll","catch","e","eventListener","constructor","qr","log","token","currentDevice","filter","clearingNo","accountNo","name","publicId","getAccountStatusUrl","onReceivedBankAccountStatus","onReceivedQR","onReceivedBankIdAutoStartToken","onReceivedSigningFingerprintStatus","indexOf","getBankAccounts","bank","ssn","otherDevice","onReceivedCurrentDevice","onReceivedBankAccountInititate","getBankAccountStatus","parseBankAccountStatusResponse","x2","resumeBankAccount","getSigningFingerprint","getSigningFingerprintStatus","_GIFT_TYPE_TRACKING_NAMES","GIFT_TYPE_TRACKING_NAMES","SECTION_TRACKING_NAMES","amount","treeCount","cart","payment","certificate","personal","company","automaticPayment","event","category","action","label","extra","window","dataLayer","push","actionField","products","ecommerce","__spreadProps","trackEvent","trackCart","logger","error","message","Sentry.Severity","Error","V","Velocity","Vue","use","Vuelidate","VueLocalStorage","Donation","type","postId","orderId","customerId","campaignCode","legalAgreement","sectionsData","currency","locale","certificatePrintCost","certificateTextMaxLength","certificateTextMaxRows","certificateFromMaxLength","certificateShowFromName","amounts","minAmount","allowDecimalAmounts","externalAmount","defaultPayment","quantity","minQuantity","certificateImages","isClimateCompensation","trackingName","cartInfo","isLoggedIn","leadGuid","settings","sections","forms","section","s","defaultGroups","assign","i","defaultAmounts","parseFloat","a","useCustomAmount","customAmount","defaultAmountIndex","Math","floor","defaultAmount","includes","defaultQuantity","parseInt","defaultTotalCost","certificateImagesAreSelectable","defaultCertificateImage","isCompanyOrder","isCertificateOrder","isTreeOrder","isMonthlyOrder","intlTelLoaded","intlTelInputGlobals","loadUtils","app","el","directives","intltelinput","inserted","el2","_binding","vnode","vueApp","context","input","querySelector","countryKey","sanitizedKey","defaultCountry","fields","iso2","separateDialCode","initialCountry","onlyCountries","allowDropdown","preferredCountries","iti","Iti","getNumber","getSelectedCountryData","addEventListener","update","isValidKey","getInstance","number","intlTelInputUtils","isValidNumber","activeSection","currentSubmit","selectedCertificateImage","selectedCertificateImageStyle","backgroundImage","src","obfuscatedAddress","firstName","lastName","address","postalCode","city","sparId","address2","companyName","companyRegistrationNumber","email","phone","phoneSanitized","phoneIsValid","phoneCountry","showShippingFields","shippingFirstName","shippingLastName","shippingAddress","shippingAddress2","shippingPostalCode","shippingCity","swishPhone","swishPhoneSanitized","swishPhoneIsValid","swishPhoneCountry","certificateOther","certificateName","certificateFromName","certificateMessage","certificateImageId","ID","recipientEmail","recipientSelect","recipientDate","recipientSelectedDate","memorialOrderData","recipientName","recipientAddress","recipientAddress2","recipientPostalCode","recipientCity","bankAccountNumberSelected","billectaIsPolling","billectaBankAccountPublicId","billectaQRCode","billectaBankIdAutoStartToken","billectaCurrentDevice","bankIdUrl","digitalSignature","showPreviewModal","previewType","showAddressFields","showAccountFields","showObfuscatedAddress","showSparLoader","showSparError","showMissingAddressError","showCertificateName","isSwishPhone","isOtherCertificate","isPrintCertificate","allowSwishPhoneOverride","xhrStatusOrderStatus","xhrStatusBankAccount","xhrStatusSubmit","xhrStatusSubmitDonorToBe","xhrStatusMessageType","submitErrorMessage","bankAccountNumbers","showBankIDLoadingSpinner","openBankIDOnCurrentDevice","totalCost","touchedGroups","groupError","hideFieldError","groups","validations","reqAddress","requiredIf","this","reqShippingAddress","decimal","minValue","v","required","validateCustomAmount","numeric","validateSSN","validateCompanyRegistrationNumber","validateSwishPhone","validateClearingNo","validateRequiredFromName","maxRows","split","rows","validateRequiredEmail","validateRequiredDate","validateRequiredMinToday","watch","handler","setStore","deep","val","updateTotalCost","location","href","image","findCertificateImage","memorialOrderDateSelected","filters","convertLineBreaks","$","html","text","RegExp","formatAmount","amount2","style","minimumFractionDigits","maximumFractionDigits","toLocaleString","created","store","parse","$store","get","expire","now","validateOnCreate","$v","$touch","remove","getOrderStatus","status2","setData","onTreeCountUpdate","methods","onChangeFocusOut","target","getMemorialOrderData","onChangeAmount","_e","onClickCustomAmount","$refs","inputCustomAmount","focus","onInputCustomAmount","onChangeCustomAmount","onInputField","$error","onChangeField","onSwishPhoneChange","copyPhoneToSwish","formatSSN","prefix","currentYear","toString","ssnYear","toggleAddress","$invalid","toggleAccount","togglePreviewModal","toggleClass","togglePreviewType","type2","onEnterSection","done","parentElement","duration","offset","delay","complete","onAfterEnterSection","onLeaveSection","onEnterExpandable","easing","onLeaveExpandable","onClickChangeSection","onClickNextSection","trackOnClickNextSection","currentIndex","nextUntouchedItem","find","onClickAddress","success","obfuscate","currentAddress","Utdelningsadress2","Utdelningsadress1","spar_id","personDetails","Fornamn","Efternamn","PostNr","Postort","diff","onClickChangeDonation","parseParamsToQuery","params","arr","p","parseQueryToParams","q","imageId","id","getCertificateImageUrl","clickSubmit","step","onSubmit","preventDefault","prepareData","loaderScrollTo","submitButton","blur","maybeGetFingerprint","submitDonation","redirect","e2","_data","total","set","getBankAccountsThisDevice","getBankAccountsOtherDevice","ongoingRequestPublicId","billecta","orderId2","updateFields","key","group","round","account","each","_key","recipientAddress1","_pollingTimeout","$el","open","addClass","removeClass","pollPayex","pollSwish","CertificateForm","$form","closest","change","show","is","slideToggle","$msgField","$fromField","$quantityField","$modal","click","fadeIn","hide","fromName","fromText","fadeOut","$previewToggle","$btn","hasClass","maxRows2","attr","showFieldError","$errorMsg","next","slideDown","slideUp","Gallery","currentTarget","$slider","slick","wrapper","videoBgPlayer","playerBgType","videoModalPlayer","playerModalType","youtubeApiPromise","vimeoApiPromise","injectJsApi","tag","document","createElement","scriptUrl","firstScriptTag","getElementsByTagName","parentNode","insertBefore","getDomElements","$player","$wrapper","parent","$controlButton","$modalButtonOpen","$modalButtonClose","player","modal","controlButton","modalButtonOpen","modalButtonClose","playText","pauseText","youtubeReadyFunction","onYouTubeIframeAPIReady","YouTubePlayer","async","asBg","videoId","$videoContainer","empty","innerContainer","videoContainerInnerId","elements","append","YT","Player","playerVars","controls","loop","playlist","modestbranding","showInfo","mute","rel","events","onReady","playVideo","onStateChange","state","getPlayerState","pauseVideo","width","modalPlayer","VimeoPlayer","autoplay","background","title","byline","muted","quality","Vimeo","on","getPaused","paused","play","pause","showPauseButton","showPlayButton","initVideo","warn","parseUrl","host","VideoPlayer","iframeImage","isPortrait","height","showImage","windowHeight","thisPos","top","scrollTop","TMRegisterLead","pageUrl","pageId","validatePhone","submittedFrom","SENTRY_SDK_CONFIG","integrations","Integrations.BrowserTracing","tracking","ready","$agroforestry","$open","$toggle","unbind","ev","$parent","children","first","has","Agroforestry","$cookie","Cookies","expires","Cookie","$video","iframe","Video","paymentMethod","completedUrl","paymentUrl","checkoutLoader","$certificateForm","$digitialCertificate","animate","scroll","DigitalCertificate","$menuToggle","$siteListToggle","toggle","$scrollLock","MSInputMethodContext","documentMode","$prev","$next","centerMode","centerPadding","nextArrow","prevArrow","Slider","$gallery","$submenu","Submenu","$minicart","wcValidationSwedishOrganizationNumber","wcValidationSwedishSSN","$videoPlayer","$videoModal","VideoModal","$fadeImage","$embedMessage","content","EmbedMessage"],"mappings":"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"}