{"version":3,"file":"720.54a54a5932c1f718053c.js","mappings":"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iBO,IAAMq9C,EAAmB,oBAAAA,iGAAA3nD,CAAA,KAAA2nD,EAAA,SAsH7B,SAtH6BA,IAAA,EAAA1nD,IAAA,SAAApD,MAC9B,SAAe+qD,EAAqBC,GAClCF,EAAoBG,cAAcF,EAAqBC,GAEvDD,EAAoB90C,iBAAiB,QAAQ,WAC3C60C,EAAoBG,cAAcF,EAAqBC,EACzD,GACF,GAAC,CAAA5nD,IAAA,gBAAApD,MAED,SAAsB+qD,EAAqBC,GACzC,IAAME,EAAev9D,EAAEo9D,GAAqB5+C,MAAMlK,cAC5CkpD,EAAcl9D,KAAKm9D,uBAAuBF,GAEhDv9D,EAAEq9D,GAAgBpY,SAASuY,EAC7B,GAAC,CAAA/nD,IAAA,yBAAApD,MAED,SAA+B7K,GAC7B,QAAIlH,KAAKo9D,6BAA6Bl2D,MAIlClH,KAAKq9D,6BAA6Bn2D,EAKxC,GAAC,CAAAiO,IAAA,+BAAApD,MAED,SAAqC7K,GACnC,MAAO,CACL,UACA,QACA,YACA,UACA,WACA,UACA,QACA,QACA,YACA,gBACA,qBACA,WACA,UACA,SACA,UACA,UACA,YACA,aACA,aACA,aACA,aACA,aACA,aACA,eACA,aACA,cACA,eACA,cACA,eACA,cACA,cACA,cACA,cACA,YACA,YACA,YACA,cACA,aACA,aACA,cACA,aACA,aACA,YACA,aACA,cACA,cACA,WACA,aACA,aACA,YACA,aACA,cACA0N,MAAK,SAAAqhC,GAAC,OAAI/uC,EAAMsnC,SAASyH,EAAE,GAC/B,GAAC,CAAA9gC,IAAA,+BAAApD,MAED,SAAqC7K,GACnC,MAAO,CACL,aACA,cACA,aACA,cACA,YACA,WACA,WACA,WACA,WACA,YACA,WACA,YACA,UACA,aACA,cACA,cACA,cACA,eACA,eACA,YACA,aACA,cACA,cACA,QACA,cACA,aACA,cACA,aACA,aACA,cACA0N,MAAK,SAAAqhC,GAAC,OAAI/uC,EAAM+M,SAASgiC,EAAE,GAC/B,IAtH8B,uFAsH7B4mB,CAAA,CAtH6B,uBCiBhC,SAASS,EACPh/C,EACA/N,EACAyW,EACAwV,EACAze,GAEA,IAAMhe,EAAOC,K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","sources":["C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/dk-ifshop-gtm-helper.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/state/data.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/dk-ifshop-gtm-eventmanager.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/dk-ifshop-gtm.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/state/storage.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/state/productutil.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/state/updateutil.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/Tracking/state/utility.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/SharedResources/trustpilot.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/adresse/dk-ifshop-address-dawa-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/adresse/dk-ifshop-liv-address-callbacks.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/adresse/dk-ifshop-ulykke-address-callbacks.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/bil/dk-ifshop-bil-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/bil/dk-ifshop-bil-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/boat/dk-ifshop-boat-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/boat/dk-ifshop-boat-multicontrolconfig.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/campingvogn/dk-ifshop-campingvogn-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/campingvogn/dk-ifshop-campingvogn-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/campingvogn/dk-ifshop-caravan-multicontrolconfig.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr-multicontrol-config.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr-rules.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr-validation-functions.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-constants.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-actionButton.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-multi.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-radioAndCheckbox.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-slider.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-dates.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-dictionary.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-helper.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-loader.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-person-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/familie/dk-ifshop-familie-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/hus/dk-ifshop-hus-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/rejse/dk-ifshop-rejse-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/ulykke/dk-ifshop-ulykke-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/boat/dk-ifshop-boat-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/hund/dk-ifshop-hund-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-tilbud-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-wizard-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/validation/email-unexpected-data.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-address.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-controls-tabs.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr-validation-medforsikret.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/cpr/dk-ifshop-cpr-validation-kunde.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/adresse/dk-ifshop-address-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/adresse/dk-ifshop-coinsured-address-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/dk-ifshop-text-helper.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/knallert/dk-ifshop-knallert-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/knallert/dk-ifshop-knallert-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/knallert/dk-ifshop-knallert-validation.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/liv/dk-ifshop-liv-validation-messages.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/liv/dk-ifshop-liv-validation-functions.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/mc/dk-ifshop-motorcykel-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/mc/dk-ifshop-mc-multicontrolconfig.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/mc/dk-ifshop-motorcykel-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/quickform-submit-setup.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/security/recaptcha.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/trailer/dk-ifshop-trailer-produkt-model.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/trailer/dk-ifshop-trailer-scripts.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/trailer/dk-ifshop-trailer-multicontrolconfig.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/ulykke/dk-ifshop-ulykke-validation-functions.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/Site/ulykke/dk-ifshop-ulykke-validation-messages.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/dawa-autocompletev2.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/dk-bootbox.ifshop.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/dk-jquery.cluetip.ifshop.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/dk-jquery.validate.ifshop.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/globinfo/jQuery.glob.da.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/jquery.addplaceholder.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/jquery.form.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/jquery.form.resetForm.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/jquery.glob.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/mutate.events.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/common/mutate.js","C:/AISARCHPVSB0009/_work/13598/s/Source/If.DK.WebShop.MVC.WebShopClient/Scripts/sp/dk-ifshop-bundleloader.js"],"sourcesContent":["/* global $ */\r\nexport const GTM_WEBSHOP_PAGELOADED = 'gtmPageLoaded'\r\nexport const TILBUD_UPDATED = 'tilbud_updated_event'\r\nexport const PRODUCT_UPDATED_FROM_ACTIVEPRODUCT = 'product_updated_from_activeproduct_event'\r\nexport const PRODUCT_UPDATED_FROM_OVERBLIKK = 'product_updated_from_overblikk_event'\r\nexport const AJAX_FAIL = 'ajax_fail_event'\r\nexport const PRICE_CHANGING = 'price_changing_event'\r\nexport const PRODUCT_DAEKNING_UPDATED = 'product_daekning_changed'\r\nexport const REMOVE_PRODUCT = 'remove_product'\r\nexport const REMOVE_PRODUCT_BY_ID = 'remove_product_by_id'\r\nexport const PRODUCT_BASEPRAEMIE_UPDATED = 'product_base_praemie_updated'\r\nexport const CUSTOMER_UPDATE_ENIGMA = 'customer_has_been_enigma_updated'\r\nexport const MAXICART_LOAD = 'maxicart_load'\r\nexport const GTM_APP_HAS_LOADED = 'gtm_app_has_loaded'\r\nexport const ADD_PRODUCT = 'add_product'\r\n\r\nexport const publish = function (topic, data) {\r\n data = data || {}\r\n $(document).trigger(topic, data)\r\n}\r\n\r\nexport const subscribe = function (topic, callback) {\r\n const fn = function (eventObject, data) {\r\n callback(data, topic)\r\n }\r\n $(document).on(topic, fn)\r\n\r\n return function () {\r\n $(document).off(topic, fn)\r\n }\r\n}\r\n","import {\r\n getPageInfoState\r\n} from './utility'\r\nimport { SaveGTMState } from './storage'\r\nimport { app } from './../../../Site/dk-ifshop-application'\r\n\r\nimport { cloneDeep, omit } from 'lodash'\r\n\r\n/* Dataobject that is populated using the overblikkItemv2 collection from the server,\r\n This class represents the truth as known by the server for the entire quote,\r\n meaning data from the Tilbud is what creates this.\r\n */\r\n/* global */\r\nfunction GTMData () {\r\n const self = this\r\n\r\n self.clean = function () {\r\n window.sessionStorage.setItem('gtm_Data', '')\r\n self.InsuranceInfoArray = []\r\n self.ProductsInfoArray = []\r\n self.ObjectInfoArray = []\r\n self.KundeInfo = {}\r\n self.KundeInfo.customerId = {}\r\n self.SessionId = ''\r\n self.educationLevel = ''\r\n self.customerStatus = ''\r\n self.pageInfo = {}\r\n }\r\n\r\n self.save = function () {\r\n SaveGTMState()\r\n }\r\n\r\n self.boot = function () {\r\n if (self.Persisted()) {\r\n const gtmStateData = window.sessionStorage.getItem('gtm_Data')\r\n\r\n if (gtmStateData) {\r\n const storedModel = JSON.parse(gtmStateData)\r\n\r\n self.Invoice = storedModel.Invoice || ''\r\n self.Period = storedModel.Period || ''\r\n\r\n self.InsuranceInfoArray = storedModel.InsuranceInfoArray || []\r\n self.ProductsInfoArray = storedModel.ProductsInfoArray || []\r\n self.ObjectInfoArray = storedModel.ObjectInfoArray || []\r\n if (storedModel.KundeInfo) {\r\n self.KundeInfo = storedModel.KundeInfo\r\n } else {\r\n self.KundeInfo = {}\r\n self.KundeInfo.customerId = {}\r\n }\r\n\r\n self.SessionId = storedModel.SessionId || ''\r\n self.educationLevel = storedModel.educationLevel || {}\r\n self.customerStatus = storedModel.customerStatus || {}\r\n self.pageInfo = storedModel.pageInfo || {\r\n page: '',\r\n sessionId: '',\r\n hasWizard: false,\r\n currentStepNo: ''\r\n }\r\n }\r\n } else {\r\n self.InsuranceInfoArray = []\r\n self.ProductsInfoArray = []\r\n self.ObjectInfoArray = []\r\n self.KundeInfo = {}\r\n self.KundeInfo.customerId = {}\r\n self.SessionId = ''\r\n self.educationLevel = ''\r\n self.customerStatus = ''\r\n self.pageInfo = {}\r\n self.Invoice = ''\r\n self.Period = ''\r\n }\r\n }\r\n\r\n self.GetObjectInfoArray = function () {\r\n try {\r\n const clonedObjectArray = cloneDeep(self.ObjectInfoArray)\r\n return clonedObjectArray\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-ObjectInfoArray': self.ObjectInfoArray })\r\n }\r\n }\r\n\r\n self.GetProductsInfoArray = function () {\r\n try {\r\n const clonedProductsArray = cloneDeep(self.ProductsInfoArray)\r\n return clonedProductsArray\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-ProductsInfoArray': self.ProductsInfoArray })\r\n }\r\n }\r\n\r\n self.GetInsuranceInfoArray = function () {\r\n try {\r\n const clonedInsuranceArray = cloneDeep(self.InsuranceInfoArray)\r\n return clonedInsuranceArray.map(insurance => { return omit(insurance, 'productId') })\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-InsuranceInfoArray': self.InsuranceInfoArray })\r\n }\r\n }\r\n\r\n /* Initialize statemanagement, if we have data from OverblikItems then use, otherwise use sessionStorage */\r\n self.init = function (data) {\r\n app.logInformationToAppInsight('GTMLogging-Initialize statemanagement (gtm)', { ' data': data })\r\n\r\n try {\r\n // populate spa location info\r\n if (data && data.pageInfo) {\r\n self.pageInfo = getPageInfoState(data.pageInfo)\r\n }\r\n\r\n if (data && data.InsuranceInfoArray) {\r\n self.resetToClientSidePaymentOptions(data)\r\n self.InsuranceInfoArray = data.InsuranceInfoArray\r\n self.ProductsInfoArray = data.ProductsInfoArray\r\n self.ObjectInfoArray = data.ObjectInfoArray\r\n self.KundeInfo = data.KundeInfo\r\n self.educationLevel = data.EducationLevel\r\n self.customerStatus = data.customerStatus\r\n self.campaignCode = ''\r\n } else {\r\n self.boot()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n }\r\n\r\n self.resetToClientSidePaymentOptions = function (data) {\r\n if (data.InsuranceInfoArray && data.InsuranceInfoArray.length > 0) {\r\n data.InsuranceInfoArray.forEach(insurance => {\r\n insurance.insurancePayment = {}\r\n insurance.insurancePayment.period = self.Period\r\n insurance.insurancePayment.invoice = self.Invoice\r\n })\r\n }\r\n }\r\n\r\n /* Is the state stored */\r\n self.Persisted = function () {\r\n if (window.sessionStorage) {\r\n const state = window.sessionStorage.getItem('gtm_Data')\r\n return state !== undefined && state !== ''\r\n }\r\n return false\r\n }\r\n /* Remove product from state arrays for insuranceinfo, productinfo, and objectinfo. */\r\n self.RemoveProduct = function (uniqueId, productId) {\r\n if (!self.InsuranceInfoArray) return\r\n let insuranceIndex = -1\r\n for (let i = 0; i < self.InsuranceInfoArray.length; ++i) {\r\n if (uniqueId) {\r\n if (self.InsuranceInfoArray[i].UniqueId === uniqueId) {\r\n insuranceIndex = i\r\n break\r\n }\r\n } else {\r\n if (self.InsuranceInfoArray[i].productId === productId) {\r\n insuranceIndex = i\r\n break\r\n }\r\n }\r\n }\r\n\r\n let productIndex = -1\r\n for (let i = 0; i < self.ProductsInfoArray.length; ++i) {\r\n if (uniqueId) {\r\n if (self.ProductsInfoArray[i].UniqueId === uniqueId) {\r\n productIndex = i\r\n break\r\n }\r\n } else {\r\n if (self.ProductsInfoArray[i].productId === productId) {\r\n productIndex = i\r\n break\r\n }\r\n }\r\n }\r\n\r\n let objectIndex = -1\r\n for (let i = 0; i < self.ObjectInfoArray.length; ++i) {\r\n if (uniqueId) {\r\n if (self.ObjectInfoArray[i].UniqueId === uniqueId) {\r\n objectIndex = i\r\n break\r\n }\r\n } else {\r\n if (self.ObjectInfoArray[i].productId === productId) {\r\n objectIndex = i\r\n break\r\n }\r\n }\r\n }\r\n\r\n if (insuranceIndex > -1) {\r\n self.InsuranceInfoArray.splice(insuranceIndex, 1)\r\n }\r\n if (productIndex > -1) {\r\n self.ProductsInfoArray.splice(productIndex, 1)\r\n }\r\n if (objectIndex > -1) {\r\n self.ObjectInfoArray.splice(objectIndex, 1)\r\n }\r\n }\r\n\r\n self.addProduct = function (productobject) {\r\n if (self.ProductsInfoInfoArray) {\r\n self.ProductsInfoInfoArray.push(self.getProduct(productobject))\r\n }\r\n }\r\n\r\n self.ValidToSetPriceParameters = function () {\r\n return ((self.pageInfo.page == 'front' || self.pageInfo.page == 'produkt') && (self.pageInfo.currentStepNo < 2))\r\n }\r\n\r\n // Utility methods for converting overblikkItemProperties to valid values.\r\n self.getLeaseObjectInformationFromOverblikkItem = function (item) {\r\n if (item.id === 'bil') {\r\n return item.erBilenLeaset\r\n }\r\n return ''\r\n }\r\n}\r\nexport { GTMData }\r\n","/* global ko */\r\n\r\nimport {\r\n AJAX_FAIL,\r\n CUSTOMER_UPDATE_ENIGMA,\r\n GTM_APP_HAS_LOADED,\r\n GTM_WEBSHOP_PAGELOADED,\r\n MAXICART_LOAD,\r\n PRICE_CHANGING,\r\n PRODUCT_UPDATED_FROM_ACTIVEPRODUCT,\r\n REMOVE_PRODUCT,\r\n REMOVE_PRODUCT_BY_ID,\r\n TILBUD_UPDATED,\r\n publish,\r\n subscribe\r\n} from './dk-ifshop-gtm-helper'\r\nimport {\r\n GetRemoveData,\r\n getGTMProductForPageImpressionUsingUrl,\r\n getGTMProductsForPageImpression,\r\n getInsuranceDiffForCart,\r\n getInsuranceListsAreIdentical\r\n} from './state/utility'\r\nimport {\r\n InsuranceInfoHasChanged,\r\n UpdateInsuranceInfoStateBasedOnPriceChange,\r\n updateInsuranceInfoStateBasedOnProductChange,\r\n updateObjectInfoStateBasedOnProductChange,\r\n updatePageInfo\r\n} from './state/updateutil'\r\nimport {\r\n pushAddToCartInformation,\r\n pushAjaxError,\r\n pushCheckoutStepLoadOnCheckout,\r\n pushCustomerInformationUpdate,\r\n pushEcommerceEvent,\r\n pushEntryPageLoad,\r\n pushMaxiCartPageLoad,\r\n pushPageLoadOnCheckout,\r\n pushPriceChangingEvent,\r\n pushPriceQuotePageLoad,\r\n pushProductsPageImpression,\r\n pushPurchaseCompletedVirtualPageLoad,\r\n pushPurchasePageLoad,\r\n pushRemoveFromCartInformation,\r\n pushVirtualPageLoad\r\n} from './dk-ifshop-gtm'\r\n\r\nimport { GTMData } from './state/data'\r\nimport {\r\n SaveGTMState\r\n} from '././state/storage'\r\nimport { app } from '../../Site/dk-ifshop-application'\r\n\r\nexport const gtmOperations = []\r\n\r\nexport const onWizardStep = (pageInfo) => {\r\n try {\r\n updatePageInfo(pageInfo)\r\n\r\n // PageInfo should already have been set\r\n const stepNo = window.gtm_Data.pageInfo.currentStepNo\r\n const page = window.gtm_Data.pageInfo.page\r\n\r\n if (page === 'produkt') {\r\n if (stepNo === 1) {\r\n pushVirtualPageLoad('Add to cart step 1')\r\n } else if (stepNo === 2) {\r\n pushVirtualPageLoad('Add to cart step 2')\r\n }\r\n } else if (page === 'checkout') {\r\n let gtmStepNo = 0\r\n if (stepNo - window.gtm_Data.ProductsInfoArray.length <= 0) {\r\n gtmStepNo = 1\r\n } else {\r\n gtmStepNo = stepNo - window.gtm_Data.ProductsInfoArray.length + 1\r\n }\r\n\r\n if (gtmStepNo === 1) {\r\n pushVirtualPageLoad('Checkout step 1')\r\n pushPageLoadOnCheckout(gtmStepNo)\r\n pushCheckoutStepLoadOnCheckout(gtmStepNo)\r\n } else if (gtmStepNo === 2) {\r\n pushVirtualPageLoad('Checkout step 2')\r\n pushPageLoadOnCheckout(gtmStepNo)\r\n pushCheckoutStepLoadOnCheckout(gtmStepNo)\r\n } else if (gtmStepNo === 3) {\r\n pushVirtualPageLoad('Checkout step 3')\r\n pushPageLoadOnCheckout(gtmStepNo)\r\n pushCheckoutStepLoadOnCheckout(gtmStepNo)\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-pageInfo': pageInfo })\r\n }\r\n}\r\n\r\nexport const init = (metaData) => {\r\n try {\r\n if (window.ifws_toggle_gtm === 'true') {\r\n window.dataLayer = window.dataLayer || []\r\n\r\n if (!window.gtm_Data) {\r\n window.gtm_Data = window.gtm_Data || new GTMData()\r\n window.gtm_Data.init(metaData)\r\n } else {\r\n window.gtm_Data.init(metaData)\r\n }\r\n\r\n subscribe(GTM_WEBSHOP_PAGELOADED, onGTMPageLoaded)\r\n subscribe(AJAX_FAIL, onAjaxFailEvent)\r\n subscribe(PRICE_CHANGING, onPriceChangingEvent)\r\n subscribe(REMOVE_PRODUCT_BY_ID, onRemoveProductEventByProductId)\r\n subscribe(REMOVE_PRODUCT, onRemoveProductEvent)\r\n subscribe(TILBUD_UPDATED, handleChangedTilbud)\r\n subscribe(PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, handleChangedProductFromActiveProduct)\r\n subscribe(CUSTOMER_UPDATE_ENIGMA, updateKundeEnigma)\r\n subscribe(MAXICART_LOAD, handleMaxiCartLoad)\r\n subscribe('GTMWizardStep', onWizardStep)\r\n }\r\n publish(GTM_APP_HAS_LOADED)\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-metaData': metaData })\r\n }\r\n}\r\n\r\nexport const InitState = (data) => {\r\n try {\r\n if (window.gtm_Data) {\r\n window.gtm_Data.init(data)\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\n// todo: Remove this method\r\nexport const updateCustomerStatus = (existingCustomerStatus) => {\r\n try {\r\n if (window.gtm_Data) {\r\n window.gtm_Data.customerStatus = {\r\n type: 'if',\r\n customerStatus: existingCustomerStatus\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-existingCustomerStatus': existingCustomerStatus })\r\n }\r\n}\r\n\r\nexport const handleMaxiCartLoad = (data) => {\r\n try {\r\n if (window.gtm_Data) {\r\n onGTMPageLoaded({ pageInfo: data.pageInfo })\r\n SaveGTMState()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\nexport const handleChangedProductFromActiveProduct = (data) => {\r\n try {\r\n if (window.gtm_Data) {\r\n updatePageInfo(data.complimentaryInformation.pageInfo)\r\n updateInsuranceInfoStateBasedOnProductChange(data)\r\n updateObjectInfoStateBasedOnProductChange(data)\r\n SaveGTMState()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\n// This method will be used in syncTilbud and can be utilized to handle the following operations\r\n// add minicart\r\n// remove minicart\r\n// add maxicart\r\n// remove maxicart where redirect is triggered and a syncTilbud happens\r\n// Since those will all trigger a syncTilbud, where we have the opportunity to diff the metadata regarding which products we have.\r\n//\r\n// if we are in maxicart and press remove, then we will not leave maxicart and there for this logic will not work\r\n// so therefore there is a custom removal event triggered from CartViewModel\r\n\r\nexport const addOrRemove = (data, pageInfo) => {\r\n try {\r\n // relative to insurances collection\r\n const completeDiffObject = getInsuranceDiffForCart(data.InsuranceInfoArray)\r\n let shortformDiffObject\r\n\r\n if (completeDiffObject) {\r\n shortformDiffObject = {\r\n pageInfo,\r\n productData: {\r\n UniqueId: completeDiffObject.UniqueId,\r\n productId: completeDiffObject.productId,\r\n productName: completeDiffObject.id,\r\n brand: completeDiffObject.brand,\r\n price: completeDiffObject.price\r\n }\r\n }\r\n\r\n if (!data.InsuranceInfoArray || !window.gtm_Data.InsuranceInfoArray) {\r\n return\r\n }\r\n\r\n // check if its add or remove\r\n if (data.ProductsInCart.length < window.gtm_Data.InsuranceInfoArray.length) {\r\n // trigger events\r\n onRemoveProductEvent({ pageInfo, UniqueId: shortformDiffObject.UniqueId, productId: shortformDiffObject.productId })\r\n } else if (data.InsuranceInfoArray.length > window.gtm_Data.InsuranceInfoArray.length) {\r\n // trigger the add events\r\n onAddProductEvent(completeDiffObject, shortformDiffObject)\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data, pageInfo })\r\n }\r\n}\r\n\r\nexport const handleChangedTilbud = (data) => {\r\n try {\r\n updatePageInfo(data.pageInfo)\r\n\r\n if (!data.TilbudData) {\r\n // console.log('Summarydata for GTM not delivered from server')\r\n return\r\n }\r\n // update page state information\r\n\r\n // check if we have same content or not\r\n const insuranceListsAreIdentical = getInsuranceListsAreIdentical(data.TilbudData.InsuranceInfoArray)\r\n\r\n // if product overview list differs then call the add/remove logic which will also be\r\n // responsible for saving the products\r\n if (!insuranceListsAreIdentical) {\r\n addOrRemove(data.TilbudData, data.pageInfo)\r\n } // do a regular initiation of state with the content\r\n\r\n InitState(data.TilbudData)\r\n\r\n SaveGTMState()\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { data })\r\n }\r\n}\r\n\r\n// ONLY PUSH UPDATE IF BACKEND REPORTS A CHANGE\r\nexport const updateKundeEnigma = (data) => {\r\n try {\r\n if (window.gtm_Data && window.gtm_Data.KundeInfo) {\r\n if (data) {\r\n window.gtm_Data.KundeInfo.age = data.Age\r\n window.gtm_Data.KundeInfo.customerId.id = data.EnigmaTokenSSN\r\n window.gtm_Data.KundeInfo.address = data.EnigmaTokenAdress\r\n window.gtm_Data.KundeInfo.email = data.EnigmaTokenEmail\r\n window.gtm_Data.KundeInfo.firstname = data.EnigmaTokenFirstName\r\n window.gtm_Data.KundeInfo.lastname = data.EnigmaTokenLastName\r\n window.gtm_Data.KundeInfo.phone = data.EnigmaTokenPhone\r\n pushCustomerInformationUpdate()\r\n SaveGTMState()\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\nexport const onAjaxFailEvent = (ajaxInfo) => {\r\n if (ajaxInfo) {\r\n pushAjaxError(ajaxInfo)\r\n }\r\n}\r\n\r\nexport const onPriceChangingEvent = (data) => {\r\n try {\r\n updatePageInfo(data.pageInfo)\r\n\r\n if (InsuranceInfoHasChanged(data)) {\r\n UpdateInsuranceInfoStateBasedOnPriceChange(data)\r\n SaveGTMState()\r\n pushPriceChangingEvent()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\n// todo: investigate the need for full model, should only be necesary if\r\n// we need to update state from here.\r\nexport const onAddProductEvent = (completeData, shortFormdata) => {\r\n try {\r\n updatePageInfo(shortFormdata.pageInfo)\r\n gtmOperations.push(pushAddToCartInformation.bind(null, shortFormdata.productData))\r\n SaveGTMState()\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-shortFormdata': shortFormdata })\r\n }\r\n}\r\n\r\n// this method does not have to be batched since its not driven by\r\n// syncTilbudAndActiveProduct\r\nexport const onRemoveProductEventByProductId = (data) => {\r\n try {\r\n if (window.gtm_Data) {\r\n updatePageInfo(data.pageInfo)\r\n const removalData = GetRemoveData(undefined, data.productId)\r\n pushRemoveFromCartInformation(removalData)\r\n window.gtm_Data.RemoveProduct(data.UniqueId, removalData.id)\r\n SaveGTMState()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\nexport const onRemoveProductEvent = (productData) => {\r\n try {\r\n if (window.gtm_Data) {\r\n updatePageInfo(productData.pageInfo)\r\n if (productData && (productData.UniqueId || productData.productId)) {\r\n const removalData = GetRemoveData(productData.UniqueId, productData.productId)\r\n gtmOperations.push(pushRemoveFromCartInformation.bind(null, removalData))\r\n window.gtm_Data.RemoveProduct(productData.UniqueId, removalData.id)\r\n SaveGTMState()\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-productData': productData })\r\n }\r\n}\r\n\r\nexport const RunActionsInGTMOperations = () => {\r\n if (gtmOperations.length > 0) {\r\n while (gtmOperations.length) {\r\n gtmOperations.shift().call()\r\n }\r\n }\r\n}\r\n\r\nexport const onGTMPageLoaded = (data) => {\r\n try {\r\n // store to gtm_Data state model\r\n window.gtm_Data.init(data.TilbudData)\r\n SaveGTMState()\r\n app.logInformationToAppInsight('GTMLogging onGTMPageLoaded', data)\r\n // todo: the assumption is that this is a valid enough condition for saying we loaded\r\n // the maxicart, needs improvement\r\n if (!data.TilbudData && !data.ClientSidePage) {\r\n maxicartLoadEvent()\r\n RunActionsInGTMOperations()\r\n } else if (!data.TilbudData && data.ClientSidePage === 'front') {\r\n frontPageLoadEvent(data.TilbudData, data.ActiveProductData)\r\n } else {\r\n if (data.pageInfo) {\r\n const page = data.pageInfo.page\r\n if (data.TilbudData && page === 'front') {\r\n frontPageLoadEvent(data.TilbudData, data.ActiveProductData)\r\n }\r\n if (data.TilbudData && page === 'cart') {\r\n maxicartLoadEvent()\r\n }\r\n if (data.TilbudData && page === 'produkt') {\r\n productLoadEvent(data.TilbudData, data.ActiveProductData, data.pageInfo)\r\n }\r\n if (page === 'kvittering') {\r\n app.logInformationToAppInsight('GTMLogging onGTMPageLoaded - purchaseLoadEvent', data)\r\n purchaseLoadEvent(data.TilbudData)\r\n }\r\n // execute all pushes that were batched due to they being a consequence of syncActiveTilbudAndProduct\r\n RunActionsInGTMOperations()\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\nexport const PrepareProducts = (tilbudsdata, activeProductData) => {\r\n try {\r\n const products = getGTMProductsForPageImpression()\r\n if (activeProductData) {\r\n products.push({\r\n name: ko.toJS(activeProductData.produktNavn) || '',\r\n id: ko.toJS(activeProductData.produktNavn) || '',\r\n category: '',\r\n quantity: 1,\r\n brand: 'if.dk',\r\n price: activeProductData.Daekning().NettoPraemieTotal()\r\n })\r\n }\r\n return products\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata, 'GTMLogging-activeProductData': activeProductData })\r\n }\r\n}\r\n\r\nexport const frontPageLoadEvent = (tilbudsdata, activeProductData) => {\r\n try {\r\n const products = PrepareProducts(tilbudsdata, activeProductData)\r\n\r\n if (activeProductData === undefined) {\r\n // Meaning we have no historical data and we have no actively synced current product\r\n // so we must emulate the concept of an actively synced product even though we have not synced the session with the backend so far.\r\n products.push(...getGTMProductForPageImpressionUsingUrl())\r\n }\r\n\r\n pushProductsPageImpression(products)\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata, 'GTMLogging-activeProductData': activeProductData })\r\n }\r\n}\r\n\r\nexport const entryPageLoadEvent = (tilbudsdata, activeProductData) => {\r\n try {\r\n pushEntryPageLoad(tilbudsdata, activeProductData)\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata, 'GTMLogging-activeProductData': activeProductData })\r\n }\r\n}\r\n\r\nexport const priceQuotePageLoadEvent = (tilbudsdata, activeProductData) => {\r\n try {\r\n pushPriceQuotePageLoad(tilbudsdata, activeProductData)\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata, 'GTMLogging-activeProductData': activeProductData })\r\n }\r\n}\r\n\r\nexport const maxicartLoadEvent = () => {\r\n try {\r\n pushMaxiCartPageLoad()\r\n const products = getGTMProductsForPageImpression()\r\n pushProductsPageImpression(products)\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { ErrorType: 'GTMLogging' })\r\n }\r\n}\r\n\r\nexport const productLoadEvent = (tilbudsdata, activeProductData, pageInfo) => {\r\n try {\r\n if (pageInfo) {\r\n if (pageInfo.currentStepNo === 0) {\r\n // when is this?\r\n } else if (pageInfo.currentStepNo === 1) {\r\n entryPageLoadEvent(tilbudsdata)\r\n const products = PrepareProducts(tilbudsdata, activeProductData)\r\n pushProductsPageImpression(products)\r\n }\r\n if (pageInfo.currentStepNo === 2) {\r\n priceQuotePageLoadEvent(tilbudsdata)\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata, 'GTMLogging-activeProductData': activeProductData, 'GTMLogging-pageInfo': pageInfo })\r\n }\r\n}\r\n\r\nexport const purchaseLoadEvent = (tilbudsdata) => {\r\n try {\r\n app.logInformationToAppInsight('GTMLogging purchaseLoadEvent gtm init with tilbudsdata', tilbudsdata)\r\n window.gtm_Data.init(tilbudsdata)\r\n pushPurchasePageLoad()\r\n pushPurchaseCompletedVirtualPageLoad(tilbudsdata)\r\n pushEcommerceEvent()\r\n window.gtm_Data.clean()\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-tilbudsdata': tilbudsdata })\r\n }\r\n}\r\n\r\nexport const onSectionLoaded = (pageInfo) => {\r\n try {\r\n updatePageInfo(pageInfo)\r\n if (window.gtm_Data.pageInfo.page === 'checkout') {\r\n onWizardStep()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-pageInfo': pageInfo })\r\n }\r\n}\r\n","/* global dataLayer */\r\n\r\nimport { app } from '../../Site/dk-ifshop-application'\r\nimport {\r\n getGTMProductsForPageImpression,\r\n getTotalRevenue\r\n} from './state/utility'\r\n\r\nexport const pushProductsPageImpression = (products) => {\r\n dataLayer.push({\r\n event: 'Product Page Impression',\r\n ecommerce: {\r\n currencyCode: 'DKK',\r\n detail: {\r\n products\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushEntryPageLoad = (tilbudData, activeProductData) => {\r\n dataLayer.push({\r\n event: 'Page Load',\r\n environmentInfo: getEnvironmentInfo(),\r\n pageInfo: getPageInfo(false, window.gtm_Data.pageInfo.page, window.gtm_Data.pageInfo.currentStepNo),\r\n customerInfo: window.gtm_Data.KundeInfo,\r\n productInfo: window.gtm_Data.GetProductsInfoArray(),\r\n processInfo: getProcessInfo('webshopentry'),\r\n objectInfo: window.gtm_Data.GetObjectInfoArray(),\r\n insuranceInfo: window.gtm_Data.GetInsuranceInfoArray()\r\n })\r\n}\r\n\r\nexport const pushPurchasePageLoad = () => {\r\n try {\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad')\r\n const customerInfo = window.gtm_Data.KundeInfo\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad customerInfo', customerInfo)\r\n\r\n const productInfo = window.gtm_Data.GetProductsInfoArray()\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad productInfo', productInfo)\r\n\r\n const processInfo = getProcessInfo('purchase')\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad processInfo', processInfo)\r\n\r\n const objectInfo = window.gtm_Data.GetObjectInfoArray()\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad objectInfo', objectInfo)\r\n\r\n const insuranceInfo = window.gtm_Data.GetInsuranceInfoArray()\r\n app.logInformationToAppInsight('GTMLogging pushPurchasePageLoad insuranceInfo', insuranceInfo)\r\n\r\n dataLayer.push({\r\n event: 'Page Load',\r\n environmentInfo: getEnvironmentInfo(),\r\n pageInfo: getPageInfo(false, window.gtm_Data.pageInfo.page, window.gtm_Data.pageInfo.currentStepNo),\r\n customerInfo,\r\n productInfo,\r\n processInfo,\r\n objectInfo,\r\n insuranceInfo\r\n })\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { ErrorType: 'GTMLogging' })\r\n }\r\n}\r\n\r\nexport const pushPriceQuotePageLoad = (tilbudData, activeProductData) => {\r\n dataLayer.push({\r\n event: 'Page Load',\r\n environmentInfo: getEnvironmentInfo(),\r\n pageInfo: getPageInfo(false, window.gtm_Data.pageInfo.page, window.gtm_Data.pageInfo.currentStepNo),\r\n customerInfo: window.gtm_Data.KundeInfo,\r\n productInfo: window.gtm_Data.GetProductsInfoArray(),\r\n processInfo: getProcessInfo('price'),\r\n objectInfo: window.gtm_Data.GetObjectInfoArray(),\r\n insuranceInfo: window.gtm_Data.GetInsuranceInfoArray()\r\n })\r\n}\r\n\r\nexport const pushMaxiCartPageLoad = () => {\r\n dataLayer.push({\r\n event: 'Page Load',\r\n environmentInfo: getEnvironmentInfo(),\r\n pageInfo: getPageInfo(false, window.gtm_Data.pageInfo.page, window.gtm_Data.pageInfo.currentStepNo),\r\n customerInfo: window.gtm_Data.KundeInfo,\r\n productInfo: window.gtm_Data.GetProductsInfoArray(),\r\n processInfo: getProcessInfo('maxicart'),\r\n objectInfo: window.gtm_Data.GetObjectInfoArray(),\r\n insuranceInfo: window.gtm_Data.GetInsuranceInfoArray()\r\n })\r\n}\r\n\r\nexport const pushPageLoadOnCheckout = (step) => {\r\n dataLayer.push({\r\n event: 'Page Load',\r\n environmentInfo: getEnvironmentInfo(),\r\n pageInfo: getPageInfo(true, 'checkout', step),\r\n processInfo: getProcessInfo('checkout', step),\r\n productInfo: window.gtm_Data.GetProductsInfoArray(),\r\n objectInfo: window.gtm_Data.GetObjectInfoArray(),\r\n customerInfo: window.gtm_Data.KundeInfo,\r\n insuranceInfo: window.gtm_Data.GetInsuranceInfoArray()\r\n })\r\n}\r\n\r\nexport const pushCheckoutStepLoadOnCheckout = (step) => {\r\n dataLayer.push({\r\n event: 'Checkout Step',\r\n ecommerce: {\r\n currencyCode: 'DKK',\r\n checkout: {\r\n actionField: { step },\r\n products: window.gtm_Data.GetProductsInfoArray()\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushPurchaseCompletedVirtualPageLoad = (data) => {\r\n dataLayer.push({\r\n event: 'Virtual Page Load',\r\n processInfo: getProcessInfo('purchase'),\r\n pageInfo: getPageInfo(true, 'purchaseCompleted', window.gtm_Data.pageInfo.currentStepNo),\r\n insuranceInfo: {\r\n insurancePayment: {\r\n invoice: window.gtm_Data.Invoice,\r\n period: window.gtm_Data.Period\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushEcommerceEvent = () => {\r\n const id = Date.now().toString() + Math.floor(Math.random() * 1000).toString()\r\n dataLayer.push({\r\n event: 'Purchase',\r\n ecommerce: {\r\n purchase: {\r\n actionField: {\r\n id, // Transaction ID. Required for purchases and refunds.\r\n revenue: getTotalRevenue() // Total transaction value (incl. tax and shipping)\r\n },\r\n products: window.gtm_Data.GetProductsInfoArray()\r\n }\r\n }\r\n })\r\n}\r\n\r\n// will get its model from the serverside, so the data does not come from\r\n// gtmTrackingMetaData in app.\r\nexport const pushAddToCartInformation = (data) => {\r\n dataLayer.push({\r\n event: 'Add to Cart',\r\n ecommerce: {\r\n currencyCode: 'DKK',\r\n add: {\r\n products: [{\r\n name: data.productName,\r\n id: data.productId,\r\n quantity: 1\r\n }]\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushRemoveFromCartInformation = (data) => {\r\n dataLayer.push({\r\n event: 'Remove from Cart',\r\n ecommerce: {\r\n currencyCode: 'DKK',\r\n remove: {\r\n products: [{\r\n name: data.productName,\r\n id: data.id,\r\n brand: data.brand,\r\n category: undefined, // will be populated with LOB-info by using productName.localName in a lookup table within GTM.\r\n price: data.price,\r\n quantity: 1\r\n }]\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushPriceChangingEvent = () => {\r\n dataLayer.push({\r\n event: 'Insurance Information Updated',\r\n insuranceInfo: window.gtm_Data.GetInsuranceInfoArray()\r\n })\r\n}\r\n\r\nexport const pushVirtualPageLoad = (location) => {\r\n dataLayer.push({\r\n event: 'Virtual Page Load',\r\n pageInfo: {\r\n pageType: 'Webshop Page',\r\n pageLanguage: 'DA',\r\n pageUrl: '/Webshop/' + location,\r\n canonicalPageUrl: '/Webshop/' + location\r\n }\r\n })\r\n}\r\n\r\nexport const pushCustomerInformationUpdate = () => {\r\n dataLayer.push({\r\n event: 'Insurance Information Updated',\r\n customerInfo: window.gtm_Data.KundeInfo\r\n })\r\n}\r\n\r\n// customerid should be enigmatized ssn\r\nexport const pushAjaxError = (data) => {\r\n dataLayer.push({\r\n event: 'Web Shop Server Error',\r\n customerInfo: {\r\n customerId: {\r\n id: data.customerId,\r\n type: 'SSN'\r\n },\r\n processInfo: {\r\n name: 'webshop',\r\n processStep: {\r\n mainStep: 'error',\r\n subStep: undefined\r\n }\r\n },\r\n objectInfo: undefined,\r\n insuranceInfo: undefined,\r\n errorInformation: {\r\n errorCode: data.errorCode,\r\n errorText: data.errorText\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const pushInvalidRegistrationNumberEvent = (regInfo) => {\r\n dataLayer.push({\r\n event: 'Web Shop Server Error',\r\n processInfo: {\r\n name: 'webshop',\r\n processStep: {\r\n mainStep: 'error',\r\n subStep: undefined\r\n }\r\n },\r\n objectInfo: {\r\n objectId: {\r\n id: regInfo.enigmaRegNr,\r\n type: 'REG'\r\n }\r\n },\r\n insuranceInfo: {\r\n errorCode: 'Server - ' + regInfo.errorCode\r\n }\r\n })\r\n}\r\n\r\nexport const getEnvironmentInfo = () => {\r\n if (app && app.GetNissanContext()) {\r\n return {\r\n country: 'Denmark',\r\n businessArea: 'PRI',\r\n portfolio: 'Alliance',\r\n partner: 'nissan'\r\n }\r\n } else {\r\n return {\r\n country: 'Denmark',\r\n businessArea: 'PRI',\r\n portfolio: 'if.dk',\r\n partner: ''\r\n }\r\n }\r\n}\r\nexport const currentUrl = () => {\r\n return window.location.href\r\n}\r\n\r\nexport const canonicalUrl = () => {\r\n const canonicalLink = document.querySelector(\"link[rel='canonical']\")\r\n if (canonicalLink != null) {\r\n return canonicalLink.getAttribute('href')\r\n }\r\n return ''\r\n}\r\n\r\nexport const getPageInfo = (isVirtualPage, page, stepno) => {\r\n let pageUrl = currentUrl()\r\n let canonicalUrl = ''\r\n const httpStatusCode = ''\r\n let pageType = 'Webshop Page'\r\n\r\n if (page == 'produkt') {\r\n // should we have virtual urls, here\r\n } else if (page == 'checkout') {\r\n if (isVirtualPage) {\r\n canonicalUrl = '/Webshop/Checkout step ' + stepno\r\n }\r\n pageUrl = window.location.href\r\n } else if (page == 'kvittering') {\r\n if (isVirtualPage) {\r\n pageUrl = '/Webshop/Tak for dit køb'\r\n canonicalUrl = '/Webshop/Tak for dit køb'\r\n }\r\n pageType = 'Webshop Confirmation Page'\r\n } else if (page === 'purchaseCompleted') {\r\n // virtual version of kvittering page\r\n pageType = 'Webshop Confirmation Page'\r\n }\r\n\r\n return {\r\n pageType,\r\n pageLanguage: 'DA',\r\n pageUrl,\r\n canonicalPageUrl: canonicalUrl,\r\n httpStatusCode\r\n }\r\n}\r\n\r\nexport const getProcessInfo = (mainStep, substep) => {\r\n return {\r\n name: 'webshop',\r\n mainstep: mainStep,\r\n substep\r\n }\r\n}\r\n\r\nexport const getProductForPageImpression = (data) => {\r\n return {\r\n name: data.productName,\r\n id: data.productId,\r\n category: undefined,\r\n quantity: 1,\r\n // if on entry page also add property below - todo: ask about this\r\n brand: data.brand,\r\n // price if on pricequote page\r\n price: data.price\r\n }\r\n}\r\n\r\nexport const getProductsForPageImpression = (data) => {\r\n const products = getGTMProductsForPageImpression()\r\n if (products.length) {\r\n return products.map((product) => {\r\n return {\r\n name: product.productName,\r\n id: product.productId,\r\n category: undefined,\r\n quantity: 1,\r\n // if on entry page also add property below - todo: ask about this\r\n brand: product.brand,\r\n // price if on pricequote page\r\n price: product.price\r\n }\r\n })\r\n }\r\n return []\r\n}\r\n","export const SaveGTMState = function () {\r\n if (window.sessionStorage) {\r\n window.sessionStorage.setItem('gtm_Data', JSON.stringify(window.gtm_Data))\r\n }\r\n}\r\n","/* The functions in this file should only operate on the state of the activeProduct,\r\nmeaning the product that is being worked currently, that means it could be stored on server if\r\nsynced but not necessarily. So the most likely truth is that these functions should always be called using the clientside activeProduct. */\r\nexport const getSelectedAddons = function (activeProduct) {\r\n if (activeProduct && activeProduct.Daekning) {\r\n const selectedAddons = activeProduct.Daekning.Daekninger.filter((addon) => addon.Valgt)\r\n return selectedAddons.map((addon) => {\r\n return { Navn: addon.Navn, NettoMdTilvalgsPris: addon.NettoMdTilvalgsPris }\r\n })\r\n }\r\n return []\r\n}\r\n\r\nexport const getPaymentPeriod = function (activeProduct) {\r\n if (activeProduct.Termin) {\r\n return activeProduct.Termin\r\n }\r\n return ''\r\n}\r\n\r\nexport const getActiveProductTravelArea = function (activeProduct) {\r\n if (activeProduct.produktNavn === 'rejse') {\r\n let travelArea = 'Europe'\r\n if (activeProduct.RejseforsikringsOmraade == 'V') {\r\n travelArea = 'World'\r\n }\r\n return travelArea\r\n }\r\n return ''\r\n}\r\n\r\nexport const getActiveProductCoveredAmount = function (activeProduct) {\r\n switch (activeProduct.produktNavn) {\r\n case 'liv':\r\n {\r\n return activeProduct.DodSum\r\n }\r\n case 'ulykke': {\r\n return activeProduct.InvaliditetSum\r\n }\r\n case 'mc': {\r\n return activeProduct.BagageboxSum\r\n }\r\n case 'familie': {\r\n return activeProduct.IndboSum\r\n }\r\n case 'rejse': {\r\n return activeProduct.BagageSum\r\n }\r\n default: {\r\n return ''\r\n }\r\n }\r\n}\r\n\r\nexport const getActiveProductMileage = function (activeProduct, isCheckout) {\r\n if (activeProduct.produktNavn === 'bil') {\r\n if (isCheckout) {\r\n return activeProduct.KmAArlig\r\n }\r\n }\r\n return ''\r\n}\r\n\r\nexport const getPostalCodeInformation = function (activeProduct) {\r\n if (!activeProduct) return ''\r\n if (activeProduct.produktNavn === 'familie' || activeProduct.produktNavn === 'hus') {\r\n if (activeProduct.Postnr) {\r\n return activeProduct.Postnr.toString()\r\n }\r\n }\r\n return ''\r\n}\r\n\r\nexport const getYearInformation = function (activeProduct) {\r\n if (!activeProduct) return ''\r\n\r\n switch (activeProduct.produktNavn) {\r\n case 'familie':\r\n {\r\n // todo: investigate, not sure Alder really means age of house here\r\n if (activeProduct.Alder) {\r\n return (new Date().getFullYear() - parseInt(activeProduct.Alder)).toString()\r\n }\r\n return ''\r\n }\r\n case 'hus':\r\n {\r\n if (activeProduct.OpfoerelsesAar) {\r\n return activeProduct.OpfoerelsesAar.toString()\r\n }\r\n return ''\r\n }\r\n case 'bil':\r\n {\r\n if (activeProduct.Model) {\r\n return activeProduct.Model.Year.toString()\r\n }\r\n return ''\r\n }\r\n case 'lille knallert':\r\n case 'stor knallert':\r\n {\r\n return ''\r\n }\r\n case 'campingvogn':\r\n {\r\n if (activeProduct.AargangCampingvogn) {\r\n return activeProduct.AargangCampingvogn.toString()\r\n }\r\n return ''\r\n }\r\n case 'trailer':\r\n {\r\n if (activeProduct.AargangTrailer) {\r\n return activeProduct.AargangTrailer.toString()\r\n }\r\n return ''\r\n }\r\n case 'boat':\r\n {\r\n return activeProduct.Year\r\n }\r\n case 'hund':\r\n {\r\n if (activeProduct.FoedselsDatoStr) {\r\n return activeProduct.FoedselsDatoStr.toString()\r\n }\r\n return ''\r\n }\r\n default:\r\n {\r\n return ''\r\n }\r\n }\r\n}\r\n\r\nexport const getModelInformation = function (activeProduct) {\r\n if (!activeProduct) return ''\r\n\r\n switch (activeProduct.produktNavn) {\r\n case 'bil':\r\n {\r\n if (!activeProduct.Model) {\r\n return ''\r\n }\r\n return activeProduct.Model.Make + ' ' + activeProduct.Model.Model\r\n }\r\n case 'lille knallert':\r\n case 'stor knallert':\r\n {\r\n if (!activeProduct.DMRModel) {\r\n return ''\r\n }\r\n return activeProduct.DMRModel.Maerke + ' ' + activeProduct.Model.Model\r\n }\r\n case 'boat':\r\n {\r\n return activeProduct.Model\r\n }\r\n case 'hund':\r\n {\r\n return activeProduct.Race\r\n }\r\n default:\r\n {\r\n return ''\r\n }\r\n }\r\n}\r\n\r\nexport const getLeaseObjectInformation = function (activeProduct) {\r\n if (activeProduct.produktNavn === 'bil') {\r\n return !activeProduct.ErBilenLeaset ? 'false' : 'true'\r\n }\r\n return 'false'\r\n}\r\n\r\nexport const getPaymentProvider = function (paymentProvider) {\r\n switch (paymentProvider) {\r\n case 0:\r\n {\r\n return 'unknown'\r\n }\r\n case 1:\r\n {\r\n return 'einvoice'\r\n }\r\n case 2:\r\n {\r\n return 'giro'\r\n }\r\n case 3:\r\n {\r\n return 'mobilePay'\r\n }\r\n default:\r\n {\r\n return 'unknown'\r\n }\r\n }\r\n}\r\n","import {\r\n getPageInfoState\r\n} from '././utility'\r\n\r\nimport {\r\n SaveGTMState\r\n} from '././storage'\r\n\r\nimport {\r\n getYearInformation,\r\n getPostalCodeInformation,\r\n getModelInformation,\r\n getLeaseObjectInformation,\r\n getPaymentProvider,\r\n getSelectedAddons,\r\n getActiveProductMileage,\r\n getActiveProductCoveredAmount,\r\n getActiveProductTravelArea\r\n} from './productutil'\r\nimport { app } from '../../../Site/dk-ifshop-application'\r\n\r\nexport const updateObjectInfoStateBasedOnProductChange = function (productData) {\r\n try {\r\n if (window.gtm_Data && window.gtm_Data.ObjectInfoArray &&\r\n window.gtm_Data.ObjectInfoArray.length > 0 && productData.product) {\r\n for (let i = 0, l = window.gtm_Data.ObjectInfoArray.length; i < l; ++i) {\r\n if (window.gtm_Data.ObjectInfoArray[i].UniqueId === productData.product.UniqueId) {\r\n window.gtm_Data.ObjectInfoArray[i].year = getYearInformation(productData.product)\r\n window.gtm_Data.ObjectInfoArray[i].postalcode = getPostalCodeInformation(productData.product)\r\n window.gtm_Data.ObjectInfoArray[i].model = getModelInformation(productData.product)\r\n window.gtm_Data.ObjectInfoArray[i].leased = getLeaseObjectInformation(productData.product)\r\n break\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-productData': productData })\r\n }\r\n}\r\n\r\nexport const updateInsuranceInfoPrice = function (onOrAfterPricePage, insurance, priceUpdate) {\r\n if (!insurance) return\r\n if (onOrAfterPricePage) {\r\n insurance.price = priceUpdate\r\n } else {\r\n insurance.price = ''\r\n }\r\n}\r\n\r\nexport const updateInsuranceInfoDeductable = function (onOrAfterPricePage, insurance, selvrisikoUpdate) {\r\n if (!insurance) return\r\n if (onOrAfterPricePage) {\r\n insurance.insuranceDeductable = selvrisikoUpdate\r\n } else {\r\n insurance.insuranceDeductable = ''\r\n }\r\n}\r\n\r\nexport const GetMilageValue = (index) => {\r\n if (!index) {\r\n return 'Op til 10.000 km'\r\n }\r\n\r\n const i = parseInt(index)\r\n\r\n switch (i) {\r\n case 1: {\r\n return 'Op til 10.000 km'\r\n }\r\n case 2: {\r\n return 'Op til 15.000 km'\r\n }\r\n case 3: {\r\n return 'Op til 20.000 km'\r\n }\r\n case 4: {\r\n return 'Op til 25.000 km'\r\n }\r\n case 5: {\r\n return 'Op til 30.000 km'\r\n }\r\n case 6: {\r\n return 'Op til 40.000 km'\r\n }\r\n case 7: {\r\n return 'Over 40.000 km'\r\n }\r\n default: {\r\n return 'Op til 10.000 km'\r\n }\r\n }\r\n}\r\n\r\nexport const updateInsuranceInfoMileage = function (onOrAfterPricePage, insurance, mileageUpdate, productName) {\r\n if (!insurance) return\r\n if (onOrAfterPricePage && productName === 'bil') {\r\n insurance.mileage = GetMilageValue(mileageUpdate)\r\n } else {\r\n insurance.mileage = ''\r\n }\r\n}\r\n\r\nexport const updatePaymentFrequency = function (frequency) {\r\n if (window.gtm_Data && window.gtm_Data.InsuranceInfoArray && window.gtm_Data.InsuranceInfoArray.length > 0) {\r\n if (frequency == 12) {\r\n window.gtm_Data.Period = 'yearly'\r\n } else if (frequency == 1) {\r\n window.gtm_Data.Period = 'monthly'\r\n }\r\n window.gtm_Data.InsuranceInfoArray.forEach(insurance => {\r\n if (insurance && insurance.insurancePayment) {\r\n insurance.insurancePayment.period = window.gtm_Data.Period\r\n }\r\n })\r\n SaveGTMState()\r\n }\r\n}\r\n\r\nexport const updatePaymentProvider = function (computedProvider) {\r\n const provider = app.getPaymentProvider(computedProvider)\r\n if (window.gtm_Data && window.gtm_Data.InsuranceInfoArray && window.gtm_Data.InsuranceInfoArray.length > 0) {\r\n window.gtm_Data.Invoice = provider\r\n window.gtm_Data.InsuranceInfoArray.forEach(insurance => {\r\n if (insurance && insurance.insurancePayment) {\r\n insurance.insurancePayment.invoice = window.gtm_Data.Invoice\r\n }\r\n })\r\n SaveGTMState()\r\n }\r\n}\r\n\r\nexport const InsuranceAddonsListsAreEqual = function (oldAddons, newAddons) {\r\n const oldCount = oldAddons.length\r\n const newCount = newAddons.length\r\n\r\n if (oldCount !== newCount) return false\r\n for (let index = 0; index < oldCount; index++) {\r\n const element = oldAddons[index]\r\n const newElement = newAddons[index]\r\n\r\n if (newElement) {\r\n if (element.price != newElement.price || element.value != newElement.value) {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport const InsuranceInfoHasChanged = (data) => {\r\n if (window.gtm_Data && window.gtm_Data.InsuranceInfoArray &&\r\n window.gtm_Data.InsuranceInfoArray.length > 0 && data.UniqueId) {\r\n for (let i = 0, l = window.gtm_Data.InsuranceInfoArray.length; i < l; ++i) {\r\n if (window.gtm_Data.InsuranceInfoArray[i].UniqueId === data.UniqueId) {\r\n if (window.gtm_Data.InsuranceInfoArray[i].insuranceDeductable != data.selvrisikoUpdate ||\r\n window.gtm_Data.InsuranceInfoArray[i].mileage != data.mileageUpdate ||\r\n window.gtm_Data.InsuranceInfoArray[i].price != data.priceUpdate ||\r\n !InsuranceAddonsListsAreEqual(window.gtm_Data.InsuranceInfoArray[i].insuranceAddons, data.insuranceAddonsUpdate) ||\r\n window.gtm_Data.InsuranceInfoArray[i].coveredAmount != data.coveredAmountUpdate ||\r\n window.gtm_Data.InsuranceInfoArray[i].insuranceTravel != data.updatedTravelArea ||\r\n window.gtm_Data.InsuranceInfoArray[i].coverage != data.coverageUpdate\r\n ) {\r\n return true\r\n }\r\n break\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const UpdateInsuranceInfoStateBasedOnPriceChange = function (data) {\r\n try {\r\n if (window.gtm_Data && window.gtm_Data.InsuranceInfoArray &&\r\n window.gtm_Data.InsuranceInfoArray.length > 0 && data.UniqueId) {\r\n for (let i = 0, l = window.gtm_Data.InsuranceInfoArray.length; i < l; ++i) {\r\n if (window.gtm_Data.InsuranceInfoArray[i].UniqueId === data.UniqueId) {\r\n const onPricePageOrAfter = !window.gtm_Data.ValidToSetPriceParameters()\r\n updateInsuranceInfoDeductable(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], data.selvrisikoUpdate)\r\n updateInsuranceInfoMileage(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], data.mileageUpdate, data.productName)\r\n updateInsuranceInfoPrice(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], data.priceUpdate)\r\n window.gtm_Data.InsuranceInfoArray[i].insuranceAddons = data.insuranceAddonsUpdate\r\n window.gtm_Data.InsuranceInfoArray[i].coveredAmount = data.coveredAmountUpdate\r\n window.gtm_Data.InsuranceInfoArray[i].insuranceTravel = data.updatedTravelArea\r\n window.gtm_Data.InsuranceInfoArray[i].coverage = data.coverageUpdate\r\n break\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-data': data })\r\n }\r\n}\r\n\r\nexport const updateInsuranceInfoStateBasedOnProductChange = function (productData) {\r\n try {\r\n if (window.gtm_Data && window.gtm_Data.InsuranceInfoArray &&\r\n window.gtm_Data.InsuranceInfoArray.length > 0 && productData.product) {\r\n for (let i = 0, l = window.gtm_Data.InsuranceInfoArray.length; i < l; ++i) {\r\n if (window.gtm_Data.InsuranceInfoArray[i].UniqueId === productData.UniqueId) {\r\n let selvrisiko = ''\r\n const onPricePageOrAfter = !window.gtm_Data.ValidToSetPriceParameters()\r\n if (onPricePageOrAfter && productData.product.Selvrisiko) {\r\n selvrisiko = productData.product.Selvrisiko\r\n }\r\n\r\n let price = ''\r\n if (onPricePageOrAfter && productData.product.Daekning) {\r\n price = productData.product.Daekning.NettoPraemieTotal\r\n }\r\n\r\n let coverage = ''\r\n if (productData.product.Daekning) {\r\n coverage = productData.product.Daekning.Navn\r\n }\r\n\r\n const brand = 'if.dk'\r\n\r\n let educationLevel = ''\r\n if (productData.product && productData.product.UddannelsesNiveau) {\r\n educationLevel = productData.product.UddannelsesNiveau\r\n }\r\n\r\n const insuredPerson = productData.complimentaryInformation.insuredPerson\r\n const ownerYear = productData.complimentaryInformation.OwnerYear\r\n const paymentProvider = productData.complimentaryInformation.PaymentProvider\r\n const paymentPeriod = productData.complimentaryInformation.PaymentPeriod\r\n\r\n window.gtm_Data.InsuranceInfoArray[i].insurancePayment.invoice = getPaymentProvider(paymentProvider)\r\n window.gtm_Data.InsuranceInfoArray[i].insurancePayment.period = paymentPeriod\r\n window.gtm_Data.InsuranceInfoArray[i].brand = brand\r\n window.gtm_Data.InsuranceInfoArray[i].insuranceAddons = getSelectedAddons(productData.product)\r\n window.gtm_Data.InsuranceInfoArray[i].coverage = coverage\r\n\r\n updateInsuranceInfoDeductable(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], selvrisiko)\r\n updateInsuranceInfoMileage(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], getActiveProductMileage(productData.product, window.gtm_Data.pageInfo.page === 'checkout'))\r\n updateInsuranceInfoPrice(onPricePageOrAfter, window.gtm_Data.InsuranceInfoArray[i], price)\r\n\r\n window.gtm_Data.InsuranceInfoArray[i].highestEducation = educationLevel\r\n window.gtm_Data.InsuranceInfoArray[i].coveredAmount = getActiveProductCoveredAmount(productData.product)\r\n window.gtm_Data.InsuranceInfoArray[i].insuranceTravel = getActiveProductTravelArea(productData.product)\r\n\r\n window.gtm_Data.InsuranceInfoArray[i].insuredPerson = insuredPerson\r\n window.gtm_Data.InsuranceInfoArray[i].OwnerYear = ownerYear\r\n break\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-productData': productData })\r\n }\r\n}\r\n\r\nexport const updatePageInfo = function (pageInfo) {\r\n try {\r\n if (window.gtm_Data) {\r\n if (!window.gtm_Data.pageInfo || Object.keys(window.gtm_Data.pageInfo) === 0) {\r\n window.gtm_Data.pageInfo = getPageInfoState(pageInfo)\r\n } else {\r\n window.gtm_Data.pageInfo.page = pageInfo.page\r\n window.gtm_Data.pageInfo.currentStepNo = pageInfo.currentStepNo\r\n window.gtm_Data.pageInfo.sessionId = pageInfo.sessionId\r\n window.gtm_Data.pageInfo.hasWizard = pageInfo.hasWizard\r\n }\r\n SaveGTMState()\r\n }\r\n } catch (error) {\r\n app.logExceptionToAppInsight(error, { 'GTMLogging-pageInfo': pageInfo })\r\n }\r\n}\r\n","import { app } from '../../../Site/dk-ifshop-application'\r\n\r\n/* Utility function for gender */\r\nexport const getGender = function (Kunde) {\r\n if (Kunde && Kunde.CprNr) {\r\n const genderDigit = parseInt(Kunde.CprNr.substr(8, 9))\r\n\r\n if (genderDigit % 2 == 0) {\r\n return 'Female'\r\n } else {\r\n return 'Male'\r\n }\r\n } else {\r\n return 'Unknown'\r\n }\r\n}\r\n\r\n/* Calculate discounts for the customer */\r\nexport const getCustomerDiscounts = function () {\r\n if (!window.gtm_Data || !window.gtm_Data.InsuranceInfoArray) {\r\n return []\r\n }\r\n\r\n let totalBenefitProgramDiscount = 0\r\n let totalInternetDiscount = 0\r\n let totalOtherDiscount = 0\r\n\r\n window.gtm_Data.InsuranceInfoArray.forEach(function (data) {\r\n if (data.discounts) {\r\n data.discounts\r\n .filter(disc => disc.type === 'benefitProgram')\r\n .forEach(function (discount) {\r\n totalBenefitProgramDiscount += discount.value\r\n })\r\n\r\n data.discounts\r\n .filter(disc => disc.type === 'internet')\r\n .forEach(function (discount) {\r\n totalInternetDiscount += discount.value\r\n })\r\n\r\n data.discounts\r\n .filter(disc => disc.type === 'other')\r\n .forEach(function (discount) {\r\n totalOtherDiscount += discount.value\r\n })\r\n }\r\n })\r\n\r\n const discounts = []\r\n\r\n if (totalBenefitProgramDiscount > 0) {\r\n discounts.push({\r\n type: 'benefitProgram',\r\n value: totalBenefitProgramDiscount,\r\n unit: 'absolute'\r\n })\r\n }\r\n\r\n if (totalInternetDiscount > 0) {\r\n discounts.push({\r\n type: 'internet',\r\n value: totalInternetDiscount,\r\n unit: 'absolute'\r\n })\r\n }\r\n\r\n if (totalOtherDiscount > 0) {\r\n discounts.push({\r\n type: 'other',\r\n value: totalOtherDiscount,\r\n unit: 'absolute'\r\n })\r\n }\r\n\r\n return discounts\r\n}\r\n\r\n/* Revenue calculation */\r\nexport const getTotalRevenue = function () {\r\n let totalRevenue = 0\r\n if (!window.gtm_Data || !window.gtm_Data.InsuranceInfoArray) {\r\n return ''\r\n }\r\n\r\n for (let i = 0; i < window.gtm_Data.InsuranceInfoArray.length; i++) {\r\n totalRevenue += parseInt(window.gtm_Data.InsuranceInfoArray[i].price)\r\n }\r\n if (totalRevenue === 0) {\r\n return ''\r\n }\r\n return totalRevenue.toString()\r\n}\r\n\r\nexport const GetRemoveData = function (uniqueId, productId) {\r\n let insurance\r\n let product\r\n\r\n if (uniqueId) {\r\n insurance = window.gtm_Data.InsuranceInfoArray.filter(product => product.UniqueId == uniqueId)\r\n product = window.gtm_Data.ProductsInfoArray.filter(product => product.UniqueId == uniqueId)\r\n } else {\r\n insurance = window.gtm_Data.InsuranceInfoArray.filter(product => product.productId == productId)\r\n product = window.gtm_Data.ProductsInfoArray.filter(product => product.productId == productId)\r\n }\r\n\r\n let name = ''\r\n let price\r\n\r\n if (insurance[0]) {\r\n price = insurance[0].price\r\n }\r\n\r\n if (product[0]) {\r\n name = product[0].localName\r\n }\r\n\r\n return {\r\n id: productId,\r\n productName: name,\r\n price,\r\n brand: 'if.dk'\r\n }\r\n}\r\n\r\n/* Return array of productPageImpression datamodels. */\r\nexport const getGTMProductsForPageImpression = function () {\r\n if (window.gtm_Data &&\r\n window.gtm_Data.InsuranceInfoArray &&\r\n window.gtm_Data.InsuranceInfoArray.length) {\r\n return window.gtm_Data.InsuranceInfoArray.map((info) => {\r\n return {\r\n name: info.id,\r\n id: info.productId,\r\n price: info.price,\r\n brand: info.brand,\r\n quantity: 1,\r\n category: undefined\r\n }\r\n })\r\n }\r\n return []\r\n}\r\n\r\nconst getProductId = () => {\r\n if (window.location.href) {\r\n const url = window.location.href\r\n if (url.toLowerCase().endsWith('bilforsikring')) {\r\n return 'bil'\r\n }\r\n if (url.toLowerCase().endsWith('ulykkesforsikring')) {\r\n return 'ulykke'\r\n }\r\n if (url.toLowerCase().endsWith('boerneforsikring')) {\r\n return 'ulykkeBarn'\r\n }\r\n if (url.toLowerCase().endsWith('indboforsikring')) {\r\n return 'familie'\r\n }\r\n if (url.toLowerCase().endsWith('rejseforsikring')) {\r\n return 'rejse'\r\n }\r\n if (url.toLowerCase().endsWith('husforsikring')) {\r\n return 'hus'\r\n }\r\n if (url.toLowerCase().endsWith('livsforsikring')) {\r\n return 'liv'\r\n }\r\n if (url.toLowerCase().endsWith('knallertforsikring')) {\r\n return 'knallert'\r\n }\r\n if (url.toLowerCase().endsWith('hundeforsikring')) {\r\n return 'hund'\r\n }\r\n if (url.toLowerCase().endsWith('trailerforsikring')) {\r\n return 'trailer'\r\n }\r\n if (url.toLowerCase().endsWith('campingvognforsikring')) {\r\n return 'campingvogn'\r\n }\r\n }\r\n return ''\r\n}\r\n\r\nexport const getGTMProductForPageImpressionUsingUrl = function () {\r\n if (window.location.href) {\r\n return [{\r\n name: getProductId(),\r\n id: 0,\r\n price: '0',\r\n brand: 'if.dk',\r\n quantity: 1,\r\n category: undefined\r\n }]\r\n }\r\n}\r\n\r\n// new array has to be an insuranceInfoArray\r\nexport const getInsuranceListsAreIdentical = function (newArray) {\r\n let validState\r\n if (window.gtm_Data && newArray && window.gtm_Data.InsuranceInfoArray && newArray.length === window.gtm_Data.InsuranceInfoArray.length) {\r\n for (let i = 0; i < window.gtm_Data.InsuranceInfoArray.length; i++) {\r\n validState = false\r\n for (let j = 0; j < newArray.length; j++) {\r\n const oldItem = window.gtm_Data.InsuranceInfoArray[i]\r\n const newItem = newArray[j]\r\n if (oldItem.productId == newItem.ProduktID && oldItem.UniqueId == newItem.UniqueId) {\r\n // match found\r\n validState = true\r\n break\r\n }\r\n // lastitem\r\n if (j === newArray.length - 1 && !validState) return false\r\n }\r\n }\r\n }\r\n return validState\r\n}\r\n\r\n// newArray is a produktOverblikk array try to use insuranceArray\r\nexport const getInsuranceDiffForCart = function (newArray) {\r\n const newArrayIsInInitState = (!newArray || newArray.length === 0)\r\n const oldArrayIsInInitState = (!window.gtm_Data.InsuranceInfoArray || window.gtm_Data.InsuranceInfoArray.length === 0)\r\n\r\n if (newArrayIsInInitState && oldArrayIsInInitState) {\r\n // console.log('No difference detected')\r\n } else {\r\n // Handle init state TODO:Establish if we have PaymentProvider och BetalingsTermin\r\n if (!newArrayIsInInitState && oldArrayIsInInitState) {\r\n return newArray[0]\r\n }\r\n if (!oldArrayIsInInitState && newArrayIsInInitState) {\r\n return window.gtm_Data.InsuranceInfoArray[0]\r\n }\r\n\r\n // matching, do nothing\r\n if (newArray.length === window.gtm_Data.InsuranceInfoArray.length) {\r\n return undefined\r\n } else if (newArray.length > window.gtm_Data.InsuranceInfoArray.length) {\r\n // adding\r\n const newEntries = newArray.filter((obj) => {\r\n return !window.gtm_Data.InsuranceInfoArray.some((obj2) => {\r\n return obj.UniqueId == obj2.UniqueId\r\n })\r\n })\r\n if (newEntries.length > 0) {\r\n return newEntries[0]\r\n }\r\n } else if (newArray.length < window.gtm_Data.InsuranceInfoArray.length) {\r\n // removing\r\n const removedEntries = window.gtm_Data.InsuranceInfoArray.filter((obj) => {\r\n return !newArray.some((obj2) => {\r\n return obj.value == obj2.value\r\n })\r\n })\r\n if (removedEntries.length > 0) {\r\n return removedEntries[0]\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const getSelectedAddonsAsFormattedObjects = function (selectedAddons) {\r\n if (!selectedAddons) return []\r\n return selectedAddons.map((insurance) => {\r\n return {\r\n name: insurance.Navn,\r\n price: Math.round(insurance.NettoMdTilvalgsPris * 12)\r\n }\r\n })\r\n}\r\n\r\nexport const getPageInfoState = function () {\r\n const pageInfoState = {}\r\n pageInfoState.page = app !== undefined ? app.page : ''\r\n pageInfoState.sessionId = app !== undefined ? app.sessionId : ''\r\n pageInfoState.currentStepNo = app !== undefined && app.wizard !== undefined ? app.wizard.currentStepNo : ''\r\n pageInfoState.hasWizard = app !== undefined && app.wizard !== undefined\r\n return pageInfoState\r\n}\r\n","/* global $ */\r\n\r\nexport class trustpilotWidget {\r\n static init () {\r\n $(document).on('IfWebshopReady', function () {\r\n trustpilotWidget.attachBootStrapper()\r\n trustpilotWidget.attach()\r\n })\r\n\r\n $(document).on('onPageLoaded', function () {\r\n trustpilotWidget.attachBootStrapper()\r\n trustpilotWidget.attach()\r\n })\r\n }\r\n\r\n static attachBootStrapper () {\r\n if (!this.shouldAttach()) {\r\n return\r\n }\r\n const tagName = 'trustpilot_boot'\r\n const src = '//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js'\r\n let element = document.querySelector('script[src=\"' + src + '\"]')\r\n\r\n if (!element) {\r\n element = document.createElement('script')\r\n element.setAttribute('async', 'false')\r\n element.id = tagName\r\n element.name = tagName\r\n element.src = src\r\n element.type = 'text/javascript'\r\n document.getElementsByTagName('head')[0].appendChild(element)\r\n }\r\n }\r\n\r\n static attach () {\r\n if (!this.shouldAttach()) {\r\n return\r\n }\r\n\r\n const configElement = $('#trustpilot-widget-config')\r\n const config = JSON.parse(configElement.html())\r\n\r\n let widgetHtml\r\n\r\n if (window.innerWidth >= config.breakpoint) {\r\n widgetHtml = this.widgetHtmlWide()\r\n } else {\r\n widgetHtml = this.widgetHtmlThin()\r\n }\r\n\r\n if ($('div.ecmt-content').length > 0) {\r\n // webshop\r\n const elementHtml = `
${widgetHtml}
`\r\n $('div.ecmt-content').first().prepend(elementHtml)\r\n } else {\r\n // maxicart\r\n const elementHtml = `
${widgetHtml}
`\r\n $('main').last().prepend(elementHtml)\r\n }\r\n\r\n this.hasAttached = true\r\n }\r\n\r\n static shouldAttach () {\r\n if (this.hasAttached) {\r\n return false\r\n }\r\n\r\n if (window.app && window.app.page === 'kvittering') {\r\n return false\r\n }\r\n\r\n const configElement = $('#trustpilot-widget-config')\r\n\r\n if (configElement.length === 0) {\r\n return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n static widgetHtmlWide () {\r\n return '
Trustpilot
'\r\n }\r\n\r\n static widgetHtmlThin () {\r\n return '
Trustpilot
'\r\n }\r\n}\r\n","/* global */\r\n\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\n// Utility function for determining if a selection in the control can be made,\r\nexport const ExitEarlyConditionsMet = (addressControl, prefix) => {\r\n if (addressControl.element.value.length === 0) return true\r\n if (addressControl.lastValidatedValue === addressControl.element.value) return true\r\n const adressId = addressControl.getAddressId()\r\n if (addressControl.getVal().toLowerCase() !== addressControl.element.value.toLowerCase()) {\r\n return false\r\n } else if (prefix === PersonEntities.Medforsikret && addressControl.element.value && adressId === '') {\r\n return true\r\n }\r\n}\r\n\r\n// Utility function for determining if we are in the errorstate where the dawaId from the dawa response has not been correctly assigned to the addresscontrol.\r\nexport const SelectedAddressCanBeUsedToTriggerDawaQuery = (addressControl) => {\r\n return addressControl.getVal().toLowerCase() === addressControl.element.value.toLowerCase() && addressControl.getAddressId()\r\n}\r\n\r\n// Utility function for handling the case when the user appears to not have selected an actual address in the list.\r\nexport const FailureToSelect = (addressControl, prefix) => {\r\n const errorMessage = app.getFejlKodeText(\r\n 'CLIENT-AddressSelectFromList',\r\n 'Du skal vælge en adresse i listen, der vises, når du har indtastet de første bogstaver i din adresse.'\r\n )\r\n\r\n if (addressControl.getVal().toLowerCase() !== addressControl.element.value.toLowerCase()) {\r\n UpdateValidationUIIfNotValid(addressControl, errorMessage, false)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n// Utlity function for applying the correct validation state and errormessage to the adressmulticontrol named addressControl.\r\nexport const UpdateValidationUIIfNotValid = function (addressControl, errorMessage, valid) {\r\n addressControl.isEntryValid = valid\r\n addressControl.topElement.ifws_isInvalid = !valid\r\n h.updateElementValidation(\r\n addressControl.topElement,\r\n 'ifws_isInvalid',\r\n errorMessage,\r\n valid\r\n )\r\n}\r\n\r\n// Utility function for handling errormessages returned by the dawa rest endpoint for a specific addressmulticontrol.\r\nexport const ProcessErrorReturnedByDawa = (addressControl, errorMessage) => {\r\n const valid = false\r\n UpdateValidationUIIfNotValid(addressControl, errorMessage, valid)\r\n return valid\r\n}\r\n\r\n// Utility function for applying a required value validation to the addressmulticontrol that is responsible for communícating with dawa.\r\n// This method is used for the control for all different possible persons used.\r\n// prefix = '' (Customer) | prefix = forsikrede (The insured person) | prefix = Medforsikret (The coinsured person)\r\nexport const ApplyAddresValidationRule = (prefix) => {\r\n h.getSelectElmAsJqueryObject('Address', prefix).rules('add', {\r\n required: true,\r\n ifws_isInvalid: true,\r\n messages: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-Invalid_Address',\r\n 'Du kan desværre ikke beregne forsikring på den valgte adresse. Du er velkommen til at kontakte Webshop Service på tlf. nr. 70 12 12 53 for at høre nærmere.'\r\n )\r\n }\r\n })\r\n}\r\n\r\n// Utility function for collecting GPS longitude dawa address rest query.\r\nexport const GetLongitude = (data) => {\r\n if (data.d != 'edi') {\r\n if (data.adgangsadresse.adgangspunkt.koordinater && data.adgangsadresse.adgangspunkt.koordinater.length) {\r\n return data.adgangsadresse.adgangspunkt.koordinater[0]\r\n }\r\n }\r\n return ''\r\n}\r\n\r\n// Utility function for collecting GPS latitude dawa address rest query.\r\nexport const GetLatitude = (data) => {\r\n if (data.d != 'edi') {\r\n if (data.adgangsadresse.adgangspunkt.koordinater && data.adgangsadresse.adgangspunkt.koordinater.length) {\r\n return data.adgangsadresse.adgangspunkt.koordinater[1]\r\n }\r\n }\r\n}\r\n","/* global */\r\nimport { app } from '../dk-ifshop-application'\r\nimport { basic } from '../dk-ifshop-scripts'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nexport const handleUpdateLivErrorCallback = (errorMessage, prefix, addressControl, pElm) => {\r\n basic.UpdateValidationUIIfNotValid(addressControl, errorMessage, false)\r\n}\r\n\r\n// todo: Varför krävs en full sync när man skickar över enbart address, det behöver utredas.\r\nexport const processLivSuccessHandler = (data, prefix, addressControl, pElm) => {\r\n return new Promise((resolve, reject) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const errorMessage = app.getFejlKodeText(\r\n 'CLIENT-Invalid_Address',\r\n 'Du kan desværre ikke beregne forsikring på den valgte adresse. Du er velkommen til at kontakte Webshop Service på tlf. nr. 70 12 12 53 for at høre nærmere.'\r\n )\r\n\r\n if (prefix != PersonEntities.ForsikredePerson && prefix != PersonEntities.AndenForsikrede) {\r\n reject(data)\r\n return\r\n }\r\n\r\n // todo: add functionality to block indbo on invalid house type here.\r\n if (data.IsBlockedDueToUnavailableHouseCode) {\r\n handleUpdateLivErrorCallback(errorMessage, undefined)\r\n reject(data)\r\n }\r\n // Insured persons Cpr should not be updated when address is updated, this would reset any input that the customer have made\r\n // Override incoming Cpr with the client state\r\n // TODO: this is a work around. Instead only the insured persons address should be changed when address is changed, not the whole product\r\n data.Produkt.ForsikredePerson.CprNr = activeProduct.ForsikredePerson().CprNr()\r\n data.Produkt.ForsikredePerson.Cpr1 = activeProduct.ForsikredePerson().Cpr1()\r\n data.Produkt.ForsikredePerson.Cpr2 = activeProduct.ForsikredePerson().Cpr2()\r\n activeProduct.handleSyncV2SuccessCallback(data)\r\n\r\n resolve(data)\r\n })\r\n}\r\n","/* global */\r\nimport { app } from '../dk-ifshop-application'\r\nimport { basic } from '../dk-ifshop-scripts'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nexport const handleUpdateUlykkeErrorCallback = (errorMessage, prefix, addressControl, pElm) => {\r\n basic.UpdateValidationUIIfNotValid(addressControl, errorMessage, false)\r\n}\r\n\r\n// todo: Varför krävs en full sync när man skickar över enbart address, det behöver utredas.\r\nexport const processUlykkeSuccessHandler = (data, prefix, addressControl, pElm) => {\r\n return new Promise((resolve, reject) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const errorMessage = app.getFejlKodeText(\r\n 'CLIENT-Invalid_Address',\r\n 'Du kan desværre ikke beregne forsikring på den valgte adresse. Du er velkommen til at kontakte Webshop Service på tlf. nr. 70 12 12 53 for at høre nærmere.'\r\n )\r\n\r\n if (prefix != PersonEntities.ForsikredePerson && prefix != PersonEntities.AndenForsikrede) {\r\n reject(data)\r\n return\r\n }\r\n\r\n // todo: add functionality to block indbo on invalid house type here.\r\n if (data.IsBlockedDueToUnavailableHouseCode) {\r\n handleUpdateUlykkeErrorCallback(errorMessage, undefined)\r\n reject(data)\r\n }\r\n // Address update should not cause the whole product to update. In some cases it causes the previously input fields to be cleared (Cpr2 for accident and life as an example)\r\n // TODO: look into updating only the address for all products. The way implemented here might not be optimla though\r\n activeProduct.handleSyncAddressSuccessCallback(data)\r\n resolve(data)\r\n })\r\n}\r\n","/* global $ ko */\r\n\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { Person } from './../dk-ifshop-person-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { bil } from './dk-ifshop-bil-scripts'\r\nimport { Model } from './../dk-ifshop-model'\r\n\r\nfunction BilProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.Model = h.koMap(new BilModel(self))\r\n self.AndenBrugerPerson = h.koMap(new Person('AndenBrugerPerson'))\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'SearchRegNr') {\r\n if (value) {\r\n // make sure it is all capital letters and remove any spaces\r\n self.SearchRegNr(value.toUpperCase().replace(' ', ''))\r\n }\r\n } else if (name === 'HandelsVaerdi') {\r\n if ($.isNumeric(value)) {\r\n property($.parseInt(value, 'N', app.culture))\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Model,\r\n AarMedEgenBil,\r\n Selvrisiko,\r\n KmAArlig,\r\n EkstraUdstyr,\r\n Daekning,\r\n HandelsVaerdi,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n Anvendelse /* OgBrug */,\r\n UkendtRegNr,\r\n RegNrEnigma,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n ErBilenLeaset,\r\n Foererpladsdaekning,\r\n BilSuper,\r\n IsThisTheCarThatGivesMaerkeRabatOnKasko,\r\n Nyvaerdi,\r\n Vogngruppe,\r\n UngBilist,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState,\r\n OCHConsentGiven,\r\n EDIConsentGiven\r\n ) {\r\n self.isInit = true\r\n\r\n // if (OpsigelseType == 0) OpsigelseType = 2;\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n undefined, /* UnderwritingAccept */\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState,\r\n OCHConsentGiven,\r\n EDIConsentGiven\r\n )\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '0', 'Selvrisiko')\r\n\r\n self.Model = self.koMap(Model, self.Model)\r\n\r\n self.AarMedEgenBil = self.koMap(\r\n AarMedEgenBil,\r\n self.AarMedEgenBil,\r\n '',\r\n 'AarMedEgenBil'\r\n )\r\n\r\n self.KmAArlig = self.koMap(KmAArlig, self.KmAArlig, 1)\r\n\r\n self.HandelsVaerdi = self.koMap(\r\n HandelsVaerdi,\r\n self.HandelsVaerdi,\r\n '',\r\n 'HandelsVaerdi',\r\n true\r\n )\r\n\r\n self.Anvendelse /* OgBrug */ = self.koMap(\r\n Anvendelse /* OgBrug */,\r\n self.Anvendelse /* OgBrug */,\r\n '',\r\n 'Anvendelse'\r\n )\r\n self.UkendtRegNr = self.koMap(\r\n UkendtRegNr,\r\n self.UkendtRegNr,\r\n '',\r\n 'UkendtRegNr'\r\n )\r\n\r\n self.RegNrEnigma = self.koMap(RegNrEnigma, self.RegNrEnigma)\r\n\r\n self.BilSuper = self.koMap(BilSuper, self.BilSuper, 0, 'BilSuper') // the selected display navn\r\n self.UngBilist = self.koMap(UngBilist, self.UngBilist, 0, 'UngBilist') // the selected display navn\r\n\r\n self.Foererpladsdaekning = self.koMap(Foererpladsdaekning, self.Foererpladsdaekning)\r\n\r\n self.addOnModelMap = {\r\n ungbilist: self.UngBilist\r\n }\r\n\r\n self.ErBilenLeaset = self.koMap(\r\n ErBilenLeaset,\r\n self.ErBilenLeaset,\r\n '',\r\n 'ErBilenLeaset'\r\n )\r\n\r\n self.SearchRegNr = self.koMap('', self.SearchRegNr, '', 'SearchRegNr')\r\n\r\n self.IsThisTheCarThatGivesMaerkeRabatOnKasko = IsThisTheCarThatGivesMaerkeRabatOnKasko\r\n\r\n self.Nyvaerdi = self.koMap(Nyvaerdi, self.Nyvaerdi, '', 'Nyvaerdi')\r\n self.Vogngruppe = self.koMap(Vogngruppe, self.Vogngruppe, '', 'Vogngruppe')\r\n\r\n self.shouldShowAddedWizardNavigation = ko.computed(function () {\r\n return self.Daekning() && self.Daekning().Navn() === 'Kasko'\r\n })\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Model,\r\n val.AarMedEgenBil,\r\n val.Selvrisiko,\r\n val.KmAArlig,\r\n val.EkstraUdstyr,\r\n val.Daekning,\r\n val.HandelsVaerdi,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.Anvendelse /* OgBrug */,\r\n val.UkendtRegNr,\r\n val.RegNrEnigma,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.ErBilenLeaset,\r\n val.Foererpladsdaekning,\r\n val.BilSuper,\r\n val.IsThisTheCarThatGivesMaerkeRabatOnKasko,\r\n val.Nyvaerdi,\r\n val.Vogngruppe,\r\n val.UngBilist,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState,\r\n val.EDIConsentGiven,\r\n val.OCHConsentGiven\r\n )\r\n }\r\n }\r\n\r\n // update this product with a new model based on regnr (if found)\r\n self.setModel = function (code, jElement, actionSettings) {\r\n try {\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-VEHICLE_REGNR_EMPTY'))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (code || '0'),\r\n produktId: (app.root.activeProduct.ProduktID() || '0')\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelBil' }).then(function (token) {\r\n app.loadJson({\r\n code,\r\n url: 'bilprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n token,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (\r\n !data.Model ||\r\n !data.Model.make ||\r\n !data.Model.RegNr ||\r\n data.Model.RegNr !== this.args.code\r\n ) {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/detaljer')\r\n h.extendForm(\r\n $('#bilHolder'),\r\n 'bilprodukt/getsubview/brugerinfo',\r\n $('#brugerInfoHolder'),\r\n 1\r\n )\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n code,\r\n url: 'bilprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (\r\n !data.Model ||\r\n !data.Model.make ||\r\n !data.Model.RegNr ||\r\n data.Model.RegNr !== this.args.code\r\n ) {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/detaljer')\r\n h.extendForm(\r\n $('#bilHolder'),\r\n 'bilprodukt/getsubview/brugerinfo',\r\n $('#brugerInfoHolder'),\r\n 1\r\n )\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n function handleSetModelError (data) {\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n app.root.activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n if (\r\n data.Message.TekstKode === 'CLIENT-BIL-KAN_IKKE_FINDE_MODEL' ||\r\n data.Message.TekstKode === 'AutoITError'\r\n ) {\r\n const regInfo = bil.buildInvalidRegistrationDescription(data.Data.RegNrEnigma, data.Message.TekstKode)\r\n bil.displayUkendtRegNrPanel(regInfo)\r\n return false // cancel default action\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n }\r\n\r\n // save setting how the user wants to enter car info\r\n self.brugerIkkeRegNr = function (viewModel, argsForHandler) {\r\n try {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n activeProduct.UkendtRegNr(true)\r\n activeProduct.sync({\r\n done: function () {\r\n app.gotoShopPage()\r\n }\r\n })\r\n } else {\r\n // remove regnr info\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n app.root.activeProduct.Model().RegNr(undefined)\r\n\r\n // save flag\r\n if (app.wizard) {\r\n app.wizard.setFlag('brugerikkeregnr')\r\n app.wizard.saveFlags()\r\n }\r\n\r\n // display info panel\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/bilinfo')\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n const values = [\r\n 'BIL',\r\n app.root.CustomerBenefitLevel(),\r\n app.root.SamleKunde(),\r\n self.Model().MakeNumber(),\r\n app.root.Kunde().Alder(),\r\n self.AarMedEgenBil(),\r\n self.Anvendelse(),\r\n self.Selvrisiko(),\r\n self.KmAArlig(),\r\n self.BilSuper(),\r\n self.Foererpladsdaekning()\r\n ]\r\n\r\n if (self.AndenBrugerPerson().Postnr) {\r\n values.push(self.AndenBrugerPerson().Postnr())\r\n }\r\n\r\n values.push(app.root.Kunde().Postnr())\r\n values.push(app.root.Kunde().Gade())\r\n values.push(app.root.Kunde().Husnr())\r\n values.push(app.root.Kunde().Etage())\r\n values.push(app.root.Kunde().SideDoerNr())\r\n\r\n values.push(self.UngBilist())\r\n\r\n if (self.Daekning()) {\r\n values.push(self.Daekning().Navn())\r\n }\r\n\r\n const key = values.join('-')\r\n return key\r\n }\r\n}\r\n\r\nconst anvendelserOgBrug = []\r\nanvendelserOgBrug['700001'] = 'Personbil til privat kørsel'\r\nanvendelserOgBrug['700002'] = 'Personbil til privat og erhvervskørsel'\r\nanvendelserOgBrug['703009'] = 'Gulpladebil til privat kørsel'\r\nanvendelserOgBrug['702020'] = 'Gulpladebil til privat og erhvervskørsel'\r\n\r\nfunction BilModel (bilProdukt) {\r\n const self = this\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'Model') {\r\n self.ModelStr($.trim(value))\r\n } else if (name === 'RegNr' && value) {\r\n self.RegNr(value.toUpperCase())\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n RegNr,\r\n Make,\r\n Model,\r\n Year,\r\n Motor,\r\n Variant,\r\n Description,\r\n MakeNumber,\r\n CarBranding\r\n ) {\r\n self.RegNr = self.koMap(RegNr, self.RegNr, null, 'RegNr')\r\n self.Make = self.koMap(Make, self.Make, null, 'Make')\r\n self.Model = self.koMap(Model, self.Model, null, 'Model')\r\n self.ModelStr = self.koMap(Model, self.ModelStr, null, 'ModelStr')\r\n self.Year = self.koMap(Year, self.Year, null, 'Year')\r\n self.Motor = self.koMap(Motor, self.Motor, null, 'Motor')\r\n self.Variant = self.koMap(Variant, self.Variant, null, 'Variant')\r\n self.Description = self.koMap(\r\n Description,\r\n self.Description,\r\n null,\r\n 'Description'\r\n )\r\n self.MakeNumber = self.koMap(\r\n MakeNumber,\r\n self.MakeNumber,\r\n null,\r\n 'MakeNumber'\r\n )\r\n self.CarBranding = self.koMap(\r\n CarBranding,\r\n self.CarBranding,\r\n null,\r\n 'Carbranding'\r\n )\r\n }\r\n self.init()\r\n\r\n // computed observables\r\n self.Details = ko.computed(function () {\r\n return self.ModelStr() + ' ' + self.Motor() + ' ' + self.Year()\r\n })\r\n self.LogoImagePath = ko.computed(function () {\r\n let _root = ''\r\n if (app.mode && app.mode.indexOf('ext') > -1) {\r\n _root = app.shopHostUrl\r\n } else {\r\n _root = '/'\r\n }\r\n const make = self.Make() || ''\r\n if (make === '0' || make === '') {\r\n return _root + 'Styling/img/webshop/shopflow/icon_car.png'\r\n } else {\r\n let _fileName = make.trim()\r\n if (_fileName) {\r\n if (_fileName.indexOf(' ') > -1) {\r\n _fileName = _fileName.replace(' ', '_')\r\n }\r\n if (_fileName.indexOf('-') > -1) {\r\n _fileName = _fileName.replace('-', '_')\r\n }\r\n return (\r\n _root +\r\n 'styling/img/webshop/shopflow/billogo/' +\r\n _fileName +\r\n '.png'\r\n )\r\n }\r\n return ''\r\n }\r\n }, self)\r\n\r\n // SAVE\r\n self.save = function (actionSettings) {\r\n app.loadJson({\r\n url: 'bilprodukt/savemodel',\r\n data:\r\n '{\"data\" : ' +\r\n ko.toJSON(self, function (key, value) {\r\n if (key === 'LogoImagePath') {\r\n return undefined\r\n } else {\r\n return value\r\n }\r\n }) +\r\n '}',\r\n block: true,\r\n actionSettings,\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n // SYNC\r\n self.sync = function (actionSettings) {\r\n app.loadJson({\r\n url: 'bilprodukt/syncmodel',\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n self.update(data)\r\n },\r\n actionSettings\r\n })\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.RegNr,\r\n val.Make,\r\n val.Model,\r\n val.Year,\r\n val.Motor,\r\n val.Variant,\r\n val.Description,\r\n val.MakeNumber,\r\n val.CarBranding\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport { BilModel, BilProdukt, anvendelserOgBrug }\r\n","/* global ko $ */\r\n\r\nimport {\r\n PendingInputs,\r\n enableInputEvaluation,\r\n enableToolTips,\r\n initPlaceholders\r\n} from './../dk-ifshop-controls'\r\nimport { enableSelect, enableTextInput } from './../dk-ifshop-controls-multi'\r\n\r\nimport { BilProdukt } from './dk-ifshop-bil-produkt-model'\r\nimport { TextHelper } from './../dk-ifshop-text-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { dkRecaptcha } from '../security/recaptcha'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { pushInvalidRegistrationNumberEvent } from '../../SharedResources/Tracking/dk-ifshop-gtm'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nconst bil = {} // namespace\r\n\r\nbil.detaljer = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct.Model, jElement[0])\r\n\r\n function updateMaerkeForsikring () {\r\n h.doOrWait(\r\n app.hjaelpeKoderLoadedFlag,\r\n app,\r\n 'hjaelpeKoderLoaded',\r\n function () {\r\n let text = ''\r\n const code = getBonusTextCode()\r\n const helpText = app.getHjaelpeKode(code)\r\n if (helpText !== null && helpText !== undefined) text = helpText.lang\r\n\r\n if (text !== '') {\r\n const txt = h.format(\r\n text,\r\n app.root.activeProduct\r\n .Model()\r\n .Make()\r\n .trim()\r\n )\r\n $('#maerkeForsikringHolder').html(txt)\r\n }\r\n }\r\n )\r\n }\r\n function getBonusTextCode () {\r\n switch (app.root.activeProduct.Model().CarBranding().BrandingType) {\r\n case 0:\r\n return 'CLIENT-BIL-IF-BONUS_MEDDELELSE'\r\n case 1:\r\n return 'CLIENT-BIL-BONUS_MEDDELELSE'\r\n default:\r\n return 'CLIENT-BIL-NO-BONUS_MEDDELELSE'\r\n }\r\n }\r\n\r\n updateMaerkeForsikring()\r\n\r\n if (app.root.Disv() && app.root.Kunde().Address()) {\r\n $('.edit-address-button').remove()\r\n }\r\n\r\n if (app.root.DisableCustomerElements() === true && !app.root.Disv()) {\r\n if (!app.root.Disv()) {\r\n $('.edit-address-button').remove()\r\n }\r\n }\r\n if (app.root.DisableCustomerElements() === true) {\r\n basic.hideCprGroupSection()\r\n }\r\n\r\n h\r\n .getJElmByDataId('vaelgAndenBil')\r\n .parent()\r\n .on('click', function () {\r\n if (app.wizard.isFlagSet('brugerikkeregnr')) {\r\n // reset regnr\r\n app.root.activeProduct.Model().RegNr(undefined)\r\n // resets all other model details\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/bilinfo')\r\n } else {\r\n // reset regnr\r\n app.root.activeProduct.Model().RegNr(undefined)\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n h.fadeToForm($('#bilHolder'), 'baseprodukt/quickform/bil')\r\n }\r\n app.root.activeProduct.Daekning().Navn('') // Force a reselection of default daekning\r\n })\r\n app.root.DisableCustomerElements.subscribe(function (value) {\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n })\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n}\r\n\r\n// BeregnPris.cshtml\r\nbil.beregnPris = function (jElement) {\r\n app.root.activeProduct.disposeDaekningsSubscriptions()\r\n\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(bil.beregnPris.submit)\r\n}\r\n\r\nbil.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n bil.quickForm.submit()\r\n } else {\r\n app.wizard.goFwd()\r\n }\r\n}\r\n\r\nbil.checkMinimumAgeValidationWhenCprFieldsDoNotExist = function (jElement) {\r\n basic.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n if (!$('#alderMeddelelseGroup').is(':hidden')) {\r\n $('#RegNr').attr('disabled', 'disabled')\r\n $('#brugerIkkeRegNr').attr('disabled', 'disabled')\r\n }\r\n}\r\n\r\nbil.beregnPrisWithValidate = function (jElement) {\r\n bil.beregnPris()\r\n app.root.activeProduct.validateOnServer({\r\n entryFail: function (data) {\r\n if (\r\n data &&\r\n data.Message &&\r\n data.Message.TekstKode === 'CLIENT-BIL-KAN_IKKE_FINDE_MODEL'\r\n // consider supporting AutoITError here\r\n ) {\r\n const regInfo = bil.buildInvalidRegistrationDescription(app.root.activeProduct.RegNrEnigma(), data.Message.TekstKode)\r\n bil.displayUkendtRegNrPanel(regInfo)\r\n\r\n return false // cancel default action\r\n }\r\n return true\r\n }\r\n })\r\n}\r\n\r\nbil.tryScrollToDetailsView = function () {\r\n const elementSelector = $('#bilHolder')\r\n const marginTop = -200\r\n try {\r\n if (elementSelector.offset() !== undefined) {\r\n $('html, body').scrollTop(\r\n Math.round(elementSelector.offset().top - Math.abs(marginTop))\r\n )\r\n }\r\n } catch (e) {\r\n // OK, so be it\r\n }\r\n}\r\n\r\nbil.bilInfo = function () {\r\n // reset model\r\n bil.resetModel()\r\n\r\n enableSelect($('#selectVariant'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: false,\r\n getCriteria: function (s) {\r\n if ($('#selectYear').length &&\r\n $('#selectMake').length &&\r\n $('#selectModel').length &&\r\n $('#selectMotor').length) {\r\n const _c0 = $('#selectYear')[0].value\r\n const _c1 = $('#selectMake')[0].value\r\n const _c2 = $('#selectModel')[0].value\r\n const _c3 = $('#selectMotor')[0].value\r\n const year = _c0 ? '\"year\" : ' + _c0 + ', ' : ''\r\n const make = '\"make\" : \"' + _c1 + '\", '\r\n const model = '\"model\" : \"' + _c2 + '\", '\r\n const motor = '\"motor\" : \"' + _c3 + '\"'\r\n return '{' + year + make + model + motor + '}'\r\n }\r\n }\r\n })\r\n\r\n enableSelect($('#selectMotor'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: false,\r\n getCriteria: function (s) {\r\n if ($('#selectYear').length &&\r\n $('#selectMake').length &&\r\n $('#selectModel').length) {\r\n const _c0 = $('#selectYear')[0].value\r\n const _c1 = $('#selectMake')[0].value\r\n const _c2 = $('#selectModel')[0].value\r\n const year = _c0 ? '\"year\" : ' + _c0 + ', ' : ''\r\n const make = '\"make\" : \"' + _c1 + '\", '\r\n const model = '\"model\" : \"' + _c2 + '\"'\r\n return '{' + year + make + model + '}'\r\n }\r\n return ''\r\n },\r\n onLoadDone: function (element, data) {\r\n $.each(data, function (index, item) {\r\n // get values\r\n const val = item\r\n let txt = item\r\n\r\n // remove trailing '0'\r\n if (txt.substring(txt.length - 1) === '0') {\r\n txt = txt.substring(0, txt.length - 1)\r\n }\r\n\r\n // add as option\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(val)\r\n )\r\n })\r\n }\r\n })\r\n\r\n enableSelect($('#selectModel'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: false,\r\n getCriteria: function (s) {\r\n console.log($('#selectModel').length)\r\n if ($('#selectYear').length &&\r\n $('#selectMake').length) {\r\n const _c0 = $('#selectYear')[0].value\r\n const _c1 = $('#selectMake')[0].value\r\n const year = _c0 ? '\"year\" : ' + _c0 + ', ' : ''\r\n const make = '\"make\" : \"' + _c1 + '\"'\r\n return '{' + year + make + '}'\r\n }\r\n return ''\r\n }\r\n })\r\n\r\n enableSelect($('#selectMake'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: false,\r\n getCriteria: function (s) {\r\n if ($('#selectYear').length) {\r\n const _c0 = $('#selectYear')[0].value\r\n const year = _c0 ? '\"year\" : ' + _c0 : ''\r\n return '{' + year + '}'\r\n }\r\n return ''\r\n }\r\n })\r\n\r\n enableSelect($('#selectYear'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n const _thisYear = parseInt(app.getBestYear())\r\n for (let i = 0; i <= 45; i++) {\r\n const _txt = String(_thisYear - i)\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_txt)\r\n )\r\n }\r\n }\r\n })\r\n\r\n const _jForm = $('#bilInfo')\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const _validator = _jForm.validate({\r\n rules: {\r\n selectMake: {\r\n ifws_selected: true\r\n },\r\n selectModel: {\r\n ifws_selected: true\r\n },\r\n selectYear: {\r\n ifws_selected: true\r\n },\r\n selectMotor: {\r\n ifws_selected: true\r\n },\r\n selectVariant: {\r\n ifws_selected: true\r\n }\r\n }\r\n })\r\n _jForm[0].validator = _validator\r\n\r\n _jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n _jForm[0].pendingInputs.setOnDone(function () {\r\n if (_validator.form(true)) {\r\n // save selections because they are overwritten with info that might differ (different case, spacet etc.), but we will need them again if the car isn't accepted\r\n bil.bilInfo.selectionsYear = app.root.activeProduct.Model().Year()\r\n bil.bilInfo.selectionsMake = app.root.activeProduct.Model().Make()\r\n // sync\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n // car is accepted. display the details with logo\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/detaljer')\r\n // display new questions\r\n h.extendForm(\r\n $('#bilHolder'),\r\n 'bilprodukt/getsubview/brugerinfo',\r\n $('#brugerInfoHolder'),\r\n 1\r\n )\r\n bil.tryScrollToDetailsView()\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n // car was not accepted, reset model to ensure old values isn't used\r\n const bilModel = app.root.activeProduct.Model()\r\n bil.resetModel()\r\n bilModel.Year(bil.bilInfo.selectionsYear)\r\n\r\n // Return true to make sure default action is perforformed too (Message)\r\n return true\r\n }\r\n })\r\n }\r\n })\r\n })\r\n\r\n $('#vaelgAndenBilMedRegNr').on('click', function () {\r\n // user want to select a different model by its regnr\r\n app.wizard.resetFlag('brugerikkeregnr')\r\n app.wizard.saveFlags()\r\n // reset regnr\r\n app.root.activeProduct.Model().RegNr(undefined)\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n // display new view\r\n h.fadeToForm($('#bilHolder'), 'baseprodukt/quickform/bil')\r\n })\r\n}\r\n\r\nbil.regNrSetupBtx = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n enableTextInput($('#RegNr'), app.root.activeProduct, null, {\r\n validateOnBlur: true,\r\n ignoreValidationOnKeyUp: true,\r\n validation: function (s, actionSettings) {\r\n if (bil.ukendtRegNrPanelAction) {\r\n $('#regNrMsg').html('')\r\n }\r\n if (app.page !== 'front') {\r\n bil.updateModel(actionSettings)\r\n }\r\n }\r\n })\r\n\r\n // avoids autosubmit in IE, when there is only a single input control in the form\r\n jForm.on('keydown', '#RegNr', function (e) {\r\n if ($('#RegNr').attr('allowenter') === undefined) {\r\n if (e.keyCode === '32' || e.keyCode === 32) {\r\n e.preventDefault()\r\n }\r\n\r\n if (e.keyCode === '13' || e.keyCode === 13) {\r\n e.preventDefault()\r\n $('#RegNr').valid()\r\n }\r\n }\r\n })\r\n}\r\n\r\nbil.regNrSetupIds = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n const input = document.getElementById('RegNr')\r\n ko.applyBindingsToNode(input, null, app.root.activeProduct)\r\n const errorLabel = document.getElementById('regnr-input-error-message')\r\n\r\n errorLabel.classList.add('hidden')\r\n input.removeAttribute('aria-invalid')\r\n\r\n input.addEventListener('blur', (event) => {\r\n const value = event.target.value\r\n if (value.length === 0) {\r\n errorLabel.classList.remove('hidden')\r\n input.setAttribute('aria-invalid', 'true')\r\n input.setAttribute('aria-describedby', 'regnr-input-error-message')\r\n } else {\r\n errorLabel.classList.add('hidden')\r\n input.removeAttribute('aria-invalid')\r\n }\r\n })\r\n}\r\n\r\nbil.generalQuickForm = function (jElement) {\r\n// reset model\r\n bil.resetModel()\r\n\r\n // start over with new regnr, so we don't know if it is unknwon or not\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n\r\n // bind to model\r\n ko.applyBindings(app.root.activeProduct, h.getElm('brugerIkkeRegNr'))\r\n}\r\n\r\nbil.quickFormv1 = function (jElement) {\r\n bil.generalQuickForm(jElement)\r\n bil.regNrSetupBtx(jElement)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n\r\n const params = h.getIfParameters()\r\n\r\n // should be taken from params\r\n const productParam = params.product\r\n const regNrParam = params.regnr\r\n if (productParam && regNrParam) {\r\n h.getElm('RegNr').value = regNrParam.toUpperCase()\r\n bil.quickForm.submit()\r\n }\r\n\r\n const jForm = $('#quickForm')\r\n quickformSubmitSetup.setup(jForm, bil.quickForm.submit)\r\n app.root.DisableCustomerElements.subscribe(function (value) {\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n })\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n}\r\n\r\nbil.quickForm = function (jElement) {\r\n bil.generalQuickForm(jElement)\r\n bil.regNrSetupIds(jElement)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n\r\n const params = h.getIfParameters()\r\n\r\n // should be taken from params\r\n const productParam = params.product\r\n const regNrParam = params.regnr\r\n if (productParam && regNrParam) {\r\n h.getElm('RegNr').value = regNrParam.toUpperCase()\r\n bil.quickForm.submit()\r\n }\r\n\r\n const jForm = $('#quickForm')\r\n // REPLACE WITH IDS SPECIFIC ON SUBMIT\r\n quickformSubmitSetup.setup(jForm, bil.quickForm.submit)\r\n\r\n app.root.DisableCustomerElements.subscribe(function (value) {\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n })\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n}\r\n\r\nbil.quickForm.submit = function (jElement) {\r\n bil.updateModel()\r\n}\r\n\r\nbil.resetModel = function () {\r\n app.root.activeProduct\r\n .Model()\r\n .init(\r\n app.root.activeProduct\r\n .Model()\r\n .RegNr() /* all other is undefined: HP, Make, Model, Year, Motor, Variant, Price, MakeNumber, Tarif61 */\r\n )\r\n app.root.activeProduct.SearchRegNr(app.root.activeProduct.Model().RegNr())\r\n app.root.activeProduct.Anvendelse(undefined)\r\n\r\n // WDK-2080\r\n app.root.activeProduct.Model().Model(undefined)\r\n app.root.activeProduct.Model().Motor(undefined)\r\n app.root.activeProduct.Model().Variant(undefined)\r\n app.root.activeProduct.Model().Make('')\r\n}\r\n\r\nbil.ukendtRegNrPanelAction = false\r\n\r\nbil.ukendtRegNrPanel = function () {\r\n app.setPendingUserAction('ukendtRegNr')\r\n bil.ukendtRegNrPanelAction = true\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('ukendtRegNrPanel'))\r\n\r\n $('input[name=UkendtRegNr]').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true\r\n })\r\n\r\n // just place validation on the first radio button. It will catch all validations, yet you can't test on 'this' in the function, as we don't know which buttpn was hit\r\n $('input[name=UkendtRegNr]')[0].ifws_customValidation = function (value) {\r\n bil.ukendtRegNrPanelAction = true\r\n if ($('input[name=UkendtRegNr]')[0].checked) {\r\n // the user wants to re-enter the regnr.\r\n app.resetPendingUserAction('ukendtRegNr')\r\n\r\n app.root.activeProduct.Model().RegNr(undefined)\r\n $('#regNrMsg').html('')\r\n bil.ukendtRegNrPanelAction = false\r\n h.getElm('RegNr').form.validator.clearElement(h.getElm('RegNr')) // reset validation info\r\n\r\n // set the option to undefined as we dont want to save this answer anywhere.\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n\r\n bil.ukendtRegNrPanelAction = false\r\n return true\r\n } else if ($('input[name=UkendtRegNr]')[1].checked) {\r\n app.resetPendingUserAction('ukendtRegNr')\r\n\r\n // add the searched regnr as the selected regnr\r\n app.root.activeProduct.Model().RegNr(app.root.activeProduct.SearchRegNr())\r\n\r\n if (app.page === 'checkout') {\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n // move on\r\n h.fadeToForm(\r\n $('#supplerendeInfoHolder'),\r\n 'bilprodukt/getsubview/supplerende'\r\n )\r\n }\r\n })\r\n } else {\r\n // user states the regnr is correct\r\n app.wizard.resetFlag('brugerikkeregnr')\r\n app.wizard.saveFlags()\r\n // display new view\r\n h.fadeToForm($('#bilHolder'), 'bilprodukt/getsubview/bilinfo')\r\n }\r\n\r\n bil.ukendtRegNrPanelAction = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // make sure the choices are validated immediately, so they work as buttons\r\n $('input[name=UkendtRegNr]').on('evaluate', function () {\r\n h.validateElement(this, 'ifws_isInvalid')\r\n return false // we remove the entire panel incl. this radio button, therefore the default action should be stopped, otherwise we woulld receive an error\r\n })\r\n\r\n // update the text on the last radiobutton to include the regnr at the end\r\n const jUkendtTrue = $('label[for=UkendtRegNrtrue]')\r\n jUkendtTrue.text(\r\n jUkendtTrue.text() + ' ' + app.root.activeProduct.SearchRegNr()\r\n )\r\n}\r\n\r\nbil.ejersBrugsInfo = function (jElement) {\r\n bil.brugsInfo(PersonEntities.Kunde, app.root.Kunde(), jElement)\r\n if (app.root.Disv() && app.root.Kunde().Address()) {\r\n $('.edit-address-button').remove()\r\n }\r\n\r\n if (app.root.DisableCustomerElements() === true && !app.root.Disv()) {\r\n if (!app.root.Disv()) {\r\n $('.edit-address-button').remove()\r\n }\r\n }\r\n if (app.root.DisableCustomerElements() === true) {\r\n basic.hideCprGroupSection()\r\n }\r\n}\r\n\r\nbil.brugsInfo = function (prefix, person, jElement) {\r\n enableToolTips(jElement)\r\n\r\n const _jForm = h.getElmByIdAsJqueryObject('brugsInfo', prefix)\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const _validator = _jForm.validate()\r\n bil.brugsInfo.validator = _validator\r\n /// /validation rules (using dynamic settings and not static settings {fornavn: ...} because we need to use the prefix)\r\n\r\n h.getSelectElmAsJqueryObject('AarMedEgenBil', prefix).rules('add', {\r\n ifws_selected: true\r\n })\r\n\r\n h.getSelectElmAsJqueryObject('AntalSkader', prefix).rules('add', {\r\n ifws_selected: true,\r\n max: 2,\r\n ifws_isInvalid: true,\r\n messages: {\r\n max: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_SKADER',\r\n 'Du kan ikke have mere end 2 skader'\r\n ),\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_TOTAL_SKADER',\r\n 'Du har samlet oplyst et antal skader, som betyder, at vi desværre ikke kan tilbyde dig den beregnede forsikring'\r\n )\r\n }\r\n })\r\n\r\n _jForm[0].validator = _validator\r\n\r\n enableSelect(\r\n h.getSelectElmAsJqueryObject('AarMedEgenBil', prefix),\r\n app.root.activeProduct,\r\n person.Alder,\r\n {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n if (!app.root.Kunde().Alder()) {\r\n return\r\n }\r\n\r\n const age = person.Alder()\r\n\r\n let entry = 0\r\n if (age > 17 && age <= 24) {\r\n entry = 1\r\n }\r\n if (age >= 25 && age <= 29) {\r\n entry = 4\r\n }\r\n if (age >= 30) {\r\n entry = 6\r\n }\r\n\r\n let topRange = 8 - entry\r\n const ageCap = age - 18\r\n\r\n if (ageCap < topRange) {\r\n topRange = ageCap\r\n }\r\n\r\n if (topRange < 0) {\r\n topRange = 0\r\n }\r\n\r\n for (let i = 0; i <= topRange; i++) {\r\n let text = String(i)\r\n const val = text\r\n if (i === topRange) {\r\n text = text + ' eller mere'\r\n }\r\n $(element).append(\r\n $('')\r\n .text(text)\r\n .val(val)\r\n )\r\n }\r\n }\r\n }\r\n )\r\n\r\n enableSelect(h.getSelectElmAsJqueryObject('AntalSkader', prefix), app.root, null, {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n for (let i = 0; i <= 3; i++) {\r\n let _txt = String(i)\r\n const _val = String(i)\r\n if (i === 3) {\r\n _txt = app.getHjaelpeKodeText('CLIENT-3_ELLER_FLERE', '3 eller flere')\r\n }\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_val)\r\n )\r\n }\r\n }\r\n })\r\n // make sure to validate on max. nof. damages\r\n h.getSelectElmAsJqueryObject('AntalSkader', prefix).on('change', function () {\r\n let max = 2\r\n const numberOfClaims =\r\n app.root.AntalSkaderFamilie() + app.root.AntalSkaderHus()\r\n if (3 - numberOfClaims < max) max = 3 - numberOfClaims\r\n if (parseInt($(this).val()) > max) {\r\n this.ifws_isInvalid = true\r\n h.validateElement(this)\r\n } else {\r\n this.ifws_isInvalid = false\r\n h.validateElement(this)\r\n }\r\n })\r\n\r\n basic.setupKundeInfoGroup(jElement)\r\n app.root.DisableCustomerElements.subscribe(function (value) {\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n })\r\n bil.checkMinimumAgeValidationWhenCprFieldsDoNotExist(jElement)\r\n}\r\n\r\nbil.findBil = function (jElement, productId) {\r\n h.setDisabled($('#wizardNavigation button', app.getTopJElm()))\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n bil.regNrSetupBtx(jElement)\r\n })\r\n}\r\n\r\nlet newModelRegNr = ''\r\n\r\nbil.updateModel = function (actionSettings) {\r\n bil.setModelData(actionSettings)\r\n}\r\n\r\nbil.setModelData = function (actionSettings) {\r\n // called from all three places where a regnr can be edited (quickform, step1 and step3)\r\n if (app.wizard) {\r\n if (app.page === 'produkt') {\r\n app.root.activeProduct.setModel(\r\n h.getElm('RegNr').value,\r\n $(h.getElm('RegNr')),\r\n actionSettings\r\n )\r\n } else if (app.page === 'checkout') {\r\n bil.updateRegNr(\r\n h.getElm('RegNr').value,\r\n $(h.getElm('RegNr')),\r\n actionSettings\r\n )\r\n }\r\n } else {\r\n // quickform\r\n return app.root.activeProduct.setModel(\r\n h.getElm('RegNr').value,\r\n $(h.getElm('RegNr')),\r\n actionSettings\r\n )\r\n }\r\n}\r\n\r\nbil.supplerendeInfoBil = function (jElement, productId) {\r\n h.setDisabled($('#wizardNavigation button', app.getTopJElm()), false)\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n if (app.root.activeProduct.UkendtRegNr()) {\r\n if (h.getElm('RegNr')) {\r\n ko.applyBindingsToNode(\r\n h.getElm('RegNr'),\r\n null,\r\n app.root.activeProduct.Model\r\n )\r\n }\r\n }\r\n\r\n // vogngruppe 5 = hvidplade\r\n // hvidplade samt værdi over 650000\r\n // gul/papegøje, ikke privat kørsel samt værdi over 350000\r\n // gul/papegøje samt privat kørsel og værdi over 650000\r\n if (\r\n (app.root.activeProduct.Vogngruppe() === 5 &&\r\n app.root.activeProduct.Nyvaerdi() > 650000) ||\r\n (app.root.activeProduct.Vogngruppe() !== 5 &&\r\n app.root.activeProduct.Anvendelse() !== 700001 &&\r\n app.root.activeProduct.Nyvaerdi() > 350000) ||\r\n (app.root.activeProduct.Vogngruppe() !== 5 &&\r\n app.root.activeProduct.Anvendelse() === 700001 &&\r\n app.root.activeProduct.Nyvaerdi() > 650000)\r\n ) {\r\n ko.applyBindings(app.root.activeProduct, h.getElm('handelsVaerdiGroup'))\r\n } else {\r\n app.root.activeProduct.HandelsVaerdi(app.root.activeProduct.Nyvaerdi())\r\n }\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('erBilLeasetGroup'))\r\n enableInputEvaluation(jElement)\r\n\r\n // validation rules\r\n const _jForm = $('#supplerendeInfoBil')\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const _validator = _jForm.validate({\r\n rules: {\r\n selectAnciennitetsSelskab: {\r\n ifws_selected: true\r\n }\r\n }\r\n })\r\n _jForm[0].validator = _validator\r\n\r\n if ($('#HandelsVaerdi').length) {\r\n $('#HandelsVaerdi').rules('add', {\r\n required: true,\r\n min: 1,\r\n max: 10000000,\r\n number: true\r\n })\r\n }\r\n $('#ErBilenLeasetJa').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true,\r\n messages: {\r\n required: TextHelper.getRadioButtonUnansweredErrorMessage()\r\n }\r\n })\r\n $('input[name=ErBilenLeaset]').on('evaluate', function () {\r\n if (\r\n app.root.activeProduct.ErBilenLeaset() !== '' &&\r\n app.root.activeProduct.ErBilenLeaset() !== undefined &&\r\n app.root.activeProduct.ErBilenLeaset() !== 'undefined'\r\n ) {\r\n h.validateElement($('input[name=ErBilenLeaset]')[0], 'required')\r\n }\r\n })\r\n\r\n function EnableAnciennitetsSelskab (newValue) {\r\n // display\r\n if (\r\n newValue === false /* HarTidligereSelskab */&&\r\n parseInt(app.root.activeProduct.AarMedEgenBil()) > 0\r\n ) {\r\n h.extendForm(\r\n $('#supplerendeInfoBil'),\r\n null,\r\n $('#anciennitetsSelskabGroup'),\r\n null,\r\n null,\r\n 350\r\n )\r\n $('#bilMereEndEtAarInfo').show()\r\n } else {\r\n h.retractForm($('#anciennitetsSelskabGroup'), 350)\r\n $('#bilMereEndEtAarInfo').hide()\r\n }\r\n }\r\n\r\n app.root.activeProduct.HarTidligereSelskab.subscribe(function (newValue) {\r\n EnableAnciennitetsSelskab(newValue)\r\n })\r\n\r\n EnableAnciennitetsSelskab(app.root.activeProduct.HarTidligereSelskab())\r\n enableToolTips(jElement)\r\n h.selectNextEntry(jElement)\r\n })\r\n}\r\n\r\nbil.daekningsTilpasningsPanel = function (jElement) {\r\n const activeProduct = app.root.activeProduct\r\n const $KmAArlig = $('#KmAArlig')\r\n\r\n if ($KmAArlig.length) {\r\n $KmAArlig.empty()\r\n\r\n enableSelect($KmAArlig, activeProduct, undefined, {\r\n disableAutoBind: true,\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n const el = $(element)\r\n\r\n el.append(\r\n $('')\r\n .text('Op til 10.000 km')\r\n .val(1)\r\n )\r\n el.append(\r\n $('')\r\n .text('Op til 15.000 km')\r\n .val(2)\r\n )\r\n el.append(\r\n $('')\r\n .text('Op til 20.000 km')\r\n .val(3)\r\n )\r\n el.append(\r\n $('')\r\n .text('Op til 25.000 km')\r\n .val(4)\r\n )\r\n el.append(\r\n $('')\r\n .text('Op til 30.000 km')\r\n .val(5)\r\n )\r\n el.append(\r\n $('')\r\n .text('Op til 40.000 km')\r\n .val(6)\r\n )\r\n el.append(\r\n $('')\r\n .text('Over 40.000 km')\r\n .val(7)\r\n )\r\n },\r\n onSelect: function (element, e) {\r\n if (\r\n e.currentTarget.selectedIndex >= 0 &&\r\n e.currentTarget.selectedIndex <= 6\r\n ) {\r\n activeProduct.KmAArlig(e.currentTarget.selectedIndex + 1)\r\n } else {\r\n activeProduct.KmAArlig(1)\r\n }\r\n }\r\n })\r\n }\r\n\r\n basic.daekningsTilpasningsPanelBasics(jElement)\r\n\r\n activeProduct.daekningsSubscriptions.push(activeProduct.KmAArlig.subscribeChanged(activeProduct.beregnOnChange))\r\n activeProduct.daekningsSubscriptions.push(activeProduct.BilSuper.subscribeChanged(activeProduct.beregnOnChange))\r\n\r\n $('#super_tilvalg').change(function () {\r\n activeProduct.BilSuper(this.checked)\r\n })\r\n\r\n $(document).on('change', '#super_tilvalg_panel', function () {\r\n activeProduct.BilSuper(this.checked)\r\n })\r\n\r\n $(document).on('change', '#ungbilist_tilvalg', function () {\r\n activeProduct.UngBilist(this.checked)\r\n })\r\n\r\n $(document).on('change', '#foererpladsdaekning_tilvalg', function () {\r\n activeProduct.Foererpladsdaekning(this.checked)\r\n })\r\n\r\n basic.handleBlueBoxForSelectedCoverage(activeProduct.Daekning().Navn(), h.getDisplayTextForBlueBoxForCarCubeDiscount(activeProduct.Daekning().Navn()))\r\n}\r\n\r\nbil.acceptNewPrice = function (actionSettings) {\r\n app.root.activeProduct.setModel(\r\n newModelRegNr,\r\n app.wizard.getCurrentWizardBodyJElement(),\r\n actionSettings\r\n )\r\n}\r\n\r\nbil.updateWizardSubtext = function () {\r\n app.loadJson({\r\n url: 'bilprodukt/updatewizardsubtext',\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data) {\r\n $('.wizardStepPending')\r\n .find('.stepSubTitle')\r\n .text(data)\r\n },\r\n entryFail: function (data) {\r\n // error, maybe the regnr wasnt found\r\n if (\r\n data &&\r\n data.Message &&\r\n data.Message.TekstKode === 'BILPROD:KAN_IKKE_OPDATERE_SUBTEXT'\r\n ) {\r\n $('#RegNr').val(app.root.activeProduct.Model().RegNr())\r\n }\r\n app.onEntryFail(data)\r\n }\r\n })\r\n}\r\n\r\nbil.displayUkendtRegNrPanel = function (regInfo) {\r\n // display message\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n\r\n pushInvalidRegistrationNumberEvent(regInfo)\r\n\r\n app.loadHtml({\r\n url: 'bilprodukt/getsubview/ukendtregnrpanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage($('#regNrMsg'), data, true)\r\n // bind pricepanel to the model\r\n $(app).trigger('sectionLoaded', [\r\n 'displayUkendtRegNrPanel',\r\n h.getSections(this.targetElement)\r\n ])\r\n }\r\n })\r\n}\r\n\r\nbil.updateWizardSubtextFromModel = function () {\r\n const make = app.root.activeProduct.Model().Make()\r\n const model = app.root.activeProduct.Model().Model()\r\n\r\n const wizardStepCurrent = app.getTopJElm().find('.wizardStepCurrent')\r\n wizardStepCurrent.find('.stepSubTitle').text(make + ' ' + model)\r\n}\r\n\r\nbil.acceptPriceAndProceed = function () {\r\n app.resetPendingUserAction()\r\n bil.acceptNewPrice(bil.updateRegNr.actionSettings)\r\n}\r\n\r\n// Display new price based on new regnr (if any car is found) and allow the user to apply the new data\r\nbil.updateRegNr = function (code, jElement, actionSettings) {\r\n try {\r\n newModelRegNr = h.getElm('RegNr').value\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-VEHICLE_REGNR_EMPTY'))\r\n return\r\n } else if (code === app.root.activeProduct.Model().RegNr()) {\r\n // no difference\r\n return\r\n }\r\n\r\n bil.updateRegNr.actionSettings = {\r\n done: function () {\r\n // reset flag\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n // move on\r\n h.fadeToForm(\r\n $('#supplerendeInfoHolder'),\r\n 'bilprodukt/getsubview/supplerende'\r\n )\r\n\r\n // execute validation from control (if any)\r\n if (\r\n bil.updateRegNr.actionSettings2 &&\r\n bil.updateRegNr.actionSettings2.onValid\r\n ) {\r\n bil.updateRegNr.actionSettings2.onValid()\r\n }\r\n\r\n app.root.activeProduct.sync(\r\n {\r\n done: function (message = {}) {\r\n // update total fields to reflect the new totals\r\n basic.updateTotalFields()\r\n bil.updateWizardSubtext()\r\n }\r\n },\r\n true\r\n )\r\n }\r\n }\r\n\r\n bil.updateRegNr.actionSettings2 = actionSettings\r\n\r\n app.setPendingUserAction('newPriceAwaitingApproval')\r\n\r\n // try to find the model\r\n app.loadJson({\r\n url: 'bilprodukt/getmodel',\r\n data: '{ \"code\" : \"' + (code || '0') + '\" }',\r\n targetElement: jElement,\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // a new product is received\r\n if (data && data.Model && data.Model.MakeNumber) {\r\n const makeNumberOrAnvendelseHasChanged =\r\n app.root.activeProduct.Model().MakeNumber() !==\r\n data.Model.MakeNumber ||\r\n app.root.activeProduct.Anvendelse() !== data.Anvendelse\r\n\r\n if (makeNumberOrAnvendelseHasChanged) {\r\n // create a model of the new product so it can be bound to the view\r\n bil.updateRegNr.alt = new BilProdukt()\r\n bil.updateRegNr.alt.update(data)\r\n\r\n // comparison variables for price\r\n const nettoPraemieTotalHasChanged =\r\n bil.updateRegNr.alt.Daekning().NettoPraemieTotal() ===\r\n app.root.activeProduct.Daekning().NettoPraemieTotal()\r\n const yearIsEqual =\r\n bil.updateRegNr.alt.Model().Year() ===\r\n app.root.activeProduct.Model().Year()\r\n const makeIsEqual =\r\n bil.updateRegNr.alt.Model().Make().toLowerCase() ===\r\n app.root.activeProduct.Model().Make().toLowerCase()\r\n const modelIsEqual =\r\n bil.updateRegNr.alt.Model().Model().toLowerCase() ===\r\n app.root.activeProduct.Model().Model().toLowerCase()\r\n const motorIsEqual =\r\n bil.updateRegNr.alt.Model().Motor() ===\r\n app.root.activeProduct.Model().Motor()\r\n\r\n // compare info\r\n if (\r\n nettoPraemieTotalHasChanged &&\r\n (yearIsEqual &&\r\n makeIsEqual &&\r\n modelIsEqual &&\r\n motorIsEqual)\r\n ) {\r\n // the prices are the same. accept\r\n bil.acceptPriceAndProceed()\r\n } else {\r\n // display message\r\n app.loadHtml({\r\n url: 'bilprodukt/getsubview/nyprispanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n // ignoreContact added by pedkia\r\n basic.showInlineMessage(\r\n $('#regNrMsg', '', true),\r\n data,\r\n true,\r\n true,\r\n app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-FORTSAET_MED_NY_PRIS',\r\n 'Fortsæt med ny pris'\r\n ),\r\n function () {\r\n bil.acceptPriceAndProceed()\r\n return false\r\n }\r\n )\r\n // bind pricepanel to the model\r\n ko.applyBindings(\r\n bil.updateRegNr.alt,\r\n h.getElm('nyPrisPanelegNrGroup')\r\n )\r\n ko.applyBindings(\r\n bil.updateRegNr.alt,\r\n h.getElm('nyPrisPanelNyPrisGroup')\r\n )\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('nyPrisPanelGammelPrisGroup')\r\n )\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n }\r\n } else {\r\n // Vognkode not different. move on\r\n bil.acceptPriceAndProceed()\r\n }\r\n } else {\r\n // the regnr was not recognized and no product was returned.\r\n app.displayEntryExceptionInfo(\r\n app.getFejlKode('CLIENT-BIL-KAN_IKKE_FINDE_MODEL')\r\n )\r\n $('#RegNr').val(app.root.activeProduct.Model().RegNr())\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n },\r\n entryFail: function (data) {\r\n // execute validation from control (if any)\r\n if (\r\n bil.updateRegNr.actionSettings2 &&\r\n bil.updateRegNr.actionSettings2.onInvalid\r\n ) {\r\n bil.updateRegNr.actionSettings2.onInvalid()\r\n }\r\n\r\n // error, maybe the regnr wasnt found\r\n if (\r\n data &&\r\n data.Message &&\r\n (data.Message.TekstKode === 'CLIENT-BIL-KAN_IKKE_FINDE_MODEL' ||\r\n data.Message.TekstKode === 'AutoITError')\r\n ) {\r\n // $('#RegNr').val(app.root.activeProduct.Model().RegNr());\r\n const regInfo = bil.buildInvalidRegistrationDescription(data.Data, data.Message.TekstKode)\r\n bil.displayUkendtRegNrPanel(regInfo)\r\n return false // cancel default action\r\n }\r\n\r\n // h.updateElementValidation(this.targetElement[0], 'ifws_isInvalid', 'xxx ', false /*forces error result*/);\r\n this.targetElement[0].ifws_isInvalid = true\r\n app.onEntryFail(data)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\nbil.buildInvalidRegistrationDescription = function (enigmaRegNr, textCode) {\r\n let errorCode = ''\r\n\r\n if (textCode === 'CLIENT-BIL-KAN_IKKE_FINDE_MODEL') {\r\n errorCode = 'invalidReg'\r\n } else if (textCode === 'AutoITError') {\r\n errorCode = 'serverUnavailable'\r\n }\r\n\r\n return {\r\n enigmaRegNr,\r\n errorCode\r\n }\r\n}\r\n\r\nexport { bil, newModelRegNr }\r\n","/* global ko $ */\r\n\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport {\r\n enableToolTips,\r\n enableInputEvaluation,\r\n PendingInputs\r\n} from './../dk-ifshop-controls'\r\n\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\nimport { setupBoatModelSelect } from './dk-ifshop-boat-multicontrolconfig'\r\nimport { TextHelper } from './../dk-ifshop-text-helper'\r\nimport { BoatTextCodes } from './../dk-ifshop-constants'\r\n\r\nconst boat = {} // namespace\r\nboat.settings = {\r\n maxTradeValue: 1000000,\r\n minTradeValue: 5000,\r\n maxCombinedHorsepower: 2000,\r\n boatTypeMotorboat: 'MOTORBÅD',\r\n boatTypeSailboat: 'SEJLBÅD/MOTORSEJLER',\r\n boatTypeJetski: 'JETSKI/VANDSCOOTERE',\r\n boatTypeRIB: 'RIB',\r\n boatMotorType: 'UDENBORDS/PÅHÆNGSMOTOR'\r\n}\r\n\r\nboat.beregnPris = function (jElement) {\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(boat.beregnPris.submit)\r\n}\r\n\r\nboat.beregnPrisWithValidate = function (jElement) {\r\n boat.beregnPris(jElement)\r\n app.root.activeProduct.validateOnServer()\r\n}\r\nboat.setModelData = function (actionSettings) {\r\n // called from all two places where a model can be edited (quickform, step1)\r\n if (app.wizard) {\r\n if (app.page === 'produkt') {\r\n app.root.activeProduct.setModel(\r\n h.getElm('Model').value,\r\n $(h.getElm('Model')),\r\n actionSettings\r\n )\r\n }\r\n } else {\r\n // quickform\r\n return app.root.activeProduct.setModel(\r\n h.getElm('Model').value,\r\n $(h.getElm('Model')),\r\n actionSettings\r\n )\r\n }\r\n}\r\nboat.SaveProductAndAddTrailerToCart = function () {\r\n const settings = { done: boat.AddTrailerToCart, entryFail: function (data) { app.showMessage('Ukendt fejl') } }\r\n app.root.activeProduct.save(settings)\r\n}\r\nboat.AddTrailerToCart = function () {\r\n const settings = { done: basic.gotoNextProduct, entryFail: function (data) { app.showMessage('Ukendt fejl') } }\r\n app.root.addProdukt('Trailer', settings)\r\n}\r\n\r\nboat.ResetModel = function () {\r\n app.root.activeProduct.Model(undefined)\r\n app.root.activeProduct.BoatType(undefined)\r\n app.root.activeProduct.MotorType(undefined)\r\n app.root.activeProduct.HullMaterial(undefined)\r\n app.root.activeProduct.NumberOfMotors(undefined)\r\n app.root.activeProduct.Year(undefined)\r\n app.root.activeProduct.TradeValue(undefined)\r\n app.root.activeProduct.Motor1Year(undefined)\r\n app.root.activeProduct.Motor2Year(undefined)\r\n app.root.activeProduct.CombinedHorsepower(undefined)\r\n}\r\n\r\nboat.quickForm = function (jElement) {\r\n if (app.page !== 'front') {\r\n h.disable($('#wizardNavigation button', app.getTopJElm()))\r\n }\r\n\r\n boat.ResetModel()\r\n quickformSubmitSetup.setup(jElement, boat.quickForm.submit)\r\n\r\n ko.applyBindingsToNode(\r\n jElement.find('#boatModelGroup')[0],\r\n null,\r\n app.root.activeProduct\r\n )\r\n\r\n setupBoatModelSelect(jElement)\r\n\r\n enableToolTips(jElement)\r\n enableInputEvaluation(jElement)\r\n}\r\nboat.quickForm.submit = function (jElement) {\r\n boat.setModelData()\r\n}\r\n\r\nboat.quickForm.syncProduct = function () {\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n if (app.page === 'front') {\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n app.loadPage('produkt')\r\n }\r\n },\r\n entryFail: function () {\r\n if (app.page === 'front') {\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n })\r\n}\r\n\r\nboat.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n boat.quickForm.syncProduct() // this is not nessesary as there is nothing more to do on this step.\r\n } else {\r\n app.wizard.goFwd()\r\n }\r\n}\r\n\r\nboat.supplerendeInfo = function (jElement, productId) {\r\n enableInputEvaluation(jElement)\r\n enableToolTips(jElement)\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n basic.supplerendeInfo(jElement, productId)\r\n\r\n ko.applyBindings(app.root.activeProduct, document.getElementById('supplerendeBoatQuestions'))\r\n\r\n enableSelect($('#selectMotor1Model'), null, null, {\r\n cache: false,\r\n lazyLoad: false\r\n })\r\n enableSelect($('#selectMotor2Model'), null, null, {\r\n cache: false,\r\n lazyLoad: false,\r\n afterOnLoadDone: function (element) {\r\n h.setDisabled($(element), app.root.activeProduct.UseMotor1ModelForMotor2())\r\n }\r\n })\r\n enableSelect($('#selectAuxiliaryMotorYear'), null, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n const _thisYear = parseInt(app.getBestYear())\r\n for (let i = _thisYear; i >= 1950; i--) {\r\n const _txt = String(i)\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_txt)\r\n )\r\n }\r\n }\r\n })\r\n\r\n if (app.root.activeProduct.Year() > 1985) {\r\n $('#HullNumber').rules('add', {\r\n required: true\r\n })\r\n }\r\n\r\n $('#HullNumber').on('change', function () { app.root.activeProduct.sync() })\r\n $('#BoatName').on('change', function () { app.root.activeProduct.sync() })\r\n\r\n h.selectNextEntry(jElement)\r\n\r\n $('#selectMotor1Model').rules('add', {\r\n required: true\r\n })\r\n $('#selectMotor2Model').rules('add', {\r\n required: true\r\n })\r\n if (app.root.activeProduct.MotorType() === 'UDENBORDS/PÅHÆNGSMOTOR') {\r\n $('#Motor1IdNumber').rules('add', {\r\n required: true\r\n })\r\n $('#Motor2IdNumber').rules('add', {\r\n required: true\r\n })\r\n }\r\n $('#HasAuxiliaryMotorJa').rules('add', {\r\n required: true\r\n })\r\n $('#AuxiliaryMotorIdNumber').rules('add', {\r\n required: true\r\n })\r\n $('#selectAuxiliaryMotorYear').rules('add', {\r\n required: true\r\n })\r\n $('#HasBoatTrailerJa').rules('add', {\r\n required: true\r\n })\r\n $('#HasBoatTrailerRegNrJa').rules('add', {\r\n required: true\r\n })\r\n $('#BoatTrailerRegNr').rules('add', {\r\n required: true,\r\n ifws_isInvalid: true,\r\n messages: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n BoatTextCodes.BoatTrailerRegNrInvalid,\r\n 'Nummerplade ikke valid'\r\n )\r\n }\r\n })\r\n $('#BoatTrailerStelNr').rules('add', {\r\n required: true,\r\n ifws_isInvalid: true,\r\n messages: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n BoatTextCodes.BoatTrailerStelNrInvalid,\r\n 'StelNr ikke valid'\r\n )\r\n }\r\n })\r\n\r\n if (h.getElm('BoatTrailerRegNr')) {\r\n $('#BoatTrailerRegNr').on('evaluate', function () {\r\n const stelNr = h.getElm('BoatTrailerRegNr')\r\n h.validateElement(stelNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('BoatTrailerRegNr').ifws_customValidation = function (value) {\r\n const res = boat.erRegNrBoatTrailerValid(this)\r\n return res\r\n }\r\n }\r\n\r\n if (h.getElm('BoatTrailerStelNr')) {\r\n $('#BoatTrailerStelNr').on('evaluate', function () {\r\n const regNr = h.getElm('BoatTrailerStelNr')\r\n h.validateElement(regNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('BoatTrailerStelNr').ifws_customValidation = function (value) {\r\n const res = boat.erStelNrBoatTrailerValid(this)\r\n return res\r\n }\r\n }\r\n app.root.activeProduct.UseMotor1ModelForMotor2.subscribe(\r\n function (val) {\r\n const motor2Select = $('#selectMotor2Model')\r\n h.setDisabled(motor2Select, val)\r\n if (val) {\r\n app.root.activeProduct.Motor2Model(app.root.activeProduct.Motor1Model())\r\n }\r\n })\r\n\r\n app.root.activeProduct.Motor1Model.subscribe(\r\n function (val) {\r\n if (val && app.root.activeProduct.UseMotor1ModelForMotor2()) {\r\n // Copy value to Motor2Model\r\n app.root.activeProduct.Motor2Model(val)\r\n }\r\n })\r\n })\r\n}\r\nboat.erRegNrBoatTrailerValid = function (element) {\r\n const regNr = $(element).val()\r\n const pattern = /[A-Z]{2}\\d{4}/i\r\n\r\n return regNr.match(pattern)\r\n}\r\nboat.erStelNrBoatTrailerValid = function (element) {\r\n const stelNr = $(element).val()\r\n\r\n /// /Stelnummer kun indeholde danske bokstager og tal, dog ikke i, o, æ, ø, å\r\n const pattern = /^[abcdefghjklmnpqrstuvwxyz0-9]+$/i\r\n return stelNr.match(pattern)\r\n}\r\nboat.daekningsTilpasningsPanel = function (jElement) {\r\n basic.daekningsTilpasningsPanelBasics(jElement)\r\n const activeProduct = app.root.activeProduct\r\n\r\n $('#LovpligtigAnsvar_tilvalg').change(function () {\r\n activeProduct.LovpligtigAnsvar(this.checked)\r\n })\r\n\r\n activeProduct.daekningsSubscriptions.push(\r\n activeProduct.SailPeriodThroughTheYear.subscribeChanged(activeProduct.beregnOnChange))\r\n}\r\n\r\nboat.generelt = function (jElement) {\r\n ko.applyBindings(app.root, jElement[0])\r\n enableToolTips(jElement)\r\n const radioButtonUnansweredErrorMessage = TextHelper.getRadioButtonUnansweredErrorMessage()\r\n enableSelect($('#selectYear'), null, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n const _thisYear = parseInt(app.getBestYear())\r\n for (let i = _thisYear; i >= 1900; i--) {\r\n const _txt = String(i)\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_txt)\r\n )\r\n }\r\n }\r\n })\r\n enableSelect($('#selectNumberOfMotors'), null, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n setNumberOfMotorsSelectInput(element)\r\n }\r\n })\r\n\r\n enableSelect($('#selectMotor1Year'), null, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n const _thisYear = parseInt(app.getBestYear())\r\n for (let i = _thisYear; i >= 1950; i--) {\r\n const _txt = String(i)\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_txt)\r\n )\r\n }\r\n }\r\n })\r\n\r\n enableSelect($('#selectMotor2Year'), null, null, {\r\n disableAutoUpdate: false,\r\n onLoad: function (element) {\r\n const _thisYear = parseInt(app.getBestYear())\r\n for (let i = _thisYear; i >= 1950; i--) {\r\n const _txt = String(i)\r\n $(element).append(\r\n $('')\r\n .text(_txt)\r\n .val(_txt)\r\n )\r\n }\r\n }\r\n })\r\n enableSelect($('#NumberOfClaimsBoat'), app.root, null, {\r\n disableAutoBind: true,\r\n validateImmediately: true,\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n $(element).append(\r\n $('')\r\n .text('0')\r\n .val('0')\r\n )\r\n $(element).append(\r\n $('')\r\n .text('1')\r\n .val('1')\r\n )\r\n $(element).append(\r\n $('')\r\n .text('2')\r\n .val('2')\r\n )\r\n $(element).append(\r\n $('')\r\n .text('3')\r\n .val('3')\r\n )\r\n $(element).append(\r\n $('')\r\n .text(app.getHjaelpeKodeText('CLIENT-3_ELLER_FLERE', '4 eller flere'))\r\n .val('4')\r\n )\r\n },\r\n validation: function (s, actionSettings) {\r\n s.topElement.ifws_isInvalid = false\r\n s.isWorking = false\r\n\r\n if (s.topElement.form.validator.element(s.topElement)) {\r\n actionSettings.onValid()\r\n } else {\r\n actionSettings.onInvalid()\r\n }\r\n }\r\n })\r\n\r\n const jForm = jElement\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate({\r\n rules: {\r\n selectYear: { required: true },\r\n TradeValue: {\r\n required: true,\r\n ifws_digits: true,\r\n max: boat.settings.maxTradeValue,\r\n min: boat.settings.minTradeValue\r\n },\r\n selectNumberOfMotors: { required: true },\r\n CombinedHorsepower: {\r\n required: true,\r\n ifws_digits: true,\r\n max: boat.settings.maxCombinedHorsepower,\r\n min: 1\r\n },\r\n selectMotor1Year: { required: true },\r\n selectMotor2Year: { required: true },\r\n NumberOfClaimsBoat: {\r\n ifws_selected: true,\r\n max: 3,\r\n ifws_isInvalid: true\r\n }\r\n },\r\n messages: {\r\n CombinedHorsepower: {\r\n min: app.getFejlKodeText(\r\n BoatTextCodes.CombinedHorsepowerToLow,\r\n 'Udfyld venligst bådens samlede motor hestekræfter'\r\n ),\r\n max: app.getFejlKodeText(\r\n BoatTextCodes.CombinedHorsepowerToHigh,\r\n 'Du kan desværre ikke beregne pris på denne båd i vores webshop. Du kan kontakte vores Webshop Service på telefon 70 12 12 53 for at få hjælp.'\r\n )\r\n },\r\n TradeValue: {\r\n min: app.getFejlKodeText(\r\n BoatTextCodes.TradeValueToLow,\r\n 'Du kan desværre ikke beregne pris på denne båd i vores webshop. Du kan kontakte vores Webshop Service på telefon 70 12 12 53 for at få hjælp.'\r\n ),\r\n max: app.getFejlKodeText(\r\n BoatTextCodes.TradeValueToHigh,\r\n 'Du kan desværre ikke beregne pris på denne båd i vores webshop. Du kan kontakte vores Webshop Service på telefon 70 12 12 53 for at få hjælp.'\r\n )\r\n },\r\n selectYear: {\r\n required: radioButtonUnansweredErrorMessage\r\n },\r\n selectMotor1Year: {\r\n required: radioButtonUnansweredErrorMessage\r\n },\r\n selectMotor2Year: {\r\n required: radioButtonUnansweredErrorMessage\r\n },\r\n selectNumberOfMotors: {\r\n required: radioButtonUnansweredErrorMessage\r\n },\r\n NumberOfClaimsBoat: {\r\n max: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_SKADER_BOAT',\r\n 'Du har samlet oplyst et antal skader, som betyder, at vi desværre ikke kan tilbyde dig den beregnede forsikring.'\r\n ),\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_TOTAL_SKADER',\r\n 'Du har samlet oplyst et antal skader, som betyder, at vi desværre ikke kan tilbyde dig den beregnede forsikring.'\r\n )\r\n }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n}\r\n\r\nfunction setNumberOfMotorsSelectInput (element) {\r\n if (app.root.activeProduct.BoatType() === boat.settings.boatTypeSailboat || app.root.activeProduct.BoatType() === boat.settings.boatTypeJetski) {\r\n $(element).append(\r\n $('')\r\n .text('0')\r\n .val(0)\r\n )\r\n }\r\n if (app.root.activeProduct.BoatType() !== boat.settings.boatTypeJetski) {\r\n $(element).append(\r\n $('')\r\n .text('1')\r\n .val(1)\r\n )\r\n }\r\n if (app.root.activeProduct.BoatType() === boat.settings.boatTypeMotorboat || app.root.activeProduct.BoatType() === boat.settings.boatTypeRIB) {\r\n $(element).append(\r\n $('')\r\n .text('2')\r\n .val(2)\r\n )\r\n }\r\n}\r\nboat.loadBoatEntry = function () {\r\n app.wizard.currentStep.setProgress(0)\r\n app.wizard.goTo(1)\r\n}\r\nboat.detaljer = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct, jElement[0])\r\n h.getJElmByDataId('chooseAnotherBoat')\r\n .parent()\r\n .on('click', function () {\r\n boat.ResetModel()\r\n app.root.activeProduct.syncV2().then(() => {\r\n boat.loadBoatEntry()\r\n }).catch((error) => {\r\n console.log(error)\r\n app.wizard.goTo(1)\r\n })\r\n })\r\n}\r\n\r\nexport { boat }\r\n","/* global $ */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\nimport { boat } from './dk-ifshop-boat-scripts'\r\nimport { PendingInputs } from './../dk-ifshop-controls'\r\n\r\nexport const setupBoatModelSelect = (jForm) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n Model: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n enableSelect($('#Model'), activeProduct, null, {\r\n cache: true,\r\n lazyLoad: true,\r\n hide: true,\r\n getCriteria: function (s) {\r\n const _c = s.getText()\r\n return '{\"str\" : \"' + _c + '\"}'\r\n },\r\n validateOnBlur: true,\r\n ignoreValidationOnKeyUp: true,\r\n validateImmediately: true,\r\n validation: function (s, actionSettings) {\r\n if (app.page !== 'front') {\r\n boat.setModelData(actionSettings)\r\n }\r\n }\r\n })\r\n}\r\n","/* global $ ko */\r\n\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { ifwsCampingvogn } from './dk-ifshop-campingvogn-scripts'\r\nimport { CaravanTextCodes } from './../dk-ifshop-constants'\r\n\r\nfunction CampingvognProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (value && isNaN(value)) {\r\n if (name === 'RegNrCampingvogn' && value) {\r\n self.RegNrCampingvogn(value.toUpperCase())\r\n }\r\n } else {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'RegNrCampingvogn' && value) {\r\n self.RegNrCampingvogn(value.toUpperCase())\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Selvrisiko,\r\n Daekning,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n UnderwritingAccept,\r\n StelNrCampingvogn,\r\n MaerkeCampingvogn,\r\n ModelCampingvogn,\r\n AargangCampingvogn,\r\n WeightCampingvogn,\r\n RegNrCampingvogn,\r\n UkendtRegNr,\r\n SearchRegNr,\r\n RegNrNotUsed,\r\n ManuallyEnteredVehicleData,\r\n AllowManualRegistrationNumber,\r\n IsCampingvognStationaer,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n CPState,\r\n SelectedDaekningId\r\n ) {\r\n self.isInit = true\r\n\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '', 'Selvrisiko')\r\n\r\n self.StelNrCampingvogn = self.koMap(\r\n StelNrCampingvogn,\r\n self.StelNrCampingvogn,\r\n '',\r\n 'StelNrCampingvogn',\r\n true\r\n )\r\n self.MaerkeCampingvogn = self.koMap(\r\n MaerkeCampingvogn,\r\n self.MaerkeCampingvogn,\r\n '',\r\n 'MaerkeCampingvogn',\r\n true\r\n )\r\n self.ModelCampingvogn = self.koMap(\r\n ModelCampingvogn,\r\n self.ModelCampingvogn,\r\n '',\r\n 'ModelCampingvogn',\r\n true\r\n )\r\n\r\n self.AargangCampingvogn = self.koMap(\r\n AargangCampingvogn,\r\n self.AargangCampingvogn,\r\n null,\r\n 'AargangCampingvogn',\r\n true\r\n )\r\n self.WeightCampingvogn = self.koMap(\r\n WeightCampingvogn,\r\n self.WeightCampingvogn,\r\n null,\r\n 'WeightCampingvogn',\r\n true\r\n )\r\n self.RegNrCampingvogn = self.koMap(\r\n RegNrCampingvogn,\r\n self.RegNrCampingvogn,\r\n '',\r\n 'RegNrCampingvogn',\r\n true\r\n )\r\n self.SearchRegNr = self.koMap(SearchRegNr, self.SearchRegNr)\r\n self.RegNrNotUsed = self.koMap(RegNrNotUsed, self.RegNrNotUsed)\r\n self.UkendtRegNr = self.koMap(UkendtRegNr, self.UkendtRegNr, '', 'UkendtRegNr')\r\n self.ManuallyEnteredVehicleData = self.koMap(ManuallyEnteredVehicleData, self.ManuallyEnteredVehicleData, false, 'ManuallyEnteredVehicleData')\r\n self.AllowManualRegistrationNumber = self.koMap(AllowManualRegistrationNumber, self.AllowManualRegistrationNumber, false, 'AllowManualRegistrationNumber')\r\n self.IsCampingvognStationaer = self.koMap(\r\n IsCampingvognStationaer,\r\n self.IsCampingvognStationaer\r\n )\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(self),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo()\r\n }\r\n })\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Selvrisiko,\r\n val.Daekning,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.UnderwritingAccept,\r\n val.StelNrCampingvogn,\r\n val.MaerkeCampingvogn,\r\n val.ModelCampingvogn,\r\n val.AargangCampingvogn,\r\n val.WeightCampingvogn,\r\n val.RegNrCampingvogn,\r\n val.UkendtRegNr,\r\n val.SearchRegNr,\r\n val.RegNrNotUsed,\r\n val.ManuallyEnteredVehicleData,\r\n val.AllowManualRegistrationNumber,\r\n val.IsCampingvognStationaer,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.CPState,\r\n val.SelectedDaekningId\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n let key =\r\n 'CAMPINGVOGN-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n app.root.Kunde().Alder() +\r\n '-' +\r\n self.AargangCampingvogn() +\r\n '-' +\r\n self.WeightCampingvogn()\r\n\r\n if (app.root.Kunde().CprNr()) {\r\n // defined used kvhx code if we know cprnr (kvhx only found on server as it is linked to cpr info and we dont give such info away on the client)\r\n key = key + '-' + app.root.Kunde().CprNr()\r\n } else {\r\n // defined used kvhx code if we know the address and not the cpr no. (only found on server)\r\n key =\r\n key +\r\n '-' +\r\n app.root.Kunde().Postnr() +\r\n '-' +\r\n app.root.Kunde().Gade() +\r\n '-' +\r\n app.root.Kunde().Husnr() +\r\n '-' +\r\n app.root.Kunde().Etage() +\r\n '-' +\r\n app.root.Kunde().SideDoerNr()\r\n }\r\n return key\r\n }\r\n\r\n self.innerDone = function (data, jqXHR) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (data !== undefined && data != null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage()\r\n } else {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n\r\n // we can not fade to details view if we have a manually entered registrationnumber\r\n if (!data.AllowManualRegistrationNumber) {\r\n h.fadeToForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/detaljer')\r\n h.extendForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n\r\n function handleSetModelError (data) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n if (data.Message.TekstKode === CaravanTextCodes.CaravanNotFound) {\r\n // todo: replace this with showing an error message that we can not lookup from dmr\r\n ifwsCampingvogn.displayUkendtRegNrPanel()\r\n // return false // cancel default action\r\n return false\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n }\r\n\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode = (data) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (data !== undefined && data !== null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.RegNrCampingvogn(data.SearchRegNr)\r\n activeProduct.ManuallyEnteredVehicleData(data.ManuallyEnteredVehicleData)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n }\r\n\r\n // update this product with a new model based on regnr (if found)\r\n self.setModel = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n try {\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode(CaravanTextCodes.RegNr0))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (code || '0'),\r\n produktId: (activeProduct.ProduktID() || '0'),\r\n allowInvalidRegNr: (activeProduct.AllowManualRegistrationNumber())\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelCampingvogn' }).then(function (token) {\r\n app.loadJson({\r\n allowCredentials: true,\r\n code,\r\n url: 'campingvognprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n token,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n code,\r\n url: 'produkt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.unknownRegistrationNumber = function () {\r\n // when the user clicks the 'Kender ikke regnr'\r\n try {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n activeProduct.RegNrNotUsed(true)\r\n activeProduct.sync({\r\n done: function () {\r\n app.gotoShopPage()\r\n }\r\n })\r\n } else {\r\n activeProduct.SearchRegNr(undefined)\r\n activeProduct.RegNrNotUsed(true)\r\n app.root.activeProduct.WeightCampingvogn(undefined)\r\n app.root.activeProduct.IsCampingvognStationaer(undefined)\r\n app.root.activeProduct.AargangCampingvogn(undefined)\r\n app.root.activeProduct.ModelCampingvogn(undefined)\r\n app.root.activeProduct.MaerkeCampingvogn(undefined)\r\n app.root.activeProduct.RegNrCampingvogn(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(undefined)\r\n app.root.activeProduct.ManuallyEnteredVehicleData(undefined)\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n }\r\n })\r\n\r\n h.fadeToForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/campingvognInfo')\r\n // display new questions\r\n h.extendForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n}\r\n\r\nexport { CampingvognProdukt }\r\n","/* global $ ko */\r\n\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport {\r\n PendingInputs,\r\n enableInputEvaluation,\r\n enableToolTips,\r\n initPlaceholders\r\n} from './../dk-ifshop-controls'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { dkRecaptcha } from '../security/recaptcha'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\nimport { CampingvognProdukt } from './dk-ifshop-campingvogn-produkt-model'\r\nimport { brugsInfo } from './dk-ifshop-caravan-multicontrolconfig'\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\nimport { CaravanTextCodes } from './../dk-ifshop-constants'\r\n\r\nconst ifwsCampingvogn = {} // namespace\r\n\r\nifwsCampingvogn.settings = {\r\n maxAge: 35,\r\n maxWeight: 3500\r\n}\r\n\r\nifwsCampingvogn.beregnPris = function (jElement) {\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(ifwsCampingvogn.beregnPris.submit)\r\n}\r\n\r\nifwsCampingvogn.beregnPrisWithValidate = function (jElement) {\r\n const { activeProduct } = app.root\r\n\r\n ifwsCampingvogn.beregnPris(jElement)\r\n\r\n activeProduct.validateOnServer({\r\n entryFail: function (data) {\r\n if (data && data.Message && data.Message.TekstKode === CaravanTextCodes.CaravanNotFound) {\r\n ifwsCampingvogn.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n return true\r\n }\r\n })\r\n}\r\n\r\nifwsCampingvogn.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n ifwsCampingvogn.quickForm.submit()\r\n } else {\r\n let jFormName = '#campingvognInfo'\r\n if (h.getElm('campingvognDetaljer')) {\r\n jFormName = '#campingvognDetaljer'\r\n }\r\n const jForm = $(jFormName)\r\n const validator = jForm.validate()\r\n if (validator.form(true)) {\r\n app.wizard.goFwd()\r\n } else {\r\n // Validate again to get the error messages shown\r\n validator.form(false)\r\n }\r\n }\r\n}\r\nifwsCampingvogn.detaljer = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct, jElement[0])\r\n\r\n h.getJElmByDataId('vaelgAndenCampingvogn')\r\n .parent()\r\n .on('click', function () {\r\n app.root.activeProduct.WeightCampingvogn(undefined)\r\n app.root.activeProduct.IsCampingvognStationaer(undefined)\r\n app.root.activeProduct.AargangCampingvogn(undefined)\r\n app.root.activeProduct.ModelCampingvogn(undefined)\r\n app.root.activeProduct.MaerkeCampingvogn(undefined)\r\n app.root.activeProduct.RegNrCampingvogn(undefined)\r\n app.root.activeProduct.StelNrCampingvogn(undefined)\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(undefined)\r\n app.root.activeProduct.ManuallyEnteredVehicleData(undefined)\r\n\r\n h.fadeToForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/quickform')\r\n\r\n $('#brugerInfoHolder').html('')\r\n\r\n app.root.activeProduct.Daekning().Navn('')\r\n })\r\n}\r\n\r\nifwsCampingvogn.quickForm = function (jElement) {\r\n const jForm = $('#quickForm')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n })\r\n })\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('brugerIkkeRegNr'))\r\n\r\n quickformSubmitSetup.setup(jForm, ifwsCampingvogn.quickFormSubmitFunction)\r\n\r\n ko.applyBindingsToNode(h.getElm('RegNr'), null, app.root.activeProduct)\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n if (h.getElm('RegNr')) {\r\n // bind to model\r\n ifwsCampingvogn.regNrSetupBtx(jElement)\r\n }\r\n // start over with new regnr, so we don't know if it is unknown or not\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n}\r\n\r\nifwsCampingvogn.displayUkendtRegNrPanel = function () {\r\n // display message\r\n app.loadHtml({\r\n url: 'campingvognprodukt/getsubview/UkendtRegNrPanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage($('#regNrMsg'), data, true)\r\n // bind pricepanel to the model\r\n $(app).trigger('sectionLoaded', ['displayUkendtRegNrPanel', h.getSections(this.targetElement)])\r\n }\r\n })\r\n}\r\n\r\nifwsCampingvogn.ukendtRegNrPanel = function () {\r\n // triggered by displayUkendtRegNrPanel\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if ($('#RegNr').valid()) {\r\n ifwsCampingvogn.ukendtRegNrPanelAction = true\r\n\r\n activeProduct.UkendtRegNr(undefined)\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('ukendtRegNrPanel'))\r\n\r\n $('input[name=UkendtRegNr]').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true\r\n })\r\n\r\n $('input[name=UkendtRegNr]').on('change', function () {\r\n ifwsCampingvogn.validateRegistrationNumber() // ?\r\n return false // we remove the entire panel incl. this radio button, therefore the default action should be stopped, otherwise we would receive an error\r\n })\r\n\r\n // update the text on the last radiobutton to include the regnr at the end\r\n const jUkendtTrue = $('label[for=UkendtRegNrtrue]')\r\n jUkendtTrue.text(jUkendtTrue.text() + ' ' + app.root.activeProduct.SearchRegNr())\r\n } else {\r\n // if ukendtregnrpanel, hide\r\n $('#regNrMsg').html('')\r\n }\r\n}\r\n\r\nifwsCampingvogn.findCampingvogn = function (jElement, productId) {\r\n h.setDisabled($('#wizardNavigation button', app.getTopJElm()), true)\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n ifwsCampingvogn.regNrSetupBtx(jElement)\r\n })\r\n}\r\n\r\nifwsCampingvogn.validateRegistrationNumber = function () {\r\n app.setPendingUserAction('ukendtRegNr')\r\n\r\n if ($('input[name=UkendtRegNr]')[0].checked) {\r\n ifwsCampingvogn.InvalidNumberPlateValidation()\r\n } else if ($('input[name=UkendtRegNr]')[1].checked) {\r\n ifwsCampingvogn.InvalidButManuallyAcceptedNumberPlateValidation()\r\n }\r\n\r\n ifwsCampingvogn.ukendtRegNrPanelAction = false\r\n app.resetPendingUserAction('ukendtRegNr')\r\n}\r\n\r\nifwsCampingvogn.quickForm.submit = function () {\r\n if ($('#RegNr').valid()) {\r\n ifwsCampingvogn.backupSelections()\r\n ifwsCampingvogn.updateModel()\r\n }\r\n}\r\nifwsCampingvogn.InvalidButManuallyAcceptedNumberPlateValidation = function (value) {\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(true)\r\n // add the searched regnr as the selected regnr\r\n\r\n activeProduct.RegNrCampingvogn(activeProduct.SearchRegNr())\r\n if (activeProduct.RegNrCampingvogn().length == 0) {\r\n activeProduct.RegNrCampingvogn($('#RegNr').val())\r\n }\r\n activeProduct.UkendtRegNr(true)\r\n\r\n if (app.page === 'checkout') {\r\n ifwsCampingvogn.handleCheckoutManual()\r\n } else {\r\n ifwsCampingvogn.handleProductManual()\r\n }\r\n return true\r\n}\r\nifwsCampingvogn.handleCheckoutManual = function () {\r\n // when proceeding with an invalid regnr at checkout\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n // move on\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'campingvognprodukt/getsubview/tidligereselskab')\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.RegNrCampingvogn($('#RegNr').val())\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n }\r\n })\r\n}\r\n\r\nifwsCampingvogn.handleProductManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.RegNrNotUsed(false)\r\n activeProduct.RegNrCampingvogn(activeProduct.SearchRegNr())\r\n ifwsCampingvogn.updateModel()\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.sync({\r\n done: function (message = {}) {\r\n h.fadeToForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/campingvogninfo')\r\n h.extendForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n })\r\n}\r\n\r\nifwsCampingvogn.quickFormSubmitFunction = function () {\r\n if ($('#RegNr').valid()) {\r\n ifwsCampingvogn.backupSelections()\r\n ifwsCampingvogn.updateModel()\r\n }\r\n}\r\n\r\nifwsCampingvogn.submitEntryFail = function (data, textStatus, jqXHR) {\r\n // Caravan was not accepted. Reuse saved search criterias, so the user can change them\r\n app.root.activeProduct.AargangCampingvogn(ifwsCampingvogn.campingvognInfo.selectionsYear)\r\n app.root.activeProduct.MaerkeCampingvogn(ifwsCampingvogn.campingvognInfo.selectionsMake)\r\n app.root.activeProduct.ModelCampingvogn(ifwsCampingvogn.campingvognInfo.selectionsModel)\r\n // Return true to make sure default action is perforformed too (Message)\r\n return true\r\n}\r\n\r\nifwsCampingvogn.updateModel = function (actionSettings) {\r\n ifwsCampingvogn.setModelData(actionSettings)\r\n}\r\nifwsCampingvogn.setModelData = function (actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const regNrValue = h.getElm('RegNr').value\r\n const regNrElement = $(h.getElm('RegNr'))\r\n\r\n if (regNrElement.valid()) {\r\n // called from all three places where a regnr can be edited (quickform, step1 and step3)\r\n if (!app.wizard || app.page === 'produkt') {\r\n activeProduct.setModel(regNrValue, regNrElement, actionSettings)\r\n } else if (app.page === 'checkout') {\r\n ifwsCampingvogn.updateRegNr(regNrValue, regNrElement, actionSettings)\r\n }\r\n } else {\r\n actionSettings.onInvalid()\r\n }\r\n}\r\nifwsCampingvogn.backupSelections = function () {\r\n // save selections because they are overwritten with info that might differ (different case, spacet etc.), but we will need them again if the Caravan isn't accepted\r\n ifwsCampingvogn.campingvognInfo.selectionsYear = app.root.activeProduct.AargangCampingvogn()\r\n ifwsCampingvogn.campingvognInfo.selectionsMake = app.root.activeProduct.MaerkeCampingvogn()\r\n ifwsCampingvogn.campingvognInfo.selectionsModel = app.root.activeProduct.ModelCampingvogn()\r\n}\r\n\r\nifwsCampingvogn.InvalidNumberPlateValidation = function (value) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n $('#regNrMsg').html('')\r\n\r\n // set the option to undefined as we dont want to save this answer anywhere.\r\n activeProduct.UkendtRegNr(undefined)\r\n activeProduct.SearchRegNr(undefined)\r\n\r\n return true\r\n}\r\nifwsCampingvogn.campingvognInfo = function (jElement) {\r\n if (app.root.activeProduct.AargangCampingvogn() === 0) {\r\n app.root.activeProduct.AargangCampingvogn('')\r\n }\r\n\r\n enableToolTips(jElement)\r\n\r\n ifwsCampingvogn.enableSelectYear()\r\n ko.applyBindings(app.root.activeProduct, h.getElm('WeightCampingvogn'))\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('IsCampingvognStationaerGroup')\r\n )\r\n\r\n const jForm = $('#campingvognInfo')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate({\r\n rules: {\r\n selectYear: { ifws_selected: true },\r\n WeightCampingvogn: {\r\n required: true,\r\n min: 1,\r\n max: 3500,\r\n number: true\r\n },\r\n IsCampingvognStationaer: {\r\n required: true\r\n }\r\n },\r\n messages: {\r\n WeightCampingvogn: {\r\n min: app.getFejlKodeText(\r\n CaravanTextCodes.WeightToLow,\r\n 'Udfyld venligst campingvognens vaegt.'\r\n ),\r\n max: app.getFejlKodeText(\r\n CaravanTextCodes.WeightToHigh,\r\n 'Du kan desværre ikke beregne en pris på denne campingvogn i vores webshop. Du bedes venligst kontakte Webshop Service på tlf.nr. 70 12 12 53 for at høre nærmere'\r\n )\r\n }\r\n }\r\n })\r\n\r\n jForm[0].validator = validator\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n if (validator.form(true)) {\r\n ifwsCampingvogn.backupSelections()\r\n\r\n // sync\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n if (!app.root.activeProduct.AllowManualRegistrationNumber() && !app.root.activeProduct.RegNrNotUsed()) {\r\n // accepted. display the details with logo\r\n h.fadeToForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/detaljer')\r\n // display new questions\r\n h.extendForm($('#campingvognHolder'), 'campingvognprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n },\r\n entryFail: ifwsCampingvogn.submitEntryFail\r\n })\r\n }\r\n })\r\n })\r\n\r\n jForm.submit(function (e) {\r\n e.preventDefault()\r\n })\r\n\r\n enableInputEvaluation($('#handelsVaerdiGroup'))\r\n}\r\n\r\nifwsCampingvogn.regNrSetupBtx = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n },\r\n messages: {\r\n RegNr: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n CaravanTextCodes.RegNrInvalid,\r\n 'Nummerplade ikke valid'\r\n )\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n // avoids autosubmit in IE, when there is only a single input control in the form\r\n jForm.on('keydown', '#RegNr', function (e) {\r\n if ($('#RegNr').attr('allowenter') === undefined) {\r\n if (e.keyCode === '32' || e.keyCode === 32) {\r\n e.preventDefault()\r\n }\r\n\r\n if (e.keyCode === '13' || e.keyCode === 13) {\r\n e.preventDefault()\r\n $('#RegNr').valid()\r\n }\r\n }\r\n })\r\n\r\n // RegNrCampingvogn -----------------------------------------------------------------------\r\n if (h.getElm('RegNr')) {\r\n $('#regNr').on('evaluate', function () {\r\n const regNr = h.getElm('RegNr')\r\n h.validateElement(regNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('RegNr').ifws_customValidation = function (value) {\r\n const res = ifwsCampingvogn.erRegNrCampingvognValid(this)\r\n return res\r\n }\r\n }\r\n\r\n $('#RegNr').change(function () {\r\n if ($('#RegNr').valid()) {\r\n if (ifwsCampingvogn.ukendtRegNrPanelAction) {\r\n $('#regNrMsg').html('')\r\n }\r\n } else {\r\n $('#regNrMsg').html('')\r\n }\r\n\r\n if (app.page !== 'front') {\r\n const actionSettings = {\r\n onInvalid: function () {\r\n }\r\n }\r\n ifwsCampingvogn.updateModel(actionSettings)\r\n }\r\n })\r\n}\r\n\r\nifwsCampingvogn.enableSelectYear = function (prefix) {\r\n if (typeof prefix === 'undefined') {\r\n prefix = 'select'\r\n }\r\n enableSelect($('#' + prefix + 'Year'), app.root.activeProduct, null, {\r\n disableAutoUpdate: true,\r\n onLoad: function (element) {\r\n const thisYear = app.getBestYear()\r\n for (let i = 0; i <= ifwsCampingvogn.settings.maxAge; i++) {\r\n const txt = String(thisYear - i)\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(txt)\r\n )\r\n }\r\n }\r\n })\r\n}\r\nifwsCampingvogn.ejersBrugsInfo = function (jElement) {\r\n brugsInfo('', app.root.Kunde(), jElement)\r\n\r\n if (app.root.Disv() && app.root.Kunde().Address()) {\r\n $('.edit-address-button').remove()\r\n }\r\n\r\n if (app.root.DisableCustomerElements() === true) {\r\n basic.hideCprGroupSection()\r\n }\r\n\r\n h.selectNextEntry(jElement)\r\n}\r\n\r\nifwsCampingvogn.supplerendeInfoCampingvogn = function (jElement, productType) {\r\n app.root.ensureActiveProduct(productType, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n const searchRegNr = app.root.activeProduct.SearchRegNr()\r\n const modelRegNr = app.root.activeProduct.RegNrCampingvogn()\r\n\r\n if (searchRegNr && !modelRegNr) {\r\n app.root.activeProduct.RegNrCampingvogn(searchRegNr)\r\n }\r\n\r\n enableToolTips(jElement)\r\n ko.applyBindings(app.root.activeProduct, document.getElementById('modelGroup'))\r\n ko.applyBindings(app.root.activeProduct, document.getElementById('RegNrGroup'))\r\n\r\n $('#RegNrCampingvogn').attr('disabled', 'disabled')\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n // validation rules\r\n const jForm = $('#supplerendeInfoCampingvogn')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n const validator = jForm.validate({\r\n rules: {\r\n MaerkeCampingvogn: {\r\n required: true\r\n },\r\n RegNrCampingvogn: {\r\n required: true,\r\n ifws_isInvalid: true\r\n },\r\n StelNrCampingvogn: {\r\n required: true,\r\n ifws_isInvalid: true\r\n }\r\n },\r\n messages: {\r\n MaerkeCampingvogn: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n CaravanTextCodes.BrandInvalid,\r\n 'Maerke ikke valid'\r\n )\r\n },\r\n RegNrCampingvogn: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n CaravanTextCodes.RegNrInvalid,\r\n 'Nummerplade ikke valid'\r\n )\r\n },\r\n StelNrCampingvogn: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n CaravanTextCodes.StelNrInvalid,\r\n 'Stelnummer ikke valid'\r\n )\r\n }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n\r\n // RegNrCampingvogn -----------------------------------------------------------------------\r\n if (h.getElm('RegNrCampingvogn')) {\r\n $('#regNrCampingvogn').on('evaluate', function () {\r\n const regNr = h.getElm('RegNrCampingvogn')\r\n h.validateElement(regNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('RegNrCampingvogn').ifws_customValidation = function (value) {\r\n const res = ifwsCampingvogn.erRegNrCampingvognValid(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n // StelNrCampingvogn -----------------------------------------------------------------------\r\n if (h.getElm('StelNrCampingvogn')) {\r\n $('#StelNrCampingvogn').on('evaluate', function () {\r\n const stelNr = h.getElm('StelNrCampingvogn')\r\n h.validateElement(stelNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('StelNrCampingvogn').ifws_customValidation = function (value) {\r\n const res = ifwsCampingvogn.erStelNrCampingvognValid(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n // nyKontaktKundeService ------------------------------------------------------------------\r\n if (h.getElm('nyKontaktKundeService')) {\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('nyKontaktKundeService')\r\n )\r\n }\r\n\r\n h.selectNextEntry(jElement)\r\n })\r\n}\r\n\r\nifwsCampingvogn.DisplayRegNrGroup = function () {\r\n if (!app.root.activeProduct.UkendtRegNr()) {\r\n h.disable($('#RegNrCampingvogn'))\r\n } else {\r\n h.enable($('#RegNrCampingvogn'))\r\n }\r\n}\r\n\r\nifwsCampingvogn.acceptPriceAndProceed = function () {\r\n app.resetPendingUserAction()\r\n ifwsCampingvogn.acceptNewPrice(ifwsCampingvogn.updateRegNr.actionSettings)\r\n}\r\n\r\nifwsCampingvogn.acceptNewPrice = function (actionSettings) {\r\n const element = app.wizard.getCurrentWizardBodyJElement()\r\n\r\n app.root.activeProduct.setModel(newModelRegNr, element, actionSettings)\r\n app.root.activeProduct.RegNrNotUsed(false)\r\n ifwsCampingvogn.DisplayRegNrGroup()\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n\r\n ifwsCampingvogn.updateWizardSubtext()\r\n}\r\n\r\nifwsCampingvogn.updateWizardSubtext = function () {\r\n if (ifwsCampingvogn.updateRegNr.alt) {\r\n const wizardStepCurrent = app.getTopJElm().find('.wizardStepCurrent')\r\n const title = ifwsCampingvogn.updateRegNr.alt.MaerkeCampingvogn() + ' ' + ifwsCampingvogn.updateRegNr.alt.ModelCampingvogn() + ' - ' + ifwsCampingvogn.updateRegNr.alt.RegNrCampingvogn()\r\n wizardStepCurrent.find('.stepSubTitle').text(title)\r\n }\r\n}\r\n\r\n// RegNrCampingvogn -----------------------------------------------------------------------\r\nifwsCampingvogn.erRegNrCampingvognValid = function (element) {\r\n const regNr = $(element).val()\r\n\r\n const pattern = /[A-Z]{2}[0-9]{4}/i\r\n if (regNr.match(pattern)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n// StelNrCampingvogn -----------------------------------------------------------------------\r\nifwsCampingvogn.erStelNrCampingvognValid = function (element) {\r\n const stelNr = $(element).val()\r\n\r\n /// /Stelnummer kun indeholde danske bokstager og tal, dog ikke i, o, æ, ø, å\r\n const pattern = /^[abcdefghjklmnpqrstuvwxyz0-9]+$/i // Kontakt google.com for forklaring\r\n\r\n if (stelNr.match(pattern)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nlet newModelRegNr = ''\r\n\r\nifwsCampingvogn.updateRegNr = function (code, jElement, actionSettings) {\r\n try {\r\n newModelRegNr = h.getElm('RegNr').value\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode(CaravanTextCodes.RegNr0))\r\n return\r\n } else if (code === app.root.activeProduct.RegNrCampingvogn()) {\r\n // no difference\r\n return\r\n }\r\n\r\n ifwsCampingvogn.updateRegNr.actionSettings = {\r\n done: function () {\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'campingvognprodukt/getsubview/supplerende')\r\n\r\n // execute validation from control (if any)\r\n if (ifwsCampingvogn.updateRegNr.actionSettings2 && ifwsCampingvogn.updateRegNr.actionSettings2.onValid) {\r\n ifwsCampingvogn.updateRegNr.actionSettings2.onValid()\r\n }\r\n\r\n app.root.activeProduct.sync(\r\n {\r\n done: function (message = {}) {\r\n // update total fields to reflect the new totals\r\n basic.updateTotalFields()\r\n }\r\n },\r\n true\r\n )\r\n }\r\n }\r\n\r\n ifwsCampingvogn.updateRegNr.actionSettings2 = actionSettings\r\n\r\n app.setPendingUserAction('newPriceAwaitingApproval')\r\n // try to find the model\r\n app.loadJson({\r\n url: 'campingvognprodukt/getmodel',\r\n data: '{ \"code\" : \"' + (code || '0') + '\" }',\r\n targetElement: jElement,\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // a new product is received\r\n if (data && data.AargangCampingvogn && data.WeightCampingvogn) {\r\n const makeNumberOrAnvendelseHasChanged =\r\n app.root.activeProduct.AargangCampingvogn() !== data.AargangCampingvogn || app.root.activeProduct.WeightCampingvogn() !== data.WeightCampingvogn\r\n\r\n let logMessage = 'Campingvogn-Manualflow-matching-regnr'\r\n\r\n if (makeNumberOrAnvendelseHasChanged) {\r\n // create a model of the new product so it can be bound to the view\r\n ifwsCampingvogn.updateRegNr.alt = new CampingvognProdukt()\r\n ifwsCampingvogn.updateRegNr.alt.update(data)\r\n\r\n // comparison variables for price\r\n const priceIsEqual = data.Daekning.NettoPraemieTotal === app.root.activeProduct.Daekning().NettoPraemieTotal()\r\n const yearIsEqual = data.AargangCampingvogn === app.root.activeProduct.AargangCampingvogn()\r\n const weightIsEqual = data.WeightCampingvogn === app.root.activeProduct.WeightCampingvogn()\r\n\r\n // compare info\r\n if (\r\n priceIsEqual &&\r\n (yearIsEqual &&\r\n weightIsEqual)\r\n ) {\r\n // the prices are the same. accept\r\n logMessage += '-same-price-and-model'\r\n ifwsCampingvogn.acceptPriceAndProceed()\r\n } else {\r\n logMessage += '-failed'\r\n // display message\r\n app.loadHtml({\r\n url: 'campingvognprodukt/getsubview/nyprispanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage(\r\n $('#regNrMsg', '', true),\r\n data,\r\n true,\r\n true,\r\n app.getHjaelpeKodeText(CaravanTextCodes.ButtonContinueNewPrice, 'Fortsæt med ny pris'),\r\n function () {\r\n ifwsCampingvogn.acceptPriceAndProceed()\r\n return false\r\n }\r\n )\r\n // bind pricepanel to the model\r\n ko.applyBindings(ifwsCampingvogn.updateRegNr.alt, h.getElm('nyPrisPanelegNrGroup'))\r\n ko.applyBindings(ifwsCampingvogn.updateRegNr.alt, h.getElm('nyPrisPanelNyPrisGroup'))\r\n ko.applyBindings(app.root.activeProduct, h.getElm('nyPrisPanelGammelPrisGroup'))\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n }\r\n } else {\r\n logMessage = 'Campingvogn-Manualflow-matching-same-makenumber'\r\n // Vognkode not different. move on\r\n ifwsCampingvogn.acceptPriceAndProceed()\r\n }\r\n\r\n const logData = {\r\n regnr: code,\r\n manualCaravanYear: app.root.activeProduct.AargangCampingvogn(),\r\n manualCaravanBrand: app.root.activeProduct.MaerkeCampingvogn,\r\n manualCaravanWeight: app.root.activeProduct.WeightCampingvogn()\r\n }\r\n\r\n app.logInformationToAppInsight(logMessage, logData)\r\n } else {\r\n app.displayEntryExceptionInfo(app.getFejlKode(CaravanTextCodes.CaravanNotFound))\r\n $('#RegNr').val(app.root.activeProduct.RegNrCampingvogn())\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n },\r\n entryFail: function (data) {\r\n // execute validation from control (if any)\r\n if (ifwsCampingvogn.updateRegNr.actionSettings2 && ifwsCampingvogn.updateRegNr.actionSettings2.onInvalid) {\r\n ifwsCampingvogn.updateRegNr.actionSettings2.onInvalid()\r\n }\r\n\r\n if (data && data.Message && data.Message.TekstKode === CaravanTextCodes.CaravanNotFound) {\r\n ifwsCampingvogn.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n\r\n this.targetElement[0].ifws_isInvalid = true\r\n app.onEntryFail(data)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\nexport { ifwsCampingvogn }\r\n","/* global $ */\r\n\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { PendingInputs, enableToolTips } from './../dk-ifshop-controls'\r\n\r\nexport const brugsInfo = (prefix, person, jElement) => {\r\n enableToolTips(jElement)\r\n\r\n let jForm = $('#' + prefix + 'brugsInfo')\r\n\r\n if (!jForm[0].validator) {\r\n jForm = jElement\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = jForm.validate()\r\n }\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n const validator = jForm.validate()\r\n jForm[0].validator = validator\r\n\r\n basic.setupKundeInfoGroup(jElement)\r\n}\r\n","/* Global $ */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\n\r\nexport const displayError = (inputCpr1, inputCpr2, fejlKode, defaultText, prefix) => {\r\n // force immediately validation on the entry and pass the custom message to be displayed\r\n inputCpr1.ifws_isInvalid = true\r\n\r\n h.validateElement(\r\n inputCpr1,\r\n 'ifws_isInvalid',\r\n app.getFejlKodeText(fejlKode, defaultText)\r\n )\r\n\r\n inputCpr2.ifws_isInvalid = true\r\n h.validateElement(inputCpr2)\r\n\r\n return false\r\n}\r\n\r\nexport const hideError = (field) => {\r\n field.ifws_isInvalid = false\r\n h.validateElement(\r\n field,\r\n 'ifws_isInvalid'\r\n )\r\n}\r\n\r\nexport const hideErrors = (fields) => {\r\n fields.forEach(x => hideError(x))\r\n}\r\n","export const applyCprValidationRules = ($inputCpr1, $inputCpr2) => {\r\n// validation rules (using dynamic settings and not static settings {fornavn: ...} because we need to use the prefix)\r\n $inputCpr1.rules('add', {\r\n ifws_isInvalid: true,\r\n required: true,\r\n minlength: 6,\r\n min: 0,\r\n number: true\r\n })\r\n\r\n $inputCpr2.rules('add', {\r\n ifws_isInvalid: true,\r\n required: true,\r\n minlength: 4,\r\n min: 0,\r\n number: true\r\n })\r\n}\r\n","import { canParseCprToDate } from '../cpr/dk-ifshop-cpr'\r\nimport { displayError } from './dk-ifshop-cpr-multicontrol-config'\r\nimport { h } from '../dk-ifshop-helper'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nexport const personHasAnUndefinedAge = (person) => {\r\n const age = person.Alder()\r\n return age === null || age === undefined || age === ''\r\n}\r\n\r\nconst personHasAgeOver99Years = (person) => {\r\n return person.Alder() > 99\r\n}\r\n\r\nconst personIsUnderTheAgeOfEighteen = (person) => {\r\n return person.Alder() < 18\r\n}\r\n\r\nexport const validateCpr1 = (cpr1, prefix) => {\r\n const inputCpr1 = h.getElmById('Cpr1', prefix)\r\n const inputCpr2 = h.getElmById('Cpr2', prefix)\r\n\r\n const textKey = h.getClientTextKey('CPR_FORMAT', prefix)\r\n if (!canParseCprToDate(cpr1)) {\r\n return displayError(inputCpr1, inputCpr2, textKey, 'Det indtastede CPR-nummer er ikke gyldigt.')\r\n }\r\n return true\r\n}\r\n\r\nexport const validateAge = (person, rule18, prefix, role) => {\r\n if (prefix == PersonEntities.Kunde) {\r\n prefix = ''\r\n }\r\n const inputCpr1 = h.getElm(prefix + 'Cpr1')\r\n const inputCpr2 = h.getElm(prefix + 'Cpr2')\r\n\r\n const FormatKey = h.getClientTextKey('CPR_FORMAT', prefix)\r\n const Over99Key = h.getClientTextKey('OVER_99', prefix)\r\n const under18Key = h.getClientTextKey('UNDER_18_PRODUKT_MIX', prefix)\r\n\r\n if (personHasAnUndefinedAge(person)) {\r\n return displayError(inputCpr1, inputCpr2, FormatKey, 'Det indtastede CPR-nummer er ikke gyldigt.')\r\n } else if (personHasAgeOver99Years(person)) {\r\n if (role === PersonEntities.Kunde) {\r\n return displayError(inputCpr1, inputCpr2, Over99Key, 'Du kan ikke blive forsikret igennem denne shop, hvis du er over 99 år')\r\n } else if (role === PersonEntities.ForsikredePerson) {\r\n return displayError(inputCpr1, inputCpr2, Over99Key, 'Den forsikrede kan ikke blive forsikret igennem denne shop, hvis den er over 99 år')\r\n }\r\n }\r\n\r\n if (rule18 && personIsUnderTheAgeOfEighteen(person)) {\r\n if (role === PersonEntities.Kunde) {\r\n return displayError(inputCpr1, inputCpr2, under18Key, 'Du skal være mindst 18 år, da du også prøver at købe produkter der kræver du er 18 år.')\r\n } else if (role === PersonEntities.ForsikredePerson) {\r\n return displayError(inputCpr1, inputCpr2, under18Key, 'Den forsikrede skal være mindst 18 år, da den også prøver at købe produkter der kræver du er 18 år.')\r\n } else if (role === PersonEntities.Medforsikret) {\r\n return displayError(inputCpr1, inputCpr2, under18Key, 'Den medforsikrede skal være mindst 18 år, da den også prøver at købe produkter der kræver du er 18 år.')\r\n }\r\n }\r\n return true\r\n}\r\n","/* global $ */\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\nimport { app } from './../dk-ifshop-application'\r\n\r\n// getYearFromCpr\r\nexport const getCentury = (centuryDigit, yearDigit) => {\r\n if (centuryDigit >= 0 && centuryDigit <= 3) {\r\n // person was born in the 1900's\r\n return '19'\r\n } else if (centuryDigit == 4 || centuryDigit == 9) {\r\n // person was born 2000 - 2036\r\n if (yearDigit >= 0 && yearDigit <= 36) {\r\n return '20'\r\n } else {\r\n return '19'\r\n }\r\n } else if (centuryDigit >= 5 && centuryDigit <= 8) {\r\n // person was born either 2000 - 2057 or 1858 - 1899\r\n if (yearDigit >= 0 && yearDigit <= 57) {\r\n return '20'\r\n } else {\r\n return '18'\r\n }\r\n } else {\r\n return null\r\n }\r\n}\r\n\r\nexport const setupErrorLabel = (prefix) => { // remove individual error text fields for Cpr1+2 and apply a new one only linked to cpr1, but with full length\r\n if (prefix == PersonEntities.Kunde) {\r\n prefix = ''\r\n }\r\n $('.' + app.errorText + '[for=' + prefix + 'Cpr1]').remove()\r\n $('.' + app.errorText + '[for=' + prefix + 'Cpr2]').remove()\r\n $(\r\n ''\r\n ).appendTo('#' + prefix + 'CPRGroup')\r\n}\r\n\r\nexport const setUpCprKeyPressOrder = (person, $inputCpr1, $inputCpr2, inputCpr1, inputCpr2, keyPressStartedInCpr1) => {\r\n // track when cpr1 is full and pass focus to cpr2 and don't steal tab back from cpr2\r\n $inputCpr1.on('keydown', function (e) {\r\n keyPressStartedInCpr1 = true\r\n })\r\n\r\n $inputCpr1.on('keyup', function (e) {\r\n const moveFocus = keyPressStartedInCpr1 &&\r\n person.Cpr1.hasValidFormat() &&\r\n inputCpr2.value === ''\r\n\r\n if (moveFocus) {\r\n $inputCpr2.focus()\r\n }\r\n\r\n keyPressStartedInCpr1 = false\r\n })\r\n\r\n $inputCpr2.on('keyup', function (e) {\r\n keyPressStartedInCpr1 = false\r\n })\r\n}\r\n\r\n// Helpers\r\n// ===========================\r\nexport const getAgeFromBirthDate = function (birth, today) {\r\n let age\r\n if (birth) {\r\n if (!today) {\r\n today = new Date()\r\n }\r\n const nowyear = today.getFullYear()\r\n const nowmonth = today.getMonth()\r\n const nowday = today.getDate()\r\n\r\n const birthyear = birth.getFullYear()\r\n const birthmonth = birth.getMonth()\r\n const birthday = birth.getDate()\r\n\r\n age = nowyear - birthyear\r\n const ageMonth = nowmonth - birthmonth\r\n const ageDay = nowday - birthday\r\n\r\n if (ageMonth < 0 || (ageMonth === 0 && ageDay < 0)) {\r\n age = parseInt(age) - 1\r\n }\r\n }\r\n return age\r\n}\r\n\r\nexport const validDate = (cpr1) => {\r\n if (cpr1.length !== 6) {\r\n return false\r\n }\r\n\r\n const day = parseInt(cpr1.slice(0, 2))\r\n const month = parseInt(cpr1.slice(2, 4))\r\n\r\n if ((day >= 1 && day <= 31) && (month >= 1 && month <= 12)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport const canParseCprToDate = function (cpr) {\r\n if (cpr && cpr.length === 6 && containsNumbersOnly(cpr) && validDate(cpr)) {\r\n return getFullYearDateFromCpr(cpr)\r\n }\r\n return undefined\r\n}\r\n\r\nexport const canParseFullCprToDate = function (cpr) {\r\n if (cpr && cpr.length === 10 && containsNumbersOnly(cpr)) {\r\n return getFullYearDateFromCompleteCpr(cpr)\r\n }\r\n return undefined\r\n}\r\n\r\nexport const containsNumbersOnly = function (text) {\r\n const exp = /^\\d+$/\r\n const reg = new RegExp(exp)\r\n return reg.test(text)\r\n}\r\nconst insertFullYearOnCpr = function (century, cpr) {\r\n const position = 4\r\n return [cpr.slice(0, position), century, cpr.slice(position)].join('')\r\n}\r\n\r\nexport const getFullYearDateFromCompleteCpr = function (cpr) {\r\n if (cpr.length === 10) {\r\n const birthYear = cpr.substr(4, 2) // gets year two digits\r\n const centuryDigit = cpr.substr(6, 1)\r\n const century = getCentury(parseInt(centuryDigit), parseInt(birthYear))\r\n const cpr1 = cpr.substr(0, 6)\r\n return insertFullYearOnCpr(century, cpr1)\r\n }\r\n}\r\nconst getFullYearDateFromCpr = function (cpr) {\r\n const birthYearYy = cpr.substr(4, 2) // gets year two digits\r\n const currentYearYy = new Date()\r\n .getFullYear()\r\n .toString()\r\n .substr(2, 2)\r\n if (birthYearYy > currentYearYy) {\r\n return insertFullYearOnCpr('19', cpr)\r\n }\r\n return insertFullYearOnCpr('20', cpr)\r\n}\r\n","const webShopMessageStatus = {\r\n NoFail: 0, // success\r\n SystemFail: -1, // system not operational. Try again later\r\n OperationFail: -2, // operation failed. Unknown error. Try again\r\n EntryException: -3 // operation failed due to incorrect entry. Correct and continue\r\n}\r\n\r\nconst keyCodes = {\r\n BACKSPACE: 8,\r\n // COMMA: 188,\r\n DELETE: 46,\r\n DOWN: 40,\r\n // END: 35,\r\n ENTER: 13,\r\n // ESCAPE: 27,\r\n // HOME: 36,\r\n LEFT: 37,\r\n // PAGE_DOWN: 34,\r\n // PAGE_UP: 33,\r\n // PERIOD: 190,\r\n RIGHT: 39,\r\n SPACE: 32,\r\n TAB: 9,\r\n UP: 38\r\n}\r\n\r\nconst PersonEntities = {\r\n Medforsikret: 'Medforsikret',\r\n Kunde: 'kunde',\r\n AndenForsikrede: 'AndenForsikrede',\r\n ForsikredePerson: 'forsikrede',\r\n AndenBegunstigede: 'andenBegunstigede',\r\n AndenBegunstigedePerson: 'AndenBegunstigedePerson'\r\n}\r\n\r\nconst CaravanTextCodes = {\r\n BrandInvalid: 'CLIENT-CAMPINGVOGN_MAERKE_IKKE_VALID',\r\n CaravanNotFound: 'CLIENT-CAMPINGVOGN-KAN_IKKE_FINDE_MODEL',\r\n RegNr0: 'CLIENT-VEHICLE_REGNR_0',\r\n WeightToLow: 'CLIENT-CAMPINGVOGN_VAEGT_TO_LOW',\r\n WeightToHigh: 'CLIENT-CAMPINGVOGN_VAEGT_TO_HIGH',\r\n RegNrInvalid: 'CLIENT-CAMPINGVOGN_REGNR_IKKE_VALID',\r\n StelNrInvalid: 'CLIENT-CAMPINGVOGN_STELNR_IKKE_VALID',\r\n ButtonContinueNewPrice: 'CLIENT-BUTTON-FORTSAET_MED_NY_PRIS'\r\n}\r\nconst TrailerTextCodes = {\r\n BrandInvalid: 'CLIENT-TRAILER_MAERKE_IKKE_VALID',\r\n TrailerNotFound: 'CLIENT-TRAILER-KAN_IKKE_FINDE_MODEL',\r\n RegNr0: 'CLIENT-VEHICLE_REGNR_0',\r\n WeightToLow: 'CLIENT-TRAILER_VAEGT_TO_LOW',\r\n WeightToHigh: 'CLIENT-TRAILER_VAEGT_TO_HIGH',\r\n TradeValueToHigh: 'CLIENT-TRAILER_HANDELVAERDI_TO_HIGH',\r\n TradeValueToLow: 'CLIENT-TRAILER_HANDELVAERDI_TO_LOW',\r\n RegNrInvalid: 'CLIENT-TRAILER_REGNR_IKKE_VALID',\r\n StelNrInvalid: 'CLIENT-TRAILER_STELNR_IKKE_VALID',\r\n ButtonContinueNewPrice: 'CLIENT-BUTTON-FORTSAET_MED_NY_PRIS'\r\n}\r\nconst BoatTextCodes = {\r\n TradeValueToHigh: 'CLIENT-BOAT_TRADEVALUE_TO_HIGH',\r\n TradeValueToLow: 'CLIENT-BOAT_TRADEVALUE_TO_LOW',\r\n CombinedHorsepowerToHigh: 'CLIENT-BOAT_COMBINED_HORSEPOWER_TO_HIGH',\r\n CombinedHorsepowerToLow: 'CLIENT-BOAT_COMBINED_HORSEPOWER_TO_LOW',\r\n BoatTrailerRegNrInvalid: 'CLIENT-BOAT_TRAILER_REGNR_IKKE_VALID',\r\n BoatTrailerStelNrInvalid: 'CLIENT-BOAT_TRAILER_STELNR_IKKE_VALID'\r\n}\r\n\r\nexport { keyCodes, webShopMessageStatus, PersonEntities, CaravanTextCodes, TrailerTextCodes, BoatTextCodes }\r\n","/* global */\r\n\r\nimport { app } from './dk-ifshop-application'\r\nimport { h } from './dk-ifshop-helper'\r\n\r\nfunction ActionButton () {\r\n const self = this\r\n self.isChanging = false // execute has been called and the operation is still under way\r\n self.isPending = false\r\n self.isInvalidated = false\r\n\r\n self.customValidation = function (\r\n onSuccess,\r\n actionName,\r\n stepNo,\r\n customValidator\r\n ) {\r\n if (customValidator && customValidator.validate) {\r\n // validator is applied and it has the right method name\r\n customValidator.validate({\r\n actionName,\r\n stepNo,\r\n done: function () {\r\n onSuccess(self)\r\n },\r\n fail: function () {\r\n self.setIsChanging(false)\r\n }\r\n })\r\n } else {\r\n // no more validation, just execute the action\r\n onSuccess(self)\r\n }\r\n }\r\n\r\n self.setIsChanging = function (val) {\r\n self.isChanging = val\r\n }\r\n\r\n self.killPending = function () {\r\n self.isPending = false\r\n }\r\n\r\n self.execute = function (actionSettings) {\r\n // app.writeDebugInfo('>>> EXE TRY');\r\n if (self.isChanging) {\r\n return\r\n }\r\n if (self.isPending) {\r\n return\r\n }\r\n if (app.awaitsUserAction()) {\r\n // if a locking action is pending. cancel the change\r\n return\r\n }\r\n\r\n self.isInvalidated = false\r\n self.isPending = true\r\n // app.writeDebugInfo('>>> EXE GO');\r\n setTimeout(function () {\r\n // HACK: this timeout is only used to make sure that any change events for changed input controls are validated first (specifically bank info). It is a hack thoug\r\n try {\r\n // app.writeDebugInfo('>>> EXE TRY 2');\r\n\r\n if (\r\n self.isInvalidated ||\r\n self.isChanging ||\r\n !self.isPending ||\r\n app.awaitsUserAction()\r\n ) {\r\n // app.writeDebugInfo('>>> INVALIDATED!!!');\r\n return\r\n }\r\n\r\n self.setIsChanging(true)\r\n // app.writeDebugInfo('>>> EXE GO 2');\r\n\r\n // validate all entries\r\n if (actionSettings.validateForms === true) {\r\n h.validateForms({\r\n onSuccess: function () {\r\n self.customValidation(\r\n actionSettings.onSuccess,\r\n actionSettings.actionName,\r\n actionSettings.stepNo,\r\n actionSettings.customValidator\r\n )\r\n },\r\n onFail: function () {\r\n self.setIsChanging(false)\r\n if (actionSettings.onFail) {\r\n actionSettings.onFail(self)\r\n }\r\n }\r\n })\r\n } else {\r\n // no form validation\r\n self.customValidation(\r\n actionSettings.onSuccess,\r\n actionSettings.actionName,\r\n actionSettings.stepNo,\r\n actionSettings.customValidator\r\n )\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n h.tryFocusOnFirstError()\r\n } finally {\r\n self.isPending = false\r\n }\r\n }, actionSettings.waiting)\r\n }\r\n}\r\n\r\nconst singleActionButton = new ActionButton() // used across the application to ensure that one one actionButton can be executed at a time\r\n\r\nexport { ActionButton, singleActionButton }\r\n","/* global $ jQuery ko */\r\n\r\nimport { h } from './dk-ifshop-helper'\r\nimport { app } from './dk-ifshop-application'\r\nimport { keyCodes } from './dk-ifshop-constants'\r\nimport { isDateReadyforValidation } from './dk-ifshop-dates'\r\n\r\n// Enables build-in select, lazyload and text control\r\n// Features:\r\n// Can be dependent upon other controls - other dropdowns or text fields\r\n// expects a parent div that can be styled to customize down button ect.\r\n// disables if dependent, and dependent has no value\r\n// can display value not yet loaded in list of options\r\n// Events:\r\n// evaluate: send to all dependent controls and other listenera on change make them update or reset\r\n// reset: send to all dependent controls and other listenera on entry made invalid\r\n// Attributes:\r\n// data-dependency : the control on which value the dropdown is dependent\r\n// data-content-url : the url to call to receive options\r\nfunction MultiControl (jElement, model, dependencyModel, actionSettings) {\r\n const self = this\r\n if (!h.isSingleResult(jElement)) {\r\n return\r\n }\r\n\r\n // set control type\r\n self.isLL = actionSettings && actionSettings.lazyLoad === true // is LL (Lazy load)\r\n self.isSelect = $(jElement[0]).is('select') // is select\r\n self.isLLorSelect = self.isLL || self.isSelect // is LL or select\r\n self.isText = !self.isLLorSelect\r\n self.isStreetNameSearch = false\r\n self.previousValue = ''\r\n // is Text\r\n // control specific settings\r\n if (self.isLL) {\r\n // TODO: HACK because lazyload have been created with id on select control. should have been on input control\r\n const _prop = jElement.attr('data-property')\r\n jElement\r\n .parent()\r\n .append(\r\n ''\r\n )\r\n self.element = jElement.parent().children('.lazyLoad')[0]\r\n\r\n self.jDisplay = jElement\r\n self.optionType = 'li'\r\n self.jList = $(self.element)\r\n .parent()\r\n .children('.lazyLoadList')\r\n } else if (self.isSelect) {\r\n // BOTOX: if botox styling is used, a span is added above a select control with style ecmt-natural-text-fadeout. This should be removed\r\n $(self.element)\r\n .parent()\r\n .children('span.ecmt-natural-text-fadeout')\r\n .remove()\r\n\r\n self.element = jElement[0]\r\n self.jDisplay = $(self.element)\r\n .parent()\r\n .children('span')\r\n .first() // element displaying the select controls value\r\n self.optionType = 'option'\r\n self.jList = jElement\r\n } else {\r\n self.element = jElement[0]\r\n self.jDisplay = jElement\r\n }\r\n\r\n // elements\r\n self.jParent = $(self.element).parent() // the element containing the entire control and displays the border\r\n self.topElement = jElement[0] // the same as the element, except for LL\r\n self.element.ifws_control = self // make this control a property on the base element, so it is easier to reach from knockout binding handler\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].ifws_control = self\r\n } // make this control a property on the base element, so it is easier to reach from knockout binding handler\r\n self.dependencyId = undefined\r\n // find dependency\r\n self.dependencyId = $(self.topElement).attr('data-dependency')\r\n\r\n // settings\r\n self.disableOptionIfLessThan = $(self.topElement).attr('data-disable-state') || 0\r\n self.model = model // the model by which this control is to be bound to\r\n self.dependencyModel = dependencyModel // the model by which this control is dependent upon (E.g. Year-Make-model-motor)\r\n self.url = jElement.attr('data-content-url') // set url to load options from\r\n self.actionSettings = {} // {} ensures we dont get a ref. error if none is passed as arg\r\n if (actionSettings) {\r\n // custom actionSettings\r\n self.actionSettings = actionSettings\r\n }\r\n self.cache = actionSettings && actionSettings.cache\r\n\r\n if (actionSettings) {\r\n // find setting for autoSelect\r\n if (actionSettings.autoSelect) self.autoSelect = actionSettings.autoSelect\r\n else self.autoSelect = true // default\r\n\r\n self.disableAutoUpdate = actionSettings.disableAutoUpdate // whether changes in the model (after this setup) will effect the content of the control. (used for model details which are filled with data that is different once the car is found (E.g. CITROEN becomes Citroen and suddently can't be found in the list)\r\n self.pageLoadValidate = actionSettings.runValidationOnPageLoad\r\n }\r\n\r\n // state\r\n self.dependencyVal = '' // value of an element on which this control depends\r\n self.result = '' // full result form ajax call. more data might be retrieved then displayed. Related data can be stored here for ref.\r\n self.lazyLoadCriteria = null // the string entered when the last load was executed\r\n self.lastValue = undefined // flag used to compare what the value where on the last change event, to avoid repeating certain events\r\n self._selectedIndex = -1\r\n\r\n // flags\r\n self.isAutoSelected = false // set if an entry is selected as the only match in LL. Used to avoid updating the user interface, because people typing too slow will continue writing the fill text although the final text is already loaded resulting in e.g. 'Park allé' looking like 'Park allélle'. Apart from that, this functionlaity works ok\r\n self.validateEntry = false\r\n self.lastValidEntry = undefined\r\n self.isReady = false // flag set once makeReady is run and the control is empty or holds a valid value\r\n self.ignoreOnValidation = true // flag set to tell form validation to ignore the control (it might have no options (e.g. an address with no stories)\r\n self.ignoreFirstLine = false // if the first line in a select list expresses 'select something\" that line isn't valid as a choice when validating the selections\r\n self.isDisplayingOptions = false // whether dropdown is extended to display possible values (lazyload)\r\n self.isEntryValid = true // flag reset when user changes the entry on a lazyload control. Can be used for other aswell\r\n self.timeoutId = undefined // id used to identify last delayed update of a lazyload control. If the text changes meanwhile, the delay should restart (this happens by overwriting the id with a new timeout.)\r\n self.isDisabled = actionSettings && actionSettings.disabled === true\r\n\r\n self.evaluate = function (\r\n value,\r\n ODDCASE /* TODO: unresolved issue, but it works */,\r\n actionName\r\n ) {\r\n if (self.validateEntry &&\r\n self.lastValidatedValue != self.element.value &&\r\n self.actionSettings &&\r\n self.actionSettings.validation\r\n ) {\r\n // validate first\r\n self.validate(undefined, actionName) // trigger evaluate on success\r\n } else if (!value && !ODDCASE) {\r\n self.resetDependents()\r\n $(self.topElement).trigger('evaluate', value) // used if control already holds a value on startup\r\n } else if (!self.element.ifws_isInvalid) {\r\n $(self.topElement).trigger('evaluate', value) // used if control already holds a value on startup\r\n }\r\n }\r\n\r\n self.hideControl = function () {\r\n // remove class that is used by validator to validate it, though it is hidden\r\n if (self.isLL) {\r\n self.jDisplay.addClass('validateDisabled')\r\n } else {\r\n self.addClass('validateDisabled')\r\n }\r\n // hide\r\n self.jParent.hide('fade', 150)\r\n // also hide error msg and label which has a \"for\" attribute\r\n $('[for=\"' + self.topElement.id + '\"]').hide('fade', 100)\r\n }\r\n\r\n self.reset = function () {\r\n if (self.isReady !== false) {\r\n self.dependencyVal = ''\r\n if (self.isLLorSelect) {\r\n // this is a select control\r\n self.reset2()\r\n } else {\r\n // this is a text control\r\n $(self.element).change()\r\n self.value = ''\r\n if (self.dependencyId) {\r\n self.disable()\r\n }\r\n }\r\n // check if control should be hidden too\r\n if (self.actionSettings.hide === true) {\r\n self.hideControl()\r\n }\r\n }\r\n\r\n // stop any load\r\n if (self.loader) {\r\n self.loader.cancel = true\r\n }\r\n // even though this control might already be disabled (not ready) dependent controls (if any) should know about this event anyway\r\n self.resetDependents()\r\n\r\n if (self.isLLorSelect && self.element.disabled == false) {\r\n // disable it\r\n if (self.dependencyId) {\r\n self.disable()\r\n }\r\n\r\n self.jParent.removeClass(jQuery.validator.defaults.errorClass)\r\n if (self.jDisplay[0]) {\r\n // due to BOTOX\r\n if (self.isLL) {\r\n self.forceRetract()\r\n }\r\n }\r\n self.resetText()\r\n }\r\n }\r\n\r\n self.resetDependents = function () {\r\n $(self.topElement).trigger('reset')\r\n }\r\n\r\n self.disable = function () {\r\n self.element.setAttribute('disabled', 'disabled')\r\n self.jParent[0].setAttribute('disabled', 'disabled')\r\n if (self.jDisplay) {\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].setAttribute('disabled', 'disabled')\r\n }\r\n }\r\n if (self.isLLorSelect) {\r\n // && !self.isLL) {\r\n self.jParent.removeClass('enabledDropdown').addClass('disabledDropdown')\r\n }\r\n }\r\n\r\n self.enable = function () {\r\n if (self.isDisabled) {\r\n return // disabled as a setting, then it shouldn't be enabled, until this setting is changed.\r\n }\r\n self.jParent[0].removeAttribute('disabled')\r\n self.jParent.removeClass('is-disabled') // BOTOX. Doesn't happen automatically on Chrome\r\n self.element.removeAttribute('disabled')\r\n if (self.jDisplay) {\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].removeAttribute('disabled')\r\n }\r\n }\r\n if (self.isLLorSelect) {\r\n self.jParent.removeClass('disabledDropdown').addClass('enabledDropdown')\r\n }\r\n }\r\n\r\n self.reset2 = function () {\r\n $(self.element).empty()\r\n self.emptyList()\r\n\r\n self.jDisplay.text('') // added to ensure that getText doesn't return value about to be reset to the models property on change event.\r\n self.jDisplay.val('')\r\n\r\n self.value = ''\r\n self.lastValue = ''\r\n\r\n self.isReady = false\r\n self.updateDisplay(true)\r\n\r\n // self.change(); //<---TODO: FIX: Dropdown displays \"NULL\" when this event is triggered on redet. only shortly, hereafter it will gain its default value (bagrund label if still reset or \"Vælg\" if there is content)\r\n }\r\n\r\n self.resetText = function () {\r\n if (self.isLLorSelect) {\r\n if (self.jDisplay) {\r\n if ($(self.element).attr('placeholder')) {\r\n self.setText($(self.element).attr('placeholder'))\r\n } else {\r\n self.setText('')\r\n }\r\n }\r\n }\r\n }\r\n\r\n self.setText = function (value) {\r\n if (self.isLL) {\r\n // jDisplay is actually an input control\r\n self.jDisplay.val(value)\r\n } else {\r\n // jDisplay is a span\r\n self.jDisplay.text(value)\r\n }\r\n }\r\n\r\n self.getText = function () {\r\n if (self.isLL) {\r\n // jDisplay is actually an input control\r\n if (\r\n self.jDisplay[0].placeholder &&\r\n self.jDisplay[0].placeholder == self.jDisplay.val()\r\n ) {\r\n return ''\r\n } else {\r\n return self.jDisplay.val()\r\n }\r\n } else {\r\n // jDisplay is a span\r\n return self.jDisplay.text()\r\n }\r\n }\r\n\r\n self.getVal = function () {\r\n if (!self.isLLorSelect || self.actionSettings.usesKeyValuePairs) {\r\n if (self.isLL) {\r\n // TODO: not yet required to support key/value pair on LL list. but it might become relevant\r\n } else {\r\n return $(self.element).val()\r\n }\r\n } else if (self.isLLorSelect && self.jList.children().length > 0) {\r\n if (self.isLL) {\r\n const _index = self.selectedIndex() + 1\r\n return self.jList\r\n .children(self.optionType + ':nth-child(' + _index + ')')\r\n .text()\r\n } else {\r\n return $(self.element).val()\r\n }\r\n } else {\r\n return self.getText()\r\n }\r\n }\r\n\r\n self.updateDisplay = function (isReset) {\r\n // update the element that displays the selection\r\n let _result\r\n let _val\r\n\r\n if (self.jDisplay) {\r\n if (\r\n (self.element.ifws_control_preValue ||\r\n self.element.ifws_control_preValue === 0) &&\r\n !isReset\r\n ) {\r\n // a prevalue is specified\r\n if (!self.actionSettings.usesKeyValuePairs) {\r\n // the control doesn't use values so the text value can be used for displaying too\r\n _val = self.element.ifws_control_preValue\r\n $(self.element).val(_val)\r\n self.setText(_val)\r\n self.lastValue = _val\r\n self.element.ifws_control_preValue = ''\r\n // this should be in the start only, so dependent controls might be waiting for this control to be ready, therefore notify about the change based on preValue\r\n self.evaluate(_val, true) // changed from trigger('change') because it causes a second updateDisplay. I can't see why that is nessesary though?\r\n } else {\r\n // the control uses values, and options are required to display the selection\r\n if (self.isLL) {\r\n _result = self.jList.children(\r\n 'li[value=\"' + self.element.ifws_control_preValue + '\"]'\r\n )\r\n } else if (self.isSelect) {\r\n _result = self.jList.children(\r\n self.optionType +\r\n '[value=\"' +\r\n self.element.ifws_control_preValue +\r\n '\"]'\r\n )\r\n }\r\n\r\n if (\r\n self.isLLorSelect &&\r\n _result.length === 0 &&\r\n self.element.ifws_control_preValue == '0'\r\n ) {\r\n // prevalue now added. forget about it now\r\n self.element.ifws_control_preValue = ''\r\n _result = self.jList.children(\r\n self.optionType +\r\n '[value=\"' +\r\n self.element.ifws_control_preValue +\r\n '\"]'\r\n )\r\n }\r\n\r\n if (_result && _result.length > 0) {\r\n _val = self.element.ifws_control_preValue\r\n $(self.element).val(_val)\r\n self.jDisplay.text(_result[0].text)\r\n self.element.ifws_control_preValue = ''\r\n self.lastValue = _val\r\n }\r\n }\r\n } else if (self.isLLorSelect && self.jList.children().length > 0) {\r\n // options are loaded. find the right one and display the text\r\n const _index = self.selectedIndex() + 1\r\n _result = self.jList.children(\r\n self.optionType + ':nth-child(' + _index + ')'\r\n )\r\n if (_result && _result.length > 0) {\r\n self.setText(_result.text())\r\n }\r\n } else {\r\n self.resetText()\r\n }\r\n // only relevant if lazyload. if the field is updated though, the critera must be updated too. otherwise the list will be updated on the next e.g. arrow-left or right\r\n self.lazyLoadCriteria = self.jDisplay.val()\r\n\r\n self.updateBackgroundText()\r\n\r\n self.jParent.toggleClass('is-empty', self.element.value === '')\r\n }\r\n }\r\n\r\n self.updateDependencyValue = function () {\r\n let _checkDep = false\r\n if (self.dependencyId) {\r\n const _jDependency = $(self.dependencyId)\r\n if (h.isSingleResult(_jDependency)) {\r\n self.dependencyVal = _jDependency[0].ifws_control.getVal()\r\n _checkDep = true\r\n }\r\n } else if (self.dependencyModel) {\r\n _checkDep = true\r\n self.dependencyVal = self.dependencyModel()\r\n }\r\n\r\n // find out if the dependency has a value. otherwise disable this control\r\n if (_checkDep) {\r\n if (!self.dependencyVal) {\r\n // dependent has no value\r\n self.reset()\r\n const _form = self.element.form\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.unregisterPending(self.topElement.id)\r\n }\r\n }\r\n }\r\n }\r\n\r\n self.makeReady = function () {\r\n self.updateDependencyValue()\r\n\r\n if ($(self.element).attr('data-noPopupLabel')) {\r\n // Added automatically by botox\r\n $(self.element)\r\n .parent()\r\n .removeClass('has-label')\r\n }\r\n self.ignoreOnValidation = false\r\n self.enable()\r\n if (self.actionSettings.hide === true) {\r\n // remove class that is used by validator to validate it, though it is hidden\r\n if (self.isLL) {\r\n self.jDisplay.removeClass('validateDisabled')\r\n } else {\r\n $(self.element).removeClass('validateDisabled')\r\n }\r\n // show\r\n self.jParent.show('fade', 300)\r\n // also show error msg and label again\r\n $('[for=\"' + self.topElement.id + '\"]').each(function () {\r\n if (this.className.indexOf(app.errorText) > -1 && !$(this).text()) {\r\n // error message label, but it is empty. Dont display\r\n return\r\n }\r\n $(this).show('fade', 600)\r\n })\r\n }\r\n\r\n // trigger evaluate, so dependent controls can validate against this control\r\n self.isReady = true\r\n if (!self.isLLorSelect) {\r\n self.evaluate(self.getVal()) // used if control already holds a value on startup\r\n }\r\n self.updateDisplay()\r\n }\r\n\r\n self.update = function () {\r\n const _form = self.element.form\r\n if (_form && _form.pendingInputs) {\r\n // register that this control now might load data. In a pending state evaluation must wait.\r\n // In a situation where the control must load content before displaying right data og become ignorable,\r\n // a validation might render the control invalid, athought a second later it is actually ok.\r\n _form.pendingInputs.registerPending(self.topElement.id)\r\n }\r\n\r\n self.updateDependencyValue()\r\n\r\n // find content\r\n if (self.url) {\r\n let inputText = ''\r\n if (self.actionSettings.getCriteria) {\r\n inputText = self.actionSettings.getCriteria(self)\r\n if (self.actionSettings.getCriteria(self).length < 2) {\r\n self.onLoadDone(null)\r\n return\r\n }\r\n }\r\n\r\n let _data = ''\r\n // find id to search by\r\n if (!actionSettings || actionSettings.requestType !== 'get') {\r\n if (self.actionSettings.getCriteria) {\r\n _data = inputText\r\n } else {\r\n if (self.dependencyId || dependencyModel) {\r\n // if there is a dependency it will likely be part of a criteria (Search parameters)\r\n _data = '{\"id\" : \"' + self.dependencyVal + '\"}'\r\n }\r\n }\r\n }\r\n // remove all ')\r\n .text(self.selectorDefaultText)\r\n .val('')\r\n )\r\n self.ignoreFirstLine = true\r\n }\r\n }\r\n\r\n self.actionSettings.onLoad(self.element)\r\n }\r\n self.makeReady()\r\n\r\n if ($(self.element).find(self.optionType).length === 2 && self.element.attributes.getNamedItem('data-allow-two-options') === null) {\r\n // there is only one choise apart from none (makes 2), therefore, select the latter as only possibility\r\n $(self.element).val(\r\n self.jList.find(self.optionType + ':nth-child(2)').val()\r\n )\r\n $(self.element).trigger('change')\r\n }\r\n\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.unregisterPending(self.topElement.id)\r\n }\r\n self.setNotWorking()\r\n }\r\n }\r\n\r\n self.setWorking = function () {\r\n const _form = self.element.form\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.registerPending(self.topElement.id)\r\n }\r\n self.isWorking = true\r\n self.element.removeAttribute('disabled') // makes sure it is validated (and therefore tested for setting isWorking)\r\n }\r\n\r\n self.setNotWorking = function () {\r\n const _form = self.element.form\r\n self.isWorking = false\r\n if (self.isDisabled) {\r\n self.element.setAttribute('disabled', 'disabled')\r\n }\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.unregisterPending(self.topElement.id)\r\n }\r\n }\r\n\r\n self.emptyList = function () {\r\n self.jList.find(self.optionType).remove()\r\n self._selectedIndex = -1\r\n }\r\n\r\n // called when app.loadJson is done\r\n self.onLoadDone = function (data) {\r\n if (self.isLLorSelect) {\r\n self.result = data\r\n if (data && data.length > 0) {\r\n if (!self.isLL) {\r\n $(self.element).append(\r\n $('')\r\n .text(self.selectorDefaultText)\r\n .val('')\r\n )\r\n self.ignoreFirstLine = true\r\n }\r\n\r\n // build content\r\n if (self.actionSettings.onLoadDone) {\r\n self.actionSettings.onLoadDone(self.element, data)\r\n } else {\r\n // add list\r\n $.each(data, function (index, item) {\r\n let itemText = item\r\n if (item.forslagstekst) {\r\n // Data from dawa\r\n itemText = item.forslagstekst\r\n }\r\n if (itemText && itemText.trim && itemText.trim()) {\r\n if (self.isLL) {\r\n // add to ul\r\n let criteriaIndex = itemText\r\n .toLowerCase()\r\n .indexOf(self.lazyLoadCriteria.toLowerCase())\r\n criteriaIndex = criteriaIndex === -1 ? 0 : criteriaIndex\r\n self.jList.append(\r\n $(\r\n '
  • ' +\r\n itemText.substring(0, criteriaIndex) +\r\n '' +\r\n itemText.substring(\r\n criteriaIndex,\r\n criteriaIndex + self.lazyLoadCriteria.length\r\n ) +\r\n '' +\r\n itemText.substring(\r\n criteriaIndex + self.lazyLoadCriteria.length\r\n ) +\r\n '
  • '\r\n )\r\n )\r\n } else if (self.isSelect) {\r\n // add to options\r\n $(self.element).append(\r\n $('')\r\n .text(itemText)\r\n .val(itemText.replace('\"', '"'))\r\n )\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.element.ifws_control.ignoreOnValidation = false\r\n self.setNotWorking()\r\n if (self.isReady !== true) {\r\n self.makeReady()\r\n }\r\n\r\n self.isAutoSelected = false\r\n\r\n if (\r\n self.autoSelect === true &&\r\n self.isSelect &&\r\n $(self.element).find(self.optionType).length === 2\r\n ) {\r\n // there is only one choise apart from none (makes 2), therefore, select the latter as only possibility\r\n $(self.element).val(\r\n self.jList.find(self.optionType + ':nth-child(2)').val()\r\n )\r\n $(self.element).trigger('change') // TODO: this is NOT good enough. Use TryAutoSelect() but it must be extended with this situation (take 2nd)\r\n } else if (\r\n self.autoSelect === true &&\r\n self.isLL &&\r\n self.jList.find(self.optionType).length === 1\r\n ) {\r\n // there is only one choise, therefore, select the latter as only possibility\r\n self.forceExtend()\r\n self.tryAutoSelect()\r\n } else if (self.isLL) {\r\n if (self.getText().length > 0) {\r\n self.jParent.removeClass(jQuery.validator.defaults.errorClass)\r\n }\r\n self.forceExtend()\r\n self._selectedIndex = -1\r\n } else if (!self.isLL) {\r\n self.updateDisplay()\r\n }\r\n } else {\r\n self.emptyList()\r\n if (!self.isLL) {\r\n self.disable()\r\n }\r\n self.element.ifws_control.ignoreOnValidation = true\r\n\r\n if (self.isLL) {\r\n if (self.getText().length > 0) {\r\n self.jParent.addClass(jQuery.validator.defaults.errorClass)\r\n }\r\n self.forceRetract()\r\n }\r\n }\r\n\r\n if (self.disableOptionIfLessThan !== 0 && self.jList.find(self.optionType).length && self.jList.find(self.optionType).length > 0) {\r\n if (self.jList.find(self.optionType).length <= self.disableOptionIfLessThan) {\r\n self.jList.find(self.optionType)[0].disabled = true\r\n }\r\n }\r\n }\r\n if (self.actionSettings.afterOnLoadDone) {\r\n self.actionSettings.afterOnLoadDone(self.element)\r\n }\r\n }\r\n\r\n self.onChange = function (e) {\r\n if (self.lastValue !== self.getVal()) {\r\n self.lastValue = self.getVal()\r\n self.isEntryValid = true\r\n self.jParent.removeClass(jQuery.validator.defaults.errorClass)\r\n if (!self.isAutoSelected) {\r\n self.updateDisplay()\r\n }\r\n\r\n if (self.isStreetNameSearch) {\r\n // Streetname is selected, add a space to simplify input of streetnumber etc\r\n self.setText(self.getVal() + ' ')\r\n self.streetNameSelected = true\r\n }\r\n // enable dependent controls (should be before onSelect)\r\n if (\r\n !self.isStreetNameSearch &&\r\n self.element.ifws_control.isReady == true &&\r\n self.element.disabled == false\r\n ) {\r\n // notify any dependent controls\r\n\r\n if (\r\n self.actionSettings &&\r\n self.actionSettings.validateImmediately === true\r\n ) {\r\n self.validateEntry = true // will force an evaluation in evaluate method if the value has actually changed\r\n }\r\n\r\n self.evaluate(self.getVal())\r\n }\r\n // call custom action to make changes reflecting the change\r\n if (self.actionSettings.onSelect) {\r\n self.actionSettings.onSelect(self, e)\r\n }\r\n }\r\n }\r\n\r\n self.selectedIndex = function (index) {\r\n if (self.isLL) {\r\n if (index != undefined) {\r\n self._selectedIndex = index\r\n self.jList.find(self.optionType).removeClass('selected')\r\n const _index = index + 1\r\n self.jList\r\n .find(self.optionType + ':nth-child(' + _index + ')')\r\n .addClass('selected')\r\n // add value to select control (which is bound to the model)\r\n self.element.value = self.getVal()\r\n }\r\n return self._selectedIndex\r\n } else {\r\n if (index != undefined) {\r\n self.element.selectedIndex = index\r\n }\r\n return self.element.selectedIndex\r\n }\r\n }\r\n\r\n self.updateBackgroundText = function () {\r\n // the background field actually controls the width of the entire control. Only relevant for Natuaral Language input controls\r\n const _jBackgroundTextField = self.jParent.find('.ecmt-input-text')\r\n\r\n if (_jBackgroundTextField.length > 0) {\r\n // field is found\r\n if (!_jBackgroundTextField[0].style.minWidth) {\r\n // no min width. Set it to the current width. As the text content changes, it might become shorter, but we won't allow that\r\n _jBackgroundTextField[0].style.minWidth =\r\n _jBackgroundTextField[0].offsetWidth + 'px'\r\n }\r\n let _txt = self.getText()\r\n const _attr = self.jDisplay.attr('placeholder')\r\n if (!_txt) {\r\n _txt = _attr\r\n }\r\n _jBackgroundTextField.text(_txt)\r\n }\r\n }\r\n\r\n // Lazyload only (jDisplay keyup/down ...)\r\n if (self.isLL) {\r\n // reset visibility and make ready for forced displaying\r\n $(self.element).hide()\r\n\r\n self.validateLazyUpdate = function (lastKeyCode) {\r\n if (self.lazyLoadCriteria != self.getText()) {\r\n // only update if the criteria has changed\r\n self.lazyLoadUpdate(lastKeyCode)\r\n }\r\n }\r\n\r\n // Collapse dropdown box\r\n self.forceRetract = function () {\r\n if (self.isDisplayingOptions) {\r\n self.isDisplayingOptions = false\r\n self.jList.hide('blind', 0) // hide arguments has replaced empty () to avoid chrome (v. 35.0) error which leaves the list's shadow visible, when hiding the list after clicking a list element.\r\n self.jList.css('display', 'none')\r\n self.emptyList()\r\n }\r\n }\r\n\r\n // Expand dropdown box\r\n self.forceExtend = function () {\r\n if (self.jList.children().length > 10) {\r\n self.jList.addClass('scroll')\r\n } else {\r\n self.jList.removeClass('scroll')\r\n }\r\n if (!self.isDisplayingOptions) {\r\n self.isDisplayingOptions = true\r\n self.jList.show('blind', 300)\r\n self.jList.css('display', null)\r\n }\r\n }\r\n\r\n // setup listening to the text entry\r\n self.jDisplay.on('focus', function () {\r\n $(self.element).css('width', self.jParent[0].offsetWidth - 8 + 'px')\r\n })\r\n\r\n self.jDisplay.on('keydown', function (e) {\r\n if (!self.isDelayingUpdate) {\r\n if (e.keyCode === keyCodes.UP) {\r\n // up arrow - go up in list\r\n if (self.selectedIndex() > 0) {\r\n self.selectedIndex(self.selectedIndex() - 1)\r\n self.updateDisplay()\r\n }\r\n } else if (e.keyCode === keyCodes.DOWN) {\r\n // down arrow - go down in list\r\n if (self.selectedIndex() < self.jList.children().length - 1) {\r\n self.selectedIndex(self.selectedIndex() + 1)\r\n self.updateDisplay()\r\n\r\n if (!h.isIE) {\r\n // IE only\r\n const _index = self.selectedIndex() + 1\r\n const container = $(self.jList)\r\n const scrollTo = $(self.optionType + ':nth-child(' + _index + ')')\r\n\r\n container.scrollTop(\r\n scrollTo.offset().top -\r\n container.offset().top +\r\n container.scrollTop()\r\n )\r\n }\r\n }\r\n } else if (e.keyCode === keyCodes.TAB || e.keyCode === keyCodes.ENTER) {\r\n if (e.keyCode === keyCodes.ENTER) {\r\n e.preventDefault() // avoids autosubmit in IE, when there is only a single input control in the form\r\n }\r\n if (self.selectedIndex() >= 0) {\r\n $(self.element).trigger('change')\r\n\r\n // Streetname is selected, add a space to simplify input of streetnumber etc\r\n if (self.isStreetNameSearch) {\r\n e.preventDefault()\r\n }\r\n\r\n self.forceRetract() // after change, because the knockout binding will update the control with the content it just received, but only if it is found in the list.\r\n } else if (!self.isEntryValid) {\r\n self.tryAutoSelect(true)\r\n self.forceRetract() // after change, because the knockout binding will update the control with the content it just received, but only if it is found in the list.\r\n }\r\n } else {\r\n self.streetNameSelected = false\r\n }\r\n }\r\n })\r\n\r\n self.jDisplay.on('keyup', function (e) {\r\n if (self.lastValue !== self.jDisplay.val()) {\r\n if (\r\n e.keyCode !== keyCodes.ENTER &&\r\n e.keyCode !== keyCodes.TAB &&\r\n e.keyCode !== keyCodes.LEFT &&\r\n e.keyCode !== keyCodes.UP &&\r\n e.keyCode !== keyCodes.RIGHT &&\r\n e.keyCode !== keyCodes.DOWN &&\r\n e.keyCode !== 16 // shift\r\n ) {\r\n self.isEntryValid = false\r\n self.lastValue = ''\r\n }\r\n }\r\n self.validateLazyUpdate(e.keyCode)\r\n })\r\n\r\n self.jList.on('click', 'li', function (event) {\r\n self.selectedIndex($(this).index())\r\n self.updateDisplay()\r\n $(self.element).change()\r\n\r\n self.validateLazyUpdate()\r\n self.forceRetract() // after change, because the knockout binding will update the control with the content it just received, but only if it is found in the list.\r\n self.jDisplay.focus()\r\n })\r\n\r\n if (navigator.userAgent.match(/Firefox/i)) {\r\n self.jList.on('mousedown', self.optionType, function (e) {\r\n self.selectedIndex($(this).index())\r\n self.updateDisplay()\r\n $(self.element).change()\r\n self.forceRetract() // after change, because the knockout binding will update the control with the content it just received, but only if it is found in the list.\r\n self.jDisplay.focus()\r\n })\r\n }\r\n }\r\n\r\n // add focus styling. Must be coded as styling is applied to the parent control, yet the select control receives the focus\r\n if (self.isLLorSelect) {\r\n if (!self.isLL) {\r\n self.element.ifws_showSpinner = function () {\r\n let _jTarget = self.jParent.find('.dropdownButton')\r\n if (_jTarget.length > 0) {\r\n // create a div with a white background to hide the search icon in the right side of the entry\r\n const _div = $('
    ')\r\n _div.css({\r\n position: 'absolute'\r\n })\r\n _div.appendTo(_jTarget)\r\n $(_div).position({\r\n my: 'center',\r\n at: 'center',\r\n of: _jTarget\r\n })\r\n\r\n _jTarget = $(_div)\r\n\r\n // ...and add the spinner to the new div\r\n const img = $('')\r\n img.attr(\r\n 'src',\r\n app.shopHostUrl +\r\n 'styling/img/webshop/shopflow/mini-loader.gif'\r\n )\r\n img.appendTo(_jTarget)\r\n }\r\n }\r\n\r\n self.element.ifws_hideSpinner = function () {\r\n const _jTarget = self.jParent.find('.dropdownButton')\r\n if (_jTarget.length > 0) {\r\n _jTarget.children().remove()\r\n }\r\n }\r\n }\r\n\r\n self.tryAutoSelect = function (triggerChange) {\r\n // validate if we can auto select an entry\r\n if (self.jList.children().length === 1) {\r\n self.selectedIndex(0)\r\n self.isAutoSelected = true\r\n\r\n if (triggerChange) $(self.element).change()\r\n } else {\r\n const _val = self.getText()\r\n if (_val) {\r\n // compare using filter to make selection case insensitive\r\n const _result = self.jList.children('li[val]').filter(function () {\r\n return this.attributes[0].value.toLowerCase() === _val.toLowerCase()\r\n })\r\n if (_result.length > 0) {\r\n self.selectedIndex(_result.index())\r\n // self.updateDisplay();\r\n self.isAutoSelected = true\r\n $(self.element).change()\r\n }\r\n }\r\n }\r\n }\r\n\r\n $(self.element).on('focus', function () {\r\n self.jParent.addClass('textboxFocus')\r\n self.jParent.addClass('has-focus') // BOTOX\r\n })\r\n\r\n $(self.element).on('blur', function () {\r\n self.jParent.removeClass('textboxFocus')\r\n self.jParent.removeClass('has-focus') // BOTOX\r\n if (self.isLL) {\r\n self.forceRetract()\r\n }\r\n })\r\n\r\n self.jDisplay.on('focus', function () {\r\n $(self.element)\r\n .parent()\r\n .addClass('textboxFocus')\r\n $(self.element)\r\n .parent()\r\n .addClass('has-focus') // BOTOX\r\n })\r\n\r\n self.jDisplay.on('blur', function () {\r\n self.jDisplay.parent().removeClass('textboxFocus')\r\n self.jDisplay.parent().removeClass('has-focus') // BOTOX\r\n if (self.isLL) {\r\n if (self.jParent.find(':active').length === 0) {\r\n // focus is not passed outside control\r\n if (!self.isEntryValid) {\r\n self.tryAutoSelect()\r\n }\r\n // close off\r\n self.forceRetract()\r\n // update text with selection\r\n self.setText(self.lastValue)\r\n }\r\n }\r\n })\r\n\r\n $(self.element).on('focus', function () {\r\n if (self.isLL && !self.isDisplayingOptions) {\r\n // pass focus to the text entry if the select list isn't visible\r\n self.jDisplay.focus()\r\n if (self.getText() == self.selectorDefaultText) {\r\n self.setText('')\r\n }\r\n }\r\n })\r\n\r\n self.lazyLoadUpdate = function (lastKeyCode) {\r\n if (\r\n self.lazyLoadCriteria != self.getText() &&\r\n self.lastValue != self.getText()\r\n ) {\r\n // only update if the criteria has changed\r\n $(self.element).val('')\r\n self.resetDependents()\r\n\r\n let _timeout = 300\r\n if (lastKeyCode === keyCodes.BACKSPACE) {\r\n // if clicking delete, the user might remove a lot of character, but without holding down the key). to avoid this action is overruled by a unique match, which will update the entry with the very text the user is trying to remove, this kind of change (backspace) has a much slower respons.\r\n _timeout = 700\r\n }\r\n\r\n if (self.getText().length > 0) {\r\n if (\r\n !self.actionSettings.onEntryChange ||\r\n self.actionSettings.onEntryChange(self) === true\r\n ) {\r\n self.isDelayingUpdate = true\r\n if (self.timeoutId) {\r\n // kill existing timeout, so it wont trigger. this is like restarting it.\r\n window.clearTimeout(self.timeoutId)\r\n }\r\n self.timeoutId = setTimeout(function () {\r\n self.isDelayingUpdate = false\r\n // before mathing options are loaded, test the contetn of the criteria again, maybe it is invalid (changes while the update was delayed)\r\n if (self.getText().length > 0) {\r\n // get maching options\r\n self.update()\r\n }\r\n self.lazyLoadCriteria = self.getText()\r\n }, _timeout)\r\n }\r\n } else {\r\n if (self.loader) {\r\n self.loader.cancel = true\r\n }\r\n self.lazyLoadCriteria = ''\r\n self.forceRetract()\r\n self.emptyList()\r\n }\r\n self.updateBackgroundText()\r\n }\r\n }\r\n }\r\n\r\n if (self.isText) {\r\n $(self.element).on('focus', function () {\r\n self.jParent.addClass('has-focus') // BOTOX\r\n })\r\n\r\n $(self.element).on('blur', function () {\r\n self.jParent.removeClass('has-focus') // BOTOX\r\n })\r\n }\r\n\r\n if (self.isSelect) {\r\n if (navigator.userAgent.match(/Firefox/i)) {\r\n $(self.element).on('keyup', function () {\r\n $(self.element).trigger('change')\r\n })\r\n }\r\n }\r\n\r\n if (self.isLL || self.actionSettings.disableAutoBind === true) {\r\n $(self.element).on('change', self.onChange)\r\n }\r\n\r\n // specify the topmost 'select' text\r\n if (!self.selectorDefaultText) {\r\n const _code = $(self.element).attr('data-noseltxt')\r\n if (_code) {\r\n self.selectorDefaultText = _code\r\n }\r\n }\r\n if (!self.selectorDefaultText) {\r\n self.selectorDefaultText = 'Vælg'\r\n }\r\n\r\n // bind to model (Important: when no autobinding, enableSelect must be called AFTER ko.applyBindings)\r\n if (!self.actionSettings.disableAutoBind && self.model) {\r\n ko.applyBindingsToNode(self.element, null, self.model)\r\n }\r\n\r\n // bind to dependency\r\n const _jDependencyId = $(self.topElement).attr('data-dependency')\r\n if (_jDependencyId) {\r\n self.reset()\r\n\r\n // the control is linked to another control, get the instance of the dependency element\r\n const _jDependent = $(_jDependencyId) // the other multi element's topElement\r\n // listen to dependency events\r\n $(_jDependent[0]).on('evaluate', function (e, val) {\r\n if (self.dependencyVal === val) {\r\n // || (!self.dependencyVal && !val)) {\r\n // nothing has changed or the client is called twise due to buggy code\r\n return\r\n }\r\n // update when the depdendency is loaded. First reset it\r\n self.reset2()\r\n self.resetDependents()\r\n // ...then update it\r\n if (self.isLL) {\r\n self.setText('')\r\n self.forceRetract()\r\n self.makeReady()\r\n } else {\r\n self.setWorking()\r\n if (self.isWorking) {\r\n self.pendingWork = true\r\n self.pendingWorkTask = val\r\n setTimeout(function () {\r\n // TODO: refactor so timeout can be avoided. It is propably added to ensure that the knockout bounded models are updated first.\r\n if (self.pendingWorkTask == val) {\r\n self.setWorking()\r\n self.update()\r\n } else {\r\n // ignore this call\r\n }\r\n self.pendingWork = false\r\n }, 200)\r\n } else {\r\n self.update()\r\n }\r\n }\r\n })\r\n\r\n $(_jDependent).on('reset', function () {\r\n // update when the depdendency is loaded\r\n self.reset()\r\n })\r\n } else if (self.dependencyModel) {\r\n // the control is linked to a model property\r\n self.dependencyModel.subscribe(function () {\r\n // listen to the model's property\r\n if (self.dependencyVal === self.dependencyModel()) {\r\n // nothing has changed or the client is called twise due to buggy code\r\n return\r\n }\r\n let _Update = true\r\n if (self.actionSettings.onDependencyChange) {\r\n _Update = self.actionSettings.onDependencyChange(\r\n self,\r\n self.dependencyModel\r\n )\r\n }\r\n if (_Update) {\r\n // update when the depdendency is loaded\r\n self.resetDependents()\r\n self.update()\r\n } else {\r\n self.reset()\r\n }\r\n })\r\n self.update()\r\n } else {\r\n // update now, on initialization too.\r\n if (self.isLLorSelect) {\r\n self.disable()\r\n }\r\n if (self.isLL) {\r\n self.makeReady()\r\n } else {\r\n self.update()\r\n }\r\n }\r\n\r\n $(self.element).on('paste', function (e) {\r\n self.validateEntry = true\r\n\r\n if (\r\n self.validateEntry === true &&\r\n self.lastValidatedValue != self.element.value\r\n ) {\r\n self.element.ifws_isInvalid = false\r\n if (\r\n self.actionSettings &&\r\n self.actionSettings.validateImmediately === true\r\n ) {\r\n self.evaluate(self.getVal(), 'paste')\r\n }\r\n }\r\n })\r\n\r\n $(self.element).on('keyup', function (e) {\r\n self.validateEntry = e.which !== 0 || e.charCode !== 0\r\n\r\n if (self.lastValidatedValue != self.element.value) {\r\n self.element.ifws_isInvalid = false\r\n if (self.actionSettings && self.actionSettings.validateImmediately === true) {\r\n self.evaluate(self.getVal(), undefined, 'keyup')\r\n }\r\n }\r\n })\r\n\r\n if (self.actionSettings && self.actionSettings.validateOnBlur === true) {\r\n $(self.element).on('blur', function (e) {\r\n if (self.validateEntry === true && self.lastValidatedValue != self.element.value) {\r\n self.evaluate(self.getVal(), undefined, 'blur')\r\n }\r\n })\r\n }\r\n\r\n self.validationActionSettings = {\r\n onValid: function () {\r\n // client code accepts entry\r\n\r\n // app.writeDebugInfo('>>> VALID result: ' + result + ' (' + self.topElement.id + ')');\r\n\r\n // remove red paint\r\n self.element.ifws_isInvalid = false\r\n $(self.element).trigger('evaluate', self.getVal())\r\n h.validateElement(self.element, 'ifws_isInvalid')\r\n\r\n self.setNotWorking()\r\n self.isValidating = false\r\n\r\n if (self.actionSettings && self.actionSettings.onInvalid) {\r\n self.actionSettings.onValid()\r\n }\r\n self.lastValidatedValue = self.jDisplay.val()\r\n },\r\n onInvalid: function () {\r\n // client code rejects entry\r\n\r\n // paint red\r\n self.resetDependents()\r\n self.element.ifws_isInvalid = true\r\n\r\n h.updateElementValidation(\r\n self.element,\r\n 'ifws_isInvalid',\r\n undefined,\r\n false /* forces error result */\r\n )\r\n // h.validateElement(self.element, 'ifws_isInvalid');\r\n\r\n self.setNotWorking()\r\n self.isValidating = false\r\n\r\n if (self.actionSettings && self.actionSettings.onInvalid) {\r\n self.actionSettings.onInvalid()\r\n }\r\n self.lastValidatedValue = self.jDisplay.val()\r\n }\r\n }\r\n\r\n self.validate = function (value, actionName) {\r\n if (self.actionSettings && self.actionSettings.validation) {\r\n self.isValidating = true\r\n // app.writeDebugInfo('>>> SW VAL ' + self.topElement.id);\r\n\r\n self.setWorking()\r\n\r\n const result = self.actionSettings.validation(self, self.validationActionSettings, actionName)\r\n if (result === true || result === false) {\r\n // this is only true if the validation is not async and the result is returned by the custom validator. Otherwise (if async) the result will not be ready until later\r\n self.element.ifws_isInvalid = !result\r\n self.setNotWorking() // when an actual result is returned, we expect this work to be done\r\n self.isValidating = false\r\n self.lastValidatedValue = self.jDisplay.val()\r\n }\r\n return result\r\n }\r\n }\r\n\r\n self.element.ifws_customCheck = function (element, action) {\r\n if (\r\n self.actionSettings &&\r\n self.actionSettings.ignoreValidationOnKeyUp &&\r\n action === 'onkeyup'\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (self.actionSettings && self.actionSettings.validation) {\r\n self.element.ifws_customValidation = function (value) {\r\n if (self.validateEntry && self.lastValidatedValue != self.element.value) {\r\n self.validateEntry = false\r\n const result = self.validate(value)\r\n if (result === true || result === false) {\r\n // the custom method actuelly returned a specific true/false result. pass it as a result\r\n return result\r\n }\r\n }\r\n // Nothing special happened, just return the current state\r\n return !self.element.ifws_isInvalid\r\n }\r\n }\r\n\r\n self.lastValidatedValue = self.element.value\r\n $(document).ready(function () {\r\n if (self.pageLoadValidate && self.element.value) {\r\n self.validateEntry = true\r\n self.element.ifws_isInvalid = false\r\n self.validate(undefined, 'pageload')\r\n }\r\n })\r\n}\r\n\r\nfunction enableMultiControl (jElement, model, dependencyModel, actionSettings) {\r\n return new MultiControl(jElement, model, dependencyModel, actionSettings)\r\n}\r\n\r\nfunction enableSelect (jElement, model, dependencyModel, actionSettings) {\r\n return enableMultiControl(jElement, model, dependencyModel, actionSettings)\r\n}\r\n\r\nfunction enableTextInput (jElement, model, dependencyModel, actionSettings) {\r\n return enableMultiControl(jElement, model, dependencyModel, actionSettings)\r\n}\r\n\r\n// multi control custom validation (Required)\r\njQuery.validator.addMethod('ifws_selected', function (value, element) {\r\n if (element.ifws_control.isWorking || element.ifws_control.pendingWork) {\r\n return false\r\n }\r\n // if e.g. lazyload control is changed without any match is found\r\n if (!element.ifws_control || element.ifws_control.isEntryValid === false) {\r\n return false\r\n }\r\n // first line just expresses \"select\". if it is selected, the control still isn't ready\r\n if (\r\n element.ifws_control.ignoreFirstLine === true &&\r\n element.selectedIndex === 0\r\n ) {\r\n return false\r\n }\r\n if (element.ifws_control.ignoreOnValidation === true) {\r\n // Ignore that it is empty (e.g. floor for an address with no floors)\r\n return true\r\n } else {\r\n if (element.ifws_control.getVal()) {\r\n // Has value - valid\r\n return true\r\n } else {\r\n // no value - invalid\r\n return false\r\n }\r\n }\r\n})\r\n\r\n// multi control Knockout binding handler\r\nko.bindingHandlers.selection_value = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindingsAccessor,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n ko.utils.registerEventHandler(element, 'change', function (event) {\r\n // write selection to model's property\r\n if (element.ifws_control.isReady) {\r\n valueAccessor()(element.ifws_control.getVal())\r\n element.ifws_control.onChange(event)\r\n }\r\n })\r\n },\r\n update: function (element, valueAccessor, allBindingsAccessor) {\r\n // update selection control with property change\r\n const value = valueAccessor()\r\n if (element.value !== value()) {\r\n element.value = value()\r\n element.ifws_control_preValue = value()\r\n if (\r\n element.ifws_control &&\r\n !element.ifws_control.isLL &&\r\n element.ifws_control.isReady === true &&\r\n element.ifws_control.disableAutoUpdate !== true\r\n ) {\r\n element.ifws_control.updateDisplay()\r\n }\r\n }\r\n }\r\n}\r\n\r\n// date text entry filed knockout binder\r\nko.bindingHandlers.date_value = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n const observable = valueAccessor()\r\n\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n const _date = $.parseDate(element.currentTarget.value, null, app.culture)\r\n if (_date) {\r\n if (element.currentTarget.value.length >= 8) {\r\n observable($.format(_date, 'dd/MM/yyyy', app.culture))\r\n }\r\n }\r\n if (!element.currentTarget.ifws_control) {\r\n $(element.currentTarget).trigger('evaluate')\r\n }\r\n })\r\n\r\n ko.utils.registerEventHandler(element, 'keyup', function (element) {\r\n if (\r\n element.currentTarget.ifws_control &&\r\n element.currentTarget.ifws_control.actionSettings &&\r\n element.currentTarget.ifws_control.actionSettings\r\n .validateImmediately === true\r\n ) {\r\n // updates model as soon as the data has changed if the control is setup to validate immediately\r\n const _date = $.parseDate(element.currentTarget.value, null, app.culture)\r\n if (_date) {\r\n const value = element.currentTarget.value\r\n if (isDateReadyforValidation(value)) {\r\n observable($.format(_date, 'dd/MM/yyyy', app.culture))\r\n $(element.currentTarget).trigger('evaluate')\r\n }\r\n }\r\n }\r\n })\r\n },\r\n update: function (element, valueAccessor, allBindingsAccessor) {\r\n // update selection control with property change\r\n let value = valueAccessor()()\r\n\r\n if (value && value.getDate) {\r\n // propably a Date object\r\n value = $.format(value, 'dd/MM/yyyy', app.culture)\r\n }\r\n\r\n if (element.value !== value) {\r\n $(element).val(value)\r\n if (element.ifws_control) {\r\n element.ifws_control_preValue = value\r\n if (\r\n element.ifws_control &&\r\n element.ifws_control.isReady === true &&\r\n element.ifws_control.disableAutoUpdate !== true\r\n ) {\r\n element.ifws_control.updateDisplay()\r\n element.ifws_control.lastValidatedValue = value\r\n element.ifws_control.lastValue = value\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// text entry filed knockout binder\r\nko.bindingHandlers.text_value = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n const observable = valueAccessor()\r\n\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n observable(element.currentTarget.value)\r\n if (!element.currentTarget.ifws_control) {\r\n $(element.currentTarget).trigger('evaluate')\r\n }\r\n })\r\n\r\n ko.utils.registerEventHandler(element, 'keyup', function (element) {\r\n if (\r\n element.currentTarget.ifws_control &&\r\n element.currentTarget.ifws_control.actionSettings &&\r\n element.currentTarget.ifws_control.actionSettings\r\n .validateImmediately === true\r\n ) {\r\n // updates model as soon as the data has changed if the control is setup to validate immediately\r\n observable(element.currentTarget.value)\r\n $(element.currentTarget).trigger(\r\n 'evaluate',\r\n element.currentTarget.value\r\n )\r\n }\r\n })\r\n },\r\n update: function (element, valueAccessor, allBindingsAccessor) {\r\n // update selection control with property change\r\n const value = valueAccessor()()\r\n\r\n if (\r\n element.id === 'RegNr' &&\r\n element.value &&\r\n value &&\r\n element.value.toLowerCase() == value.toLowerCase()\r\n ) {\r\n element.value = value\r\n }\r\n\r\n if (element.value !== value) {\r\n $(element).val(value)\r\n if (element.ifws_control) {\r\n element.ifws_control_preValue = value\r\n if (\r\n element.ifws_control &&\r\n element.ifws_control.isReady === true &&\r\n element.ifws_control.disableAutoUpdate !== true\r\n ) {\r\n element.ifws_control.updateDisplay()\r\n element.ifws_control.lastValidatedValue = value\r\n element.ifws_control.lastValue = value\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { MultiControl, enableMultiControl, enableSelect, enableTextInput }\r\n","/* global $ ko */\r\n\r\nimport { h } from './dk-ifshop-helper'\r\nimport { keyCodes } from './dk-ifshop-constants'\r\n\r\n// avoid that any hyperlinks in checkboxes un/check the checkbox when clicked\r\n$(document).on('click', '.css-checkbox-label a', function (e) {\r\n e.stopPropagation()\r\n})\r\n$(document).on('click', '.css-checkbox-label2 a', function (e) {\r\n e.stopPropagation()\r\n})\r\n\r\n// used to pass click event based on data-id (checkboxes a.o.)\r\nif (\r\n !navigator.userAgent.match(/iPhone/i) &&\r\n !navigator.userAgent.match(/iPod/i) &&\r\n !navigator.userAgent.match(/iPad/i) &&\r\n (!navigator.userAgent.match(/safari/i) ||\r\n navigator.userAgent.match(\r\n /chrome/i\r\n )) /* the word safari can be part of chrome agent name */\r\n) {\r\n $(document).on('click', '[for]', function () {\r\n const _jElm = $(this)\r\n let _temp = h.getElm(_jElm.attr('for'))\r\n if (!_temp) {\r\n _temp = h.getJElmByDataId(_jElm.attr('for'))\r\n if (_temp[0]) {\r\n if (_temp.prop('checked')) {\r\n // only possible for a checkbox\r\n if (!_temp.is('[type=radio]')) {\r\n _temp.prop('checked', false).trigger('change')\r\n }\r\n } else {\r\n _temp.prop('checked', true).trigger('change')\r\n }\r\n // call validator explicit because there is no click event in this action\r\n if (_temp[0].form && _temp[0].form.validator) {\r\n // if (_temp[0] in _temp[0].form.validator.submitted) { //commented out because it apparently never is set (only expected on bekræft side)\r\n _temp[0].form.validator.element(_temp[0])\r\n // }\r\n }\r\n }\r\n }\r\n })\r\n}\r\n\r\n// used to pass click event from div\r\n$(document).on('click', '.dws-radioBox', function () {\r\n const _jElm = $(this)\r\n const _temp = _jElm.find('input')\r\n if (_temp[0]) {\r\n if (!_temp.prop('checked')) {\r\n _temp.prop('checked', true).trigger('change')\r\n }\r\n }\r\n return true\r\n})\r\n\r\n// act on space keyboard event. I don't know why this doesn't happen automatically\r\n$(document).on('keydown', '.css-radio', function (e) {\r\n if (e.keyCode === keyCodes.SPACE) {\r\n const _jElm = $(this)\r\n if (!_jElm.prop('checked')) {\r\n _jElm.prop('checked', true).trigger('change')\r\n }\r\n return false\r\n }\r\n})\r\n\r\n// knockout binding: yes/no radiobutton control Knockout binding handler\r\nko.bindingHandlers.boolRadio = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n if ($(element).is(':radio')) {\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n // write click change to model's proerty\r\n const observable = valueAccessor()\r\n if (element.currentTarget.value === 'true') {\r\n observable(true)\r\n } else if (element.currentTarget.value === 'false') {\r\n observable(false)\r\n } else {\r\n observable(element.currentTarget.value)\r\n }\r\n })\r\n }\r\n\r\n function updateElement (element, newValue) {\r\n if ($(element).is(':radio')) {\r\n // update radiobuttons to reflect model value change\r\n if (\r\n newValue === element.value ||\r\n (newValue === true && String(newValue) === element.value)\r\n ) {\r\n // native true value\r\n $(element).prop('checked', true)\r\n element.checked = true\r\n } else if (\r\n newValue === element.value ||\r\n (newValue === false && String(newValue) === element.value)\r\n ) {\r\n // native true value\r\n $(element).prop('checked', true)\r\n element.checked = true\r\n } else if (\r\n (newValue === true ||\r\n (typeof newValue === 'string' &&\r\n newValue.toLowerCase() === 'true') ||\r\n newValue == '1') &&\r\n (element.value == '1' ||\r\n (typeof element.value === 'string' &&\r\n element.value.toLowerCase() === 'true'))\r\n ) {\r\n // true text\r\n $(element).prop('checked', true)\r\n element.checked = true\r\n } else if (\r\n (newValue === false ||\r\n (typeof newValue === 'string' &&\r\n newValue.toLowerCase() === 'false') ||\r\n newValue == '0') &&\r\n (element.value == '0' ||\r\n (typeof element.value === 'string' &&\r\n element.value.toLowerCase() === 'false'))\r\n ) {\r\n // false text\r\n $(element).prop('checked', true)\r\n element.checked = true\r\n } else if (newValue == element.value) {\r\n // Match other then true/false\r\n $(element).prop('checked', true)\r\n element.checked = true\r\n } else {\r\n // No match\r\n $(element).prop('checked', false)\r\n element.checked = false\r\n }\r\n updateRadio(element)\r\n } else {\r\n if (\r\n newValue === true ||\r\n (typeof newValue === 'string' && newValue.toLowerCase() === 'true') ||\r\n newValue == '1'\r\n ) {\r\n $(element).text('Ja')\r\n } else if (\r\n newValue === false ||\r\n (typeof newValue === 'string' &&\r\n newValue.toLowerCase() === 'false') ||\r\n newValue == '0'\r\n ) {\r\n $(element).text('Nej')\r\n } else {\r\n $(element).text('-')\r\n }\r\n }\r\n }\r\n\r\n // make initial update\r\n updateElement(element, valueAccessor()())\r\n\r\n valueAccessor().subscribe(function (newValue) {\r\n // listen to property's value change\r\n const self = this\r\n self.Element = element\r\n updateElement(self.Element, newValue)\r\n $(element).trigger('evaluate')\r\n })\r\n }\r\n}\r\n\r\nko.bindingHandlers.multiRadio = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n if ($(element).is(':radio')) {\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n const observable = valueAccessor()\r\n observable(element.currentTarget.value)\r\n })\r\n const value = ko.unwrap(valueAccessor())\r\n if (element.value === value) {\r\n element.checked = true\r\n } else {\r\n element.checked = false\r\n }\r\n updateRadio(element)\r\n }\r\n },\r\n update: function (element, valueAccessor, allBindings) {\r\n const value = valueAccessor()\r\n const valueUnwrapped = ko.unwrap(value)\r\n if (element.value == valueUnwrapped) {\r\n element.checked = true\r\n } else {\r\n element.checked = false\r\n }\r\n $(element).trigger('evaluate')\r\n updateRadio(element)\r\n }\r\n}\r\n\r\n// knockout binding: checkbox that passes either true or false to model and updates the checkbox graphics\r\nko.bindingHandlers.boolCheckboxSimple = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n if ($(element).is(':checkbox')) {\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n // write click change to model's proerty\r\n const observable = valueAccessor()\r\n if ($(element.currentTarget).prop('checked')) {\r\n observable(true)\r\n } else {\r\n observable(false)\r\n }\r\n })\r\n }\r\n\r\n function updateElement (element, newValue) {\r\n if ($(element).is(':checkbox')) {\r\n // update radiobuttons to reflect model value change\r\n if (\r\n newValue === element.value || (newValue && String(newValue) === element.value)\r\n ) {\r\n $(element).prop('checked', true)\r\n } else if (newValue === true || (typeof newValue === 'string' && newValue.toLowerCase() === 'true') ||\r\n newValue == '1'\r\n ) {\r\n $(element).prop('checked', true)\r\n } else if (newValue === false || (typeof newValue === 'string' && newValue.toLowerCase() === 'false') ||\r\n newValue == '0'\r\n ) {\r\n $(element).prop('checked', false)\r\n }\r\n }\r\n }\r\n\r\n // make initial update\r\n updateElement(element, valueAccessor()())\r\n\r\n valueAccessor().subscribe(function (newValue) {\r\n // listen to property's value change\r\n const self = this\r\n self.Element = element\r\n updateElement(self.Element, newValue)\r\n $(element).trigger('evaluate')\r\n })\r\n }\r\n}\r\n\r\n// knockout binding: checkbox that passes either true or false to model and updates the checkbox graphics\r\nko.bindingHandlers.boolCheckbox = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n if ($(element).is(':checkbox')) {\r\n ko.utils.registerEventHandler(element, 'change', function (element) {\r\n // write click change to model's proerty\r\n\r\n const observable = valueAccessor()\r\n if ($(element.currentTarget).prop('checked')) {\r\n observable(true)\r\n } else {\r\n observable(false)\r\n }\r\n })\r\n }\r\n\r\n function updateElement (element, newValue) {\r\n if ($(element).is(':checkbox')) {\r\n // update radiobuttons to reflect model value change\r\n if (\r\n newValue === element.value ||\r\n (newValue && String(newValue) === element.value)\r\n ) {\r\n $(element).prop('checked', true)\r\n } else if (\r\n newValue === true ||\r\n (typeof newValue === 'string' && newValue.toLowerCase() === 'true') ||\r\n newValue == '1'\r\n ) {\r\n $(element).prop('checked', true)\r\n } else if (\r\n newValue === false ||\r\n (typeof newValue === 'string' &&\r\n newValue.toLowerCase() === 'false') ||\r\n newValue == '0'\r\n ) {\r\n $(element).prop('checked', false)\r\n }\r\n updateCheckbox(element)\r\n }\r\n }\r\n\r\n // make initial update\r\n updateElement(element, valueAccessor()())\r\n\r\n valueAccessor().subscribe(function (newValue) {\r\n // listen to property's value change\r\n const self = this\r\n self.Element = element\r\n updateElement(self.Element, newValue)\r\n $(element).trigger('evaluate')\r\n })\r\n }\r\n}\r\n\r\n// function updateRadioGroup(element) {\r\n// if ($(element).prop('checked')) {\r\n// $(element).addClass('css-radiochecked').removeClass('css-radio');\r\n// $(element).parent().addClass('dws-radioBoxChecked');\r\n// }\r\n// else {\r\n// $(element).addClass('css-radio').removeClass('css-radiochecked');\r\n// $(element).parent().removeClass('dws-radioBoxChecked');\r\n// }\r\n// }\r\n\r\nfunction updateRadio (element) {\r\n if ($(element).prop('checked')) {\r\n // if (element.checked) {\r\n $(element)\r\n .addClass('css-radiochecked')\r\n .removeClass('css-radio')\r\n $(element)\r\n .parent()\r\n .addClass('dws-radioBoxChecked')\r\n } else {\r\n $(element)\r\n .addClass('css-radio')\r\n .removeClass('css-radiochecked')\r\n $(element)\r\n .parent()\r\n .removeClass('dws-radioBoxChecked')\r\n }\r\n}\r\n\r\nfunction updateCheckbox (element) {\r\n if ($(element).prop('checked')) {\r\n $(element)\r\n .addClass('css-checkboxchecked')\r\n .removeClass('css-checkbox')\r\n } else {\r\n $(element)\r\n .addClass('css-checkbox')\r\n .removeClass('css-checkboxchecked')\r\n }\r\n}\r\n\r\nfunction updateUnboundRadioAndCheckboxes (jElement) {\r\n if (jElement) {\r\n jElement.find('input[type=checkbox]').each(function () {\r\n $(this).on('change', function () {\r\n $(this).trigger('evaluate')\r\n })\r\n })\r\n\r\n jElement.find('input[type=checkbox]').on('change', function () {\r\n // on('change', ... doesn't work here. Checked flag is not set in IE11 until later)\r\n updateCheckbox(this)\r\n return true\r\n })\r\n\r\n jElement.find('input[type=radio]').each(function () {\r\n $(this).on('change', function () {\r\n $(this).trigger('evaluate')\r\n })\r\n })\r\n\r\n jElement.find('input[type=radio]').on('change', function () {\r\n // on('change', ... doesn't work here. Checked flag is not set in IE11 until later)\r\n $('[name=' + this.name + ']').each(function () {\r\n updateRadio(this)\r\n })\r\n // updateRadioGroup(this);\r\n // updateRadio(this);\r\n return true\r\n })\r\n }\r\n}\r\n\r\nfunction updateUnboundRadioValue (jElement, name, value) {\r\n jElement.find('input[name=' + name + ']').each(function () {\r\n h.setCheck(compareRadioValues(this.value, value), this)\r\n updateRadio(this)\r\n })\r\n}\r\n\r\nfunction compareRadioValues (left, right) {\r\n if (\r\n left === right ||\r\n (left && String(left) === right) ||\r\n (right && String(right) === left)\r\n ) {\r\n return true\r\n } else if (\r\n (left === true || left == '1') &&\r\n (typeof right === 'string' && right.toLowerCase() === 'true')\r\n ) {\r\n return true\r\n } else if (\r\n (left === false || left == '0') &&\r\n (typeof right === 'string' && right.toLowerCase() === 'false')\r\n ) {\r\n return true\r\n } else if (\r\n (right === true || right == '1') &&\r\n (typeof left === 'string' && left.toLowerCase() === 'true')\r\n ) {\r\n return true\r\n } else if (\r\n (right === false || right == '0') &&\r\n (typeof left === 'string' && left.toLowerCase() === 'false')\r\n ) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport {\r\n compareRadioValues,\r\n updateCheckbox,\r\n updateRadio,\r\n updateUnboundRadioAndCheckboxes,\r\n updateUnboundRadioValue\r\n}\r\n","/* global $ ko */\r\nimport { h } from './dk-ifshop-helper'\r\n\r\nfunction enableSlider (jElement, settings) {\r\n if (!h.isSingleResult(jElement)) {\r\n return\r\n }\r\n\r\n function Slider () {\r\n const self = this\r\n self.settings = settings\r\n self.jResult = $(jElement[0].parentElement).find('.SliderCount')\r\n jElement[0].values = settings.values // TODO: apply all settings to a unique property like ifws_slider.values/steps/... (suffix: ifws_)\r\n jElement[0].steps = settings.steps\r\n jElement[0].convert = settings.convert\r\n jElement[0].revert = settings.revert\r\n self.defaultStep = settings.defaultStep\r\n jElement[0].ifslider = self\r\n\r\n if (settings.values) {\r\n // if the real values are applied, it is possibe to make the convert/revert easy by default methods\r\n if (!jElement[0].convert) {\r\n jElement[0].convert = function (slider, value) {\r\n // converts from slider step to property value\r\n return slider.values[value]\r\n }\r\n }\r\n if (!jElement[0].revert) {\r\n jElement[0].revert = function (slider, value) {\r\n // converts from property value to slider step text\r\n return slider.values.indexOf(value)\r\n }\r\n }\r\n }\r\n\r\n self.init = function (jElement) {\r\n if (settings.steps) {\r\n jElement.slider({\r\n min: 0,\r\n range: 'min',\r\n max: settings.steps.length - 1,\r\n value: self.defaultStep,\r\n slide: function (event, ui) {}\r\n })\r\n self.UpdateResult(jElement[0].steps[self.defaultStep])\r\n } else {\r\n jElement.slider({\r\n min: 0,\r\n max: 0,\r\n value: 0,\r\n disabled: true,\r\n slide: function (event, ui) {\r\n self.UpdateResult(jElement[0].steps[ui.value])\r\n }\r\n })\r\n }\r\n }\r\n\r\n self.UpdateResult = function (value) {\r\n self.jResult.html(self.settings.format(value))\r\n }\r\n self.init(jElement)\r\n }\r\n\r\n return new Slider()\r\n}\r\n\r\n// slider control Knockout binding handler\r\nko.bindingHandlers.slider = {\r\n init: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n ko.utils.registerEventHandler(element, 'slide', function (element, arg) {\r\n // update model's property with slide change\r\n const _observable = valueAccessor()\r\n let _val\r\n if (element.currentTarget.convert) {\r\n // use custom convertion function to interprete slide position into valid value\r\n _val = element.currentTarget.convert(element.currentTarget, arg.value)\r\n } else {\r\n _val = arg.value\r\n }\r\n // eslint-disable-next-line no-empty\r\n if (_observable() == _val) {\r\n } else {\r\n _observable(_val)\r\n }\r\n })\r\n },\r\n update: function (\r\n element,\r\n valueAccessor,\r\n allBindings,\r\n viewModel,\r\n bindingContext\r\n ) {\r\n if (element.steps) {\r\n // check to see if slider is initiated\r\n // update slider with model's property value change\r\n if (element.revert) {\r\n const _val = valueAccessor()()\r\n // use custom convertion function to interprete propeprty value into slide position\r\n let _pos = element.revert(element, _val)\r\n if (_pos == undefined) {\r\n _pos = 0\r\n }\r\n $(element).slider('value', _pos)\r\n if (element.steps) {\r\n // add step\r\n element.ifslider.UpdateResult(element.steps[_pos])\r\n }\r\n } else {\r\n // no conversion method. apply property value directly\r\n $(element).slider('value', valueAccessor()())\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { enableSlider }\r\n","/* global $ */\r\nimport { app } from './dk-ifshop-application'\r\nexport const isDateReadyforValidation = (value) => {\r\n let delimiter\r\n if (!value) {\r\n return false\r\n } else if (value && value.indexOf('-') > -1) {\r\n delimiter = '-'\r\n } else if (value && value.indexOf(':') > -1) {\r\n delimiter = ':'\r\n } else if (value && value.indexOf('/') > -1) {\r\n delimiter = '/'\r\n } else if (value && value.indexOf('.') > -1) {\r\n delimiter = '.'\r\n }\r\n if (delimiter && value.split(delimiter).length - 1 < 2) {\r\n // at least two delimiters\r\n return false\r\n }\r\n if (\r\n delimiter &&\r\n value.length > 5 &&\r\n value.length < 10 &&\r\n value.substring(value.length - 5, value.length - 4)\r\n ) {\r\n // WORKS ONLY FOR DANISH DATES!!!\r\n // with day and/or moth only having 1 siffer, is ok, but we cant validate 100% correct if the year isn't full\r\n return false\r\n }\r\n if ($.parseDate(value, null, app.culture) == null) {\r\n return false\r\n }\r\n\r\n if (value.length < 8) {\r\n return false\r\n }\r\n return true\r\n}\r\n","// dictionary\r\nfunction CollItem (data, id) {\r\n const self = this\r\n self.id = id\r\n self.data = data\r\n}\r\n\r\nfunction WebShopCollection () {\r\n const self = this\r\n\r\n // TODO: Refactor this so add and addOrUpdate do not start with duplicate code?\r\n self.add = function (itm, id) {\r\n if (typeof itm === 'undefined') {\r\n throw new Error('Tries to add undefined item to collection')\r\n }\r\n if (typeof id === 'undefined') {\r\n // if no id/key is specified. the item will be the id/key too\r\n id = itm\r\n }\r\n if (!self.coll) {\r\n self.coll = []\r\n }\r\n\r\n const _collItem = new CollItem(itm, id)\r\n self.coll.push(_collItem)\r\n self.isSorted = false\r\n }\r\n\r\n self.addOrUpdate = function (itm, id) {\r\n let _collItem\r\n\r\n if (typeof itm === 'undefined') {\r\n throw new Error('Tries to add undefined item to collection')\r\n }\r\n\r\n if (typeof id === 'undefined') {\r\n // if no id/key is specified. the item will be the id/key too\r\n id = itm\r\n }\r\n\r\n if (!self.coll) {\r\n self.coll = []\r\n }\r\n\r\n for (let i = 0; i < self.coll.length; i++) {\r\n const _temp = self.coll[i]\r\n if (_temp.id == id) {\r\n _collItem = new CollItem(itm, id)\r\n self.coll.splice(i, 1, _collItem)\r\n self.isSorted = false\r\n return\r\n }\r\n }\r\n\r\n _collItem = new CollItem(itm, id)\r\n self.coll.push(_collItem)\r\n self.isSorted = false\r\n }\r\n\r\n self.item = function (id) {\r\n const fullEntry = self.fullEntry(id)\r\n return fullEntry !== null ? fullEntry.data : null\r\n }\r\n\r\n self.fullEntry = function (id) {\r\n if (!self.coll) {\r\n return null\r\n }\r\n for (let i = 0; i < self.coll.length; i++) {\r\n const _temp = self.coll[i]\r\n if (_temp.id == id) {\r\n return _temp\r\n }\r\n }\r\n return null\r\n }\r\n\r\n self.byIndex = function (index) {\r\n return self.coll[index].data\r\n }\r\n\r\n self.fullEntryByIndex = function (index) {\r\n return self.coll[index]\r\n }\r\n\r\n self.getCount = function () {\r\n if (!self.coll) {\r\n return 0\r\n }\r\n return self.coll.length\r\n }\r\n\r\n self.remove = function (id) {\r\n if (!self.coll) {\r\n return\r\n }\r\n\r\n for (let i = 0; i < self.coll.length; i++) {\r\n const temp = self.coll[i]\r\n if (temp.id == id) {\r\n self.coll.splice(i, 1)\r\n return\r\n }\r\n }\r\n }\r\n\r\n self.removeAll = function (id) {\r\n if (!self.coll) {\r\n return\r\n }\r\n\r\n for (let i = self.coll.length - 1; i >= 0; i--) {\r\n const temp = self.coll[i]\r\n if (temp.id == id) {\r\n self.coll.splice(i, 1)\r\n // return; -remove all means it removes all that match, not just first\r\n }\r\n }\r\n }\r\n\r\n self.sortPair = function (a, b) {\r\n if (a.id > b.id) return -1\r\n if (a.id < b.id) return 1\r\n return 0\r\n }\r\n\r\n self.clear = function () {\r\n self.coll = []\r\n }\r\n\r\n self.ensureSort = function () {\r\n if (!self.isSorted && self.coll) {\r\n self.coll.sort(self.sortPair)\r\n self.isSorted = true\r\n }\r\n }\r\n}\r\n\r\nexport { CollItem, WebShopCollection }\r\n","/* global $ ko jQuery */\r\n\r\nimport { PendingInputs } from './dk-ifshop-controls'\r\nimport { app } from './dk-ifshop-application'\r\nimport { PersonEntities } from './dk-ifshop-constants'\r\n\r\n// collection of helper functions (1 instance)\r\nfunction WebShopHelperFunctions () {\r\n this.WEBSHOP_WILLRENDERHTML = 'webshop.willrenderhtml'\r\n this.WEBSHOP_RENDEREDHTML = 'webshop.renderedhtml'\r\n this.WEBSHOP_PAGELOADED = 'pageLoaded'\r\n this.GTM_WEBSHOP_PAGELOADED = 'gtmPageLoaded'\r\n this.OPSIGELSE_HURTIGST = '2'\r\n this.OPSIGELSE_EJERSKIFTE = '3'\r\n this.CANCELLATION_MONTH_UNKNOWN = 99\r\n\r\n this.TILBUD_UPDATED = 'tilbud_updated_event'\r\n // this.PRODUCT_UPDATED = 'product_updated_event'\r\n this.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT = 'product_updated_from_activeproduct_event'\r\n this.PRODUCT_UPDATED_FROM_OVERBLIKK = 'product_updated_from_overblikk_event'\r\n\r\n this.AJAX_FAIL = 'ajax_fail_event'\r\n this.PRICE_CHANGING = 'price_changing_event'\r\n this.PRODUCT_DAEKNING_UPDATED = 'product_daekning_changed'\r\n this.REMOVE_PRODUCT = 'remove_product'\r\n this.REMOVE_PRODUCT_BY_ID = 'remove_product_by_id'\r\n this.ADD_PRODUCT = 'add_product'\r\n this.PRODUCT_BASEPRAEMIE_UPDATED = 'product_base_praemie_updated'\r\n this.CUSTOMER_UPDATE_ENIGMA = 'customer_has_been_enigma_updated'\r\n\r\n this.publish = function (topic, data) {\r\n data = data || {}\r\n $(document).trigger(topic, data)\r\n }\r\n\r\n this.subscribe = function (topic, callback) {\r\n const fn = function (eventObject, data) {\r\n callback(data, topic)\r\n }\r\n $(document).on(topic, fn)\r\n\r\n return function () {\r\n $(document).off(topic, fn)\r\n }\r\n }\r\n\r\n this.pageLoadWait = function (condition) {\r\n $(document).ready(function () {\r\n function waitForCallCompletion (condition) {\r\n if (!condition) {\r\n app.onPageLoaded()\r\n } else {\r\n setTimeout(function () {\r\n if (condition.call()) {\r\n app.onPageLoaded()\r\n } else {\r\n waitForCallCompletion(condition)\r\n }\r\n }, 500)\r\n }\r\n }\r\n waitForCallCompletion(condition)\r\n })\r\n }\r\n\r\n this.cartContainsIndboOrHouse = function () {\r\n if (app.root && app.root.ProduktOverblikV2 && app.root.ProduktOverblikV2.ProductsInCart) {\r\n const husOrIndbo = app.root.ProduktOverblikV2.ProductsInCart.filter(product => product.localName === 'hus' || product.localName === 'familie')\r\n return husOrIndbo.length > 0\r\n }\r\n return false\r\n }\r\n\r\n this.validCubeInformationForCar = function () {\r\n return (app.root.CustomerBenefitLevel() === 0 || app.root.CustomerBenefitLevel() === 1)\r\n }\r\n\r\n this.showLargeCubeDiscountInformationForCar = function (selectedDaekning) {\r\n return this.validCubeInformationForCar() && selectedDaekning == 'Ansvar' && !this.cartContainsIndboOrHouse()\r\n }\r\n\r\n this.showSmallCubeDiscountInformationForCar = function (selectedDaekning) {\r\n return this.validCubeInformationForCar() && (selectedDaekning == 'Kasko' || selectedDaekning == 'Delkasko') && !this.cartContainsIndboOrHouse()\r\n }\r\n\r\n this.getDisplayTextForBlueBoxForCarCubeDiscount = function (selectedDaekning) {\r\n if (this.showSmallCubeDiscountInformationForCar(selectedDaekning)) {\r\n return app.getHjaelpeKodeText('CLIENT-CoverageCubeLevelOneInfo-bil', 'Vil du have ekstra 5 % rabat på din bilforsikring? Så tilføj en Indbo - eller husforsikring efter du har klikket på Fortsæt køb.')\r\n } else if (this.showLargeCubeDiscountInformationForCar(selectedDaekning)) {\r\n return app.getHjaelpeKodeText(\r\n 'CLIENT-CoverageCubeLevelZeroInfo-bil',\r\n 'Vil du have ekstra 10 % rabat på din bilforsikring? Så tilføj en Indbo - eller husforsikring efter du har klikket på Fortsæt køb.'\r\n )\r\n } else {\r\n return ''\r\n }\r\n }\r\n\r\n this.renderHtml = function ($el, html, contentType) {\r\n const data = { type: contentType }\r\n this.publish(this.WEBSHOP_WILLRENDERHTML, data)\r\n $el.html(html)\r\n this.publish(this.WEBSHOP_RENDEREDHTML, data)\r\n }\r\n\r\n this.getIfParameters = function () {\r\n const reg = /^data-ifparam-/gi\r\n const params = {}\r\n const ifparams =\r\n document.getElementById('ifparams') ||\r\n document.getElementById('ifparamsfallback')\r\n let attr\r\n let key\r\n let value\r\n\r\n if (ifparams && ifparams.hasAttributes()) {\r\n for (let i = 0; i < ifparams.attributes.length; i++) {\r\n attr = ifparams.attributes[i]\r\n if (attr.name.match(reg)) {\r\n key = attr.name.replace(reg, '').toLowerCase()\r\n value = attr.value\r\n params[key] = value\r\n }\r\n }\r\n }\r\n\r\n return params\r\n }\r\n\r\n // Validation --------------------------------------------------------------------------------\r\n\r\n this.getForm = function (jElement) {\r\n // used for groups of elements that doesn't have its own form, but is applied to another form that might have other controls too and already has a validator - or not\r\n // find closest form\r\n const _jForm = h.getClosestForm(jElement)\r\n // test if pendingInputs manager is added. if not - do so\r\n if (_jForm.length) {\r\n if (!_jForm[0].pendingInputs) {\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n }\r\n // test if validator is added. if not - do so\r\n if (!_jForm[0].validator) {\r\n const _validator = _jForm.validate()\r\n _jForm[0].validator = _validator\r\n }\r\n }\r\n return _jForm\r\n }\r\n\r\n this.getClosestForm = function (jElement) {\r\n return jElement.closest('form')\r\n }\r\n\r\n this.isScrolledIntoView = function (elem) {\r\n const docViewTop = $(window).scrollTop()\r\n const docViewBottom = docViewTop + $(window).height()\r\n\r\n const elemTop = $(elem).offset().top\r\n const elemBottom = elemTop + $(elem).height()\r\n\r\n return elemBottom <= docViewBottom && elemTop >= docViewTop\r\n }\r\n\r\n this.tryFocusOnFirstError = function () {\r\n try {\r\n // Find the first element with 'has-error' class\r\n const errorElement = $('.has-error:visible').first()\r\n\r\n if (errorElement) {\r\n // scroll to it and focus.\r\n if (!h.isScrolledIntoView(errorElement)) {\r\n $('html, body').scrollTop(errorElement.offset().top - 30)\r\n }\r\n\r\n if (errorElement[0] && typeof errorElement[0].focus === 'function') {\r\n errorElement[0].focus()\r\n }\r\n }\r\n } catch (e) {\r\n /* if this fails, so be it */\r\n }\r\n }\r\n\r\n this.addValidationRulesToForm = function (jQueryForm, rulesToAdd, messagesToAdd) {\r\n let validator\r\n const rulesJson = { rules: rulesToAdd, messages: messagesToAdd }\r\n if (jQueryForm[0].validator) {\r\n validator = jQueryForm.validate()\r\n let settings\r\n if (validator) {\r\n settings = validator.settings\r\n }\r\n $.extend(true, settings, rulesJson)\r\n } else {\r\n validator = jQueryForm.validate(rulesJson)\r\n if (validator) {\r\n jQueryForm[0].validator = validator\r\n }\r\n }\r\n }\r\n\r\n // validates all forms on the page\r\n // tests for forms with pending controls as well as waits until they are done working\r\n // executes functions in actionSettings on success or fail\r\n this.validateForms = function (actionSettings) {\r\n this.validateForms.doneValidating = function (isValid) {\r\n // focus on first invalid field\r\n if (!isValid) {\r\n const _errorFields = $('.has-error') // TODO: this is botox specific code, should be customizable\r\n if (h.isResult(_errorFields)) {\r\n // an element mark with error is found, we suspect it contains an input control (always the case with botox)\r\n const _ctrl = $(_errorFields[0]).find('input,select')\r\n if (h.isResult(_ctrl)) {\r\n // a control is found - highlight it.\r\n _ctrl[0].focus()\r\n }\r\n }\r\n }\r\n\r\n // return result\r\n if (isValid) {\r\n if (actionSettings && actionSettings.onSuccess) {\r\n actionSettings.onSuccess()\r\n }\r\n } else {\r\n h.tryFocusOnFirstError()\r\n if (actionSettings && actionSettings.onFail) {\r\n actionSettings.onFail()\r\n }\r\n }\r\n }\r\n\r\n // go through all form elements in step and validate content\r\n let _isValid = true\r\n\r\n $('form').each(function () {\r\n if (this.validator) {\r\n if (this.validator.form() === false) {\r\n // validate only ready forms - ignore those that are still pending\r\n if (!this.pendingInputs || !this.pendingInputs.isPending()) {\r\n _isValid = false\r\n // This one is not just pending, it is not valid. no need to proceed.\r\n // WDK-2010\r\n // return false; //$.each\r\n }\r\n }\r\n }\r\n })\r\n\r\n // find out if we must wait for forms that have pending inputs due to the validation request\r\n let _pending = false\r\n if (_isValid) {\r\n $('form').each(function () {\r\n if (this.validator && this.pendingInputs && this.pendingInputs.isPending()) {\r\n // the form is pending, so wait for a response\r\n this.pendingInputs.setOnDone(function (id) {\r\n // pending done - validate again\r\n const _elm = h.getElm(id)\r\n if (_elm && _elm.form && _elm.form.validator) {\r\n if (_elm.form.validator.form(true) == false) {\r\n // not valid\r\n h.validateForms.doneValidating(false)\r\n return false\r\n }\r\n }\r\n // see if any other forms are pending\r\n let _otherPendings = false\r\n $('form').each(function () {\r\n if (this.validator && this.pendingInputs && this.pendingInputs.isPending()) {\r\n _otherPendings = true\r\n }\r\n })\r\n\r\n if (!_otherPendings) {\r\n // no other forms are pending - act\r\n h.validateForms.doneValidating(true) // always valid=true, if we reach this point\r\n }\r\n })\r\n _pending = true\r\n }\r\n })\r\n }\r\n\r\n if (!_pending) {\r\n // no pending forms, act immediately\r\n this.validateForms.doneValidating(_isValid)\r\n }\r\n }\r\n\r\n this.addValidatorMessage = function (element, rule, message) {\r\n if (element) {\r\n let validatorMessageElement = element[0]\r\n const _jForm = $(element).parentsUntil(app.getTopJElm(), 'form')\r\n\r\n if (h.isSingleResult(_jForm) && _jForm[0].validator) {\r\n const validator = _jForm[0].validator\r\n const messages = validator.settings.messages\r\n\r\n if (validatorMessageElement === undefined) {\r\n validatorMessageElement = element\r\n }\r\n\r\n if (rule && message && validatorMessageElement) {\r\n let rules = messages[validatorMessageElement.name]\r\n\r\n if (!rules) {\r\n // add entry for the element if it doesn't exist\r\n rules = {}\r\n messages[validatorMessageElement.name] = rules\r\n }\r\n\r\n if (!rules[rule]) {\r\n // add entry for the rule if it doesn't exist\r\n rules[rule] = {}\r\n }\r\n\r\n // add/overwrite the message\r\n rules[rule] = message\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.validateElement = function (element, rule, message) {\r\n if (element) {\r\n if (!isVisible(element)) return true\r\n const _jForm = $(element).parentsUntil(app.getTopJElm(), 'form')\r\n if (h.isSingleResult(_jForm) && _jForm[0].validator) {\r\n const _validator = _jForm[0].validator\r\n\r\n // if passing message = null, should have no effect\r\n h.addValidatorMessage(element, rule, message)\r\n\r\n const result = _validator.element(element)\r\n\r\n delete _validator.submitted[element.id] // to avoid that this element is validated for every next change\r\n _validator.lastElement = undefined // used for RegNr basically, also to avoid that the last element is validated for every next change\r\n\r\n return result\r\n }\r\n }\r\n return true\r\n }\r\n\r\n this.clearRule = function (element, rule) {\r\n if (element) {\r\n const _jForm = $(element).parentsUntil(app.getTopJElm(), 'form')\r\n if (h.isSingleResult(_jForm) && _jForm[0].validator) {\r\n const _validator = _jForm[0].validator\r\n h.addValidatorMessage(element, rule)\r\n _validator.updateElement(element, rule, true)\r\n\r\n delete _validator.submitted[element.id] // to avoid that this element is validated for every next change\r\n _validator.lastElement = undefined // used for RegNr basically, also to avoid that the last element is validated for every next change\r\n }\r\n }\r\n }\r\n\r\n this.updateElementValidation = function (element, rule, message, result) {\r\n if (element) {\r\n if (!isVisible(element)) return true\r\n const _jForm = $(element).parentsUntil(app.getTopJElm(), 'form')\r\n if (h.isSingleResult(_jForm) && _jForm[0].validator) {\r\n const _validator = _jForm[0].validator\r\n h.addValidatorMessage(element, rule, message)\r\n return _validator.updateElement(element, rule, result)\r\n }\r\n }\r\n return true\r\n }\r\n\r\n this.registerPendingInput = function (element, id) {\r\n if (!id) {\r\n id = element.id\r\n }\r\n if (element && element.form && element.form.pendingInputs) {\r\n element.form.pendingInputs.registerPending(id)\r\n }\r\n }\r\n\r\n this.unregisterPendingInput = function (element, id) {\r\n if (!id) {\r\n id = element.id\r\n }\r\n if (element && element.form && element.form.pendingInputs) {\r\n element.form.pendingInputs.unregisterPending(id)\r\n }\r\n }\r\n\r\n // Knockout methods ---------------------------------------------------------------------\r\n\r\n this.bind = function (jElement, selector, model) {\r\n jElement.find(selector).each(function () {\r\n ko.applyBindingsToNode(this, null, model)\r\n })\r\n }\r\n\r\n this.bindSpecificNodes = function (jElement, model, dataBindValueArray) {\r\n jElement.find('*').each(function () {\r\n const jElement = $(this)\r\n if (jElement.attr('data-bind') && dataBindValueArray.includes(jElement.attr('data-bind'))) {\r\n if (!ko.dataFor(this)) {\r\n ko.applyBindingsToNode(this, null, model)\r\n }\r\n }\r\n })\r\n }\r\n\r\n this.bindAllWithExceptions = function (jElement, model, dataBindValueArray) {\r\n jElement.find('*').each(function () {\r\n const jElement = $(this)\r\n if (jElement.attr('data-bind')) {\r\n if (!dataBindValueArray.includes(jElement.attr('data-bind'))) {\r\n if (jElement.hasClass('dws-js-noAutoBind')) {\r\n // ignore\r\n } else if (jElement.is('select')) {\r\n // ignore\r\n } else {\r\n ko.applyBindingsToNode(this, null, model)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n // binds all execept select controls -TODO: Refactor\r\n this.bindAll = function (jElement, model, ignoreElementName) {\r\n jElement.find('*').each(function () {\r\n const jElement = $(this)\r\n if (jElement.attr('data-bind')) {\r\n if (jElement.hasClass('dws-js-noAutoBind')) {\r\n // ignore\r\n } else if (jElement.is('select')) {\r\n // ignore\r\n } else {\r\n ko.applyBindingsToNode(this, null, model)\r\n }\r\n }\r\n })\r\n }\r\n\r\n this.bindNodesToIndboProduct = function (scope) {\r\n this.bindNodesToModel('activeProduct.IndboModel', app.root.activeProduct.IndboModel(), scope)\r\n }\r\n this.bindNodesToRejseProduct = function (scope) {\r\n this.bindNodesToModel('activeProduct.RejseModel', app.root.activeProduct.RejseModel(), scope)\r\n }\r\n this.bindNodesToUlykkeProduct = function (scope) {\r\n this.bindNodesToModel('activeProduct.UlykkeModel', app.root.activeProduct.UlykkeModel(), scope)\r\n }\r\n\r\n this.bindNodesToActiveProduct = function (scope) {\r\n this.bindNodesToModel('activeProduct', app.root.activeProduct, scope)\r\n }\r\n this.bindNodesToKunde = function () {\r\n this.bindNodesToModel('Kunde', app.root.Kunde())\r\n }\r\n this.bindNodesToModel = function (dataBindingModelKey, model, scope) {\r\n // current flow, run through entire document\r\n if (!scope) {\r\n this.findNodesAndBindToModel(dataBindingModelKey, model, document)\r\n } else {\r\n // we need to find all elements with a matching scope, and only apply to matching children\r\n const nodes = document.querySelectorAll('[data-binding-scope=\"' + scope + '\"]')\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i]\r\n this.findNodesAndBindToModel(dataBindingModelKey, model, node)\r\n }\r\n }\r\n }\r\n\r\n this.findNodesAndBindToModel = function (dataBindingModelKey, model, domElement) {\r\n const nodes = domElement.querySelectorAll('[data-binding-model=\"' + dataBindingModelKey + '\"]')\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i]\r\n ko.applyBindingsToNode(node, null, model)\r\n }\r\n }\r\n\r\n this.bindToActiveProduct = function (id, optionalBindings) {\r\n return this.bindToModel(id, app.root.activeProduct, optionalBindings)\r\n }\r\n\r\n this.bindByDataIdToActiveProduct = function (id, optionalBindings) {\r\n const node = h.getElmByDataId(id)\r\n return this.bindNodeToModel(node, app.root.activeProduct, optionalBindings)\r\n }\r\n\r\n this.bindToModel = function (id, model, optionalBindings) {\r\n const node = h.getElm(id)\r\n return this.bindNodeToModel(node, model, optionalBindings)\r\n }\r\n this.bindNodeToModel = function (node, model, optionalBindings) {\r\n const bindings =\r\n typeof optionalBindings !== 'undefined' ? optionalBindings : null\r\n if (node) {\r\n ko.applyBindingsToNode(node, bindings, model)\r\n return true\r\n } else {\r\n return false\r\n }\r\n }\r\n // Knockout Observables binding\r\n // method designed to help update models in various scenarios. This help simplyfy the nof. lines used for assignments:\r\n // - initial, where a simple \"\" is added if no value is applied\r\n // - update with value\r\n // - partial update where there might not be specified a value, in which case the original value is used\r\n this.koMap = function (\r\n val,\r\n orig,\r\n def,\r\n observer,\r\n beforeObserver,\r\n name,\r\n ignoreZero,\r\n defaultUndefined\r\n ) {\r\n if (def == undefined || def == null) {\r\n if (defaultUndefined) {\r\n def = undefined\r\n } else {\r\n def = ''\r\n }\r\n }\r\n if (val == 0 && !ignoreZero) {\r\n def = val\r\n }\r\n if (orig) {\r\n if (orig() && orig().update) {\r\n // the object has an update method.\r\n orig().update(val)\r\n } else {\r\n orig(val || def)\r\n }\r\n return orig\r\n } else {\r\n const existingVal = ko.observable(val || def)\r\n if (observer && existingVal && existingVal.subscribe) {\r\n existingVal.subscribe(function (newValue) {\r\n observer(existingVal, newValue, name)\r\n })\r\n }\r\n if (beforeObserver && existingVal && existingVal.subscribe) {\r\n existingVal.subscribe(\r\n function (previousValue) {\r\n beforeObserver(existingVal, previousValue, name)\r\n },\r\n null,\r\n 'beforeChange'\r\n )\r\n }\r\n return existingVal\r\n }\r\n }\r\n\r\n this.koMap2 = function (val, orig, def, opts) {\r\n const options = typeof opts === 'undefined' ? {} : opts\r\n const observer = options.observer\r\n const beforeObserver = options.beforeObserver\r\n const name = options.name\r\n const valueOrDefault = typeof val === 'undefined' ? def : val\r\n\r\n if (orig) {\r\n if (orig() && orig().update) {\r\n // the object has an update method.\r\n orig().update(val)\r\n } else {\r\n orig(valueOrDefault)\r\n }\r\n return orig\r\n } else {\r\n const newObservable = ko.observable(valueOrDefault)\r\n const newObservableExists = newObservable && newObservable.subscribe\r\n\r\n if (observer && newObservableExists) {\r\n newObservable.subscribe(function (newValue) {\r\n observer(newObservable, newValue, name)\r\n })\r\n }\r\n\r\n if (beforeObserver && newObservableExists) {\r\n newObservable.subscribe(\r\n function (previousValue) {\r\n beforeObserver(newObservable, previousValue, name)\r\n },\r\n null,\r\n 'beforeChange'\r\n )\r\n }\r\n\r\n return newObservable\r\n }\r\n }\r\n\r\n // Format --------------------------------------------------------------------------------\r\n\r\n // formats text like in c#, by taking any arguments added after txt and adds it to the text\r\n this.format = function (txt /* accepts multiple arguments */) {\r\n const args = Array.prototype.slice.call(arguments, 1)\r\n return txt.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] !== 'undefined' ? args[number] : match\r\n })\r\n }\r\n\r\n this.correctStringDate = function (date) {\r\n if (date) {\r\n if (date.getDate) {\r\n // this is a type Date\r\n return date\r\n } else if (date.substr(2, 1) === '-' || date.substr(2, 1) === '/') {\r\n // day first, shift it\r\n return (\r\n date.substr(6, 4) + '-' + date.substr(3, 2) + '-' + date.substr(0, 2)\r\n )\r\n } else {\r\n // it is propably in the right order (year first)\r\n return date\r\n }\r\n }\r\n return ''\r\n }\r\n\r\n this.getNegPrice = function (val) {\r\n try {\r\n return $.format(Math.ceil(val) * -1, 'n0', app.culture)\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n return 0\r\n }\r\n\r\n this.roundPrice = function (val) {\r\n try {\r\n return Math.ceil(val)\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n return 0\r\n }\r\n\r\n // previous needs to be adjusted so we do not have overlapping intervals\r\n this.getPriceInterval = function (previousValue, currentValue) {\r\n if (previousValue > 0) {\r\n previousValue++\r\n }\r\n return (\r\n this.getPrice(previousValue) + '-' + this.getPrice(currentValue) + ' kr.'\r\n )\r\n }\r\n\r\n this.getPrice = function (val) {\r\n try {\r\n return $.format(Math.ceil(val), 'n0', app.culture)\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n return 0\r\n }\r\n\r\n this.getNumber = function (val) {\r\n try {\r\n return $.format(val, 'n0', app.culture)\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n return 0\r\n }\r\n\r\n this.capitaliseFirstLetter = function (string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1)\r\n }\r\n\r\n this.removeTimeFromDate = function (date) {\r\n date.setHours(0)\r\n date.setMinutes(0)\r\n date.setSeconds(0)\r\n date.setMilliseconds(0)\r\n }\r\n\r\n this.stringToBool = function (text) {\r\n return text.toLowerCase() === 'true'\r\n }\r\n\r\n this.booleanToYesOrNo = function (bool) {\r\n return bool ? 'yes' : 'no'\r\n }\r\n\r\n this.stringToYesNo = function (text) {\r\n return this.booleanToYesOrNo(this.stringToBool(text))\r\n }\r\n\r\n // Get element ---------------------------------------------------------------------------\r\n this.getElmWithParent = function (parent, id) {\r\n // just making the command shorter\r\n if (id) {\r\n return parent.querySelector('#' + id)\r\n }\r\n }\r\n this.getElm = function (id) {\r\n // just making the command shorter\r\n if (id) {\r\n return document.getElementById(id)\r\n }\r\n }\r\n\r\n this.validPrefix = function (prefix) {\r\n return prefix == PersonEntities.Kunde ||\r\n prefix == PersonEntities.Medforsikret ||\r\n prefix == PersonEntities.AndenForsikrede ||\r\n prefix == PersonEntities.ForsikredePerson ||\r\n prefix == PersonEntities.AndenBegunstigede ||\r\n prefix == PersonEntities.AndenBegunstigedePerson\r\n }\r\n\r\n this.getClientTextKeyPrefix = function (prefix) {\r\n if (this.validPrefix(prefix)) {\r\n return 'CLIENT-' + prefix\r\n }\r\n }\r\n\r\n this.getClientTextKey = function (name, prefix) {\r\n const _prefix = this.getClientTextKeyPrefix(prefix)\r\n if (_prefix && name) {\r\n return _prefix + name\r\n }\r\n return name\r\n }\r\n\r\n this.getSelectSelector = function (name, prefix) {\r\n if (name && (this.validPrefix(prefix))) {\r\n if (prefix == PersonEntities.Kunde) {\r\n prefix = ''\r\n }\r\n return 'select' + prefix + name\r\n }\r\n }\r\n\r\n this.getIdSelector = function (name, prefix) {\r\n if (name && (this.validPrefix(prefix))) {\r\n if (prefix == PersonEntities.Kunde) {\r\n prefix = ''\r\n }\r\n return prefix + name\r\n }\r\n }\r\n\r\n this.getSelectElm = function (name, prefix) {\r\n const selector = this.getSelectSelector(name, prefix)\r\n return this.getElm(selector)\r\n }\r\n\r\n this.getSelectElmAsJqueryObject = function (name, prefix) {\r\n let selector = this.getSelectSelector(name, prefix)\r\n selector = '#' + selector\r\n return $(selector)\r\n }\r\n\r\n this.getElmById = function (name, prefix) {\r\n const selector = this.getIdSelector(name, prefix)\r\n return this.getElm(selector)\r\n }\r\n\r\n this.getElmByIdAsJqueryObject = function (name, prefix) {\r\n let selector = this.getIdSelector(name, prefix)\r\n selector = '#' + selector\r\n return $(selector)\r\n }\r\n\r\n this.getJElmByDataId = function (id, jParent) {\r\n if (id) {\r\n if (jParent) {\r\n return jParent.find('[data-id=' + id + ']')\r\n } else {\r\n return $('[data-id=' + id + ']')\r\n }\r\n }\r\n }\r\n\r\n this.getElmByDataId = function (id, jParent) {\r\n if (id) {\r\n if (jParent) {\r\n return jParent.find('[data-id=' + id + ']')[0]\r\n } else {\r\n return $('[data-id=' + id + ']')[0]\r\n }\r\n }\r\n }\r\n\r\n this.getElmByClass = function (className) {\r\n return document.getElementsByClassName(className)\r\n }\r\n\r\n // Enable/Disable ------------------------------------------------------------------------\r\n\r\n this.isDisabled = function (element) {\r\n return element.disabled\r\n }\r\n\r\n this.setDisabled = function (jElement, value) {\r\n if (value) {\r\n this.disable(jElement)\r\n } else {\r\n this.enable(jElement)\r\n }\r\n }\r\n\r\n this.disable = function (jElement) {\r\n jElement.each(function () {\r\n this.setAttribute('disabled', 'disabled')\r\n $(this).addClass('disabled')\r\n this.disabled = true\r\n })\r\n if ($(jElement[0]).is('select')) {\r\n jElement.parent().removeClass('enabledDropdown').addClass('disabledDropdown')\r\n }\r\n }\r\n\r\n this.enable = function (jElement) {\r\n jElement.each(function () {\r\n this.removeAttribute('disabled')\r\n $(this).removeClass('disabled')\r\n this.disabled = false\r\n })\r\n if ($(jElement[0]).is('select')) {\r\n jElement.parent().removeClass('disabledDropdown').addClass('enabledDropdown')\r\n }\r\n }\r\n\r\n this.ie8Disabled = function (element, disabled) {\r\n if (disabled) {\r\n $(element)\r\n .addClass('disabled')\r\n .parent('div')\r\n .parent('div')\r\n .addClass('z')\r\n .removeClass('z')\r\n } else {\r\n $(element)\r\n .removeClass('disabled')\r\n .parent('div')\r\n .parent('div')\r\n .addClass('z')\r\n .removeClass('z')\r\n }\r\n element.disabled = disabled\r\n }\r\n\r\n // Check/uncheck --------------------------------------------------------------------------\r\n\r\n this.setCheck = function (value, element) {\r\n if (value) {\r\n this.check($(element))\r\n } else {\r\n this.uncheck($(element))\r\n }\r\n }\r\n\r\n this.check = function (jElement) {\r\n jElement.prop('checked', true)\r\n }\r\n\r\n this.uncheck = function (jElement) {\r\n jElement.prop('checked', false)\r\n }\r\n\r\n this.setCheckAndChange = function (value, element) {\r\n if (value) {\r\n this.checkAndChange($(element))\r\n } else {\r\n this.uncheckAndChange($(element))\r\n }\r\n }\r\n\r\n this.checkAndChange = function (jElement) {\r\n jElement.prop('checked', true).trigger('change')\r\n }\r\n\r\n this.uncheckAndChange = function (jElement) {\r\n jElement.prop('checked', false).trigger('change')\r\n }\r\n\r\n // jQuery functions -----------------------------------------------------------------------------\r\n\r\n this.isResult = function (jResult) {\r\n return jResult && jResult[0]\r\n }\r\n\r\n this.isSingleResult = function (jResult) {\r\n return jResult && jResult.length === 1\r\n }\r\n\r\n // Ensures the element is NOT JQuery selection\r\n // used on arguments where it is not surtan what type of object is applied\r\n this.xjElement = function (element) {\r\n if (element instanceof jQuery && element[0]) return element[0]\r\n else return element\r\n }\r\n\r\n // Ensures the element is a JQuery selection\r\n // used on arguments where it is not certain what type of object is applied\r\n this.jElement = function (element) {\r\n if (element instanceof jQuery) return element\r\n else return $(element)\r\n }\r\n\r\n // Graphics functions ---------------------------------------------------------------------------\r\n\r\n function isVisible (element) {\r\n if (!element.style) {\r\n return true\r\n }\r\n if (\r\n element.disabled == true ||\r\n element.style.display === 'hidden' ||\r\n element.style.display === 'none'\r\n ) {\r\n return false\r\n }\r\n if (element.parentNode) {\r\n return isVisible(element.parentNode)\r\n }\r\n }\r\n\r\n this.collapseElement = function (jElement) {\r\n jElement.addClass('collapsed')\r\n }\r\n\r\n this.uncollapseElement = function (jElement) {\r\n jElement.removeClass('collapsed')\r\n }\r\n\r\n this.retractForm = function (jContainer, time) {\r\n if (!time) {\r\n time = 800\r\n }\r\n jContainer.hide('blind', time)\r\n }\r\n\r\n this.extendForm = function (jOld, url, jContainer, progress, model, time) {\r\n app.setPendingUserAction('extending form')\r\n\r\n function extend2 () {\r\n $(app).trigger('sectionLoaded', ['extendForm']) // done before show, so any controls can be enabled before/while the panel is moving into full visibility\r\n $.when(jContainer.show('blind', time)).done(function () {\r\n h.selectNextEntry(jContainer)\r\n // in odd cases the user might press a button to move on while more content is loaded. this forces it to be validated (anf go red)\r\n // to avoid this. as soon as the graphics is fully loaded, the validation state of any forms are reset:\r\n if (jContainer.validator) {\r\n // the container itself is the form. reset it\r\n jContainer.validator.submitted = []\r\n } else {\r\n // the container is not a form, look for any contained forms\r\n jContainer.find('form').each(function () {\r\n if (this.validator) {\r\n // reset\r\n this.validator.submitted = []\r\n }\r\n })\r\n }\r\n app.resetPendingUserAction('extending form')\r\n })\r\n }\r\n\r\n function extend () {\r\n if (progress) {\r\n if (progress === 'auto') {\r\n app.wizard.currentStep.setProgress(\r\n app.wizard.currentStep.Progress + 1\r\n )\r\n } else {\r\n if (typeof app.wizard.currentStep !== 'undefined') {\r\n // wdk-2116\r\n if (app.wizard.currentStep.Progress !== progress) {\r\n app.wizard.currentStep.setProgress(progress)\r\n }\r\n }\r\n }\r\n }\r\n if (model && model.sync) {\r\n model.sync({ done: extend2 })\r\n } else {\r\n extend2()\r\n }\r\n }\r\n\r\n // use specified duration or 800 as default\r\n if (!time) {\r\n time = 800\r\n }\r\n if (h.isSingleResult(jContainer)) {\r\n if ($.trim(jContainer.html()).length > 0) {\r\n app.setBusy('extendForm')\r\n\r\n // check the visibility of the section\r\n if (\r\n jContainer[0].style.display === 'none' ||\r\n jContainer[0].style.display === 'hidden'\r\n ) {\r\n // not visible. show it\r\n extend()\r\n } else {\r\n // do nothing. already displayed\r\n app.resetPendingUserAction('extending form')\r\n }\r\n app.setNotBusy('extendForm')\r\n } else {\r\n // Note: this point can be hit more than once if this action is intiated by validating multiple fields. yet the load is based on prio: first. which means any second+ calls are cancelled - so the done: method is only performed once\r\n app.loadHtml({\r\n url,\r\n actionId: 'extendForm',\r\n actionOnBusy: 'queue',\r\n targetElement: jOld,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n jContainer.hide()\r\n // h.publish(h.WEBSHOP_WILLRENDERHTML, { type: 'extendform'})\r\n // jContainer.html(data);\r\n // h.publish(h.WEBSHOP_RENDEREDHTML, { type: 'extendform'})\r\n h.renderHtml(jContainer, data, 'extendform')\r\n\r\n extend()\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n app.resetPendingUserAction('extending form')\r\n }\r\n }\r\n })\r\n }\r\n } else {\r\n app.resetPendingUserAction('extending form')\r\n // client error\r\n }\r\n }\r\n\r\n this.getSections = function (jElement) {\r\n return jElement // .find('.dws-js-section');\r\n }\r\n\r\n this.fadeToForm = function (jContainer, url, progress, model, keepFocus) {\r\n app.setPendingUserAction('fade to form')\r\n function fade2 () {\r\n $(app).trigger('sectionLoaded', ['fadeToForm', h.getSections(jContainer)]) // done before fade in, so any controls can be enabled before/while the panel is fading in\r\n\r\n if (keepFocus) {\r\n jContainer.fadeIn(800, function () {\r\n // h.selectNextEntry(jContainer);\r\n app.resetPendingUserAction('fade to form')\r\n })\r\n } else {\r\n jContainer.fadeIn(800, function () {\r\n h.selectNextEntry(jContainer)\r\n app.resetPendingUserAction('fade to form')\r\n })\r\n }\r\n }\r\n\r\n function fade () {\r\n if (progress) {\r\n if (typeof app.wizard.currentStep !== 'undefined') {\r\n if (app.wizard.currentStep.Progress !== progress) {\r\n app.wizard.currentStep.setProgress(progress)\r\n }\r\n }\r\n }\r\n if (model && model.sync) {\r\n model.sync({ done: fade2 })\r\n } else {\r\n fade2()\r\n }\r\n }\r\n\r\n if (h.isSingleResult(jContainer)) {\r\n app.loadHtml({\r\n url,\r\n actionOnBusy: 'ignoreBusy', // added due to fadeToForm(...bilprodukt/getsubview/detaljer). a sync prior to the fade forceslist controls to update (before fading away) and load thweir content, that forced this view load to be cancelled.\r\n // targetElement: jOld,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n jContainer.fadeOut(800, function () {\r\n // jContainer.html(data);\r\n // h.publish(h.WEBSHOP_RENDEREDHTML, { type: 'form' })\r\n h.renderHtml(jContainer, data, 'form')\r\n\r\n fade()\r\n })\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n app.resetPendingUserAction('fade to form')\r\n }\r\n }\r\n })\r\n } else {\r\n app.resetPendingUserAction('fade to form')\r\n // client error\r\n }\r\n }\r\n\r\n // JSON methods ---------------------------------------------------------------------------------\r\n\r\n this.getJSONDate = function (text) {\r\n if (text) {\r\n return new Date(text.match(/\\d+/)[0] * 1)\r\n }\r\n return new Date()\r\n }\r\n\r\n this.getJSONStringDate = function (text) {\r\n let _date\r\n if (text) {\r\n if ((/Date/).test(text)) {\r\n _date = new Date(parseInt(text.substr(6)))\r\n } else {\r\n _date = new Date(text)\r\n }\r\n if (_date) {\r\n return $.format(_date, 'dd/MM/yyyy', app.culture)\r\n }\r\n }\r\n return new Date()\r\n }\r\n\r\n // Other ----------------------------------------------------------------------------------------\r\n\r\n // this.getAgeFromBirthDate = function (birth, today) {\r\n // if (birth) {\r\n // if (!today) {\r\n // today = new Date()\r\n // }\r\n // var nowyear = today.getFullYear()\r\n // var nowmonth = today.getMonth()\r\n // var nowday = today.getDate()\r\n\r\n // var birthyear = birth.getFullYear()\r\n // var birthmonth = birth.getMonth()\r\n // var birthday = birth.getDate()\r\n\r\n // var age = nowyear - birthyear\r\n // var ageMonth = nowmonth - birthmonth\r\n // var ageDay = nowday - birthday\r\n\r\n // if (ageMonth < 0 || (ageMonth === 0 && ageDay < 0)) {\r\n // age = parseInt(age) - 1\r\n // }\r\n // }\r\n // return age\r\n // }\r\n\r\n this.d0 = function (val) {\r\n if (typeof val === 'undefined') {\r\n return 0\r\n } else {\r\n return val\r\n }\r\n }\r\n\r\n this.isIE = function () {\r\n return navigator.appName === 'Microsoft Internet Explorer'\r\n }\r\n\r\n this.selectNextEntry = function (jElement) {\r\n // make sure the graphics is loaded (often a problem in IE)\r\n setTimeout(function () {\r\n let _found = false\r\n let jSel = jElement\r\n\r\n function setFocus (element) {\r\n _found = true\r\n $(element).focus()\r\n }\r\n\r\n if (!jSel) {\r\n // no context was specified, look within any entry control on the screen\r\n jSel = $('input, select')\r\n } else {\r\n // no context was specified, look within any entry control on the screen\r\n jSel = jElement.find('input, select')\r\n }\r\n\r\n // select first that has no value or is radio\r\n jSel.each(function () {\r\n if (\r\n (!this.value || $(this).is(':radio')) &&\r\n isVisible(this) &&\r\n this.tabIndex != '-1'\r\n ) {\r\n if ($(this).is(':radio')) {\r\n // look troguh all related radio button s(Usually only two) and try to select the one checked\r\n $('[name=' + $(this)[0].name + ']').each(function () {\r\n if (this.checked) {\r\n setFocus(this)\r\n return false\r\n } // $.each\r\n })\r\n if (!_found) {\r\n // select the first one\r\n setFocus(this)\r\n return false\r\n } else {\r\n return false\r\n }\r\n } else {\r\n setFocus(this)\r\n return false\r\n }\r\n }\r\n })\r\n if (!_found) {\r\n // if all have value, just select first entry\r\n jSel.each(function () {\r\n if (isVisible(this) && this.tabIndex != '-1') {\r\n setFocus(this)\r\n return false\r\n }\r\n })\r\n }\r\n }, 100)\r\n }\r\n\r\n this.doOrWait = function (flag, loader, eventName, method) {\r\n if (flag) {\r\n method()\r\n } else {\r\n $(loader).one(eventName, method)\r\n }\r\n }\r\n\r\n this.canHaveChildren = function (tagName) {\r\n // used by e.g. showSpinner to find out if a spinner can be placed within the elemetn or paced on top of it\r\n if (tagName) {\r\n tagName = tagName.toLowerCase()\r\n return noChildren[tagName] === undefined\r\n }\r\n }\r\n\r\n // Execute function based on a name string\r\n this.execFunction = function (functionName, context, args) {\r\n // Get the args from this methods args\r\n // args = Array.prototype.slice.call(args).splice(2, 2); //IE8 requires both args in splice\r\n // create list of namespaces from functionName\r\n const namespaces = functionName.split('.')\r\n // remove the last entry as it is expected to be the function name\r\n const func = namespaces.pop()\r\n // traverse all namespaces as nested contexts, starting with the one applied as arg\r\n if (context) {\r\n for (let i = 0; i < namespaces.length; i++) {\r\n context = context[namespaces[i]]\r\n }\r\n if (context[func] && context[func].apply) {\r\n return context[func].apply(this, args)\r\n }\r\n }\r\n }\r\n\r\n // Get the selected array object from the kvhx code\r\n this.getObject = function (obj, key, val) {\r\n let newObj = false\r\n $.each(obj, function () {\r\n const testObject = this\r\n $.each(testObject, function (k, v) {\r\n if (val == v && k == key) newObj = testObject\r\n })\r\n })\r\n return newObj\r\n }\r\n\r\n this.convertArrayToOptions = function (array, jSelectElement) {\r\n for (const _id in array) {\r\n jSelectElement.append(\r\n $('')\r\n .text(array[_id].toString())\r\n .val(_id)\r\n )\r\n }\r\n }\r\n\r\n this.setupPropertyAsOptions = function (element, property, indexZeroText) {\r\n const $element = $(element)\r\n let index = 0\r\n let text = ''\r\n const items = property.selectableOptions\r\n\r\n items.forEach(function (value) {\r\n const isSelected = property().toString() === value.toString()\r\n const item = items[index]\r\n\r\n if (index === 0 && value === 0) {\r\n text = indexZeroText || '0 kr.'\r\n } else {\r\n text = h.getPrice(item) + ' kr.'\r\n }\r\n $element.append(\r\n $('')\r\n .attr('selected', isSelected)\r\n .text(text)\r\n .val(value)\r\n )\r\n index++\r\n })\r\n }\r\n\r\n this.convertArrayToPriceIntervalOptions = function (\r\n element,\r\n property,\r\n indexZeroText\r\n ) {\r\n const $element = $(element)\r\n let index = 0\r\n let text = ''\r\n const items = property.intervalOptions\r\n\r\n items.forEach(function (value) {\r\n const isSelected = property().toString() === value.toString()\r\n const item = items[index]\r\n const prevItem = items[index - 1]\r\n\r\n if (index === 0) {\r\n text = indexZeroText || '0 kr.'\r\n } else {\r\n text = h.getPriceInterval(prevItem, item)\r\n }\r\n $element.append(\r\n $('')\r\n .attr('selected', isSelected)\r\n .text(text)\r\n .val(value)\r\n )\r\n index++\r\n })\r\n }\r\n\r\n this.setIntervalProperty = function (e, property) {\r\n const items = property.intervalOptions\r\n if (\r\n e.currentTarget.selectedIndex >= 0 &&\r\n e.currentTarget.selectedIndex < items.length\r\n ) {\r\n property(items[e.currentTarget.selectedIndex])\r\n } else {\r\n property(items[0])\r\n }\r\n }\r\n this.getParameterByName = function (url, name) {\r\n name = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]')\r\n const regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)')\r\n const results = regex.exec(url)\r\n return results == null\r\n ? ''\r\n : decodeURIComponent(results[1].replace(/\\+/g, ' '))\r\n }\r\n\r\n // Returns a function, that, as long as it continues to be invoked, will not\r\n // be triggered. The function will be called after it stops being called for\r\n // N milliseconds.\r\n this.debounce = function (func, wait) {\r\n let timeout\r\n return function () {\r\n const context = this\r\n const args = arguments\r\n const later = function () {\r\n func.apply(context, args)\r\n }\r\n clearTimeout(timeout)\r\n timeout = setTimeout(later, wait)\r\n }\r\n }\r\n\r\n this.addTrackingProperties = function (data) {\r\n if (data !== undefined && data !== null) {\r\n const result = { sessionId: app.sessionId, data }\r\n return result\r\n } else {\r\n return { sessionId: app.sessionId }\r\n }\r\n }\r\n\r\n this.addressLine1 = function (gade, husnr, etage, sideDoerNr) {\r\n let line = ''\r\n if (gade) {\r\n line += gade\r\n }\r\n if (husnr) {\r\n line += ' ' + husnr\r\n }\r\n if (etage || sideDoerNr) {\r\n line += ','\r\n }\r\n if (etage) {\r\n line += ' ' + etage + '.'\r\n }\r\n if (sideDoerNr) {\r\n line += ' ' + sideDoerNr\r\n }\r\n\r\n return line\r\n }\r\n\r\n this.addressLine2 = function (postnr, by) {\r\n let line = ''\r\n\r\n if (postnr) {\r\n line += postnr\r\n\r\n if (by) {\r\n line += ' '\r\n }\r\n }\r\n if (by) {\r\n line += by\r\n }\r\n\r\n return line\r\n }\r\n\r\n this.addressSingleLine = function (gade, husnr, etage, sidedoernr, postnr, by) {\r\n const streetPart = this.addressLine1(gade, husnr, etage, sidedoernr)\r\n const cityPart = this.addressLine2(postnr, by)\r\n\r\n if (streetPart && cityPart) {\r\n return streetPart + ', ' + cityPart\r\n }\r\n if (streetPart && !!cityPart) {\r\n return streetPart\r\n }\r\n if (!!streetPart && cityPart) {\r\n return cityPart\r\n }\r\n return ''\r\n }\r\n}\r\n\r\n// enum used to check which elements can have children (Used from webShopLoader)\r\nconst noChildren = {\r\n input: true,\r\n select: true,\r\n meta: true,\r\n br: true,\r\n link: true,\r\n img: true\r\n}\r\n\r\n// Knockout helpers\r\nko.extenders.validateFormat = function (target, formatRegEx) {\r\n // add some sub-observables to our observable\r\n target.hasValidFormat = ko.observable()\r\n\r\n // define a function to do validation\r\n function validate (newValue) {\r\n const hasValidFormat =\r\n typeof newValue === 'string'\r\n ? newValue.match(formatRegEx) !== null\r\n : false\r\n target.hasValidFormat(hasValidFormat)\r\n }\r\n\r\n // initial validation\r\n validate(target())\r\n\r\n // validate whenever the value changes\r\n target.subscribe(validate)\r\n\r\n // return the original observable\r\n return target\r\n}\r\n\r\nko.subscribable.fn.subscribeChanged = function (callback) {\r\n let savedValue = this.peek()\r\n return this.subscribe(function (latestValue) {\r\n const oldValue = savedValue\r\n savedValue = latestValue\r\n callback(latestValue, oldValue)\r\n })\r\n}\r\n\r\nconst h = new WebShopHelperFunctions()\r\n\r\nexport { WebShopHelperFunctions, h, noChildren }\r\n","/* global $ */\r\n\r\nimport { app } from './dk-ifshop-application'\r\nimport { stateManager } from './dk-ifshop-statemanagement'\r\nimport { h } from './dk-ifshop-helper'\r\n\r\n// sends requests and receives json/html responses (Used from webShopApplication)\r\nfunction WebShopLoader (val, contentType, dataType) {\r\n const self = this\r\n\r\n self.init = function (val, contentType, dataType) {\r\n // set url and caching\r\n if (val.url.indexOf('//') >= 0) {\r\n self.url = val.url // url called by jQuery.ajax (full url applied)\r\n } else {\r\n self.url = app.shopHostUrl + val.url // url called by jQuery.ajax\r\n }\r\n\r\n self.cache = false\r\n if (val.cache === true) {\r\n self.cache = true\r\n // use versioning in the request to ensure that cached data is overwritten, if the version changes\r\n if (self.url.indexOf('?') >= 0) {\r\n self.url = self.url + '&v=' + app.version\r\n } else {\r\n self.url = self.url + '?v=' + app.version\r\n }\r\n }\r\n\r\n // set data prio settings and test if it should ignore\r\n self.args = val\r\n self.allowCredentials = val.allowCredentials\r\n self.block = val.block // whether this call should try to block all other communication until the operation is fully done\r\n self.actionOnBusy = val.actionOnBusy // whether this call should respect a block from another loader or ignore it(use when you know there is no possible conflict)\r\n self.data = val.data // data passed by jQuery.ajax\r\n\r\n self.actionId = val.actionId // used to identify the call when blocking or prioritizing\r\n self.callId = val.callId // used with actionID and indentifies the call instance\r\n self.prio = val.prio // 'latest', 'first', 'none' defines the strategy for prioritizing related calls\r\n self.ignored = false // set if this instance is ignored due to lowest priority\r\n self.canceled = false // set if this instance is canceled by explicitely setting cancel = true\r\n\r\n self.token = val.token\r\n\r\n if (!self.prio) {\r\n self.prio = 'latest' // default\r\n }\r\n if (self.prio !== 'none') {\r\n if (!self.actionId) {\r\n self.actionId = self.url\r\n }\r\n if (!self.callId) {\r\n if (self.data) {\r\n self.callId = self.data\r\n } else {\r\n self.callId = self.actionId\r\n }\r\n }\r\n }\r\n // this is the earliest we can test for isIgnored, based on which props are set.\r\n if (app.isBusy(val.actionId)) {\r\n if (!self.actionOnBusy || self.actionOnBusy === 'cancel') {\r\n // the app is busy and this loader will not ignore that, so the call is cancelled\r\n if (val.always) {\r\n val.always()\r\n }\r\n return false\r\n } else if (self.actionOnBusy === 'queue') {\r\n app.setOnDone(function () {\r\n if (self.init(val, contentType, dataType)) {\r\n self.ajax()\r\n }\r\n })\r\n return false\r\n }\r\n }\r\n\r\n // self.queuedAction = null;\r\n self.contentType =\r\n self.args.contentType !== undefined ? self.args.contentType : contentType // data type received by jQuery.ajax (application/json, ...)\r\n self.dataType = dataType // data type send by jQuery.ajax (json/script/html/...)\r\n self.type = val.type // request type (post/get/...)\r\n if (!self.type) {\r\n self.type = 'post'\r\n }\r\n\r\n self.noAutoDisable = val.noAutoDisable // used if the targetElement is disabled on done/fail. to avoid the control to be reannbled after the spinner is removed\r\n self.hiddenSpinner = val.hiddenSpinner\r\n self.largeSpinner = val.largeSpinner\r\n self.response = null // data result from ended call\r\n\r\n self.isPending = false\r\n self.isSuccess = false\r\n self.done = val.done // custom method on done (called on jQuery.ajax done/success result)\r\n self.always = val.always // custom method on any result (called on jQuery.ajax always event)\r\n self.fail = val.fail // custom method on communication fail (called on jQuery.akax fail/error event)\r\n self.systemFail = val.systemFail // custom method on system fail (called on jQuery.ajax done event if message type = -1)\r\n self.operationFail = val.operationFail // custom method on operation fail (called on jQuery.ajax done event if message type = -2)\r\n self.entryFail = val.entryFail // custom method on entry fail (called on jQuery.ajax done event if message type = -3)\r\n self.onIgnored = val.onIgnored // custom method on ignored actions (called on jQuery.ajax done event if call has been cancelled by latest or first)\r\n self.actionSettings = val.actionSettings // customizations from other objects with matching operations (done, operationFail, ...)\r\n\r\n self.targetElement = val.targetElement // the element calling or othe rrelevant element that can be disabled (spinner) until call is done or used to display messages\r\n\r\n return true\r\n }\r\n\r\n self.doAlways = function (data, textStatus, jqXHR) {\r\n try {\r\n // action passed on as variable to this method object\r\n if (self.always) {\r\n self.always(data, textStatus, jqXHR)\r\n }\r\n // action passed on from initial caller\r\n if (self.actionSettings && self.actionSettings.always) {\r\n self.actionSettings.always(data, textStatus, jqXHR)\r\n }\r\n if (self.block) {\r\n app.setNotBusy(self.actionId)\r\n }\r\n // if (self.queuedAction && self.isSuccess) {\r\n // self.queuedAction(self);\r\n // }\r\n } catch (e) {\r\n // report but ignore. any errors in custom actions should be handled by the custom code (incl. error handling). try is only here to isolate any custom erros from core functionality (no dirt in the arteries)\r\n app.reportFail(e)\r\n if (self.block) {\r\n app.setNotBusy(self.actionId)\r\n }\r\n }\r\n }\r\n\r\n self.validatePrio = function () {\r\n if (self.cancel === true) {\r\n // app.writeDebugInfo('>>> CANCEL' + self.actionId);\r\n self.canceled = true\r\n return false\r\n }\r\n // validates if the response can be accepted based on concurrency settings\r\n if (self.prio !== 'none') {\r\n const _call = app.calls.fullEntry(self.actionId)\r\n if (_call) {\r\n if (_call.data === self.callId) {\r\n // the saved call is 'this' call, so it can be removed now as the call is done.\r\n // app.calls.remove(self.actionId); Moved to \"unregCall\" because it must be held until the full end of the call and all trailing actions\r\n return true\r\n } else {\r\n // the call has been overwritten by a call with higher prio (latest prio).\r\n self.ignored = true\r\n // app.writeDebugInfo('>>> OVERWRITTEN' + self.actionId)\r\n return false\r\n }\r\n } else {\r\n // the call doesn't exist any longer.\r\n self.ignored = true\r\n // app.writeDebugInfo('>>> NOT EXISTING' + self.actionId)\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n self.unregCall = function () {\r\n if (self.prio !== 'none') {\r\n const _call = app.calls.fullEntry(self.actionId)\r\n if (_call) {\r\n if (_call.data === self.callId) {\r\n // the saved call is 'this' call, so it can be removed now as the call is done.\r\n app.calls.remove(self.actionId)\r\n return true\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n\r\n self.redo = function () {\r\n self.init(self.args, self.contentType, self.dataType)\r\n self.ajax()\r\n }\r\n\r\n self.ajax = function () {\r\n let resp\r\n\r\n if (self.prio !== 'none') {\r\n const _call = app.calls.fullEntry(self.actionId)\r\n if (_call) {\r\n // a call from the same action is already in progress\r\n if (self.prio.toLowerCase() === 'first') {\r\n self.doAlways()\r\n return\r\n } else {\r\n // latest\r\n if (_call) {\r\n // rewrite the id to a new unique id matching only this call (it steals the entry, so the result of the previous call will not have effect)\r\n self.callId = _call.data = _call.data + new Date().toISOString() // results in 'out of memory': 'CALLSEP' + _call.data; //simply doubling the existin key, makes it unique\r\n }\r\n }\r\n } else {\r\n // add the call\r\n app.calls.add(self.callId, self.actionId)\r\n }\r\n }\r\n\r\n // initiate ajax request\r\n self.isPending = true\r\n $.support.cors = true\r\n\r\n $(document).ajaxError(function (event, jqxhr, settings, thrownError) {\r\n // if (settings.url == 'ajax/missing.html') {\r\n $('div.log').text('Triggered ajaxError handler.')\r\n // }\r\n // console.log(event)\r\n // console.log('**********************')\r\n // console.log(jqxhr)\r\n // console.log('**********************')\r\n // console.log(settings)\r\n // console.log('**********************')\r\n // console.log(thrownError)\r\n // console.log('**********************')\r\n const acc = []\r\n $.each(jqxhr, function (index, value) {\r\n acc.push(index + ': ' + value)\r\n })\r\n // console.log('Inside dk-ifshop-loader fail branch ')\r\n // console.log(JSON.stringify(acc))\r\n })\r\n\r\n $.ajax({\r\n url: self.url,\r\n crossDomain: true,\r\n type: self.type,\r\n cache: self.cache,\r\n data: self.data ? self.data : null,\r\n dataType: self.dataType,\r\n contentType: self.contentType,\r\n async: self.args.async === undefined ? true : self.args.async,\r\n xhrFields: {\r\n withCredentials: self.allowCredentials\r\n },\r\n beforeSend: function (xhr) {\r\n // app.writeDebugInfo('>>> BEGIN: ' + self.url);\r\n if (!self.args.externalUrl) {\r\n // avoid null values (will display as \"null\" in the header)\r\n if (app.sessionId == null) app.sessionId = ''\r\n if (app.sessionCounter == null) app.sessionCounter = ''\r\n\r\n // add important headers\r\n xhr.setRequestHeader('ifshop_initial_referrer', app.InitialReferrer)\r\n\r\n // WDK-1666\r\n xhr.setRequestHeader('ifshop_kampagne', app.KampagneCode)\r\n\r\n xhr.setRequestHeader('ifshop_dataversionkey', app.dataVersionKey)\r\n xhr.setRequestHeader('ifshop_sessioncounter', app.sessionCounter)\r\n\r\n const token = self.token ? self.token : ''\r\n xhr.setRequestHeader('ifshop_trustedtoken', token)\r\n\r\n if (self.block) {\r\n app.setBusy(self.actionId, self)\r\n }\r\n window.setTimeout(function () {\r\n if (self.isPending) {\r\n self.spinnerElementId = app.showSpinner(\r\n self.targetElement,\r\n self.noAutoDisable,\r\n self.hiddenSpinner,\r\n self.largeSpinner\r\n )\r\n }\r\n }, 500)\r\n }\r\n }\r\n })\r\n .done(function (data, textStatus, jqXHR) {\r\n // app.writeDebugInfo('>>> DONE: ' + self.url);\r\n self.isPending = false\r\n if (self.response) {\r\n if (self.block) {\r\n app.setNotBusy(self.actionId)\r\n }\r\n return\r\n }\r\n try {\r\n if (this.cache !== true) {\r\n stateManager.initFromLastResponse(jqXHR)\r\n\r\n // WDK-1666\r\n const kampagneCode = stateManager.getKampagne()\r\n if (kampagneCode) {\r\n app.KampagneCode = kampagneCode\r\n }\r\n\r\n const dataVersionKey = stateManager.getDataVersionKey()\r\n if (dataVersionKey) {\r\n app.dataVersionKey = dataVersionKey\r\n }\r\n const sessionCounter = stateManager.getSessionCounter()\r\n if (sessionCounter) {\r\n app.sessionCounter = sessionCounter\r\n }\r\n\r\n const page = stateManager.getPage()\r\n if (page && !app.page) {\r\n app.setPage(page)\r\n }\r\n\r\n const version = jqXHR.getResponseHeader('ifshop_version')\r\n if (version && !app.version) {\r\n app.version = version\r\n }\r\n }\r\n } catch (e) {\r\n // report but ignore. any errors in custom actions should be handled by the custom code (incl. error handling). try is only here to isolate any custom erros from core functionality (no dirt in the arteries)\r\n app.reportFail(e)\r\n }\r\n\r\n // validate prio and forced ignored\r\n if (!self.validatePrio()) {\r\n if (self.onIgnored) {\r\n self.onIgnored(app.extractDataFromResponse(data), textStatus, jqXHR)\r\n }\r\n return\r\n }\r\n\r\n // save response\r\n self.response = data\r\n\r\n if (self.block) {\r\n app.setNotBusy(self.actionId)\r\n }\r\n\r\n // validate if holds a status message\r\n if (app.preValidateMessage(data, self)) {\r\n // if the method returns true, the action should be terminated immediately (error etc.)\r\n return\r\n } else {\r\n resp = app.extractDataFromResponse(data)\r\n }\r\n if (self.actionSettings && self.actionSettings.resolver !== undefined) {\r\n self.actionSettings.resolver()\r\n }\r\n\r\n self.isSuccess = true\r\n\r\n // action passed on as variable to this method object\r\n let _dontContinue = false\r\n if (self.done) {\r\n _dontContinue = self.done(resp, textStatus, jqXHR)\r\n }\r\n // action passed on from initial caller if not blocked by first custom method\r\n if (\r\n _dontContinue !== true &&\r\n self.actionSettings &&\r\n self.actionSettings.done\r\n ) {\r\n _dontContinue = self.actionSettings.done(resp, textStatus, jqXHR)\r\n }\r\n // perform any default action if not blocked explicitely from one of the custom methods\r\n if (_dontContinue !== true) {\r\n app.postValidateMessage(data, self)\r\n }\r\n })\r\n .fail(function (data, textStatus, jqXHR) {\r\n self.isPending = false\r\n if (self.block) {\r\n app.setNotBusy(self.actionId)\r\n }\r\n\r\n // var acc = []\r\n // $.each(jqXHR, function (index, value) {\r\n // acc.push(index + ': ' + value)\r\n // })\r\n // console.log('Inside dk-ifshop-loader fail branch ')\r\n // console.log(JSON.stringify(acc))\r\n\r\n app.onCommunicationFail(data, val)\r\n\r\n // action passed on as variable to this method object\r\n if (self.fail) {\r\n self.fail(resp, textStatus, jqXHR)\r\n }\r\n // action passed on from initial caller\r\n if (self.actionSettings && self.actionSettings.fail) {\r\n self.actionSettings.fail(data, textStatus, jqXHR)\r\n }\r\n let kundeInfo = ''\r\n if (app.root && app.root.Kunde && app.root.Kunde.EnigmaTokenSSN) {\r\n kundeInfo = app.root.Kunde.EnigmaTokenSSN()\r\n }\r\n\r\n h.publish(h.AJAX_FAIL, { data: jqXHR, customerId: kundeInfo })\r\n })\r\n .always(function (data, textStatus, jqXHR) {\r\n self.isPending = false\r\n if (!self.ignored) {\r\n if (self.spinnerElementId) {\r\n app.hideSpinner(\r\n $(h.getElm(self.spinnerElementId)),\r\n self.noAutoDisable\r\n )\r\n } else {\r\n app.hideSpinner(self.targetElement, self.noAutoDisable)\r\n }\r\n }\r\n self.doAlways(data, textStatus, jqXHR)\r\n // cleanup prio info (if any)\r\n self.unregCall()\r\n })\r\n }\r\n\r\n if (self.init(val, contentType, dataType)) {\r\n self.ajax()\r\n return self\r\n }\r\n}\r\n\r\n// simple version of WebShopLoader\r\nfunction SimpleJsonSender (val) {\r\n const self = this\r\n if (!app.shopHostUrl) {\r\n console.log('log_url not initated at this point, cancelling logging.')\r\n return\r\n }\r\n self.url = app.shopHostUrl + val.url\r\n\r\n self.data = JSON.stringify(val.data)\r\n self.done = val.done\r\n self.always = val.always\r\n self.fail = val.fail\r\n self.ajax = function () {\r\n $.ajax({\r\n url: self.url,\r\n type: 'post',\r\n data: self.data,\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n xhrFields: {\r\n withCredentials: true\r\n }\r\n }).fail(function (data, textStatus, jqXHR) {\r\n // currently ignored because SimpleJsonSender is currently only used to send client exception info to the mvc (so if that fails too, what else to do?!)\r\n })\r\n }\r\n self.ajax()\r\n return self\r\n}\r\n\r\n// holds hjaelpe/fejl messages (Used from webShopApplication)\r\nfunction webShopMessage (kort, lang) {\r\n return {\r\n kort,\r\n lang\r\n }\r\n}\r\n\r\nexport { SimpleJsonSender, WebShopLoader, webShopMessage }\r\n","import { h } from './dk-ifshop-helper'\r\nimport { WebShopCollection } from './dk-ifshop-dictionary'\r\n\r\nfunction Model () {\r\n let self = this\r\n self.inherit = function (child) {\r\n // called by inheriter\r\n self = child\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n if (actionSettings && actionSettings.done) {\r\n actionSettings.done()\r\n }\r\n }\r\n\r\n // SYNC (Read from server)\r\n self.sync = function (actionSettings) {\r\n if (actionSettings && actionSettings.done) {\r\n actionSettings.done()\r\n }\r\n }\r\n\r\n // CLEAR\r\n self.clear = function () {\r\n self.update({})\r\n }\r\n\r\n // SAVE (write to server)\r\n self.save = function (val) {\r\n /* abstract */\r\n }\r\n\r\n self.hasChanged = false\r\n self.UpdateHasChangedFlag = function (property, value, name) {\r\n if (value != self.prev(name)) {\r\n self.hasChanged = true\r\n }\r\n }\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n self.koMap = function (val, orig, def, name, ignoreZero, defaultUndefined) {\r\n if (name) {\r\n return h.koMap(\r\n val,\r\n orig,\r\n def,\r\n self.validateProperty,\r\n self.recordPrevValue,\r\n name,\r\n ignoreZero,\r\n defaultUndefined\r\n )\r\n } else {\r\n return h.koMap(\r\n val,\r\n orig,\r\n def,\r\n null,\r\n null,\r\n null,\r\n ignoreZero,\r\n defaultUndefined\r\n )\r\n }\r\n }\r\n\r\n self.prevValues = new WebShopCollection()\r\n self.recordPrevValue = function (property, value, name) {\r\n // records the old value, before it is changed\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n }\r\n self.prevValues.addOrUpdate(value, name)\r\n }\r\n\r\n self.prev = function (name) {\r\n if (self.prev) {\r\n return self.prevValues.item(name)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { Model }\r\n","/* global $ ko */\r\n\r\nimport { Model } from './dk-ifshop-model'\r\nimport { app } from './dk-ifshop-application'\r\nimport { basic } from './dk-ifshop-scripts'\r\nimport { getAgeFromBirthDate } from '././cpr/dk-ifshop-cpr'\r\nimport { h } from './dk-ifshop-helper'\r\nimport { isDateReadyforValidation } from './dk-ifshop-dates'\r\nimport { PersonEntities } from './dk-ifshop-constants'\r\n\r\nfunction Person (role) {\r\n const self = this\r\n self.role = role\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n // called when a property changes value (Assigning the same value won't trigger this)\r\n if (value !== self.prev(name)) {\r\n self.hasChanged = true\r\n if (name === 'cpr1' || name === 'cpr2') {\r\n // update full cpr\r\n self.CprNr(self.Cpr1() + self.Cpr2())\r\n\r\n // Remove any block reason since cpr has changed\r\n self.BlockReason('')\r\n if (self.CprNr.hasValidFormat()) {\r\n // baseret på: http://da.wikipedia.org/wiki/CPR-nummer\r\n let addCentury = ''\r\n const cprYear = self.Cpr1().substr(4, 2)\r\n const cprMonth = self.Cpr1().substr(2, 2)\r\n const cprDay = self.Cpr1().substr(0, 2)\r\n\r\n const birthYear = parseInt(cprYear)\r\n const ctrl = parseInt(self.Cpr2().substr(0, 1))\r\n if (\r\n ctrl <= 3 ||\r\n (birthYear > 36 && ctrl === 4) ||\r\n (birthYear > 36 && ctrl === 9)\r\n ) {\r\n // expects 19...\r\n addCentury = '19'\r\n } else if (birthYear >= 58 && ctrl >= 5 && ctrl <= 8) {\r\n // expects 18...\r\n addCentury = '18'\r\n } else {\r\n // expects 20...\r\n addCentury = '20'\r\n }\r\n const birthDate = new Date(\r\n addCentury + cprYear + '-' + cprMonth + '-' + cprDay\r\n )\r\n if (birthDate.getDate()) {\r\n self.Foedselsdato($.format(birthDate, 'dd/MM/yyyy', app.culture))\r\n self.Alder(getAgeFromBirthDate(birthDate))\r\n } else {\r\n self.Alder('')\r\n self.Foedselsdato('')\r\n }\r\n }\r\n } else if (name === 'Address') {\r\n // called when the page loads and you have an address entered\r\n // (this is why you get \"strange\" autocomplete calls here and there)\r\n // also called when entering a new address\r\n app.loadJson({\r\n // code: code,\r\n url: 'https://dawa.aws.dk/adresser/autocomplete?q=' + self.Address(),\r\n contentType: '',\r\n externalUrl: true,\r\n type: 'get',\r\n allowCredentials: false,\r\n done: function (data, textStatus, jqXHR) {\r\n if ($.type(data) === 'array') {\r\n if (data.length === 1) {\r\n self.Postnr(data[0].adresse.postnr)\r\n self.By(data[0].adresse.postnrnavn)\r\n self.Gade(data[0].adresse.vejnavn)\r\n self.Husnr(data[0].adresse.husnr)\r\n self.Etage(\r\n data[0].adresse.etage === '' ? null : data[0].adresse.etage\r\n )\r\n self.SideDoerNr(\r\n data[0].adresse.dør === '' ? null : data[0].adresse.dør\r\n )\r\n if (data.data.x && data.data.y) {\r\n const longitude = data.data.x\r\n const latitude = data.data.y\r\n self.model.Latitude(latitude)\r\n self.model.Longitude(longitude)\r\n }\r\n }\r\n }\r\n }\r\n })\r\n } else if (name === 'Postnr') {\r\n if (self.Address() === undefined || self.Address() === '') {\r\n self.SideDoerNr('')\r\n self.Etage('')\r\n self.Husnr('')\r\n self.Gade('')\r\n self.By('')\r\n }\r\n } else if (name === 'Foedselsdato') {\r\n self.updateCprAndAlderWithFoedselsdato(value)\r\n } else if (name === 'Alder') {\r\n if (self.Foedselsdato()) {\r\n // validate if the birthdate reflects the same age. if not. Clear the birthdate.\r\n const parsedBirthDate = $.parseDate(\r\n self.Foedselsdato(),\r\n null,\r\n app.culture\r\n )\r\n const age = getAgeFromBirthDate(parsedBirthDate)\r\n if (age != value) {\r\n self.Foedselsdato('')\r\n }\r\n }\r\n } else if (name === 'Fornavn') {\r\n if (value && value.charAt(0).toUpperCase() != value.charAt(0)) {\r\n self.Fornavn(h.capitaliseFirstLetter(value))\r\n }\r\n } else if (name === 'Efternavn') {\r\n if (value && value.charAt(0).toUpperCase() != value.charAt(0)) {\r\n self.Efternavn(h.capitaliseFirstLetter(value))\r\n }\r\n } else if (name === 'Gade') {\r\n if (value && value.charAt(0).toUpperCase() != value.charAt(0)) {\r\n self.Gade(h.capitaliseFirstLetter(value))\r\n }\r\n } else if (name === 'BankRegNr') {\r\n self.BankKontoNr('')\r\n }\r\n }\r\n }\r\n\r\n self.updateCprAndAlderWithFoedselsdato = function (value) {\r\n if (isDateReadyforValidation(value)) {\r\n const birthDate = $.parseDate(value, null, app.culture)\r\n if (birthDate) {\r\n const sixChrDate = $.format(birthDate, 'ddMMyy', app.culture)\r\n if (sixChrDate !== self.Cpr1()) {\r\n // ensure Cpr2 is reset first to not trigger validateProprty forever (if Cpr2 is set)\r\n self.Cpr2('')\r\n self.Cpr1(sixChrDate)\r\n }\r\n const age = getAgeFromBirthDate(birthDate)\r\n self.Alder(age)\r\n }\r\n }\r\n }\r\n\r\n self.init = function (data) {\r\n const val = data || {}\r\n self.isInit = true\r\n\r\n self.CancellationConsentNeeded = self.koMap(val.CancellationConsentNeeded, self.CancellationConsentNeeded)\r\n self.CoInsuredCancellationConsentNeeded = self.koMap(val.CoInsuredCancellationConsentNeeded, self.CoInsuredCancellationConsentNeeded)\r\n\r\n self.Latitude = self.koMap(val.Latitude, self.Latitude, '', 'Latitude')\r\n self.Longitude = self.koMap(val.Longitude, self.Longitude, '', 'Longitude')\r\n\r\n self.CancellationConsent = self.koMap(val.CancellationConsent, self.CancellationConsent, false, 'CancellationConsent')\r\n self.CancellationCoInsuredPowerOfAttorneyConsent = self.koMap(val.CancellationCoInsuredPowerOfAttorneyConsent, self.CancellationCoInsuredPowerOfAttorneyConsent, false, 'CancellationCoInsuredPowerOfAttorneyConsent')\r\n\r\n self.AdressChangedDueToAuthentication = self.koMap(\r\n val.AdressChangedDueToAuthentication,\r\n self.AdressChangedDueToAuthentication\r\n )\r\n\r\n self.CprChangedDueToAuthentication = self.koMap(\r\n val.CprChangedDueToAuthentication,\r\n self.CprChangedDueToAuthentication\r\n )\r\n\r\n self.UseCustomerAdressForCoInsured = self.koMap(\r\n val.UseCustomerAdressForCoInsured,\r\n self.UseCustomerAdressForCoInsured)\r\n\r\n self.Id = self.koMap(val.Id, self.Id)\r\n self.Fornavn = self.koMap(val.Fornavn, self.Fornavn, null, 'Fornavn')\r\n self.Efternavn = self.koMap(\r\n val.Efternavn,\r\n self.Efternavn,\r\n null,\r\n 'Efternavn'\r\n )\r\n\r\n self.EnigmaTokenSSN = self.koMap(val.EnigmaTokenSSN, self.EnigmaTokenSSN, '', 'EnigmaTokenSSN')\r\n self.EnigmaTokenEmail = self.koMap(val.EnigmaTokenEmail, self.EnigmaTokenEmail, '', 'EnigmaTokenEmail')\r\n self.EnigmaTokenPhone = self.koMap(val.EnigmaTokenPhone, self.EnigmaTokenPhone, '', 'EnigmaTokenPhone')\r\n self.EnigmaTokenFirstName = self.koMap(val.EnigmaTokenFirstName, self.EnigmaTokenFirstName, '', 'EnigmaTokenFirstName')\r\n self.EnigmaTokenLastName = self.koMap(val.EnigmaTokenLastName, self.EnigmaTokenLastName, '', 'EnigmaTokenLastName')\r\n self.EnigmaTokenAdress = self.koMap(val.EnigmaTokenAdress, self.EnigmaTokenAdress, '', 'EnigmaTokenAdress')\r\n\r\n // address fields. Due to validation they must be intialized in the given order\r\n self.Postnr = self.koMap(val.Postnr, self.Postnr, null, 'Postnr', true)\r\n self.By = self.koMap(val.By, self.By, null, 'By')\r\n self.Gade = self.koMap(val.Gade, self.Gade, null, 'Gade')\r\n self.Husnr = self.koMap(val.Husnr, self.Husnr)\r\n self.Etage = self.koMap(val.Etage, self.Etage)\r\n self.SideDoerNr = self.koMap(val.SideDoerNr, self.SideDoerNr)\r\n self.Address = ko.computed(function () {\r\n return h.addressSingleLine(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr(), self.Postnr(), self.By())\r\n })\r\n\r\n self.AddressLine1 = ko.computed(function () {\r\n return h.addressLine1(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr())\r\n })\r\n\r\n self.AddressLine2 = ko.computed(function () {\r\n return h.addressLine2(self.Postnr(), self.By())\r\n })\r\n\r\n self.AddressSingleLine = ko.computed(function () {\r\n return h.addressSingleLine(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr(), self.Postnr(), self.By())\r\n })\r\n\r\n self.BlockReason = self.koMap(\r\n val.BlockReason,\r\n self.BlockReason,\r\n '',\r\n 'BlockReason'\r\n )\r\n\r\n self.LoggedInUserMessage = ko.computed(function () {\r\n let message\r\n\r\n if (self.role == PersonEntities.Kunde && !self.Fornavn() && !self.Efternavn()) {\r\n message = 'Du er logget ind'\r\n } else if (self.role == PersonEntities.Kunde && self.Fornavn() && self.Efternavn()) {\r\n message = `Du er logget ind som ${self.Fornavn()} ${self.Efternavn()} `\r\n } else {\r\n message = ''\r\n }\r\n return message\r\n })\r\n\r\n self.MobilNr = self.koMap(val.MobilNr, self.MobilNr, '', 'MobilNr')\r\n self.InitialMobilNr = val.MobilNr\r\n self.EmailAdr = self.koMap(val.EmailAdr, self.EmailAdr, '', 'EmailAdr')\r\n self.InitialEmailAdr = val.EmailAdr\r\n self.PBS = self.koMap(val.PBS, self.PBS, '', 'PBS')\r\n\r\n let cpr1 = ''\r\n let cpr2 = ''\r\n\r\n if (val.CprNr && val.CprNr.length >= 6) {\r\n cpr1 = val.CprNr.substring(0, 6)\r\n }\r\n\r\n if (val.CprNr && val.CprNr.length >= 6) {\r\n cpr2 = val.CprNr.substring(6)\r\n }\r\n\r\n self.CprNr = self\r\n .koMap(val.CprNr, self.CprNr)\r\n .extend({ validateFormat: /^\\d{10}$/ })\r\n\r\n self.Cpr1 = self\r\n .koMap(cpr1, self.Cpr1, null, 'cpr1')\r\n .extend({ validateFormat: /^\\d{6}$/ })\r\n self.Cpr2 = self\r\n .koMap(cpr2, self.Cpr2, null, 'cpr2')\r\n .extend({ validateFormat: /^\\d{4}$/ })\r\n\r\n if (!val.Alder && self.CprNr().length === 10) {\r\n // do nothing, date is set by cpr\r\n } else {\r\n self.Alder = self.koMap(val.Alder, self.Alder, null, 'Alder', true)\r\n }\r\n let date\r\n if (val.FoedselsdatoShortStr) {\r\n date = h.getJSONStringDate(val.FoedselsdatoShortStr)\r\n self.Foedselsdato = self.koMap(\r\n date,\r\n self.Foedselsdato,\r\n null,\r\n 'Foedselsdato',\r\n true\r\n ) // birthdate must be set 'after' cpr1 and age due to code in method validateProperty . overrides Alder\r\n self.updateCprAndAlderWithFoedselsdato(date)\r\n } else if (self.CprNr().length === 10) {\r\n // do nothing, date is set by cpr\r\n } else {\r\n // Foedselsdato == undefined\r\n self.Foedselsdato = self.koMap(\r\n date,\r\n self.Foedselsdato,\r\n null,\r\n 'Foedselsdato',\r\n true\r\n )\r\n }\r\n\r\n self.HarFaaetHjaelpAf = self.koMap(\r\n val.HarFaaetHjaelpAf,\r\n self.HarFaaetHjaelpAf\r\n )\r\n self.MarketingMail = self.koMap(\r\n val.MarketingMail,\r\n self.MarketingMail,\r\n false\r\n )\r\n self.MarketingSMS = self.koMap(val.MarketingSMS, self.MarketingSMS, false)\r\n self.AccepterMarketing = self.koMap(\r\n val.AccepterMarketing,\r\n self.AccepterMarketing,\r\n ''\r\n )\r\n\r\n self.TidligereSelskab = self.koMap(\r\n val.TidligereSelskab,\r\n self.TidligereSelskab\r\n )\r\n\r\n self.TidligerePoliceNr = self.koMap(\r\n val.TidligerePoliceNr,\r\n self.TidligerePoliceNr\r\n )\r\n\r\n // banking fields. Due to validation they must be intialized in the given order\r\n self.BankRegNr = self.koMap(\r\n val.BankRegNr,\r\n self.BankRegNr,\r\n null,\r\n 'BankRegNr'\r\n )\r\n self.BankKontoNr = self.koMap(\r\n val.BankKontoNr,\r\n self.BankKontoNr,\r\n null,\r\n 'BankKontoNr'\r\n )\r\n\r\n self.BetalMaanedligt = self.koMap(\r\n val.BetalMaanedligt,\r\n self.BetalMaanedligt,\r\n true\r\n )\r\n\r\n self.IsMedforsikret = self.koMap(val.IsMedforsikret, self.IsMedforsikret, false, 'IsMedforsikret')\r\n\r\n // computed observables\r\n self.BetalingsintervalStr = ko.computed(function () {\r\n if (self.BetalMaanedligt() === true) {\r\n return app.getHjaelpeKodeText(\r\n 'CLIENT-BETALINGSINTERVAL-MAANEDLIGT',\r\n 'Månedligt'\r\n )\r\n } else {\r\n return app.getHjaelpeKodeText(\r\n 'CLIENT-BETALINGSINTERVAL-AARLIGT',\r\n 'Årligt'\r\n )\r\n }\r\n }, self)\r\n\r\n self.ShowPurchaseBlockedMessage = ko.computed(function () {\r\n return self.BlockReason() === 'Blocked'\r\n }, self)\r\n\r\n self.HouseAddressIsComplete = ko.computed(function () {\r\n const housePrereqs = self.Gade() && self.Husnr() && self.Postnr() && self.By()\r\n return housePrereqs\r\n }, self)\r\n\r\n self.isInit = false\r\n }\r\n\r\n self.init()\r\n\r\n // SYNC\r\n self.sync = function () {\r\n app.loadJson({\r\n url: 'tilbud/syncperson',\r\n data: '{ \"id\" : \"' + (self.Id() || '0') + '\" }',\r\n allowCredentials: true,\r\n done: function (result) {\r\n self.update(result)\r\n }\r\n })\r\n }\r\n\r\n self.GetEnigmaFormattedObject = function (data) {\r\n return {\r\n Age: data.Alder,\r\n EnigmaTokenSSN: data.EnigmaTokenSSN,\r\n EnigmaTokenAdress: data.EnigmaTokenAdress,\r\n EnigmaTokenEmail: data.EnigmaTokenEmail,\r\n EnigmaTokenFirstName: data.EnigmaTokenFirstName,\r\n EnigmaTokenLastName: data.EnigmaTokenLastName,\r\n EnigmaTokenPhone: data.EnigmaTokenPhone\r\n }\r\n }\r\n\r\n self.CallPushUpdate = function () {\r\n if (window.ifws_expectRecaptcha === 'true') {\r\n self.callPushUpdateAwaitGrecaptcha()\r\n } else {\r\n self.PushUpdate('').then(data => {\r\n if (data.Updated) {\r\n const shouldBeregn = app.root.Disv() // this will only work if details view is rendered\r\n const enigmaObject = self.GetEnigmaFormattedObject(data.Data)\r\n h.publish(h.CUSTOMER_UPDATE_ENIGMA, enigmaObject)\r\n self.update(data.Data)\r\n if (shouldBeregn && app.page != 'front' && app.wizard && app.wizard.currentStepNo > 1) {\r\n app.root.activeProduct.beregn()\r\n }\r\n }\r\n }).catch(error => {\r\n if (error.data) {\r\n self.UpdateFailure(error.data.Message.TekstKode)\r\n } else {\r\n basic.showContactPanel()\r\n }\r\n })\r\n }\r\n }\r\n\r\n self.PushUpdateSuccessHandler = function (data, shouldBeregn) {\r\n if (self.role == PersonEntities.Kunde) {\r\n const enigmaObject = self.GetEnigmaFormattedObject(data.Data)\r\n h.publish(h.CUSTOMER_UPDATE_ENIGMA, enigmaObject)\r\n }\r\n self.update(data.Data)\r\n\r\n const validStep = app.page != 'front' && app.wizard && app.wizard.currentStepNo > 1\r\n\r\n if (shouldBeregn && validStep) {\r\n app.root.activeProduct.beregn()\r\n }\r\n }\r\n\r\n self.callPushUpdateAwaitGrecaptcha = function (recalculatePrice) {\r\n let action = ''\r\n if (self.role == PersonEntities.Kunde) {\r\n action = 'pushupdate'\r\n } else if (self.role == PersonEntities.Medforsikret) {\r\n action = 'pushupdatecoinsured'\r\n }\r\n // eslint-disable-next-line no-prototype-builtins\r\n if (window.hasOwnProperty('grecaptcha')) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action }).then(function (token) {\r\n self.PushUpdate(token, recalculatePrice).catch(error => {\r\n if (error.data) {\r\n self.UpdateFailure(error.data.Message.TekstKode)\r\n } else {\r\n basic.showContactPanel()\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n setTimeout(() => { self.callPushUpdateAwaitGrecaptcha() }, 250)\r\n }\r\n }\r\n\r\n // will only push state that we have not handle incoming state from server\r\n self.PushUpdate = function (token, recalculatePrice) {\r\n let url = ''\r\n\r\n if (self.role == PersonEntities.Kunde) {\r\n url = 'tilbud/UpdateCustomer'\r\n } else if (self.role == PersonEntities.Medforsikret) {\r\n url = 'tilbud/UpdateCoinsured'\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n if (self.role != PersonEntities.Kunde && self.role != PersonEntities.Medforsikret) {\r\n reject(Error('Invalid role'))\r\n }\r\n\r\n const personData = self.JSON()\r\n app.loadJson({\r\n url,\r\n token,\r\n data: personData,\r\n allowCredentials: true,\r\n done: function (result, textStatus, jqXHR) {\r\n if (result.Updated) {\r\n if (result.UpdatedTilbud && result.UpdatedActiveProduct) {\r\n app.root.update(result.UpdatedTilbud)\r\n app.root.activeProduct.update(result.UpdatedActiveProduct)\r\n }\r\n self.PushUpdateSuccessHandler(result, recalculatePrice)\r\n }\r\n resolve(result)\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n reject(new Error(data))\r\n },\r\n fail: function (data, textStatus, jqXHR) {\r\n reject(new Error(data))\r\n }\r\n })\r\n })\r\n }\r\n\r\n self.UpdateFailure = function (textCode) {\r\n const message = 'Ukendt fejl'\r\n // Get some clever error messages from texts\r\n // message = app.getHjaelpeKodeText('CLIENT-Cannot-Add-More-Of-ProductType', 'Du kan ikke tilføje flere forsikringer af denne type.')\r\n app.showMessage(message)\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(val)\r\n }\r\n }\r\n\r\n // todo: investigate intent of previous state of code,\r\n // are we causing any harm by returning, the actual values ?\r\n self.JSONFilter = function (key, value) {\r\n if (key === 'Foedselsdato') {\r\n return $.format(value, 'yyyy-MM-dd', app.culture)\r\n }\r\n return value\r\n }\r\n\r\n self.JSON = function () {\r\n return ko.toJSON(self, self.JSONFilter)\r\n }\r\n}\r\n\r\nexport { Person }\r\n","/* global ko $ */\r\n\r\nimport { Model } from './dk-ifshop-model'\r\nimport { WebShopCollection } from './dk-ifshop-dictionary'\r\nimport { app } from './dk-ifshop-application'\r\nimport { basic } from './dk-ifshop-scripts'\r\nimport { h } from './dk-ifshop-helper'\r\nimport { updateCheckbox } from './dk-ifshop-controls-radioAndCheckbox'\r\n\r\nfunction ProduktType () {\r\n const self = this\r\n self.Navn = ''\r\n}\r\n\r\nconst ifwsPriser = new WebShopCollection() // prices for the possible dækninger\r\n\r\nfunction Produkt () {\r\n let self = this\r\n self.base = new Model()\r\n self.inherit = function (child) {\r\n self.base.inherit(child)\r\n self = child\r\n self.produktNavn = ''\r\n self.showAnbefaletInUI = false\r\n if (!self.Daekning) {\r\n self.Daekning = h.koMap(new Praemie(self)) // dækning chosen by the user\r\n }\r\n self.Praemier = ko.observableArray([]) // possible dækninger\r\n\r\n self.validateProduktProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n self.produktInit = function (\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState,\r\n OCHConsentGiven,\r\n EDIConsentGiven) {\r\n self.ReberegnMaxValue = 100\r\n self.ReberegnCounter = 0\r\n\r\n self.CPState = self.koMap(CPState, self.CPState)\r\n // When switching between products in checkout\r\n // we subscribe to this so we can see when product changes\r\n // we cant use app.activeProduct.productID because the reference changes,\r\n // so we don't get notified on change\r\n\r\n if (!window.app.activeProductId) {\r\n window.app.activeProductId = self.koMap(ProduktID, self.ProduktID)\r\n } else {\r\n window.app.activeProductId(ProduktID)\r\n }\r\n\r\n self.UniqueId = self.koMap(UniqueId, self.UniqueId)\r\n self.ProduktID = self.koMap(ProduktID, self.ProduktID)\r\n self.OCHConsentGiven = self.koMap(OCHConsentGiven, self.OCHConsentGiven, false, 'OCHConsentGiven')\r\n self.EDIConsentGiven = self.koMap(EDIConsentGiven, self.EDIConsentGiven, false, 'EDIConsentGiven')\r\n\r\n self.HarTidligereSelskab = self.koMap(\r\n HarTidligereSelskab,\r\n self.HarTidligereSelskab,\r\n false,\r\n 'HarTidligereSelskab'\r\n )\r\n self.TidligereSelskab = self.koMap(\r\n TidligereSelskab,\r\n self.TidligereSelskab,\r\n '',\r\n 'TidligereSelskab'\r\n )\r\n\r\n self.TidligereSelskabNavn = self.koMap(\r\n TidligereSelskabNavn,\r\n self.TidligereSelskabNavn,\r\n '',\r\n 'TidligereSelskabNavn'\r\n )\r\n\r\n self.opsigelseMaanedVedEj = self.koMap(\r\n opsigelseMaanedVedEj,\r\n self.opsigelseMaanedVedEj,\r\n false,\r\n 'opsigelseMaanedVedEj'\r\n )\r\n self.TidligerePoliceNr = self.koMap(\r\n TidligerePoliceNr,\r\n self.TidligerePoliceNr,\r\n '',\r\n 'TidligerePoliceNr'\r\n )\r\n self.OpsigelseType = self.koMap(\r\n OpsigelseType,\r\n self.OpsigelseType,\r\n '',\r\n 'OpsigelseType'\r\n )\r\n self.StartDateType = self.koMap(\r\n StartDateType,\r\n self.StartDateType,\r\n '',\r\n 'StartDateType'\r\n )\r\n self.OpsigelsesMaaned = self.koMap(\r\n OpsigelsesMaaned,\r\n self.OpsigelsesMaaned,\r\n '',\r\n 'OpsigelsesMaaned'\r\n )\r\n self.UnderwritingAccept = self.koMap(\r\n UnderwritingAccept,\r\n self.UnderwritingAccept,\r\n '',\r\n 'UnderwritingAccept'\r\n )\r\n let _date\r\n if (IkraftDato) {\r\n _date = h.getJSONStringDate(IkraftDato)\r\n }\r\n self.IkraftDato = self.koMap(\r\n _date,\r\n self.IkraftDato,\r\n null,\r\n 'IkraftDato',\r\n true\r\n )\r\n\r\n self.SelectedDaekningId = self.koMap(SelectedDaekningId, self.SelectedDaekningId, '', 'SelectedDaekningId')\r\n self.ShowIkraftDatoNoteForkortet = ko.computed(function () {\r\n return Number(self.OpsigelseType()) === Number(h.OPSIGELSE_HURTIGST)\r\n })\r\n self.ShowIkraftDatoNoteVedIkkeMaaned = ko.computed(function () {\r\n return Number(self.OpsigelseType()) !== Number(h.OPSIGELSE_HURTIGST) &&\r\n Number(self.OpsigelsesMaaned()) === 0 && self.opsigelseMaanedVedEj() === true\r\n })\r\n self.ShowCancellationMonth = ko.computed(function () {\r\n return (\r\n self.HarTidligereSelskab() === true &&\r\n ((Number(self.OpsigelseType()) === 1 && self.opsigelseMaanedVedEj() === false) ||\r\n Number(self.StartDateType()) === 2)\r\n )\r\n })\r\n self.ShowStartDateMonth = ko.computed(function () {\r\n return (self.HarTidligereSelskab() === false && Number(self.StartDateType()) === 2)\r\n })\r\n self.HasSelectedExistingInsuranceFlag = ko.computed(function () {\r\n return self.HarTidligereSelskab()\r\n })\r\n self.IkraftDatoStr = ko.computed(function () {\r\n if (\r\n self.IkraftDato &&\r\n (self.OpsigelseType() !== '' || self.StartDateType() !== '')\r\n ) {\r\n let _date = self.IkraftDato()\r\n if (_date) {\r\n // if date is a string, transform it to date\r\n _date = new Date(h.correctStringDate(_date))\r\n // get date with weekname first\r\n let _str = $.format(_date, 'dddd d. MMMM yyyy', app.culture)\r\n // capitalize first letter\r\n _str = _str.charAt(0).toUpperCase() + _str.slice(1)\r\n return _str\r\n }\r\n return ''\r\n }\r\n }, self)\r\n\r\n self.TotalPremiumMonthly = ko.computed(function () {\r\n const premium = Math.ceil(self.Daekning().MdEfterNettoPremieTotal()).toLocaleString()\r\n return premium.replace('.', ',') + ' kr.'\r\n })\r\n\r\n self.TotalPremiumYearly = ko.computed(function () {\r\n const premium = Math.ceil(self.Daekning().NettoPraemieTotal()).toLocaleString()\r\n return premium.replace('.', ',') + ' kr.'\r\n })\r\n\r\n self.EnglishName = self.koMap(EnglishName, self.EnglishName)\r\n }\r\n\r\n self.activeBeregningsKey = ''\r\n self.pendingBeregn = 0\r\n\r\n self.daekningsSubscriptions = []\r\n\r\n self.disposeDaekningsSubscriptions = function () {\r\n for (let i = 0; i < self.daekningsSubscriptions.length; i++) {\r\n self.daekningsSubscriptions[i].dispose()\r\n }\r\n self.daekningsSubscriptions = []\r\n }\r\n\r\n self.HentPriser = function (actionSettings) {\r\n actionSettings.onlyFetch = true\r\n return self.beregn(actionSettings)\r\n }\r\n\r\n self.beregn = function (actionSettings) {\r\n if (!actionSettings) {\r\n actionSettings = {}\r\n }\r\n try {\r\n const key = self.getBeregningsKey() + '-' + app.root.Kunde().CprNr()\r\n const hasPendingBeregn = self.pendingBeregn === 0 && !app.root.syncInitiated\r\n\r\n self.activeBeregningsKey = key\r\n app.setPendingUserAction('beregn')\r\n\r\n const delay = hasPendingBeregn ? 0 : 200\r\n\r\n if (self.pendingBeregn >= 2 && self.timeoutId) {\r\n clearTimeout(self.timeoutId)\r\n self.timeoutId = 0\r\n self.pendingBeregn--\r\n }\r\n\r\n self.pendingBeregn++\r\n\r\n self.timeoutId = setTimeout(function () {\r\n self.HentPriserViaServer(actionSettings, key)\r\n }, delay) // timeout to avoid memory overload due to too many recalculations when the criterias are rapidly changed\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.beregnOnChange = function (newValue, previousValue) {\r\n if (newValue === undefined) {\r\n return\r\n }\r\n\r\n if (isNaN(newValue) || isNaN(previousValue)) {\r\n if (newValue != previousValue) {\r\n self.beregn()\r\n }\r\n } else {\r\n if (Number(newValue) !== Number(previousValue)) {\r\n self.beregn()\r\n }\r\n }\r\n }\r\n\r\n self.PublishGTMPriceChange = function (activeProduct) {\r\n if (activeProduct && activeProduct.ProduktID()) {\r\n const data = this.CreateData(activeProduct)\r\n h.publish(h.PRICE_CHANGING, data)\r\n }\r\n }\r\n\r\n self.CreateData = function (activeProduct) {\r\n let coverage = ''\r\n let price = ''\r\n let uniqueId = ''\r\n let productId = ''\r\n if (activeProduct && activeProduct.UniqueId) {\r\n uniqueId = activeProduct.UniqueId()\r\n }\r\n if (activeProduct && activeProduct.ProduktID) {\r\n productId = activeProduct.ProduktID()\r\n }\r\n if (activeProduct.Daekning && activeProduct.Daekning()) {\r\n price = activeProduct.Daekning().NettoPraemieTotal()\r\n coverage = activeProduct.Daekning().SamletTitel()\r\n }\r\n\r\n let mileage = ''\r\n if (activeProduct.produktNavn === 'bil') {\r\n mileage = activeProduct.KmAArlig()\r\n }\r\n\r\n let coveredAmount = ''\r\n switch (activeProduct.produktNavn) {\r\n case 'liv':\r\n {\r\n coveredAmount = activeProduct.UddannelsesNiveau()\r\n break\r\n }\r\n case 'ulykke': {\r\n coveredAmount = (parseInt(activeProduct.InvaliditetSum()) + parseInt(activeProduct.DoedsfaldSum())).toString()\r\n break\r\n }\r\n case 'mc': {\r\n coveredAmount = activeProduct.BagageboxSum()\r\n break\r\n }\r\n case 'familie': {\r\n coveredAmount = activeProduct.IndboSum()\r\n break\r\n }\r\n case 'rejse': {\r\n coveredAmount = activeProduct.BagageSum()\r\n break\r\n }\r\n default: {\r\n coveredAmount = ''\r\n break\r\n }\r\n }\r\n\r\n let travelArea = ''\r\n if (activeProduct.produktNavn === 'rejse') {\r\n travelArea = 'Europe'\r\n if (activeProduct.RejseforsikringsOmraade() == 'V') {\r\n travelArea = 'World'\r\n }\r\n }\r\n\r\n let selvrisiko = '0'\r\n if (activeProduct.Selvrisiko) {\r\n selvrisiko = activeProduct.Selvrisiko()\r\n }\r\n\r\n let addons = []\r\n if (activeProduct.Daekning() &&\r\n activeProduct.Daekning().Daekninger()) {\r\n const selectedAddons = activeProduct.Daekning().Daekninger().filter((addon) => addon.Valgt())\r\n addons = selectedAddons.map((addon) => {\r\n return { value: addon.Navn(), price: addon.NettoMdTilvalgsPris() * 12 }\r\n })\r\n }\r\n\r\n const data = {\r\n UniqueId: uniqueId,\r\n priceUpdate: price,\r\n mileageUpdate: mileage,\r\n selvrisikoUpdate: selvrisiko,\r\n coveredAmountUpdate: coveredAmount,\r\n updatedTravelArea: travelArea,\r\n productId,\r\n coverageUpdate: coverage,\r\n insuranceAddonsUpdate: addons,\r\n pageInfo: app.getGTMPageInfo(),\r\n productName: activeProduct.produktNavn\r\n }\r\n return data\r\n }\r\n\r\n self.PriceExists = function (activeProduct) {\r\n if (activeProduct === undefined) {\r\n activeProduct = self\r\n }\r\n if (activeProduct && activeProduct.Daekning) {\r\n return activeProduct.Daekning().NettoPraemieTotal() > 0\r\n }\r\n return false\r\n }\r\n self.PublishGTMPriceChangingEvent = function () {\r\n self.PublishGTMPriceChange(app.root.activeProduct)\r\n }\r\n\r\n self.HandleLocalCorruptPrices = function () {\r\n let corruptedPrices = false\r\n $.each(self.Praemier(), function (key, val) {\r\n if (val.Tilbydes() && val.NettoPraemieTotal() == 0) { // any occurence of an item is offered and price == 0 then Praemier are deemed not ok\r\n corruptedPrices = true\r\n return false\r\n }\r\n })\r\n if (corruptedPrices) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n self.HandleIncomingCorruptPrices = function (data) {\r\n let corruptedPricesIncoming = false\r\n $.each(data, function (key, val) {\r\n const item = self.getPraemie(key, val)\r\n if (item.Tilbydes() && item.NettoPraemieTotal() == 0) { // any occurence of an item is offered and price == 0 then Praemier are deemed not ok\r\n corruptedPricesIncoming = true\r\n return false\r\n }\r\n })\r\n\r\n if (corruptedPricesIncoming) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n function makeBeregnCall (actionSettings, key, token) {\r\n // nothing cached. load from mvc\r\n const query = actionSettings.onlyFetch ? '?onlyFetch=true' : ''\r\n app.loadJson({\r\n url: self.produktNavn + `produkt/beregn${query}`,\r\n data: self.JSON(),\r\n token,\r\n actionId: 'beregn',\r\n actionOnBusy: 'queue',\r\n callId: key,\r\n block: true,\r\n hiddenSpinner: true, // disable ok, but dont show spinner, as spinners are displayed on the prices\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (key !== self.activeBeregningsKey) {\r\n // request outdated (We will not visit the server if newer requests have already lined up for different prices. This is addeed to avoid unnessesary calls to the server and save the calculater process wich can kill the entire environment if it is overheated)\r\n // app.writeDebugInfo('_CANCELLED CALC DONE(' + key + ')');\r\n return\r\n }\r\n\r\n if (!data || !data.length) {\r\n return\r\n }\r\n\r\n if (self.HandleIncomingCorruptPrices(data)) {\r\n if (app.root.activeProduct.ReberegnCounter >= app.root.activeProduct.ReberegnMaxValue) {\r\n app.reportFail('Invalid praemier has occured for more than ', app.root.activeProduct.ReberegnMaxValue)\r\n } else {\r\n app.logInfo('Invalid praemier detected for ', app.root.activeProduct.produktNavn)\r\n setTimeout(() => {\r\n app.root.activeProduct.ReberegnCounter++\r\n self.beregn()\r\n }, 200)\r\n return\r\n }\r\n }\r\n app.root.activeProduct.ReberegnCounter = 0\r\n\r\n // prices loaded from mvc - save to cache and apply\r\n ifwsPriser.add(data, 'beregning' + key)\r\n\r\n if (!actionSettings.onlyFetch) {\r\n self.addPraemier(data)\r\n self.updatePremiesWithAddOnSelection()\r\n self.updateDaekning()\r\n self.updateTilvalg()\r\n }\r\n app.resetPendingUserAction('beregn')\r\n // call custom method to allow for product specific changes to the tilvalg layout\r\n if (self.updateTilvalgCustomSettings) {\r\n self.updateTilvalgCustomSettings()\r\n }\r\n self.PublishGTMPriceChangingEvent()\r\n },\r\n onIgnored: function (data, textStatus, jqXHR) {\r\n if (key !== self.activeBeregningsKey) {\r\n // request outdated (We will not visit the server if newer requests have already lined up for different prices. This is addeed to avoid unnessesary calls to the server and save the calculater process wich can kill the entire environment if it is overheated)\r\n // app.writeDebugInfo('_CANCELLED CALC IGNORE(' + key + ')');\r\n return\r\n }\r\n\r\n // rhough call is ignored because a new request is issued, we still want to save the prices\r\n ifwsPriser.add(data, 'beregning' + key)\r\n },\r\n always: function () {\r\n self.pendingBeregn--\r\n if (!this.ignored && !this.response) {\r\n app.resetPendingUserAction('beregn')\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.HentPriserViaServer = function (actionSettings, key) {\r\n if (key !== self.activeBeregningsKey) {\r\n // request outdated (We will not visit the server if newer requests have already lined up for different prices. This is addeed to avoid unnessesary calls to the server and save the calculater process wich can kill the entire environment if it is overheated)\r\n // app.writeDebugInfo('_CANCELLED CALC(' + key + ')');\r\n return\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const configElement = $('#recaptcha-client-config')\r\n const config = JSON.parse(configElement.html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'beregn' })\r\n .then((token) => makeBeregnCall(actionSettings, key, token))\r\n })\r\n } else {\r\n makeBeregnCall(actionSettings, key)\r\n }\r\n\r\n // display spinners on prices (and remove year prices)\r\n $('.dws-beregnerDaekning').show()\r\n $('.dws-js-daekningBeregnet').hide()\r\n }\r\n\r\n self.getPraemie = function (key, val) {\r\n // can be overwritten by a specific product to support a more special preamie (familie)\r\n const _p = new Praemie(self)\r\n _p.update(val)\r\n return _p\r\n }\r\n\r\n self.addPraemier = function (data) {\r\n // remove all existing dækninger and add the new ones\r\n self.Praemier.removeAll()\r\n $.each(data, function (key, val) {\r\n const _p = self.getPraemie(key, val)\r\n self.Praemier.push(_p)\r\n })\r\n\r\n // test if anything is selected\r\n if (!self.Daekning().Navn()) {\r\n // No dækning is selected\r\n let _done = false\r\n $.each(self.Praemier(), function (key, val) {\r\n if (val.Anbefalet()) {\r\n // select the dækning that is recomended\r\n self.selectDaekning(val.ModelNavn())\r\n _done = true\r\n return false // $.each\r\n }\r\n })\r\n if (_done === false) {\r\n // when none is recomended, select first type that is offered\r\n $.each(self.Praemier(), function (key, val) {\r\n if (val.Tilbydes()) {\r\n // select the dækning that is offered\r\n self.selectDaekning(val.ModelNavn())\r\n _done = true\r\n return false // $.each\r\n }\r\n })\r\n }\r\n }\r\n\r\n // update details about the dækninger displayed\r\n $.each(self.Praemier(), function (index, item) {\r\n // render year/month prices\r\n const _prisId = item.ModelNavn() + '_produkttype_pris'\r\n $(h.getElm(_prisId)).text(item.MdEfterNettoPremieTotalStr())\r\n const _aarsPrisId = 'aars' + item.ModelNavn() + '_produkttype_pris'\r\n $(h.getElm(_aarsPrisId)).text(item.NettoPraemieTotalStr())\r\n\r\n // check if the dækning is anbefalet\r\n const _anbefaletId = item.ModelNavn() + '_anbefalet'\r\n const shouldShow = self.shouldShowAnbefalet(item)\r\n $('#' + _anbefaletId).toggle(shouldShow)\r\n if (shouldShow) {\r\n $('#' + _anbefaletId).parents('.daekningsRamme').addClass('daekning-with-anbefalet')\r\n }\r\n // check if the dækning is at all available\r\n const _panelId = item.ModelNavn() + '_DaekningsPanel'\r\n const _jPanel = $('#' + _panelId)\r\n\r\n // update availability visually (but only if choices are displayed)\r\n if (!item.Tilbydes()) {\r\n // not available. ghost out\r\n _jPanel.find('[id$=_PoliceButton]').css('background-color', '#CFCFCF')\r\n h.disable(_jPanel.find('[id$=_PoliceButton]'))\r\n _jPanel.addClass('daekningTilbydesIkke')\r\n _jPanel.find('.activeDetails').hide()\r\n _jPanel.find('.inactiveDetails').show()\r\n }\r\n\r\n // save a list of tilvalg for listing\r\n if (\r\n item.Daekninger().length > 0 &&\r\n (!self.Tilvalg || self.Tilvalg().length < item.Daekninger().length)\r\n ) {\r\n self.Tilvalg = item.Daekninger // TODO: HACK, skal ikke komme fra een bestemt police\r\n }\r\n })\r\n\r\n // call custom method to allow for product specific changes to the tilvalg layout\r\n if (self.updateTilvalgCustomSettings) {\r\n self.updateTilvalgCustomSettings()\r\n }\r\n\r\n $('.dws-beregnerDaekning').hide()\r\n $('.dws-js-daekningBeregnet').show()\r\n }\r\n\r\n self.shouldShowAnbefalet = function (item) {\r\n return item.Anbefalet() && self.showAnbefaletInUI\r\n }\r\n\r\n self.updatePremiesWithAddOnSelection = function (prefix) {\r\n if (self.Tilvalg) {\r\n const _tilvalg = self.Tilvalg()\r\n const _daekning = self.Daekning()\r\n $.each(_tilvalg, function (index2, tillvalgItem) {\r\n // go trough all tilvalg in the common list\r\n let _isSelectable = false\r\n let _valgt = false\r\n // Get add-on values from selected coverage\r\n $.each(_daekning.Daekninger(), function (index2, daekningItem) {\r\n // go trough the tilvalg under the selected dækning to find the matching tillæg\r\n if (daekningItem.Navn() === tillvalgItem.Navn()) {\r\n // apply the settings from the tilvalg under the selected dækning\r\n _isSelectable = daekningItem.Tilbydes()\r\n _valgt = daekningItem.Valgt()\r\n return false // $.each\r\n }\r\n })\r\n $.each(self.Praemier(), function (pIndex1, pItem) {\r\n $.each(pItem.Daekninger(), function (pAddOnIndex, pAddOnItem) {\r\n if (pAddOnItem.Navn() === tillvalgItem.Navn()) {\r\n if (_isSelectable && pAddOnItem.Tilbydes()) {\r\n pAddOnItem.Valgt(_valgt)\r\n }\r\n return false\r\n }\r\n })\r\n })\r\n })\r\n }\r\n }\r\n\r\n self.updateTilvalg = function (prefix) {\r\n if (self.Tilvalg) {\r\n if (!prefix) prefix = ''\r\n const tilvalg = self.Tilvalg()\r\n const daekning = self.Daekning()\r\n\r\n // render the name of the selected dækning\r\n // this control requires hjælpekoder, so it cant display until they are ready\r\n if (daekning.harTilvalg() === true) {\r\n // Set header title\r\n if (daekning.Navn()) {\r\n h.doOrWait(\r\n app.hjaelpeKoderLoadedFlag,\r\n app,\r\n 'hjaelpeKoderLoaded',\r\n function () {\r\n let txt = app.getHjaelpeKodeText(\r\n 'CLIENT-HEADER-TilvalgTil',\r\n 'Tilvalg til {0}'\r\n )\r\n txt = h.format(txt, daekning.Titel())\r\n $('#tilvalgHeader' + prefix).text(txt)\r\n }\r\n )\r\n }\r\n\r\n $.each(tilvalg, function (indexTilvalg, tilvalgItem) {\r\n // go trough all tilvalg in the common list\r\n let isSelectable = false\r\n let mdPris = 0\r\n let valgt = false\r\n let included = false\r\n let mandatory = false\r\n const tillvalgItemName = tilvalgItem.Navn()\r\n\r\n // find matching item in Deakningar\r\n const matchingDaekning = daekning.Daekninger().filter(function (item) {\r\n return item.Navn() === tillvalgItemName\r\n })\r\n\r\n if (matchingDaekning.length > 0) {\r\n isSelectable = matchingDaekning[0].Tilbydes()\r\n mdPris = matchingDaekning[0].NettoMdTilvalgsPris()\r\n valgt = matchingDaekning[0].Valgt()\r\n included = matchingDaekning[0].Included()\r\n mandatory = matchingDaekning[0].Mandatory()\r\n }\r\n\r\n // From praemier, find addonitems with matching name and select those items\r\n if (isSelectable) {\r\n const allAddonItems = self\r\n .Praemier()\r\n .reduce(function (all, preamieItem) {\r\n return all.concat(preamieItem.Daekninger())\r\n }, [])\r\n\r\n const matchingAddOns = allAddonItems.filter(function (addonItem) {\r\n return (\r\n addonItem.Navn() === tillvalgItemName && addonItem.Tilbydes()\r\n )\r\n })\r\n\r\n matchingAddOns.forEach(function (item) {\r\n item.Valgt(valgt)\r\n })\r\n }\r\n\r\n self.updateAddonElement(\r\n tilvalgItem,\r\n isSelectable,\r\n included,\r\n mandatory,\r\n valgt,\r\n mdPris,\r\n prefix\r\n )\r\n })\r\n if (self.updateTilvalgCustomSettings) {\r\n self.updateTilvalgCustomSettings()\r\n }\r\n\r\n $('#tilvalgGroup').show('blind', 300)\r\n } else {\r\n $('#tilvalgGroup').hide('blind', 300)\r\n }\r\n }\r\n }\r\n\r\n self.updateAddonElement = function (\r\n item,\r\n isSelectable,\r\n included,\r\n mandatory,\r\n selected,\r\n price,\r\n prefix\r\n ) {\r\n const _tilvalgId = item.ModelNavn() + '_tilvalg' + prefix\r\n let _elm = h.getElm(_tilvalgId)\r\n if (_elm) {\r\n _elm.disabled = !isSelectable\r\n const tilvalgsPrisId = item.ModelNavn() + '_tilvalgPris' + prefix\r\n if (isSelectable) {\r\n if (included) {\r\n // the tilvalg is available, but included by standard: show selected, but disable it so the user can't change it\r\n const includedLabel = app.getHjaelpeKodeText(\r\n 'CLIENT-Inkluderet_tilvalg_label',\r\n 'Inkluderet'\r\n )\r\n $(h.getElm(tilvalgsPrisId)).text(includedLabel)\r\n _elm = h.getElm(_tilvalgId)\r\n h.ie8Disabled(_elm, true)\r\n _elm.checked = true\r\n\r\n // show PEDKIA\r\n $(_elm)\r\n .parent()\r\n .parent()\r\n .show()\r\n\r\n updateCheckbox(_elm)\r\n } else {\r\n // the tilvalg is available for the selected dækning\r\n if (price > 0) {\r\n $(h.getElm(tilvalgsPrisId)).html(\r\n '+ ' + h.getPrice(price) + ' kr./md.'\r\n )\r\n $('[data-cy-tilvalg-id=\"' + tilvalgsPrisId + '\"]').attr('data-cy-tilvalg-price', h.getPrice(price))\r\n }\r\n _elm = h.getElm(_tilvalgId)\r\n h.ie8Disabled(_elm, mandatory)\r\n _elm.checked = selected\r\n\r\n // show PEDKIA\r\n $(_elm)\r\n .parent()\r\n .parent()\r\n .show()\r\n\r\n updateCheckbox(_elm)\r\n }\r\n } else {\r\n // disable as the tilvalg is not available under the selected dækning\r\n $(h.getElm(tilvalgsPrisId)).html('+ 0 kr./md.')\r\n $('[data-cy-tilvalg-id=\"' + tilvalgsPrisId + '\"]').attr('data-cy-tilvalg-price', 0)\r\n _elm = h.getElm(_tilvalgId)\r\n h.ie8Disabled(_elm, true)\r\n _elm.checked = false\r\n\r\n // hide PEDKIA\r\n $(_elm)\r\n .parent()\r\n .parent()\r\n .hide()\r\n\r\n updateCheckbox(_elm)\r\n }\r\n }\r\n }\r\n\r\n self.updateDaekning = function (prefix) {\r\n const daekninger = self.Praemier()\r\n const daekning = self.Daekning()\r\n let daekning2\r\n let daekningValgt = false\r\n\r\n $.each(daekninger, function (index, item) {\r\n // find the dækning from the list that matches the one selected by app/user\r\n if (item.Navn() === daekning.Navn() && item.Tilbydes()) {\r\n daekning2 = item\r\n daekningValgt = true\r\n return false // $.each\r\n }\r\n })\r\n\r\n // unselect all displayed dækninger\r\n $('.daekningsType')\r\n .removeClass('daekningValgt')\r\n .addClass('daekningIkkeValgt')\r\n\r\n if (daekningValgt) {\r\n // select the one dækning selected by the app/user\r\n $('#' + self.Daekning().ModelNavn() + '_DaekningsPanel').addClass('daekningValgt')\r\n } else {\r\n $('#' + 'basis' + '_DaekningsPanel').addClass('daekningValgt')\r\n }\r\n\r\n // update text on buttons\r\n h.doOrWait(\r\n app.hjaelpeKoderLoadedFlag,\r\n app,\r\n 'hjaelpeKoderLoaded',\r\n function () {\r\n $('.daekningsType.daekningTilbydesIkke').each(function () {\r\n let name = $(this).find('.produktOverskrift').text()\r\n const name2 = $(this).find('.produktOverskrift2').text()\r\n\r\n if (name2) {\r\n name = name + ' ' + name2\r\n }\r\n\r\n let txt = app.getHjaelpeKodeText('CLIENT-BUTTON-DaekningTilbydesIkke', 'Kan ikke vælges')\r\n txt = h.format(txt, name)\r\n $(this).find('.theme-bg-blue').text(txt)\r\n })\r\n }\r\n )\r\n\r\n if (daekning2) {\r\n // Pass choices from selected dækning to dækning with new prices and replace the object\r\n if (daekning) {\r\n $.each(daekning.Daekninger(), function (indexX, itemX) {\r\n $.each(daekning2.Daekninger(), function (index2, item2) {\r\n if (itemX.Navn() === item2.Navn()) {\r\n item2.Valgt(itemX.Valgt())\r\n return false // $.each\r\n }\r\n })\r\n })\r\n self.SelectedDaekningId(daekning2.ModelNavn())\r\n self.Daekning(daekning2)\r\n self.Daekning().updatePrices()\r\n self.Daekning().updatePriceStrings()\r\n }\r\n\r\n $.each(daekninger, function (index, item) {\r\n item.updatePrices()\r\n item.updatePriceStrings()\r\n })\r\n\r\n // update sliders (if sliders are displayed / step 2)\r\n const jSR = $('#Selvrisiko')\r\n if (jSR.length > 0) {\r\n jSR[0].steps = daekning2.SelvRisici()\r\n\r\n if (jSR[0].steps && jSR[0].steps.length > 0) {\r\n try {\r\n // there is a number of selvrisiko steps possible for the selected dækning\r\n jSR.slider('option', 'max', jSR[0].steps.length - 1)\r\n jSR.slider('value', 0) // force the view refresh, re-setting the current value\r\n jSR.slider('option', 'range', 'min')\r\n\r\n const max = parseInt(\r\n daekning2.SelvRisici()[daekning2.SelvRisici().length - 1]\r\n )\r\n if (max < app.root.activeProduct.Selvrisiko()) {\r\n // ensure that the currently selected selvrisiko step doesnt superseed what is possible for the currently selected dækning (e.g. bil-ansvar max 3000)\r\n app.root.activeProduct.Selvrisiko(max)\r\n } else {\r\n // ensure that the currently selected selvrisiko step isnt below the minimum for the currently selected dækning (e.g. bil-ansvar max 3000)\r\n const min = parseInt(daekning2.SelvRisici()[0])\r\n if (min > app.root.activeProduct.Selvrisiko()) {\r\n app.root.activeProduct.Selvrisiko(min) // may force a new call to beregn (if the selvrisiko changes)\r\n } else {\r\n jSR.slider(\r\n 'value',\r\n jSR[0].revert(jSR[0], this.Selvrisiko())\r\n ) // force the view refresh, re-setting the current value\r\n }\r\n }\r\n\r\n jSR[0].ifslider.UpdateResult(app.root.activeProduct.Selvrisiko())\r\n const disableSelvrisikoSlider = !(\r\n daekning2.SelvRisici() && daekning2.SelvRisici().length > 1\r\n )\r\n jSR.slider('option', 'disabled', disableSelvrisikoSlider)\r\n } catch (e) {\r\n // ignore this, we know it might produce an error \"cannot call methods on slider prior to initialization; attempted to call method 'option'\"\r\n }\r\n } else {\r\n // no selvcrisiko options for the selected dækning\r\n app.root.activeProduct.Selvrisiko(0)\r\n jSR.slider('option', 'disabled', true)\r\n }\r\n } else if (app.root.activeProduct.produktNavn === 'knallert') {\r\n // no slider or select for deductible, set it to the default.\r\n app.root.activeProduct.Selvrisiko(daekning2.DefaultSelvrisiko())\r\n }\r\n }\r\n\r\n if (daekning.Navn() === '') {\r\n return\r\n }\r\n\r\n app.root.activeProduct.sync()\r\n }\r\n\r\n // VALIDATE\r\n self.validateOnServer = function (actionSettings) {\r\n app.loadJson({\r\n url: self.produktNavn + 'produkt/validateprodukt',\r\n data: self.JSON(),\r\n block: false,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n // SAVE\r\n self.save = function (actionSettings) {\r\n //, addToCart) {\r\n // var _addToCart = (addToCart) ? 'true' : 'false';\r\n app.loadJson({\r\n url: self.produktNavn + 'produkt/saveprodukt',\r\n data:\r\n '{\"produkt\" : ' +\r\n self.JSON() +\r\n ', \"tilbud\" : ' +\r\n app.root.JSON() +\r\n ', \"page\" : \"' +\r\n app.page +\r\n '\"}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n self.handleSyncV2SuccessCallback = (data, skipUpdate) => {\r\n if (data.Produkt && !skipUpdate) {\r\n self.update(data.Produkt)\r\n app.bottomDataUpdate(data)\r\n }\r\n if (data.Tilbud) {\r\n app.root.update(data.Tilbud)\r\n self.handleCustomerBenefitLevelChanged(data.Tilbud)\r\n self.handlePriceChangedDueToCpr(data.Tilbud)\r\n app.bottomDataUpdate(data)\r\n }\r\n }\r\n self.handleSyncAddressSuccessCallback = (data) => {\r\n if (data.Produkt) {\r\n self.updateAddress(data.Produkt)\r\n app.bottomDataUpdate(data)\r\n }\r\n }\r\n self.handleSyncV2FailureCallback = (data, skipUpdate) => {\r\n if (data && data.Data && data.Data.Produkt) {\r\n // on fails the data object is not automaticlly substracted and forwarded. It could be a whole different type of object\r\n self.update(data.Data.Produkt)\r\n if (data.Data.Tilbud) {\r\n app.root.update(data.Data.Tilbud)\r\n }\r\n }\r\n }\r\n\r\n self.getJSON = function (product) {\r\n return self.JSON()\r\n }\r\n\r\n // SYNCV2 For testing\r\n self.syncV2 = function (actionSettings, skipUpdate) {\r\n return new Promise((resolve, reject) => {\r\n if (self.pendingBeregn > 0 || app.root.syncInitiated) {\r\n setTimeout(() => {\r\n self.syncV2(actionSettings, skipUpdate)\r\n }, 200)\r\n resolve(true)\r\n return\r\n }\r\n // WDK-2018 - Implementeres her pga special webpart til ulykke barn, men ulykke bar er ikke et get produkt meg egen kontroler og model\r\n let produktNavn = self.produktNavn\r\n if (self.produktNavn.toLowerCase() === 'ulykkebarn') {\r\n produktNavn = 'ulykke'\r\n }\r\n\r\n // WDK-2130\r\n if (self.produktNavn.toLowerCase() === 'borneforsikring') {\r\n produktNavn = 'ulykke'\r\n }\r\n\r\n let endpoint = produktNavn + 'produkt/syncprodukt'\r\n\r\n if (app.wizard == undefined) {\r\n // only called when coming from Open Pages?\r\n endpoint += 'init'\r\n }\r\n\r\n if (app.wizard) {\r\n if (app.page === 'produkt') {\r\n if (app.wizard.currentStepNo === 0) {\r\n // does this happen?\r\n }\r\n if (app.wizard.currentStepNo === 1) {\r\n endpoint += 'entry'\r\n }\r\n if (app.wizard.currentStepNo === 2) {\r\n endpoint += 'coverage'\r\n }\r\n }\r\n\r\n if (app.page === 'checkout') {\r\n // can make this more granular in the future\r\n endpoint += 'checkout'\r\n }\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'syncprodukt' }).then(function (token) {\r\n app.loadJson({\r\n url: endpoint, // produktNavn + 'produkt/syncprodukt',\r\n data:\r\n '{\"produkt\" : ' +\r\n self.getJSON(self) +\r\n ', \"tilbud\" : ' +\r\n app.root.JSON() +\r\n ', \"page\" : \"' +\r\n app.page +\r\n '\"}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n token,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n self.handleSyncV2SuccessCallback(data)\r\n resolve(data)\r\n } else {\r\n reject(new Error('UNIVERSAL_UNKNOWN_ERROR'))\r\n }\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n self.handleSyncV2FailureCallback(data)\r\n resolve(data)\r\n } else {\r\n reject(new Error('UNIVERSAL_UNKNOWN_ERROR'))\r\n }\r\n return true\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n url: endpoint, // produktNavn + 'produkt/syncprodukt',\r\n data:\r\n '{\"produkt\" : ' +\r\n self.JSON() +\r\n ', \"tilbud\" : ' +\r\n app.root.JSON() +\r\n ', \"page\" : \"' +\r\n app.page +\r\n '\"}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n self.handleSyncV2SuccessCallback(data, skipUpdate)\r\n }\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n self.handleSyncV2FailureCallback(data)\r\n resolve(data)\r\n } else {\r\n reject(new Error('UNIVERSAL_UNKNOWN_ERROR'))\r\n }\r\n return true\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n // SYNC\r\n self.sync = function (actionSettings, skipUpdate) {\r\n // console.log('Product Sync app.root.syncInitiated = ', app.root.syncInitiated, ' self.pendingBeregn ', self.pendingBeregn)\r\n if (self.pendingBeregn > 0 || app.root.syncInitiated) {\r\n setTimeout(() => {\r\n self.syncV2(actionSettings, skipUpdate)\r\n }, 200)\r\n return\r\n }\r\n\r\n // WDK-2018 - Implementeres her pga special webpart til ulykke barn, men ulykke bar er ikke et get produkt meg egen kontroler og model\r\n let produktNavn = self.produktNavn\r\n if (self.produktNavn.toLowerCase() === 'ulykkebarn') {\r\n produktNavn = 'ulykke'\r\n }\r\n\r\n // WDK-2130\r\n if (self.produktNavn.toLowerCase() === 'borneforsikring') {\r\n produktNavn = 'ulykke'\r\n }\r\n\r\n let endpoint = produktNavn + 'produkt/syncprodukt'\r\n\r\n if (app.wizard == undefined) {\r\n // only called when coming from Open Pages?\r\n endpoint += 'init'\r\n }\r\n\r\n if (app.wizard) {\r\n if (app.page === 'produkt') {\r\n if (app.wizard.currentStepNo === 0) {\r\n // does this happen?\r\n }\r\n if (app.wizard.currentStepNo === 1) {\r\n endpoint += 'entry'\r\n }\r\n if (app.wizard.currentStepNo === 2) {\r\n endpoint += 'coverage'\r\n }\r\n }\r\n\r\n if (app.page === 'checkout') {\r\n // can make this more granular in the future\r\n endpoint += 'checkout'\r\n }\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'syncprodukt' }).then(function (token) {\r\n app.loadJson({\r\n url: endpoint, // produktNavn + 'produkt/syncprodukt',\r\n data:\r\n '{\"produkt\" : ' +\r\n self.getJSON(self) +\r\n ', \"tilbud\" : ' +\r\n app.root.JSON() +\r\n ', \"page\" : \"' +\r\n app.page +\r\n '\"}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n token,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data.Produkt && !skipUpdate) {\r\n self.update(data.Produkt)\r\n app.bottomDataUpdate(data)\r\n }\r\n if (data.Tilbud) {\r\n app.root.update(data.Tilbud)\r\n self.handleCustomerBenefitLevelChanged(data.Tilbud)\r\n self.handlePriceChangedDueToCpr(data.Tilbud)\r\n app.bottomDataUpdate(data)\r\n }\r\n }\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data && data.Data && data.Data.Produkt) {\r\n // on fails the data object is not automaticlly substracted and forwarded. It could be a whole different type of object\r\n self.update(data.Data.Produkt)\r\n if (data.Data.Tilbud) {\r\n app.root.update(data.Data.Tilbud)\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n url: endpoint, // produktNavn + 'produkt/syncprodukt',\r\n data:\r\n '{\"produkt\" : ' +\r\n self.getJSON(self) +\r\n ', \"tilbud\" : ' +\r\n app.root.JSON() +\r\n ', \"page\" : \"' +\r\n app.page +\r\n '\"}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data.Produkt && !skipUpdate) {\r\n self.update(data.Produkt)\r\n app.bottomDataUpdate(data)\r\n }\r\n if (data.Tilbud) {\r\n app.root.update(data.Tilbud)\r\n self.handleCustomerBenefitLevelChanged(data.Tilbud)\r\n self.handlePriceChangedDueToCpr(data.Tilbud)\r\n app.bottomDataUpdate(data)\r\n }\r\n }\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data && data.Data && data.Data.Produkt) {\r\n // on fails the data object is not automaticlly substracted and forwarded. It could be a whole different type of object\r\n self.update(data.Data.Produkt)\r\n if (data.Data.Tilbud) {\r\n app.root.update(data.Data.Tilbud)\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n })\r\n }\r\n }\r\n\r\n self.getSyncEndpoint = function (produktNavn) {\r\n let endpoint = produktNavn + 'produkt/syncprodukt'\r\n\r\n if (app.wizard == undefined) {\r\n // only from Open Pages?\r\n endpoint += 'init'\r\n }\r\n\r\n if (app.wizard) {\r\n if (app.page === 'produkt') {\r\n if (app.wizard.currentStepNo === 0) {\r\n // never happens?\r\n }\r\n if (app.wizard.currentStepNo === 1) {\r\n endpoint += 'entry'\r\n }\r\n if (app.wizard.currentStepNo === 2) {\r\n endpoint += 'coverage'\r\n }\r\n }\r\n\r\n if (app.page === 'checkout') {\r\n // may need further refinment\r\n // will say 'Bekraeft koeb' when going BACKWARDS to supplerende(?)\r\n endpoint += 'checkout'\r\n }\r\n }\r\n\r\n return endpoint\r\n }\r\n\r\n self.handleCustomerBenefitLevelChanged = function (tilbud) {\r\n if (tilbud && tilbud.ShowDataQlMessage) {\r\n basic.displaySimpleMessage(\r\n undefined,\r\n undefined,\r\n tilbud.DataQlChangedShortMessage,\r\n tilbud.DataQlChangedLongMessage\r\n )\r\n\r\n self.setCustomerBenefitLevelChanged(false)\r\n }\r\n }\r\n\r\n // Only show this message once at a time regardless of how many syncprodukt we run\r\n let showingPriceChangedDueToCprMessage = false\r\n self.handlePriceChangedDueToCpr = function (tilbud) {\r\n if (\r\n tilbud.ShowPriceChangedDueToCPRChangeMessage &&\r\n !showingPriceChangedDueToCprMessage &&\r\n tilbud.Praemie > 0\r\n ) {\r\n const closedMessage = function () {\r\n showingPriceChangedDueToCprMessage = false\r\n }\r\n app.showMessage(\r\n '',\r\n app.getHjaelpeKodeText(\r\n 'CLIENT-PriceChangeCausedByCPRChange',\r\n 'Prisen er genberegnet, fordi du har ændret CPR-nummeret.'\r\n ),\r\n {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-LUK', 'Luk'),\r\n ok: closedMessage,\r\n escape: closedMessage\r\n },\r\n undefined,\r\n false\r\n )\r\n showingPriceChangedDueToCprMessage = true\r\n }\r\n }\r\n\r\n self.setCustomerBenefitLevelChanged = function (val) {\r\n app.loadJson({\r\n url: 'api/cart/customerBenefitLevelChanged/clear',\r\n data: '{ \"customerBenefitLevelChanged\" : \"' + val + '\" }',\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) { },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n throw new Error('customerBenefitLevelChanged clear failed!')\r\n }\r\n })\r\n }\r\n\r\n // LOAD\r\n self.load = function (actionSettings) {\r\n // pause because bil.anvendelse is not set when the sync to server starta\r\n app.loadJson({\r\n url: self.produktNavn + 'produkt/loadprodukt',\r\n data: '{\"id\" : ' + this.ProduktID() + '}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data.Produkt) {\r\n self.update(data.Produkt)\r\n }\r\n if (data.Tilbud) {\r\n app.root.update(data.Tilbud)\r\n }\r\n }\r\n },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n if (data && data.Data && data.Data.Produkt) {\r\n // on fails the data object is not automaticlly substracted and forwarded. It could be a whole different type of object\r\n self.update(data.Data.Produkt)\r\n if (data.Data.Tilbud) {\r\n app.root.update(data.Data.Tilbud)\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n })\r\n }\r\n\r\n self.selectDaekning2 = function (daekning) {\r\n // update model with new selection\r\n self.SelectedDaekningId(daekning.ModelNavn())\r\n self.Daekning(daekning)\r\n self.updatePremiesWithAddOnSelection()\r\n // update graphics and prices on the tilvalg\r\n self.updateDaekning()\r\n self.updateTilvalg()\r\n\r\n // call custom method to allow for product specific changes to the tilvalg layout\r\n if (self.updateTilvalgCustomSettings) {\r\n self.updateTilvalgCustomSettings()\r\n }\r\n\r\n self.PublishGTMPriceChangingEvent()\r\n }\r\n\r\n self.setDaekning = function (type) {\r\n const _daekninger = self.Praemier()\r\n if (_daekninger) {\r\n // find the dækning matching the selection\r\n $.each(_daekninger, function (index, item) {\r\n if (item.ModelNavn() === type && item.Tilbydes()) {\r\n self.selectDaekning2(item)\r\n }\r\n })\r\n }\r\n }\r\n\r\n self.selectDaekning = function (type, actionSettings) {\r\n const _daekninger = self.Praemier()\r\n if (_daekninger) {\r\n // find the dækning matching the selection\r\n $.each(_daekninger, function (index, item) {\r\n if (item.ModelNavn() === type && item.Tilbydes()) {\r\n app.loadJson({\r\n url:\r\n 'produkt/validateDaekningSelection/' +\r\n self.ProduktID() +\r\n '/' +\r\n type,\r\n actionId: 'validateDaekningSelection',\r\n daekning: item,\r\n actionSettings,\r\n targetElement: app.wizard.getCurrentWizardBodyJElement(),\r\n actionOnBusy: 'queue',\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n const loader = this\r\n if (this.response && this.response.Message) {\r\n if (this.response.Message.TekstKode === 'TILBUD-FORTSAET_MED_DELKASKO') {\r\n if (app.root.activeProduct.Daekning().Titel() === 'Delkasko') {\r\n // if Delkasko is already selected, leave\r\n return true\r\n }\r\n\r\n // A message is sent and it must be displayed as a question\r\n app.showQuestion(this.response.Message.LangTekst, '', {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-JA', 'Ja'),\r\n ok: function () {\r\n self.selectDaekning2(loader.args.daekning)\r\n basic.handleBlueBoxForSelectedCoverage(\r\n loader.args.daekning.Navn(),\r\n h.getDisplayTextForBlueBoxForCarCubeDiscount(loader.args.daekning.Navn())\r\n )\r\n },\r\n cancelText: app.getHjaelpeKodeText('CLIENT-BUTTON-NEJ', 'Nej'),\r\n cancel: function () {\r\n // do nothing\r\n basic.handleBlueBoxForSelectedCoverage(\r\n app.root.activeProduct.Daekning().Navn(),\r\n h.getDisplayTextForBlueBoxForCarCubeDiscount(app.root.activeProduct.Daekning().Navn())\r\n )\r\n }\r\n })\r\n return true // don't continue\r\n } else {\r\n // A message is send and it must be displayed as a question\r\n app.showQuestion(this.response.Message.LangTekst, '', {\r\n okText: app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-FORTSAET',\r\n 'Fortsæt'\r\n ),\r\n ok: function () {\r\n self.selectDaekning2(loader.args.daekning)\r\n basic.handleBlueBoxForSelectedCoverage(\r\n loader.args.daekning.Navn(),\r\n h.getDisplayTextForBlueBoxForCarCubeDiscount(loader.args.daekning.Navn())\r\n )\r\n },\r\n cancelText: app.getHjaelpeKodeText('CLIENT-BUTTON-VIL_BEHOLDE_IFAFTALE', 'Nej tak, jeg vil gerne beholde If-aftale'),\r\n cancel: function () {\r\n basic.handleBlueBoxForSelectedCoverage(\r\n loader.args.daekning.Navn(),\r\n h.getDisplayTextForBlueBoxForCarCubeDiscount(loader.args.daekning.Navn())\r\n )\r\n // do nothing\r\n }\r\n })\r\n return true // don't continue\r\n }\r\n } else {\r\n // no additional actions required, just perform the change\r\n self.selectDaekning2(loader.args.daekning)\r\n basic.handleBlueBoxForSelectedCoverage(\r\n loader.args.daekning.Navn(),\r\n h.getDisplayTextForBlueBoxForCarCubeDiscount(loader.args.daekning.Navn())\r\n )\r\n return true\r\n }\r\n }\r\n })\r\n // $.each\r\n }\r\n })\r\n }\r\n }\r\n\r\n self.JSONFilter = function (key, value) {\r\n if (key === 'Praemier' || key === 'priser' || key === 'prevValues') {\r\n return undefined\r\n } else if (\r\n (key === 'Foedselsdato' ||\r\n key === 'IkraftDato' ||\r\n key === 'FoedselsDato') &&\r\n value\r\n ) {\r\n // correct due to culture on server (TODO: always save in this format on client)\r\n return h.correctStringDate(value)\r\n } else {\r\n return value\r\n }\r\n }\r\n\r\n self.JSON = function () {\r\n return ko.toJSON(self, self.JSONFilter)\r\n }\r\n }\r\n\r\n self.validate = function (actionSettings) {\r\n if (\r\n actionSettings &&\r\n (actionSettings.actionName === 'goFwd' ||\r\n actionSettings.actionName === 'goBwd' ||\r\n actionSettings.actionName === 'goTo')\r\n ) {\r\n if (app.wizard.isFlagSet('Done')) {\r\n // tilbud already saved - do nothing\r\n return\r\n }\r\n\r\n // all validation is completed sucessfully\r\n if (\r\n actionSettings.actionName === 'goBwd' ||\r\n (actionSettings.actionName === 'goTo' &&\r\n actionSettings.stepNo < app.wizard.currentStepNo)\r\n ) {\r\n // forms not validated - dont save\r\n actionSettings.done()\r\n } else if (\r\n actionSettings.actionName === 'goFwd' &&\r\n app.wizard.pendingStepNo === 1\r\n ) {\r\n // moving on - display list of aftale produkter\r\n // sync\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n // display aftalepanel after save\r\n actionSettings.done()\r\n },\r\n always: function () {\r\n if (\r\n !this.ignored &&\r\n !this.response &&\r\n actionSettings &&\r\n actionSettings.fail\r\n ) {\r\n actionSettings.fail()\r\n }\r\n }\r\n })\r\n } else {\r\n // save and perform actions in actionSettings\r\n self.sync({\r\n done: function (data) {\r\n actionSettings.done()\r\n },\r\n always: function () {\r\n // if this is a fail\r\n if (\r\n !this.ignored &&\r\n !this.response &&\r\n actionSettings &&\r\n actionSettings.fail\r\n ) {\r\n actionSettings.fail()\r\n }\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n self.stepChanged = function () {\r\n app.root.sync()\r\n }\r\n}\r\n\r\nfunction BasePraemie (produkt) {\r\n let self = this\r\n self.base = new Model()\r\n self.inherit = function (child) {\r\n self.base.inherit(child)\r\n self = child\r\n\r\n self.NettoMaanedsPrisOther = 0\r\n self.NettoPrisOther = 0\r\n self.BruttoPrisOther = 0\r\n self.RabatOther = 0\r\n self.Rabat1AarOther = 0\r\n\r\n self.Daekninger = ko.observableArray([])\r\n self.SelvRisici = ko.observableArray([])\r\n self.DefaultSelvrisiko = ko.observable(0)\r\n\r\n self.NettoPraemieTotalStr = ko.observable(0)\r\n self.BruttoPraemieTotalStr = ko.observable(0)\r\n self.NettoPraemieStr = ko.observable(0)\r\n self.Md1NettoPremieStr = ko.observable(0)\r\n self.MdEfterNettoPremieStr = ko.observable(0)\r\n self.Md1NettoPremieTotalStr = ko.observable(0)\r\n self.MdEfterNettoPremieTotalStr = ko.observable(0)\r\n self.RabatTotalStr = ko.observable(0)\r\n self.Rabat1AarTotalStr = ko.observable(0)\r\n\r\n self.updatePrices = function () {\r\n let _bpa = 0\r\n let _npm = 0\r\n let _npa = 0\r\n let _rabat = 0\r\n let _rabat1Aar = 0\r\n\r\n $.each(self.Daekninger(), function (index, item) {\r\n // combine the cost of each of the tilvalg\r\n if (item.Valgt() && !item.Included() && !item.Recalculates()) {\r\n _bpa += item.BruttoTilvalgsPris()\r\n _npm += item.NettoMdTilvalgsPris()\r\n _npa += item.NettoTilvalgsPris()\r\n _rabat += item.Rabat()\r\n _rabat1Aar += item.Rabat1Aar()\r\n }\r\n })\r\n\r\n // apply any other prices not in the list (build for family which have travel sub choices, not in the list)\r\n _bpa += h.d0(self.BruttoPrisOther)\r\n _npm += h.d0(self.NettoMaanedsPrisOther)\r\n _npa += h.d0(self.NettoPrisOther)\r\n _rabat += h.d0(self.RabatOther)\r\n _rabat1Aar += h.d0(self.Rabat1AarOther)\r\n\r\n // apply the extras to the main prices\r\n self.NettoPraemieTotal(self.NettoPraemie() + _npa)\r\n self.BruttoPraemieTotal(self.BruttoPraemie() + _bpa)\r\n self.Md1NettoPremieTotal(self.Md1NettoPremie() + _npm)\r\n self.MdEfterNettoPremieTotal(self.MdEfterNettoPremie() + _npm)\r\n self.RabatTotal(self.Rabat() + _rabat)\r\n self.Rabat1AarTotal(self.Rabat1Aar() + _rabat1Aar)\r\n\r\n self.updatePriceStrings()\r\n }\r\n\r\n self.updatePriceStrings = function () {\r\n // update the strings displayed in the ui\r\n self.NettoPraemieTotalStr(h.getPrice(self.NettoPraemieTotal()))\r\n self.BruttoPraemieTotalStr(h.getPrice(self.BruttoPraemieTotal()))\r\n self.NettoPraemieStr(h.getPrice(self.NettoPraemie()))\r\n self.Md1NettoPremieStr(h.getPrice(self.Md1NettoPremie()))\r\n self.MdEfterNettoPremieStr(h.getPrice(self.MdEfterNettoPremie()))\r\n self.Md1NettoPremieTotalStr(h.getPrice(self.Md1NettoPremieTotal()))\r\n self.MdEfterNettoPremieTotalStr(\r\n h.getPrice(self.MdEfterNettoPremieTotal())\r\n )\r\n self.Rabat1AarTotalStr(h.getNegPrice(self.Rabat1AarTotal()))\r\n self.RabatTotalStr(h.getNegPrice(self.RabatTotal()))\r\n\r\n // update any displayed prices not bound\r\n $('#' + self.ModelNavn() + '_produkttype_pris').text(\r\n self.MdEfterNettoPremieTotalStr()\r\n )\r\n $('#aars' + self.ModelNavn() + '_produkttype_pris').text(\r\n self.NettoPraemieTotalStr()\r\n )\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n Navn,\r\n Titel,\r\n SamletTitel,\r\n ShortTitle,\r\n SubTitel,\r\n ModelNavn,\r\n Daekninger,\r\n Tilbydes,\r\n Anbefalet,\r\n SelvRisici,\r\n DefaultSelvrisiko,\r\n BruttoPraemie,\r\n BruttoPraemieTotal,\r\n NettoPraemie,\r\n NettoPraemieTotal,\r\n Md1NettoPremie,\r\n Md1NettoPremieTotal,\r\n MdEfterNettoPremie,\r\n MdEfterNettoPremieTotal,\r\n Rabat1Aar,\r\n Rabat,\r\n Rabat1AarTotal,\r\n RabatTotal,\r\n IsKampagneRabat,\r\n KampagneCode,\r\n Farvekode,\r\n IsSingle\r\n ) {\r\n self.Navn = self.koMap(Navn, self.Navn)\r\n self.Titel = self.koMap(Titel, self.Titel, null, 'Titel')\r\n self.SubTitel = self.koMap(SubTitel, self.SubTitel, null, 'SubTitel')\r\n self.SamletTitel = self.koMap(\r\n SamletTitel,\r\n self.SamletTitel,\r\n null,\r\n 'SamletTitel'\r\n )\r\n self.ShortTitle = self.koMap(\r\n ShortTitle,\r\n self.ShortTitle,\r\n null,\r\n 'ShortTitle'\r\n )\r\n self.ModelNavn = self.koMap(ModelNavn, self.ModelNavn)\r\n self.NettoPraemie = self.koMap(NettoPraemie, self.NettoPraemie)\r\n self.NettoPraemieTotal = self.koMap(\r\n NettoPraemieTotal,\r\n self.NettoPraemieTotal\r\n )\r\n\r\n self.Tilbydes = self.koMap(Tilbydes, self.Tilbydes)\r\n\r\n self.Anbefalet = self.koMap(Anbefalet, self.Anbefalet)\r\n self.BruttoPraemie = self.koMap(\r\n BruttoPraemie,\r\n self.BruttoPraemie,\r\n 0,\r\n 'BruttoPraemie'\r\n )\r\n self.BruttoPraemieTotal = self.koMap(\r\n BruttoPraemieTotal,\r\n self.BruttoPraemieTotal,\r\n 0,\r\n 'BruttoPraemieTotal'\r\n )\r\n self.NettoPraemie = self.koMap(\r\n NettoPraemie,\r\n self.NettoPraemie,\r\n 0,\r\n 'NettoPraemie'\r\n )\r\n self.Md1NettoPremie = self.koMap(\r\n Md1NettoPremie,\r\n self.Md1NettoPremie,\r\n 0,\r\n 'Md1NettoPremie'\r\n )\r\n self.MdEfterNettoPremie = self.koMap(\r\n MdEfterNettoPremie,\r\n self.MdEfterNettoPremie,\r\n 0,\r\n 'MdEfterNettoPremie'\r\n )\r\n self.Md1NettoPremieTotal = self.koMap(\r\n Md1NettoPremieTotal,\r\n self.Md1NettoPremieTotal,\r\n 0,\r\n 'Md1NettoPremieTotal'\r\n )\r\n self.MdEfterNettoPremieTotal = self.koMap(\r\n MdEfterNettoPremieTotal,\r\n self.MdEfterNettoPremieTotal,\r\n 0,\r\n 'MdEfterNettoPremieTotal'\r\n )\r\n self.Rabat1Aar = self.koMap(Rabat1Aar, self.Rabat1Aar, 0, 'Rabat1Aar')\r\n self.Rabat = self.koMap(Rabat, self.Rabat, 0, 'Rabat')\r\n self.Rabat1AarTotal = self.koMap(\r\n Rabat1AarTotal,\r\n self.Rabat1AarTotal,\r\n 0,\r\n 'Rabat1AarTotal'\r\n )\r\n self.HasRabat1Aar = ko.computed(function () {\r\n return this.Rabat1AarTotal() > 0\r\n }, self)\r\n\r\n self.RabatTotal = self.koMap(RabatTotal, self.RabatTotal, 0, 'RabatTotal')\r\n self.HasRabat = ko.computed(function () {\r\n return this.RabatTotal() > 0\r\n }, self)\r\n\r\n self.RabatBruttoMinusNetto = ko.computed(function () {\r\n if (this.BruttoPraemieTotal() && this.NettoPraemieTotal()) {\r\n return this.BruttoPraemieTotal() - this.NettoPraemieTotal()\r\n }\r\n return 0\r\n }, self)\r\n\r\n self.RabatBruttoMinusNettoStr = ko.computed(function () {\r\n return h.getNegPrice(self.RabatBruttoMinusNetto())\r\n })\r\n\r\n self.HasRabatBruttoMinusNetto = ko.computed(function () {\r\n return self.RabatBruttoMinusNetto !== 0\r\n })\r\n\r\n self.IsKampagneRabat = self.koMap(\r\n IsKampagneRabat,\r\n self.IsKampagneRabat,\r\n 0,\r\n 'IsKampagneRabat'\r\n )\r\n self.KampagneCode = self.koMap(\r\n KampagneCode,\r\n self.KampagneCode,\r\n '',\r\n 'KampagneCode'\r\n )\r\n self.RabatTotalText = app.getHjaelpeKodeText(\r\n 'CLIENT-DAEKNING-CUBE',\r\n 'If fordelsrabat'\r\n )\r\n self.KampagneRabatText = ko.computed(function () {\r\n const kampagneCode = this.KampagneCode()\r\n let textKampagne = app.getHjaelpeKodeText(\r\n 'CLIENT-KAMPAGNERABAT-' + kampagneCode\r\n )\r\n if (!textKampagne) {\r\n textKampagne = app.getHjaelpeKodeText(\r\n 'CLIENT-KAMPAGNERABAT',\r\n 'Kampagnerabat (rabat første år)'\r\n )\r\n }\r\n return textKampagne\r\n }, self)\r\n self.Farvekode = self.koMap(Farvekode, self.Farvekode, '', 'Farvekode')\r\n self.IsSingle = self.koMap(IsSingle, self.IsSingle, '', 'IsSingle')\r\n self.DefaultSelvrisiko = self.koMap(\r\n DefaultSelvrisiko,\r\n self.DefaultSelvrisiko,\r\n '',\r\n 'DefaultSelvrisiko'\r\n )\r\n\r\n self.SelvRisici.removeAll()\r\n if (SelvRisici) {\r\n $.each(SelvRisici, function (key, val) {\r\n self.SelvRisici.push(val)\r\n })\r\n }\r\n\r\n self.Daekninger.removeAll()\r\n if (Daekninger) {\r\n $.each(Daekninger, function (key, val) {\r\n const _d = new DaekningModel(self)\r\n _d.update(val)\r\n self.Daekninger.push(_d)\r\n })\r\n }\r\n self.updatePriceStrings()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.Navn,\r\n val.Titel,\r\n val.SamletTitel,\r\n val.ShortTitle,\r\n val.SubTitel,\r\n val.ModelNavn,\r\n val.Daekninger,\r\n val.Tilbydes,\r\n val.Anbefalet,\r\n val.SelvRisici,\r\n val.DefaultSelvrisiko,\r\n val.BruttoPraemie,\r\n val.BruttoPraemieTotal,\r\n val.NettoPraemie,\r\n val.NettoPraemieTotal,\r\n val.Md1NettoPremie,\r\n val.Md1NettoPremieTotal,\r\n val.MdEfterNettoPremie,\r\n val.MdEfterNettoPremieTotal,\r\n val.Rabat1Aar,\r\n val.Rabat,\r\n val.Rabat1AarTotal,\r\n val.RabatTotal,\r\n val.IsKampagneRabat,\r\n val.KampagneCode,\r\n val.Farvekode,\r\n val.IsSingle\r\n )\r\n }\r\n }\r\n\r\n self.harTilvalg = function () {\r\n let _harTilvalg = false\r\n $.each(self.Daekninger(), function (index, item) {\r\n if (item.Tilbydes() === true) {\r\n _harTilvalg = true\r\n return false // $.each\r\n }\r\n })\r\n return _harTilvalg\r\n }\r\n\r\n self.harValgtTilvalg = function () {\r\n let _harValgtTilvalg = false\r\n let _alleErIncluded = true\r\n $.each(self.Daekninger(), function (index, item) {\r\n if (_alleErIncluded && !item.Included()) {\r\n _alleErIncluded = false\r\n }\r\n if (item.Tilbydes() === true && item.Valgt() === true) {\r\n _harValgtTilvalg = true\r\n return false // $.each\r\n }\r\n })\r\n // return if any are included, but it isn't relevant if all are included\r\n return _harValgtTilvalg || _alleErIncluded\r\n }\r\n }\r\n}\r\n\r\nfunction Praemie (produkt) {\r\n const self = this\r\n self.base = new BasePraemie()\r\n self.base.inherit(self)\r\n self.init()\r\n}\r\n\r\nfunction DaekningModel (praemie) {\r\n const self = this\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n Navn,\r\n Titel,\r\n ModelNavn,\r\n NettoMdTilvalgsPris,\r\n NettoTilvalgsPris,\r\n BruttoTilvalgsPris,\r\n Rabat,\r\n Rabat1Aar,\r\n Tilbydes,\r\n Valgt,\r\n Included,\r\n Mandatory,\r\n Recalculates\r\n ) {\r\n self.Navn = self.koMap(Navn, self.Navn, null, 'Navn')\r\n self.Titel = self.koMap(Titel, self.Titel, null, 'Titel')\r\n self.ModelNavn = self.koMap(ModelNavn, self.ModelNavn, null, 'ModelNavn')\r\n self.NettoMdTilvalgsPris = self.koMap(\r\n NettoMdTilvalgsPris,\r\n self.NettoMdTilvalgsPris,\r\n null,\r\n 'NettoMdTilvalgsPris'\r\n )\r\n self.NettoTilvalgsPris = self.koMap(\r\n NettoTilvalgsPris,\r\n self.NettoTilvalgsPris,\r\n null,\r\n 'NettoTilvalgsPris'\r\n )\r\n self.BruttoTilvalgsPris = self.koMap(\r\n BruttoTilvalgsPris,\r\n self.BruttoTilvalgsPris,\r\n null,\r\n 'BruttoTilvalgsPris'\r\n )\r\n self.Rabat = self.koMap(Rabat, self.Rabat, null, 'Rabat')\r\n self.Rabat1Aar = self.koMap(Rabat1Aar, self.Rabat1Aar, null, 'Rabat1Aar')\r\n self.Tilbydes = self.koMap(Tilbydes, self.Tilbydes, null, 'Tilbydes')\r\n self.Valgt = self.koMap(Valgt, self.Valgt, false, 'Valgt')\r\n self.Included = self.koMap(Included, self.Included, false, 'Included')\r\n self.Mandatory = self.koMap(Mandatory, self.Mandatory, false, 'Mandatory')\r\n self.Recalculates = self.koMap(\r\n Recalculates,\r\n self.Recalculates,\r\n false,\r\n 'Recalculates'\r\n )\r\n }\r\n self.init()\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.Navn,\r\n val.Titel,\r\n val.ModelNavn,\r\n val.NettoMdTilvalgsPris,\r\n val.NettoTilvalgsPris,\r\n val.BruttoTilvalgsPris,\r\n val.Rabat,\r\n val.Rabat1Aar,\r\n val.Tilbydes,\r\n val.Valgt,\r\n val.Included,\r\n val.Mandatory,\r\n val.Recalculates\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport { BasePraemie, DaekningModel, Praemie, Produkt, ProduktType, ifwsPriser }\r\n","/* global $ ko */\r\n\r\nimport { BasePraemie, Produkt } from './../dk-ifshop-produkt-model'\r\n\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\n\r\nfunction FamilieProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.Daekning = h.koMap(new FamiliePraemie(self)) // override dækning chosen by the user to match product specific\r\n self.base.inherit(self)\r\n self.showAnbefaletInUI = true\r\n self.getPraemie = function (key, val) {\r\n // over\r\n const _p = new FamiliePraemie(self)\r\n _p.update(val)\r\n return _p\r\n }\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'BoligarealKvm') {\r\n if ($.isNumeric(value)) {\r\n property($.parseInt(value, 'N', app.culture))\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Boligtype,\r\n BoligarealKvm,\r\n Address,\r\n Gade,\r\n Husnr,\r\n Etage,\r\n SideDoerNr,\r\n Postnr,\r\n By,\r\n Kvhx,\r\n Selvrisiko,\r\n IndboSum,\r\n CykelSum,\r\n Daekning,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n NedlagtLandbrug,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CykelIncluded,\r\n Latitude,\r\n Longitude,\r\n CPState) {\r\n self.isInit = true\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n\r\n self.Latitude = self.koMap(Latitude, self.Latitude, '', 'Latitude')\r\n self.Longitude = self.koMap(Longitude, self.Longitude, '', 'Longitude')\r\n\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '0', 'Selvrisiko')\r\n\r\n self.Boligtype = self.koMap(Boligtype, self.Boligtype, '', 'Boligtype')\r\n self.BoligarealKvm = self.koMap(\r\n BoligarealKvm,\r\n self.BoligarealKvm,\r\n '',\r\n 'BoligarealKvm'\r\n )\r\n\r\n self.Gade = self.koMap(Gade, self.Gade, '', 'Gade')\r\n self.Husnr = self.koMap(Husnr, self.Husnr, '', 'Husnr')\r\n self.Postnr = self.koMap(Postnr, self.Postnr, '', 'Postnr', true)\r\n self.By = self.koMap(By, self.By, '', 'By')\r\n self.Etage = self.koMap(Etage, self.Etage, '', 'Etage')\r\n self.SideDoerNr = self.koMap(SideDoerNr, self.SideDoerNr, '', 'SideDoerNr')\r\n self.Kvhx = self.koMap(Kvhx, self.Kvhx, '', 'Kvhx')\r\n\r\n self.Address = ko.computed(function () {\r\n return h.addressSingleLine(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr(), self.Postnr(), self.By())\r\n })\r\n\r\n self.AddressLine1 = ko.computed(function () {\r\n return h.addressLine1(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr())\r\n })\r\n\r\n self.AddressLine2 = ko.computed(function () {\r\n return h.addressLine2(self.Postnr(), self.By())\r\n })\r\n\r\n self.AddressSingleLine = ko.computed(function () {\r\n return h.addressSingleLine(self.Gade(), self.Husnr(), self.Etage(), self.SideDoerNr(), self.Postnr(), self.By())\r\n })\r\n\r\n self.NedlagtLandbrug = self.koMap(\r\n NedlagtLandbrug,\r\n self.NedlagtLandbrug,\r\n '',\r\n 'NedlagtLandbrug'\r\n )\r\n self.CykelIncluded = self.koMap(CykelIncluded, self.CykelIncluded, false, 'CykelIncluded')\r\n self.IndboSum = self.koMap(IndboSum, self.IndboSum, '', 'IndboSum')\r\n self.CykelSum = self.koMap(CykelSum, self.CykelSum, '', 'CykelSum')\r\n\r\n self.shouldShowAddedWizardNavigation = ko.computed(function () {\r\n return true\r\n })\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Boligtype,\r\n val.BoligarealKvm,\r\n val.Address,\r\n val.Gade,\r\n val.Husnr,\r\n val.Etage,\r\n val.SideDoerNr,\r\n val.Postnr,\r\n val.By,\r\n val.Kvhx,\r\n val.Selvrisiko,\r\n val.IndboSum,\r\n val.CykelSum,\r\n val.Daekning,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.UnderwritingAccept,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.NedlagtLandbrug,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CykelIncluded,\r\n val.Latitude,\r\n val.Longitude,\r\n val.CPState\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n const _key =\r\n 'FAMILIE-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n app.root.Kunde().Alder() +\r\n '-' +\r\n self.Boligtype() +\r\n '-' +\r\n self.Kvhx() +\r\n '-' +\r\n self.Selvrisiko() +\r\n '-' +\r\n self.IndboSum() +\r\n '-' +\r\n self.CykelSum() +\r\n '-' +\r\n app.root.AntalSkaderFamilie()\r\n\r\n return _key\r\n }\r\n}\r\n\r\nfunction FamiliePraemie (produkt) {\r\n const self = this\r\n self.base = new BasePraemie()\r\n self.base.inherit(self)\r\n\r\n // INIT\r\n self.baseInit = self.init // TODO: REFAC: Hack!!! because my inheritance model is incorrect\r\n self.init = function (\r\n Navn,\r\n Titel,\r\n SamletTitel,\r\n ShortTitle,\r\n SubTitel,\r\n ModelNavn,\r\n Daekninger,\r\n Tilbydes,\r\n Anbefalet,\r\n SelvRisici,\r\n DefaultSelvrisiko,\r\n BruttoPraemie,\r\n BruttoPraemieTotal,\r\n NettoPraemie,\r\n NettoPraemieTotal,\r\n Md1NettoPremie,\r\n Md1NettoPremieTotal,\r\n MdEfterNettoPremie,\r\n MdEfterNettoPremieTotal,\r\n Rabat1Aar,\r\n Rabat,\r\n Rabat1AarTotal,\r\n RabatTotal,\r\n IsKampagneRabat,\r\n KampagneCode,\r\n Farvekode,\r\n IsSingle,\r\n Sikring,\r\n GisAB,\r\n GisCD,\r\n BoligAB,\r\n BoligCD\r\n ) {\r\n self.baseInit(\r\n Navn,\r\n Titel,\r\n SamletTitel,\r\n ShortTitle,\r\n SubTitel,\r\n ModelNavn,\r\n Daekninger,\r\n Tilbydes,\r\n Anbefalet,\r\n SelvRisici,\r\n DefaultSelvrisiko,\r\n BruttoPraemie,\r\n BruttoPraemieTotal,\r\n NettoPraemie,\r\n NettoPraemieTotal,\r\n Md1NettoPremie,\r\n Md1NettoPremieTotal,\r\n MdEfterNettoPremie,\r\n MdEfterNettoPremieTotal,\r\n Rabat1Aar,\r\n Rabat,\r\n Rabat1AarTotal,\r\n RabatTotal,\r\n IsKampagneRabat,\r\n KampagneCode,\r\n Farvekode,\r\n IsSingle\r\n )\r\n\r\n self.GisAB = self.koMap(GisAB, self.GisAB, '', 'GisAB')\r\n self.GisCD = self.koMap(GisCD, self.GisCD, '', 'GisCD')\r\n self.BoligAB = self.koMap(BoligAB, self.BoligAB, '', 'BoligAB')\r\n self.BoligCD = self.koMap(BoligCD, self.BoligCD, '', 'BoligCD')\r\n }\r\n self.init()\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.Navn,\r\n val.Titel,\r\n val.SamletTitel,\r\n val.ShortTitle,\r\n val.SubTitel,\r\n val.ModelNavn,\r\n val.Daekninger,\r\n val.Tilbydes,\r\n val.Anbefalet,\r\n val.SelvRisici,\r\n val.DefaultSelvrisiko,\r\n val.BruttoPraemie,\r\n val.BruttoPraemieTotal,\r\n val.NettoPraemie,\r\n val.NettoPraemieTotal,\r\n val.Md1NettoPremie,\r\n val.Md1NettoPremieTotal,\r\n val.MdEfterNettoPremie,\r\n val.MdEfterNettoPremieTotal,\r\n val.Rabat1Aar,\r\n val.Rabat,\r\n val.Rabat1AarTotal,\r\n val.RabatTotal,\r\n val.IsKampagneRabat,\r\n val.KampagneCode,\r\n val.Farvekode,\r\n val.IsSingle,\r\n val.Sikring,\r\n val.GisAB,\r\n val.GisCD,\r\n val.BoligAB,\r\n val.BoligCD\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport { FamiliePraemie, FamilieProdukt }\r\n","/* global $ ko */\r\n\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\n\r\nfunction HusProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (\r\n name === 'OpfoerelsesAar' ||\r\n name === 'BoligarealKvm' ||\r\n name === 'UdhuseKvm'\r\n ) {\r\n if ($.isNumeric(value)) {\r\n property($.parseInt(value, 'N', app.culture))\r\n }\r\n } else if (name === 'Kaelder') {\r\n if (!value) {\r\n self.TidligereVandskade(undefined)\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n OpfoerelsesAar,\r\n BoligarealKvm,\r\n Kaelder,\r\n UdhuseKvm,\r\n Boligtype,\r\n BoligtypeLookedUp,\r\n Tagtype,\r\n Kasko,\r\n Svamp,\r\n HusSuper,\r\n Address,\r\n Gade,\r\n Husnr,\r\n Postnr,\r\n By,\r\n OuterWallType,\r\n Roerstandard,\r\n TidligereVandskade,\r\n Bindingsvaerk,\r\n Husbuk,\r\n HarSvampDaekning,\r\n Kvhx,\r\n MatrikelNr,\r\n Selvrisiko,\r\n Daekning,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n Traehus,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n Toilets,\r\n Floors,\r\n HeatingType,\r\n BasementType,\r\n BasementUsedAsResidential,\r\n LivingInTheHouse,\r\n Rented,\r\n UsedForBusiness,\r\n BusinessType,\r\n MoreThanHalfUsedForBusiness,\r\n DataLo,\r\n HasCoverageLimits,\r\n HouseType,\r\n HouseTypeLookedUp,\r\n FloorsOriginalValue,\r\n OldFarmOrOldCommercialHouse,\r\n SoftRoofHasFireProtection,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n JustBoughtTheHouse,\r\n PurchasePrice,\r\n PreRegisteredPurchasePrice,\r\n BusinessTypes,\r\n Latitude,\r\n Longitude,\r\n HarKrybeKaelder,\r\n CPState) {\r\n self.isInit = true\r\n\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n undefined, /* UnderwritingAccept */\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Latitude = self.koMap(Latitude, self.Latitude, '', 'Latitude')\r\n self.Longitude = self.koMap(Longitude, self.Longitude, '', 'Longitude')\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '0', 'Selvrisiko')\r\n\r\n self.Rented = self.koMap(Rented, self.Rented, '', 'Rented')\r\n self.LivingInTheHouse = self.koMap(\r\n LivingInTheHouse,\r\n self.LivingInTheHouse,\r\n true,\r\n 'LivingInTheHouse'\r\n )\r\n\r\n self.OpfoerelsesAar = self.koMap(\r\n OpfoerelsesAar,\r\n self.OpfoerelsesAar,\r\n '',\r\n 'OpfoerelsesAar'\r\n )\r\n self.BoligarealKvm = self.koMap(\r\n BoligarealKvm,\r\n self.BoligarealKvm,\r\n '',\r\n 'BoligarealKvm'\r\n )\r\n self.Kaelder = self.koMap(Kaelder, self.Kaelder, '', 'Kaelder')\r\n self.UdhuseKvm = self.koMap(UdhuseKvm, self.UdhuseKvm, '', 'UdhuseKvm')\r\n self.Toilets = self.koMap(Toilets, self.Toilets, '', 'Toilets')\r\n self.Floors = self.koMap(Floors, self.Floors, '', 'Floors')\r\n self.FloorsOriginalValue = self.koMap(\r\n FloorsOriginalValue,\r\n self.FloorsOriginalValue,\r\n '',\r\n 'FloorsOriginalValue'\r\n )\r\n\r\n self.Boligtype = self.koMap(Boligtype, self.Boligtype, '', 'Boligtype')\r\n self.BoligtypeLookedUp = self.koMap(BoligtypeLookedUp, self.BoligtypeLookedUp, '', 'BoligtypeLookedUp')\r\n self.Tagtype = self.koMap(Tagtype, self.Tagtype, '', 'Tagtype')\r\n self.RoofTypeOriginalValue = self.koMap(Tagtype, self.RoofTypeOriginalValue, '', 'RoofTypeOriginalValue')\r\n\r\n self.SoftRoofHasFireProtection = self.koMap(SoftRoofHasFireProtection, self.SoftRoofHasFireProtection, undefined, 'SoftRoofHasFireProtection')\r\n\r\n self.Kasko = self.koMap(Kasko, self.Kasko, '', 'Kasko')\r\n self.Svamp = self.koMap(Svamp, self.Svamp, '', 'Svamp')\r\n self.HusSuper = self.koMap(HusSuper, self.HusSuper, '', 'HusSuper')\r\n\r\n self.Gade = self.koMap(Gade, self.Gade, '', 'Gade')\r\n self.Husnr = self.koMap(Husnr, self.Husnr, '', 'Husnr')\r\n self.Postnr = self.koMap(Postnr, self.Postnr, '', 'Postnr', true)\r\n self.By = self.koMap(By, self.By, '', 'By')\r\n\r\n self.Address = ko.computed(function () {\r\n return h.addressSingleLine(self.Gade(), self.Husnr(), '', '', self.Postnr(), self.By())\r\n })\r\n\r\n self.OuterWallType = self.koMap(\r\n OuterWallType,\r\n self.OuterWallType,\r\n '',\r\n 'OuterWallType'\r\n )\r\n self.HeatingType = self.koMap(\r\n HeatingType,\r\n self.HeatingType,\r\n '',\r\n 'HeatingType'\r\n )\r\n\r\n self.HarKrybeKaelder = self.koMap(\r\n HarKrybeKaelder,\r\n self.HarKrybeKaelder,\r\n '',\r\n 'HarKrybeKaelder'\r\n )\r\n\r\n self.BasementType = self.koMap(\r\n BasementType,\r\n self.BasementType,\r\n '',\r\n 'BasementType'\r\n )\r\n self.BasementUsedAsResidential = self.koMap(\r\n BasementUsedAsResidential,\r\n self.BasementUsedAsResidential,\r\n '',\r\n 'BasementUsedAsResidential'\r\n )\r\n self.Roerstandard = self.koMap(\r\n Roerstandard,\r\n self.Roerstandard,\r\n '',\r\n 'Roerstandard'\r\n )\r\n self.TidligereVandskade = self.koMap(\r\n TidligereVandskade,\r\n self.TidligereVandskade,\r\n '',\r\n 'TidligereVandskade'\r\n )\r\n self.Bindingsvaerk = self.koMap(\r\n Bindingsvaerk,\r\n self.Bindingsvaerk,\r\n '',\r\n 'Bindingsvaerk'\r\n )\r\n self.Husbuk = self.koMap(Husbuk, self.Husbuk, '', 'Husbuk')\r\n self.HarSvampDaekning = self.koMap(\r\n HarSvampDaekning,\r\n self.HarSvampDaekning,\r\n 'undefined',\r\n 'HarSvampDaekning'\r\n )\r\n self.HouseType = self.koMap(HouseType, self.HouseType, '', 'HouseType')\r\n self.HouseTypeLookedUp = self.koMap(HouseTypeLookedUp, self.HouseTypeLookedUp, '', 'HouseTypeLookedUp')\r\n self.Kvhx = self.koMap(Kvhx, self.Kvhx, '', 'Kvhx')\r\n self.MatrikelNr = self.koMap(MatrikelNr, self.MatrikelNr, '', 'MatrikelNr')\r\n\r\n self.Traehus = self.koMap(Traehus, self.Traehus, '', 'Traehus')\r\n\r\n self.UsedForBusiness = self.koMap(\r\n UsedForBusiness,\r\n self.UsedForBusiness,\r\n null,\r\n 'UsedForBusiness'\r\n )\r\n\r\n self.JustBoughtTheHouse = self.koMap(\r\n JustBoughtTheHouse,\r\n self.JustBoughtTheHouse,\r\n null,\r\n 'JustBoughtTheHouse'\r\n )\r\n\r\n self.PurchasePrice = self.koMap(\r\n PurchasePrice,\r\n self.PurchasePrice,\r\n null,\r\n 'PurchasePrice'\r\n )\r\n self.PreRegisteredPurchasePrice = self.koMap(\r\n PreRegisteredPurchasePrice,\r\n self.PreRegisteredPurchasePrice,\r\n null,\r\n 'PreRegisteredPurchasePrice'\r\n )\r\n\r\n self.BusinessType = self.koMap(\r\n BusinessType,\r\n self.BusinessType,\r\n 0,\r\n 'BusinessType')\r\n\r\n self.BusinessTypes = BusinessTypes\r\n\r\n self.MoreThanHalfUsedForBusiness = self.koMap(\r\n MoreThanHalfUsedForBusiness,\r\n self.MoreThanHalfUsedForBusiness,\r\n null,\r\n 'MoreThanHalfUsedForBusiness'\r\n )\r\n self.OldFarmOrOldCommercialHouse = self.koMap(\r\n OldFarmOrOldCommercialHouse,\r\n self.OldFarmOrOldCommercialHouse,\r\n null,\r\n 'OldFarmOrOldCommercialHouse'\r\n )\r\n self.DataLo = self.koMap(\r\n DataLo,\r\n self.DataLo,\r\n null,\r\n 'DataLo'\r\n )\r\n self.HasCoverageLimits = self.koMap(\r\n HasCoverageLimits,\r\n self.HasCoverageLimits,\r\n null,\r\n 'HasCoverageLimits'\r\n )\r\n\r\n self.AddressLine1 = ko.computed(function () {\r\n return h.addressLine1(self.Gade(), self.Husnr(), '', '')\r\n })\r\n self.AddressLine2 = ko.computed(function () {\r\n return h.addressLine2(self.Postnr(), self.By())\r\n })\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.OpfoerelsesAar,\r\n val.BoligarealKvm,\r\n val.Kaelder,\r\n val.UdhuseKvm,\r\n val.Boligtype,\r\n val.BoligtypeLookedUp,\r\n val.Tagtype,\r\n val.Kasko,\r\n val.Svamp,\r\n val.HusSuper,\r\n val.Address,\r\n val.Gade,\r\n val.Husnr,\r\n val.Postnr,\r\n val.By,\r\n val.OuterWallType,\r\n val.Roerstandard,\r\n val.TidligereVandskade,\r\n val.Bindingsvaerk,\r\n val.Husbuk,\r\n val.HarSvampDaekning,\r\n val.Kvhx,\r\n val.MatrikelNr,\r\n val.Selvrisiko,\r\n val.Daekning,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.Traehus,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.Toilets,\r\n val.Floors,\r\n val.HeatingType,\r\n val.BasementType,\r\n val.BasementUsedAsResidential,\r\n val.LivingInTheHouse,\r\n val.Rented,\r\n val.UsedForBusiness,\r\n val.BusinessType,\r\n val.MoreThanHalfUsedForBusiness,\r\n val.DataLo,\r\n val.HasCoverageLimits,\r\n val.HouseType,\r\n val.HouseTypeLookedUp,\r\n val.FloorsOriginalValue,\r\n val.OldFarmOrOldCommercialHouse,\r\n val.SoftRoofHasFireProtection,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.JustBoughtTheHouse,\r\n val.PurchasePrice,\r\n val.PreRegisteredPurchasePrice,\r\n val.BusinessTypes,\r\n val.Latitude,\r\n val.Longitude,\r\n val.HarKrybeKaelder,\r\n val.CPState\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n return (\r\n 'HUS-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.Selvrisiko() +\r\n '-' +\r\n app.root.Kunde().Alder() +\r\n '-' +\r\n self.OpfoerelsesAar() +\r\n '-' +\r\n self.BoligarealKvm() +\r\n '-' +\r\n self.Kaelder() +\r\n '-' +\r\n self.UdhuseKvm() +\r\n '-' +\r\n self.Boligtype() +\r\n '-' +\r\n self.Tagtype() +\r\n '-' +\r\n self.TidligereVandskade() +\r\n '-' +\r\n self.Bindingsvaerk() +\r\n '-' +\r\n self.HarSvampDaekning() +\r\n '-' +\r\n self.Kvhx() +\r\n '-' +\r\n app.root.AntalSkaderHus() +\r\n '-' +\r\n self.HeatingType() +\r\n '-' +\r\n self.BasementUsedAsResidential() +\r\n '-' +\r\n self.BasementType() +\r\n '-' +\r\n self.SoftRoofHasFireProtection() +\r\n '-' +\r\n self.LivingInTheHouse() +\r\n '-' +\r\n self.Rented() +\r\n '-' +\r\n self.Toilets()\r\n )\r\n }\r\n /**/\r\n self.tagTyper = []\r\n self.tagTyper[1] = 'Hårdt tag'\r\n self.tagTyper[2] = 'Fladt tag'\r\n self.tagTyper[3] = 'Blødt tag'\r\n\r\n self.heatingTypes = []\r\n self.heatingTypes[1] = 'Centralvarme'\r\n self.heatingTypes[2] = 'Fjernvarme'\r\n self.heatingTypes[3] = 'El-Luftvarme'\r\n self.heatingTypes[4] = 'Jordvarme'\r\n self.heatingTypes[5] = 'Anden opvarmning'\r\n self.heatingTypes[6] = 'Halmfyr'\r\n\r\n self.ToiletsValue = []\r\n self.ToiletsValue[0] = '0'\r\n self.ToiletsValue[1] = '1'\r\n self.ToiletsValue[2] = '2'\r\n self.ToiletsValue[3] = '3 eller flere'\r\n\r\n self.BasementTypes = []\r\n self.BasementTypes[1] = 'Ingen eller ikke oplyst'\r\n self.BasementTypes[2] = 'Krybekælder'\r\n self.BasementTypes[3] = 'Kælder under 20 kvm'\r\n self.BasementTypes[4] = 'Kælder på 20 kvm eller mere'\r\n\r\n // computed observables\r\n self.TagtypeStr = ko.computed(function () {\r\n return self.tagTyper[self.Tagtype()]\r\n }, self)\r\n\r\n self.ToiletsStr = ko.computed(function () {\r\n if (self.Toilets() === 3 || self.Toilets() === '3') {\r\n return '3 eller flere'\r\n }\r\n return self.Toilets()\r\n }, self)\r\n\r\n self.HeatingTypeStr = ko.computed(function () {\r\n return self.heatingTypes[self.HeatingType()]\r\n }, self)\r\n\r\n self.BasementTypeStr = ko.computed(function () {\r\n return self.BasementTypes[self.BasementType()]\r\n }, self)\r\n\r\n self.FloorsStr = ko.computed(function () {\r\n return self.Floors() ? 'Ja' : 'Nej'\r\n }, self)\r\n\r\n self.OldProperty = ko.computed(function () {\r\n return (self.OpfoerelsesAar() < 1900)\r\n }, self)\r\n\r\n self.Alder = ko.computed(function () {\r\n if (self.OpfoerelsesAar()) {\r\n // get current time\r\n const _now = app.getBestDate()\r\n // get the date based on the year entered by the user\r\n const _opfoerelsesAar = new Date(self.OpfoerelsesAar() + '-01-01')\r\n // compare and return only year diff.\r\n const _age = Math.floor((_now - _opfoerelsesAar) / 31536000000) // A year in milliseconds\r\n return _age\r\n }\r\n }, self)\r\n\r\n self.showSvampDaekning = ko.computed(function () {\r\n const houseIsOld = self.Alder() > 30\r\n const hasKrybkaelder = String(self.BasementType()) === '2' // BasementType can be number or string\r\n return houseIsOld || hasKrybkaelder\r\n }, self)\r\n}\r\n\r\nexport { HusProdukt }\r\n","/* global ko */\r\n\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\n\r\nfunction RejseProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Daekning,\r\n RejseforsikringsOmraade,\r\n Vintersport,\r\n BagageSum,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n ) {\r\n self.isInit = true\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n\r\n self.Daekning = self.koMap(Daekning, self.Daekning, '', 'Daekning')\r\n self.RejseforsikringsOmraade = self.koMap(\r\n RejseforsikringsOmraade,\r\n self.RejseforsikringsOmraade,\r\n '',\r\n 'RejseforsikringsOmraade'\r\n )\r\n self.Vintersport = self.koMap(\r\n Vintersport,\r\n self.Vintersport,\r\n '',\r\n 'Vintersport'\r\n )\r\n self.BagageSum = self.koMap(BagageSum, self.BagageSum, '', 'BagageSum')\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.isInit = false\r\n }\r\n\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Daekning,\r\n val.RejseforsikringsOmraade,\r\n val.Vintersport,\r\n val.BagageSum,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.UnderwritingAccept,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n return (\r\n 'REJSE-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.RejseforsikringsOmraade() +\r\n '-' +\r\n self.Vintersport() +\r\n '-' +\r\n self.BagageSum()\r\n )\r\n }\r\n}\r\n\r\nexport { RejseProdukt }\r\n","/* global ko */\r\n\r\nimport { Person } from './../dk-ifshop-person-model'\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nfunction UlykkeProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.ForsikredePerson = h.koMap(new Person(PersonEntities.ForsikredePerson))\r\n self.AndenBegunstigedePerson = h.koMap(new Person(PersonEntities.AndenBegunstigedePerson))\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (data) {\r\n const val = data || {}\r\n self.isInit = true\r\n\r\n self.produktInit(\r\n val.ProduktID,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDato,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.UnderwritingAccept,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState,\r\n val.OCHConsentGiven\r\n )\r\n self.ForsikredePerson = self.koMap(\r\n val.ForsikredePerson,\r\n self.ForsikredePerson\r\n )\r\n\r\n self.AndenBegunstigedePerson = self.koMap(\r\n val.AndenBegunstigedePerson,\r\n self.AndenBegunstigedePerson\r\n )\r\n self.Alderstrin = self.koMap(\r\n val.Alderstrin,\r\n self.Alderstrin,\r\n '',\r\n 'Alderstrin'\r\n )\r\n self.Samlever = self.koMap(val.Samlever, self.Samlever, '', 'Samlever')\r\n\r\n self.CustomerIsTheInsuredPerson = ko.computed(function () {\r\n return !self.Samlever() && self.Alderstrin() === 2\r\n })\r\n self.CustomerIsNotTheInsuredPerson = ko.computed(function () {\r\n return self.Samlever() && self.Alderstrin() === 2\r\n })\r\n self.DisplayUlykkeKarensInfo = ko.computed(function () {\r\n return (self.Daekning().Navn() === 'Standard' || self.Daekning().Navn() === 'Super') &&\r\n self.Alderstrin() === 1 &&\r\n self.ForsikredePerson().Alder() < 16\r\n })\r\n\r\n if (val.DaekningHvornaar === 'B') {\r\n // on client B is not used for anything. It is only used on the server. on client we only select between H/F for adult and young people.\r\n // B may be a young person, so it must have a valid value or nothing. B is invalid\r\n // therefore it is reset. If the server finds out this is not a youngser, but a child (below 16). The field will be set to B on the server.\r\n val.DaekningHvornaar = ''\r\n }\r\n self.DaekningHvornaar = self.koMap(\r\n val.DaekningHvornaar,\r\n self.DaekningHvornaar,\r\n '',\r\n 'DaekningHvornaar'\r\n )\r\n self.Beskaeftigelse = self.koMap(\r\n val.Beskaeftigelse,\r\n self.Beskaeftigelse,\r\n '',\r\n 'Beskaeftigelse'\r\n )\r\n self.InvaliditetSum = self.koMap(\r\n val.InvaliditetSum,\r\n self.InvaliditetSum,\r\n '',\r\n 'InvaliditetSum'\r\n )\r\n self.DoedsfaldSum = self.koMap(\r\n val.DoedsfaldSum,\r\n self.DoedsfaldSum,\r\n '',\r\n 'DoedsfaldSum'\r\n )\r\n self.BegunstigelseAfNaermeste = self.koMap(\r\n val.BegunstigelseAfNaermeste,\r\n self.BegunstigelseAfNaermeste,\r\n '',\r\n 'BegunstigelseAfNaermeste'\r\n )\r\n\r\n self.Daekning = self.koMap(val.Daekning, self.Daekning)\r\n\r\n // make sure any changes are reflected on the customer as well\r\n self.ForsikredePerson().Foedselsdato.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n app.root.Kunde().Foedselsdato() !=\r\n self.ForsikredePerson().Foedselsdato()\r\n ) {\r\n app.root.Kunde().Foedselsdato(self.ForsikredePerson().Foedselsdato())\r\n }\r\n })\r\n self.ForsikredePerson().Cpr1.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n app.root.Kunde().Cpr1() != self.ForsikredePerson().Cpr1()\r\n ) {\r\n app.root.Kunde().Cpr1(self.ForsikredePerson().Cpr1())\r\n }\r\n })\r\n self.ForsikredePerson().Cpr2.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n app.root.Kunde().Cpr2() != self.ForsikredePerson().Cpr2()\r\n ) {\r\n app.root.Kunde().Cpr2(self.ForsikredePerson().Cpr2())\r\n }\r\n })\r\n self.ForsikredePerson().Fornavn.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n app.root.Kunde().Fornavn() != self.ForsikredePerson().Fornavn()\r\n ) {\r\n app.root.Kunde().Fornavn(self.ForsikredePerson().Fornavn())\r\n }\r\n })\r\n self.ForsikredePerson().Efternavn.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n app.root.Kunde().Efternavn() != self.ForsikredePerson().Efternavn()\r\n ) {\r\n app.root.Kunde().Efternavn(self.ForsikredePerson().Efternavn())\r\n }\r\n })\r\n\r\n // make sure any changes are reflected on the customer as well\r\n app.root.Kunde().Foedselsdato.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().Foedselsdato() !=\r\n app.root.Kunde().Foedselsdato()\r\n ) {\r\n self.ForsikredePerson().Foedselsdato(app.root.Kunde().Foedselsdato())\r\n }\r\n })\r\n app.root.Kunde().Cpr1.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().Cpr1() != app.root.Kunde().Cpr1()\r\n ) {\r\n self.ForsikredePerson().Cpr1(app.root.Kunde().Cpr1())\r\n }\r\n })\r\n app.root.Kunde().Cpr2.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().Cpr2() != app.root.Kunde().Cpr2()\r\n ) {\r\n self.ForsikredePerson().Cpr2(app.root.Kunde().Cpr2())\r\n }\r\n })\r\n app.root.Kunde().Fornavn.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().Fornavn() != app.root.Kunde().Fornavn()\r\n ) {\r\n self.ForsikredePerson().Fornavn(app.root.Kunde().Fornavn())\r\n }\r\n })\r\n app.root.Kunde().Efternavn.subscribe(function () {\r\n if (self.isInit === true) return\r\n if (\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().Efternavn() != app.root.Kunde().Efternavn()\r\n ) {\r\n self.ForsikredePerson().Efternavn(app.root.Kunde().Efternavn())\r\n }\r\n })\r\n\r\n if (\r\n app.root.Kunde().CprNr() !== '' &&\r\n self.CustomerIsTheInsuredPerson() &&\r\n self.ForsikredePerson().CprNr() === ''\r\n ) {\r\n self.ForsikredePerson().Cpr1(app.root.Kunde().Cpr1())\r\n self.ForsikredePerson().Cpr2(app.root.Kunde().Cpr2())\r\n }\r\n\r\n // todo: need a smarter solution\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(val)\r\n }\r\n }\r\n\r\n // UPDATE address\r\n self.updateAddress = function (val) {\r\n if (val && val.ForsikredePerson && self.ForsikredePerson) {\r\n self.ForsikredePerson().Postnr(val.ForsikredePerson.Postnr)\r\n self.ForsikredePerson().Latitude(val.ForsikredePerson.latitude)\r\n self.ForsikredePerson().Longitude(val.ForsikredePerson.longitude)\r\n self.ForsikredePerson().By(val.ForsikredePerson.By)\r\n self.ForsikredePerson().Etage(val.ForsikredePerson.Etage)\r\n self.ForsikredePerson().Gade(val.ForsikredePerson.Gade)\r\n self.ForsikredePerson().SideDoerNr(val.ForsikredePerson.SideDoerNr)\r\n self.ForsikredePerson().Husnr(val.ForsikredePerson.Husnr)\r\n }\r\n }\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n return (\r\n 'ULYKKE-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.Alderstrin() +\r\n '-' +\r\n self.Samlever() +\r\n '-' +\r\n self.DaekningHvornaar() +\r\n '-' +\r\n self.Beskaeftigelse() +\r\n '-' +\r\n self.ForsikredePerson().Alder() +\r\n '-' +\r\n self.InvaliditetSum() +\r\n '-' +\r\n self.DoedsfaldSum() +\r\n '-' +\r\n self.ForsikredePerson().CprNr()\r\n )\r\n }\r\n}\r\n\r\nexport { UlykkeProdukt }\r\n","/* global $ ko */\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { boat } from './dk-ifshop-boat-scripts'\r\n\r\nfunction BoatProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'TradeValue') {\r\n if ($.isNumeric(value)) {\r\n property($.parseInt(value, 'N', app.culture))\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (data) {\r\n const val = data || {}\r\n\r\n self.isInit = true\r\n self.produktInit(\r\n val.ProduktID,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.UnderwritingAccept,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState,\r\n val.OCHConsentGiven,\r\n val.EDIConsentGiven\r\n )\r\n self.Model = self.koMap(val.Model, self.Model)\r\n self.BoatType = self.koMap(val.BoatType, self.BoatType)\r\n self.MotorType = self.koMap(val.MotorType, self.MotorType)\r\n self.Length = self.koMap(val.Length, self.Length)\r\n self.HullMaterial = self.koMap(val.HullMaterial, self.HullMaterial)\r\n self.LovpligtigAnsvar = self.koMap(\r\n val.LovpligtigAnsvar,\r\n self.LovpligtigAnsvar,\r\n false,\r\n 'LovpligtigAnsvar'\r\n )\r\n self.TradeValue = self.koMap(val.TradeValue, self.TradeValue, null, 'TradeValue', true)\r\n self.Year = self.koMap(val.Year, self.Year)\r\n self.NumberOfMotors = self.koMap(val.NumberOfMotors, self.NumberOfMotors)\r\n self.CombinedHorsepower = self.koMap(val.CombinedHorsepower, self.CombinedHorsepower, null, 'CombinedHorsepower', true)\r\n self.Motor1Year = self.koMap(val.Motor1Year, self.Motor1Year)\r\n self.Motor2Year = self.koMap(val.Motor2Year, self.Motor2Year)\r\n self.BoatName = self.koMap(val.BoatName, self.BoatName)\r\n self.HullNumber = self.koMap(val.HullNumber, self.HullNumber)\r\n self.Motor1Model = self.koMap(val.Motor1Model, self.Motor1Model)\r\n self.Motor1IdNumber = self.koMap(val.Motor1IdNumber, self.Motor1IdNumber)\r\n self.Motor2Model = self.koMap(val.Motor2Model, self.Motor2Model)\r\n self.Motor2IdNumber = self.koMap(val.Motor2IdNumber, self.Motor2IdNumber)\r\n self.UseMotor1ModelForMotor2 = self.koMap(val.UseMotor1ModelForMotor2, self.UseMotor1ModelForMotor2, false)\r\n self.HasAuxiliaryMotor = self.koMap(val.HasAuxiliaryMotor, self.HasAuxiliaryMotor, null, 'HasAuxiliaryMotor', false)\r\n self.AuxiliaryMotorIdNumber = self.koMap(val.AuxiliaryMotorIdNumber, self.AuxiliaryMotorIdNumber)\r\n self.AuxiliaryMotorYear = self.koMap(val.AuxiliaryMotorYear, self.AuxiliaryMotorYear)\r\n self.HasBoatTrailer = self.koMap(val.HasBoatTrailer, self.HasBoatTrailer, null, 'HasBoatTrailer', false)\r\n self.HasBoatTrailerRegNr = self.koMap(val.HasBoatTrailerRegNr, self.HasBoatTrailerRegNr, true, 'HasBoatTrailerRegNr')\r\n self.BoatTrailerRegNr = self.koMap(val.BoatTrailerRegNr, self.BoatTrailerRegNr, '', 'BoatTrailerStelNr', true)\r\n self.BoatTrailerStelNr = self.koMap(val.BoatTrailerStelNr, self.BoatTrailerStelNr, '', 'BoatTrailerStelNr', true)\r\n\r\n self.Daekning = self.koMap(val.Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(val.Selvrisiko, self.Selvrisiko, '0', 'Selvrisiko')\r\n self.SailPeriodThroughTheYear = self.koMap(val.SailPeriodThroughTheYear, self.SailPeriodThroughTheYear, false)\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(self),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo()\r\n }\r\n })\r\n\r\n self.IsBasisCoverage = ko.computed(function () {\r\n return self.Daekning().Navn() === 'Basis'\r\n })\r\n self.IsExtraCoverage = ko.computed(function () {\r\n return self.Daekning().Navn() === 'Extra'\r\n })\r\n\r\n self.BoatAge = function BoatAge () {\r\n const year = self.Year()\r\n if (!year) {\r\n return null\r\n }\r\n return Date.now().getFullYear() - year\r\n }\r\n self.MotorTypeString = function MotorTypeString () {\r\n if (self.MotorType()) {\r\n return self.MotorType()\r\n } else {\r\n return 'Ingen'\r\n }\r\n }\r\n self.ModelString = function ModelString () {\r\n const maxLength = 25\r\n if (!self.Model()) return ''\r\n if (self.Model().length <= maxLength) {\r\n return self.Model()\r\n }\r\n var str = self.Model()\r\n const lastSpace = str.slice(0, maxLength - 2).lastIndexOf(' ')\r\n return str.slice(0, lastSpace > 0 ? lastSpace : maxLength - 3) + '...'\r\n }\r\n self.ShowNumberOfMotors = function ShowNumberOfMotors () {\r\n if (self.MotorType() && self.BoatType() !== boat.settings.boatTypeJetski) {\r\n return true\r\n }\r\n return false\r\n }\r\n self.isInit = false\r\n }\r\n self.init()\r\n // update this product with a new model based on regnr (if found)\r\n self.setModel = function (boatModel, jElement, actionSettings) {\r\n try {\r\n if (!boatModel) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-BOAT_MODEL_EMPTY'))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (boatModel || ''),\r\n produktId: (app.root.activeProduct.ProduktID() || '0')\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelBoat' }).then(function (token) {\r\n app.loadJson({\r\n boatModel,\r\n url: 'boatprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n token,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (\r\n !data.Model ||\r\n !data.BoatType ||\r\n data.Model !== this.args.code\r\n ) {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n return handleSuccessForFirstStep(data)\r\n } else {\r\n self.update(data)\r\n }\r\n }\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n boatModel,\r\n url: 'boatprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (\r\n !data.Model ||\r\n !data.Model.Model ||\r\n data.Model.RegNr !== this.args.code\r\n ) {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n return handleSuccessForFirstStep(data)\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n function handleSuccessForFirstStep (data) {\r\n self.update(data)\r\n h.fadeToForm($('#boatHolder'), 'boatprodukt/getsubview/detaljer')\r\n h.extendForm(\r\n $('#boatHolder'),\r\n 'boatprodukt/getsubview/generelt',\r\n $('#genereltHolder'),\r\n 1,\r\n app.root.activeProduct\r\n )\r\n h.enable($('#wizardNavigation button', app.getTopJElm()))\r\n }\r\n function handleSetModelError (data) {\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n app.root.activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage()\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n // ...\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n // ...\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(val)\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n const _key =\r\n 'BOAT-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' + app.root.Kunde().CprNr() +\r\n '-' +\r\n self.Model() +\r\n '-' +\r\n self.Year() +\r\n '-' +\r\n self.BoatType() +\r\n '-' +\r\n self.MotorType() +\r\n '-' +\r\n self.Length() +\r\n '-' +\r\n self.TradeValue() +\r\n '-' +\r\n self.NumberOfMotors() +\r\n '-' +\r\n self.CombinedHorsepower() +\r\n '-' +\r\n self.Motor1Year() +\r\n '-' +\r\n app.root.NumberOfClaimsBoat() +\r\n '-' +\r\n self.Selvrisiko() +\r\n '-' +\r\n self.SailPeriodThroughTheYear()\r\n return _key\r\n }\r\n}\r\nexport { BoatProdukt }\r\n","/* global ko */\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\n\r\nfunction HundProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n // called when a property changes value (Assigning the same value won't trigger this)\r\n if (value !== self.prev(name)) {\r\n self.hasChanged = true\r\n if (name === 'KaldeNavn') {\r\n self.KaldeNavn(h.capitaliseFirstLetter(value))\r\n }\r\n }\r\n }\r\n\r\n // INIT\r\n self.init = function (data) {\r\n const val = data || {}\r\n\r\n self.isInit = true\r\n self.produktInit(\r\n val.ProduktID,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.UnderwritingAccept,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState,\r\n val.OCHConsentGiven\r\n )\r\n self.Model = self.koMap(val.Model, self.Model)\r\n self.KaldeNavn = self.koMap(val.KaldeNavn, self.KaldeNavn, '', 'KaldeNavn')\r\n self.Race = self.koMap(val.Race, self.Race, null, 'Race')\r\n self.UdvidetAnsvar = self.koMap(\r\n val.UdvidetAnsvar,\r\n self.UdvidetAnsvar,\r\n false,\r\n 'UdvidetAnsvar'\r\n )\r\n self.Livsforsikring = self.koMap(\r\n val.Livsforsikring,\r\n self.Livsforsikring,\r\n false,\r\n 'Livsforsikring'\r\n )\r\n self.Alder = self.koMap(val.Alder, self.Alder, 3)\r\n self.Vaerdi = self.koMap(val.Vaerdi, self.Vaerdi, 1)\r\n self.Daekning = self.koMap(val.Daekning, self.Daekning)\r\n self.BirthPlace = self.koMap(val.BirthPlace, self.BirthPlace)\r\n self.Selvrisiko = self.koMap(val.Selvrisiko, self.Selvrisiko)\r\n self.HasCurrentHealthInsurance = self.koMap(val.HasCurrentHealthInsurance, self.HasCurrentHealthInsurance)\r\n self.NumberOfInjuriesLast3Years = self.koMap(val.NumberOfInjuriesLast3Years, self.NumberOfInjuriesLast3Years, 0)\r\n self.Fareklasse = self.koMap(val.Fareklasse, self.Fareklasse, 0)\r\n self.RaceUndtagelser = self.koMap(val.RaceUndtagelser, self.RaceUndtagelser, 0)\r\n\r\n let date\r\n if (val.FoedselsDatoStr) {\r\n date = h.getJSONStringDate(val.FoedselsDatoStr)\r\n }\r\n self.FoedselsDato = self.koMap(\r\n date,\r\n self.FoedselsDato,\r\n null,\r\n 'FoedselsDato',\r\n true\r\n )\r\n\r\n self.IDNummer = self.koMap(val.IDNummer, self.IDNummer, '', 'IDNummer')\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(self),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo()\r\n }\r\n })\r\n\r\n self.OnlyLiability = ko.computed(function () {\r\n return self.Daekning().Navn() === 'Basis'\r\n })\r\n\r\n function isDate (date) {\r\n return date instanceof Date && !isNaN(date)\r\n }\r\n\r\n function GetStringAsDate (dateString) {\r\n if (isDate(dateString)) {\r\n return dateString\r\n }\r\n if (!dateString || dateString === '') {\r\n return null\r\n }\r\n const date = new Date(\r\n dateString.substring(6, 10),\r\n dateString.substring(3, 5),\r\n dateString.substring(0, 2)\r\n )\r\n date.setMonth(date.getMonth() - 1)\r\n return date\r\n }\r\n\r\n self.GetBirthDateAsDate = function () {\r\n return GetStringAsDate(self.FoedselsDato())\r\n }\r\n\r\n self.GetIkraftDatoAsDate = function () {\r\n return GetStringAsDate(self.IkraftDato())\r\n }\r\n\r\n self.AgeInYears = function AgeInYears () {\r\n const foedselsDa = self.GetBirthDateAsDate()\r\n if (!foedselsDa) {\r\n return null\r\n }\r\n\r\n const ageDifMs = Date.now() - foedselsDa\r\n const ageDate = new Date(ageDifMs)\r\n return Math.abs(ageDate.getUTCFullYear() - 1970)\r\n }\r\n\r\n self.CoverageAvailableForThisDog = ko.computed(function () {\r\n if (self.OnlyLiability()) {\r\n return true\r\n }\r\n if (self.BirthPlace() === 'Andet land') {\r\n if (!self.HasCurrentHealthInsurance() || self.NumberOfInjuriesLast3Years() > 0) {\r\n return false\r\n }\r\n }\r\n if ((self.NumberOfInjuriesLast3Years() === '3')) {\r\n return false\r\n }\r\n return true\r\n })\r\n\r\n function DaysBetweenDates (date1, date2) {\r\n if (!date1 || !date2) {\r\n return null\r\n }\r\n const oneDay = 24 * 60 * 60 * 1000\r\n const diffDays = Math.round(Math.abs((date1.getTime() - date2.getTime()) / (oneDay)))\r\n return diffDays\r\n }\r\n\r\n self.DaysBetweenBirthAndToday = ko.computed(function () {\r\n return DaysBetweenDates(self.GetBirthDateAsDate(), new Date())\r\n })\r\n\r\n self.DaysBetweenBirthAndIkraftdato = ko.computed(function () {\r\n return DaysBetweenDates(self.GetBirthDateAsDate(), self.GetIkraftDatoAsDate())\r\n })\r\n\r\n self.isInit = false\r\n }\r\n\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n // ...\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n // ...\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(val)\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n const _key =\r\n 'HUND-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.Race() +\r\n '-' +\r\n self.Vaerdi() +\r\n '-' +\r\n self.Alder() +\r\n '-' +\r\n self.Selvrisiko()\r\n return _key\r\n }\r\n}\r\n\r\nexport { HundProdukt }\r\n","/* global ko $ */\r\n\r\nimport { BilProdukt } from '././bil/dk-ifshop-bil-produkt-model'\r\nimport { FamilieProdukt } from '././familie/dk-ifshop-familie-produkt-model'\r\nimport { HusProdukt } from '././hus/dk-ifshop-hus-produkt-model'\r\nimport { LivProdukt } from '././liv/dk-ifshop-liv-produkt-model'\r\nimport { Model } from './dk-ifshop-model'\r\nimport { Person } from './dk-ifshop-person-model'\r\nimport { RejseProdukt } from '././rejse/dk-ifshop-rejse-produkt-model'\r\nimport { UlykkeProdukt } from '././ulykke/dk-ifshop-ulykke-produkt-model'\r\nimport { KnallertProdukt } from './knallert/dk-ifshop-knallert-produkt-model'\r\nimport { MotorcykelProdukt } from '././mc/dk-ifshop-motorcykel-produkt-model'\r\nimport { CampingvognProdukt } from '././campingvogn/dk-ifshop-campingvogn-produkt-model'\r\nimport { TrailerProdukt } from '././trailer/dk-ifshop-trailer-produkt-model'\r\nimport { BoatProdukt } from '././boat/dk-ifshop-boat-produkt-model'\r\nimport { HundProdukt } from '././hund/dk-ifshop-hund-produkt-model'\r\nimport { app } from './dk-ifshop-application'\r\nimport { basic } from './dk-ifshop-scripts'\r\nimport { h } from './dk-ifshop-helper'\r\nimport { PersonEntities } from './dk-ifshop-constants'\r\n\r\nfunction Tilbud () {\r\n const self = this\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n self.activeProduct = ''\r\n self.flags = '' // settings to hold specific flags about progress. Can be saved to mvc\r\n\r\n self.Kunde = h.koMap(new Person(PersonEntities.Kunde))\r\n self.Medforsikret = h.koMap(new Person(PersonEntities.Medforsikret))\r\n\r\n self.PraemieStr = ko.observable(0)\r\n\r\n self.aggregatedCartInformation = ko.observable(null)\r\n\r\n self.JSONFilter = function (key, value) {\r\n if (\r\n key === 'activeProduct' ||\r\n key === 'ProduktOverblikV2' ||\r\n key === 'ProduktTyper'\r\n ) {\r\n return undefined\r\n } else if ((key === 'Foedselsdato' || key === 'IkraftDato') && value) {\r\n // correct due to culture on server (TODO: always save in this format on client)\r\n return h.correctStringDate(value)\r\n } else {\r\n return value\r\n }\r\n }\r\n\r\n self.JSON = function () {\r\n return ko.toJSON(self, self.JSONFilter)\r\n }\r\n\r\n // INIT\r\n self.init = function (data) {\r\n const val = data || {}\r\n\r\n self.EDIInitiated = self.koMap(val.EDIInitiated, self.EDIInitiated)\r\n self.EDIActive = self.koMap(val.EDIActive, self.EDIActive, 'EDIActive', true)\r\n\r\n self.Kunde = self.koMap(val.Kunde, self.Kunde)\r\n self.DisableCustomerElements = self.koMap(val.DisableCustomerElements, self.DisableCustomerElements)\r\n self.DisableCustomerNameElements = self.koMap(val.DisableCustomerNameElements, self.DisableCustomerNameElements)\r\n self.ShowCustomerNameElements = self.koMap(val.ShowCustomerNameElements, self.ShowCustomerNameElements)\r\n self.ShowLoggedIn = self.koMap(val.ShowLoggedIn, self.ShowLoggedIn)\r\n self.ShowLoggedInUserInfo = self.koMap(val.ShowLoggedInUserInfo, self.ShowLoggedInUserInfo)\r\n self.ShowCustomerElements = self.koMap(val.ShowCustomerElements, self.ShowCustomerElements)\r\n self.ShowEmailPhoneOverview = self.koMap(val.ShowEmailPhoneOverview, self.ShowEmailPhoneOverview)\r\n self.PaymentServiceExists = self.koMap(val.PaymentServiceExists, self.PaymentServiceExists)\r\n self.UserClickedChangeEmail = self.koMap(false, self.UserClickedChangeEmail)\r\n self.UserClickedChangePhone = self.koMap(false, self.UserClickedChangePhone)\r\n self.UnauthenticatedCprNr = self.koMap(val.UnauthenticatedCprNr, self.UnauthenticatedCprNr)\r\n\r\n self.ShowEmailEditMode = ko.computed(function () {\r\n return self.UserClickedChangeEmail() || !self.Kunde().InitialEmailAdr\r\n })\r\n self.ShowPhoneEditMode = ko.computed(function () {\r\n return self.UserClickedChangePhone() || !self.Kunde().InitialMobilNr\r\n })\r\n\r\n self.showLoggedInUserAddressChangedFor = (product) => {\r\n if (product === 'bil' || product === 'motorcykel') {\r\n return true\r\n }\r\n return false\r\n }\r\n self.showLoggedInUserAddressChangedNotification = ko.observable(0)\r\n self.showLoggedInUserAddressChangedNotificationFunc = () => {\r\n if (!app.root || !app.root.activeProduct) {\r\n return false\r\n }\r\n\r\n if (app.page === 'checkout') {\r\n // In checkout we can have multiple products in the cart, here we need to add address changed info etc. if relevant case and relevant product is in cart.\r\n const productsInCart = app.root.ProduktOverblikV2.ProductsInCart.map(a => a.id)\r\n for (let i = 0; i < productsInCart.length; i++) {\r\n if (self.showLoggedInUserAddressChangedFor(productsInCart[i])) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n return self.showLoggedInUserAddressChangedFor(app.root.activeProduct.produktNavn)\r\n }\r\n\r\n self.Medforsikret = self.koMap(val.Medforsikret, self.Medforsikret)\r\n\r\n self.IsExistingCustomer = self.koMap(\r\n val.IsExistingCustomer,\r\n self.IsExistingCustomer\r\n )\r\n\r\n self.PriceAfterAuthentication = self.koMap(\r\n val.PriceAfterAuthentication,\r\n self.PriceAfterAuthentication\r\n )\r\n\r\n self.PricePriorToAuthentication = self.koMap(\r\n val.PricePriorToAuthentication,\r\n self.PricePriorToAuthentication\r\n )\r\n\r\n self.IsPurchasingOrFinished = val.IsPurchasingOrFinished\r\n ? val.IsPurchasingOrFinished\r\n : false\r\n self.TilbudNr = self.koMap(val.TilbudNr, self.TilbudNr)\r\n self.Praemie = self.koMap(val.Praemie, self.Praemie)\r\n self.PraemiePerMonth = self.koMap(val.PraemiePerMonth, self.PraemiePerMonth)\r\n self.Discount = self.koMap(val.Discount, self.Discount)\r\n\r\n self.CartCount = self.koMap(val.CartCount, self.CartCount)\r\n self.flags = val.Flags\r\n\r\n self.NumberOfClaimsCarAndMc = self.koMap(\r\n val.NumberOfClaimsCarAndMc,\r\n self.NumberOfClaimsCarAndMc,\r\n '',\r\n 'NumberOfClaimsCarAndMc',\r\n false\r\n )\r\n\r\n self.NumberOfClaimsBoat = self.koMap(\r\n val.NumberOfClaimsBoat,\r\n self.NumberOfClaimsBoat,\r\n undefined,\r\n 'NumberOfClaimsBoat',\r\n false\r\n )\r\n\r\n self.AntalSkaderHus = self.koMap(\r\n val.AntalSkaderHus,\r\n self.AntalSkaderHus,\r\n undefined,\r\n 'AntalSkaderHus',\r\n false\r\n )\r\n self.AntalSkaderFamilie = self.koMap(\r\n val.AntalSkaderFamilie,\r\n self.AntalSkaderFamilie,\r\n '',\r\n 'AntalSkaderFamilie',\r\n false\r\n )\r\n self.PraemieStr(h.getPrice(self.Praemie()))\r\n\r\n val.MinAntalHusSkader = val.AntalSkaderHus // not implemented on server yet\r\n self.MinAntalHusSkader = self.koMap(\r\n val.MinAntalHusSkader,\r\n self.MinAntalHusSkader,\r\n '',\r\n 'MinAntalHusSkader'\r\n )\r\n self.FrysKundeInfo = self.koMap(val.FrysKundeInfo, self.FrysKundeInfo)\r\n self.SamleKunde = self.koMap(val.SamleKunde, self.SamleKunde)\r\n\r\n self.CustomerBenefitLevel = self.koMap(\r\n val.DataQl,\r\n self.CustomerBenefitLevel,\r\n '',\r\n 'CustomerBenefitLevel'\r\n )\r\n\r\n self.PaymentProvider = self.koMap(\r\n val.PaymentProvider,\r\n self.PaymentProvider,\r\n 0,\r\n 'PaymentProvider'\r\n )\r\n\r\n self.PaymentInterval = self.koMap(val.PaymentInterval, self.PaymentInterval)\r\n self.Order = self.koMap(val.Order, self.Order, null, 'Order')\r\n self.aggregatedCartInformation = self.koMap(\r\n val.aggregatedCartInformation,\r\n self.aggregatedCartInformation,\r\n null,\r\n 'aggregatedCartInformation',\r\n false,\r\n true\r\n )\r\n\r\n self.PreferredLoginMethod = self.koMap(val.PreferredLoginMethod, self.PreferredLoginMethod)\r\n\r\n self.Disv = self.koMap(val.Disv, self.Disv)\r\n\r\n self.TotalPremiumMonthly = ko.computed(function () {\r\n const premium = Math.ceil(self.PraemiePerMonth()).toLocaleString()\r\n return premium.replace('.', ',') + ' kr.'\r\n })\r\n\r\n self.TotalPremiumYearly = ko.computed(function () {\r\n const premium = Math.ceil(self.Praemie()).toLocaleString()\r\n return premium.replace('.', ',') + ' kr.'\r\n })\r\n\r\n h.subscribe(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, () => {\r\n self.showLoggedInUserAddressChangedNotification(self.showLoggedInUserAddressChangedNotificationFunc())\r\n })\r\n }\r\n\r\n self.init()\r\n\r\n self.onlyMopedInShoppingCart = () => {\r\n const produktOverblik = app.root.ProduktOverblikV2.ProductsInCart\r\n if (produktOverblik.length == 0) {\r\n return false\r\n }\r\n for (let i = 0; i < produktOverblik.length; i++) {\r\n const currentOverblik = produktOverblik[i]\r\n const activeProductName = currentOverblik.localName.toLocaleLowerCase()\r\n if (activeProductName === 'knallert') {\r\n const activeProductSubType = currentOverblik.produktSubType.toLocaleLowerCase()\r\n if (activeProductSubType === 'eu') {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n // Let the active product handle it\r\n self.activeProduct.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n // Let the active product handle it\r\n self.activeProduct.stepChanged()\r\n }\r\n\r\n self.save = function (actionSettings) {\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'savetilbud' }).then(function (token) {\r\n app.loadJson({\r\n url: 'tilbud/savetilbud',\r\n data: '{\"tilbud\" : ' + app.root.JSON() + '}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true,\r\n token,\r\n done: actionSettings.done,\r\n fail: actionSettings.fail\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n url: 'tilbud/savetilbud',\r\n data: '{\"tilbud\" : ' + app.root.JSON() + '}',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: actionSettings.done,\r\n fail: actionSettings.fail\r\n })\r\n }\r\n }\r\n\r\n // SYNC (Read from server)\r\n self.sync = function (actionSettings) {\r\n return self.syncWithCallback(actionSettings)\r\n }\r\n\r\n self.syncWithCallback = function (actionSettings, resolver, rejecter) {\r\n self.syncInitiated = true\r\n actionSettings = actionSettings || {}\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'synctilbud' }).then(function (token) {\r\n app.loadJson({\r\n url: 'tilbud/synctilbud',\r\n actionOnBusy: 'ignoreBusy',\r\n data: '{ \"tilbudNr\" : \"' + (self.TilbudNr() || '0') + '\" }',\r\n token,\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data) {\r\n self.update(data)\r\n if (data.ServerGeneratedCheckoutMarkup) {\r\n app.priceSummaryDataUpdate(data.ServerGeneratedCheckoutMarkup)\r\n }\r\n if (typeof resolver === 'function') {\r\n resolver()\r\n }\r\n },\r\n fail: function (data) {\r\n if (typeof rejecter === 'function') {\r\n rejecter(new Error(data))\r\n }\r\n },\r\n operationFail: function (data) {\r\n if (actionSettings.operationFail) {\r\n actionSettings.operationFail(data)\r\n }\r\n },\r\n entryFail: function (data) {\r\n if (actionSettings.entryFail) {\r\n actionSettings.entryFail(data)\r\n }\r\n },\r\n always: function () {\r\n self.syncInitiated = false\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n url: 'tilbud/synctilbud',\r\n actionOnBusy: 'ignoreBusy',\r\n data: '{ \"tilbudNr\" : \"' + (self.TilbudNr() || '0') + '\" }',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data) {\r\n self.update(data)\r\n if (data.ServerGeneratedCheckoutMarkup) {\r\n app.priceSummaryDataUpdate(data.ServerGeneratedCheckoutMarkup)\r\n }\r\n if (typeof resolver === 'function') {\r\n resolver()\r\n }\r\n },\r\n fail: function (data) {\r\n if (typeof rejecter === 'function') {\r\n rejecter(new Error(data))\r\n }\r\n },\r\n operationFail: function (data) {\r\n if (actionSettings.operationFail) {\r\n actionSettings.operationFail(data)\r\n }\r\n },\r\n entryFail: function (data) {\r\n if (actionSettings.entryFail) {\r\n actionSettings.entryFail(data)\r\n }\r\n },\r\n always: function () {\r\n self.syncInitiated = false\r\n }\r\n })\r\n }\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(val)\r\n\r\n if (val.ProduktTyper) {\r\n self.ProduktTyper = val.ProduktTyper\r\n }\r\n\r\n if (val.ProduktOverblikV2) {\r\n self.ProduktOverblikV2 = val.ProduktOverblikV2\r\n }\r\n // update server time\r\n if (!val.CurrentTime) {\r\n app.serverTime = new Date()\r\n } else {\r\n app.serverTime = new Date(val.CurrentTime)\r\n }\r\n h.publish(h.TILBUD_UPDATED, app.gtmTrackingMetaData())\r\n }\r\n }\r\n\r\n self.ensureActiveProduct = function (id, action) {\r\n if ((self.activeProduct && self.activeProduct.ProduktID() == id)) {\r\n // the required product is already loaded / active\r\n action()\r\n } else {\r\n // the active product is other / not loaded. Load the required product\r\n self.syncActiveProdukt({ done: action }, id)\r\n }\r\n }\r\n\r\n self.fetchTilbud = function (actionSettings, resolver, rejecter) {\r\n self.syncTilbudAndActiveProdukt('tilbud/fetchtilbud', actionSettings, resolver, rejecter)\r\n }\r\n\r\n self.fetchTilbudCheckout = function (actionSettings, resolver, rejecter) {\r\n self.syncTilbudAndActiveProdukt('tilbud/fetchtilbudcheckout', actionSettings, resolver, rejecter)\r\n }\r\n\r\n self.UpdatedTilbudAndActiveProduct = (tilbud, produkt) => {\r\n self.update(tilbud)\r\n // load the required product bundle before continuing\r\n self.setActiveProduct(produkt.ProductName)\r\n if (self.activeProduct) {\r\n self.activeProduct.update(produkt)\r\n } else {\r\n app.onClientFail(\r\n 'NO_ACTIVEPRODUCT',\r\n 'tilbud.activeProduct is not defined.'\r\n )\r\n }\r\n self.handleCustomerBenefitLevelChanged(tilbud)\r\n return true\r\n }\r\n\r\n self.syncTilbudAndActiveProdukt = function (\r\n endpoint,\r\n actionSettings,\r\n resolver,\r\n rejecter\r\n ) {\r\n actionSettings = actionSettings || {}\r\n\r\n app.loadJson({\r\n url: endpoint,\r\n actionOnBusy: 'ignoreBusy',\r\n data: '{ \"tilbudNr\" : \"' + (self.TilbudNr() || '0') + '\" }',\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n const tilbud = data.Tilbud\r\n const productType = jqXHR.getResponseHeader(\r\n 'data-tilbud-activeprodukttype'\r\n )\r\n const produkt = data.Produkt\r\n self.update(tilbud)\r\n if (productType) {\r\n // load the required product bundle before continuing\r\n self.setActiveProduct(productType)\r\n if (self.activeProduct) {\r\n self.activeProduct.update(produkt)\r\n } else {\r\n app.onClientFail(\r\n 'NO_ACTIVEPRODUCT',\r\n 'tilbud.activeProduct is not defined.'\r\n )\r\n }\r\n } else {\r\n app.onClientFail(\r\n 'NO_ACTIVEPRODUCT_TYPE',\r\n 'type from header data-tilbud-activeprodukttype is empty.'\r\n )\r\n }\r\n if (actionSettings.done) {\r\n // run actionSettings.done explicitely to make sure it is run AFTER bLoader.runAction\r\n actionSettings.done(data, textStatus, jqXHR)\r\n }\r\n\r\n if (app.page != 'kvittering') {\r\n app.bottomDataUpdate(data)\r\n }\r\n if (tilbud.ServerGeneratedCheckoutMarkup) {\r\n app.priceSummaryDataUpdate(tilbud.ServerGeneratedCheckoutMarkup)\r\n }\r\n self.handleCustomerBenefitLevelChanged(data.Tilbud)\r\n\r\n if (typeof resolver === 'function') {\r\n resolver()\r\n }\r\n return true\r\n },\r\n fail: function (data) {\r\n if (typeof rejecter === 'function') {\r\n rejecter(new Error(data))\r\n }\r\n },\r\n operationFail: function (data) {\r\n if (actionSettings.operationFail) {\r\n actionSettings.operationFail(data)\r\n }\r\n },\r\n entryFail: function (data) {\r\n if (actionSettings.entryFail) {\r\n actionSettings.entryFail(data)\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.handleCustomerBenefitLevelChanged = function (tilbud) {\r\n if (tilbud && tilbud.ShowDataQlMessage) {\r\n basic.displaySimpleMessage(\r\n undefined,\r\n undefined,\r\n tilbud.DataQlChangedShortMessage,\r\n tilbud.DataQlChangedLongMessage\r\n )\r\n\r\n self.setCustomerBenefitLevelChanged(false)\r\n }\r\n }\r\n\r\n self.setCustomerBenefitLevelChanged = function (val) {\r\n app.loadJson({\r\n url: 'api/cart/customerBenefitLevelChanged/clear',\r\n data: '{ \"customerBenefitLevelChanged\" : \"' + val + '\" }',\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) { },\r\n entryFail: function (data, textStatus, jqXHR) {\r\n throw new Error('customerBenefitLevelChanged clear failed!')\r\n }\r\n })\r\n }\r\n\r\n self.syncActiveProdukt = function (actionSettings, id) {\r\n let _url = 'tilbud/syncactiveprodukt'\r\n if (id) {\r\n // a specific product is required. call different method with id\r\n _url = 'tilbud/syncspecificprodukt/' + id\r\n }\r\n app.loadJson({\r\n url: _url,\r\n actionOnBusy: 'queue', // otherwise blocked by action LoadStep.\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n const productType = jqXHR.getResponseHeader(\r\n 'data-tilbud-activeprodukttype'\r\n )\r\n if (productType) {\r\n // load the required product bundle before continuing\r\n self.setActiveProduct(productType)\r\n\r\n if (self.activeProduct) {\r\n self.activeProduct.update(data)\r\n } else {\r\n app.onClientFail(\r\n 'NO_ACTIVEPRODUCT',\r\n 'tilbud.activeProduct is not defined.'\r\n )\r\n }\r\n\r\n if (actionSettings.done) {\r\n // run actionSettings.done explicitely to make sure it is run AFTER bLoader.runAction\r\n actionSettings.done(data, textStatus, jqXHR)\r\n }\r\n\r\n return true // tell loader not to run actionSettings.done (if any)\r\n } else {\r\n app.onClientFail(\r\n 'NO_ACTIVEPRODUCT_TYPE',\r\n 'type from header data-tilbud-activeprodukttype is empty.'\r\n )\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.produktObject = function (produktNavn) {\r\n const productName = produktNavn.toLowerCase()\r\n let newProduct\r\n if (productName === 'bil') {\r\n newProduct = new BilProdukt()\r\n } else if (productName === 'hus') {\r\n newProduct = new HusProdukt()\r\n } else if (productName === 'familie') {\r\n newProduct = new FamilieProdukt()\r\n } else if (productName === 'ulykke') {\r\n newProduct = new UlykkeProdukt()\r\n } else if (productName === 'ulykkebarn') {\r\n // WDK-2018 - Implementeres her pga special webpart til ulykke barn, men ulykke bar er ikke et get produkt meg egen kontroler og model\r\n newProduct = new UlykkeProdukt()\r\n } else if (productName === 'borneforsikring') {\r\n // WDK-2130\r\n newProduct = new UlykkeProdukt()\r\n } else if (productName === 'liv') {\r\n newProduct = new LivProdukt()\r\n } else if (productName === 'rejse') {\r\n newProduct = new RejseProdukt()\r\n } else if (productName === 'knallert') {\r\n newProduct = new KnallertProdukt()\r\n } else if (productName === 'hund') {\r\n newProduct = new HundProdukt()\r\n } else if (productName === 'baad') {\r\n newProduct = new BoatProdukt()\r\n } else if (productName === 'boat') {\r\n newProduct = new BoatProdukt()\r\n } else if (productName === 'motorcykel') {\r\n newProduct = new MotorcykelProdukt()\r\n } else if (productName === 'campingvogn') {\r\n newProduct = new CampingvognProdukt()\r\n } else if (productName === 'trailer') {\r\n newProduct = new TrailerProdukt()\r\n }\r\n if (newProduct) {\r\n newProduct.produktNavn = productName\r\n }\r\n return newProduct\r\n }\r\n\r\n self.findBy = function (postnr, targetElement, actionSettings) {\r\n try {\r\n app.loadJson({\r\n url: 'tilbud/findby',\r\n data: '{ \"postnr\" : \"' + (postnr || '0') + '\" }',\r\n cache: true,\r\n block: true,\r\n actionOnBusy: 'ignoreBusy',\r\n targetElement,\r\n actionSettings,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n app.onEntryFail(data, this.targetElement)\r\n if (actionSettings && actionSettings.entryFail) {\r\n actionSettings.entryFail(data)\r\n }\r\n },\r\n operationFail: function (data) {\r\n app.displayEntryExceptionInfo(' ', targetElement)\r\n return true\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.isFlagSet = function (flag) {\r\n if (flag) {\r\n return self.flags.indexOf(flag) >= 0\r\n }\r\n return false\r\n }\r\n\r\n self.setFlag = function (flag) {\r\n if (self.isFlagSet(flag) === false) {\r\n self.flags += flag\r\n }\r\n }\r\n\r\n self.resetFlag = function (flag) {\r\n self.flags = self.flags.replace(flag, '')\r\n }\r\n\r\n self.saveFlags = function () {\r\n app.loadJson({\r\n url: 'tilbud/saveflags',\r\n actionOnBusy: 'ignoreBusy',\r\n data: '{\"flags\" : \"' + self.flags + '\"}',\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n self.setActiveProduct = function (produkt) {\r\n // TODO: notify that activeProduct has changed\r\n self.activeProduct = self.produktObject(produkt)\r\n h.publish('wsdk-active-product-changed')\r\n }\r\n\r\n self.opretNytProdukt = function (produkt, actionSettings) {\r\n // WDK-2130\r\n if (produkt.toLowerCase() === 'borneforsikring') {\r\n produkt = 'ulykkebarn'\r\n }\r\n\r\n app.loadJson({\r\n url: 'shop/nyt/' + produkt,\r\n actionSettings,\r\n allowCredentials: true,\r\n done: function (data) {\r\n // console.log('New product Id is: ' + data.ProduktID)\r\n // // we need to track the current activeId when its added\r\n // if (!window.app.activeProductId) {\r\n // window.app.root.activeProductId = self.koMap(data.ProduktID, app.root.activeProduct.ProduktID)\r\n // } else {\r\n // window.app.root.activeProductId(data.ProduktID)\r\n // }\r\n if (app.ShopPageUrl) {\r\n // navigate to shop page (but only if the url is known - it isn't for the shpop webpart)\r\n app.gotoShopPage()\r\n } else {\r\n app.loadPage('produkt')\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.addProdukt = function (type, actionSettings) {\r\n // send data\r\n if (type) {\r\n app.loadJson({\r\n actionSettings,\r\n url: 'tilbud/AddProdukt',\r\n data: '{\"type\" : \"' + type + '\"}',\r\n allowCredentials: true,\r\n customInfo: type,\r\n block: false\r\n // used to hold other inf to be used by any listener on request/response events like e.g. the trend tracker code\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport { Tilbud }\r\n","/* global ko $ */\r\n\r\nimport { app } from './dk-ifshop-application'\r\nimport { h } from './dk-ifshop-helper'\r\nimport { singleActionButton } from './dk-ifshop-controls-actionButton'\r\nimport { stateManager } from '../Site/dk-ifshop-statemanagement'\r\n\r\nfunction WebShopWizard (currentStepNo, flags) {\r\n const self = this\r\n self.steps = ko.observableArray([]) // all steps. loaded form mvc\r\n self.flags = flags // settings to hold specific flags about progress. Can be saved to mvc\r\n self.currentStepNo = 0 // currently displayed step (Same as pendingStepNo unless the user has stepped backwards)\r\n self.lastStep = undefined // last step\r\n self.lastStepNo = 0 // last step index\r\n self.pendingStepNo = 0 // step most fwd that has been openend\r\n self.id = ''\r\n self.historyAdded = false\r\n self.redirectUrl = ''\r\n\r\n self.SetCurrentStepNo = function (currentStepNo) {\r\n if (self.currentStepNo !== currentStepNo) {\r\n if (self.steps().length === 0) {\r\n app.loadPage('checkout', undefined, undefined, {})\r\n return\r\n }\r\n // save old step\r\n self.lastStepNo = self.currentStepNo\r\n self.lastStep = self.steps()[self.lastStepNo - 1] // self.Steps is now a method after knockout kicks in\r\n // reg. new step\r\n self.currentStepNo = currentStepNo\r\n self.currentStep = self.steps()[currentStepNo - 1] // self.Steps is now a method after knockout kicks in\r\n if (currentStepNo > self.pendingStepNo) {\r\n // selected step if further than pending, so the current step is the new pending step\r\n self.pendingStepNo = currentStepNo\r\n }\r\n // notify about step change\r\n if (self.currentStepNo > 0) {\r\n $(self).trigger('wizardStep')\r\n h.publish('GTMWizardStep', app.getGTMPageInfo())\r\n }\r\n }\r\n }\r\n // make initial selection\r\n self.SetCurrentStepNo(currentStepNo)\r\n\r\n self.validate = function (actionSettings) {\r\n // called from singleActionButton on goFwd or Goto\r\n if (actionSettings && actionSettings.actionName === 'goFwd') {\r\n if (self.currentStep.RequiredProgress <= self.currentStep.Progress) {\r\n self.dataValidate(actionSettings)\r\n } else {\r\n actionSettings.fail()\r\n }\r\n } else {\r\n self.dataValidate(actionSettings)\r\n }\r\n }\r\n\r\n self.dataValidate = function (actionSettings) {\r\n // may be overwritten by e.g. app.root datamodel, so the data model can be validated on an action\r\n actionSettings.done()\r\n }\r\n self.goToMaxiCart = function () {\r\n if (self.currentStep) {\r\n // validate if progress have been pushed far enough\r\n if (self.currentStep.RequiredProgress > self.currentStep.Progress) {\r\n return\r\n }\r\n\r\n if (self.currentStepNo < self.pendingStepNo) {\r\n // fwd is only used to push fwd to a new pending step. This is a move from a step, which the user hasd moved back to manually. use Goto\r\n self.goTo(self.currentStepNo + 1)\r\n return\r\n }\r\n singleActionButton.execute({\r\n onSuccess: self.goFwdActionMaxiCart,\r\n validateForms: true,\r\n actionName: 'goFwd',\r\n waiting: 1000,\r\n customValidator: self,\r\n always: function (data) {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n } else {\r\n app.onClientFail('CLIENT-WIZARD_NO_STEP', '', app.wizard)\r\n }\r\n }\r\n\r\n self.goFwdActionMaxiCart = function () {\r\n self.goFwdAjaxCall(app.loadMaxiCart)\r\n }\r\n self.goFwdAndRedirectToProduct = function (productId) {\r\n self.redirectUrl = window.ifws_shopUrl + '?product_id=' + productId\r\n self.goFwdAjaxCall(self.goFwdRedirectAction)\r\n }\r\n self.goFwd = function () {\r\n if (window.appInsightsWS) {\r\n window.appInsightsWS.trackTrace({ message: 'wizard-model.goFwd' })\r\n }\r\n\r\n if (self.currentStep) {\r\n /* I commented out this code because it prevents the validation code from running.\r\n * But this can have consequences beyond my understanding.\r\n * However, could not find a scenario where this \"if\" was significant.\r\n * In cases where \"progress\" has not reached its goal, the form is not valid,\r\n * which is checked in \"singleActionButton.execute\"\r\n * Once this can be confirmed by tests or similar, you can delete this super long comment and the code.\r\n * Regards Johan ;) /\r\n //validate if progress have been pushed far enough\r\n /*if (self.currentStep.RequiredProgress > self.currentStep.Progress) {\r\n return;\r\n } */\r\n\r\n if (self.currentStepNo < self.pendingStepNo) {\r\n // fwd is only used to push fwd to a new pending step. This is a move from a step, which the user has moved back to manually. use Goto\r\n self.goTo(self.currentStepNo + 1)\r\n return\r\n }\r\n singleActionButton.execute({\r\n onSuccess: self.goFwdAction,\r\n onFail: () => {\r\n $(document).trigger('wizard.goFwd.failed')\r\n },\r\n validateForms: true,\r\n actionName: 'goFwd',\r\n waiting: 1000,\r\n customValidator: self\r\n })\r\n } else {\r\n app.onClientFail('CLIENT-WIZARD_NO_STEP', '', app.wizard)\r\n }\r\n }\r\n\r\n self.setPreAjaxBannerCall = function (xhr) {\r\n // avoid null values (will display as \"null\" in the header)\r\n if (app.sessionId == null) app.sessionId = ''\r\n if (app.sessionCounter == null) app.sessionCounter = ''\r\n\r\n // add important headers\r\n xhr.setRequestHeader('ifshop_initial_referrer', app.InitialReferrer)\r\n\r\n // WDK-1666\r\n xhr.setRequestHeader('ifshop_kampagne', app.KampagneCode)\r\n\r\n xhr.setRequestHeader('ifshop_dataversionkey', app.dataVersionKey)\r\n xhr.setRequestHeader('ifshop_sessioncounter', app.sessionCounter)\r\n\r\n xhr.withCredentials = true\r\n\r\n if (self.block) {\r\n app.setBusy(self.actionId, self)\r\n }\r\n }\r\n\r\n self.goFwdAction = function () {\r\n // validation complete - load new step's html\r\n app.loadHtml({\r\n url: 'wizard/gofwd/' + self.id,\r\n actionId: 'changewizardstep',\r\n // actionOnBusy: 'queue',\r\n block: true,\r\n prio: 'first',\r\n targetElement: self.getCurrentWizardBodyJElement(),\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n self.loadStep(data, jqXHR)\r\n },\r\n always: function () {\r\n if (!this.response) {\r\n // error or other problem. reopen\r\n singleActionButton.setIsChanging(false)\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.goTo = function (stepNo) {\r\n if (self.currentStep) {\r\n const onSuccess = function () {\r\n self.goToAction(stepNo)\r\n }\r\n const onFail = function (action) {\r\n if (this.actionName === 'goBwd') {\r\n app.root.activeProduct.load(action) // reads saved data from server overwriting any changes not accepted\r\n } else {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n }\r\n\r\n const _validateForm = stepNo > self.currentStepNo\r\n\r\n self.goTo.action = function () {\r\n // always validate when moving away from any step but the pending\r\n singleActionButton.execute({\r\n onSuccess,\r\n onFail,\r\n validateForms: _validateForm,\r\n actionName: 'goTo',\r\n stepNo,\r\n waiting: 1000,\r\n customValidator: self\r\n })\r\n }\r\n\r\n if (!_validateForm) {\r\n // no save, so reset it immediately\r\n app.root.activeProduct.load({\r\n done: self.goTo.action\r\n })\r\n } else {\r\n self.goTo.action()\r\n }\r\n } else {\r\n app.onClientFail('CLIENT-WIZARD_NO_STEP', '', app.wizard)\r\n }\r\n }\r\n\r\n self.goToAction = function (stepNo) {\r\n app.loadHtml({\r\n // validation complete - load new step's html\r\n url: 'wizard/goto',\r\n data: '{ \"step\" : ' + stepNo + ',\"id\" : \"' + self.id + '\" }',\r\n actionId: 'changewizardstep',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n allowCredentials: true,\r\n prio: 'first',\r\n targetElement: self.getCurrentWizardBodyJElement(),\r\n done: function (data, textStatus, jqXHR) {\r\n self.loadStep(data, jqXHR)\r\n },\r\n always: function () {\r\n if (!this.response) {\r\n // error or other problem. reopen\r\n singleActionButton.setIsChanging(false)\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.goFwdAjaxCall = function (doneAction) {\r\n $.ajax({\r\n url: app.shopHostUrl + 'wizard/gofwd/' + self.id,\r\n type: 'post',\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n xhrFields: {\r\n withCredentials: true\r\n },\r\n beforeSend: function (xhr) {\r\n // app.writeDebugInfo('>>> BEGIN: ' + self.url);\r\n\r\n // avoid null values (will display as \"null\" in the header)\r\n if (app.sessionId == null) app.sessionId = ''\r\n if (app.sessionCounter == null) app.sessionCounter = ''\r\n\r\n // add important headers\r\n xhr.setRequestHeader('ifshop_initial_referrer', app.InitialReferrer)\r\n\r\n // WDK-1666\r\n xhr.setRequestHeader('ifshop_kampagne', app.KampagneCode)\r\n\r\n xhr.setRequestHeader('ifshop_dataversionkey', app.dataVersionKey)\r\n xhr.setRequestHeader('ifshop_sessioncounter', app.sessionCounter)\r\n\r\n xhr.withCredentials = true\r\n\r\n if (self.block) {\r\n app.setBusy(self.actionId, self)\r\n }\r\n\r\n window.setTimeout(function () {\r\n if (self.isPending == true) {\r\n self.spinnerElementId = app.showSpinner(\r\n self.targetElement,\r\n self.noAutoDisable,\r\n self.hiddenSpinner,\r\n self.largeSpinner\r\n )\r\n }\r\n }, 5000)\r\n }\r\n }).done(function (data, textStatus, jqXHR) {\r\n doneAction()\r\n })\r\n }\r\n self.goFwdRedirectAction = function () {\r\n if (self.redirectUrl) {\r\n app.redirect(self.redirectUrl)\r\n }\r\n }\r\n self.isFlagSet = function (flag) {\r\n if (flag && self.flags !== undefined) {\r\n return self.flags.indexOf(flag) >= 0\r\n }\r\n return false\r\n }\r\n\r\n self.setFlag = function (flag) {\r\n if (self.isFlagSet(flag) === false) {\r\n self.flags += flag\r\n }\r\n }\r\n\r\n self.resetFlag = function (flag) {\r\n if (self.flags) {\r\n self.flags = self.flags.replace(flag, '')\r\n }\r\n }\r\n\r\n self.saveFlags = function () {\r\n app.loadJson({\r\n url: 'wizard/saveflags',\r\n actionOnBusy: 'ignoreBusy',\r\n data: '{\"flags\" : \"' + self.flags + '\",\"id\" : \"' + self.id + '\" }',\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n self.getCurrentStep = function (targetElement) {\r\n app.loadHtml({\r\n url: 'wizard/getcurrentstep/' + self.id,\r\n actionOnBusy: 'ignoreBusy',\r\n targetElement,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n self.loadStep(data, jqXHR)\r\n }\r\n })\r\n }\r\n\r\n self.loadStep2 = function (data, jqXHR) {\r\n // get the element displaying the content (also to show spinner)\r\n const jSv = self.getCurrentWizardBodyJElement()\r\n // render wizard step content into DOM\r\n h.renderHtml(jSv, data, 'wizard.loadstep')\r\n\r\n // display\r\n $.when(\r\n // make code \"wait\" until the full completion of the animation and display of controls...\r\n jSv.show('blind', 400)\r\n ).done(function () {\r\n // ...because the events triggedered here are often dependent upon the graphics being 100% ready\r\n self.updateStepColors()\r\n app.setNotBusy('loadStep') // unlock\r\n $(app).trigger(\r\n 'sectionLoaded',\r\n ['wizard', h.getSections(jSv)] /* event argument(s) */\r\n )\r\n singleActionButton.setIsChanging(false)\r\n })\r\n }\r\n self.loadFullWidthFooter = function () {\r\n const text = self.getFullWidthFooterText()\r\n const element = $('#fullWidthFooter')\r\n\r\n if (text) {\r\n element.html(text)\r\n element.show()\r\n } else {\r\n element.html('')\r\n element.hide()\r\n }\r\n }\r\n\r\n self.getFullWidthFooterText = function () {\r\n let stepNr = '-step-'\r\n if (app.page === 'checkout') {\r\n stepNr = self.currentStepNo === self.steps().length ? stepNr + 'last' : ''\r\n } else {\r\n stepNr += self.currentStepNo\r\n }\r\n\r\n let text = app.getHjaelpeKodeText('client-full-width-footer-' + app.page + stepNr)\r\n if (!text) {\r\n text = app.getHjaelpeKodeText('client-full-width-footer')\r\n }\r\n return text\r\n }\r\n\r\n self.loadStep = function (data, jqXHR) {\r\n if (app.isPartner && stateManager.getPage() === 'checkout' && !self.historyAdded) {\r\n window.history.pushState({ customAction: stateManager.getPage() }, '', window.location)\r\n self.historyAdded = true\r\n\r\n window.onpopstate = function (e) {\r\n stateManager.setPage('produkt')\r\n // eslint-disable-next-line no-self-assign\r\n window.location.href = window.location.href\r\n }\r\n }\r\n try {\r\n const oldStep = self.currentStepNo\r\n const currentStepNo = parseInt(jqXHR.getResponseHeader('data-wizard-step'))\r\n if (currentStepNo) {\r\n self.SetCurrentStepNo(currentStepNo)\r\n }\r\n\r\n self.loadFullWidthFooter()\r\n const pendingStepNo = parseInt(\r\n jqXHR.getResponseHeader('data-wizard-pending-step')\r\n )\r\n if (pendingStepNo) {\r\n self.pendingStepNo = pendingStepNo\r\n }\r\n\r\n // block due to synchronous animations that allows other LoadSteps to obstruct\r\n app.setBusy('loadStep')\r\n // hide old step\r\n if (oldStep) {\r\n const jOSv = $('#wizardStep' + oldStep).find('.wizardBody') // Old step view\r\n if (h.jElement(jOSv)) {\r\n jOSv.hide('blind', 400, function () {\r\n // once hidden - load new step\r\n h.renderHtml(jOSv, '', 'wizard.loadstep')\r\n self.loadStep2(data, jqXHR)\r\n // save state change and notify\r\n app.root.stepChanged()\r\n // move to top of page\r\n window.scrollTo(0, 0)\r\n })\r\n }\r\n } else {\r\n // no old step to hide. display new step immediately\r\n self.loadStep2(data, jqXHR)\r\n\r\n // save state change and notify\r\n app.root.stepChanged()\r\n\r\n // move to top of page\r\n window.scrollTo(0, 0)\r\n }\r\n } catch (e) {\r\n app.setNotBusy('loadStep')\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.updateStepColors = function () {\r\n // change the colors of the steps. go trough stem step-by-step\r\n $('.wizardStep').each(function () {\r\n const _stepNummer = parseInt($(this).attr('data-StepNumber'))\r\n let jElement = null\r\n if (_stepNummer === self.currentStepNo) {\r\n // this is the current step\r\n jElement = $(this)\r\n jElement.removeClass('wizardStepClickable')\r\n jElement.addClass('wizardStepCurrent')\r\n } else {\r\n // not current\r\n jElement = $(this)\r\n jElement.removeClass('wizardStepCurrent')\r\n }\r\n\r\n if (_stepNummer < self.pendingStepNo) {\r\n // older than pending\r\n jElement.removeClass('wizardStepPending')\r\n jElement.addClass('wizardStepDone')\r\n if (_stepNummer !== self.currentStepNo) {\r\n jElement.addClass('wizardStepClickable')\r\n }\r\n } else if (_stepNummer === self.pendingStepNo) {\r\n // pending\r\n jElement.removeClass('wizardStepDone')\r\n jElement.addClass('wizardStepPending')\r\n if (_stepNummer !== self.currentStepNo) {\r\n jElement.addClass('wizardStepClickable')\r\n }\r\n } else {\r\n // after pending (next to come). For different reasons the pending step can be moved backwards. so to be sure. any steps after pending, must be reset too.\r\n jElement.removeClass('wizardStepDone')\r\n jElement.removeClass('wizardStepPending')\r\n }\r\n $('.stepNumberBack')\r\n .addClass('z')\r\n .removeClass('z') // IE8\r\n })\r\n }\r\n\r\n self.getCurrentWizardBodyJElement = function () {\r\n // get the element of the current step. used to e.g. display spinner\r\n return $('#wizardStep' + self.currentStepNo).find('.wizardBody')\r\n }\r\n\r\n self.getCurrentWizardHolder = function () {\r\n // get the element of the current step. used to e.g. display spinner\r\n return $('#wizardStep' + self.currentStepNo)\r\n }\r\n\r\n self.load = function () {\r\n // get step info from mvc\r\n self.steps.removeAll()\r\n app.loadJson({\r\n url: 'wizard/load/' + self.id,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (data) {\r\n self.id = data.Id\r\n // read all flags\r\n self.flags = data.Flags\r\n // read all steps\r\n $.each(data.Steps, function (key, val) {\r\n self.steps.push(\r\n new WizardStep(\r\n val.StepNo,\r\n val.Name,\r\n val.Progress,\r\n val.RequiredProgress\r\n )\r\n )\r\n })\r\n // set current step\r\n self.SetCurrentStepNo(data.PendingStepNo)\r\n // load new step\r\n self.getCurrentStep(self.getCurrentWizardBodyJElement())\r\n } else {\r\n app.onClientFail('CLIENT:WIZARD_NO_STEPS', '', data)\r\n }\r\n }\r\n })\r\n }\r\n\r\n self.onLoaded = function () {\r\n $(document).trigger('wizardLoaded')\r\n }\r\n}\r\n\r\nfunction WizardStep (StepNo, Name, Progress, RequiredProgress) {\r\n const self = this\r\n self.StepNo = StepNo\r\n self.Name = Name\r\n self.Progress = Progress\r\n self.RequiredProgress = RequiredProgress\r\n\r\n self.setProgress = function (progress) {\r\n self.Progress = progress\r\n self.saveProgress()\r\n }\r\n\r\n self.saveProgress = function () {\r\n // save progress info with the mvc server\r\n app.loadJson({\r\n url: 'wizard/saveprogress',\r\n actionOnBusy: 'ignoreBusy',\r\n data:\r\n '{\"progress\" : \"' +\r\n self.Progress +\r\n '\", \"stepNo\": ' +\r\n self.StepNo +\r\n ',\"id\" : \"' +\r\n app.wizard.id +\r\n '\" }',\r\n allowCredentials: true\r\n })\r\n }\r\n}\r\n\r\nexport { WebShopWizard, WizardStep }\r\n","/* global $ */\r\n\r\nexport class emailUnexpectedData {\r\n static attach (emailAddressElement, infoBoxElement) {\r\n emailUnexpectedData.toggleElement(emailAddressElement, infoBoxElement)\r\n\r\n emailAddressElement.addEventListener('blur', () => {\r\n emailUnexpectedData.toggleElement(emailAddressElement, infoBoxElement)\r\n })\r\n }\r\n\r\n static toggleElement (emailAddressElement, infoBoxElement) {\r\n const emailAddress = $(emailAddressElement).val().toLowerCase()\r\n const showInfoBox = this.containsUnexpectedData(emailAddress)\r\n\r\n $(infoBoxElement).toggle(!!showInfoBox)\r\n }\r\n\r\n static containsUnexpectedData (email) {\r\n if (this.emailEndsWithUnexpectedValue(email)) {\r\n return true\r\n }\r\n\r\n if (this.emailContainsUnexpectedValue(email)) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n static emailContainsUnexpectedValue (email) {\r\n return [\r\n 'hotnail',\r\n 'gnail',\r\n 'iclud.com',\r\n 'harikke',\r\n 'har.ikke',\r\n 'noreply',\r\n 'harej',\r\n 'eiola',\r\n 'ingenmail',\r\n 'ingen@mail.dk',\r\n 'haringenmail@if.dk',\r\n '.com.com',\r\n 'hitmail',\r\n 'hotmil',\r\n 'hormail',\r\n 'outlock',\r\n 'gamil.com',\r\n 'gamail.com',\r\n 'gmaill.com',\r\n 'gemail.com',\r\n 'gimail.com',\r\n 'hotmal.com',\r\n 'homail.com',\r\n 'hotamail.com',\r\n 'hotail.com',\r\n 'hotamil.com',\r\n 'hotmmail.com',\r\n 'hotmeil.com',\r\n 'hotrmail.com',\r\n 'hotmejl.com',\r\n 'hotmial.com',\r\n 'hoymail.com',\r\n 'hotmsil.com',\r\n 'icloud.dk',\r\n 'icloud.no',\r\n 'icloud.se',\r\n 'iccloud.com',\r\n 'icioud.com',\r\n 'ickoud.com',\r\n 'iclaoud.com',\r\n 'iclaud.com',\r\n 'icload.com',\r\n 'iclod.com',\r\n 'icloed.com',\r\n 'icloude.com',\r\n 'iclouid.com',\r\n 'iclud.se',\r\n 'icluod.com',\r\n 'icolud.com',\r\n 'icoud.com',\r\n 'icoude.com',\r\n 'icould.com'\r\n ].some(v => email.includes(v))\r\n }\r\n\r\n static emailEndsWithUnexpectedValue (email) {\r\n return [\r\n 'hotmai.com',\r\n 'hormail.com',\r\n 'hotmail.co',\r\n 'hotmail.con',\r\n 'gmail.con',\r\n 'gmail.om',\r\n 'gmail.co',\r\n 'gmail.dk',\r\n 'gmai.com',\r\n 'gmial.com',\r\n 'gmal.com',\r\n 'icloud.co',\r\n 'icoloud',\r\n 'icoloud.co',\r\n 'hotmail.cim',\r\n 'hotmail.cin',\r\n 'hotmail.clm',\r\n 'hotmail.come',\r\n 'hotmail.coms',\r\n 'gmail.vom',\r\n 'hotmail.om',\r\n 'hotmail.ocm',\r\n 'hotmail.vom',\r\n '.comm',\r\n 'icloud.ccom',\r\n 'icloud.cim',\r\n 'icloud.coms',\r\n 'icloud.con',\r\n 'icloud.som',\r\n 'icloud.vom'\r\n ].some(v => email.endsWith(v))\r\n }\r\n}\r\n","/* global $ jQuery */\r\n\r\nimport { app } from './dk-ifshop-application'\r\nimport { PersonEntities } from './dk-ifshop-constants'\r\nimport { h } from './dk-ifshop-helper'\r\n\r\n// Enables build-in select, lazyload and text control\r\n// Enables build-in select, lazyload and text control\r\n// Features:\r\n// Can be dependent upon other controls - other dropdowns or text fields\r\n// expects a parent div that can be styled to customize down button ect.\r\n// disables if dependent, and dependent has no value\r\n// can display value not yet loaded in list of options\r\n// Events:\r\n// evaluate: send to all dependent controls and other listenera on change make them update or reset\r\n// reset: send to all dependent controls and other listenera on entry made invalid\r\n// Attributes:\r\n// data-dependency : the control on which value the dropdown is dependent\r\n// data-content-url : the url to call to receive options\r\nfunction MultiControlAddress (\r\n jElement,\r\n model,\r\n jForm,\r\n dependencyModel,\r\n actionSettings\r\n) {\r\n const self = this\r\n if (!h.isSingleResult(jElement)) {\r\n return\r\n }\r\n\r\n const user = actionSettings.user\r\n\r\n // set control type\r\n self.isLL = actionSettings && actionSettings.lazyLoad === true // is LL (Lazy load)\r\n self.isSelect = $(jElement[0]).is('select') // is select\r\n self.isLLorSelect = self.isLL || self.isSelect // is LL or select\r\n self.isText = !self.isLLorSelect\r\n self.isStreetNameSearch = false\r\n self.previousValue = ''\r\n self.jForm = jForm\r\n\r\n // is Text\r\n // control specific settings\r\n if (self.isLL) {\r\n // TODO: HACK because lazyload have been created with id on select control. should have been on input control\r\n const _prop = jElement.attr('data-property')\r\n jElement\r\n .parent()\r\n .append(\r\n ''\r\n )\r\n self.element = jElement.parent().children('.lazyLoad')[0]\r\n\r\n self.jDisplay = jElement\r\n self.optionType = 'li'\r\n self.jList = $(self.element)\r\n .parent()\r\n .children('.lazyLoadList')\r\n } else if (self.isSelect) {\r\n // BOTOX: if botox styling is used, a span is addeed above a select control with style ecmt-natural-text-fadeout. This should be removed\r\n $(self.element)\r\n .parent()\r\n .children('span.ecmt-natural-text-fadeout')\r\n .remove()\r\n\r\n self.element = jElement[0]\r\n self.jDisplay = $(self.element)\r\n .parent()\r\n .children('span')\r\n .first() // element displaying the select controls value\r\n self.optionType = 'option'\r\n self.jList = jElement\r\n } else {\r\n self.element = jElement[0]\r\n self.jDisplay = jElement\r\n }\r\n\r\n // elements\r\n self.jParent = $(self.element).parent() // the element containing the entire control and displays the border\r\n self.topElement = jElement[0] // the same as the element, except for LL\r\n self.element.ifws_control = self // make this control a property on the base element, so it is easier to reach from knockout binding handler\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].ifws_control = self\r\n } // make this control a property on the base element, so it is easier to reach from knockout binding handler\r\n self.dependencyId = undefined\r\n // find dependency\r\n self.dependencyId = $(self.topElement).attr('data-dependency')\r\n\r\n // settings\r\n self.model = model\r\n\r\n // the model by which this control is to be bound to\r\n self.dependencyModel = dependencyModel // the model by which this control is dependent upon (E.g. Year-Make-model-motor)\r\n self.url = jElement.attr('data-content-url') // set url to load options from\r\n self.actionSettings = {} // {} ensures we dont get a ref. error if none is passed as arg\r\n if (actionSettings) {\r\n // custom actionSettings\r\n self.actionSettings = actionSettings\r\n }\r\n self.cache = actionSettings && actionSettings.cache\r\n\r\n if (actionSettings) {\r\n // find setting for autoSelect\r\n if (actionSettings.autoSelect) self.autoSelect = actionSettings.autoSelect\r\n else self.autoSelect = true // default\r\n\r\n self.disableAutoUpdate = actionSettings.disableAutoUpdate // whether changes in the model (after this setup) will effect the content of the control. (used for model details which are filled with data that is different once the car is found (E.g. CITROEN becomes Citroen and suddently can't be found in the list)\r\n }\r\n\r\n // state\r\n self.dependencyVal = '' // value of an element on which this control depends\r\n self.result = '' // full result form ajax call. more data maight be retreivewd then displayed. Related data can be stored here for ref.\r\n self.lazyLoadCriteria = null // the string entered when the last load was executed\r\n self.lastValue = undefined // flag used to compare what the value where on the last change event, to avoid repeating certain events\r\n self._selectedIndex = -1\r\n\r\n // flags\r\n self.isAutoSelected = false // set if an entry is selcted as the only match in LL. Used to avoid updating the user interface, becuase people typing too slow will continue writing the fill text although the final text is already loaded resulting in e.g. 'Park allé' looking like 'Park allélle'. Apart from that, this functionlaity works ok\r\n self.validateEntry = false\r\n self.lastValidEntry = undefined\r\n self.isReady = false // flag set once makeReady is run and the control is empty or holds a valid value\r\n self.ignoreOnValidation = true // flag set to tell form validation to ignore the control (it might have no options (e.g. an adress with no storeys)\r\n self.ignoreFirstLine = false // if the first line in a select list expresses 'select something\" that line isn't valid as a choice when validating the selections\r\n self.isDisplayingOptions = false // wheteher dropdown is extended to display possible values (lazyload)\r\n self.isEntryValid = true // flag reset when user changes the entry on a lazyload control. Can be used for other aswell\r\n self.timeoutId = undefined // id used to identify last delayed update of a lazyload control. If the text changes meanwhile, the delay should restart (this happens by overwriting the id with a new timeout.)\r\n self.isDisabled = actionSettings && actionSettings.disabled === true\r\n\r\n self.evaluate = function (\r\n value,\r\n ODDCASE /* TODO: unresolved issue, but it works */,\r\n actionName\r\n ) {\r\n if (self.actionSettings && self.actionSettings.validation) {\r\n self.validate(undefined, actionName) // trigger evaluate on success\r\n }\r\n }\r\n\r\n self.hideControl = function () {\r\n // remove class that is used by valididator to validate it, though it is hidden\r\n if (self.isLL) {\r\n self.jDisplay.addClass('validateDisabled')\r\n } else {\r\n self.addClass('validateDisabled')\r\n }\r\n // hide\r\n self.jParent.hide('fade', 150)\r\n // also hide error msg and label which has a \"for\" attribute\r\n $('[for=\"' + self.topElement.id + '\"]').hide('fade', 100)\r\n }\r\n\r\n self.reset = function () {\r\n if (self.isReady !== false) {\r\n self.dependencyVal = ''\r\n if (self.isLLorSelect) {\r\n // this is a select control\r\n self.reset2()\r\n } else {\r\n // this is a text control\r\n $(self.element).change()\r\n self.value = ''\r\n if (self.dependencyId) {\r\n self.disable()\r\n }\r\n }\r\n // check if control should be hidden too\r\n if (self.actionSettings.hide === true) {\r\n self.hideControl()\r\n }\r\n }\r\n\r\n // stop any load\r\n if (self.loader) {\r\n self.loader.cancel = true\r\n }\r\n // even though this control might already be disabled (not ready) dependent controls (if any) should know about this event anyway\r\n self.resetDependents()\r\n\r\n if (self.isLLorSelect && self.element.disabled == false) {\r\n // disable it\r\n if (self.dependencyId) {\r\n self.disable()\r\n }\r\n\r\n self.jParent.removeClass(jQuery.validator.defaults.errorClass)\r\n if (self.jDisplay[0]) {\r\n // due to BOTOX\r\n if (self.isLL) {\r\n self.forceRetract()\r\n }\r\n }\r\n self.resetText()\r\n }\r\n }\r\n\r\n self.resetDependents = function () {\r\n $(self.topElement).trigger('reset')\r\n }\r\n\r\n self.disable = function () {\r\n self.element.setAttribute('disabled', 'disabled')\r\n self.jParent[0].setAttribute('disabled', 'disabled')\r\n if (self.jDisplay) {\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].setAttribute('disabled', 'disabled')\r\n }\r\n }\r\n if (self.isLLorSelect) {\r\n // && !self.isLL) {\r\n self.jParent.removeClass('enabledDropdown').addClass('disabledDropdown')\r\n }\r\n }\r\n\r\n self.enable = function () {\r\n if (self.isDisabled) {\r\n return // disabled as a setting, then it shouldn't be enabled, until this setting is changed.\r\n }\r\n self.jParent[0].removeAttribute('disabled')\r\n self.jParent.removeClass('is-disabled') // BOTOX. Doesn't happen automatically on Chrome\r\n self.element.removeAttribute('disabled')\r\n if (self.jDisplay) {\r\n if (typeof self.jDisplay[0] !== 'undefined') {\r\n self.jDisplay[0].removeAttribute('disabled')\r\n }\r\n }\r\n if (self.isLLorSelect) {\r\n self.jParent.removeClass('disabledDropdown').addClass('enabledDropdown')\r\n }\r\n }\r\n\r\n self.resetText = function () {\r\n if (self.isLLorSelect) {\r\n if (self.jDisplay) {\r\n if ($(self.element).attr('placeholder')) {\r\n self.setText($(self.element).attr('placeholder'))\r\n } else {\r\n self.setText('')\r\n }\r\n }\r\n }\r\n }\r\n\r\n self.setText = function (value) {\r\n if (self.isLL) {\r\n // jDisplay is actually an input control\r\n self.jDisplay.val(value)\r\n } else {\r\n // jDisplay is a span\r\n self.jDisplay.text(value)\r\n }\r\n }\r\n\r\n self.getText = function () {\r\n if (self.isLL) {\r\n // jDisplay is actually an input control\r\n if (\r\n self.jDisplay[0].placeholder &&\r\n self.jDisplay[0].placeholder == self.jDisplay.val()\r\n ) {\r\n return ''\r\n } else {\r\n return self.jDisplay.val()\r\n }\r\n } else {\r\n // jDisplay is a span\r\n return self.jDisplay.text()\r\n }\r\n }\r\n self.setAddressId = function (id) {\r\n self.AddressId = id\r\n }\r\n self.getAddressId = function () {\r\n return self.AddressId\r\n }\r\n self.getVal = function () {\r\n return self.getText()\r\n }\r\n\r\n self.makeReady = function () {\r\n self.updateDependencyValue()\r\n\r\n if ($(self.element).attr('data-noPopupLabel')) {\r\n // Added automatically by botox\r\n $(self.element)\r\n .parent()\r\n .removeClass('has-label')\r\n }\r\n self.ignoreOnValidation = false\r\n self.enable()\r\n if (self.actionSettings.hide === true) {\r\n // remove class that is used by valididator to validate it, though it is hidden\r\n if (self.isLL) {\r\n self.jDisplay.removeClass('validateDisabled')\r\n } else {\r\n $(self.element).removeClass('validateDisabled')\r\n }\r\n // show\r\n self.jParent.show('fade', 300)\r\n // also show error msg and label again\r\n $('[for=\"' + self.topElement.id + '\"]').each(function () {\r\n if (this.className.indexOf(app.errorText) > -1 && !$(this).text()) {\r\n // error message label, but it is empty. Dont display\r\n return\r\n }\r\n $(this).show('fade', 600)\r\n })\r\n }\r\n\r\n // trigger evaluate, so dependent controls can validate against this control\r\n self.isReady = true\r\n if (!self.isLLorSelect) {\r\n self.evaluate(self.getVal()) // used if control already holds a value on startup\r\n }\r\n self.updateDisplay()\r\n }\r\n\r\n self.update = function () {\r\n const _form = self.element.form\r\n if (_form && _form.pendingInputs) {\r\n // register that this control now might load data. In a pending state evaluation must wait.\r\n // In a situation where the control must load content before displaying right data og become ignorable,\r\n // a validation might render the control invalid, athought a second later it is actually ok.\r\n _form.pendingInputs.registerPending(self.topElement.id)\r\n }\r\n\r\n self.updateDependencyValue()\r\n\r\n // find content\r\n if (self.url) {\r\n let inputText = ''\r\n if (self.actionSettings.getCriteria) {\r\n inputText = self.actionSettings.getCriteria(self)\r\n if (self.actionSettings.getCriteria(self).length < 2) {\r\n self.onLoadDone(null)\r\n return\r\n }\r\n }\r\n\r\n let _data = ''\r\n // find id to search by\r\n if (!actionSettings || actionSettings.requestType !== 'get') {\r\n if (self.actionSettings.getCriteria) {\r\n _data = inputText\r\n } else {\r\n if (self.dependencyId || dependencyModel) {\r\n // if there is a dependency it will likely be part of a criteria (Search parameters)\r\n _data = '{\"id\" : \"' + self.dependencyVal + '\"}'\r\n }\r\n }\r\n }\r\n // remove all ')\r\n .text(self.selectorDefaultText)\r\n .val('')\r\n )\r\n self.ignoreFirstLine = true\r\n }\r\n }\r\n\r\n self.actionSettings.onLoad(self.element)\r\n }\r\n self.makeReady()\r\n\r\n if ($(self.element).find(self.optionType).length === 2) {\r\n // there is only one choise apart from none (makes 2), therefore, select the latter as only possibility\r\n $(self.element).val(\r\n self.jList.find(self.optionType + ':nth-child(2)').val()\r\n )\r\n $(self.element).trigger('change')\r\n }\r\n\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.unregisterPending(self.topElement.id)\r\n }\r\n self.setNotWorking()\r\n }\r\n }\r\n\r\n self.setWorking = function () {\r\n const _form = self.element.form\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.registerPending(self.topElement.id)\r\n }\r\n self.isWorking = true\r\n self.element.removeAttribute('disabled') // makes sure it is validated (and therefore tested for setting isWorking)\r\n }\r\n\r\n self.setNotWorking = function () {\r\n const _form = self.element.form\r\n self.isWorking = false\r\n if (self.isDisabled) {\r\n self.element.setAttribute('disabled', 'disabled')\r\n }\r\n if (_form && _form.pendingInputs) {\r\n _form.pendingInputs.unregisterPending(self.topElement.id)\r\n }\r\n }\r\n\r\n self.selectedIndex = function (index) {\r\n if (self.isLL) {\r\n if (typeof index !== 'undefined') {\r\n self._selectedIndex = index\r\n self.jList.find(self.optionType).removeClass('selected')\r\n const _index = index + 1\r\n self.jList\r\n .find(self.optionType + ':nth-child(' + _index + ')')\r\n .addClass('selected')\r\n // add value to select control (which is bound to the model)\r\n self.element.value = self.getVal()\r\n }\r\n return self._selectedIndex\r\n } else {\r\n if (typeof index !== 'undefined') {\r\n self.element.selectedIndex = index\r\n }\r\n return self.element.selectedIndex\r\n }\r\n }\r\n\r\n if (self.isText) {\r\n $(self.element).on('focus', function () {\r\n self.jParent.addClass('has-focus') // BOTOX\r\n })\r\n\r\n $(self.element).on('blur', function () {\r\n self.jParent.removeClass('has-focus') // BOTOX\r\n self.validateEntry = true\r\n })\r\n }\r\n\r\n if (self.isSelect) {\r\n if (navigator.userAgent.match(/Firefox/i)) {\r\n $(self.element).on('keyup', function () {\r\n $(self.element).trigger('change')\r\n })\r\n }\r\n }\r\n\r\n if (self.isLL || self.actionSettings.disableAutoBind === true) {\r\n $(self.element).on('change', self.onChange)\r\n }\r\n\r\n // specify the topmost 'select' text\r\n if (!self.selectorDefaultText) {\r\n const _code = $(self.element).attr('data-noseltxt')\r\n if (_code) {\r\n self.selectorDefaultText = _code\r\n }\r\n }\r\n if (!self.selectorDefaultText) {\r\n self.selectorDefaultText = 'Vælg'\r\n }\r\n\r\n /// /bind to model (Important: when no autobinding, enableSelect must be called AFTER ko.applyBindings)\r\n // if (!self.actionSettings.disableAutoBind && self.model) {\r\n // ko.applyBindingsToNode(self.element, null, self.model);\r\n // }\r\n let address = ''\r\n if (self.model && self.model.Address) {\r\n address = self.model.Address()\r\n } else if (user == PersonEntities.Kunde) {\r\n if (app.root.Kunde().Address) {\r\n address = app.root.Kunde().Address()\r\n }\r\n } else if (user == PersonEntities.AndenForsikrede) {\r\n if (app.root.activeProduct.ForsikredePerson().Address) {\r\n address = app.root.activeProduct.ForsikredePerson().Address()\r\n }\r\n } else if (user == PersonEntities.Medforsikret) {\r\n if (app.root.Medforsikret().Address) {\r\n address = app.root.Medforsikret().Address()\r\n }\r\n }\r\n\r\n $(self.element).dawaautocompletev2({\r\n prefillValue: address,\r\n open: function (event, ui) {\r\n if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {\r\n $('.ui-autocomplete').off('menufocus')\r\n }\r\n },\r\n select: function (event, data) {\r\n let setPersonModel = true\r\n // Update model\r\n if (self.model) {\r\n if (self.model.Address) {\r\n setPersonModel = false\r\n\r\n // only applicable for person models\r\n if (self.model.AddressId) {\r\n self.model.AddressId(data.data.id)\r\n }\r\n\r\n if (self.model.Postnr) self.model.Postnr(data.data.postnr)\r\n if (self.model.Gade) self.model.Gade(data.data.vejnavn)\r\n if (self.model.Husnr) self.model.Husnr(data.data.husnr)\r\n if (self.model.By) self.model.By(data.data.postnrnavn)\r\n\r\n if (data.data.x && data.data.y) {\r\n const longitude = data.data.x\r\n const latitude = data.data.y\r\n self.model.Latitude(latitude)\r\n self.model.Longitude(longitude)\r\n }\r\n\r\n if (data.data.etage === null) {\r\n data.data.etage = ''\r\n }\r\n\r\n if (data.data.dør === null) {\r\n data.data.dør = ''\r\n }\r\n\r\n if (self.model.Etage && data.data.etage !== undefined) {\r\n self.model.Etage(data.data.etage)\r\n }\r\n if (self.model.SideDoerNr && data.data.dør !== undefined) {\r\n self.model.SideDoerNr(data.data.dør)\r\n }\r\n }\r\n }\r\n\r\n if (setPersonModel && user === PersonEntities.Kunde) {\r\n if (app.root.Kunde().Address) {\r\n if (app.root.Kunde().Postnr) app.root.Kunde().Postnr(data.data.postnr)\r\n if (app.root.Kunde().Gade) app.root.Kunde().Gade(data.data.vejnavn)\r\n if (app.root.Kunde().Husnr) app.root.Kunde().Husnr(data.data.husnr)\r\n if (app.root.Kunde().By) app.root.Kunde().By(data.data.postnrnavn)\r\n if (app.root.Kunde().Etage) app.root.Kunde().Etage(data.data.etage)\r\n if (app.root.Kunde().SideDoerNr) {\r\n app.root.Kunde().SideDoerNr(data.data.dør)\r\n }\r\n }\r\n } else if (setPersonModel && user === PersonEntities.Medforsikret) {\r\n if (app.root.Medforsikret().Address) {\r\n if (app.root.Medforsikret().Postnr) app.root.Medforsikret().Postnr(data.data.postnr)\r\n if (app.root.Medforsikret().Gade) app.root.Medforsikret().Gade(data.data.vejnavn)\r\n if (app.root.Medforsikret().Husnr) app.root.Medforsikret().Husnr(data.data.husnr)\r\n if (app.root.Medforsikret().By) app.root.Medforsikret().By(data.data.postnrnavn)\r\n if (app.root.Medforsikret().Etage) app.root.Medforsikret().Etage(data.data.etage)\r\n if (app.root.Medforsikret().SideDoerNr) {\r\n app.root.Medforsikret().SideDoerNr(data.data.dør)\r\n }\r\n }\r\n } else if (setPersonModel && user === PersonEntities.AndenForsikrede) {\r\n if (app.root.activeProduct.ForsikredePerson().Address) {\r\n if (app.root.activeProduct.ForsikredePerson().Postnr) app.root.activeProduct.ForsikredePerson().Postnr(data.data.postnr)\r\n if (app.root.activeProduct.ForsikredePerson().Gade) app.root.activeProduct.ForsikredePerson().Gade(data.data.vejnavn)\r\n if (app.root.activeProduct.ForsikredePerson().Husnr) app.root.activeProduct.ForsikredePerson().Husnr(data.data.husnr)\r\n if (app.root.activeProduct.ForsikredePerson().By) app.root.activeProduct.ForsikredePerson().By(data.data.postnrnavn)\r\n if (app.root.activeProduct.ForsikredePerson().Etage) app.root.activeProduct.ForsikredePerson().Etage(data.data.etage)\r\n if (app.root.activeProduct.ForsikredePerson().SideDoerNr) {\r\n app.root.activeProduct.ForsikredePerson().SideDoerNr(data.data.dør)\r\n }\r\n }\r\n }\r\n\r\n self.actionSettings.q = data.q\r\n self.actionSettings.caretpos = data.caretpos\r\n self.actionSettings.type = data.type\r\n self.actionSettings.d = data.d\r\n\r\n self.setText(data.tekst)\r\n // this is where we end up when an address has been selected\r\n // it is used for lookup right away, against https://dawa.aws.dk/adresser/{addressId}\r\n self.setAddressId(data.data.id)\r\n self.evaluate(self.getVal(), undefined, 'blur')\r\n },\r\n change: function (event, data) {\r\n if (!self.getAddressId()) {\r\n return\r\n }\r\n self.evaluate(self.element.value, undefined, 'change')\r\n }\r\n })\r\n\r\n self.validationActionSettings = {\r\n onValid: function () {\r\n // remove red paint\r\n self.element.ifws_isInvalid = false\r\n $(self.element).trigger('evaluate', self.getVal())\r\n h.validateElement(self.element, 'ifws_isInvalid')\r\n\r\n self.setNotWorking()\r\n self.isValidating = false\r\n\r\n if (self.actionSettings && self.actionSettings.onInvalid) {\r\n self.actionSettings.onValid()\r\n }\r\n self.lastValidatedValue = self.jDisplay.val()\r\n },\r\n onInvalid: function () {\r\n // client code rejects entry\r\n\r\n // paint red\r\n self.resetDependents()\r\n self.element.ifws_isInvalid = true\r\n\r\n h.updateElementValidation(\r\n self.element,\r\n 'ifws_isInvalid',\r\n undefined,\r\n false /* forces error result */\r\n )\r\n // h.validateElement(self.element, 'ifws_isInvalid');\r\n\r\n self.setNotWorking()\r\n self.isValidating = false\r\n\r\n if (self.actionSettings && self.actionSettings.onInvalid) {\r\n self.actionSettings.onInvalid()\r\n }\r\n self.lastValidatedValue = self.jDisplay.val()\r\n }\r\n }\r\n\r\n self.validate = function (value, actionName) {\r\n if (self.actionSettings && self.actionSettings.validation) {\r\n self.isValidating = true\r\n // app.writeDebugInfo('>>> SW VAL ' + self.topElement.id);\r\n\r\n self.setWorking()\r\n\r\n const result = self.actionSettings.validation(\r\n self,\r\n self.validationActionSettings,\r\n actionName\r\n )\r\n if (result === true || result === false) {\r\n // this is only true if the validation is not async and the result is returned by the custom validator. Otherwise (if async) the result will not be ready until later\r\n self.element.ifws_isInvalid = !result\r\n self.setNotWorking() // when an actual result is returned, we expect this work to be done\r\n self.isValidating = false\r\n self.lastValidatedValue = self.jDisplay.val()\r\n }\r\n return result\r\n }\r\n }\r\n\r\n self.element.ifws_customCheck = function (element, action) {\r\n if (\r\n self.actionSettings &&\r\n self.actionSettings.ignoreValidationOnKeyUp &&\r\n action === 'onkeyup'\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (self.actionSettings && self.actionSettings.validation) {\r\n self.element.ifws_customValidation = function (value) {\r\n if (self.validateEntry && self.lastValidatedValue != self.element.value) {\r\n self.validateEntry = false\r\n const result = self.validate(value)\r\n if (result === true || result === false) {\r\n // the custom method actuelly returned a specific true/false result. pass it as a result\r\n return result\r\n }\r\n }\r\n // Nothing special happened, just return the current state\r\n return !self.element.ifws_isInvalid\r\n }\r\n }\r\n\r\n self.lastValidatedValue = self.element.value\r\n if (self.model && self.model.Address && self.model.Address() !== '') {\r\n $(self.element)\r\n .val(self.model.Address())\r\n .trigger('select')\r\n }\r\n}\r\n\r\nfunction enableAddressAutocomplete (\r\n jElement,\r\n model,\r\n jForm,\r\n dependencyModel,\r\n actionSettings\r\n) {\r\n return new MultiControlAddress(\r\n jElement,\r\n model,\r\n jForm,\r\n dependencyModel,\r\n actionSettings\r\n )\r\n}\r\n\r\n// multi control custom validation (Required)\r\njQuery.validator.addMethod('ifws_selected', function (value, element) {\r\n if (element.ifws_control.isWorking || element.ifws_control.pendingWork) {\r\n return false\r\n }\r\n // if e.g. lazyload control is changed without any match is found\r\n if (!element.ifws_control || element.ifws_control.isEntryValid === false) {\r\n return false\r\n }\r\n // first line just expresses \"select\". if it is selected, the control still isn't ready\r\n if (\r\n element.ifws_control.ignoreFirstLine === true &&\r\n element.selectedIndex === 0\r\n ) {\r\n return false\r\n }\r\n if (element.ifws_control.ignoreOnValidation === true) {\r\n // Ignore that it is empty (e.g. floor for an address with no floors)\r\n return true\r\n } else {\r\n if (element.ifws_control.getVal()) {\r\n // Has value - valid\r\n return true\r\n } else {\r\n // no value - invalid\r\n return false\r\n }\r\n }\r\n})\r\n\r\nexport { MultiControlAddress, enableAddressAutocomplete }\r\n","/* eslint-disable no-unused-vars */\r\n/* global $ ko EGAINCLOUD */\r\n\r\nimport { ApplyAddresValidationRule, ExitEarlyConditionsMet, FailureToSelect, ProcessErrorReturnedByDawa, SelectedAddressCanBeUsedToTriggerDawaQuery } from './adresse/dk-ifshop-address-dawa-scripts'\r\nimport { ProcessDataReturnedByDawa } from './adresse/dk-ifshop-address-scripts'\r\nimport {\r\n PendingInputs,\r\n displayMessageButton,\r\n enableInputEvaluation,\r\n enableToolTips,\r\n ifwsControls\r\n} from './dk-ifshop-controls'\r\nimport { enableSelect, enableTextInput } from './dk-ifshop-controls-multi'\r\nimport {\r\n updateCheckbox,\r\n updateUnboundRadioAndCheckboxes\r\n} from './dk-ifshop-controls-radioAndCheckbox'\r\n\r\nimport { TextHelper } from './dk-ifshop-text-helper'\r\nimport { Tilbud } from './dk-ifshop-tilbud-model'\r\nimport { WebShopWizard } from './dk-ifshop-wizard-model'\r\nimport { app } from './dk-ifshop-application'\r\nimport { bLoader } from '../sp/dk-ifshop-bundleloader'\r\nimport { emailUnexpectedData } from './validation/email-unexpected-data'\r\nimport { enableAddressAutocomplete } from './dk-ifshop-controls-address'\r\nimport { enableCPRValidationKunde } from './cpr/dk-ifshop-cpr-validation-kunde'\r\nimport { enableCPRValidationMedforsikret } from './cpr/dk-ifshop-cpr-validation-medforsikret'\r\nimport { enableSlider } from './dk-ifshop-controls-slider'\r\nimport { enableTabs } from './dk-ifshop-controls-tabs'\r\nimport { h } from './dk-ifshop-helper'\r\nimport { isDateReadyforValidation } from './dk-ifshop-dates'\r\nimport { singleActionButton } from './dk-ifshop-controls-actionButton'\r\nimport { stateManager } from './dk-ifshop-statemanagement'\r\nimport { validateIkraftDato } from './ulykke/dk-ifshop-ulykke-validator'\r\nimport { PersonEntities } from './dk-ifshop-constants'\r\n\r\nconst basic = {} // namespace\r\n\r\nbasic.getDefaultDaekning = function () {\r\n if (app.root.ProduktNavn === 'bil') {\r\n return 'Kasko'\r\n }\r\n return ''\r\n}\r\n\r\nbasic.addHus = function () {\r\n const settings = { done: basic.gotoNextProduct, entryFail: function (data) { app.showMessage('Ukendt fejl') } }\r\n app.root.addProdukt('Hus', settings)\r\n}\r\nbasic.addIndbo = function () {\r\n const settings = { done: basic.gotoNextProduct, entryFail: function (data) { app.showMessage('Ukendt fejl') } }\r\n app.root.addProdukt('Familie', settings)\r\n}\r\n\r\nbasic.handleBlueBoxForTravel = function (textToDisplay) {\r\n const elm = document.getElementById('OuterInfoBlueBoxTravel')\r\n const elmBlueBox = document.getElementById('InnerInfoBlueBoxTravel')\r\n\r\n if (textToDisplay) {\r\n if (elm && elmBlueBox) {\r\n elm.style.display = 'block'\r\n elmBlueBox.innerHTML = textToDisplay\r\n }\r\n } else {\r\n if (elm && elmBlueBox) {\r\n elm.innerHtml = ''\r\n elm.style.display = 'none'\r\n }\r\n }\r\n}\r\n\r\nbasic.handleBlueBoxForSelectedCoverage = function (selectedDaekning, textToDisplay) {\r\n // pass this as defaultDaekning instead\r\n if (selectedDaekning === '') {\r\n selectedDaekning = basic.getDefaultDaekning()\r\n // we need to have a selected or default coverage in order to correctly\r\n // display the blue box above coverages\r\n if (selectedDaekning === '') {\r\n return\r\n }\r\n }\r\n\r\n const elm = document.getElementById('OuterInfoBlueBox')\r\n const elmBlueBox = document.getElementById('InnerInfoBlueBox')\r\n\r\n if (textToDisplay && !app.GetNissanContext()) {\r\n if (elm && elmBlueBox) {\r\n elm.style.display = 'block'\r\n elmBlueBox.innerHTML = textToDisplay\r\n }\r\n } else {\r\n if (elm && elmBlueBox) {\r\n elm.innerHtml = ''\r\n elm.style.display = 'none'\r\n }\r\n }\r\n}\r\n\r\nbasic.createAppRoot = function () {\r\n app.root = new Tilbud()\r\n $(document).trigger('wsdk-app-root-created')\r\n}\r\n\r\n// EDI TEST PAGE\r\n// =================================================================\r\nbasic.editest_Page = function () {\r\n // setup global objects\r\n try {\r\n basic.createAppRoot()\r\n app.root.sync({\r\n done: function () {\r\n if (app.root.IsPurchasingOrFinished) {\r\n window.location.href = window.ifws_shopUrl\r\n }\r\n }\r\n })\r\n\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n app.onFailCustomAction = function () {\r\n // reset any locks on error\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n // overrides default fail handling with code specific for the Front\r\n app.displayEntryExceptionInfo = function (text, jEntry) {\r\n if (jEntry && jEntry[0].displayEntryExceptionInfo) {\r\n jEntry[0].displayEntryExceptionInfo(text)\r\n } else if (jEntry && jEntry.rules().ifws_isInvalid) {\r\n // invalidate the control by setting the property which the custom validator (of same name) is checking on\r\n jEntry[0].ifws_isInvalid = true\r\n // force immediately validation on the entry and pass the custom message to be displayed\r\n h.validateElement(jEntry[0], 'ifws_isInvalid', text)\r\n // maintain focus (don't know why this is nessesary)\r\n jEntry.focus()\r\n }\r\n }\r\n app.displayFailInfo = app.displayEntryExceptionInfo\r\n\r\n app.clearFailInfo = function () {\r\n // $('.validationSummary').text();\r\n }\r\n\r\n // a product type has been found\r\n const params = app.getUrlVars2(app.initialCommand)\r\n if (params.kampagne) {\r\n // only write/overwrite if there is a specific campaign. Otherwise leave the information that there already is (if any)\r\n stateManager.setKampagne(params.kampagne)\r\n }\r\n\r\n setTimeout(function () {\r\n window.app.root.sync({\r\n done: function () {\r\n if (app.root.IsPurchasingOrFinished) {\r\n window.location.href = window.ifws_shopUrl\r\n }\r\n }\r\n }, 1000)\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\n// Page scripts -------------------------------------------------------------------------------------\r\nbasic.front_Page = function () {\r\n let _type = ''\r\n // setup global objects\r\n try {\r\n basic.createAppRoot()\r\n app.root.sync({\r\n done: function () {\r\n if (app.root.IsPurchasingOrFinished) {\r\n window.location.href = window.ifws_shopUrl\r\n }\r\n }\r\n })\r\n\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n app.onFailCustomAction = function () {\r\n // reset any locks on error\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n // overrides default fail handling with code specific for the Front\r\n app.displayEntryExceptionInfo = function (text, jEntry) {\r\n if (jEntry && jEntry[0].displayEntryExceptionInfo) {\r\n jEntry[0].displayEntryExceptionInfo(text)\r\n } else if (jEntry && jEntry.rules().ifws_isInvalid) {\r\n // invalidate the control by setting the property which the custom validator (of same name) is checking on\r\n jEntry[0].ifws_isInvalid = true\r\n // force immediately validation on the entry and pass the custom message to be displayed\r\n h.validateElement(jEntry[0], 'ifws_isInvalid', text)\r\n // maintain focus (don't know why this is nessesary)\r\n jEntry.focus()\r\n }\r\n }\r\n app.displayFailInfo = app.displayEntryExceptionInfo\r\n\r\n app.clearFailInfo = function () {\r\n // $('.validationSummary').text();\r\n }\r\n\r\n _type = ''\r\n enableTabs(app.getTopJElm(), {\r\n beforeRender: function (data) {\r\n // kaldes når indhold er loadet ind i valgt tab efter skift\r\n\r\n // på quick formen kan der kun være \"ET\" produkt. Påbegynder man indtastning i et nyt vindue, bliver alt slettet.\r\n // Quick form skal være simpel og det er ikke meningen at man skal kunne andet end at komme videre til shoppen asap\r\n // Først i shoppen tages der højde for flere produkter\r\n _type = $(app.getTopClass() + ' li.ecmt-tab-item-active a').attr('data-produkt-type')\r\n\r\n if (_type) {\r\n // load the required product bundle before continuing\r\n bLoader.runAction(_type, function () {\r\n // load object and maybe overwrite any other activeProduct, 'cause there can be only one at a time\r\n app.root.setActiveProduct(_type)\r\n $(app).trigger('sectionLoaded', [\r\n 'front_Page',\r\n h.getSections(app.getTopJElm())\r\n ])\r\n\r\n app.showPageMessage()\r\n })\r\n }\r\n }\r\n })\r\n\r\n // If a tab is selected from the start, make an initial validation\r\n let _selected = $(app.getTopClass() + ' li.ecmt-tab-item-active a')\r\n if (h.isSingleResult(_selected)) {\r\n _type = $(_selected[0]).attr('data-produkt-type')\r\n } else {\r\n // no tabs, just ONE QuickForm\r\n _selected = $(app.getTopClass() + ' .productHolder')\r\n if (h.isSingleResult(_selected)) {\r\n _type = $(_selected[0]).attr('data-produkt-type')\r\n }\r\n }\r\n\r\n // a product type has been found\r\n if (_type) {\r\n // load the required product bundle before continuing\r\n bLoader.runAction(_type, function () {\r\n // load object and maybe overwrite any other activeProduct, 'cause there can be only one at a time\r\n app.root.setActiveProduct(_type)\r\n h.pageLoadWait()\r\n })\r\n } else {\r\n h.pageLoadWait()\r\n }\r\n\r\n const params = app.getUrlVars2(app.initialCommand)\r\n if (params.kampagne) {\r\n // only write/overwrite if there is a specific campaign. Otherwise leave the information that there already is (if any)\r\n stateManager.setKampagne(params.kampagne)\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\n// called for both entry page and price page,\r\n// but only when there is a page load (not going forwards and backwards in the wizard)\r\nbasic.produkt_Page = function () {\r\n // reset any pending actions\r\n singleActionButton.isInvalidated = true\r\n\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n // setup global objects\r\n app.setWizard(new WebShopWizard(0))\r\n\r\n // use wizard to provide active elemtn when e.g. displaying spinner\r\n app.getActiveAreaJElement = app.wizard.getCurrentWizardBodyJElement\r\n\r\n app.onFailCustomAction = function () {\r\n // reset any locks on error\r\n singleActionButton.setIsChanging(false)\r\n singleActionButton.killPending()\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n app.wizard.onLoaded()\r\n app.wizard.App = app\r\n\r\n try {\r\n basic.createAppRoot()\r\n basic.setupAdvancedMessageHandling()\r\n\r\n $(app.wizard).on('wizardStep', function () {\r\n try {\r\n // reset any pending actions\r\n singleActionButton.isInvalidated = true\r\n\r\n // tell the application that the wizard body should hold the spinner when displayed\r\n app.globalSpinningElementId = app.wizard.getCurrentWizardHolder()[0].id\r\n\r\n // update the text on the navigation button on the cart in the right panel\r\n basic.updateCartPanelButton()\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n })\r\n\r\n // init tilbud (app.root) and either tricker a new Tilbud or receive the server instance\r\n app.root.fetchTilbud({\r\n done: function (data) {\r\n const loginElm = h.getElm('loginMessage')\r\n const loginUserInfoElm = h.getElm('loggedInUserInfo')\r\n\r\n if (app.root.ShowLoggedIn()) {\r\n loginElm.style.display = 'block'\r\n } else {\r\n loginElm.style.display = 'none'\r\n }\r\n\r\n if (app.root.ShowLoggedInUserInfo()) {\r\n loginUserInfoElm.style.display = 'block'\r\n } else {\r\n loginUserInfoElm.style.display = 'none'\r\n }\r\n\r\n // bind objects to controls\r\n ko.applyBindings(app.wizard, h.getElm('wizardStepsView')) // list of steps\r\n // apply validation\r\n app.wizard.dataValidate = app.root.validate\r\n // identify tyhe owner of the wizard\r\n app.wizard.id = app.root.activeProduct.ProduktID()\r\n // load wizard menu and state\r\n app.wizard.load()\r\n\r\n $(app.wizard).on('wizardStep', function () {\r\n if (app.root.activeProduct.UpdateDetails) {\r\n app.root.activeProduct.UpdateDetails()\r\n }\r\n\r\n if (app.wizard.currentStepNo == 2) {\r\n h.pageLoadWait(function () {\r\n if (!app.root.activeProduct.Daekning) {\r\n return false\r\n }\r\n return basic.PricesEstablishedForTracking(app.root.activeProduct)\r\n })\r\n } else if (app.wizard.currentStepNo < 2) {\r\n h.pageLoadWait()\r\n }\r\n\r\n app.showPageMessage()\r\n })\r\n\r\n app.bottomDataUpdate(data)\r\n },\r\n operationFail: function () {\r\n window.location.href = app.returnPageUrl // expects it to be a timeout (result: No active product)\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\nbasic.PricesEstablishedForTracking = function (activeProduct) {\r\n const activeProductInfoPrice = Number(activeProduct.Daekning().NettoPraemieTotal())\r\n const overblickItemCalculated = app.root.ProduktOverblikV2.ProductsInCart.filter(function (x) {\r\n return x.productId === activeProduct.ProduktID()\r\n })[0]\r\n\r\n if (overblickItemCalculated && parseInt(overblickItemCalculated.price) > 0 &&\r\n activeProductInfoPrice > 0) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n// called by all pages after the cart (supplerende, personliginfo, bekraeft)\r\n// but only when loading the page, not when going backwards and forwards in the wizard\r\nbasic.checkout_Page = function () {\r\n // reset any pending actions\r\n singleActionButton.isInvalidated = true\r\n\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n // setup global objects\r\n app.setWizard(new WebShopWizard(0))\r\n\r\n // use wizard to provide active element when e.g. displaying spinner\r\n app.getActiveAreaJElement = app.wizard.getCurrentWizardBodyJElement\r\n\r\n app.onFailCustomAction = function (data) {\r\n // reset any locks on error\r\n if (\r\n data &&\r\n data.Message &&\r\n data.Message.TekstKode === 'TILBUD:LEASER_KAN_IKKE_FAA_SUPERBIL'\r\n ) {\r\n // update objekt. TODO: This is a special error that is thrown allthough the data is actually saved on server. the client should act in the same way, so we don't have to do it excplicitely here\r\n app.root.update(data.Data.Tilbud)\r\n app.root.activeProduct.update(data.Data.Produkt)\r\n\r\n // update right upper panel, because its content is populated on server as we dont have all prices for all products on the client.\r\n // TODO: this element no longer exists, nor does the ForsikringIkurv view\r\n const forsikringerIKurvPanel = $('#forsikringerIKurv').parent()\r\n if (forsikringerIKurvPanel.length > 0) {\r\n app.loadHtml({\r\n url: 'tilbud/getsubview/ForsikringerIKurv',\r\n block: false,\r\n targetElement: forsikringerIKurvPanel,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n this.targetElement.html(data)\r\n $(app).trigger('sectionLoaded', [\r\n 'onFailCustomAction',\r\n h.getSections(this.targetElement)\r\n ])\r\n }\r\n })\r\n }\r\n }\r\n\r\n singleActionButton.setIsChanging(false)\r\n singleActionButton.killPending()\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n app.wizard.onLoaded()\r\n app.wizard.App = app\r\n try {\r\n basic.createAppRoot()\r\n\r\n basic.setupAdvancedMessageHandling()\r\n\r\n $(app.wizard).on('wizardStep', function () {\r\n try {\r\n // reset any pending actions\r\n singleActionButton.isInvalidated = true\r\n\r\n // tell the application that the wizard body should hold the spinner when displayed\r\n app.globalSpinningElementId = app.wizard.getCurrentWizardHolder()[0].id\r\n\r\n // update the text on the navigation button on the cart in the right panel\r\n basic.updateCartPanelButton()\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n })\r\n\r\n // init tilbud and either create a new Tilbud or receive the server instance\r\n app.root.fetchTilbudCheckout({\r\n done: function (data) {\r\n // bind objects to controls\r\n // ko.applyBindings(app.wizard, h.getElm('wizardSteps')) // list of steps\r\n const loginElm = h.getElm('loginMessage')\r\n const loginUserInfoElm = h.getElm('loggedInUserInfo')\r\n\r\n if (app.root.ShowLoggedIn()) {\r\n loginElm.style.display = 'block'\r\n } else {\r\n loginElm.style.display = 'none'\r\n }\r\n\r\n if (app.root.ShowLoggedInUserInfo()) {\r\n loginUserInfoElm.style.display = 'block'\r\n } else {\r\n loginUserInfoElm.style.display = 'none'\r\n }\r\n\r\n if (!basic.isBound('loginMessage')) {\r\n ko.applyBindings(app.wizard, loginElm) // list of steps\r\n }\r\n if (!basic.isBound('loggedInUserInfo')) {\r\n ko.applyBindings(app.wizard, loginUserInfoElm) // list of steps\r\n }\r\n // apply validation\r\n app.wizard.dataValidate = basic.checkoutValidate\r\n // identify the owner of the wizard\r\n app.wizard.id = 'checkout'\r\n // load wizard menu and state\r\n app.wizard.load()\r\n $(app.wizard).on('wizardStep', function () {\r\n h.pageLoadWait()\r\n app.showPageMessage()\r\n $(app.wizard).off('wizardStep')\r\n })\r\n },\r\n operationFail: function () {\r\n window.location.href = app.returnPageUrl // expects it to be a timeout (result: No active product)\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\nbasic.isBound = function (id) {\r\n return !!ko.dataFor(document.getElementById(id))\r\n}\r\n\r\n// only called by the OLD cart - REMOVE THIS?\r\nbasic.cart_Page = function () {\r\n try {\r\n basic.createAppRoot()\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n app.onFailCustomAction = function () {\r\n // reset any locks on error\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n basic.setupAdvancedMessageHandling()\r\n\r\n // init tilbud and either tricker a new Tilbud or receive the server instance\r\n app.root.fetchTilbud({\r\n done: function () {\r\n h.pageLoadWait()\r\n app.showPageMessage()\r\n },\r\n operationFail: function () {\r\n window.location.href = app.returnPageUrl // expects it to be a timeout (result: No active product)\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\n// called after loading the confirmation page\r\nbasic.kvittering_Page = function () {\r\n // setup global objects\r\n try {\r\n basic.createAppRoot()\r\n app.imagePath = 'styling/img/webshop/shopflow/'\r\n\r\n basic.setupAdvancedMessageHandling()\r\n\r\n app.onFailCustomAction = function () {\r\n // reset any locks on error\r\n app.resetPendingUserAction()\r\n app.clearBusy()\r\n }\r\n\r\n app.root.fetchTilbudCheckout({\r\n done: function () {\r\n h.pageLoadWait()\r\n\r\n stateManager.clear()\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\nbasic.clearClientData = function () {\r\n try {\r\n if (window.localStorage) {\r\n window.localStorage.clear()\r\n }\r\n } catch (e) {\r\n }\r\n\r\n try {\r\n if (window.sessionStorage) {\r\n window.sessionStorage.clear()\r\n }\r\n } catch (e) {\r\n }\r\n\r\n try {\r\n window.app = {}\r\n } catch (e) {\r\n }\r\n}\r\n\r\nbasic.AdvancedMessageHandling = function (text, jEntry, actionSettings, isFail) {\r\n if (isFail) {\r\n basic.showContactPanel()\r\n } else {\r\n // if (jEntry && jEntry.length > 0 && jEntry[0].displayEntryExceptionInfo) {\r\n // //the entry has its own way of handling related entry messages\r\n // jEntry[0].displayEntryExceptionInfo(text);\r\n // } else\r\n if (jEntry && jEntry.rules().ifws_isInvalid) {\r\n // invalidate the control by setting the property which the custom validator (of same name) is checking on\r\n jEntry[0].ifws_isInvalid = true\r\n // force immediately validation on the entry and pass the custom message to be displayed\r\n h.updateElementValidation(\r\n jEntry[0],\r\n 'ifws_isInvalid',\r\n text,\r\n false /* forces error result */\r\n )\r\n // maintain focus (don't know why this is nessesary)\r\n jEntry.focus()\r\n } else {\r\n // use page wide handling\r\n if (text) {\r\n // forventer objekt med kort/lang tekst (title/body)\r\n if (text.lang || text.kort) {\r\n app.showErrorMessage(text.kort, text.lang)\r\n } else {\r\n // forventer simpel tekst\r\n app.showErrorMessage(text)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nbasic.setupAdvancedMessageHandling = function () {\r\n // overrides default fail handling\r\n app.displayEntryExceptionInfo = function (text, jEntry, actionSettings, data) {\r\n if (\r\n data &&\r\n data.Message != null &&\r\n data.Message.TekstKode === 'TILBUD:KAN_IKKE_FINDE_ADRESSE'\r\n ) {\r\n if (jEntry && jEntry[0].displayEntryExceptionInfo) {\r\n jEntry[0].displayEntryExceptionInfo(text)\r\n } else if (jEntry && jEntry.rules().ifws_isInvalid) {\r\n // invalidate the control by setting the property which the custom validator (of same name) is checking on\r\n jEntry[0].ifws_isInvalid = true\r\n // force immediately validation on the entry and pass the custom message to be displayed\r\n h.validateElement(jEntry[0], 'ifws_isInvalid', text)\r\n // maintain focus (don't know why this is nessesary)\r\n jEntry.focus()\r\n }\r\n } else basic.AdvancedMessageHandling(text, jEntry, actionSettings, false)\r\n }\r\n\r\n app.displayFailInfo = function (text, jEntry, actionSettings) {\r\n basic.AdvancedMessageHandling(text, jEntry, actionSettings, true)\r\n }\r\n}\r\n\r\n// Wizard step scripts ------------------------------------------------------------------------------\r\nbasic.vaelgDaekningsType = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct, h.getElm('vaelgDaekningsType'))\r\n\r\n $('[id$=_PoliceButton]').on('click', function (s) {\r\n if (s.target && $(s.target).parents('.displayMessageButton').length > 0) {\r\n // this is a clikk on a hyperlink, so dont select any dækning\r\n return\r\n }\r\n\r\n // OKEJ! So, the following \"done-function\" will only be called if the \"validateDaekningSelection\"\r\n // returns OK and not a exception. We only want to run the \"sync-function\" in this case. Because if the dekning\r\n // is not valid (as in should warn the user). Then we only want to sync (se below) if user confirms the dekning selection.\r\n const actionSettings = {\r\n done: function () {\r\n if (!app.root.activeProduct.HandleLocalCorruptPrices()) {\r\n // this is the sync function I'm talking about\r\n app.root.activeProduct.sync()\r\n } else {\r\n app.reportFail('basic.vaelgDaekningsType failed due to invalid praemier')\r\n }\r\n }\r\n }\r\n\r\n // update graphics and tilvalg when selecting dækning\r\n app.root.activeProduct.selectDaekning(\r\n $(this).attr('data-policetype'),\r\n actionSettings\r\n )\r\n })\r\n\r\n h.doOrWait(app.hjaelpeKoderLoadedFlag, app, 'hjaelpeKoderLoaded', function () {\r\n app.root.activeProduct.beregn()\r\n })\r\n\r\n $('.daekningToggle').on('click', function () {\r\n // button to expand/collapse dækning in compact mode)\r\n const $el = $(this)\r\n const isCollapsed = $el.text() === '+'\r\n $el\r\n .text(isCollapsed ? '-' : '+')\r\n .parent()\r\n .parent()\r\n .parent()\r\n .parent()\r\n .find('.produktDetails')\r\n .toggle(isCollapsed)\r\n })\r\n\r\n h.selectNextEntry(jElement)\r\n}\r\n\r\nbasic.bekraeft = function (jElement) {\r\n basic.personligInfo(jElement)\r\n\r\n ko.applyBindings(app.root.Kunde, h.getElm('bekraeftGroup'))\r\n ko.applyBindings(app.root.Kunde, h.getElm('wizardNavigation'))\r\n\r\n // validation rules\r\n const _jForm = $('#bekraeft')\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n // marketing\r\n ko.applyBindings(app.root.Kunde, h.getElm('marketingGroup'))\r\n\r\n const _jFormX = h.getClosestForm($('#marketingGroup'))\r\n if (!_jFormX[0].validator) {\r\n const _validator = _jFormX.validate()\r\n _jFormX[0].validator = _validator\r\n }\r\n // validation rules (using dynamic settings and not static settings {fornavn: ...} because we need to use the prefix)\r\n $('#AccepterMarketingtrue').rules('add', {\r\n required: true\r\n })\r\n $('#AccepterMarketingfalse').rules('add', {\r\n required: true\r\n })\r\n\r\n if ($('#CancellationConsent').length > 0) {\r\n $('#CancellationConsent').rules('add', {\r\n required: true,\r\n messages: {\r\n required: app.getFejlKodeText(\r\n 'CLIENT_MISSING_CUSTOMER_EDI_CANCELLATION_CONSENT',\r\n 'Vi skal bruge dit samtykke, før købet kan gennemføres.'\r\n )\r\n }\r\n })\r\n }\r\n\r\n if ($('#CancellationCoInsuredPowerOfAttorneyConsent').length > 0) {\r\n $('#CancellationCoInsuredPowerOfAttorneyConsent').rules('add', {\r\n required: true,\r\n messages: {\r\n required: app.getFejlKodeText(\r\n 'CLIENT_MISSING_COINSURED_EDI_CANCELLATION_CONSENT',\r\n 'Vi skal bruge medforsikredes samtykke, før købet kan gennemføres.'\r\n )\r\n }\r\n })\r\n }\r\n\r\n h.addValidatorMessage(\r\n h.getElm('AccepterMarketingfalse'),\r\n 'required',\r\n TextHelper.getRadioButtonUnansweredErrorMessage()\r\n )\r\n\r\n setInterval(function () {\r\n if (app.root.Kunde().ShowPurchaseBlockedMessage()) {\r\n $('#wizardNavigation button.ecmt-button').attr('disabled', 'disabled')\r\n }\r\n }, 2000)\r\n\r\n enableToolTips(jElement)\r\n}\r\n\r\nbasic.betalingsInfoOversigt = function (jElement) {\r\n ko.applyBindings(app.root.Kunde, h.getElm('bankOplysninger'))\r\n}\r\n\r\nbasic.koebOversigt = function (jElement) {\r\n const persOplElm = h.getElm('personligeOplysninger')\r\n if (persOplElm && !ko.dataFor(persOplElm)) {\r\n ko.applyBindings(app.root.Kunde, h.getElm('personligeOplysninger'))\r\n }\r\n\r\n const persOpProlElm = h.getElm('personligeOplysningerProtected')\r\n if (persOpProlElm && !ko.dataFor(persOpProlElm)) {\r\n ko.applyBindings(app.root.Kunde, h.getElm('personligeOplysningerProtected'))\r\n }\r\n\r\n const tilbudTotal = h.getElm('tilbudTotal')\r\n if (tilbudTotal && !ko.dataFor(tilbudTotal)) {\r\n ko.applyBindings(app.root, h.getElm('tilbudTotal'))\r\n }\r\n\r\n const activeProductCustomerPrice = h.getElm('activeProductCustomerPrice')\r\n if (activeProductCustomerPrice && !ko.dataFor(activeProductCustomerPrice)) {\r\n ko.applyBindings(app.root, h.getElm('activeProductCustomerPrice'))\r\n }\r\n\r\n // help specify what product is currently being clicked (doesn't have to be the one actually selected for purchase)\r\n jElement.find('.dws-js-daekningBeregnet').on('click', function (e) {\r\n basic.displayInfoAboutDaekning = undefined\r\n const _id = $(this)\r\n .parents('[data-table-entry-id]')\r\n .attr('data-table-entry-id')\r\n if (_id) {\r\n app.root.ensureActiveProduct(_id, function () {\r\n displayMessageButton(e.currentTarget)\r\n })\r\n }\r\n })\r\n enableToolTips(jElement)\r\n}\r\n\r\n// Page section scripts -----------------------------------------------------------------------------\r\n\r\nbasic.acceptNewPrice = function (actionSettings) {\r\n // TODO: We need a common accept price for all products here.\r\n console.log('basic.acceptNewPrice not yet implemented')\r\n}\r\n\r\nbasic.endSession = function () {\r\n app.loadHtml({\r\n url: 'shop/logout',\r\n block: true,\r\n actionOnBusy: 'queue',\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n console.log('Succesfull logout')\r\n },\r\n fail: function (data, textStatus, jqXHR) {\r\n if (data.Message && data.Message.Action == '') {\r\n console.log('Logging out failed')\r\n }\r\n }\r\n })\r\n}\r\n\r\nbasic.acceptPriceAndProceed = function () {\r\n app.resetPendingUserAction()\r\n // todo: evaluate if this function should take in product specific actionsettings and pass them on.\r\n // below, could also be altered into a switch case for each product\r\n // basic.acceptNewPrice()\r\n $('#cprNrMsg').hide()\r\n}\r\n\r\nbasic.supplerendeInfo = function (jElement, productId) {\r\n app.root.ensureActiveProduct(productId, function () {\r\n basic.notifyIfChangedAddress()\r\n if (h.getElm('UnderwritingAcceptNej')) {\r\n const _jForm = jElement\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n // validation rules\r\n const rules = {\r\n UnderwritingAccept: {\r\n required: true,\r\n ifws_isInvalid: true\r\n }\r\n }\r\n const messages = {\r\n UnderwritingAccept: {\r\n required: TextHelper.getRadioButtonUnansweredErrorMessage(),\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-UNDERWRITING_AFVIST_' + app.root.activeProduct.produktNavn,\r\n 'Vi kan desværre ikke tilbyde dig den forsikring som du har beregnet en pris på. Du bedes venligst kontakte kundeservice på telefonnummer 70 12 12 12 for at få din forsikring.'\r\n )\r\n }\r\n }\r\n\r\n h.addValidationRulesToForm(_jForm, rules, messages)\r\n\r\n $('input[name=UnderwritingAccept]').on('change', function () {\r\n const _afvist = h.getElm('UnderwritingAcceptJa')\r\n _afvist.ifws_isInvalid = _afvist.checked\r\n\r\n h.validateElement(\r\n _afvist,\r\n 'ifws_isInvalid',\r\n app.getFejlKodeText(\r\n 'CLIENT-UNDERWRITING_AFVIST_' + app.root.activeProduct.produktNavn,\r\n 'Vi kan desværre ikke tilbyde dig den forsikring som du har beregnet en pris på. Du bedes venligst kontakte kundeservice på telefonnummer 70 12 12 12 for at få din forsikring.'\r\n )\r\n )\r\n })\r\n\r\n if (h.getElm('underwritingAcceptGroup')) {\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('underwritingAcceptGroup')\r\n )\r\n }\r\n\r\n // expects a form with validator is already created\r\n jElement[0].validator.customShowLabel = function (element, message, rule) {\r\n if (element.id === 'UnderwritingAcceptJa' && rule === 'ifws_isInvalid') {\r\n // ignoreContact added by pedkia\r\n basic.showInlineMessage(\r\n jElement.find('#underwritingMessage'),\r\n message,\r\n true,\r\n false\r\n )\r\n return false\r\n }\r\n }\r\n jElement[0].validator.customUnhighlight = function (element, message) {\r\n if (element.id === 'UnderwritingAcceptJa') {\r\n basic.clearInlineMessage(jElement.find('#underwritingMessage'))\r\n }\r\n }\r\n }\r\n h.selectNextEntry(jElement)\r\n })\r\n}\r\n\r\nbasic.wizardSteps = function () {\r\n if (app.page === 'checkout' && window.history) {\r\n // ensure that the maxicart will be shown when using the browser Back button\r\n const cartUrl = window.ifws_shopUrl.replace('webshop', 'forsikringer/cart')\r\n window.history.pushState({ page: 'cart' }, '', cartUrl)\r\n window.history.pushState({ page: 'this' }, '', window.ifws_shopUrl)\r\n }\r\n\r\n enableToolTips($('#loginMessage'))\r\n enableToolTips($('#loggedInUserInfo'))\r\n\r\n $('.wizardStep').on('click', function () {\r\n // act when user clicks on a step\r\n const _step = parseInt($(this).attr('data-StepNumber'))\r\n // Ensure the user can only go bwd by compareing pending step with the step saved on a data attrib on the step element\r\n // also make sure the user doesn't go anywhere by clicking on the current step\r\n if (\r\n _step &&\r\n _step <= app.wizard.pendingStepNo &&\r\n _step !== app.wizard.currentStepNo\r\n ) {\r\n // go to selected step\r\n app.wizard.goTo(_step)\r\n }\r\n })\r\n}\r\n\r\nbasic.updatePricesOnTilvalgChange = function (self) {\r\n const _type = $(self).attr('data-daekning')\r\n $.each(app.root.activeProduct.Daekning().Daekninger(), function (index, item) {\r\n if (item.ModelNavn() === _type) {\r\n item.Valgt(self.checked)\r\n app.root.activeProduct.Daekning().updatePrices()\r\n return false // $.each\r\n }\r\n })\r\n $.each(app.root.activeProduct.Praemier(), function (index, item) {\r\n $.each(item.Daekninger(), function (addOnIndex, addOnItem) {\r\n if (addOnItem.ModelNavn() === _type) {\r\n if (addOnItem.Tilbydes()) {\r\n addOnItem.Valgt(self.checked)\r\n item.updatePrices()\r\n }\r\n return false // $.each\r\n }\r\n })\r\n })\r\n\r\n app.root.activeProduct.PublishGTMPriceChangingEvent()\r\n\r\n app.root.activeProduct.sync(\r\n {\r\n always: function (message = {}) {\r\n app.bottomDataUpdate(message.Data)\r\n }\r\n },\r\n true\r\n )\r\n}\r\n\r\nbasic.setSourceForCoveragePriceSpinner = function () {\r\n const largeLoaderImages = $(\"img[id='largeLoaderImage']\")\r\n for (let i = 0; i < largeLoaderImages.length; i++) {\r\n const image = largeLoaderImages[i]\r\n image.src = app.shopHostUrl + 'Styling/img/webshop/shopflow/large-loader.gif'\r\n }\r\n}\r\n\r\nbasic.dakningstyper = function (jElement) {\r\n enableToolTips($('#tilvalgGroup'))\r\n updateUnboundRadioAndCheckboxes($('#tilvalgGroup'))\r\n\r\n basic.setSourceForCoveragePriceSpinner()\r\n\r\n // help specify what product is currently being clicked (doesn't have to be the one actuelly selected for purchase)\r\n $('.produktDataSection .displayMessageButton').on('click', function () {\r\n const _name = $(this)\r\n .parentsUntil(app.getTopJElm(), '.produktTopSection')\r\n .attr('data-policetype')\r\n\r\n $.each(app.root.activeProduct.Praemier(), function (index, item) {\r\n if (item.ModelNavn() === _name) {\r\n // used by basic.prisOpsummering\r\n basic.displayInfoAboutDaekning = item\r\n return false\r\n }\r\n })\r\n })\r\n}\r\n\r\nbasic.personligStep = function (jElement) {\r\n h.bindNodesToKunde()\r\n\r\n const blockMessageElement = $('#validateCartError')[0]\r\n if (app.root.Kunde().ShowPurchaseBlockedMessage() && blockMessageElement) {\r\n blockMessageElement.scrollIntoView({\r\n block: 'center',\r\n behavior: 'smooth'\r\n })\r\n }\r\n}\r\n\r\nbasic.productSpecificValidationFunction = function (payerOfInsurance) {\r\n return true\r\n}\r\n\r\nbasic.ClearMedforsikretAdress = function () {\r\n h.enable($('#selectMedforsikretAddress'))\r\n\r\n // reset multicontrol behaviour\r\n const _jAddress = $('#selectMedforsikretAddress')\r\n if (_jAddress.length > 0) {\r\n _jAddress[0].ifws_control.setAddressId('')\r\n _jAddress[0].ifws_control.isDisabled = false\r\n _jAddress[0].ifws_control.enable()\r\n _jAddress[0].ifws_control.reset()\r\n }\r\n\r\n // reset medforsikret address properties\r\n app.root.Medforsikret().Postnr('')\r\n app.root.Medforsikret().By('')\r\n app.root.Medforsikret().Gade('')\r\n app.root.Medforsikret().Husnr('')\r\n app.root.Medforsikret().Etage('')\r\n app.root.Medforsikret().SideDoerNr('')\r\n app.root.Medforsikret().Longitude('')\r\n app.root.Medforsikret().Latitude('')\r\n\r\n // remove from select list ui\r\n $('#selectMedforsikretAddress').val('')\r\n $('#selectMedforsikretAddress')[0].ifws_control.setText('')\r\n $('#selectMedforsikretAddress').enable()\r\n $('#selectMedforsikretAddress').change()\r\n}\r\n\r\nbasic.CopyKundeAdressToMedforsikret = function () {\r\n // reset kunde address properties to medforsikret\r\n app.root.Medforsikret().Postnr(app.root.Kunde().Postnr())\r\n app.root.Medforsikret().By(app.root.Kunde().By())\r\n app.root.Medforsikret().Gade(app.root.Kunde().Gade())\r\n app.root.Medforsikret().Husnr(app.root.Kunde().Husnr())\r\n app.root.Medforsikret().Etage(app.root.Kunde().Etage())\r\n app.root.Medforsikret().SideDoerNr(app.root.Kunde().SideDoerNr())\r\n app.root.Medforsikret().Longitude(app.root.Kunde().Longitude())\r\n app.root.Medforsikret().Latitude(app.root.Kunde().Latitude())\r\n}\r\n\r\nbasic.FillMedforsikretAdress = function (address) {\r\n const elm = h.getElm('selectMedforsikretAddress')\r\n if (elm) {\r\n $('#selectMedforsikretAddress').val(address)\r\n $('#selectMedforsikretAddress')[0].ifws_control.setText(address)\r\n basic.CopyKundeAdressToMedforsikret()\r\n\r\n // reset multicontrol\r\n const _jAddress = $('#selectMedforsikretAddress')\r\n if (_jAddress[0].ifws_isInvalid) {\r\n _jAddress[0].ifws_isInvalid = false\r\n h.updateElementValidation(\r\n _jAddress[0],\r\n 'ifws_isInvalid',\r\n '',\r\n true\r\n )\r\n }\r\n _jAddress[0].ifws_control.isDisabled = false\r\n _jAddress[0].ifws_control.enable()\r\n\r\n // trigger change behavioue in adresscontroll\r\n _jAddress[0].ifws_control.evaluate()\r\n h.disable($('#selectMedforsikretAddress'))\r\n }\r\n}\r\n\r\nbasic.personligInfo = function (jElement) {\r\n if (h.getElm('kontaktInfoNameGroup')) {\r\n const kElm = $('#kontaktInfoNameGroup')\r\n if (ko.dataFor(kElm[0]) && kElm.length) {\r\n ko.cleanNode(kElm[0])\r\n }\r\n ko.applyBindings(app.root.Kunde, h.getElm('kontaktInfoNameGroup'))\r\n enableToolTips(kElm)\r\n }\r\n\r\n const person = app.root.Kunde()\r\n basic.personligInfo1(PersonEntities.Kunde, person, jElement)\r\n\r\n const isMedforsikretGrpElm = h.getElm('IsMedforsikretGroup')\r\n if (isMedforsikretGrpElm) {\r\n if (ko.dataFor(isMedforsikretGrpElm)) {\r\n ko.cleanNode(isMedforsikretGrpElm)\r\n }\r\n ko.applyBindings(app.root.Kunde, isMedforsikretGrpElm)\r\n }\r\n\r\n const elm = document.getElementById('MedforsikretNavnOgCPRGroup')\r\n\r\n if (elm) {\r\n if (ko.dataFor(elm)) {\r\n ko.cleanNode(elm)\r\n }\r\n\r\n // remove any previous binding from address element\r\n const detailElement = document.getElementById('medforsikretFamilieDetaljer')\r\n if (detailElement && ko.dataFor(detailElement)) {\r\n ko.cleanNode(detailElement)\r\n }\r\n\r\n ko.applyBindings(\r\n app.root.Medforsikret,\r\n elm\r\n )\r\n basic.medforsikretGroup()\r\n\r\n app.root.Medforsikret().UseCustomerAdressForCoInsured.subscribe(\r\n function (val) {\r\n basic.ClearMedforsikretAdress()\r\n if (val) {\r\n // copy address from kunde\r\n basic.FillMedforsikretAdress(app.root.Kunde().Address())\r\n }\r\n }\r\n )\r\n // validation rules (using dynamic settings and not static settings {fornavn: ...} because we need to use the prefix)\r\n $('#MedforsikretFornavn').rules('add', {\r\n required: true\r\n })\r\n $('#MedforsikretEfternavn').rules('add', {\r\n required: true\r\n })\r\n\r\n const mfCpr1 = h.getElm('MedforsikretCpr1')\r\n const mfCpr2 = h.getElm('MedforsikretCpr2')\r\n\r\n if (!(mfCpr1.disabled || mfCpr2.disabled)) {\r\n enableCPRValidationMedforsikret(jElement, app.root.Medforsikret().role)\r\n }\r\n }\r\n\r\n basic.clearInlineMessage(jElement.find('#personligInfoMessage'))\r\n\r\n for (let i = 0; i < app.root.ProduktOverblikV2.ProductsInCart.length; i++) {\r\n const prod = app.root.ProduktOverblikV2.ProductsInCart[i]\r\n if (prod.localName === 'bil' && !app.root.Disv()) {\r\n $('#familieDetaljer .dws-smallButton').remove()\r\n break\r\n }\r\n }\r\n\r\n if (!app.root.ShowCustomerElements()) {\r\n // hide additional customer elements not bound with ko\r\n $('.hide-customer-element').hide()\r\n }\r\n\r\n if (!app.root.Kunde().ShowPurchaseBlockedMessage()) {\r\n h.selectNextEntry(jElement)\r\n }\r\n\r\n $('[data-id=editEmail]').click(function () {\r\n app.root.UserClickedChangeEmail(true)\r\n })\r\n $('[data-id=editPhone]').click(function () {\r\n app.root.UserClickedChangePhone(true)\r\n })\r\n}\r\n\r\n// Medforsikret start --------------------------------------\r\nbasic.medforsikretGroup = function (jElement) {\r\n if (app.root && app.root.Kunde) {\r\n app.root.Kunde().IsMedforsikret.subscribe(function (newValue) {\r\n basic.displayMedforsikretGroup()\r\n })\r\n }\r\n basic.displayMedforsikretGroup()\r\n}\r\n\r\nbasic.displayMedforsikretGroup = function () {\r\n const isMedforsikretNej = h.getElm('IsMedforsikretNej')\r\n if (!isMedforsikretNej) {\r\n return\r\n }\r\n if (isMedforsikretNej.checked) {\r\n $('#MedforsikretNavnOgCPRGroup').hide()\r\n } else {\r\n $('#MedforsikretNavnOgCPRGroup').show()\r\n }\r\n}\r\n// Medforsikret Slut --------------------------------------\r\n\r\nbasic.shopHeader = function (jElement) {\r\n // the header might not display the group, if it isn't available - e.g. om the last page\r\n\r\n const _elm = h.getElm('headerCartCount')\r\n if (_elm) {\r\n ko.applyBindingsToNode(_elm, null, app.root)\r\n }\r\n\r\n if (h.getElm('gotoCart')) {\r\n $('#gotoCart').on('click', function () {\r\n // use singleActionButton to ensure this action is finished without any other actions interrupting\r\n basic.validateAll(jElement, function () {\r\n app.loadPage('cart')\r\n })\r\n })\r\n }\r\n\r\n // WDK-1933\r\n $(window).bind('beforeunload', function (e) {\r\n const message = 'Du er ved at forlade webshoppen.'\r\n e.returnValue = message\r\n return message\r\n })\r\n}\r\n\r\nbasic.medarbejderkodePanel = function (jElement) {\r\n ko.applyBindings(app.root.Kunde, h.getElm('HarFaaetHjaelpAf'))\r\n\r\n // look for medarbejderkode as soon as enough characters are entered:\r\n $('#HarFaaetHjaelpAf').on('keydown', function (e) {\r\n this.validateEntry = e.which !== 0 && e.charCode !== 0\r\n })\r\n\r\n // validation rules\r\n const _jForm = jElement\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const _validator = _jForm.validate({\r\n rules: {\r\n HarFaaetHjaelpAf: {\r\n required: true,\r\n maxlength: 4\r\n }\r\n }\r\n })\r\n _jForm[0].validator = _validator\r\n}\r\n\r\nbasic.kundePanel = function (jElement) {\r\n app.root.activeProduct.disposeDaekningsSubscriptions()\r\n\r\n enableToolTips(jElement)\r\n\r\n // obs: extremely important do not remove\r\n h.getForm(jElement)\r\n\r\n // setup controls. the setup of validation rules is done dynamic (directly on the elements), so it won't overwrite any existing rules.\r\n basic.setupKundeInfoGroup(jElement)\r\n\r\n if (app.root.DisableCustomerElements()) {\r\n basic.hideCprGroupSection()\r\n }\r\n}\r\nbasic.hideForsikredeCprGroupSection = function () {\r\n const elm = h.getElm('forsikredeCPRGroup')\r\n if (elm) {\r\n elm.style.display = 'none'\r\n }\r\n\r\n const insuredHeadline = document.querySelector('[data-id=\"header_DenUlykkeForsikrede-ulykke\"]')\r\n if (insuredHeadline) {\r\n insuredHeadline.style.display = 'none'\r\n }\r\n}\r\n\r\nbasic.hideCprGroupSection = function () {\r\n const elm = h.getElm('CPRGroup')\r\n if (elm) {\r\n elm.style.display = 'none'\r\n }\r\n}\r\n\r\nbasic.cartOverviewRefresh = function (id, removeFromWizzardStep1) {\r\n if (removeFromWizzardStep1 === true) {\r\n app.loadMaxiCart()\r\n } else {\r\n if (app.page === 'produkt') {\r\n if (app.root.activeProduct && app.root.activeProduct.ProduktID() === id) {\r\n // user removed the active product. reload the next product page\r\n app.loadMaxiCart()\r\n } else {\r\n // user removed another product. refresh the page\r\n app.loadPage('produkt') // REFAC: only update totals and the cart overview\r\n }\r\n } else {\r\n app.loadMaxiCart()\r\n }\r\n }\r\n}\r\n\r\nbasic.cartOverview = function (jElement) {\r\n // used by both cart page and the cart as a right side panel\r\n\r\n jElement.find('.tableRemove').on('click', function (e) {\r\n const _id = $(this)\r\n .parentsUntil(app.getTopJElm(), '.prisPanel')\r\n .attr('data-table-entry-id')\r\n if (_id) {\r\n // Ask the user to confirm the action\r\n const _txt = app.getHjaelpeKodeText(\r\n 'CLIENT-BEKRAEFT_SLET_PRODUKT',\r\n 'Er du sikker på at du vil slette den valgte forsikring?'\r\n )\r\n // short, long, actionSettings, className\r\n app.showQuestion('', _txt, {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-JA', 'Ja'),\r\n cancelText: app.getHjaelpeKodeText('CLIENT-BUTTON-NEJ', 'Nej'),\r\n ok: function () {\r\n if (app.page === 'produkt') {\r\n // if on the product page, yóu may be working on the active product when deleting it from the cart in the right panel\r\n // test if this is the last one.\r\n if (app.root.CartCount() === 1) {\r\n // only one product. just remove it and exit (validation happens again on the server and then the server issues the exit response)\r\n basic.removeProduct(_id)\r\n } else {\r\n if (app.root.activeProduct.ProduktID() === _id) {\r\n // inform the user that the current product is now removed and he/she will continue to the next\r\n const _txt = app.getHjaelpeKodeText(\r\n 'CLIENT-AKTUELT_PRODUKT_SLETTET',\r\n 'Forsikringen blev fjernet fra kurven?'\r\n )\r\n const _buttonTxt = app.getHjaelpeKodeText(\r\n 'CLIENT-AKTUELT_PRODUKT_SLETTET_BUTTON',\r\n 'Fortsæt'\r\n )\r\n\r\n app.showMessage('', _txt, {\r\n okText: _buttonTxt,\r\n ok: function () {\r\n basic.removeProduct(_id)\r\n },\r\n escape: function () {\r\n basic.removeProduct(_id)\r\n }\r\n })\r\n } else {\r\n basic.removeProduct(_id)\r\n }\r\n }\r\n } else {\r\n // on the cart page (at least not on the product page), dont ask any further\r\n basic.removeProduct(_id)\r\n }\r\n },\r\n cancel: function () {\r\n // do nothing further. the user will correct problems\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n } else {\r\n app.reportFail('id not found when deleting product from client')\r\n }\r\n e.stopPropagation() // ensure jElement.find('.tableEdit').on('click', is not hit too\r\n })\r\n\r\n jElement.find('.tableEdit').on('click', function () {\r\n const element = this\r\n\r\n basic.validateAll(jElement, function () {\r\n // practically a loadPage call, but we need to call the page with the right id\r\n const _id = $(element)\r\n .parentsUntil(app.getTopJElm(), '.prisPanel,.prisPanelDescription')\r\n .attr('data-table-entry-id')\r\n if (_id) {\r\n app.loadHtml({\r\n element: this,\r\n url: 'shop/produkt/' + _id,\r\n block: true,\r\n actionOnBusy: 'queue',\r\n done: function (data, textStatus, jqXHR) {\r\n app.loadPage(null, null, data)\r\n },\r\n always: function () {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n } else {\r\n singleActionButton.setIsChanging(false)\r\n app.reportFail('id not found when editing product from client')\r\n }\r\n })\r\n })\r\n\r\n $('#checkout').on('click', function () {\r\n // if there is a page specific navigation button -use it instead\r\n const _jPageButton = $('#wizardNavigation .ecmt-button')\r\n if (h.isSingleResult(_jPageButton)) {\r\n _jPageButton.click()\r\n } else {\r\n singleActionButton.execute({\r\n onSuccess: function () {\r\n app.loadPage('checkout', undefined, undefined, {\r\n always: function () {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n }\r\n })\r\n }\r\n })\r\n\r\n $('#finishCalculations').on('click', function () {\r\n const _jPageButton = $('#wizardNavigation .ecmt-button')\r\n if (h.isSingleResult(_jPageButton)) {\r\n _jPageButton.click()\r\n } else {\r\n singleActionButton.execute({\r\n onSuccess: function () {\r\n const _id = $('#cartOverview')\r\n .find('.notDone')\r\n .first()\r\n .attr('data-table-entry-id')\r\n if (_id) {\r\n basic.gotoProduct(_id, {\r\n always: function () {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n } else {\r\n app.reportFail('id not found when editing product from client')\r\n singleActionButton.setIsChanging(false)\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n enableSelect($('#selectProduktType'), null, null, {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n if (app.root.ProduktTyper) {\r\n for (let i = 0; i < app.root.ProduktTyper.length; i++) {\r\n if (\r\n app.root.ProduktTyper[i].Aktiv &&\r\n app.root.ProduktTyper[i].InMenu\r\n ) {\r\n let txt = app.root.ProduktTyper[i].LangTitel\r\n let val = app.root.ProduktTyper[i].Navn\r\n\r\n // WDK-2130\r\n if (val.toLowerCase() === 'borneforsikring') {\r\n txt = app.root.ProduktTyper[i].LangTitel\r\n val = 'ulykkebarn'\r\n }\r\n\r\n // add to array\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(val)\r\n )\r\n }\r\n }\r\n }\r\n }\r\n })\r\n\r\n $('#selectProduktType').on('change', function () {\r\n app.root.addProdukt($('#selectProduktType')[0].value, {\r\n // immediately after the products are saved, call the server to direct the user to the most relevant product\r\n done: basic.gotoNextProduct,\r\n always: function () {\r\n // reset the content of the list\r\n const _select = h.getElm('selectProduktType')\r\n _select.ifws_control.setText(undefined)\r\n _select.ifws_control.update()\r\n }\r\n })\r\n })\r\n\r\n // update the text on the navigation button\r\n basic.updateCartPanelButton()\r\n // display it (it is hidden if displayed in right panel)\r\n $('#dws-kurvNavigering').show('fade', 200)\r\n\r\n // help specify what product is currently being clicked (doesn't have to be the one actuelly selected for purchase)\r\n jElement.find('.dws-js-daekningBeregnet').on('click', function (e) {\r\n // used by basic.prisOpsummering\r\n basic.displayInfoAboutDaekning = undefined\r\n\r\n const _id = $(this)\r\n .parents('.prisPanel')\r\n .attr('data-table-entry-id')\r\n if (_id) {\r\n app.root.ensureActiveProduct(_id, function () {\r\n displayMessageButton(e.currentTarget)\r\n })\r\n }\r\n })\r\n}\r\n\r\nbasic.bottomSummaryClick = function (cartStatus, NumProductsInCart) {\r\n if (app.GetNissanContext()) {\r\n return\r\n }\r\n const showPrice =\r\n cartStatus.toLowerCase() === 'producthasprice' ||\r\n (NumProductsInCart === '1' && cartStatus.toLowerCase() === 'checkout')\r\n if (showPrice) {\r\n basic.displayInfoAboutDaekning = undefined\r\n displayMessageButton(h.getElm('floating-summary-text'))\r\n } else {\r\n if ($('#webshop-floating-cart').hasClass('hidden')) {\r\n $('#webshop-floating-cart').removeClass('hidden')\r\n $('#webshop-floating-cart').addClass('visible')\r\n return false\r\n }\r\n }\r\n}\r\n\r\nbasic.prisOpsummering = function (jElement) {\r\n let daekning\r\n // basic.displayInfoAboutDaekning is set on the display buttons click event. The model is retreived based on attribute values in the element containing the display button\r\n if (basic.displayInfoAboutDaekning) {\r\n daekning = basic.displayInfoAboutDaekning\r\n } else {\r\n daekning = app.root.activeProduct.Daekning()\r\n }\r\n\r\n if (daekning) {\r\n // bind price\r\n ko.applyBindings(daekning, h.getElm('produktOpsummeringDetaljerPriser'))\r\n }\r\n}\r\n\r\n// Other scripts ------------------------------------------------------------------------------------\r\n\r\nbasic.displaySimpleMessage = function (jElement, productId, kort, lang) {\r\n if (kort || lang) {\r\n app.showMessage(\r\n kort,\r\n lang,\r\n { okText: app.getHjaelpeKodeText('CLIENT-BUTTON-LUK', 'Luk') },\r\n undefined,\r\n false\r\n )\r\n }\r\n}\r\n\r\nbasic.vaelgAndenAdresse = function () {\r\n app.root.Kunde().Postnr('')\r\n app.root.Kunde().By('')\r\n app.root.Kunde().Gade('')\r\n app.root.Kunde().Husnr('')\r\n // app.root.Kunde.Kvhx('');\r\n app.root.Kunde().Etage('')\r\n app.root.Kunde().SideDoerNr('')\r\n app.root.Kunde().Longitude('')\r\n app.root.Kunde().Latitude('')\r\n\r\n const _jPostnr = $('#Postnr')\r\n _jPostnr[0].ifws_control.isDisabled = false\r\n _jPostnr[0].ifws_control.enable()\r\n _jPostnr[0].ifws_control.reset()\r\n\r\n const _jGade = $('#selectGade')\r\n _jGade[0].ifws_control.isDisabled = false\r\n _jGade[0].ifws_control.enable()\r\n _jGade[0].ifws_control.reset()\r\n\r\n const _jAddress = $('#selectAddress')\r\n _jAddress[0].ifws_control.isDisabled = false\r\n _jAddress[0].ifws_control.enable()\r\n _jAddress[0].ifws_control.reset()\r\n\r\n const _jHusnr = $('#selectHusnr')\r\n _jHusnr[0].ifws_control.isDisabled = false\r\n _jHusnr[0].ifws_control.enable()\r\n _jHusnr[0].ifws_control.reset()\r\n\r\n const _jEtage = $('#selectEtage')\r\n _jEtage[0].ifws_control.isDisabled = false\r\n _jEtage[0].ifws_control.enable()\r\n _jEtage[0].ifws_control.reset()\r\n\r\n const _jSideDoer = $('#selectSideDoerNr')\r\n _jSideDoer[0].ifws_control.isDisabled = false\r\n _jSideDoer[0].ifws_control.enable()\r\n _jSideDoer[0].ifws_control.reset()\r\n}\r\n\r\nbasic.validateAll = function (jElement, action) {\r\n singleActionButton.execute({\r\n validateForms: true,\r\n actionName: 'validateAll',\r\n waiting: 0,\r\n onSuccess: function (s) {\r\n // no validation problems. Save and move on\r\n app.root.activeProduct.save(\r\n {\r\n done: function () {\r\n action()\r\n },\r\n entryFail: function () {\r\n // validation error. ignore\r\n action()\r\n return false\r\n },\r\n always: function () {\r\n singleActionButton.setIsChanging(false)\r\n }\r\n },\r\n true\r\n )\r\n },\r\n onFail: function (s) {\r\n // validation problems\r\n const _txt = app.getHjaelpeKodeText(\r\n 'CLIENT-BEKRAEFT_GEM_GRUNDET_FEJL',\r\n 'Du er ikke færdig med at udfyld denne side. Tryk ja hvis du vil fortsætte uden at gemme. Tryk nej hvis du vil færdiggøre siden først.'\r\n )\r\n // short, long, actionSettings, className\r\n app.showQuestion('', _txt, {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-JA', 'Ja'),\r\n cancelText: app.getHjaelpeKodeText('CLIENT-BUTTON-NEJ', 'Nej'),\r\n ok: function () {\r\n // ignore problems, reset product and move on\r\n app.root.activeProduct.load({ done: action }) // reads saved data from server overwriting any changes not accepted\r\n s.setIsChanging(false)\r\n },\r\n cancel: function () {\r\n // do nothing further. the user will correct problems\r\n s.setIsChanging(false)\r\n }\r\n })\r\n singleActionButton.setIsChanging(false)\r\n }\r\n })\r\n}\r\n\r\nbasic.updateTotalFields = function () {\r\n // update price panels\r\n if (h.getElm('forsikringerIKurv')) {\r\n // the sum form is propably displayed in a panel on the right. rerender it\r\n app.loadHtml({\r\n url: 'bilprodukt/getsubview/forsikringerikurv',\r\n block: false,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n $('#forsikringerIKurv')\r\n .parent()\r\n .html(data)\r\n }\r\n })\r\n }\r\n app.root.sync()\r\n}\r\n\r\nbasic.gotoNextProduct = function () {\r\n return basic.gotoProduct('next')\r\n}\r\n\r\nbasic.gotoProduct = function (id, actionSettings) {\r\n // find the topmost table entry in the list containing products that aren't done\r\n app.loadHtml({\r\n element: this,\r\n url: 'shop/produkt/' + id,\r\n actionOnBusy: 'queue',\r\n block: true,\r\n actionSettings,\r\n done: function (data, textStatus, jqXHR) {\r\n // the product is found, open it\r\n app.loadPage(null, null, data)\r\n }\r\n })\r\n}\r\n\r\nbasic.disableCpr = function () {\r\n document.getElementById('Cpr1').disabled = true\r\n document.getElementById('Cpr2').disabled = true\r\n}\r\n\r\nbasic.validateMopedRegnr = function (regNr) {\r\n const regnr = { regNr }\r\n const defer = $.Deferred()\r\n app.loadJson({\r\n url: 'knallertprodukt/ValidateRegNr',\r\n data: JSON.stringify(regnr),\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n defer.resolve(data)\r\n }\r\n })\r\n return defer.promise()\r\n}\r\n\r\nbasic.getPersonToUpdateInfoFor = function (prefix) {\r\n let personToUpdateDataFor\r\n if (prefix == PersonEntities.Medforsikret) {\r\n personToUpdateDataFor = app.root.Medforsikret()\r\n } else if (prefix == PersonEntities.ForsikredePerson) {\r\n if (app.root.activeProduct.ForsikredePerson && app.root.activeProduct.ForsikredePerson()) {\r\n personToUpdateDataFor = app.root.activeProduct.ForsikredePerson()\r\n }\r\n } else if (prefix == PersonEntities.Kunde) {\r\n personToUpdateDataFor = app.root.Kunde()\r\n } else if (prefix == PersonEntities.AndenForsikrede) {\r\n if (app.root.activeProduct.ForsikredePerson && app.root.activeProduct.ForsikredePerson()) {\r\n personToUpdateDataFor = app.root.activeProduct.ForsikredePerson()\r\n }\r\n }\r\n return personToUpdateDataFor\r\n}\r\n\r\nbasic.personligInfo1 = function (prefix, person, jElement) {\r\n // prefix: used for \"andens\" (Car - other user)\r\n enableToolTips(jElement)\r\n\r\n if (h.getElm('EmailAdr')) {\r\n h.getElm('EmailAdr').ifws_customValidation = function (value) {\r\n if (value) {\r\n const txt = value.substring(0, value.indexOf('@'))\r\n const rule = /[^\\x20-\\x7F]+/\r\n this.ifws_isInvalid = rule.exec(txt) != null\r\n }\r\n return !this.ifws_isInvalid\r\n }\r\n }\r\n\r\n const _jForm = $('#bekraeft')\r\n\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n if (!_jForm[0].validator) {\r\n const _validator = _jForm.validate()\r\n _jForm[0].validator = _validator\r\n }\r\n\r\n if (prefix == PersonEntities.Kunde) {\r\n // dont display mobil etc. for \"AndenBruger\"\r\n\r\n $('#MobilNr').rules('add', {\r\n required: true,\r\n number: true,\r\n minlength: 8,\r\n messages: {\r\n number: app.getFejlKodeText(\r\n 'CLIENT-MOBIL_NUMBERS_ONLY',\r\n 'Indtast venligst et dansk telefonnummer (8 cifre - uden landekode).'\r\n ),\r\n minlength: app.getFejlKodeText(\r\n 'CLIENT-MOBIL_NUMBERS_ONLY',\r\n 'Indtast venligst et dansk telefonnummer (8 cifre - uden landekode).'\r\n )\r\n }\r\n })\r\n\r\n if (h.getElm('EmailAdr')) {\r\n $('#EmailAdr').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true,\r\n email: true\r\n })\r\n\r\n // TODO: Add db fejlcodes for the two messages below.\r\n // E-mailadresse er obligatorisk\r\n // Ugyldig emailadresse\r\n\r\n h.addValidatorMessage(\r\n h.getElm('EmailAdr'),\r\n 'required'\r\n )\r\n\r\n h.addValidatorMessage(\r\n h.getElm('EmailAdr'),\r\n 'email',\r\n app.getFejlKodeText(\r\n 'CLIENT-EMAIL_IS_INVALID',\r\n 'Indtast venligst en gyldig e-mail.'\r\n )\r\n )\r\n\r\n h.addValidatorMessage(\r\n h.getElm('EmailAdr'),\r\n 'ifws_isInvalid',\r\n app.getFejlKodeText(\r\n 'CLIENT-EMAIL_MED_NATIONALE_TEGN',\r\n 'Du kan ikke benytte en email konto med nationale bogstaver.'\r\n )\r\n )\r\n\r\n emailUnexpectedData.attach(document.getElementById('EmailAdr'), document.getElementById('email-content-info'))\r\n }\r\n }\r\n\r\n if (prefix == PersonEntities.Kunde) {\r\n app.root.FrysKundeInfo()\r\n\r\n $('#MobilNr').blur(function () {\r\n if (!$('#MobilNr').is(':disabled')) {\r\n if (h.validateElement($('#MobilNr')[0], 'MobilNr', '')) {\r\n app.root.Kunde().CallPushUpdate()\r\n }\r\n }\r\n })\r\n\r\n $('#EmailAdr').blur(function () {\r\n if (!$('#EmailAdr').is(':disabled')) {\r\n if (h.validateElement($('#EmailAdr')[0], 'EmailAdr', '') && !emailUnexpectedData.containsUnexpectedData($('#EmailAdr').val())) {\r\n app.root.Kunde().CallPushUpdate()\r\n }\r\n }\r\n })\r\n\r\n if ($('#Fornavn').length) {\r\n if (!$('#Fornavn').is(':disabled')) {\r\n $('#Fornavn').change(function () {\r\n if (h.validateElement($('#Fornavn')[0], 'Fornavn', '')) {\r\n app.root.Kunde().CallPushUpdate()\r\n }\r\n })\r\n }\r\n }\r\n if ($('#Efternavn').length) {\r\n if (!$('#Efternavn').is(':disabled')) {\r\n $('#Efternavn').change(function () {\r\n if (h.validateElement($('#Efternavn')[0], 'Efternavn', '')) {\r\n app.root.Kunde().CallPushUpdate()\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n basic.setupAddressAutocomplete(prefix, app.root.activeProduct, jElement)\r\n}\r\n\r\nbasic.FindTilvalgObject = function (modelNavn) {\r\n let _model\r\n $.each(app.root.activeProduct.Daekning().Daekninger(), function (index, item) {\r\n if (item.ModelNavn() === modelNavn) {\r\n _model = item\r\n return false // $.each\r\n }\r\n })\r\n return _model\r\n}\r\n\r\nbasic.FindTilvalgObject2 = function (praemieModelNavn, modelNavn) {\r\n let _praemieModel\r\n let _model\r\n\r\n $.each(app.root.activeProduct.Praemier(), function (index, item) {\r\n if (item.ModelNavn() === praemieModelNavn) {\r\n _praemieModel = item\r\n return false // $.each\r\n }\r\n })\r\n if (_praemieModel) {\r\n $.each(_praemieModel.Daekninger(), function (index, item) {\r\n if (item.ModelNavn() === modelNavn) {\r\n _model = item\r\n return false // $.each\r\n }\r\n })\r\n }\r\n return _model\r\n}\r\n\r\nbasic.updateTilvalg = function (\r\n dependencyElm,\r\n dependentElm,\r\n disableOnChecked,\r\n uncheckOnDisable,\r\n checkOnDisable,\r\n disableOnUnchecked\r\n) {\r\n // used by custom code when en/disable tilvalg dependent on other tilvalg\r\n if (disableOnChecked === undefined) {\r\n disableOnChecked = false\r\n }\r\n\r\n const _jElm = $(dependentElm)\r\n if (_jElm.length) {\r\n const _elm = _jElm[0]\r\n if (dependencyElm.checked && disableOnChecked === true) {\r\n if (uncheckOnDisable === true) {\r\n _elm.checked = false\r\n } else if (checkOnDisable === true) {\r\n _elm.checked = true\r\n }\r\n h.enable(_jElm)\r\n updateCheckbox(_elm)\r\n _jElm\r\n .parents('.dws-js-tilvalg')\r\n .find('label,span')\r\n .removeClass('dws-grayed')\r\n } else if (dependencyElm.checked || disableOnChecked === true) {\r\n const _model = basic.FindTilvalgObject($(_elm).attr('data-daekning'))\r\n if (!_model || _model.Tilbydes()) {\r\n // if the model isn't found it is propably a custom setting and not found in the normal model. such is always offered\r\n h.enable(_jElm)\r\n updateCheckbox(_elm)\r\n _jElm\r\n .parents('.dws-js-tilvalg')\r\n .find('label,span')\r\n .removeClass('dws-grayed')\r\n }\r\n } else if (disableOnUnchecked === true) {\r\n if (uncheckOnDisable === true) {\r\n _elm.checked = false\r\n } else if (checkOnDisable === true) {\r\n _elm.checked = true\r\n }\r\n h.disable(_jElm)\r\n updateCheckbox(_elm)\r\n _jElm\r\n .parents('.dws-js-tilvalg')\r\n .find('label,span')\r\n .addClass('dws-grayed')\r\n }\r\n }\r\n}\r\n\r\nbasic.setupKundeInfoGroup = function (jElement) {\r\n basic.CPRGroupEnabled = false\r\n const elmGroup = h.getElm('CPRGroup')\r\n const interactableGroup = elmGroup && elmGroup.style.display != 'none'\r\n\r\n function enableCPRGroup () {\r\n if (!basic.CPRGroupEnabled && interactableGroup) {\r\n ko.applyBindings(app.root.Kunde(), h.getElm('CPRGroup'))\r\n basic.CPRGroupEnabled = true\r\n }\r\n if (interactableGroup) {\r\n enableCPRValidationKunde(jElement, app.root.Kunde().role, true)\r\n }\r\n }\r\n enableCPRGroup()\r\n}\r\n\r\n// called by ALL products (except Moped) when reaching the coverage/price page\r\nbasic.daekningsTilpasningsPanelBasics = function (jElement) {\r\n function addOptions (element, items, selected) {\r\n const $element = $(element)\r\n\r\n items.forEach(function (value) {\r\n const isSelected = selected.toString() === value.toString()\r\n $element.append(\r\n $('')\r\n .attr('selected', isSelected)\r\n .text(h.getPrice(value) + ' kr.')\r\n .val(value)\r\n )\r\n })\r\n }\r\n const $SelvrisikoSelect = $('#SelvrisikoSelect')\r\n const activeProduct = app.root.activeProduct\r\n enableToolTips(jElement)\r\n\r\n // enable controls\r\n if ($SelvrisikoSelect.length) {\r\n let latestDaekningDefaultSelvrisiko\r\n enableSelect($SelvrisikoSelect, activeProduct, activeProduct.Daekning, {\r\n disableAutoBind: true,\r\n usesKeyValuePairs: true,\r\n selectorDefaultText: 'NON_DEFAULT_SELECTION_TEXT',\r\n onLoad: function (element) {\r\n const items = activeProduct.Daekning().SelvRisici()\r\n const defaultSelvRisiko = activeProduct.Daekning().DefaultSelvrisiko()\r\n\r\n if (\r\n latestDaekningDefaultSelvrisiko !== undefined &&\r\n defaultSelvRisiko !== latestDaekningDefaultSelvrisiko\r\n ) {\r\n activeProduct.Selvrisiko(defaultSelvRisiko)\r\n } else {\r\n // If defaultSelvrisiko is same, make sure selected value is in the range\r\n // check that selected is in items\r\n const selvrisikoInt = parseInt(activeProduct.Selvrisiko())\r\n const selvrisikoIsInSelvRisici = items.indexOf(selvrisikoInt) !== -1\r\n if (!selvrisikoIsInSelvRisici) {\r\n activeProduct.Selvrisiko(defaultSelvRisiko)\r\n }\r\n }\r\n latestDaekningDefaultSelvrisiko = defaultSelvRisiko\r\n const selected = activeProduct.Selvrisiko()\r\n addOptions(element, items, selected)\r\n }\r\n })\r\n\r\n let lastSelvrisikoString = String(activeProduct.Selvrisiko())\r\n activeProduct.daekningsSubscriptions.push(activeProduct.Selvrisiko.subscribe(function (newSelvrisiko) {\r\n const newSelvrisikoString = String(newSelvrisiko)\r\n const hasChanged = newSelvrisikoString !== lastSelvrisikoString\r\n\r\n if (hasChanged) {\r\n lastSelvrisikoString = newSelvrisikoString\r\n activeProduct.beregn()\r\n }\r\n }))\r\n }\r\n\r\n if ($('#Selvrisiko').length) {\r\n enableSlider($('#Selvrisiko'), {\r\n defaultStep: 0,\r\n format: function (value) {\r\n return h.getPrice(value) + ' kr.'\r\n },\r\n convert: function (slider, value) {\r\n // converts from slider step to property value\r\n if (slider.steps) {\r\n return slider.steps[value]\r\n }\r\n return 0\r\n },\r\n revert: function (slider, value) {\r\n // converts from property value to slider step text\r\n if (slider.steps) {\r\n return $.inArray(value, slider.steps)\r\n }\r\n return 0\r\n }\r\n })\r\n $('#Selvrisiko').slider('option', 'disabled', true)\r\n\r\n // call Beregn on any change to the criterias\r\n activeProduct.daekningsSubscriptions.push(activeProduct.Selvrisiko.subscribeChanged(activeProduct.beregnOnChange))\r\n }\r\n\r\n ko.applyBindings(activeProduct, h.getElm('daekningsTilpasningsPanel'))\r\n\r\n if ($('#addedWizardNavigation').length > 0) {\r\n ko.applyBindings(activeProduct, h.getElm('addedWizardNavigation'))\r\n }\r\n\r\n // When ever a tilvalg is un/selected, it must be reflected in the dækning object on the product and its total is updated too\r\n $('[id$=_tilvalg]').on('evaluate', function () {\r\n const checked = this.checked\r\n const elm = this\r\n const modelName = $(this).attr('data-daekning')\r\n const addOnModelProperty =\r\n 'addOnModelMap' in activeProduct && activeProduct.addOnModelMap[modelName]\r\n\r\n if (addOnModelProperty) {\r\n // this ensures that the property in the root product is kept in sync with the addon value\r\n addOnModelProperty(checked)\r\n basic.updatePricesOnTilvalgChange(elm)\r\n activeProduct.updateTilvalg()\r\n\r\n activeProduct.beregn()\r\n } else {\r\n // no need to beregn, just update prices with the selection\r\n basic.updatePricesOnTilvalgChange(this)\r\n activeProduct.updateTilvalg()\r\n }\r\n })\r\n}\r\n\r\nbasic.setupTidligereSelskab = function (jElement) {\r\n enableToolTips(jElement)\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n // validation rules\r\n const _jForm = jElement\r\n _jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const rules = {\r\n HarTidligereSelskab: {\r\n required: true\r\n },\r\n TidligereSelskab: {\r\n ifws_selected: true\r\n },\r\n OpsigelseType: {\r\n required: true,\r\n ifws_isInvalid: true\r\n },\r\n StartDateType: {\r\n required: true\r\n },\r\n selectOpsigelsesMaaned: {\r\n ifws_selected: true\r\n }\r\n }\r\n\r\n const messages = {\r\n OpsigelseType: {\r\n required: TextHelper.getRadioButtonUnansweredErrorMessage(),\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-PURCHASE_NOT_ALLOWED_CONTACT_IF',\r\n 'Vi kan desværre ikke tilbyde dig den forsikring som du har beregnet en pris på. Du bedes venligst kontakte Kundeservice på tlf. nr. 70 12 12 53.'\r\n )\r\n }\r\n }\r\n h.addValidationRulesToForm(_jForm, rules, messages)\r\n\r\n if (h.getElm('HarTidligereSelskabJa')) {\r\n ko.applyBindingsToNode(\r\n h.getElm('HarTidligereSelskabJa'),\r\n null,\r\n app.root.activeProduct\r\n )\r\n ko.applyBindingsToNode(\r\n h.getElm('HarTidligereSelskabNej'),\r\n null,\r\n app.root.activeProduct\r\n )\r\n }\r\n const harTidligereSelskabGroup = h.getElm('HarTidligereSelskabGroup')\r\n if (harTidligereSelskabGroup) {\r\n ko.applyBindingsToNode(\r\n harTidligereSelskabGroup,\r\n null,\r\n app.root.activeProduct\r\n )\r\n }\r\n\r\n const harIkkeTidligereSelskabGroup = h.getElm('HarIkkeTidligereSelskabGroup')\r\n if (harIkkeTidligereSelskabGroup) {\r\n ko.applyBindingsToNode(\r\n harIkkeTidligereSelskabGroup,\r\n null,\r\n app.root.activeProduct\r\n )\r\n }\r\n\r\n // bindings\r\n const tidligareSelskabSelect = h.getElm('TidligereSelskab')\r\n if (tidligareSelskabSelect) {\r\n enableSelect($('#TidligereSelskab'), app.root.activeProduct, null, {\r\n usesKeyValuePairs: true,\r\n onLoadDone: function (element, data) {\r\n // add list\r\n $.each(data, function (index, item) {\r\n $(element).append(\r\n $('')\r\n .text(item.Navn)\r\n .val(item.KortNavn)\r\n )\r\n })\r\n }\r\n })\r\n\r\n if (h.bindToActiveProduct('TidligerePoliceNrContainer')) {\r\n h.bindToActiveProduct('TidligerePoliceNr')\r\n }\r\n basic.setupOpsigelse(jElement)\r\n basic.setupOpsigelseTypeDataChangeHandler()\r\n }\r\n}\r\n\r\nbasic.setupOpsigelse = function (jElement) {\r\n h.bindNodesToActiveProduct('supplerendeInfo')\r\n\r\n h.bindByDataIdToActiveProduct('OpsigelseType1')\r\n h.bindByDataIdToActiveProduct('OpsigelseType2')\r\n h.bindByDataIdToActiveProduct('StartDateType1')\r\n h.bindByDataIdToActiveProduct('StartDateType2')\r\n h.bindToActiveProduct('IkraftDato')\r\n\r\n if ($('#TidligerePoliceNr').length) {\r\n $('#TidligerePoliceNr').rules('add', {\r\n maxlength: 20,\r\n required: true\r\n })\r\n }\r\n\r\n if ($('#IkraftDato').length) {\r\n $('#IkraftDato').rules('add', {\r\n required: true,\r\n ifws_date: true,\r\n ifws_isInvalid: true\r\n })\r\n h.addValidatorMessage(\r\n h.getElm('IkraftDato'),\r\n 'ifws_date',\r\n app.getFejlKodeText(\r\n 'CLIENT-DATO_FORMAT',\r\n 'Du skal benytte formatet dd/mm/yyyy. f.eks. 30/09/1990'\r\n )\r\n )\r\n\r\n $('#IkraftDato').on('blur', function () {\r\n // force date to be validated as soon as the person moves on\r\n // the date is validated on every keystroke, but that doesn't leave an error message if the date is incorrect. This event will\r\n if (this.value) {\r\n h.validateElement(this, 'ifws_date')\r\n }\r\n })\r\n\r\n enableTextInput(\r\n $('#IkraftDato'),\r\n app.root.activeProduct.ForsikredePerson,\r\n null,\r\n {\r\n validateOnBlur: true,\r\n validateImmediately: true,\r\n validation: function (s, actionSettings) {\r\n const value = s.getVal()\r\n if (isDateReadyforValidation(value)) {\r\n const _now = app.getBestDate()\r\n const _date = $.parseDate(value, null, app.culture)\r\n if (_date && _now && _date < _now) {\r\n const _msg = app.getFejlKodeText(\r\n 'CLIENT-HUS_IKRAFTDATO_FOR_TIDLIG',\r\n 'Den angivne dato ligger tilbage i tiden.'\r\n )\r\n s.topElement.ifws_isInvalid = true\r\n h.updateElementValidation(\r\n s.topElement,\r\n 'ifws_isInvalid',\r\n _msg,\r\n false\r\n )\r\n return false\r\n } else if (\r\n app.root.activeProduct.produktNavn === 'hus' ||\r\n app.root.activeProduct.produktNavn === 'cottage'\r\n ) {\r\n // added by pedkia\r\n const _husNow = _now\r\n _husNow.setMonth(_husNow.getMonth() + 17)\r\n if (_date && _husNow && _date > _husNow) {\r\n const mesg = app.getFejlKodeText(\r\n 'CLIENT-HUS_IKRAFTDATO_FOR_SEN',\r\n 'CLIENT-HUS_IKRAFTDATO_FOR_SEN'\r\n )\r\n s.topElement.ifws_isInvalid = true\r\n h.updateElementValidation(\r\n s.topElement,\r\n 'ifws_isInvalid',\r\n mesg,\r\n false\r\n )\r\n return false\r\n }\r\n }\r\n }\r\n s.topElement.ifws_isInvalid = false\r\n s.topElement.form.validator.clearElement(s.topElement) // reset validation info\r\n return true\r\n }\r\n }\r\n )\r\n }\r\n\r\n h.bindToActiveProduct('IkraftDatoSpm')\r\n h.bindToActiveProduct('IkraftDatoForelobig')\r\n h.bindToActiveProduct('opsigelseMaanedVedEj')\r\n\r\n if (app.root.activeProduct) {\r\n app.root.activeProduct.opsigelseMaanedVedEj.subscribe(function (newValue) {\r\n if (newValue) {\r\n $('#selectOpsigelsesMaaned option:first').attr('selected', 'selected')\r\n $('#selectOpsigelsesMaaned').change()\r\n app.root.activeProduct.OpsigelsesMaaned(0)\r\n app.root.activeProduct.IkraftDato(undefined)\r\n }\r\n\r\n // set the date on initial page load\r\n basic.setupOpsigelse.updateIkraftDato()\r\n })\r\n }\r\n\r\n enableSelect($('#selectOpsigelsesMaaned'), app.root.activeProduct, null, {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n for (let i = 0; i < 12; i++) {\r\n // get month\r\n let _month = $.cultures.da.calendar.months.names[i]\r\n // capitalize first letter\r\n _month = _month.charAt(0).toUpperCase() + _month.slice(1)\r\n // add to array\r\n $(element).append(\r\n $('')\r\n .text(_month)\r\n .val(i + 1)\r\n )\r\n }\r\n }\r\n })\r\n\r\n // check initial state\r\n if (app.root.activeProduct.opsigelseMaanedVedEj() !== false) {\r\n $('#selectOpsigelsesMaaned option:first').attr('selected', 'selected')\r\n $('#selectOpsigelsesMaaned').change()\r\n app.root.activeProduct.OpsigelsesMaaned(0)\r\n app.root.activeProduct.IkraftDato(undefined)\r\n }\r\n\r\n enableSelect($('#selectStartMaaned'), app.root.activeProduct, null, {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n for (let i = 0; i < 12; i++) {\r\n // get month\r\n let _month = $.cultures.da.calendar.months.names[i]\r\n // capitalize first letter\r\n _month = _month.charAt(0).toUpperCase() + _month.slice(1)\r\n // add to array\r\n $(element).append(\r\n $('')\r\n .text(_month)\r\n .val(i + 1)\r\n )\r\n }\r\n }\r\n })\r\n\r\n basic.setupOpsigelse.clearTidligareSelskabModel = function () {\r\n app.root.activeProduct.TidligereSelskab('')\r\n app.root.activeProduct.OpsigelseType('')\r\n app.root.activeProduct.StartDateType('')\r\n app.root.activeProduct.OpsigelsesMaaned(0)\r\n app.root.activeProduct.IkraftDato('')\r\n }\r\n\r\n basic.setupOpsigelse.updateIkraftDato = function () {\r\n try {\r\n const activeProduct = app.root.activeProduct\r\n if (\r\n activeProduct.isInit ||\r\n (!activeProduct.OpsigelseType() && !activeProduct.StartDateType())\r\n ) {\r\n return\r\n }\r\n const opsigelseTypeString = String(activeProduct.OpsigelseType())\r\n if (opsigelseTypeString === '3' /* EjerskifteHUS */) {\r\n // EjerskifteHUS\r\n activeProduct.IkraftDato('')\r\n const _elm = h.getElm('IkraftDato')\r\n _elm.ifws_isInvalid = false\r\n\r\n jElement.closest('form')[0].validator.clearElement(_elm) // remove errormessage if any\r\n } else {\r\n if (\r\n !activeProduct.OpsigelsesMaaned() &&\r\n !activeProduct.opsigelseMaanedVedEj() &&\r\n (opsigelseTypeString === '1' ||\r\n String(activeProduct.StartDateType()) === '2')\r\n ) {\r\n activeProduct.IkraftDato('')\r\n } else {\r\n const data = {\r\n OpsigelseType: activeProduct.OpsigelseType(),\r\n StartDateType: activeProduct.StartDateType(),\r\n OpsigelsesMaaned: activeProduct.OpsigelsesMaaned(),\r\n OpsigelseMaanedVedEj: activeProduct.opsigelseMaanedVedEj()\r\n }\r\n app.loadJson({\r\n url: 'tilbud/GetIkraftDato',\r\n data: JSON.stringify(data),\r\n cache: false,\r\n block: false,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n const product = app.root.activeProduct\r\n product.IkraftDato(h.getJSONDate(data))\r\n // kun hvis ulykke\r\n if (product.produktNavn === 'ulykke') {\r\n validateIkraftDato(\r\n product.ForsikredePerson().Foedselsdato(),\r\n h.getJSONStringDate(product.IkraftDato())\r\n )\r\n }\r\n }\r\n })\r\n }\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n}\r\n\r\nbasic.setupOpsigelseTypeDataChangeHandler = function () {\r\n $('#HarTidligereSelskabJa, #HarTidligereSelskabNej').on(\r\n 'change',\r\n basic.setupOpsigelse.clearTidligareSelskabModel\r\n )\r\n $(\r\n '#selectOpsigelsesMaaned, #selectStartMaaned, input[name=StartDateType]'\r\n ).on('evaluate', function () {\r\n basic.setupOpsigelse.updateIkraftDato()\r\n })\r\n $('input[data-id=\"OpsigelseType1\"]').on('change', function () { basic.setupOpsigelse.updateIkraftDato() })\r\n $('input[data-id=\"OpsigelseType2\"]').on('change', function () { basic.setupOpsigelse.updateIkraftDato() })\r\n}\r\n\r\nbasic.UpdateValidationUIIfNotValid = function (s, errorMessage, valid) {\r\n if (s && s.topElement) {\r\n s.isEntryValid = valid\r\n s.topElement.ifws_isInvalid = !valid\r\n h.updateElementValidation(\r\n s.topElement,\r\n 'ifws_isInvalid',\r\n errorMessage,\r\n valid\r\n )\r\n } else {\r\n console.log('Entered basic.UpdateValidationUIIfNotValid and s = ', s)\r\n }\r\n}\r\n\r\nbasic.GetCorrectAddressControlName = (prefix) => {\r\n if (!prefix) throw Error('Invalid role')\r\n return h.getSelectSelector('Address', prefix)\r\n}\r\n\r\nbasic.setupAddressAutocomplete = function (\r\n prefix,\r\n model,\r\n jElement,\r\n hide,\r\n disabled) {\r\n const _disabled = disabled\r\n if (h.getSelectElm('Address', prefix)) {\r\n ApplyAddresValidationRule(prefix)\r\n enableAddressAutocomplete(\r\n h.getSelectElmAsJqueryObject('Address', prefix),\r\n model,\r\n jElement,\r\n null,\r\n {\r\n user: prefix,\r\n cache: false,\r\n hide,\r\n disabled: _disabled,\r\n validateImmediately: false,\r\n validation: function (addressControl, actionSettings, actionName) {\r\n if (!addressControl.topElement) return true // meaning if we do not have a proper adress control reference here, its better to bail out early.\r\n if (addressControl.topElement.id != basic.GetCorrectAddressControlName(prefix)) return true // meaning we have a a timing issue, and the adresscontrol has defaulted to top form, we need to exit early if thats the case.\r\n\r\n if (ExitEarlyConditionsMet(addressControl, prefix)) return true // return an ok state\r\n if (FailureToSelect(addressControl, prefix)) return false // return an invalid state\r\n\r\n const urlToUse = `${window.ifws_shopHostUrl}api/dawa/adresser?adgangsadresseid=` + encodeURI(addressControl.getAddressId()) + '&q=' + addressControl.actionSettings.q + '&caretpos=' + addressControl.actionSettings.caretpos + '&type=' + addressControl.actionSettings.type + '&d=' + addressControl.actionSettings.d\r\n\r\n if (SelectedAddressCanBeUsedToTriggerDawaQuery(addressControl)) {\r\n app.loadJson({\r\n url: urlToUse,\r\n cache: false,\r\n async: false,\r\n contentType: '',\r\n externalUrl: true,\r\n type: 'get',\r\n allowCredentials: false,\r\n done: function (data, textStatus, jqXHR) {\r\n data = JSON.parse(data)\r\n ProcessDataReturnedByDawa(\r\n data,\r\n addressControl,\r\n prefix,\r\n app.root.Disv(),\r\n model).then((valid) => {\r\n valid = true\r\n actionSettings.onValid()\r\n if (window.app.wizard && window.app.root.activeProduct && window.app.root.activeProduct.PriceExists()) {\r\n window.app.root.activeProduct.beregn({\r\n done: function () {\r\n app.root.sync()\r\n }\r\n }\r\n )\r\n }\r\n // eslint-disable-next-line handle-callback-err\r\n }).catch(() => {\r\n const errorMessage = app.getFejlKodeText(\r\n 'CLIENT-Invalid_Address',\r\n 'Du kan desværre ikke beregne forsikring på den valgte adresse. Du er velkommen til at kontakte Webshop Service på tlf. nr. 70 12 12 53 for at høre nærmere.'\r\n )\r\n return ProcessErrorReturnedByDawa(addressControl, errorMessage)\r\n })\r\n },\r\n fail: function (response) {\r\n const errorMessage = app.getFejlKodeText(\r\n 'CLIENT-Invalid_Address',\r\n 'Du kan desværre ikke beregne forsikring på den valgte adresse. Du er velkommen til at kontakte Webshop Service på tlf. nr. 70 12 12 53 for at høre nærmere.'\r\n )\r\n return ProcessErrorReturnedByDawa(addressControl, errorMessage)\r\n }\r\n })\r\n }\r\n }\r\n })\r\n }\r\n}\r\n\r\nbasic.displayGenberegnPanel = function () {\r\n app.loadHtml({\r\n url: 'baseprodukt/GetSubView/GenberegnPanel',\r\n actionId: 'loadviewmessage',\r\n block: true,\r\n prio: 'first',\r\n targetElement: app.wizard.getCurrentWizardBodyJElement(),\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // view loaded - display it as message\r\n app.showMessage('', 'Der er genberegnet.', {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-VIDERE', 'Videre'),\r\n ok: function () { }\r\n })\r\n $(app).trigger('sectionLoaded', [\r\n 'displayGenberegnPanel',\r\n h.getSections(app.getTopJElm())\r\n ]) // event triggering pending view scripts\r\n }\r\n })\r\n}\r\n\r\nbasic.removeProduct = function (\r\n id,\r\n ignoreValidateAftale,\r\n actionSettings,\r\n removeFromWizzardStep1\r\n) {\r\n const _force = ignoreValidateAftale ? 'true' : 'false'\r\n // todo: due to survey page redirect on server side we can not use the done branch for propagating events,\r\n // if user presses remove, then event is triggered regardless of how the process went.\r\n h.publish(h.REMOVE_PRODUCT_BY_ID, { pageInfo: app.getGTMPageInfo(), productId: id })\r\n app.loadJson({\r\n element: this,\r\n actionSettings,\r\n url: 'tilbud/removeprodukt/' + id + '/' + _force,\r\n customInfo: id, // used to hold other inf to be used by any listener on request/response events like e.g. the trend tracker code\r\n block: true,\r\n allowCredentials: true,\r\n // targetElement: _targetElement,\r\n done: function (data, textStatus, jqXHR) {\r\n const loader = this\r\n if (this.response.Message) {\r\n // A message is send and it must be displayed as a question\r\n if (\r\n this.response.Message.TekstKode === 'TILBUD-MISTER_IFAFTALE_RABAT'\r\n ) {\r\n // only relevant if loosing the if-aftale discount\r\n app.showQuestion(this.response.Message.LangTekst, '', {\r\n okText: app.getHjaelpeKodeText('CLIENT-BUTTON-FORTSAET', 'Fortsæt'),\r\n ok: function () {\r\n loader.args.url = loader.args.url.replace('/false', '/true') // set validated = true, so the validation is not reapeated, and the action is forced\r\n loader.redo() // repeat the action\r\n },\r\n cancelText: app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-VIL_BEHOLDE_IFAFTALE',\r\n 'Nej tak, jeg vil gerne beholde If-aftale'\r\n ),\r\n cancel: function () {\r\n // do nothing\r\n }\r\n })\r\n return true // block displaying default tmessage\r\n } else {\r\n // force\r\n app.loadJson({\r\n element: this,\r\n actionSettings,\r\n url: 'tilbud/removeprodukt/' + id + '/true',\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n basic.cartOverviewRefresh(id)\r\n }\r\n })\r\n }\r\n } else {\r\n // no additional actions required, just perform the change\r\n basic.cartOverviewRefresh(id, removeFromWizzardStep1)\r\n }\r\n if (this.actionSettings && this.actionSettings.done) {\r\n this.actionSettings.done()\r\n }\r\n }\r\n })\r\n}\r\n\r\nbasic.updateCartPanelButton = function () {\r\n const _jButton = $('#wizardNavigation .ecmt-button span')\r\n if (h.isSingleResult(_jButton)) {\r\n $('#dws-kurvNavigering .ecmt-button span').text(_jButton.text())\r\n }\r\n}\r\n\r\n// advanced messages -------------------------------------------------------------------------------\r\nbasic.gotoFront = function () {\r\n basic.removeProduct(app.root.activeProduct.ProduktID(), true) // if this is the last product, the user will be send to the front automatically.\r\n}\r\n\r\nbasic.removefromCartAndContinue = function () {\r\n const pageX = app.page\r\n let removeFromWizzardStep1 = false\r\n\r\n if (pageX === 'produkt') {\r\n removeFromWizzardStep1 = true\r\n }\r\n\r\n const _actionSettings = {\r\n done: function () {\r\n return basic.gotoProduct('next')\r\n }\r\n }\r\n\r\n basic.removeProduct(\r\n app.root.activeProduct.ProduktID(),\r\n true,\r\n _actionSettings,\r\n removeFromWizzardStep1\r\n )\r\n}\r\n\r\nbasic.showContactPanel = function () {\r\n const _content = app.getHjaelpeKode('client-contact_panel')\r\n if (_content) {\r\n app.showMessage(\r\n _content.kort,\r\n _content.lang,\r\n { okText: app.getHjaelpeKodeText('CLIENT-BUTTON-LUK', 'Luk') },\r\n undefined,\r\n false\r\n )\r\n }\r\n}\r\n\r\nbasic.clearInlineMessage = function (jElement) {\r\n jElement.html('')\r\n}\r\n\r\nbasic.showInlineMessage = function (\r\n jElement,\r\n long,\r\n ignoreContact,\r\n includeCartAction,\r\n customButtonText,\r\n customButtonAction,\r\n customButton2Text,\r\n customButton2Action\r\n) {\r\n // first make sure it is empty\r\n basic.clearInlineMessage(jElement)\r\n\r\n // build elements\r\n const _jHtml = $(\r\n '
    '\r\n )\r\n const _jBody = $('
    ')\r\n const _jFooter = $('')\r\n _jHtml.append(_jBody)\r\n _jHtml.append(_jFooter)\r\n\r\n // add text\r\n _jBody.html(long)\r\n\r\n // add buttons\r\n if (!ignoreContact) {\r\n const _contactLabel = app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-KONTAKT_KUNDE_SERVICE',\r\n 'Kontakt kundeservice'\r\n )\r\n _jFooter.append(\r\n ''\r\n )\r\n }\r\n if (includeCartAction) {\r\n let text = ''\r\n\r\n text = app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-FJERN-FRA_INDKOEBSKURV',\r\n 'Fjern fra indkøbskurv'\r\n )\r\n _jFooter.append(\r\n ''\r\n )\r\n }\r\n if (customButtonText) {\r\n _jFooter.append(\r\n ''\r\n )\r\n }\r\n if (customButton2Text) {\r\n _jFooter.append(\r\n ''\r\n )\r\n }\r\n\r\n // display (Add to DOM)\r\n jElement.append(_jHtml)\r\n\r\n // apply click events after DOM is updated\r\n if (includeCartAction) {\r\n _jHtml.on(\r\n 'click',\r\n '.dws-msg-removefromCartAndContinue',\r\n basic.removeFromCartAndContinueEvaluate\r\n )\r\n }\r\n\r\n if (!ignoreContact) {\r\n _jHtml.on('click', '.dws-msg-showContactPanel', basic.showContactPanel)\r\n }\r\n if (customButtonText) {\r\n _jHtml.on('click', '.dws-msg-customButton', customButtonAction)\r\n }\r\n if (customButton2Text) {\r\n _jHtml.on('click', '.dws-msg-customButton2', customButton2Action)\r\n }\r\n jElement.show('fade', 800)\r\n}\r\n\r\nbasic.clearMessage = function (jElement) {\r\n jElement.html('')\r\n}\r\n\r\nbasic.showMessage = function (\r\n jElement,\r\n long\r\n) {\r\n // first make sure it is empty\r\n basic.clearMessage(jElement)\r\n\r\n // build elements\r\n const _jHtml = $(\r\n '
    '\r\n )\r\n const _jBody = $('
    ')\r\n const _jFooter = $('')\r\n _jHtml.append(_jBody)\r\n _jHtml.append(_jFooter)\r\n\r\n // add text\r\n _jBody.html(long)\r\n\r\n // display (Add to DOM)\r\n jElement.append(_jHtml)\r\n\r\n jElement.show('fade', 800)\r\n}\r\n\r\nbasic.removeFromCartAndContinueEvaluate = function () {\r\n basic.removefromCartAndContinue()\r\n}\r\n\r\nbasic.extractDynamicTextForPanel = function (txt) {\r\n if (txt.lang.substring(0, 1) === '@') {\r\n // this is a ref. to another dyn. text or view\r\n if (txt.lang.indexOf('/') === -1) {\r\n // this is not a view, byt dynamic text. load it immediately\r\n // use the content of the text as code (except the @)\r\n txt = app.getHjaelpeKode(txt.lang.substring(1))\r\n if (txt) txt = txt.lang\r\n } else {\r\n // the view will be loaded once the panels are rendered. This is to ensure that all the panels don't wait until the views are loaded too.\r\n if (txt) txt = txt.lang\r\n }\r\n } else {\r\n // this is not a ref\r\n txt = txt.lang\r\n }\r\n return txt\r\n}\r\n\r\nlet eglvchathandle = null\r\nfunction openHelpWS1 () {\r\n // setup chqact support (code basically copied from existing shop)\r\n try {\r\n if (eglvchathandle != null && !eglvchathandle.closed) {\r\n eglvchathandle.focus()\r\n return\r\n }\r\n } catch (err) { }\r\n let refererName = ''\r\n refererName = encodeURIComponent(refererName)\r\n let refererurl = encodeURIComponent(document.location.href)\r\n const hashIndex = refererurl.lastIndexOf('#')\r\n if (hashIndex !== -1) {\r\n refererurl = refererurl.substring(0, hashIndex)\r\n }\r\n const eglvcaseid = /eglvcaseid=[0-9]*/gi.exec(window.location.search)\r\n let vhtIds = ''\r\n if (typeof EGAINCLOUD !== 'undefined' && EGAINCLOUD.Account.getAllIds) {\r\n const ids = EGAINCLOUD.Account.getAllIds()\r\n vhtIds = '&aId=' + ids.a + '&sId=' + ids.s + '&uId=' + ids.u\r\n }\r\n let eGainChatUrl =\r\n 'https://ucce.if.dk/system/templates/chat/IF/chat.html?subActivity=Chat&entryPointId=1023&templateName=IF&languageCode=da&countryCode=DA&ver=v11&eglvrefname=' +\r\n refererName +\r\n '&' +\r\n eglvcaseid +\r\n vhtIds\r\n if ((eGainChatUrl + refererurl).length <= 2000) {\r\n eGainChatUrl += '&referer=' + refererurl\r\n }\r\n const params = 'height=623,width=419,resizable=yes,scrollbars=yes,toolbar=no'\r\n eglvchathandle = window.open(eGainChatUrl, '', params)\r\n}\r\n\r\nbasic.checkoutValidate = function (actionSettings) {\r\n // call validation of the current product, if you are in the initial steps which are product specific\r\n app.root.activeProduct.sync({\r\n done: function (data) {\r\n actionSettings.done()\r\n }\r\n })\r\n}\r\n\r\nbasic.beregnPris = {}\r\n\r\n// currently applies only to indbo\r\nbasic.showAddressInformationMessage = (message) => {\r\n const elm = h.getJElmByDataId('addressChangedMessage')\r\n if (elm) {\r\n elm.text(message)\r\n const elmGroup = $('#addressChangedMessageGroup')\r\n if (elmGroup) {\r\n elmGroup.show('fade', 400)\r\n }\r\n }\r\n}\r\n\r\n// currently applies only to indbo\r\nbasic.hideAddressInformationMessage = () => {\r\n const elm = h.getJElmByDataId('addressChangedMessage')\r\n if (elm) {\r\n h.getJElmByDataId('addressChangedMessage').text('')\r\n const elmGroup = $('#addressChangedMessageGroup')\r\n if (elmGroup) {\r\n elmGroup.hide('fade', 400)\r\n }\r\n }\r\n}\r\n\r\nbasic.showAgeMessage = (message, isValidationError) => {\r\n const elm = h.getJElmByDataId('text_alderMeddelelse')\r\n if (elm) {\r\n elm.text(message)\r\n const elmGroup = $('#alderMeddelelseGroup')\r\n if (elmGroup) {\r\n const elmToStyle = document.querySelector('#alderMeddelelseGroup > div > .dws-rowNote')\r\n if (elmToStyle && isValidationError) {\r\n $(elmToStyle).removeClass('ecmt-notification-error').addClass('ecmt-notification-error')\r\n }\r\n elmGroup.show()\r\n }\r\n }\r\n}\r\n\r\nbasic.hideAgeMessage = () => {\r\n const elm = h.getJElmByDataId('text_alderMeddelelse')\r\n if (elm) {\r\n elm.text('')\r\n }\r\n if ($('#alderMeddelelseGroup').length) {\r\n $('#alderMeddelelseGroup').hide()\r\n }\r\n}\r\n\r\nbasic.handleShowMessage = function (jElement, visible, message) {\r\n if (visible) {\r\n // show age validation and set button to invalid\r\n basic.showAgeMessage(message, true)\r\n if (jElement.find('.submitButton')) {\r\n h.disable(jElement.find('.submitButton'))\r\n }\r\n if ($('#wizardNavigation button', app.getTopJElm())) {\r\n h.disable($('#wizardNavigation button', app.getTopJElm()))\r\n }\r\n } else {\r\n // hide age validation and set button to valid\r\n basic.hideAgeMessage()\r\n if (jElement.find('.submitButton')) {\r\n h.enable(jElement.find('.submitButton'))\r\n }\r\n if ($('#wizardNavigation button', app.getTopJElm())) {\r\n h.enable($('#wizardNavigation button', app.getTopJElm()))\r\n }\r\n }\r\n}\r\n\r\n// todo: connect the texts to the appropriate textkeys instead.\r\nbasic.checkMinimumAgeValidationWhenCprFieldsDoNotExist = function (jElement) {\r\n const {\r\n Kunde,\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.root.Kunde().Alder() === '') return\r\n if (!app.root.DisableCustomerElements()) return\r\n\r\n // Cpr block is hidden add age checking\r\n if (Kunde().Alder() < 18 || Kunde().Alder() > 99) {\r\n const message = 'Du skal være mellem 18 år og 99 år for at købe en forsikring.'\r\n basic.handleShowMessage(jElement, true, message)\r\n } else {\r\n basic.handleShowMessage(jElement, false, '')\r\n }\r\n\r\n if (!$('#alderMeddelelseGroup').is(':hidden')) return\r\n if (Kunde().Alder() < 18) {\r\n basic.handleShowMessage(jElement, true, 'Du skal være mindst 18 år, da du også prøver at købe produkter der kræver du er 18 år.')\r\n } else {\r\n basic.handleShowMessage(jElement, false, '')\r\n }\r\n}\r\n\r\nbasic.notifyIfChangedAddress = function () {\r\n const {\r\n activeProduct,\r\n Kunde\r\n } = app.root\r\n\r\n let defaultMessage = ''\r\n defaultMessage = 'Vigtig information
    '\r\n defaultMessage += 'Den adresse, du har valgt, er ikke den samme, som den adresse hvor du er tilmeldt folkeregisteret.

    '\r\n defaultMessage += 'Du kan godt købe indboforsikring til en fremtidig adresse, men du skal være opmærksom på, at indboforsikringen altid vil starte på den adresse, hvor du er tilmeldt folkeregisteret på starttidspunktet.'\r\n\r\n const message = app.getFejlKodeText(\r\n 'CLIENT-addressChangedMessage',\r\n defaultMessage)\r\n\r\n // for now only supports indbo insurance\r\n if (activeProduct && activeProduct.produktNavn === 'familie' && Kunde && Kunde().Address() && activeProduct.Address()) {\r\n if (activeProduct.Address() !== Kunde().Address()) {\r\n basic.showAddressInformationMessage(message)\r\n } else {\r\n basic.hideAddressInformationMessage()\r\n }\r\n }\r\n}\r\n\r\nbasic.setProductSpecificEntryPageSubmitFunction = function (submitFunction) {\r\n basic.entryPageSubmit = submitFunction\r\n}\r\n\r\nbasic.beregnPris.submit = function () {\r\n if (basic.entryPageSubmit) {\r\n basic.entryPageSubmit()\r\n } else {\r\n console.log('could not find submit function')\r\n }\r\n}\r\n\r\nexport { basic, eglvchathandle, openHelpWS1 }\r\n","/* global $ */\r\n\r\nimport { app } from './dk-ifshop-application'\r\n\r\nexport function enableTabs (jElement, actionSettings) {\r\n jElement.find('.ecmt-tab-container').each(function () {\r\n // creates functionality for \"each\" group of tabs\r\n const self = this /* .ecmt-tab-container */\r\n self.actionSettings = actionSettings\r\n\r\n $(this)\r\n .find('li a')\r\n .click(function () {\r\n try {\r\n self.targetElement = $($(this).attr('href'))\r\n let data = ''\r\n if ($(this).attr('data-content-data')) {\r\n // read content data from data attrivute\r\n data = $(this).attr('data-content-data')\r\n }\r\n // request content using the url with data\r\n app.loadHtml({\r\n url: $(this).attr('data-content-url'),\r\n data,\r\n targetElement: self.targetElement,\r\n actionSettings,\r\n done: function (data, textStatus, jqXHR) {\r\n // write content\r\n\r\n // fix height and hide content\r\n // self.targetElement[0].style.height = self.targetElement[0].offsetHeight + 'px';\r\n\r\n // apply new content\r\n self.targetElement.html(data)\r\n\r\n // response received\r\n if (self.actionSettings.beforeRender) {\r\n // call custom actionSettings (if any)\r\n self.actionSettings.beforeRender(data)\r\n } else {\r\n $(app).trigger('sectionLoaded') // if custom method exists. this should be called in that\r\n }\r\n }\r\n })\r\n return true\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n })\r\n })\r\n}\r\n","/* global $ */\r\nimport { app } from '../dk-ifshop-application'\r\nimport {\r\n validateAtServer,\r\n ValidateBirthDateRelatedRulesForLiv,\r\n ValidateBirthDateRelatedRulesForUlykke,\r\n isPayerOfInsurance,\r\n setupCprValidationBasics,\r\n initialCprValidation,\r\n getCprFromInput,\r\n UpdateAge,\r\n getBirthDate,\r\n getCpr1FromInput,\r\n getCpr2FromInput\r\n} from './dk-ifshop-cpr-validation'\r\nimport { getAgeFromBirthDate } from './dk-ifshop-cpr'\r\n\r\nimport { validateAge, validateCpr1 } from './dk-ifshop-cpr-validation-functions'\r\nimport { enableTextInput } from '../dk-ifshop-controls-multi'\r\nimport { h } from '../dk-ifshop-helper'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\nimport { validateKnallert, setupKnallertAnvendelseValidation } from './../knallert/dk-ifshop-knallert-validation'\r\n\r\nexport const enableCPRValidationMedforsikret = function (jElement, role) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n const keyPressStartedInCpr1 = false\r\n\r\n const inputCpr1 = h.getElm('MedforsikretCpr1')\r\n const inputCpr2 = h.getElm('MedforsikretCpr2')\r\n const $inputCpr1 = $(inputCpr1)\r\n const $inputCpr2 = $(inputCpr2)\r\n\r\n setupCprValidationBasics(jElement,\r\n app.root.Medforsikret(),\r\n $inputCpr1,\r\n $inputCpr2,\r\n inputCpr1,\r\n inputCpr2,\r\n keyPressStartedInCpr1,\r\n PersonEntities.Medforsikret)\r\n\r\n const rule18 = (activeProduct.Alderstrin && activeProduct.Alderstrin() == 2) ||\r\n !activeProduct.Alderstrin\r\n\r\n initialCprValidation(inputCpr1, inputCpr2, app.root.Medforsikret(), rule18, PersonEntities.Medforsikret, role)\r\n\r\n const settings = getCprValidationSettingsForMedforsikret(jElement, role)\r\n\r\n enableTextInput($inputCpr1, app.root.Medforsikret(), null, settings)\r\n enableTextInput($inputCpr2, app.root.Medforsikret(), null, settings)\r\n\r\n setupKnallertAnvendelseValidation(app.root.Medforsikret(), 'medforsikret')\r\n}\r\n\r\nexport const getCprValidationSettingsForMedforsikret = (jElement, role) => {\r\n return {\r\n lastValidatedCpr: null,\r\n disableAutoBind: true,\r\n validateOnBlur: true,\r\n ignoreValidationOnKeyUp: false,\r\n validateImmediately: true,\r\n runValidationOnPageLoad: true,\r\n validation: (control, actionSettings, actionName) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const inputCpr1 = h.getElm('MedforsikretCpr1')\r\n const inputCpr2 = h.getElm('MedforsikretCpr2')\r\n const $inputCpr1 = $(inputCpr1)\r\n\r\n const cprToValidate = getCprFromInput(inputCpr1, inputCpr2)\r\n const cpr1ToValidate = getCpr1FromInput(inputCpr1)\r\n const cpr2ToValidate = getCpr2FromInput(inputCpr2)\r\n\r\n if (cpr1ToValidate.length === 6) {\r\n if (!validateCpr1(cpr1ToValidate, PersonEntities.Medforsikret)) {\r\n return false\r\n }\r\n }\r\n\r\n if (cpr1ToValidate.length !== 6 || cpr2ToValidate.length !== 4) {\r\n return true\r\n }\r\n\r\n const rule18 = (activeProduct.Alderstrin && activeProduct.Alderstrin() == 2) || !activeProduct.Alderstrin\r\n\r\n const birthDate = getBirthDate(PersonEntities.Medforsikret, null, true)\r\n\r\n if (!birthDate) {\r\n return false\r\n }\r\n\r\n const age = getAgeFromBirthDate(birthDate)\r\n\r\n UpdateAge(PersonEntities.Medforsikret, null, birthDate, age)\r\n\r\n if (!validateAge(app.root.Medforsikret(), rule18, PersonEntities.Medforsikret, role)) {\r\n return false\r\n }\r\n\r\n if (!validateKnallert(app.root.Medforsikret(), 'medforsikret')) {\r\n return false\r\n }\r\n\r\n // if validating cpr without a prefix the rule of thumb is its the customer we are validating\r\n const payerOfInsurance = isPayerOfInsurance(inputCpr1, cprToValidate)\r\n\r\n // not to be used for andenBegunstigede\r\n if (activeProduct.produktNavn.startsWith('liv')) {\r\n if (!ValidateBirthDateRelatedRulesForLiv(PersonEntities.Medforsikret, payerOfInsurance, true, birthDate, age)) {\r\n return false\r\n }\r\n }\r\n // not to be used for andenBegunstigede\r\n if (activeProduct.produktNavn.startsWith('ulykke')) {\r\n if (!ValidateBirthDateRelatedRulesForUlykke(PersonEntities.Medforsikret, payerOfInsurance, true, birthDate, age)) {\r\n return false\r\n }\r\n }\r\n\r\n validateAtServer(cprToValidate, role, $inputCpr1, inputCpr1, inputCpr2, actionSettings)\r\n\r\n if (jElement.find('#personligInfoMessage')) {\r\n jElement.find('#personligInfoMessage').html('')\r\n }\r\n }\r\n }\r\n}\r\n","/* global $ */\r\nimport { app } from '../dk-ifshop-application'\r\nimport {\r\n validateAtServer,\r\n ValidateBirthDateRelatedRulesForLiv,\r\n ValidateBirthDateRelatedRulesForUlykke,\r\n isPayerOfInsurance,\r\n setupCprValidationBasics,\r\n initialCprValidation,\r\n getCprFromInput,\r\n getCpr1FromInput,\r\n getCpr2FromInput,\r\n UpdateAge,\r\n getBirthDate\r\n} from './dk-ifshop-cpr-validation'\r\nimport { getAgeFromBirthDate } from './dk-ifshop-cpr'\r\nimport { validateAge, validateCpr1 } from './dk-ifshop-cpr-validation-functions'\r\nimport { enableTextInput } from '../dk-ifshop-controls-multi'\r\nimport { h } from '../dk-ifshop-helper'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nimport { validateKnallert, setupKnallertAnvendelseValidation } from './../knallert/dk-ifshop-knallert-validation'\r\n\r\nexport const enableCPRValidationKunde = function (jElement, role, pageLoadValidate) {\r\n const keyPressStartedInCpr1 = false\r\n\r\n const inputCpr1 = h.getElm('Cpr1')\r\n const inputCpr2 = h.getElm('Cpr2')\r\n const $inputCpr1 = $(inputCpr1)\r\n const $inputCpr2 = $(inputCpr2)\r\n\r\n setupCprValidationBasics(jElement,\r\n app.root.Kunde(),\r\n $inputCpr1,\r\n $inputCpr2,\r\n inputCpr1,\r\n inputCpr2,\r\n keyPressStartedInCpr1,\r\n '')\r\n\r\n const rule18 = true\r\n\r\n if (pageLoadValidate) {\r\n initialCprValidation(inputCpr1, inputCpr2, app.root.Kunde(), rule18, '', role)\r\n }\r\n\r\n const settings = getCprValidationSettingsForKunde(jElement, role, pageLoadValidate)\r\n\r\n enableTextInput($inputCpr1, app.root.Kunde(), null, settings)\r\n enableTextInput($inputCpr2, app.root.Kunde(), null, settings)\r\n\r\n setupKnallertAnvendelseValidation(app.root.Kunde(), '')\r\n}\r\n\r\nexport const getCprValidationSettingsForKunde = (jElement, role, pageLoadValidate) => {\r\n return {\r\n lastValidatedCpr: null,\r\n disableAutoBind: true, // TODO: change this and use h.bind or h.bindAll to make it easier to setup binding (see example from liv scripts)\r\n validateOnBlur: true,\r\n ignoreValidationOnKeyUp: false,\r\n validateImmediately: true,\r\n runValidationOnPageLoad: pageLoadValidate,\r\n validation: (control, actionSettings, actionName) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const inputCpr1 = h.getElm('Cpr1')\r\n const inputCpr2 = h.getElm('Cpr2')\r\n const $inputCpr1 = $(inputCpr1)\r\n\r\n const cprToValidate = getCprFromInput(inputCpr1, inputCpr2)\r\n const cpr1ToValidate = getCpr1FromInput(inputCpr1)\r\n const cpr2ToValidate = getCpr2FromInput(inputCpr2)\r\n\r\n if (cpr1ToValidate.length === 6) {\r\n if (!validateCpr1(cpr1ToValidate, PersonEntities.Kunde)) {\r\n return false\r\n }\r\n }\r\n\r\n if (cpr1ToValidate.length !== 6 || cpr2ToValidate.length !== 4) {\r\n return true\r\n }\r\n\r\n const rule18 = true\r\n const birthDate = getBirthDate(PersonEntities.Kunde, null, true)\r\n\r\n if (!birthDate) {\r\n return false\r\n }\r\n\r\n const age = getAgeFromBirthDate(birthDate)\r\n\r\n UpdateAge(PersonEntities.Kunde, null, birthDate, age)\r\n\r\n if (!validateAge(app.root.Kunde(), rule18, PersonEntities.Kunde, role)) {\r\n return false\r\n }\r\n\r\n if (!validateKnallert(app.root.Kunde(), '')) {\r\n return false\r\n }\r\n\r\n // if validating cpr without a prefix the rule of thumb is its the customer we are validating\r\n const payerOfInsurance = isPayerOfInsurance(inputCpr1, cprToValidate)\r\n\r\n if (activeProduct.produktNavn.startsWith('liv')) {\r\n if (!ValidateBirthDateRelatedRulesForLiv(PersonEntities.Kunde, payerOfInsurance, true, birthDate, age)) {\r\n return false\r\n }\r\n }\r\n\r\n if (activeProduct.produktNavn.startsWith('ulykke')) {\r\n if (!ValidateBirthDateRelatedRulesForUlykke(PersonEntities.Kunde, payerOfInsurance, true, birthDate, age)) {\r\n return false\r\n }\r\n }\r\n\r\n validateAtServer(cprToValidate, role, $inputCpr1, inputCpr1, inputCpr2, actionSettings)\r\n\r\n if (jElement.find('#personligInfoMessage')) {\r\n jElement.find('#personligInfoMessage').html('')\r\n }\r\n }\r\n }\r\n}\r\n","/* global */\r\n\r\nimport { ProcessDawaAddress } from './dk-ifshop-address-api-scripts'\r\nimport { ProcessDawaAddressForCustomer } from './dk-ifshop-customer-address-scripts'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\nimport { ProcessDawaAddressForCoinsured } from './dk-ifshop-coinsured-address-scripts.js'\r\n\r\nexport function ProcessDataReturnedByDawa (data, addressControl, prefix, pElm, model) {\r\n return new Promise((resolve, reject) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (!activeProduct) {\r\n reject(new Error('Error processing dawa data since there is no activeProduct.'))\r\n }\r\n\r\n if (data.adressebetegnelse.toLowerCase() != addressControl.getVal().toLowerCase()) {\r\n reject(new Error('Error processing dawa data since there is no entered address.'))\r\n }\r\n\r\n switch (prefix) {\r\n case PersonEntities.Kunde : {\r\n // means, we are strictly updating the customers adress\r\n if (model == null) {\r\n ProcessDawaAddressForCustomer(resolve, reject, data, pElm)\r\n } else {\r\n // update for and indbo\r\n if (model.produktNavn == 'familie' && activeProduct.produktNavn == 'familie') {\r\n ProcessDawaAddress(resolve, reject, data, prefix, addressControl, pElm, 'familie')\r\n } else {\r\n reject(new Error('Error processing dawa data for customer and indbo.'))\r\n }\r\n }\r\n break\r\n }\r\n case PersonEntities.ForsikredePerson : {\r\n const navn = model.produktNavn.toLowerCase()\r\n if (navn == 'ulykkeboern' ||\r\n navn == 'ulykke' ||\r\n navn == 'liv' ||\r\n navn == 'hus') {\r\n ProcessDawaAddress(resolve, reject, data, prefix, addressControl, pElm, navn)\r\n } else {\r\n reject(new Error('Error processing dawa data for insured person.'))\r\n }\r\n break\r\n }\r\n case PersonEntities.AndenForsikrede : {\r\n if (model && model.role == PersonEntities.ForsikredePerson) {\r\n ProcessDawaAddress(resolve, reject, data, prefix, addressControl, pElm, activeProduct.produktNavn)\r\n } else {\r\n reject(new Error('Error processing dawa data for the other insured person.'))\r\n }\r\n break\r\n }\r\n case PersonEntities.Medforsikret : {\r\n if (app.root.Medforsikret() && model.role == PersonEntities.Medforsikret) {\r\n ProcessDawaAddressForCoinsured(resolve, reject, data, pElm)\r\n } else {\r\n reject(new Error('Error processing dawa data for the coinsured person.'))\r\n }\r\n break\r\n }\r\n default: {\r\n reject(Error('Invalid role'))\r\n }\r\n }\r\n })\r\n}\r\n","/* global $ */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { CopyDawaDataToCoinsured } from './dk-ifshop-address-utility-scripts'\r\n\r\nexport const UpdateCoinsuredAddress = (data, recalculatePrice) => {\r\n return new Promise((resolve, reject) => {\r\n // make server side client customer object model is updated\r\n if (window.ifws_expectRecaptcha === 'true') {\r\n // eslint-disable-next-line no-prototype-builtins\r\n if (window.hasOwnProperty('grecaptcha')) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'pushupdatecoinsured' }).then(function (token) {\r\n // make sure client customer object model is updated\r\n CopyDawaDataToCoinsured(data)\r\n app.root.Medforsikret().PushUpdate(token, recalculatePrice).then(backendCustomerAddress => {\r\n resolve(backendCustomerAddress)\r\n }).catch(err => {\r\n reject(err)\r\n })\r\n })\r\n })\r\n } else {\r\n setTimeout(() => { app.root.Kunde().callPushUpdateAwaitGrecaptcha(recalculatePrice) }, 250)\r\n }\r\n } else {\r\n app.root.Medforsikret().PushUpdate('').then(d => {\r\n resolve(d)\r\n }).catch(error => {\r\n reject(error)\r\n })\r\n }\r\n })\r\n}\r\n\r\nexport const ProcessDawaAddressForCoinsured = (resolve, reject, data, recalculatePrice) => {\r\n CopyDawaDataToCoinsured(data)\r\n UpdateCoinsuredAddress(data, recalculatePrice).then(backendAddress => {\r\n resolve(backendAddress.Data)\r\n }).catch(error => {\r\n reject(error)\r\n })\r\n}\r\n","/* global */\r\nimport { app } from './dk-ifshop-application'\r\n\r\n// collection of helper functions (1 instance)\r\nfunction WebShopTextHelperFunctions () {\r\n this.getRadioButtonUnansweredErrorMessage = function () {\r\n return app.getFejlKodeText(\r\n 'CLIENT-RADIOBUTTON-NOT-SELECTED',\r\n 'Du skal vælge en af de viste svarmuligheder.'\r\n )\r\n }\r\n}\r\n\r\nconst TextHelper = new WebShopTextHelperFunctions()\r\n\r\nexport { TextHelper }\r\n","/* global $ ko */\r\nimport { Model } from './../dk-ifshop-model'\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { knallert } from './dk-ifshop-knallert-scripts'\r\n\r\nfunction KnallertProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n self.DMRModel = h.koMap(new DMRModel())\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'SearchRegNr' && value) {\r\n let regNr = value.toUpperCase()\r\n regNr = regNr.replace(' ', '')\r\n self.SearchRegNr(regNr)\r\n } else if (name === 'Maerke' && value) {\r\n self.DMRModel.Maerke(h.capitaliseFirstLetter(value))\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Daekning,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept, /* add more props here */\r\n DMRModel,\r\n UkendtRegNr,\r\n SearchRegNr,\r\n AllowManualRegistrationNumber,\r\n RegNrNotUsed,\r\n ManuallyEnteredVehicleData,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n Selvrisiko,\r\n CPState\r\n ) {\r\n self.isInit = true\r\n\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n\r\n self.DMRModel = self.koMap(DMRModel, self.DMRModel)\r\n self.SearchRegNr = self.koMap(SearchRegNr, self.SearchRegNr, '', 'SearchRegNr')\r\n self.UkendtRegNr = self.koMap(UkendtRegNr, self.UkendtRegNr, '', 'UkendtRegNr')\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n\r\n self.AllowManualRegistrationNumber = self.koMap(AllowManualRegistrationNumber, self.AllowManualRegistrationNumber, false, 'AllowManualRegistrationNumber')\r\n self.RegNrNotUsed = self.koMap(RegNrNotUsed, self.RegNrNotUsed, false, 'RegNrNotUsed')\r\n self.ManuallyEnteredVehicleData = self.koMap(ManuallyEnteredVehicleData, self.ManuallyEnteredVehicleData, false, 'ManuallyEnteredVehicleData')\r\n self.shouldShowAddedWizardNavigation = ko.computed(function () {\r\n return self.Daekning() && self.Daekning().Navn() === 'Kasko'\r\n })\r\n\r\n self.hasSearchRegNr = ko.computed(function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (activeProduct.SearchRegNr === undefined) {\r\n return false\r\n }\r\n if (activeProduct.SearchRegNr === null) {\r\n return false\r\n }\r\n if (activeProduct.SearchRegNr() === undefined) {\r\n return false\r\n }\r\n if (activeProduct.SearchRegNr() === null) {\r\n return false\r\n }\r\n if (activeProduct.SearchRegNr().length == 0) {\r\n return false\r\n }\r\n return true\r\n })\r\n\r\n self.allowManualRegistrationNumberComputed = ko.computed(function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n return activeProduct.AllowManualRegistrationNumber !== undefined && activeProduct.AllowManualRegistrationNumber()\r\n })\r\n\r\n self.regNrNotUsedComputed = ko.computed(function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n return activeProduct.RegNrNotUsed !== undefined && activeProduct.RegNrNotUsed()\r\n })\r\n\r\n self.shouldShowEditableRegNrInAdditionalInformation = ko.computed(function () {\r\n return self.DMRModel().AnvendelseInt() !== 1 && (self.regNrNotUsedComputed() || self.allowManualRegistrationNumberComputed())\r\n })\r\n\r\n self.shouldShowStelNrAndMaerkeInAdditionalInformation = ko.computed(function () {\r\n return self.allowManualRegistrationNumberComputed() || self.DMRModel().AnvendelseInt() === 1\r\n })\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '0', 'Selvrisiko')\r\n\r\n self.isInit = false\r\n }\r\n\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Daekning,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.UnderwritingAccept,\r\n val.DMRModel,\r\n val.UkendtRegNr,\r\n val.SearchRegNr,\r\n val.AllowManualRegistrationNumber,\r\n val.RegNrNotUsed,\r\n val.ManuallyEnteredVehicleData,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.Selvrisiko,\r\n val.CPState\r\n /* add more props here */\r\n )\r\n }\r\n }\r\n\r\n // todo: investigate if its correct to use searchRegNr\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n const _key =\r\n 'KNALLERT-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.DMRModel().Anvendelse() +\r\n '-' +\r\n self.SearchRegNr() +\r\n '-' +\r\n self.DMRModel().StelNr() +\r\n '-' +\r\n self.DMRModel().Maerke() +\r\n '-' +\r\n self.DMRModel().Model() +\r\n '-' +\r\n self.DMRModel().Aargang()\r\n return _key\r\n }\r\n\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode = (data) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (data !== undefined && data !== null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.DMRModel().RegNr(data.SearchRegNr)\r\n activeProduct.DMRModel().Anvendelse(data.DMRModel.Anvendelse)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n activeProduct.ManuallyEnteredVehicleData(data.ManuallyEnteredVehicleData)\r\n }\r\n }\r\n\r\n // update this product with a new model based on regnr (if found)\r\n self.setModel = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n try {\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-KNALLERT_REGNR_0'))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (code || '0'),\r\n produktId: (activeProduct.ProduktID() || '0'),\r\n allowInvalidRegNr: (activeProduct.AllowManualRegistrationNumber()),\r\n anvendelse: activeProduct.DMRModel().AnvendelseInt()\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelKnallert' }).then(function (token) {\r\n app.loadJson({\r\n allowCredentials: true,\r\n code,\r\n url: 'knallertprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n token,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n code,\r\n url: 'knallertprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.innerDone = function (data, jqXHR) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (data !== undefined && data != null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (!data.DMRModel || !data.DMRModel.Anvendelse || !data.DMRModel.Stelnr || !data.DMRModel.Maerke || !data.DMRModel.Model || data.DMRModel.RegNr !== this.args.code) {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n\r\n // we can not fade to details view if we have a manually entered registrationnumber\r\n if (!data.AllowManualRegistrationNumber) {\r\n h.fadeToForm($('#knallertHolder'), 'knallertprodukt/getsubview/detaljer')\r\n h.extendForm($('#knallertHolder'), 'knallertprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n\r\n self.resetDmrModel = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n try {\r\n const setModelInData = {\r\n produktId: (activeProduct.ProduktID() || '0')\r\n }\r\n\r\n app.loadJson({\r\n allowCredentials: true,\r\n code,\r\n url: 'knallertprodukt/resetdmrmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy',\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n },\r\n operationFail: function (data) {\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n function handleSetModelError (data) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n if (data.Message.TekstKode === 'CLIENT-KNALLERT-KAN_IKKE_FINDE_MODEL') {\r\n // todo: replace this with showing an error message that we can not lookup from dmr\r\n knallert.displayUkendtRegNrPanel()\r\n // return false // cancel default action\r\n return false\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n }\r\n\r\n // save setting how the user wants to enter car info\r\n self.brugerIkkeRegNr = function (viewModel, argsForHandler) {\r\n try {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n activeProduct.RegNrNotUsed(true)\r\n activeProduct.sync({\r\n done: function () {\r\n app.gotoShopPage()\r\n }\r\n })\r\n } else {\r\n activeProduct.SearchRegNr(undefined)\r\n activeProduct.DMRModel().RegNr(undefined)\r\n activeProduct.RegNrNotUsed(true)\r\n\r\n // display info panel\r\n h.fadeToForm($('#knallertHolder'), 'knallertprodukt/getsubview/knallertinfo')\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n}\r\n\r\nfunction DMRModel () {\r\n const self = this\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'Model') {\r\n self.Model($.trim(value))\r\n } else if (name === 'RegNr' && value) {\r\n self.RegNr(value.toUpperCase())\r\n knallert.updateStepOneHeader(knallert.validateRegNr(value))\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (data) {\r\n const val = data || {}\r\n self.Anvendelse = self.koMap(val.Anvendelse, self.Anvendelse, 0, 'Anvendelse')\r\n self.RegNr = self.koMap(val.RegNr, self.RegNr, null, 'RegNr')\r\n self.StelNr = self.koMap(val.StelNr, self.StelNr, null, 'StelNr')\r\n self.Maerke = self.koMap(val.Maerke, self.Maerke, null, 'Maerke')\r\n self.Model = self.koMap(val.Model, self.Model, null, 'Model')\r\n self.Aargang = self.koMap(val.Aargang, self.Aargang, null, 'Aargang')\r\n }\r\n self.init()\r\n\r\n // computed observables\r\n self.Details = ko.computed(function () {\r\n return self.Maerke() + ' ' + self.Model() + ' - ' + self.RegNr()\r\n })\r\n\r\n // computed observables\r\n self.AnvendelseInt = ko.computed(function () {\r\n return parseInt(self.Anvendelse())\r\n })\r\n\r\n // SAVE\r\n self.save = function (actionSettings) {\r\n app.loadJson({\r\n url: 'knallertprodukt/savemodel',\r\n data:\r\n '{\"data\" : ' +\r\n ko.toJSON(self, function (key, value) {\r\n if (key === 'LogoImagePath') {\r\n return undefined\r\n } else {\r\n return value\r\n }\r\n }) +\r\n '}',\r\n block: true,\r\n actionSettings\r\n })\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n self.init(val)\r\n }\r\n}\r\n\r\nexport { DMRModel, KnallertProdukt }\r\n","/* global $ ko */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { enableTextInput, enableSelect } from './../dk-ifshop-controls-multi'\r\nimport {\r\n enableToolTips,\r\n enableInputEvaluation,\r\n initPlaceholders,\r\n PendingInputs\r\n} from './../dk-ifshop-controls'\r\nimport { KnallertProdukt } from './dk-ifshop-knallert-produkt-model'\r\nimport { dkRecaptcha } from '../security/recaptcha'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\n\r\nconst knallert = {} // namespace\r\n\r\nknallert.beregnPris = function (jElement) {\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(knallert.beregnPris.submit)\r\n}\r\n\r\nknallert.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n knallert.quickForm.submit()\r\n } else {\r\n app.wizard.goFwd()\r\n }\r\n}\r\n\r\nknallert.beregnPrisWithValidate = function (jElement) {\r\n basic.setProductSpecificEntryPageSubmitFunction(knallert.beregnPris.submit)\r\n\r\n const {\r\n activeProduct\r\n } = app.root\r\n if ($('#RegNr').valid()) {\r\n knallert.beregnPris(jElement)\r\n activeProduct.validateOnServer({\r\n entryFail: function (data) {\r\n if (\r\n data &&\r\n data.Message &&\r\n data.Message.TekstKode === 'CLIENT-KNALLERT-KAN_IKKE_FINDE_MODEL'\r\n ) {\r\n // todo : replace this with a message that the regnumber does not exist in dmr.\r\n knallert.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n return true\r\n }\r\n })\r\n }\r\n}\r\n\r\nknallert.ukendtRegNrPanelAction = false\r\n\r\nknallert.handleCheckoutManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n activeProduct.sync({\r\n allowCredentials: true,\r\n done: function () {\r\n // move on\r\n h.fadeToForm(\r\n $('#supplerendeInfoHolder'),\r\n 'knallertprodukt/getsubview/supplerende'\r\n )\r\n\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n }\r\n })\r\n}\r\n\r\nknallert.handleProductManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.RegNrNotUsed(false)\r\n knallert.updateModel()\r\n h.fadeToForm($('#knallertHolder'), 'knallertprodukt/getsubview/knallertinfo')\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n activeProduct.sync()\r\n}\r\n\r\nknallert.InvalidButManuallyAcceptedNumberPlateValidation = function (value) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n activeProduct.AllowManualRegistrationNumber(true)\r\n // add the searched regnr as the selected regnr\r\n activeProduct.DMRModel().RegNr(activeProduct.SearchRegNr())\r\n activeProduct.UkendtRegNr(true)\r\n\r\n if (activeProduct.DMRModel().RegNr()) {\r\n const anvendelse = knallert.validateRegNr(activeProduct.DMRModel().RegNr())\r\n knallert.updateSelectedKnallertType(anvendelse)\r\n }\r\n\r\n if (app.page === 'checkout') {\r\n knallert.handleCheckoutManual()\r\n } else {\r\n knallert.handleProductManual()\r\n }\r\n return true\r\n}\r\n\r\nknallert.InvalidNumberPlateValidation = function (value) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n h.getElm('RegNr').form.validator.clearElement(h.getElm('RegNr')) // reset validation info\r\n basic.clearInlineMessage($('#regNrMsg'))\r\n basic.clearMessage($('#regNrMsgInfo'))\r\n // set the option to undefined as we dont want to save this answer anywhere.\r\n activeProduct.UkendtRegNr(undefined)\r\n activeProduct.SearchRegNr(undefined)\r\n\r\n return true\r\n}\r\n\r\nknallert.validateRegistrationNumber = function () {\r\n app.setPendingUserAction('ukendtRegNr')\r\n if ($('input[name=UkendtRegNr]')[0].checked) {\r\n knallert.InvalidNumberPlateValidation()\r\n } else if ($('input[name=UkendtRegNr]')[1].checked) {\r\n knallert.InvalidButManuallyAcceptedNumberPlateValidation()\r\n }\r\n knallert.ukendtRegNrPanelAction = false\r\n app.resetPendingUserAction('ukendtRegNr')\r\n}\r\n\r\nknallert.ukendtRegNrPanelInfo = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n activeProduct.AllowManualRegistrationNumber(false)\r\n if ($('#RegNr').valid()) {\r\n knallert.ukendtRegNrPanelAction = true\r\n\r\n activeProduct.DMRModel().RegNr(undefined)\r\n // we have to reset active dmr objects properties here to show relevant data, user will enter this in next stage\r\n activeProduct.DMRModel().Maerke('')\r\n activeProduct.DMRModel().Model('')\r\n activeProduct.DMRModel().StelNr('')\r\n\r\n knallert.updateWizardSubtextFromDMRModel()\r\n\r\n activeProduct.UkendtRegNr(undefined)\r\n\r\n activeProduct.resetDmrModel()\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('ukendtRegNrPanel'))\r\n\r\n $('input[name=UkendtRegNr]').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true\r\n })\r\n $('input[name=UkendtRegNr]')[0].ifws_customValidation = knallert.validateRegistrationNumber\r\n // make sure the choices are validated immediately, so they work as buttons\r\n $('input[name=UkendtRegNr]').on('change', function () {\r\n h.validateElement(this, 'ifws_isInvalid')\r\n return false // we remove the entire panel incl. this radio button, therefore the default action should be stopped, otherwise we would receive an error\r\n })\r\n // update the text on the last radiobutton to include the regnr at the end\r\n const jUkendtTrue = $('label[for=UkendtRegNrtrue]')\r\n jUkendtTrue.text(jUkendtTrue.text() + ' ' + app.root.activeProduct.SearchRegNr())\r\n } else {\r\n // if ukendtregnrpanel, hide\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n }\r\n}\r\n\r\nknallert.regNrSetupBtx = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n }\r\n })\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n enableTextInput($('#RegNr'), app.root.activeProduct, null, {\r\n validateOnBlur: true,\r\n ignoreValidationOnKeyUp: true,\r\n validation: function (s, actionSettings) {\r\n if ($('#RegNr').valid()) {\r\n $('#RegNrDetails').show()\r\n if (knallert.ukendtRegNrPanelAction) {\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n }\r\n } else {\r\n // CLEAR possible non relevant messages\r\n $('#regNrMsg').html('')\r\n $('#regNrMsgInfo').html('')\r\n // we have entered a nonvalid regnr, we can not persist dmr model properties\r\n }\r\n\r\n if (app.page !== 'front') {\r\n knallert.updateModel(actionSettings)\r\n }\r\n }\r\n })\r\n\r\n // avoids autosubmit in IE, when there is only a single input control in the form\r\n jForm.on('keydown', '#RegNr', function (e) {\r\n if (e.keyCode === '32' || e.keyCode === 32) {\r\n e.preventDefault()\r\n }\r\n\r\n if (e.keyCode === '13' || e.keyCode === 13) {\r\n e.preventDefault()\r\n $('#RegNr').valid()\r\n }\r\n })\r\n}\r\n\r\nknallert.GetYearList = function () {\r\n const listDate = []\r\n let year = 2006\r\n const endyear = 1950\r\n\r\n while (year >= endyear) {\r\n listDate.push(year)\r\n year--\r\n }\r\n return listDate\r\n}\r\n\r\nknallert.daekningsTilpasningsPanel = function (jElement) {\r\n const activeProduct = app.root.activeProduct\r\n const $Aargang = $('#Aargang')\r\n if ($Aargang.length) {\r\n const jForm = $('#daekningsTilpasningsPanel')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate()\r\n\r\n $Aargang.rules('add', {\r\n ifws_isInvalid: true,\r\n ifws_selected: true,\r\n messages: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-INVALID-AGE-FOR-KASKO_KNALLERT',\r\n 'Du kan desværre ikke vælge kasko til en knallert som er 35 år eller ældre.'\r\n )\r\n }\r\n })\r\n jForm[0].validator = validator\r\n $Aargang.empty()\r\n const items = knallert.GetYearList()\r\n enableSelect($Aargang, activeProduct, undefined, {\r\n disableAutoBind: true,\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n $.each(items, function (index, item) {\r\n // get values\r\n const val = item\r\n const txt = item\r\n\r\n // add as option\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(val)\r\n )\r\n })\r\n },\r\n onSelect: function (element, e) {\r\n let index = e.currentTarget.selectedIndex\r\n if (index > 0) index--\r\n const selectedYear = items[index]\r\n activeProduct.DMRModel().Aargang(selectedYear)\r\n }\r\n })\r\n $Aargang.on('change', function () {\r\n const selectedYear = activeProduct.DMRModel().Aargang()\r\n const currentYear = parseInt(new Date().getFullYear())\r\n this.ifws_isInvalid = (currentYear - selectedYear) >= 35\r\n h.validateElement(this, 'ifws_isInvalid')\r\n })\r\n }\r\n basic.daekningsTilpasningsPanelBasics(jElement)\r\n}\r\n\r\nknallert.quickForm = function (jElement) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n jElement.on('click', '.imageButton', function () {\r\n $('.imageButton').removeClass('selected')\r\n $(this).addClass('selected')\r\n jElement.find('.submitButton')[0].disabled = false\r\n })\r\n\r\n enableToolTips(jElement)\r\n enableInputEvaluation(jElement)\r\n\r\n // set up binding for brugerIkkeRegNr, TODO, move binding handling\r\n ko.applyBindings(app.root.activeProduct, h.getElm('brugerIkkeRegNrKnallert'))\r\n\r\n if (h.getElm('RegNr')) {\r\n // bind to model\r\n knallert.regNrSetupBtx(jElement)\r\n if (app.page !== 'front') {\r\n initializeKnallertRegNrInfoElementValidation(true, true)\r\n }\r\n }\r\n // start over with new regnr, so we don't know if it is unknown or not\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n\r\n knallert.knallertRegNrSubscription = activeProduct.DMRModel().RegNr.subscribe(function (newValue) {\r\n if (newValue) {\r\n const intAnvendelse = knallert.validateRegNr(newValue)\r\n knallert.updateStepOneHeader(intAnvendelse)\r\n }\r\n })\r\n\r\n const jForm = $('#quickForm')\r\n quickformSubmitSetup.setup(jForm, knallert.quickForm.submit)\r\n}\r\n\r\nknallert.updateStepOneHeader = function (intAnvendelse) {\r\n if (app.page === 'produkt') {\r\n // setting default option\r\n let arg = '{ \"id\" : \"STEP-Knallert-1\" }'\r\n if (intAnvendelse) {\r\n if (intAnvendelse === 1) {\r\n arg = '{ \"id\" : \"STEP-Knallert-1-uden\" }'\r\n } else if (intAnvendelse === 2) {\r\n arg = '{ \"id\" : \"STEP-Knallert-1-med\" }'\r\n } else if (intAnvendelse === 3) {\r\n arg = '{ \"id\" : \"STEP-Knallert-1-EU\" }'\r\n }\r\n }\r\n // reset header, but get text form server, cause it isn't a \"CLIENT-...\" code\r\n app.loadJson({\r\n url: 'shop/HjaelpeTekst',\r\n data: arg,\r\n block: false,\r\n allowCredentials: true,\r\n done: function (data) {\r\n if (data && data.LangTekst) {\r\n document.getElementById('STEP-knallert-1').textContent = data.LangTekst\r\n }\r\n }\r\n })\r\n }\r\n}\r\n\r\nknallert.updateSelectedKnallertType = function (intAnvendelse) {\r\n if (intAnvendelse) {\r\n if (intAnvendelse === 2 || intAnvendelse === 3) {\r\n app.root.activeProduct.DMRModel().Anvendelse(intAnvendelse)\r\n app.root.activeProduct.sync()\r\n }\r\n }\r\n}\r\n\r\nknallert.quickForm.submit = function (jElement) {\r\n if ($('#RegNr').valid()) {\r\n knallert.updateModel()\r\n }\r\n}\r\n\r\nknallert.updateModel = function (actionSettings) {\r\n knallert.setModelData(actionSettings)\r\n}\r\n\r\nknallert.setModelData = function (actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const regNrValue = h.getElm('RegNr').value\r\n const regNrElement = $(h.getElm('RegNr'))\r\n if (regNrElement.valid()) {\r\n // called from all three places where a regnr can be edited (quickform, step1 and step3)\r\n if (!app.wizard || app.page === 'produkt') {\r\n activeProduct.setModel(regNrValue, regNrElement, actionSettings)\r\n } else if (app.page === 'checkout') {\r\n knallert.updateRegNr(regNrValue, regNrElement, actionSettings)\r\n }\r\n } else {\r\n if (actionSettings) {\r\n actionSettings.onInvalid()\r\n }\r\n }\r\n}\r\n\r\nknallert.quickForm.syncProduct = function () {\r\n app.root.activeProduct.sync({\r\n allowCredentials: true,\r\n done: function () {\r\n if (app.page === 'front') {\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else if (app.wizard && app.wizard.currentStepNo == 1) {\r\n // shop\r\n app.loadPage('produkt')\r\n }\r\n },\r\n entryFail: function () {\r\n if (app.page === 'front') {\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const initializeKnallertMaerkeInfoElementValidation = () => {\r\n const element = h.getElm('Maerke')\r\n $(element).rules('add', {\r\n required: true,\r\n ifws_isInvalid: true\r\n })\r\n}\r\n\r\nexport const initializeKnallertRegNrInfoElementValidation = () => {\r\n const element = h.getElm('RegNr')\r\n const invalidRegNrMessage = {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-KNALLERT_REGNR_IKKE_VALID',\r\n 'Nummerplade ikke valid'\r\n )\r\n }\r\n\r\n $(element).rules('add', {\r\n required: true,\r\n ifws_isInvalid: true,\r\n messages: invalidRegNrMessage\r\n })\r\n // setup validation function\r\n if (element) {\r\n $(element).on('evaluate', function () {\r\n h.validateElement(element, 'ifws_isInvalid')\r\n })\r\n element.ifws_customValidation = function (value) {\r\n return knallert.validateRegNr($(this).val())\r\n }\r\n }\r\n}\r\n\r\nexport const initializeKnallertStelNrInfoElementValidation = () => {\r\n const element = h.getElm('StelNr')\r\n const message = {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-KNALLERT_STELNR_IKKE_VALID',\r\n 'Stelnummer ikke valid'\r\n )\r\n }\r\n $(element).rules('add', {\r\n required: true,\r\n ifws_isInvalid: true,\r\n messages: message\r\n })\r\n // setup validation function\r\n if (element) {\r\n $(element).on('evaluate', function () {\r\n h.validateElement(element, 'ifws_isInvalid')\r\n })\r\n element.ifws_customValidation = function (value) {\r\n return knallert.erStelNrValid($(this).val())\r\n }\r\n }\r\n}\r\n\r\nknallert.knallertInfo = function (jElement) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n ko.applyBindings(app.root.activeProduct, jElement[0])\r\n enableToolTips(jElement)\r\n\r\n // validation rules\r\n const jForm = $('#knallertInfo')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate({\r\n rules: {\r\n Anvendelse: {\r\n required: true\r\n }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n\r\n if (knallert.knallertAnvendelseSubscription) {\r\n knallert.knallertAnvendelseSubscription.dispose()\r\n }\r\n\r\n knallert.knallertAnvendelseSubscription = activeProduct.DMRModel().Anvendelse.subscribe(function (newValue) {\r\n knallert.updateStepOneHeader(parseInt(newValue))\r\n // we will wait with the product sync until customer presses goForward\r\n activeProduct.sync()\r\n })\r\n}\r\n\r\nknallert.updateWizardSubtextFromDMRModel = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n const wizardStepCurrent = app.getTopJElm().find('.wizardStepCurrent')\r\n wizardStepCurrent.find('.stepSubTitle').text(activeProduct.DMRModel().Details())\r\n}\r\n\r\nknallert.SupplerendeManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (activeProduct.shouldShowStelNrAndMaerkeInAdditionalInformation) {\r\n ko.applyBindings(app.root.activeProduct.DMRModel(), document.getElementById('Maerke'))\r\n initializeKnallertMaerkeInfoElementValidation()\r\n\r\n ko.applyBindings(app.root.activeProduct.DMRModel(), document.getElementById('StelNr'))\r\n initializeKnallertStelNrInfoElementValidation(true, true)\r\n }\r\n}\r\n\r\nknallert.initializeRegNr = function (jElement) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (activeProduct.shouldShowEditableRegNrInAdditionalInformation()) {\r\n knallert.regNrSetupBtx(jElement)\r\n initializeKnallertRegNrInfoElementValidation(true, true)\r\n }\r\n}\r\n\r\nknallert.supplerendeInfoKnallert = function (jElement, productId) {\r\n app.root.ensureActiveProduct(productId, function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n h.bindNodesToActiveProduct('KnallertModelInformation')\r\n if (activeProduct.UkendtRegNr() === '' && activeProduct.RegNrNotUsed() === true && activeProduct.ManuallyEnteredVehicleData()) {\r\n activeProduct.SearchRegNr(undefined)\r\n activeProduct.sync()\r\n }\r\n\r\n knallert.initializeRegNr(jElement)\r\n\r\n knallert.SupplerendeManual()\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n h.selectNextEntry(jElement)\r\n\r\n knallert.updateWizardSubtextFromDMRModel()\r\n\r\n if (knallert.knallertMaerkeSubscription) {\r\n knallert.knallertMaerkeSubscription.dispose()\r\n }\r\n if (knallert.knallertRegNrSubscription) {\r\n knallert.knallertRegNrSubscription.dispose()\r\n }\r\n // todo: where are we actually unsubscribing\r\n knallert.knallertMaerkeSubscription = activeProduct.DMRModel().Maerke.subscribe(function (newValue) {\r\n knallert.updateWizardSubtextFromDMRModel()\r\n })\r\n\r\n knallert.knallertRegNrSubscription = activeProduct.DMRModel().RegNr.subscribe(function (newValue) {\r\n knallert.updateWizardSubtextFromDMRModel()\r\n })\r\n enableToolTips(jElement)\r\n })\r\n}\r\n\r\nknallert.detaljer = function (jElement) {\r\n h.bindNodesToActiveProduct('KnallertDetailsInformation')\r\n $('#vaelgAndenKnallert').on('click', function () {\r\n h.fadeToForm($('#knallertHolder'), 'knallertprodukt/getsubview/knallertinfo')\r\n })\r\n\r\n knallert.setupVaelgAndenKnallertButton()\r\n // display button after it was hidden earlier\r\n $('.dws-navigationSection .theme-bg-blue').show('fade', 300)\r\n}\r\n\r\nknallert.setupVaelgAndenKnallertButton = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n h\r\n .getJElmByDataId('vaelgAndenKnallert')\r\n .parent()\r\n .on('click', function () {\r\n activeProduct.DMRModel().RegNr('')\r\n activeProduct.DMRModel().Model('')\r\n activeProduct.DMRModel().Maerke('')\r\n activeProduct.DMRModel().StelNr('')\r\n\r\n if (activeProduct.RegNrNotUsed()) {\r\n h.fadeToForm($('#knallertHolder'), 'knallertprodukt/getsubview/knallertinfo')\r\n } else {\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n h.fadeToForm($('#knallertHolder'), 'baseprodukt/quickform/knallert')\r\n }\r\n app.root.activeProduct.Daekning().Navn('') // Force a reselection of default daekning\r\n })\r\n}\r\n\r\n// RegNr -----------------------------------------------------------------------\r\nknallert.validateRegNr = function (regNr) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n const patternKnallert = /[ABCDEFGHJKLMNOPRSTUVWXYZ]{2}[0-9]{4}$/i\r\n const patternEuKnallert = /[ABCDEFGHJKLMNOPRSTUVWXYZ]{2}[0-9]{3}$/i\r\n // ikke I, Q, Æ, Ø, Å\r\n\r\n if (activeProduct.DMRModel().AnvendelseInt() === 1) {\r\n return 1\r\n } else if (knallert.MatchRegExForKnallert(regNr, patternKnallert, 2)) {\r\n return 2\r\n } else if (knallert.MatchRegExForKnallert(regNr, patternEuKnallert, 3)) {\r\n return 3\r\n }\r\n return false\r\n}\r\n\r\nknallert.MatchRegExForKnallert = function (regNr, regexPattern, patternUsage) {\r\n if (app.page === 'produkt') {\r\n return Boolean(regNr.match(regexPattern))\r\n } else {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const currentUsage = activeProduct.DMRModel().AnvendelseInt()\r\n const isUnknownOrPatternUsage = currentUsage === 0 || currentUsage === patternUsage\r\n\r\n if (isUnknownOrPatternUsage && regNr.match(regexPattern)) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n// // StelNr -------------------------------------------------------------------------------------\r\nknallert.erStelNrValid = function (stelNr) {\r\n /// /Stelnummer kun indeholde danske bokstager og tal, dog ikke i, o, æ, ø, å\r\n const pattern = /^[abcdefghjklmnpqrstuvwxyz0-9]+$/i\r\n\r\n if (stelNr.match(pattern)) {\r\n return stelNr\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nknallert.acceptNewPrice = function (actionSettings) {\r\n app.root.activeProduct.AllowManualRegistrationNumber(false)\r\n app.root.activeProduct.setModel(\r\n newModelRegNr,\r\n app.wizard.getCurrentWizardBodyJElement(),\r\n actionSettings\r\n )\r\n}\r\n\r\nconst KnallertHasChanged = (UpdatedKnallertModel) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (UpdatedKnallertModel.Daekning().NettoPraemieTotal() !== activeProduct.Daekning().NettoPraemieTotal()) {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nknallert.displayUkendtRegNrPanel = function () {\r\n // display message\r\n app.loadHtml({\r\n allowCredentials: true,\r\n url: 'knallertprodukt/getsubview/ukendtregnrpanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n app.loadHtml({\r\n allowCredentials: true,\r\n url: 'knallertprodukt/getsubview/ukendtregnrpanelinfo',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data2, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage($('#regNrMsg'), data, true)\r\n\r\n basic.showMessage($('#regNrMsgInfo'), data2, true)\r\n\r\n // bind pricepanel to the model\r\n $(app).trigger('sectionLoaded', ['displayUkendtRegNrPanel', h.getSections(this.targetElement)])\r\n }\r\n })\r\n }\r\n })\r\n}\r\n\r\nconst handleNewPricePanelBinding = (panelName, updatedKnallertModel) => {\r\n if (h.getElm(panelName) !== null) {\r\n // bind pricepanel to the model\r\n ko.applyBindings(\r\n updatedKnallertModel,\r\n h.getElm(panelName)\r\n )\r\n }\r\n}\r\n\r\nconst ShowNewKnallertMessage = (UpdatedKnallertModel) => {\r\n // display message\r\n app.loadHtml({\r\n url: 'knallertprodukt/getsubview/nyprispanel',\r\n allowCredentials: true,\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n basic.showInlineMessage(\r\n $('#regNrMsg', '', true),\r\n data,\r\n true,\r\n true,\r\n app.getHjaelpeKodeText(\r\n 'CLIENT-BUTTON-FORTSAET_MED_NY_PRIS',\r\n 'Fortsæt med ny pris'\r\n ),\r\n function () {\r\n app.resetPendingUserAction()\r\n app.root.activeProduct.SearchRegNr(knallert.updateRegNr.alt.DMRModel().RegNr())\r\n\r\n knallert.acceptNewPrice(knallert.updateRegNr.actionSettings)\r\n\r\n basic.clearInlineMessage($('#regNrMsg', '', true))\r\n basic.clearMessage($('#regNrMsgInfo', '', true))\r\n\r\n $('#regNrMsg', '', true).hide('fade', 800)\r\n $('#regNrMsgInfo', '', true).hide('fade', 800)\r\n\r\n $('#RegNrDetails').show()\r\n\r\n return false\r\n }\r\n )\r\n\r\n handleNewPricePanelBinding('nyPrisPanelegNrGroup', UpdatedKnallertModel)\r\n handleNewPricePanelBinding('nyPrisPanelNyPrisGroup', UpdatedKnallertModel)\r\n handleNewPricePanelBinding('nyPrisPanelGammelPrisGroup', app.root.activeProduct)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n}\r\n\r\nconst createActionSettings = (activeProduct) => {\r\n return {\r\n allowCredentials: true,\r\n done: function () {\r\n // reset flag\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n // move on\r\n h.fadeToForm(\r\n $('#supplerendeInfoHolder'),\r\n 'knallertprodukt/getsubview/supplerende'\r\n )\r\n\r\n // execute validation from control (if any)\r\n if (\r\n knallert.updateRegNr.actionSettings2 &&\r\n knallert.updateRegNr.actionSettings2.onValid\r\n ) {\r\n knallert.updateRegNr.actionSettings2.onValid()\r\n }\r\n activeProduct.sync(\r\n {\r\n allowCredentials: true,\r\n done: function () {\r\n // update total fields to reflect the new totals\r\n basic.updateTotalFields()\r\n knallert.updateWizardSubtextFromDMRModel()\r\n }\r\n },\r\n true\r\n )\r\n }\r\n }\r\n}\r\n\r\nconst GetModelFailure = (incomingActionSettings, data, targetElement) => {\r\n // execute validation from control (if any), data\r\n if (incomingActionSettings && incomingActionSettings.onInvalid) {\r\n incomingActionSettings.onInvalid()\r\n }\r\n\r\n // error, maybe the regnr wasnt found\r\n if (data && data.Message && data.Message.TekstKode === 'CLIENT-KNALLERT-KAN_IKKE_FINDE_MODEL') {\r\n if ($('#RegNr').valid()) {\r\n // todo : replace this with a message that the regnumber does not exist in dmr.\r\n knallert.displayUkendtRegNrPanel()\r\n }\r\n return false // cancel default action\r\n }\r\n targetElement[0].ifws_isInvalid = true\r\n app.onEntryFail(data)\r\n}\r\n\r\nlet newModelRegNr = ''\r\nknallert.updateRegNr = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n try {\r\n newModelRegNr = h.getElm('RegNr').value\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-KNALLERT_REGNR_0'))\r\n return\r\n }\r\n\r\n // create a new actionsettings object\r\n knallert.updateRegNr.actionSettings = createActionSettings(activeProduct)\r\n\r\n // set actionSettings2 to the incoming actionSettings object, the incoming\r\n // the incoming actionSettings object will be used in the newly created actionSettings object\r\n knallert.updateRegNr.actionSettings2 = actionSettings\r\n\r\n app.setPendingUserAction('newPriceAwaitingApproval')\r\n const getModelInData = {\r\n code: (code || '0'),\r\n allowInvalidRegNr: activeProduct.AllowManualRegistrationNumber(),\r\n anvendelse: activeProduct.DMRModel().AnvendelseInt()\r\n }\r\n\r\n // try to find the model\r\n app.loadJson({\r\n url: 'knallertprodukt/getmodel',\r\n allowCredentials: true,\r\n data: JSON.stringify(getModelInData),\r\n targetElement: jElement,\r\n block: true,\r\n done: function (data, textStatus, jqXHR) {\r\n if (knallert.updateRegNr.actionSettings2 && knallert.updateRegNr.actionSettings2.onValid) {\r\n knallert.updateRegNr.actionSettings2.onValid()\r\n }\r\n\r\n // a new product is received\r\n if (data && data.DMRModel && data.DMRModel.StelNr) {\r\n // create a model of the new product so it can be bound to the view\r\n knallert.updateRegNr.alt = new KnallertProdukt()\r\n knallert.updateRegNr.alt.update(data)\r\n\r\n if (!KnallertHasChanged(knallert.updateRegNr.alt)) {\r\n app.resetPendingUserAction()\r\n\r\n // display vehicle engine label\r\n $('#RegNrDetails').show()\r\n\r\n // remove potential nyprispanel\r\n basic.clearInlineMessage($('#regNrMsg', '', true))\r\n basic.clearMessage($('#regNrMsgInfo', '', true))\r\n\r\n $('#regNrMsg', '', true).hide('fade', 800)\r\n $('#regNrMsgInfo', '', true).hide('fade', 800)\r\n\r\n // accept price\r\n knallert.acceptNewPrice(knallert.updateRegNr.actionSettings)\r\n } else {\r\n // hide RegNrDetails, when we show the newPricePanel, since it does not match the\r\n // newly entered regnr, it is a match to the previous regnr, and we have not yet changed the activeProduct model.\r\n $('#RegNrDetails').hide()\r\n\r\n // show the nyprispanel\r\n ShowNewKnallertMessage(knallert.updateRegNr.alt)\r\n }\r\n } else {\r\n if ($('#RegNr').valid()) {\r\n // Copy basic data\r\n app.root.activeProduct.UpdateModelWithBasicInformationForManualLicensePlateMode(data)\r\n // todo : replace this with a message that the regnumber does not exist in dmr.\r\n // show the ukendt regnr panel\r\n knallert.displayUkendtRegNrPanel()\r\n }\r\n }\r\n },\r\n entryFail: function (data) {\r\n // handle the getmodel failure\r\n GetModelFailure(knallert.updateRegNr.actionSettings2, data, this.targetElement)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\nexport { knallert, newModelRegNr }\r\n","/* global $ */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { displayError, hideErrors } from './../cpr/dk-ifshop-cpr-multicontrol-config'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { validateAge } from './../cpr/dk-ifshop-cpr-validation-functions'\r\n\r\nexport const validateKnallert = (person, prefix) => {\r\n // todo: consider passing references from outside\r\n const inputCpr1 = h.getElm(prefix + 'Cpr1')\r\n const inputCpr2 = h.getElm(prefix + 'Cpr2')\r\n\r\n if (app.root.onlyMopedInShoppingCart()) {\r\n const mopedErrorMessage = getErrorMessageForMopedAgeValidation(person, prefix)\r\n if (mopedErrorMessage) {\r\n return displayError(inputCpr1, inputCpr2, mopedErrorMessage, 'Du skal være mindst 15 år', prefix)\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport const getErrorMessageForMopedAgeValidation = (person, prefix) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n const {\r\n DMRModel\r\n } = activeProduct\r\n\r\n const knallertAnvendelseEnum = {\r\n UNKNOWN: 0,\r\n KNALLERT: 1,\r\n KNALLERT_REGNR: 2,\r\n KNALLERT_EU: 3\r\n }\r\n\r\n const alder = person.Alder()\r\n\r\n // be an exact match due to anvendelse has type int. Thats the reason for the code below.\r\n const anvendelseInt = DMRModel().AnvendelseInt()\r\n if (anvendelseInt === knallertAnvendelseEnum.UNKNOWN || anvendelseInt === knallertAnvendelseEnum.KNALLERT || anvendelseInt === knallertAnvendelseEnum.KNALLERT_REGNR) {\r\n if (alder < 15) {\r\n return 'CLIENT-' + prefix + 'UNDER_15'\r\n }\r\n return undefined\r\n }\r\n\r\n if (anvendelseInt === knallertAnvendelseEnum.KNALLERT_EU) {\r\n if (alder < 18) {\r\n return 'CLIENT-' + prefix + 'UNDER_18'\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n return 'CLIENT-' + prefix + 'UNDER_15'\r\n}\r\n\r\nexport const setupKnallertAnvendelseValidation = (person, prefix) => {\r\n $(document).on('change', '[name=\"Anvendelse\"]', function () {\r\n if (person.Alder() && validateAge(person) && validateKnallert(person, prefix)) {\r\n hideErrors([$('#Cpr1')[0], $('#Cpr2')[0]])\r\n }\r\n })\r\n}\r\n","import { app } from '../dk-ifshop-application'\r\nconst typeOfInsuredPerson = {\r\n INSUREDPERSON: {\r\n NONE: 0,\r\n YOURSELF: 1,\r\n COHABITANT: 2,\r\n BUSINESSPARTNER: 3,\r\n OTHER: 4\r\n }\r\n} // namespace\r\n\r\nexport const birthDateIsInTheFutureErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_FOEDSELSDATO_FOR_TIDLIG',\r\n 'Den angivne fødselsdato ligger fremme i tiden.'\r\n )\r\n}\r\nexport const cprForSamleverIsTheSameAsCustomerErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_CPR_IS_THE_SAME_FOR_CUSTOMER_AND_SPOUSE',\r\n 'Cpr-nummeret på den forsikrede, må ikke være det samme som på den person, der køber forsikringen.'\r\n )\r\n}\r\nexport const customerIsYoungerThanEighteenAndOlderThan49ErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_SELV_UNDER_18_ELLER_OVER_50',\r\n 'Du skal være mellem 18 år og 49 år for at købe en Livsforsikring.')\r\n}\r\n\r\nexport const forsikredeIsYoungerThanEighteenErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_ANDEN_UNDER_18',\r\n 'Du kan ikke forsikre en anden under 18 år'\r\n )\r\n}\r\nexport const forsikredeIsOlderThan50ErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_ANDEN_OVER_50',\r\n 'Du kan ikke forsikre en anden over 50 år'\r\n )\r\n}\r\n\r\nexport const customerIsOlderThan50ErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_SELV_OVER_50',\r\n 'Du kan ikke købe en Livsforsikring hvis du er over 50 år gammel'\r\n )\r\n}\r\n\r\nexport const customerAgeIsEqualToFortyNineErrorMessage = (_birthDate, age) => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-LIV_SELV_KRAV_OM_HELBREDSOPLYSNINGER_49',\r\n 'Køb af den tilbudte forsikring er betinget af at vi har modtaget helbredsoplysninger inden du fylder 50.'\r\n )\r\n}\r\n\r\nexport const forsikredeAgeIsEqualToFortyNineErrorMessage = (_birthDate, age) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n // if (insuringEqualToFortyNineAndInsuringOther(_birthDate, age)) {\r\n const insuredPerson = activeProduct.InsuredPerson()\r\n let textCode = ''\r\n switch (insuredPerson) {\r\n case typeOfInsuredPerson.INSUREDPERSON.COHABITANT:\r\n textCode = 'CLIENT-LIV_COHABITANT_KRAV_OM_HELBREDSOPLYSNINGER_49'\r\n break\r\n case typeOfInsuredPerson.INSUREDPERSON.BUSINESSPARTNER:\r\n textCode = 'CLIENT-LIV_BUSINESSPARTNER_KRAV_OM_HELBREDSOPLYSNINGER_49'\r\n break\r\n case typeOfInsuredPerson.INSUREDPERSON.OTHER:\r\n textCode = 'CLIENT-LIV_OTHER_KRAV_OM_HELBREDSOPLYSNINGER_49'\r\n break\r\n }\r\n return app.getFejlKodeText(\r\n textCode,\r\n 'Køb af den tilbudte forsikring er betinget af at vi har modtaget helbredsoplysninger inden personen fylder 50.'\r\n )\r\n}\r\n","import { app } from '../dk-ifshop-application'\r\n\r\nimport {\r\n birthDateIsInTheFutureErrorMessage,\r\n customerIsYoungerThanEighteenAndOlderThan49ErrorMessage,\r\n forsikredeIsYoungerThanEighteenErrorMessage,\r\n forsikredeIsOlderThan50ErrorMessage,\r\n customerIsOlderThan50ErrorMessage,\r\n customerAgeIsEqualToFortyNineErrorMessage,\r\n forsikredeAgeIsEqualToFortyNineErrorMessage,\r\n cprForSamleverIsTheSameAsCustomerErrorMessage\r\n} from './dk-ifshop-liv-validation-messages'\r\n\r\nexport const getInfoMessage = (payerOfInsurance) => {\r\n if (!payerOfInsurance) {\r\n return forsikredeAgeIsEqualToFortyNineErrorMessage()\r\n } else {\r\n return customerAgeIsEqualToFortyNineErrorMessage()\r\n }\r\n}\r\n\r\nexport const InfoState = (birthDate, age, activeProductAndenForsikrede, payerOfInsurance) => {\r\n if (!payerOfInsurance) {\r\n return insuringEqualToFortyNineAndInsuringOther(birthDate, age, activeProductAndenForsikrede)\r\n } else {\r\n return insuringEqualToFortyNineAndIsCustomer(birthDate, age, activeProductAndenForsikrede)\r\n }\r\n}\r\n\r\nexport const ValidStateCustomer = (birthDate, age, now, activeProductAndenForsikrede) => {\r\n return !insuringYourselfUnderAgeOfEighteen(birthDate, age, activeProductAndenForsikrede) &&\r\n !insuringCustomerOverOrEqualAgeFifty(birthDate, age, now, activeProductAndenForsikrede)\r\n}\r\n\r\nexport const ValidStateBeneficiary = (birthDate, age, now, activeProductAndenForsikrede) => {\r\n return !insuringAnotherPersonUnderAgeEighteen(birthDate, age, now, activeProductAndenForsikrede) &&\r\n !insuringAnotherPersonOverOrEqualAgeFifty(birthDate, age, now, activeProductAndenForsikrede)\r\n}\r\n\r\n// todo: investigate what happens if AndenForsikrede has a default value\r\nexport const ValidState = (prefix, payerOfInsurance, birthDate, age, now, activeProductAndenForsikrede) => {\r\n // general validation\r\n if (birtDateIsInTheFuture(birthDate, now)) {\r\n return false\r\n }\r\n if (payerOfInsurance) {\r\n return ValidStateCustomer(birthDate, age, now, activeProductAndenForsikrede)\r\n } else {\r\n return ValidStateBeneficiary(birthDate, age, now, activeProductAndenForsikrede)\r\n }\r\n}\r\n\r\nexport const GetErrorMessageForCustomer = (birthDate, age, activeProductAndenForsikrede) => {\r\n const now = app.getBestDate()\r\n\r\n if (birtDateIsInTheFuture(birthDate, now)) {\r\n return birthDateIsInTheFutureErrorMessage()\r\n }\r\n\r\n if (insuringYourselfUnderAgeOfEighteen(birthDate, age, now, activeProductAndenForsikrede)) {\r\n return customerIsYoungerThanEighteenAndOlderThan49ErrorMessage()\r\n }\r\n\r\n if (insuringCustomerOverOrEqualAgeFifty(birthDate, age, now, activeProductAndenForsikrede)) {\r\n return customerIsOlderThan50ErrorMessage()\r\n }\r\n return ''\r\n}\r\n\r\nexport const GetErrorMessageForForsikrede = (birthDate, age, activeProductSamlever, activeProductAldersTrin, page) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const now = app.getBestDate()\r\n\r\n if (activeProductSamlever) {\r\n if (app.root.Kunde().CprNr() === activeProduct.ForsikredePerson().CprNr()) {\r\n return cprForSamleverIsTheSameAsCustomerErrorMessage()\r\n }\r\n }\r\n\r\n if (birtDateIsInTheFuture(birthDate, now)) {\r\n return birthDateIsInTheFutureErrorMessage()\r\n }\r\n if (insuringAnotherPersonUnderAgeEighteen(birthDate, age, now, activeProduct.AndenForsikrede())) {\r\n return forsikredeIsYoungerThanEighteenErrorMessage()\r\n }\r\n if (insuringAnotherPersonOverOrEqualAgeFifty(birthDate, age, now, activeProduct.AndenForsikrede())) {\r\n return forsikredeIsOlderThan50ErrorMessage()\r\n }\r\n return ''\r\n}\r\n\r\nconst birtDateIsInTheFuture = (_birthDate, _now) => {\r\n return _birthDate && _now && _birthDate > _now\r\n}\r\n\r\nconst insuringUnderAgeEighteen = (_birthDate, age) => {\r\n return _birthDate && age < 18\r\n}\r\n\r\nconst insuringYourselfUnderAgeOfEighteen = (_birthDate, age, activeProductAndenForsikrede) => {\r\n return !activeProductAndenForsikrede && insuringUnderAgeEighteen(_birthDate, age)\r\n}\r\n\r\nconst insuringAnotherPersonUnderAgeEighteen = (_birthDate, age, _now, activeProductAndenForsikrede) => {\r\n return activeProductAndenForsikrede === true && insuringUnderAgeEighteen(_birthDate, age)\r\n}\r\n\r\nconst insuringOverOrEqualAgeFifty = (_birthDate, age) => {\r\n return _birthDate && age >= 50\r\n}\r\n\r\nconst insuringCustomerOverOrEqualAgeFifty = (_birthDate, age, _now, activeProductAndenForsikrede) => {\r\n return insuringOverOrEqualAgeFifty(_birthDate, age) && !activeProductAndenForsikrede\r\n}\r\n\r\nconst insuringAnotherPersonOverOrEqualAgeFifty = (_birthDate, age, _now, activeProductAndenForsikrede) => {\r\n return insuringOverOrEqualAgeFifty(_birthDate, age) && activeProductAndenForsikrede == true\r\n}\r\n\r\nconst insuringEqualToFortyNine = (_birthDate, age) => {\r\n return _birthDate && age == 49\r\n}\r\n\r\nconst insuringEqualToFortyNineAndInsuringOther = (_birthDate, age, activeProductAndenForsikrede) => {\r\n return insuringEqualToFortyNine(_birthDate, age) && activeProductAndenForsikrede == true\r\n}\r\nconst insuringEqualToFortyNineAndIsCustomer = (_birthDate, age, activeProductAndenForsikrede) => {\r\n return insuringEqualToFortyNine(_birthDate, age) && !activeProductAndenForsikrede\r\n}\r\n","/* global $ ko */\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { Model } from './../dk-ifshop-model'\r\nimport { ifwsMotorcykel } from './dk-ifshop-motorcykel-scripts'\r\n\r\nfunction MotorcykelProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.Model = h.koMap(new MotorcykelModel())\r\n\r\n // VED TEST\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'SearchRegNr' && value) {\r\n let regNr = value.toUpperCase()\r\n regNr = regNr.replace(' ', '')\r\n self.SearchRegNr(regNr)\r\n } else if (name === 'MotorCykelHandelsVaerdi') {\r\n if ($.isNumeric(value)) {\r\n property($.parseInt(value, 'N', app.culture))\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n Model,\r\n Selvrisiko,\r\n Daekning,\r\n MusikSum,\r\n BagageboxSum,\r\n AndetSum,\r\n MotorCykelHandelsVaerdi,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n ErMotorcyklenLeaset,\r\n StelNrMotorcykel,\r\n UkendtRegNr,\r\n SearchRegNr,\r\n AllowManualRegistrationNumber,\r\n RegNrNotUsed,\r\n ManuallyEnteredVehicleData,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n ) {\r\n self.isInit = true\r\n\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n undefined,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '', 'Selvrisiko')\r\n\r\n self.Model = self.koMap(Model, self.Model)\r\n\r\n self.MusikSum = self.koMap(MusikSum, self.MusikSum)\r\n self.BagageboxSum = self.koMap(BagageboxSum, self.BagageboxSum)\r\n self.AndetSum = self.koMap(AndetSum, self.AndetSum)\r\n\r\n self.MotorCykelHandelsVaerdi = self.koMap(MotorCykelHandelsVaerdi, self.MotorCykelHandelsVaerdi, '', 'MotorCykelHandelsVaerdi', true)\r\n self.ErMotorcyklenLeaset = self.koMap(ErMotorcyklenLeaset, self.ErMotorcyklenLeaset)\r\n self.StelNrMotorcykel = self.koMap(StelNrMotorcykel, self.StelNrMotorcykel)\r\n\r\n self.SearchRegNr = self.koMap(SearchRegNr, self.SearchRegNr)\r\n self.UkendtRegNr = self.koMap(UkendtRegNr, self.UkendtRegNr, '', 'UkendtRegNr')\r\n\r\n self.AllowManualRegistrationNumber = self.koMap(AllowManualRegistrationNumber, self.AllowManualRegistrationNumber, false, 'AllowManualRegistrationNumber')\r\n self.RegNrNotUsed = self.koMap(RegNrNotUsed, self.RegNrNotUsed, false, 'RegNrNotUsed')\r\n self.ManuallyEnteredVehicleData = self.koMap(ManuallyEnteredVehicleData, self.ManuallyEnteredVehicleData, false, 'ManuallyEnteredVehicleData')\r\n\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(app.root.activeProduct),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo(),\r\n PaymentPeriod: app.root.PaymentInterval(),\r\n PaymentProvider: app.root.PaymentProvider()\r\n }\r\n })\r\n\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.Model,\r\n val.Selvrisiko,\r\n val.Daekning,\r\n val.MusikSum,\r\n val.BagageboxSum,\r\n val.AndetSum,\r\n val.MotorCykelHandelsVaerdi,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.ErMotorcyklenLeaset,\r\n val.StelNrMotorcykel,\r\n val.UkendtRegNr,\r\n val.SearchRegNr,\r\n val.AllowManualRegistrationNumber,\r\n val.RegNrNotUsed,\r\n val.ManuallyEnteredVehicleData,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.SelectedDaekningId,\r\n val.CPState\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n let _key =\r\n 'MOTORCYKEL-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n self.Model().MakeNumber() +\r\n '-' +\r\n app.root.Kunde().Alder() +\r\n '-' +\r\n self.Selvrisiko() +\r\n '-' +\r\n app.root.NumberOfClaimsCarAndMc()\r\n\r\n _key = _key + '-0-0-0-0'\r\n\r\n if (app.root.Kunde().CprNr()) {\r\n _key = _key + '-' + app.root.Kunde().CprNr()\r\n } else {\r\n // defined used kvhx code if we know the address and not the cpr no. (only found on server)\r\n _key = _key + '-' +\r\n app.root.Kunde().Postnr() +\r\n '-' +\r\n app.root.Kunde().Gade() +\r\n '-' +\r\n app.root.Kunde().Husnr() +\r\n '-' +\r\n app.root.Kunde().Etage() +\r\n '-' +\r\n app.root.Kunde().SideDoerNr()\r\n }\r\n return _key\r\n }\r\n\r\n self.unknownRegistrationNumber = function () {\r\n // when the user clicks the 'Kender ikke regnr'\r\n try {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n activeProduct.RegNrNotUsed(true)\r\n activeProduct.sync({\r\n done: function () {\r\n app.gotoShopPage()\r\n }\r\n })\r\n } else {\r\n activeProduct.SearchRegNr(undefined)\r\n activeProduct.RegNrNotUsed(true)\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n }\r\n })\r\n\r\n h.fadeToForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/motorcykelInfo')\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.setModel = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n try {\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-KNALLERT_REGNR_0'))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (code || '0'),\r\n produktId: (activeProduct.ProduktID() || '0'),\r\n allowInvalidRegNr: (activeProduct.AllowManualRegistrationNumber())\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelMC' }).then(function (token) {\r\n app.loadJson({\r\n code,\r\n url: 'motorcykelprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n token,\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy',\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n code,\r\n url: 'motorcykelprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy',\r\n prio: 'first',\r\n block: true,\r\n allowCredentials: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.innerDone = function (data, jqXHR) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (data !== undefined && data != null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage()\r\n } else {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n\r\n // we can not fade to details view if we have a manually entered registrationnumber\r\n if (!data.AllowManualRegistrationNumber) {\r\n h.fadeToForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/detaljer')\r\n h.extendForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n\r\n function handleSetModelError (data) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n if (data.Message.TekstKode === 'CLIENT-MOTORCYKEL-KAN_IKKE_FINDE_MODEL') {\r\n ifwsMotorcykel.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n } else if (data.Message.TekstKode === 'MOTORCYKEL_FYMC') {\r\n const message = app.getFejlKode('CLIENT-MOTORCYKEL_FYMC').lang\r\n app.showErrorMessage(message)\r\n return false\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n }\r\n\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode = (data) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (data !== undefined && data !== null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n activeProduct.ManuallyEnteredVehicleData(data.ManuallyEnteredVehicleData)\r\n }\r\n }\r\n}\r\n\r\nfunction MotorcykelModel () {\r\n const self = this\r\n self.base = new Model()\r\n self.base.inherit(self)\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n if (actionSettings) {\r\n if (actionSettings.done) {\r\n actionSettings.done()\r\n }\r\n }\r\n $(self).trigger('validated')\r\n }\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'Model') {\r\n self.Model($.trim(value))\r\n } else if (name === 'RegNrMotorcykel' && value) {\r\n self.RegNrMotorcykel(value.toUpperCase())\r\n }\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n regNrMotorcykel,\r\n make,\r\n model,\r\n variant,\r\n year,\r\n price,\r\n makeNumber,\r\n isMaerkeForsikring,\r\n hasMaerkeFordele,\r\n vehicleGroup,\r\n ccm\r\n ) {\r\n self.MakeNumber = self.koMap(makeNumber, self.MakeNumber, null, 'MakeNumber')\r\n self.Make = self.koMap(make, self.Make, null, 'Make')\r\n self.Model = self.koMap(model, self.Model, null, 'Model')\r\n self.Variant = self.koMap(variant, self.Variant, null, 'Variant')\r\n self.RegNrMotorcykel = self.koMap(regNrMotorcykel, self.RegNrMotorcykel, null, 'RegNrMotorcykel')\r\n self.Year = self.koMap((year === 0) ? '' : year, self.Year, null, 'Year')\r\n self.Price = self.koMap(price, self.Price, 0, 'Price')\r\n self.IsMaerkeForsikring = self.koMap(isMaerkeForsikring, self.IsMaerkeForsikring, false, 'IsMaerkeForsikring')\r\n self.HasMaerkeFordele = self.koMap(hasMaerkeFordele, self.HasMaerkeFordele, 0, 'PriceHasMaerkeFordele')\r\n self.VehicleGroup = self.koMap(vehicleGroup, self.VehicleGroup, 0, 'VehicleGroup')\r\n self.Ccm = self.koMap(ccm, self.Ccm, 0, 'Ccm')\r\n }\r\n\r\n self.init()\r\n\r\n // computed observables\r\n self.LogoImagePath = ko.computed(function () {\r\n let root = ''\r\n if (app.mode && app.mode.indexOf('ext') > -1) {\r\n root = app.shopHostUrl\r\n } else {\r\n root = '/'\r\n }\r\n\r\n const make = self.Make() || ''\r\n if (make === '0' || make === '') {\r\n return root + 'styling/img/webshop/shopflow/icon_motorcykel.png'\r\n } else {\r\n let fileName = make.trim()\r\n if (fileName) {\r\n if (fileName.indexOf(' ') > -1) {\r\n fileName = fileName.replace(' ', '_')\r\n }\r\n if (fileName.indexOf('-') > -1) {\r\n fileName = fileName.replace('-', '_')\r\n }\r\n return (\r\n root +\r\n 'styling/img/webshop/shopflow/motorcykellogo/' +\r\n fileName +\r\n '.png'\r\n )\r\n }\r\n return ''\r\n }\r\n }, self)\r\n\r\n // SAVE\r\n self.save = function (actionSettings) {\r\n app.loadJson({\r\n url: 'motorcykelprodukt/savemodel',\r\n data:\r\n '{\"data\" : ' +\r\n ko.toJSON(self, function (key, value) {\r\n if (key === 'LogoImagePath') {\r\n return undefined\r\n } else {\r\n return value\r\n }\r\n }) +\r\n '}',\r\n block: true,\r\n actionSettings,\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n // SYNC\r\n self.sync = function (actionSettings) {\r\n app.loadJson({\r\n url: 'motorcykelprodukt/syncmodel',\r\n done: function (data, textStatus, jqXHR) {\r\n self.update(data)\r\n },\r\n actionSettings,\r\n allowCredentials: true\r\n })\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.RegNrMotorcykel,\r\n val.Make,\r\n val.Model,\r\n val.Variant,\r\n val.Year,\r\n val.Price,\r\n val.MakeNumber,\r\n val.IsMaerkeForsikring,\r\n val.HasMaerkeFordele,\r\n val.VehicleGroup,\r\n val.Ccm\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport { MotorcykelModel, MotorcykelProdukt }\r\n","/* global $ ko */\r\n\r\nimport { app } from './../dk-ifshop-application'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { PendingInputs, enableToolTips } from './../dk-ifshop-controls'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\nconst bindMotorCykelHandelsVaerdi = () => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (document.getElementById('MotorCykelHandelsVaerdi') !== undefined && ko.dataFor(document.getElementById('MotorCykelHandelsVaerdi')) === undefined) {\r\n ko.applyBindingsToNode(document.getElementById('MotorCykelHandelsVaerdi'), null, activeProduct)\r\n }\r\n}\r\nexport const bindMotorCykelPostalNr = () => {\r\n if (app.root.Kunde) {\r\n if (document.getElementById('Postnr') !== undefined && ko.dataFor(document.getElementById('Postnr')) === undefined) {\r\n ko.applyBindingsToNode(document.getElementById('Postnr'), null, app.root.Kunde())\r\n }\r\n }\r\n}\r\n\r\nconst buildAntalSkaderMotorCykelOptionList = (element) => {\r\n for (let i = 0; i <= 3; i++) {\r\n let txt = String(i)\r\n const val = String(i)\r\n\r\n if (i === 3) {\r\n txt = app.getHjaelpeKodeText(\r\n 'CLIENT-3_ELLER_FLERE',\r\n '3 eller flere'\r\n )\r\n }\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(val)\r\n )\r\n }\r\n}\r\n\r\nconst setupAntalSkaderMotorCykelSelectList = (prefix) => {\r\n enableSelect(\r\n $('#select' + prefix + 'AntalSkaderMotorCykel'),\r\n app.root,\r\n null,\r\n {\r\n usesKeyValuePairs: true,\r\n onLoad: function (element) {\r\n buildAntalSkaderMotorCykelOptionList(element)\r\n }\r\n }\r\n )\r\n}\r\n\r\nconst setupAntalSkaderMotorCykelSelectListChangeEvent = (prefix) => {\r\n // make sure to validate on max. nof. damages\r\n $('#select' + prefix + 'AntalSkaderMotorCykel').on('change', function () {\r\n let max = 2\r\n const numberOfClaims =\r\n app.root.AntalSkaderFamilie() + app.root.AntalSkaderHus()\r\n\r\n if (3 - numberOfClaims < max) max = 3 - numberOfClaims\r\n\r\n if (parseInt($(this).val()) > max) {\r\n this.ifws_isInvalid = true\r\n h.validateElement(this)\r\n } else {\r\n this.ifws_isInvalid = false\r\n h.validateElement(this)\r\n }\r\n })\r\n}\r\nexport const brugsInfo = (prefix, person, jElement) => {\r\n enableToolTips(jElement)\r\n\r\n let jForm = $('#' + prefix + 'brugsInfo')\r\n\r\n if (!jForm[0].validator) {\r\n jForm = jElement\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = jForm.validate()\r\n }\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const antalSkaderMC = h.getElm('select' + prefix + 'AntalSkaderMotorCykel')\r\n $(antalSkaderMC).rules('add', {\r\n ifws_selected: true,\r\n max: 2,\r\n ifws_isInvalid: true,\r\n messages: {\r\n max: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_SKADER_MOTORCYKEL',\r\n 'Du kan ikke have mere end 2 skader'\r\n ),\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-ANTAL_TOTAL_SKADER',\r\n 'Du har samlet oplyst et antal skader, som betyder, at vi desværre ikke kan tilbyde dig den beregnede forsikring'\r\n )\r\n }\r\n })\r\n\r\n const postnr = h.getElm('Postnr')\r\n $(postnr).rules('add', {\r\n required: true,\r\n regexp: /^(?:[1-24-9]\\d{3}|3[0-8]\\d{2})$/,\r\n messages: {\r\n regexp: app.getFejlKodeText(\r\n 'CLIENT-MOTORCYKEL_POSTNR_FOR_HOEJ-Eier',\r\n 'Det indtastede postnummer er ikke korrekt.'\r\n )\r\n }\r\n })\r\n\r\n const pnr = h.getElm('MotorCykelHandelsVaerdi')\r\n $(pnr).rules('add', {\r\n min: 1,\r\n required: true,\r\n number: true,\r\n messages: {\r\n min: app.getFejlKodeText(\r\n 'CLIENT-MOTORCYKEL_HANDELVAERDI_TO_LOW',\r\n 'Udfyld venligst motorcyklens handelsværdi.'\r\n )\r\n }\r\n })\r\n\r\n const validator = jForm.validate()\r\n jForm[0].validator = validator\r\n\r\n setupAntalSkaderMotorCykelSelectList(prefix)\r\n\r\n setupAntalSkaderMotorCykelSelectListChangeEvent(prefix)\r\n\r\n basic.setupKundeInfoGroup(jElement)\r\n\r\n bindMotorCykelHandelsVaerdi()\r\n bindMotorCykelPostalNr()\r\n}\r\n","/* global ko $ */\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { MotorcykelProdukt, MotorcykelModel } from './dk-ifshop-motorcykel-produkt-model'\r\nimport {\r\n enableToolTips,\r\n PendingInputs,\r\n enableInputEvaluation,\r\n initPlaceholders\r\n} from './../dk-ifshop-controls'\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { brugsInfo } from './dk-ifshop-mc-multicontrolconfig'\r\nimport { dkRecaptcha } from '../security/recaptcha'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\n\r\nconst ifwsMotorcykel = {} // namespace\r\n\r\nifwsMotorcykel.settings = {\r\n maxAge: 45\r\n}\r\n\r\nifwsMotorcykel.detaljer = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct.Model, jElement[0])\r\n\r\n function updateMaerkeForsikring () {\r\n h.doOrWait(\r\n app.hjaelpeKoderLoadedFlag,\r\n app,\r\n 'hjaelpeKoderLoaded',\r\n function () {\r\n if (app.root.activeProduct.Model().IsMaerkeForsikring() &&\r\n app.root.activeProduct.Model().HasMaerkeFordele()) {\r\n const code = app.getHjaelpeKode('CLIENT-MOTORCYKEL-BONUS_MEDDELELSE')\r\n if (code) {\r\n const txt = h.format(code.lang, app.root.activeProduct.Model().Make().trim())\r\n $('#maerkeForsikringHolder').html(txt)\r\n }\r\n }\r\n }\r\n )\r\n }\r\n\r\n updateMaerkeForsikring()\r\n\r\n h.getJElmByDataId('vaelgAndenMotorCykel')\r\n .parent()\r\n .on('click', function () {\r\n app.root.activeProduct.Model = h.koMap(new MotorcykelModel())\r\n app.root.activeProduct.MotorCykelHandelsVaerdi(undefined)\r\n\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(undefined)\r\n app.root.activeProduct.ManuallyEnteredVehicleData(undefined)\r\n\r\n h.fadeToForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/quickform')\r\n\r\n $('#brugerInfoHolder').html('')\r\n\r\n app.root.activeProduct.Daekning().Navn('')\r\n })\r\n}\r\n\r\nifwsMotorcykel.beregnPris = function (jElement) {\r\n app.root.activeProduct.disposeDaekningsSubscriptions()\r\n\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(ifwsMotorcykel.beregnPris.submit)\r\n}\r\n\r\nifwsMotorcykel.ukendtRegNrPanelAction = false\r\n\r\nifwsMotorcykel.beregnPrisWithValidate = function (jElement) {\r\n const { activeProduct } = app.root\r\n\r\n ifwsMotorcykel.beregnPris(jElement)\r\n\r\n activeProduct.validateOnServer({\r\n entryFail: function (data) {\r\n if (data && data.Message && data.Message.TekstKode === 'CLIENT-MOTORCYKEL-KAN_IKKE_FINDE_MODEL') {\r\n ifwsMotorcykel.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n return true\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.regNrSetupBtx = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n // avoids autosubmit in IE, when there is only a single input control in the form\r\n jForm.on('keydown', '#RegNr', function (e) {\r\n if ($('#RegNr').attr('allowenter') === undefined) {\r\n if (e.keyCode === '32' || e.keyCode === 32) {\r\n e.preventDefault()\r\n }\r\n\r\n if (e.keyCode === '13' || e.keyCode === 13) {\r\n e.preventDefault()\r\n $('#RegNr').valid()\r\n }\r\n }\r\n })\r\n\r\n $('#RegNr').change(function () {\r\n if ($('#RegNr').valid()) {\r\n if (ifwsMotorcykel.ukendtRegNrPanelAction) {\r\n $('#regNrMsg').html('')\r\n }\r\n } else {\r\n $('#regNrMsg').html('')\r\n }\r\n\r\n if (app.page !== 'front') {\r\n const actionSettings = {\r\n onInvalid: function () {\r\n }\r\n }\r\n ifwsMotorcykel.updateModel(actionSettings)\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.displayUkendtRegNrPanel = function () {\r\n // display message\r\n app.loadHtml({\r\n url: 'motorcykelprodukt/getsubview/UkendtRegNrPanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage($('#regNrMsg'), data, true)\r\n // bind pricepanel to the model\r\n $(app).trigger('sectionLoaded', ['displayUkendtRegNrPanel', h.getSections(this.targetElement)])\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.ukendtRegNrPanel = function () {\r\n // triggered by displayUkendtRegNrPanel\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if ($('#RegNr').valid()) {\r\n ifwsMotorcykel.ukendtRegNrPanelAction = true\r\n\r\n activeProduct.UkendtRegNr(undefined)\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('ukendtRegNrPanel'))\r\n\r\n $('input[name=UkendtRegNr]').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true\r\n })\r\n\r\n $('input[name=UkendtRegNr]').on('change', function () {\r\n ifwsMotorcykel.validateRegistrationNumber() // ?\r\n return false // we remove the entire panel incl. this radio button, therefore the default action should be stopped, otherwise we would receive an error\r\n })\r\n\r\n // update the text on the last radiobutton to include the regnr at the end\r\n const jUkendtTrue = $('label[for=UkendtRegNrtrue]')\r\n jUkendtTrue.text(jUkendtTrue.text() + ' ' + app.root.activeProduct.SearchRegNr())\r\n } else {\r\n // if ukendtregnrpanel, hide\r\n $('#regNrMsg').html('')\r\n }\r\n}\r\n\r\nifwsMotorcykel.findMotorcykel = function (jElement, productId) {\r\n h.setDisabled($('#wizardNavigation button', app.getTopJElm()), true)\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n ifwsMotorcykel.regNrSetupBtx(jElement)\r\n })\r\n}\r\n\r\nifwsMotorcykel.validateRegistrationNumber = function () {\r\n app.setPendingUserAction('ukendtRegNr')\r\n\r\n if ($('input[name=UkendtRegNr]')[0].checked) {\r\n ifwsMotorcykel.InvalidNumberPlateValidation()\r\n } else if ($('input[name=UkendtRegNr]')[1].checked) {\r\n ifwsMotorcykel.InvalidButManuallyAcceptedNumberPlateValidation()\r\n }\r\n\r\n ifwsMotorcykel.ukendtRegNrPanelAction = false\r\n app.resetPendingUserAction('ukendtRegNr')\r\n}\r\n\r\nifwsMotorcykel.InvalidButManuallyAcceptedNumberPlateValidation = function (value) {\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(true)\r\n // add the searched regnr as the selected regnr\r\n\r\n activeProduct.Model().RegNrMotorcykel(activeProduct.SearchRegNr())\r\n if (!activeProduct.Model().RegNrMotorcykel() && activeProduct.Model().RegNrMotorcykel().length == 0) {\r\n activeProduct.Model().RegNrMotorcykel($('#RegNr').val())\r\n }\r\n activeProduct.UkendtRegNr(true)\r\n\r\n if (app.page === 'checkout') {\r\n ifwsMotorcykel.handleCheckoutManual()\r\n } else {\r\n ifwsMotorcykel.handleProductManual()\r\n }\r\n return true\r\n}\r\n\r\nifwsMotorcykel.handleCheckoutManual = function () {\r\n // when proceeding with an invalid regnr at checkout\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n // move on\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'motorcykelprodukt/getsubview/tidligereselskab')\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.Model().RegNrMotorcykel($('#RegNr').val())\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.handleProductManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.RegNrNotUsed(false)\r\n activeProduct.Model().RegNrMotorcykel(activeProduct.SearchRegNr())\r\n ifwsMotorcykel.updateModel()\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.sync({\r\n done: function (message = {}) {\r\n h.fadeToForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/motorcykelinfo')\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.InvalidNumberPlateValidation = function (value) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n $('#regNrMsg').html('')\r\n\r\n // set the option to undefined as we dont want to save this answer anywhere.\r\n activeProduct.UkendtRegNr(undefined)\r\n activeProduct.SearchRegNr(undefined)\r\n\r\n return true\r\n}\r\n\r\nifwsMotorcykel.motorCykelInfo = function (jElement) {\r\n if (app.root.activeProduct.Model().Year() === 0) {\r\n app.root.activeProduct.Model().Year('')\r\n }\r\n\r\n enableToolTips(jElement)\r\n\r\n if (h.getElm('MotorCykelHandelsVaerdi')) {\r\n ko.applyBindingsToNode(h.getElm('MotorCykelHandelsVaerdi'), null, app.root.activeProduct)\r\n }\r\n\r\n ifwsMotorcykel.enableYearMakeModelSelects()\r\n\r\n const jForm = $('#motorCykelInfo')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate({\r\n rules: {\r\n selectMake: { ifws_selected: true },\r\n selectModel: { ifws_selected: true },\r\n selectVariant: { ifws_selected: true },\r\n selectYear: { ifws_selected: true }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n if (validator.form(true)) {\r\n ifwsMotorcykel.backupSelections()\r\n\r\n // sync\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n // accepted. display the details with logo\r\n h.fadeToForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/detaljer')\r\n // display new questions\r\n h.extendForm($('#motorcykelHolder'), 'motorcykelprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n },\r\n entryFail: ifwsMotorcykel.submitEntryFail\r\n })\r\n }\r\n })\r\n })\r\n\r\n ifwsMotorcykel.validateRegNr = function (regNr) {\r\n return true\r\n }\r\n\r\n jForm.submit(function (e) {\r\n e.preventDefault()\r\n })\r\n\r\n enableInputEvaluation($('#handelsVaerdiGroup'))\r\n}\r\n\r\nifwsMotorcykel.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n // if the quickform is displayed, clicking any button to go forward, will require the quickform to be validated first. Only once this is done, it should be possible to move on to the next step\r\n ifwsMotorcykel.quickForm.submit()\r\n } else {\r\n // move on to next step\r\n app.wizard.goFwd()\r\n }\r\n}\r\n\r\nifwsMotorcykel.quickForm = function (jElement) {\r\n const jForm = $('#quickForm')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n })\r\n })\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('brugerIkkeRegNr'))\r\n\r\n quickformSubmitSetup.setup(jForm, ifwsMotorcykel.quickFormSubmitFunction)\r\n\r\n ko.applyBindingsToNode(h.getElm('RegNr'), null, app.root.activeProduct)\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n if (h.getElm('RegNr')) {\r\n // bind to model\r\n ifwsMotorcykel.regNrSetupBtx(jElement)\r\n }\r\n // start over with new regnr, so we don't know if it is unknown or not\r\n app.root.activeProduct.UkendtRegNr(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n}\r\n\r\nifwsMotorcykel.quickForm.submit = function (jElement) {\r\n if ($('#RegNr').valid()) {\r\n ifwsMotorcykel.backupSelections()\r\n ifwsMotorcykel.updateModel()\r\n }\r\n}\r\n\r\nifwsMotorcykel.quickFormSubmitFunction = function () {\r\n if ($('#RegNr').valid()) {\r\n ifwsMotorcykel.backupSelections()\r\n ifwsMotorcykel.updateModel()\r\n }\r\n}\r\n\r\nifwsMotorcykel.submitEntryFail = function (data, textStatus, jqXHR) {\r\n // MC was not accepted. Reuse saved search criterias, so the user can change them\r\n app.root.activeProduct.Model().Year(ifwsMotorcykel.motorCykelInfo.selectionsYear)\r\n app.root.activeProduct.Model().Make(ifwsMotorcykel.motorCykelInfo.selectionsMake)\r\n app.root.activeProduct.Model().Model(ifwsMotorcykel.motorCykelInfo.selectionsModel)\r\n app.root.activeProduct.Model().Variant(ifwsMotorcykel.motorCykelInfo.selectionsVariant)\r\n app.root.activeProduct.MotorCykelHandelsVaerdi(ifwsMotorcykel.motorCykelInfo.MotorCykelHandelsVaerdi)\r\n // Return true to make sure default action is perforformed too (Message)\r\n return true\r\n}\r\n\r\nifwsMotorcykel.backupSelections = function () {\r\n // save selections because they are overwritten with info that might differ (different case, spacet etc.), but we will need them again if the MC isn't accepted\r\n ifwsMotorcykel.motorCykelInfo.selectionsYear = app.root.activeProduct.Model().Year()\r\n ifwsMotorcykel.motorCykelInfo.selectionsMake = app.root.activeProduct.Model().Make()\r\n ifwsMotorcykel.motorCykelInfo.selectionsModel = app.root.activeProduct.Model().Model()\r\n ifwsMotorcykel.motorCykelInfo.selectionsVariant = app.root.activeProduct.Model().Variant()\r\n ifwsMotorcykel.motorCykelInfo.MotorCykelHandelsVaerdi = app.root.activeProduct.MotorCykelHandelsVaerdi()\r\n}\r\n\r\nifwsMotorcykel.enableYearMakeModelSelects = function (prefix) {\r\n if (typeof prefix === 'undefined') {\r\n prefix = 'select'\r\n }\r\n\r\n ifwsMotorcykel.enableSelectVariant(prefix)\r\n ifwsMotorcykel.enableSelectModel(prefix)\r\n ifwsMotorcykel.enableSelectMake(prefix)\r\n ifwsMotorcykel.enableSelectYear(prefix)\r\n}\r\n\r\nifwsMotorcykel.enableSelectYear = function (prefix) {\r\n enableSelect($('#' + prefix + 'Year'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: true,\r\n onLoad: function (element) {\r\n const thisYear = app.getBestYear()\r\n for (let i = 0; i <= ifwsMotorcykel.settings.maxAge; i++) {\r\n const txt = String(thisYear - i)\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(txt)\r\n )\r\n }\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.enableSelectVariant = function (prefix) {\r\n enableSelect($('#' + prefix + 'Variant'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: true,\r\n getCriteria: function (s) {\r\n const c0 = $('#' + prefix + 'Year')[0].value\r\n const c1 = $('#' + prefix + 'Make')[0].value\r\n const c2 = $('#' + prefix + 'Model')[0].value\r\n const year = c0 ? '\"year\" : ' + c0 + ', ' : ''\r\n const make = '\"make\" : \"' + c1 + '\", '\r\n const model = '\"model\" : \"' + c2 + '\"'\r\n return '{' + year + make + model + '}'\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.enableSelectModel = function (prefix) {\r\n enableSelect($('#' + prefix + 'Model'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: true,\r\n getCriteria: function (s) {\r\n if ($('#' + prefix + 'Year').length &&\r\n $('#' + prefix + 'Make').length &&\r\n $('#' + prefix + 'Model').length) {\r\n const c0 = $('#' + prefix + 'Year')[0].value\r\n const c1 = $('#' + prefix + 'Make')[0].value\r\n const year = c0 ? '\"year\" : ' + c0 + ', ' : ''\r\n const make = '\"make\" : \"' + c1 + '\"'\r\n return '{' + year + make + '}'\r\n }\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.enableSelectMake = function (prefix) {\r\n enableSelect($('#' + prefix + 'Make'), app.root.activeProduct.Model, null, {\r\n disableAutoUpdate: true,\r\n getCriteria: function (s) {\r\n const c0 = $('#' + prefix + 'Year')[0].value\r\n const year = c0 ? '\"year\" : ' + c0 : ''\r\n return '{' + year + '}'\r\n }\r\n })\r\n}\r\n\r\nifwsMotorcykel.ejersBrugsInfo = function (jElement) {\r\n brugsInfo('', app.root.Kunde(), jElement)\r\n\r\n if (app.root.Disv() && app.root.Kunde().Address()) {\r\n $('.edit-address-button').remove()\r\n }\r\n\r\n if (app.root.DisableCustomerElements() === true && !app.root.Disv()) {\r\n if (!app.root.Disv()) {\r\n $('input#Postnr').prop('disabled', true)\r\n $('.edit-address-button').remove()\r\n }\r\n }\r\n if (app.root.DisableCustomerElements() === true) {\r\n $('input#Postnr').prop('disabled', true)\r\n basic.hideCprGroupSection()\r\n }\r\n\r\n h.selectNextEntry(jElement)\r\n}\r\n\r\nifwsMotorcykel.supplerendeInfoMotorcykel = function (jElement, productId) {\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n const searchRegNr = app.root.activeProduct.SearchRegNr()\r\n const modelRegNr = app.root.activeProduct.Model().RegNrMotorcykel()\r\n\r\n if (searchRegNr && !modelRegNr) {\r\n app.root.activeProduct.Model().RegNrMotorcykel(searchRegNr)\r\n }\r\n\r\n if (\r\n app.wizard.currentStepNo === 3 &&\r\n app.wizard.currentStepNo === app.wizard.pendingStepNo &&\r\n app.wizard.currentStep.Progress === 0\r\n ) {\r\n app.root.activeProduct.HarTidligereSelskab(undefined)\r\n }\r\n\r\n enableToolTips(jElement)\r\n\r\n ko.applyBindingsToNode(h.getElm('RegNrMotorcykel'), null, app.root.activeProduct.Model)\r\n ko.applyBindingsToNode(h.getElm('StelNrMotorcykel'), null, app.root.activeProduct)\r\n ko.applyBindings(app.root.activeProduct, h.getElm('erMotorcyklenLeasetGroup'))\r\n\r\n $('#RegNrMotorcykel').attr('disabled', 'disabled')\r\n\r\n if (app.root.activeProduct.StelNrMotorcykel()) {\r\n $('#stelnummerGroup').hide()\r\n }\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n // validation rules\r\n const jForm = $('#supplerendeInfoMotorcykel')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNrMotorcykel: { required: true },\r\n StelNrMotorcykel: { required: true, ifws_isInvalid: true },\r\n harAndetSelskab: { required: true },\r\n selectSelskab: { ifws_selected: true },\r\n selectAndensSelskab: { ifws_selected: true },\r\n OpsigelseType: { required: true },\r\n selectOpsigelsesMaaned: { ifws_selected: true }\r\n },\r\n messages: {\r\n StelNrMotorcykel: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-MOTORCYKEL_STELNR_IKKE_VALID',\r\n 'Stelnummer ikke valid'\r\n )\r\n }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n\r\n $('#ErMotorcyklenLeasetJa').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true,\r\n messages: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n 'CLIENT-UNDERWRITING_AFVIST_' + app.root.activeProduct.produktNavn,\r\n 'Vi kan desværre ikke tilbyde dig den forsikring som du har beregnet en pris på. Du bedes venligst kontakte kundeservice på telefonnummer 70 12 12 53 for at få din forsikring.'\r\n )\r\n }\r\n })\r\n // bindings\r\n enableSelect($('#selectSelskab'), app.root.activeProduct, null, {\r\n usesKeyValuePairs: true,\r\n onLoadDone: function (element, data) {\r\n // add list\r\n $.each(data, function (index, item) {\r\n $(element).append(\r\n $('')\r\n .text(item.Navn)\r\n .val(item.KortNavn)\r\n )\r\n })\r\n }\r\n })\r\n\r\n basic.setupOpsigelse(jElement)\r\n basic.setupOpsigelseTypeDataChangeHandler()\r\n\r\n // ErMotorcyklenLeaset --------------------------------------------------------------------\r\n if (h.getElm('ErMotorcyklenLeasetNej')) {\r\n $('input[name=ErMotorcyklenLeaset]').on('evaluate', function () {\r\n h.validateElement(this, 'ifws_isInvalid')\r\n })\r\n\r\n $('input[name=ErMotorcyklenLeaset]')[0].ifws_customValidation = function (\r\n value\r\n ) {\r\n const res = ifwsMotorcykel.erMotorcyklenLeaset(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n // StelNrMotorcykel -----------------------------------------------------------------------\r\n if (h.getElm('StelNrMotorcykel')) {\r\n $('#StelNrMotorcykel').on('evaluate', function () {\r\n const stelNr = h.getElm('StelNrMotorcykel')\r\n h.validateElement(stelNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('StelNrMotorcykel').ifws_customValidation = function (value) {\r\n const res = ifwsMotorcykel.erStelNrMotorcykelValid(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n if (h.getElm('nyKontaktKundeService')) {\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('nyKontaktKundeService')\r\n )\r\n }\r\n\r\n jElement[0].validator.customShowLabel = function (element, message, rule) {\r\n if (element.id === 'ErMotorcyklenLeasetJa' &&\r\n rule === 'ifws_isInvalid'\r\n ) {\r\n basic.showInlineMessage(\r\n jElement.find('#nyKontaktKundeService'),\r\n message,\r\n true,\r\n true\r\n )\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n jElement[0].validator.customUnhighlight = function (element, message) {\r\n if (h.getElm('ErMotorcyklenLeasetJa').checked === false) {\r\n basic.clearInlineMessage(jElement.find('#nyKontaktKundeService'))\r\n }\r\n }\r\n\r\n // -------------------------------------------------------------------------------------\r\n function enableAndetSelskab (newValue) {\r\n // display\r\n if (newValue === true /* HarTidligereSelskab */) {\r\n h.extendForm(\r\n $('#supplerendeInfoMotorcykel'),\r\n null,\r\n $('#andetSelskabGroup'),\r\n null,\r\n null,\r\n 350\r\n )\r\n } else {\r\n h.retractForm($('#andetSelskabGroup'), 350)\r\n }\r\n }\r\n\r\n app.root.activeProduct.HarTidligereSelskab.subscribe(function (newValue) {\r\n enableAndetSelskab(newValue)\r\n })\r\n\r\n enableAndetSelskab(app.root.activeProduct.HarTidligereSelskab())\r\n\r\n h.selectNextEntry(jElement)\r\n })\r\n}\r\n\r\nifwsMotorcykel.updateModel = function (actionSettings) {\r\n ifwsMotorcykel.setModelData(actionSettings)\r\n}\r\n\r\nifwsMotorcykel.setModelData = function (actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const regNrValue = h.getElm('RegNr').value\r\n const regNrElement = $(h.getElm('RegNr'))\r\n\r\n if (regNrElement.valid()) {\r\n // called from all three places where a regnr can be edited (quickform, step1 and step3)\r\n if (!app.wizard || app.page === 'produkt') {\r\n activeProduct.setModel(regNrValue, regNrElement, actionSettings)\r\n } else if (app.page === 'checkout') {\r\n ifwsMotorcykel.updateRegNr(regNrValue, regNrElement, actionSettings)\r\n }\r\n } else {\r\n actionSettings.onInvalid()\r\n }\r\n}\r\n\r\nifwsMotorcykel.daekningsTilpasningsPanel = function (jElement) {\r\n basic.daekningsTilpasningsPanelBasics(jElement)\r\n}\r\n\r\n// StelNrMotorcykel -----------------------------------------------------------------------\r\nifwsMotorcykel.erStelNrMotorcykelValid = function (element) {\r\n const stelNr = $(element).val()\r\n\r\n const pattern = /^[abcdefghjklmnpqrstuvwxyz0-9]+$/i\r\n\r\n if (stelNr.match(pattern)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n// ErMotorcyklenLeaset -----------------------------------------------------------------------\r\nifwsMotorcykel.erMotorcyklenLeaset = function (element) {\r\n const afvistMc = h.getElm('ErMotorcyklenLeasetJa')\r\n if (afvistMc.checked) {\r\n return false\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\nifwsMotorcykel.acceptPriceAndProceed = function () {\r\n app.resetPendingUserAction()\r\n ifwsMotorcykel.acceptNewPrice(ifwsMotorcykel.updateRegNr.actionSettings)\r\n}\r\n\r\nifwsMotorcykel.acceptNewPrice = function (actionSettings) {\r\n const element = app.wizard.getCurrentWizardBodyJElement()\r\n\r\n app.root.activeProduct.setModel(newModelRegNr, element, actionSettings)\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n\r\n ifwsMotorcykel.updateWizardSubtext()\r\n}\r\n\r\nifwsMotorcykel.updateWizardSubtext = function () {\r\n if (ifwsMotorcykel.updateRegNr.alt) {\r\n const wizardStepCurrent = app.getTopJElm().find('.wizardStepCurrent')\r\n const title = ifwsMotorcykel.updateRegNr.alt.Model().Make() + ' ' + ifwsMotorcykel.updateRegNr.alt.Model().Model()\r\n wizardStepCurrent.find('.stepSubTitle').text(title)\r\n }\r\n}\r\n\r\nlet newModelRegNr = ''\r\n\r\n// Display new price based on new regnr (if any car is found) and allow the user to apply the new data\r\nifwsMotorcykel.updateRegNr = function (code, jElement, actionSettings) {\r\n try {\r\n newModelRegNr = h.getElm('RegNr').value\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-VEHICLE_REGNR_EMPTY'))\r\n return\r\n } else if (code === app.root.activeProduct.Model().RegNrMotorcykel()) {\r\n // no difference\r\n return\r\n }\r\n\r\n ifwsMotorcykel.updateRegNr.actionSettings = {\r\n done: function () {\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'motorcykelprodukt/getsubview/supplerende')\r\n\r\n // execute validation from control (if any)\r\n if (ifwsMotorcykel.updateRegNr.actionSettings2 && ifwsMotorcykel.updateRegNr.actionSettings2.onValid) {\r\n ifwsMotorcykel.updateRegNr.actionSettings2.onValid()\r\n }\r\n\r\n app.root.activeProduct.sync(\r\n {\r\n done: function (message = {}) {\r\n // update total fields to reflect the new totals\r\n basic.updateTotalFields()\r\n }\r\n },\r\n true\r\n )\r\n }\r\n }\r\n\r\n ifwsMotorcykel.updateRegNr.actionSettings2 = actionSettings\r\n\r\n app.setPendingUserAction('newPriceAwaitingApproval')\r\n // try to find the model\r\n app.loadJson({\r\n url: 'motorcykelprodukt/getmodel',\r\n data: '{ \"code\" : \"' + (code || '0') + '\" }',\r\n targetElement: jElement,\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // a new product is received\r\n if (data && data.Model && data.Model.MakeNumber) {\r\n const makeNumberOrAnvendelseHasChanged =\r\n app.root.activeProduct.Model().MakeNumber() !== data.Model.MakeNumber\r\n\r\n let logMessage = 'MC-Manualflow-matching-regnr'\r\n\r\n if (makeNumberOrAnvendelseHasChanged) {\r\n // create a model of the new product so it can be bound to the view\r\n ifwsMotorcykel.updateRegNr.alt = new MotorcykelProdukt()\r\n ifwsMotorcykel.updateRegNr.alt.update(data)\r\n\r\n // comparison variables for price\r\n const priceIsEqual = data.Daekning.NettoPraemieTotal === app.root.activeProduct.Daekning().NettoPraemieTotal()\r\n const yearIsEqual = data.Model.Year === app.root.activeProduct.Model().Year()\r\n const makeIsEqual = data.Model.Make.toLowerCase() === app.root.activeProduct.Model().Make().toLowerCase()\r\n const modelIsEqual = data.Model.Model.toLowerCase() === app.root.activeProduct.Model().Model().toLowerCase()\r\n\r\n // compare info\r\n if (\r\n priceIsEqual &&\r\n (yearIsEqual &&\r\n makeIsEqual &&\r\n modelIsEqual)\r\n ) {\r\n // the prices are the same. accept\r\n logMessage += '-same-price-and-model'\r\n ifwsMotorcykel.acceptPriceAndProceed()\r\n } else {\r\n logMessage += '-failed'\r\n // display message\r\n app.loadHtml({\r\n url: 'motorcykelprodukt/getsubview/nyprispanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage(\r\n $('#regNrMsg', '', true),\r\n data,\r\n true,\r\n true,\r\n app.getHjaelpeKodeText('CLIENT-BUTTON-FORTSAET_MED_NY_PRIS', 'Fortsæt med ny pris'),\r\n function () {\r\n ifwsMotorcykel.acceptPriceAndProceed()\r\n return false\r\n }\r\n )\r\n // bind pricepanel to the model\r\n ko.applyBindings(ifwsMotorcykel.updateRegNr.alt, h.getElm('nyPrisPanelegNrGroup'))\r\n ko.applyBindings(ifwsMotorcykel.updateRegNr.alt, h.getElm('nyPrisPanelNyPrisGroup'))\r\n ko.applyBindings(app.root.activeProduct, h.getElm('nyPrisPanelGammelPrisGroup'))\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n }\r\n } else {\r\n logMessage = 'MC-Manualflow-matching-same-makenumber'\r\n // Vognkode not different. move on\r\n ifwsMotorcykel.acceptPriceAndProceed()\r\n }\r\n\r\n const logData = {\r\n regnr: code,\r\n lookedupMakeNumber: data.Model.MakeNumber,\r\n manualCarYear: app.root.activeProduct.Model().Year(),\r\n manualCarmakeNumber: app.root.activeProduct.Model().MakeNumber(),\r\n manualCarBrand: app.root.activeProduct.Model().Make(),\r\n manualCarModel: app.root.activeProduct.Model().Model(),\r\n manualCarVariant: app.root.activeProduct.Model().Variant()\r\n }\r\n\r\n app.logInformationToAppInsight(logMessage, logData)\r\n } else {\r\n app.displayEntryExceptionInfo(app.getFejlKode('CLIENT-MOTORCYKEL-KAN_IKKE_FINDE_MODEL'))\r\n $('#RegNr').val(app.root.activeProduct.Model().RegNr())\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n },\r\n entryFail: function (data) {\r\n // execute validation from control (if any)\r\n if (ifwsMotorcykel.updateRegNr.actionSettings2 && ifwsMotorcykel.updateRegNr.actionSettings2.onInvalid) {\r\n ifwsMotorcykel.updateRegNr.actionSettings2.onInvalid()\r\n }\r\n\r\n if (data && data.Message && data.Message.TekstKode === 'CLIENT-MOTORCYKEL-KAN_IKKE_FINDE_MODEL') {\r\n ifwsMotorcykel.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n\r\n this.targetElement[0].ifws_isInvalid = true\r\n app.onEntryFail(data)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\n\r\nexport { ifwsMotorcykel }\r\n","/* global */\r\n\r\nexport class quickformSubmitSetup {\r\n static setup (jForm, callback, control) {\r\n const submitForm = this._createSubmitFunction(jForm, callback, true, control)\r\n const submitButton = this._createSubmitFunction(jForm, callback, false, control)\r\n\r\n jForm.on('submit', submitForm)\r\n jForm.find('.submitButton').on('click', submitButton)\r\n }\r\n\r\n static _createSubmitFunction (jForm, callback, preventDefault, control) {\r\n return function (e) {\r\n if (preventDefault) {\r\n e.preventDefault()\r\n }\r\n\r\n const validator = jForm.validate()\r\n if (validator.form(false)) {\r\n if (!control) {\r\n callback()\r\n } else {\r\n callback(control)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/* global $ */\r\n\r\nexport class dkRecaptcha {\r\n static attach (jElement) {\r\n if (!this._shouldAttach()) {\r\n return\r\n }\r\n\r\n const inputElements = jElement.find(':input')\r\n\r\n inputElements.each((index, element) => {\r\n if (element.type === 'tel' || element.type === 'text') {\r\n $(element).one('keydown', () => { this._attachIfNeeded() })\r\n }\r\n\r\n $(element).one('change', () => { this._attachIfNeeded() })\r\n })\r\n }\r\n\r\n static _shouldAttach () {\r\n const configElement = $('#recaptcha-client-config')\r\n\r\n if (configElement.length === 0) {\r\n return false\r\n }\r\n\r\n this.config = JSON.parse(configElement.html())\r\n\r\n return this.config.enabled\r\n }\r\n\r\n static _attachIfNeeded () {\r\n if (!this.hasAttached) {\r\n const script = document.createElement('script')\r\n script.async = false\r\n script.src = 'https://www.google.com/recaptcha/enterprise.js?render=' + this.config.siteKey\r\n\r\n const elem = (document.head || document.documentElement)\r\n elem.appendChild(script)\r\n\r\n this._waitForGrecaptcha()\r\n\r\n this.hasAttached = true\r\n }\r\n }\r\n\r\n static _waitForGrecaptcha () {\r\n // eslint-disable-next-line no-prototype-builtins\r\n if (window.hasOwnProperty('grecaptcha')) {\r\n window.grecaptcha.enterprise.ready(() => {})\r\n } else {\r\n setTimeout(() => { this._waitForGrecaptcha() }, 250)\r\n }\r\n }\r\n}\r\n","/* global $ ko */\r\n\r\nimport { Produkt } from './../dk-ifshop-produkt-model'\r\nimport { app } from './../dk-ifshop-application'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { TrailerTextCodes } from './../dk-ifshop-constants'\r\nimport { ifwsTrailer } from './dk-ifshop-trailer-scripts'\r\nfunction TrailerProdukt () {\r\n const self = this\r\n self.base = new Produkt()\r\n self.base.inherit(self)\r\n\r\n self.validateProperty = function (property, value, name) {\r\n if (typeof value === 'undefined') {\r\n value = ''\r\n } else if (name === 'RegNrTrailer' && value) {\r\n let regNr = value.toUpperCase().trim()\r\n regNr = regNr.replace(' ', '')\r\n self.RegNrTrailer(regNr)\r\n } else if (name === 'HandelsVaerdiTrailer') {\r\n if ($.isNumeric(value)) {\r\n const pNumInt = $.parseInt(value, 'N', app.culture)\r\n property(pNumInt)\r\n } else {\r\n const pInt = $.parseInt(value, 'N', app.culture)\r\n\r\n if ($.isNumeric(pInt)) {\r\n if (pInt === 0) {\r\n property('')\r\n } else {\r\n property(pInt)\r\n }\r\n } else {\r\n property(value)\r\n }\r\n }\r\n } else {\r\n self.validateProduktProperty(property, value, name)\r\n }\r\n\r\n self.UpdateHasChangedFlag(property, value, name)\r\n }\r\n\r\n // INIT\r\n self.init = function (\r\n ProduktID,\r\n AarMedEgenTrailer,\r\n Selvrisiko,\r\n Daekning,\r\n HandelsVaerdiTrailer,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n UnderwritingAccept,\r\n StelNrTrailer,\r\n MaerkeTrailer,\r\n ModelTrailer,\r\n AargangTrailer,\r\n WeightTrailer,\r\n RegNrTrailer,\r\n UkendtRegNr,\r\n SearchRegNr,\r\n RegNrNotUsed,\r\n ManuallyEnteredVehicleData,\r\n AllowManualRegistrationNumber,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n CPState,\r\n SelectedDaekningId\r\n ) {\r\n self.isInit = true\r\n\r\n // if (OpsigelseType == 0) OpsigelseType = 2;\r\n self.produktInit(\r\n ProduktID,\r\n HarTidligereSelskab,\r\n TidligereSelskab,\r\n TidligereSelskabNavn,\r\n TidligerePoliceNr,\r\n IkraftDato,\r\n OpsigelseType,\r\n StartDateType,\r\n OpsigelsesMaaned,\r\n UnderwritingAccept,\r\n EnglishName,\r\n UniqueId,\r\n opsigelseMaanedVedEj,\r\n SelectedDaekningId,\r\n CPState\r\n )\r\n\r\n self.Daekning = self.koMap(Daekning, self.Daekning)\r\n self.Selvrisiko = self.koMap(Selvrisiko, self.Selvrisiko, '', 'Selvrisiko')\r\n self.AarMedEgenTrailer = self.koMap(\r\n AarMedEgenTrailer,\r\n self.AarMedEgenTrailer,\r\n '',\r\n 'AarMedEgenTrailer'\r\n )\r\n self.HandelsVaerdiTrailer = self.koMap(\r\n HandelsVaerdiTrailer,\r\n self.HandelsVaerdiTrailer,\r\n null,\r\n 'HandelsVaerdiTrailer',\r\n true\r\n )\r\n\r\n self.StelNrTrailer = self.koMap(\r\n StelNrTrailer,\r\n self.StelNrTrailer,\r\n null,\r\n 'StelNrTrailer',\r\n true\r\n )\r\n self.MaerkeTrailer = self.koMap(\r\n MaerkeTrailer,\r\n self.MaerkeTrailer,\r\n null,\r\n 'MaerkeTrailer',\r\n true\r\n )\r\n self.ModelTrailer = self.koMap(\r\n ModelTrailer,\r\n self.ModelTrailer,\r\n null,\r\n 'ModelTrailer',\r\n true\r\n )\r\n self.WeightTrailer = self.koMap(\r\n WeightTrailer,\r\n self.WeightTrailer,\r\n null,\r\n 'WeightTrailer',\r\n true\r\n )\r\n\r\n self.AargangTrailer = self.koMap(\r\n AargangTrailer,\r\n self.AargangTrailer,\r\n null,\r\n 'AargangTrailer',\r\n true\r\n )\r\n self.RegNrTrailer = self.koMap(\r\n RegNrTrailer,\r\n self.RegNrTrailer,\r\n null,\r\n 'RegNrTrailer',\r\n true\r\n )\r\n self.SearchRegNr = self.koMap(SearchRegNr, self.SearchRegNr)\r\n self.RegNrNotUsed = self.koMap(RegNrNotUsed, self.RegNrNotUsed)\r\n self.UkendtRegNr = self.koMap(UkendtRegNr, self.UkendtRegNr, '', 'UkendtRegNr')\r\n self.ManuallyEnteredVehicleData = self.koMap(ManuallyEnteredVehicleData, self.ManuallyEnteredVehicleData, false, 'ManuallyEnteredVehicleData')\r\n self.AllowManualRegistrationNumber = self.koMap(AllowManualRegistrationNumber, self.AllowManualRegistrationNumber, false, 'AllowManualRegistrationNumber')\r\n h.publish(h.PRODUCT_UPDATED_FROM_ACTIVEPRODUCT, {\r\n product: ko.toJS(self),\r\n complimentaryInformation:\r\n {\r\n OwnerVehicleYear: app.getActiveProductOwnerYearForVehicle(app.root.activeProduct),\r\n insuredPerson: app.getInsuredPerson(app.root.activeProduct),\r\n pageInfo: app.getGTMPageInfo()\r\n }\r\n })\r\n self.isInit = false\r\n }\r\n self.init()\r\n\r\n // VALIDATE\r\n self.validate = function (actionSettings) {\r\n self.base.validate(actionSettings)\r\n }\r\n\r\n self.stepChanged = function () {\r\n self.base.stepChanged()\r\n }\r\n\r\n // UPDATE\r\n self.update = function (val) {\r\n if (val) {\r\n self.init(\r\n val.ProduktID,\r\n val.AarMedEgenTrailer,\r\n val.Selvrisiko,\r\n val.Daekning,\r\n val.HandelsVaerdiTrailer,\r\n val.OpsigelseType,\r\n val.StartDateType,\r\n val.OpsigelsesMaaned,\r\n val.HarTidligereSelskab,\r\n val.TidligereSelskab,\r\n val.TidligereSelskabNavn,\r\n val.TidligerePoliceNr,\r\n val.IkraftDatoShortStr,\r\n val.UnderwritingAccept,\r\n val.StelNrTrailer,\r\n val.MaerkeTrailer,\r\n val.ModelTrailer,\r\n val.AargangTrailer,\r\n val.WeightTrailer,\r\n val.RegNrTrailer,\r\n val.UkendtRegNr,\r\n val.SearchRegNr,\r\n val.RegNrNotUsed,\r\n val.ManuallyEnteredVehicleData,\r\n val.AllowManualRegistrationNumber,\r\n val.EnglishName,\r\n val.UniqueId,\r\n val.opsigelseMaanedVedEj,\r\n val.CPState,\r\n val.SelectedDaekningId\r\n )\r\n }\r\n }\r\n\r\n // get key to identify cached price\r\n self.getBeregningsKey = function () {\r\n let key =\r\n 'TRAILER-' +\r\n app.root.CustomerBenefitLevel() +\r\n '-' +\r\n app.root.Kunde().Alder() +\r\n '-' +\r\n self.AargangTrailer() +\r\n '-' +\r\n self.HandelsVaerdiTrailer()\r\n\r\n if (app.root.Kunde().CprNr()) {\r\n // defined used kvhx code if we know cprnr (kvhx only found on server as it is linked to cpr info and we dont give such info away on the client)\r\n key = key + '-' + app.root.Kunde().CprNr()\r\n } else {\r\n // defined used kvhx code if we know the address and not the cpr no. (only found on server)\r\n key =\r\n key +\r\n '-' +\r\n app.root.Kunde().Postnr() +\r\n '-' +\r\n app.root.Kunde().Gade() +\r\n '-' +\r\n app.root.Kunde().Husnr() +\r\n '-' +\r\n app.root.Kunde().Etage() +\r\n '-' +\r\n app.root.Kunde().SideDoerNr()\r\n }\r\n return key\r\n }\r\n self.innerDone = function (data, jqXHR) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (data !== undefined && data != null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n\r\n if (app.page === 'front') {\r\n if (data && data.ProduktID) {\r\n // set id. might have been newly created\r\n app.root.activeProduct.ProduktID(data.ProduktID)\r\n }\r\n app.gotoShopPage()\r\n } else {\r\n if (app.wizard && app.wizard.currentStepNo === 1) {\r\n // shop\r\n self.update(data)\r\n\r\n // we can not fade to details view if we have a manually entered registrationnumber\r\n if (!data.AllowManualRegistrationNumber) {\r\n h.fadeToForm($('#trailerHolder'), 'trailerprodukt/getsubview/detaljer')\r\n h.extendForm($('#trailerHolder'), 'trailerprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n return false\r\n } else {\r\n // step 3\r\n self.update(data)\r\n }\r\n }\r\n }\r\n\r\n function handleSetModelError (data) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n if (data && data.Data && data.Data.ProduktID) {\r\n // set id. might have been newly created, although an error has occured\r\n activeProduct.ProduktID(data.Data.ProduktID)\r\n }\r\n app.gotoShopPage() // SharePoint specific navigation\r\n } else {\r\n if (data.Message.TekstKode === TrailerTextCodes.TrailerNotFound) {\r\n ifwsTrailer.displayUkendtRegNrPanel()\r\n // return false // cancel default action\r\n return false\r\n } else {\r\n return true // perform default action;\r\n }\r\n }\r\n }\r\n\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode = (data) => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n if (data !== undefined && data !== null) {\r\n activeProduct.SearchRegNr(data.SearchRegNr)\r\n activeProduct.RegNrTrailer(data.SearchRegNr)\r\n activeProduct.ManuallyEnteredVehicleData(data.ManuallyEnteredVehicleData)\r\n activeProduct.AllowManualRegistrationNumber(data.AllowManualRegistrationNumber)\r\n }\r\n }\r\n // update this product with a new model based on regnr (if found)\r\n self.setModel = function (code, jElement, actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n try {\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode(TrailerTextCodes.RegNr0))\r\n return\r\n }\r\n\r\n const setModelInData = {\r\n code: (code || '0'),\r\n produktId: (activeProduct.ProduktID() || '0'),\r\n allowInvalidRegNr: (activeProduct.AllowManualRegistrationNumber())\r\n }\r\n\r\n if (window.grecaptcha) {\r\n const config = JSON.parse($('#recaptcha-client-config').html())\r\n\r\n window.grecaptcha.enterprise.ready(() => {\r\n window.grecaptcha.enterprise.execute(config.siteKey, { action: 'setModelTrailer' }).then(function (token) {\r\n app.loadJson({\r\n allowCredentials: true,\r\n code,\r\n url: 'trailerprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n token,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n })\r\n })\r\n } else {\r\n app.loadJson({\r\n code,\r\n url: 'trailerprodukt/setmodel',\r\n data: JSON.stringify(setModelInData),\r\n targetElement: jElement,\r\n actionSettings,\r\n actionOnBusy: 'ignoreBusy', // HACK\r\n prio: 'first',\r\n block: true,\r\n entryFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n operationFail: function (data) {\r\n self.UpdateModelWithBasicInformationForManualLicensePlateMode(data.Data)\r\n handleSetModelError(data)\r\n },\r\n done: function (data, textStatus, jqXHR) {\r\n self.innerDone(data, jqXHR)\r\n }\r\n })\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n\r\n self.unknownRegistrationNumber = function () {\r\n // when the user clicks the 'Kender ikke regnr'\r\n try {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (app.page === 'front') {\r\n activeProduct.RegNrNotUsed(true)\r\n activeProduct.sync({\r\n done: function () {\r\n app.gotoShopPage()\r\n }\r\n })\r\n } else {\r\n activeProduct.SearchRegNr(undefined)\r\n activeProduct.RegNrNotUsed(true)\r\n app.root.activeProduct.WeightTrailer(undefined)\r\n app.root.activeProduct.HandelsVaerdiTrailer(undefined)\r\n app.root.activeProduct.AargangTrailer(undefined)\r\n app.root.activeProduct.StelNrTrailer(undefined)\r\n app.root.activeProduct.MaerkeTrailer(undefined)\r\n app.root.activeProduct.ModelTrailer(undefined)\r\n app.root.activeProduct.RegNrTrailer(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(undefined)\r\n app.root.activeProduct.ManuallyEnteredVehicleData(undefined)\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n }\r\n })\r\n\r\n h.fadeToForm($('#trailerHolder'), 'trailerprodukt/getsubview/trailerInfo')\r\n // display new questions\r\n h.extendForm($('#trailerHolder'), 'trailerprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n }\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n }\r\n}\r\n\r\nexport { TrailerProdukt }\r\n","/* global $ ko */\r\n\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { app } from './../dk-ifshop-application'\r\nimport {\r\n PendingInputs,\r\n enableInputEvaluation,\r\n enableToolTips,\r\n initPlaceholders\r\n} from './../dk-ifshop-controls'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { dkRecaptcha } from '../security/recaptcha'\r\nimport { quickformSubmitSetup } from '../quickform-submit-setup'\r\nimport { TrailerTextCodes } from './../dk-ifshop-constants'\r\nimport { TrailerProdukt } from './dk-ifshop-trailer-produkt-model'\r\nimport { brugsInfo } from './dk-ifshop-trailer-multicontrolconfig'\r\nimport { enableSelect } from './../dk-ifshop-controls-multi'\r\n\r\nconst ifwsTrailer = {} // namespace\r\n\r\nifwsTrailer.settings = {\r\n maxAge: 35,\r\n maxWeight: 3500,\r\n maxTradeValue: 150000\r\n}\r\n\r\nifwsTrailer.beregnPris = function (jElement) {\r\n app.root.activeProduct.disposeDaekningsSubscriptions()\r\n\r\n h.selectNextEntry(jElement)\r\n\r\n basic.setProductSpecificEntryPageSubmitFunction(ifwsTrailer.beregnPris.submit)\r\n}\r\n\r\nifwsTrailer.beregnPrisWithValidate = function (jElement) {\r\n const { activeProduct } = app.root\r\n\r\n ifwsTrailer.beregnPris(jElement)\r\n\r\n activeProduct.validateOnServer({\r\n entryFail: function (data) {\r\n if (data && data.Message && data.Message.TekstKode === TrailerTextCodes.TrailerNotFound) {\r\n ifwsTrailer.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n return true\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.beregnPris.submit = function () {\r\n if (h.getElm('quickForm')) {\r\n ifwsTrailer.quickForm.submit()\r\n } else {\r\n let jFormName = '#trailerInfo'\r\n if (h.getElm('trailerDetaljer')) {\r\n jFormName = '#trailerDetaljer'\r\n }\r\n const jForm = $(jFormName)\r\n const validator = jForm.validate()\r\n if (validator.form(true)) {\r\n app.wizard.goFwd()\r\n } else {\r\n // Validate again to get the error messages shown\r\n validator.form(false)\r\n }\r\n }\r\n}\r\n\r\nifwsTrailer.detaljer = function (jElement) {\r\n ko.applyBindings(app.root.activeProduct, jElement[0])\r\n\r\n h.getJElmByDataId('vaelgAndenTrailer')\r\n .parent()\r\n .on('click', function () {\r\n app.root.activeProduct.WeightTrailer(undefined)\r\n app.root.activeProduct.AargangTrailer(undefined)\r\n app.root.activeProduct.ModelTrailer(undefined)\r\n app.root.activeProduct.MaerkeTrailer(undefined)\r\n app.root.activeProduct.HandelsVaerdiTrailer(undefined)\r\n app.root.activeProduct.RegNrTrailer(undefined)\r\n app.root.activeProduct.StelNrTrailer(undefined)\r\n app.root.activeProduct.SearchRegNr(undefined)\r\n app.root.activeProduct.AllowManualRegistrationNumber(undefined)\r\n app.root.activeProduct.ManuallyEnteredVehicleData(undefined)\r\n\r\n h.fadeToForm($('#trailerHolder'), 'trailerprodukt/getsubview/quickform')\r\n\r\n $('#brugerInfoHolder').html('')\r\n\r\n app.root.activeProduct.Daekning().Navn('')\r\n })\r\n}\r\n\r\nifwsTrailer.quickForm = function (jElement) {\r\n const { activeProduct } = app.root\r\n const jForm = $('#quickForm')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n })\r\n })\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('brugerIkkeRegNr'))\r\n\r\n quickformSubmitSetup.setup(jForm, ifwsTrailer.quickFormSubmitFunction)\r\n\r\n ko.applyBindingsToNode(h.getElm('RegNr'), null, activeProduct)\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n if (h.getElm('RegNr')) {\r\n // bind to model\r\n ifwsTrailer.regNrSetupBtx(jElement)\r\n }\r\n // start over with new regnr, so we don't know if it is unknown or not\r\n activeProduct.UkendtRegNr(undefined)\r\n activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if (app.page === 'front') {\r\n dkRecaptcha.attach(jElement)\r\n }\r\n\r\n h.selectNextEntry()\r\n initPlaceholders(jElement)\r\n}\r\n\r\nifwsTrailer.displayUkendtRegNrPanel = function () {\r\n // display message\r\n app.loadHtml({\r\n url: 'trailerprodukt/getsubview/UkendtRegNrPanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage($('#regNrMsg'), data, true)\r\n // bind pricepanel to the model\r\n $(app).trigger('sectionLoaded', ['displayUkendtRegNrPanel', h.getSections(this.targetElement)])\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.ukendtRegNrPanel = function () {\r\n // triggered by displayUkendtRegNrPanel\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(false)\r\n\r\n if ($('#RegNr').valid()) {\r\n ifwsTrailer.ukendtRegNrPanelAction = true\r\n\r\n activeProduct.UkendtRegNr(undefined)\r\n\r\n ko.applyBindings(app.root.activeProduct, h.getElm('ukendtRegNrPanel'))\r\n\r\n $('input[name=UkendtRegNr]').rules('add', {\r\n ifws_isInvalid: true,\r\n required: true\r\n })\r\n\r\n $('input[name=UkendtRegNr]').on('change', function () {\r\n ifwsTrailer.validateRegistrationNumber() // ?\r\n return false // we remove the entire panel incl. this radio button, therefore the default action should be stopped, otherwise we would receive an error\r\n })\r\n\r\n // update the text on the last radiobutton to include the regnr at the end\r\n const jUkendtTrue = $('label[for=UkendtRegNrtrue]')\r\n jUkendtTrue.text(jUkendtTrue.text() + ' ' + app.root.activeProduct.SearchRegNr())\r\n } else {\r\n // if ukendtregnrpanel, hide\r\n $('#regNrMsg').html('')\r\n }\r\n}\r\nifwsTrailer.regNrSetupBtx = function (jForm) {\r\n // validation rules\r\n const validator = jForm.validate({\r\n rules: {\r\n RegNr: {\r\n ifws_isInvalid: true,\r\n required: true\r\n }\r\n },\r\n messages: {\r\n RegNr: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n TrailerTextCodes.RegNrInvalid,\r\n 'Nummerplade ikke valid'\r\n )\r\n }\r\n }\r\n })\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = validator\r\n\r\n // avoids autosubmit in IE, when there is only a single input control in the form\r\n jForm.on('keydown', '#RegNr', function (e) {\r\n if ($('#RegNr').attr('allowenter') === undefined) {\r\n if (e.keyCode === '32' || e.keyCode === 32) {\r\n e.preventDefault()\r\n }\r\n\r\n if (e.keyCode === '13' || e.keyCode === 13) {\r\n e.preventDefault()\r\n $('#RegNr').valid()\r\n }\r\n }\r\n })\r\n\r\n // RegNr -----------------------------------------------------------------------\r\n if (h.getElm('RegNr')) {\r\n $('#regNr').on('evaluate', function () {\r\n const regNr = h.getElm('RegNr')\r\n h.validateElement(regNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('RegNr').ifws_customValidation = function (value) {\r\n const res = ifwsTrailer.erRegNrTrailerValid(this)\r\n return res\r\n }\r\n }\r\n\r\n $('#RegNr').change(function () {\r\n if ($('#RegNr').valid()) {\r\n if (ifwsTrailer.ukendtRegNrPanelAction) {\r\n $('#regNrMsg').html('')\r\n }\r\n } else {\r\n $('#regNrMsg').html('')\r\n }\r\n\r\n if (app.page !== 'front') {\r\n const actionSettings = {\r\n onInvalid: function () {\r\n }\r\n }\r\n ifwsTrailer.updateModel(actionSettings)\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.enableSelectYear = function (prefix) {\r\n if (typeof prefix === 'undefined') {\r\n prefix = 'select'\r\n }\r\n enableSelect($('#' + prefix + 'Year'), app.root.activeProduct, null, {\r\n disableAutoUpdate: true,\r\n onLoad: function (element) {\r\n const thisYear = app.getBestYear()\r\n for (let i = 0; i <= ifwsTrailer.settings.maxAge; i++) {\r\n const txt = String(thisYear - i)\r\n $(element).append(\r\n $('')\r\n .text(txt)\r\n .val(txt)\r\n )\r\n }\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.quickFormSubmitFunction = function () {\r\n if ($('#RegNr').valid()) {\r\n ifwsTrailer.backupSelections()\r\n ifwsTrailer.updateModel()\r\n }\r\n}\r\n\r\nifwsTrailer.submitEntryFail = function (data, textStatus, jqXHR) {\r\n // Trailer was not accepted. Reuse saved search criterias, so the user can change them\r\n app.root.activeProduct.AargangTrailer(ifwsTrailer.trailerInfo.selectionsYear)\r\n app.root.activeProduct.MaerkeTrailer(ifwsTrailer.trailerInfo.selectionsMake)\r\n // Return true to make sure default action is perforformed too (Message)\r\n return true\r\n}\r\n\r\nifwsTrailer.backupSelections = function () {\r\n // save selections because they are overwritten with info that might differ (different case, spacet etc.), but we will need them again if the Trailer isn't accepted\r\n ifwsTrailer.trailerInfo.selectionsYear = app.root.activeProduct.AargangTrailer()\r\n ifwsTrailer.trailerInfo.selectionsMake = app.root.activeProduct.MaerkeTrailer()\r\n}\r\nifwsTrailer.updateModel = function (actionSettings) {\r\n ifwsTrailer.setModelData(actionSettings)\r\n}\r\nifwsTrailer.setModelData = function (actionSettings) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n const regNrValue = h.getElm('RegNr').value\r\n const regNrElement = $(h.getElm('RegNr'))\r\n\r\n if (regNrElement.valid()) {\r\n // called from all three places where a regnr can be edited (quickform, step1 and step3)\r\n if (!app.wizard || app.page === 'produkt') {\r\n activeProduct.setModel(regNrValue, regNrElement, actionSettings)\r\n } else if (app.page === 'checkout') {\r\n ifwsTrailer.updateRegNr(regNrValue, regNrElement, actionSettings)\r\n }\r\n } else {\r\n actionSettings.onInvalid()\r\n }\r\n}\r\n\r\nifwsTrailer.InvalidNumberPlateValidation = function (value) {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n $('#regNrMsg').html('')\r\n\r\n // set the option to undefined as we dont want to save this answer anywhere.\r\n activeProduct.UkendtRegNr(undefined)\r\n activeProduct.SearchRegNr(undefined)\r\n\r\n return true\r\n}\r\n\r\nifwsTrailer.trailerInfo = function (jElement) {\r\n if (app.root.activeProduct.AargangTrailer() === 0) {\r\n app.root.activeProduct.AargangTrailer('')\r\n }\r\n\r\n enableToolTips(jElement)\r\n\r\n ifwsTrailer.enableSelectYear()\r\n ko.applyBindings(app.root.activeProduct, h.getElm('WeightTrailer'))\r\n\r\n const jForm = $('#trailerInfo')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n const validator = jForm.validate({\r\n rules: {\r\n selectYear: { ifws_selected: true },\r\n WeightTrailer: {\r\n required: true,\r\n min: 1,\r\n max: ifwsTrailer.settings.maxWeight,\r\n number: true\r\n }\r\n },\r\n messages: {\r\n WeightTrailer: {\r\n min: app.getFejlKodeText(\r\n TrailerTextCodes.WeightToLow,\r\n 'Udfyld venligst trailerns vaegt.'\r\n ),\r\n max: app.getFejlKodeText(\r\n TrailerTextCodes.WeightToHigh,\r\n 'Du kan desværre ikke beregne en pris på denne trailer i vores webshop. Du bedes venligst kontakte Webshop Service på tlf.nr. 70 12 12 53 for at høre nærmere'\r\n )\r\n }\r\n }\r\n })\r\n\r\n jForm[0].validator = validator\r\n\r\n jForm.on('evaluate', function () {\r\n // apply validation attempt when form is done pending\r\n jForm[0].pendingInputs.setOnDone(function () {\r\n if (validator.form(true)) {\r\n ifwsTrailer.backupSelections()\r\n\r\n // sync\r\n app.root.activeProduct.sync({\r\n done: function () {\r\n if (!app.root.activeProduct.AllowManualRegistrationNumber() && !app.root.activeProduct.RegNrNotUsed()) {\r\n // accepted. display the details with logo\r\n h.fadeToForm($('#trailerHolder'), 'trailerprodukt/getsubview/detaljer')\r\n // display new questions\r\n h.extendForm($('#trailerHolder'), 'trailerprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n },\r\n entryFail: ifwsTrailer.submitEntryFail\r\n })\r\n }\r\n })\r\n })\r\n\r\n jForm.submit(function (e) {\r\n e.preventDefault()\r\n })\r\n\r\n enableInputEvaluation($('#handelsVaerdiGroup'))\r\n}\r\n\r\nifwsTrailer.findTrailer = function (jElement, productId) {\r\n h.setDisabled($('#wizardNavigation button', app.getTopJElm()), true)\r\n\r\n app.root.ensureActiveProduct(productId, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n ifwsTrailer.regNrSetupBtx(jElement)\r\n })\r\n}\r\n\r\nifwsTrailer.validateRegistrationNumber = function () {\r\n app.setPendingUserAction('ukendtRegNr')\r\n\r\n if ($('input[name=UkendtRegNr]')[0].checked) {\r\n ifwsTrailer.InvalidNumberPlateValidation()\r\n } else if ($('input[name=UkendtRegNr]')[1].checked) {\r\n ifwsTrailer.InvalidButManuallyAcceptedNumberPlateValidation()\r\n }\r\n\r\n ifwsTrailer.ukendtRegNrPanelAction = false\r\n app.resetPendingUserAction('ukendtRegNr')\r\n}\r\n\r\nifwsTrailer.InvalidButManuallyAcceptedNumberPlateValidation = function (value) {\r\n const { activeProduct } = app.root\r\n\r\n activeProduct.AllowManualRegistrationNumber(true)\r\n // add the searched regnr as the selected regnr\r\n\r\n activeProduct.RegNrTrailer(activeProduct.SearchRegNr())\r\n if (activeProduct.RegNrTrailer().length == 0) {\r\n activeProduct.RegNrTrailer($('#RegNr').val())\r\n }\r\n activeProduct.UkendtRegNr(true)\r\n\r\n if (app.page === 'checkout') {\r\n ifwsTrailer.handleCheckoutManual()\r\n } else {\r\n ifwsTrailer.handleProductManual()\r\n }\r\n return true\r\n}\r\nifwsTrailer.handleCheckoutManual = function () {\r\n // when proceeding with an invalid regnr at checkout\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.sync({\r\n done: function () {\r\n // move on\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'trailerprodukt/getsubview/tidligereselskab')\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.RegNrTrailer($('#RegNr').val())\r\n\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.handleProductManual = function () {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n activeProduct.RegNrNotUsed(false)\r\n activeProduct.RegNrTrailer(activeProduct.SearchRegNr())\r\n ifwsTrailer.updateModel()\r\n\r\n $('#regNrMsg').html('')\r\n\r\n activeProduct.sync({\r\n done: function (message = {}) {\r\n h.fadeToForm($('#trailerHolder'), 'trailerprodukt/getsubview/trailerinfo')\r\n h.extendForm($('#trailerHolder'), 'trailerprodukt/getsubview/brugerinfo', $('#brugerInfoHolder'), 1)\r\n }\r\n })\r\n}\r\n\r\nifwsTrailer.quickForm.submit = function () {\r\n if ($('#RegNr').valid()) {\r\n ifwsTrailer.backupSelections()\r\n ifwsTrailer.updateModel()\r\n }\r\n}\r\n\r\nifwsTrailer.ejersBrugsInfo = function (jElement) {\r\n brugsInfo('', app.root.Kunde(), jElement)\r\n\r\n if (app.root.Disv() && app.root.Kunde().Address()) {\r\n $('.edit-address-button').remove()\r\n }\r\n\r\n if (app.root.DisableCustomerElements() === true) {\r\n basic.hideCprGroupSection()\r\n }\r\n\r\n h.selectNextEntry(jElement)\r\n}\r\nifwsTrailer.supplerendeInfoTrailer = function (jElement, productType) {\r\n app.root.ensureActiveProduct(productType, function () {\r\n // all code placed in here because this method is used for different products in the checkout phase. First we must ensure the right product model is used.\r\n const searchRegNr = app.root.activeProduct.SearchRegNr()\r\n const modelRegNr = app.root.activeProduct.RegNrTrailer()\r\n\r\n if (searchRegNr && !modelRegNr) {\r\n app.root.activeProduct.RegNrTrailer(searchRegNr)\r\n }\r\n\r\n if (\r\n app.wizard.currentStepNo == 3 &&\r\n app.wizard.currentStepNo == app.wizard.pendingStepNo &&\r\n app.wizard.currentStep.Progress == 0\r\n ) {\r\n app.root.activeProduct.HarTidligereSelskab(undefined)\r\n }\r\n\r\n enableToolTips(jElement)\r\n ko.applyBindings(app.root.activeProduct, document.getElementById('modelGroup'))\r\n ko.applyBindings(app.root.activeProduct, document.getElementById('RegNrGroup'))\r\n\r\n $('#RegNrTrailer').attr('disabled', 'disabled')\r\n\r\n enableInputEvaluation(jElement)\r\n\r\n // validation rules\r\n const jForm = $('#supplerendeInfoTrailer')\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n const validator = jForm.validate({\r\n rules: {\r\n MaerkeTrailer: {\r\n required: true\r\n },\r\n RegNrTrailer: {\r\n required: true,\r\n ifws_isInvalid: true\r\n },\r\n StelNrTrailer: {\r\n required: true,\r\n ifws_isInvalid: true\r\n }\r\n },\r\n messages: {\r\n MaerkeTrailer: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n TrailerTextCodes.BrandInvalid,\r\n 'Maerke ikke valid'\r\n )\r\n },\r\n RegNrTrailer: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n TrailerTextCodes.RegNrInvalid,\r\n 'Nummerplade ikke valid'\r\n )\r\n },\r\n StelNrTrailer: {\r\n ifws_isInvalid: app.getFejlKodeText(\r\n TrailerTextCodes.StelNrInvalid,\r\n 'Stelnummer ikke valid'\r\n )\r\n }\r\n }\r\n })\r\n jForm[0].validator = validator\r\n\r\n // RegNr -----------------------------------------------------------------------\r\n if (h.getElm('RegNrTrailer')) {\r\n $('#regNrTrailer').on('evaluate', function () {\r\n const regNr = h.getElm('RegNrTrailer')\r\n h.validateElement(regNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('RegNrTrailer').ifws_customValidation = function (value) {\r\n const res = ifwsTrailer.erRegNrTrailerValid(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n // StelNr -----------------------------------------------------------------------\r\n if (h.getElm('StelNrTrailer')) {\r\n $('#StelNrTrailer').on('evaluate', function () {\r\n const stelNr = h.getElm('StelNrTrailer')\r\n h.validateElement(stelNr, 'ifws_isInvalid')\r\n })\r\n\r\n h.getElm('StelNrTrailer').ifws_customValidation = function (value) {\r\n const res = ifwsTrailer.erStelNrTrailerValid(this)\r\n return res\r\n }\r\n }\r\n // ----------------------------------------------------------------------------------------\r\n\r\n // nyKontaktKundeService ------------------------------------------------------------------\r\n if (h.getElm('nyKontaktKundeService')) {\r\n ko.applyBindings(\r\n app.root.activeProduct,\r\n h.getElm('nyKontaktKundeService')\r\n )\r\n }\r\n\r\n h.selectNextEntry(jElement)\r\n })\r\n}\r\n\r\nifwsTrailer.updateWizardSubtext = function () {\r\n if (ifwsTrailer.updateRegNr.alt) {\r\n const wizardStepCurrent = app.getTopJElm().find('.wizardStepCurrent')\r\n const title = ifwsTrailer.updateRegNr.alt.MaerkeTrailer() + ' ' + ifwsTrailer.updateRegNr.alt.ModelTrailer() + ' - ' + ifwsTrailer.updateRegNr.alt.RegNrTrailer()\r\n wizardStepCurrent.find('.stepSubTitle').text(title)\r\n }\r\n}\r\n\r\nifwsTrailer.erHandelsVaerdiTrailerValid = function (element) {\r\n const handelsVaerdi = app.root.activeProduct.HandelsVaerdiTrailer()\r\n\r\n // is numeric\r\n if (handelsVaerdi <= 999999 && handelsVaerdi > 0) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n// RegNrTrailer -----------------------------------------------------------------------\r\nifwsTrailer.erRegNrTrailerValid = function (element) {\r\n const regNr = $(element).val()\r\n const pattern = /[A-Z]{2}[0-9]{4}/i\r\n\r\n if (regNr.match(pattern)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\n// StelNrTrailer -----------------------------------------------------------------------\r\nifwsTrailer.erStelNrTrailerValid = function (element) {\r\n const stelNr = $(element).val()\r\n\r\n /// /Stelnummer kun indeholde danske bokstager og tal, dog ikke i, o, æ, ø, å\r\n const pattern = /^[abcdefghjklmnpqrstuvwxyz0-9]+$/i // Kontakt google.com for forklaring\r\n\r\n if (stelNr.match(pattern)) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nifwsTrailer.DisplayRegNrGroup = function () {\r\n if (!app.root.activeProduct.UkendtRegNr()) {\r\n h.disable($('#RegNrTrailer'))\r\n } else {\r\n h.enable($('#RegNrTrailer'))\r\n }\r\n}\r\nifwsTrailer.acceptPriceAndProceed = function () {\r\n app.resetPendingUserAction()\r\n ifwsTrailer.acceptNewPrice(ifwsTrailer.updateRegNr.actionSettings)\r\n}\r\n\r\nifwsTrailer.acceptNewPrice = function (actionSettings) {\r\n const element = app.wizard.getCurrentWizardBodyJElement()\r\n\r\n app.root.activeProduct.setModel(newModelRegNr, element, actionSettings)\r\n app.root.activeProduct.RegNrNotUsed(false)\r\n ifwsTrailer.DisplayRegNrGroup()\r\n $('#wizardNavigation').find('button').prop('disabled', false)\r\n $('#wizardNavigation').find('button').removeAttr('disabled')\r\n $('#wizardNavigation').find('button').removeClass('disabled')\r\n\r\n ifwsTrailer.updateWizardSubtext()\r\n}\r\n\r\nlet newModelRegNr = ''\r\nifwsTrailer.updateRegNr = function (code, jElement, actionSettings) {\r\n try {\r\n newModelRegNr = h.getElm('RegNr').value\r\n if (!code) {\r\n app.displayEntryExceptionInfo(app.getFejlKode(TrailerTextCodes.RegNr0))\r\n return\r\n } else if (code === app.root.activeProduct.RegNrTrailer()) {\r\n // no difference\r\n return\r\n }\r\n\r\n ifwsTrailer.updateRegNr.actionSettings = {\r\n done: function () {\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n h.fadeToForm($('#supplerendeInfoHolder'), 'trailerprodukt/getsubview/supplerende')\r\n\r\n // execute validation from control (if any)\r\n if (ifwsTrailer.updateRegNr.actionSettings2 && ifwsTrailer.updateRegNr.actionSettings2.onValid) {\r\n ifwsTrailer.updateRegNr.actionSettings2.onValid()\r\n }\r\n\r\n app.root.activeProduct.sync(\r\n {\r\n done: function (message = {}) {\r\n // update total fields to reflect the new totals\r\n basic.updateTotalFields()\r\n }\r\n },\r\n true\r\n )\r\n }\r\n }\r\n\r\n ifwsTrailer.updateRegNr.actionSettings2 = actionSettings\r\n\r\n app.setPendingUserAction('newPriceAwaitingApproval')\r\n // try to find the model\r\n app.loadJson({\r\n url: 'trailerprodukt/getmodel',\r\n data: '{ \"code\" : \"' + (code || '0') + '\" }',\r\n targetElement: jElement,\r\n block: true,\r\n allowCredentials: true,\r\n done: function (data, textStatus, jqXHR) {\r\n // a new product is received\r\n if (data && data.AargangTrailer && data.WeightTrailer && data.HandelsVaerdiTrailer) {\r\n const makeNumberOrAnvendelseHasChanged =\r\n app.root.activeProduct.AargangTrailer() !== data.AargangTrailer || app.root.activeProduct.WeightTrailer() !== data.WeightTrailer || app.root.activeProduct.HandelsVaerdiTrailer() !== data.HandelsVaerdiTrailer\r\n\r\n let logMessage = 'Trailer-Manualflow-matching-regnr'\r\n\r\n if (makeNumberOrAnvendelseHasChanged) {\r\n // create a model of the new product so it can be bound to the view\r\n ifwsTrailer.updateRegNr.alt = new TrailerProdukt()\r\n ifwsTrailer.updateRegNr.alt.update(data)\r\n\r\n // comparison variables for price\r\n const priceIsEqual = data.Daekning.NettoPraemieTotal === app.root.activeProduct.Daekning().NettoPraemieTotal()\r\n const yearIsEqual = data.AargangTrailer === app.root.activeProduct.AargangTrailer()\r\n const weightIsEqual = data.WeightTrailer === app.root.activeProduct.WeightTrailer()\r\n const marketValueIsEqual = data.HandelsVaerdiTrailer === app.root.activeProduct.HandelsVaerdiTrailer()\r\n\r\n // compare info\r\n if (\r\n priceIsEqual &&\r\n yearIsEqual &&\r\n weightIsEqual &&\r\n marketValueIsEqual\r\n ) {\r\n // the prices are the same. accept\r\n logMessage += '-same-price-and-model'\r\n ifwsTrailer.acceptPriceAndProceed()\r\n } else {\r\n logMessage += '-failed'\r\n // display message\r\n app.loadHtml({\r\n url: 'trailerprodukt/getsubview/nyprispanel',\r\n block: true,\r\n targetElement: $('#' + app.pageBodyElementId),\r\n done: function (data, textStatus, jqXHR) {\r\n // display message\r\n basic.showInlineMessage(\r\n $('#regNrMsg', '', true),\r\n data,\r\n true,\r\n true,\r\n app.getHjaelpeKodeText(TrailerTextCodes.ButtonContinueNewPrice, 'Fortsæt med ny pris'),\r\n function () {\r\n ifwsTrailer.acceptPriceAndProceed()\r\n return false\r\n }\r\n )\r\n // bind pricepanel to the model\r\n ko.applyBindings(ifwsTrailer.updateRegNr.alt, h.getElm('nyPrisPanelegNrGroup'))\r\n ko.applyBindings(ifwsTrailer.updateRegNr.alt, h.getElm('nyPrisPanelNyPrisGroup'))\r\n ko.applyBindings(app.root.activeProduct, h.getElm('nyPrisPanelGammelPrisGroup'))\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n }\r\n } else {\r\n logMessage = 'Trailer-Manualflow-matching-same-makenumber'\r\n // Vognkode not different. move on\r\n ifwsTrailer.acceptPriceAndProceed()\r\n }\r\n\r\n const logData = {\r\n regnr: code,\r\n manualTrailerYear: app.root.activeProduct.AargangTrailer(),\r\n manualTrailerBrand: app.root.activeProduct.MaerkeTrailer(),\r\n manualTrailerWeight: app.root.activeProduct.WeightTrailer()\r\n }\r\n\r\n app.logInformationToAppInsight(logMessage, logData)\r\n } else {\r\n app.displayEntryExceptionInfo(app.getFejlKode(TrailerTextCodes.TrailerNotFound))\r\n $('#RegNr').val(app.root.activeProduct.RegNrTrailer())\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n },\r\n entryFail: function (data) {\r\n // execute validation from control (if any)\r\n if (ifwsTrailer.updateRegNr.actionSettings2 && ifwsTrailer.updateRegNr.actionSettings2.onInvalid) {\r\n ifwsTrailer.updateRegNr.actionSettings2.onInvalid()\r\n }\r\n\r\n if (data && data.Message && data.Message.TekstKode === TrailerTextCodes.TrailerNotFound) {\r\n ifwsTrailer.displayUkendtRegNrPanel()\r\n return false // cancel default action\r\n }\r\n\r\n this.targetElement[0].ifws_isInvalid = true\r\n app.onEntryFail(data)\r\n },\r\n always: function () {\r\n if (!this.ignored && !this.response) {\r\n // on fail\r\n app.resetPendingUserAction('newPriceAwaitingApproval')\r\n }\r\n }\r\n })\r\n } catch (e) {\r\n app.onClientException(e)\r\n }\r\n}\r\nexport { ifwsTrailer }\r\n","/* global $ ko */\r\n\r\nimport { app } from './../dk-ifshop-application'\r\nimport { basic } from './../dk-ifshop-scripts'\r\nimport { h } from './../dk-ifshop-helper'\r\nimport { PendingInputs, enableToolTips } from './../dk-ifshop-controls'\r\nimport { TrailerTextCodes } from './../dk-ifshop-constants'\r\nimport { ifwsTrailer } from './dk-ifshop-trailer-scripts'\r\nconst bindHandelsVaerdiTrailer = () => {\r\n const {\r\n activeProduct\r\n } = app.root\r\n\r\n if (document.getElementById('HandelsVaerdiTrailer') !== undefined && ko.dataFor(document.getElementById('HandelsVaerdiTrailer')) === undefined) {\r\n ko.applyBindingsToNode(document.getElementById('HandelsVaerdiTrailer'), null, activeProduct)\r\n }\r\n}\r\n\r\nexport const brugsInfo = (prefix, person, jElement) => {\r\n enableToolTips(jElement)\r\n\r\n let jForm = $('#' + prefix + 'brugsInfo')\r\n\r\n if (!jForm[0].validator) {\r\n jForm = jElement\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n jForm[0].validator = jForm.validate()\r\n }\r\n\r\n jForm[0].pendingInputs = new PendingInputs() // make form wait on pending controls before validation\r\n\r\n const pnr = h.getElm('HandelsVaerdiTrailer')\r\n $(pnr).rules('add', {\r\n min: 1,\r\n max: ifwsTrailer.settings.maxTradeValue,\r\n required: true,\r\n number: true,\r\n messages: {\r\n min: app.getFejlKodeText(\r\n TrailerTextCodes.TradeValueToLow,\r\n 'Udfyld venligst trailer handelsværdi.'\r\n ),\r\n max: app.getFejlKodeText(\r\n TrailerTextCodes.TradeValueToHigh,\r\n 'Du kan desværre ikke beregne en pris på denne trailer i vores webshop. Du bedes venligst kontakte Webshop Service på tlf.nr. 70 12 12 53 for at høre nærmere'\r\n )\r\n }\r\n })\r\n const validator = jForm.validate()\r\n jForm[0].validator = validator\r\n\r\n basic.setupKundeInfoGroup(jElement)\r\n\r\n bindHandelsVaerdiTrailer()\r\n}\r\n","import {\r\n GetFutureBirthDateErrorMessage,\r\n CustomerIsOver99YearsOldMessage,\r\n ForsikredeIsOver99YearsOldMessage,\r\n ForsikredeIsUnder18YearsOldMessage,\r\n CustomerIsUnder18YearsOldMessage,\r\n ChildIsOver18YearsOldMessage,\r\n ChildIsYoungAdultMessage,\r\n ChildIsOver18YearsOldRemoveProductMessage,\r\n MedforsikredeIsOver99YearsOldMessage,\r\n MedforsikredeIsUnder18YearsOldMessage\r\n} from './dk-ifshop-ulykke-validation-messages'\r\n\r\nimport { PersonEntities } from '../dk-ifshop-constants'\r\n\r\nexport const InfoState = (payerOfInsurance, birthDate, age) => {\r\n if (!payerOfInsurance) {\r\n return ChildIs15YearsOld(birthDate, age)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport const ValidState = (prefix, payerOfInsurance, birthDate, age, now, activeProductSamlever, activeProductAldersTrin) => {\r\n // general validation\r\n if (birthDateIsInTheFuture(birthDate, now)) {\r\n return false\r\n }\r\n\r\n if (prefix === PersonEntities.Medforsikret) {\r\n return ValidStateCoinsured(birthDate, age, now, activeProductSamlever, activeProductAldersTrin)\r\n } else {\r\n if (payerOfInsurance) {\r\n return ValidStateCustomer(birthDate, age, now, activeProductSamlever, activeProductAldersTrin)\r\n } else {\r\n return ValidStateBeneficiary(birthDate, age, now, activeProductSamlever, activeProductAldersTrin)\r\n }\r\n }\r\n}\r\n\r\nconst ValidStateCustomer = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin) => {\r\n if (activeProductAldersTrin === 2) {\r\n return !AdultAgeOver99(birthDate, age, activeProductAldersTrin) &&\r\n !AdultAgeUnder18(birthDate, age, activeProductAldersTrin)\r\n }\r\n if (!activeProductSamlever) {\r\n return !AdultAgeOver99ForCustomer(birthDate, age, activeProductSamlever, activeProductAldersTrin) &&\r\n !CustomerUnder18YearsOld(birthDate, age, activeProductSamlever, activeProductAldersTrin)\r\n }\r\n return true\r\n}\r\n\r\nconst ValidStateBeneficiary = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin) => {\r\n if (activeProductAldersTrin === 1) {\r\n return !ChildAgeOverOrEqualTo18(birthDate, age, activeProductAldersTrin)\r\n }\r\n\r\n if (activeProductSamlever) {\r\n return !AdultAgeOver99ForForsikrede(birthDate, age, activeProductSamlever, activeProductAldersTrin) &&\r\n !ForsikredeUnder18YearsOld(birthDate, age, activeProductSamlever, activeProductAldersTrin)\r\n }\r\n return true\r\n}\r\n\r\nconst ValidStateCoinsured = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin) => {\r\n return !AgeOver99(birthDate, age) && !AgeUnder18(birthDate, age)\r\n}\r\n\r\nexport const GetErrorMessageForCustomer = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin, page) => {\r\n if (birthDateIsInTheFuture(birthDate, now)) {\r\n return GetFutureBirthDateErrorMessage()\r\n }\r\n if (AdultAgeOver99ForCustomer(birthDate, age, activeProductSamlever, activeProductAldersTrin)) {\r\n return CustomerIsOver99YearsOldMessage()\r\n }\r\n if (CustomerUnder18YearsOld(birthDate, age, activeProductSamlever, activeProductAldersTrin)) {\r\n return CustomerIsUnder18YearsOldMessage()\r\n }\r\n return ''\r\n}\r\n\r\nexport const GetErrorMessageForCoinsured = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin, page) => {\r\n if (birthDateIsInTheFuture(birthDate, now)) {\r\n return GetFutureBirthDateErrorMessage()\r\n }\r\n\r\n if (AgeOver99(birthDate, age)) {\r\n return MedforsikredeIsOver99YearsOldMessage()\r\n }\r\n\r\n if (AgeUnder18(birthDate, age)) {\r\n return MedforsikredeIsUnder18YearsOldMessage()\r\n }\r\n return ''\r\n}\r\n\r\nexport const GetErrorMessageForForsikrede = (birthDate, age, now, activeProductSamlever, activeProductAldersTrin, page) => {\r\n if (birthDateIsInTheFuture(birthDate, now)) {\r\n return GetFutureBirthDateErrorMessage()\r\n }\r\n if (AdultAgeOver99ForForsikrede(birthDate, age, activeProductSamlever, activeProductAldersTrin)) {\r\n return ForsikredeIsOver99YearsOldMessage()\r\n }\r\n if (ChildIsYoungAdult(birthDate, age) && activeProductAldersTrin === 1) {\r\n return ChildIsYoungAdultMessage()\r\n }\r\n if (ForsikredeUnder18YearsOld(birthDate, age, activeProductSamlever, activeProductAldersTrin)) {\r\n return ForsikredeIsUnder18YearsOldMessage()\r\n }\r\n if (ChildAgeOverOrEqualTo18(birthDate, age, activeProductAldersTrin)) {\r\n if (page != 'front') {\r\n ChildIsOver18YearsOldRemoveProductMessage()\r\n } else {\r\n return ChildIsOver18YearsOldMessage()\r\n }\r\n }\r\n return ''\r\n}\r\n\r\nexport const birthDateIsInTheFuture = (birthDate, now) => {\r\n return birthDate && now && birthDate > now\r\n}\r\n\r\nexport const AgeOver99 = (birthDate, age) => {\r\n return birthDate && age > 99\r\n}\r\nexport const AdultAgeOver99 = (birthDate, age, activeProductAlderTrin) => {\r\n return birthDate && age > 99 && activeProductAlderTrin == 2\r\n}\r\nexport const AgeUnder18 = (birthDate, age) => {\r\n return birthDate && age < 18\r\n}\r\n\r\nexport const AdultAgeUnder18 = (birthDate, age, activeProductAlderTrin) => {\r\n return birthDate && age < 18 && activeProductAlderTrin == 2\r\n}\r\n\r\nexport const ChildAgeOverOrEqualTo18 = (birthDate, age, activeProductAlderTrin) => {\r\n return birthDate && age >= 18 && activeProductAlderTrin == 1\r\n}\r\n\r\nexport const AdultAgeOver99ForCustomer = (birthDate, age, activeProductSamlever, activeProductAldersTrin) => {\r\n return AdultAgeOver99(birthDate, age, activeProductAldersTrin) && !activeProductSamlever\r\n}\r\n\r\nexport const AdultAgeOver99ForForsikrede = (birthDate, age, activeProductSamlever, activeProductAldersTrin) => {\r\n return AdultAgeOver99(birthDate, age, activeProductAldersTrin) && activeProductSamlever == true\r\n}\r\n\r\nexport const ForsikredeUnder18YearsOld = (birthDate, age, activeProductSamlever, activeProductAldersTrin) => {\r\n return AdultAgeUnder18(birthDate, age, activeProductAldersTrin) && activeProductSamlever == true\r\n}\r\n\r\nexport const CustomerUnder18YearsOld = (birthDate, age, activeProductSamlever, activeProductAldersTrin) => {\r\n return AdultAgeUnder18(birthDate, age, activeProductAldersTrin) && !activeProductSamlever\r\n}\r\n\r\nexport const ChildIs15YearsOld = (birthDate, age) => {\r\n return birthDate && age == 15\r\n}\r\n\r\nexport const ChildIsYoungAdult = (birthDate, age) => {\r\n return birthDate && age > 15 && age < 18\r\n}\r\n","import { app } from './../dk-ifshop-application'\r\n\r\nexport const cprForSamleverIsTheSameAsCustomerErrorMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_CPR_IS_THE_SAME_FOR_CUSTOMER_AND_SPOUSE',\r\n 'Cpr-nummeret på den forsikrede, må ikke være det samme som på den person, der køber forsikringen.'\r\n )\r\n}\r\nexport const GetFutureBirthDateErrorMessage = () => {\r\n return app.getFejlKodeText('CLIENT-ULYKKE_FOEDSELSDATO_FOR_TIDLIG',\r\n 'Den angivne fødselsdato ligger fremme i tiden.')\r\n}\r\n\r\nexport const CustomerIsOver99YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-forsikredeOVER_99',\r\n 'Du kan ikke blive forsikret igennem denne shop, hvis du er over 99 år'\r\n )\r\n}\r\n\r\nexport const ForsikredeIsOver99YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-samleverOVER99',\r\n 'Du kan ikke forsikre en samlever over 99 år'\r\n )\r\n}\r\n\r\nexport const MedforsikredeIsOver99YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-medforsikretOVER99',\r\n 'Du kan ikke have en medforsikret over 99 år'\r\n )\r\n}\r\n\r\nexport const ForsikredeIsUnder18YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_VOKSEN_SAMLEVER_UNDER_18',\r\n 'Du kan ikke forsikre en ægtefælle eller samlever, der er under 18 år.'\r\n )\r\n}\r\n\r\nexport const MedforsikredeIsUnder18YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_VOKSEN_MEDFORSIKRET_UNDER_18',\r\n 'Du kan ikke have en medforsikret, der er under 18 år.'\r\n )\r\n}\r\nexport const CustomerIsUnder18YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_VOKSEN_UNDER_18',\r\n 'Du kan ikke købe en Voksenforsikring, hvis du er under 18 år. Dine forældre skal i stedet købe en Børneforsikring, som senere ændrer sig til en Voksenforsikring.'\r\n )\r\n}\r\n\r\nexport const ChildIsOver18YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_BARN_OVER_18',\r\n 'Er dit barn 18 år eller derover, skal han eller hun selv købe forsikringen.'\r\n )\r\n}\r\n\r\nexport const ChildIs15YearsOldMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_KRAV_OM_HELBREDSOPLYSNINGER_BARN',\r\n 'Køb af den tilbudte forsikring er betinget af at vi har modtaget helbredsoplysninger inden barnet fylder 16.'\r\n )\r\n}\r\n\r\nexport const ChildIsYoungAdultMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-CHILD_ACCIDENT_CPR_OVER_16',\r\n 'Det indtastede CPR-nummer matcher ikke fødselsdatoen, der er indtastet. Du skal udfylde CPR-nummeret for det barn, du ønsker at forsikre.'\r\n )\r\n}\r\n\r\nexport const ChildIsOver18YearsOldRemoveProductMessage = () => {\r\n return app.getFejlKodeText(\r\n 'CLIENT-ULYKKE_BARN_OVER_18_SLET_PRODUKT',\r\n 'Ulykkesforsikring Barn og Børneforsikring kan kun købes til børn under 18 år. Dit barn er over 18 år og dermed myndig, og skal derfor selv købe en ulykkesforsikring til voksne.'\r\n )\r\n}\r\n","/* JSON */\r\n\r\n$.widget('dawa.dawaautocompletev2', {\r\n options: {\r\n jsonp: !('withCredentials' in (new XMLHttpRequest())),\r\n baseUrl: `${window.ifws_shopHostUrl}api/dawa`,\r\n minLength: 2,\r\n delay: 0,\r\n autoFocus: true,\r\n timeout: 10000,\r\n error: null,\r\n params: {},\r\n fuzzy: true,\r\n stormodtagerpostnumre: true,\r\n prefillValue: ''\r\n },\r\n\r\n _create: function () {\r\n const element = this.element\r\n const options = this.options\r\n const targetType = 'adresse'\r\n const autocompleteWidget = this\r\n let caretpos = null\r\n let adgangsadresseid = null\r\n let skipVejnavn = false\r\n let hasAddress = false\r\n let usingDawa = true\r\n const cache = {}\r\n let retries = 0\r\n\r\n function debounce (func, wait, immediate) {\r\n let timeout\r\n return function () {\r\n const context = this; const args = arguments\r\n const later = function () {\r\n timeout = null\r\n if (!immediate) func.apply(context, args)\r\n }\r\n const callNow = immediate && !timeout\r\n clearTimeout(timeout)\r\n timeout = setTimeout(later, wait)\r\n if (callNow) func.apply(context, args)\r\n }\r\n }\r\n\r\n // perform a GET request to DAWA autocomplete, caching the response\r\n function get (params, cb) {\r\n const stringifiedParams = JSON.stringify(params)\r\n if (cache[stringifiedParams]) {\r\n return cb(cache[stringifiedParams])\r\n }\r\n $.ajax({\r\n url: options.baseUrl + '/autocomplete',\r\n dataType: options.jsonp ? 'jsonp' : 'json',\r\n contentType: 'application/json',\r\n data: $.extend({}, params, options.params),\r\n timeout: options.timeout,\r\n success: function (data) {\r\n retries = 0\r\n cache[stringifiedParams] = JSON.parse(data)\r\n cb(JSON.parse(data))\r\n },\r\n error: function () {\r\n retries++\r\n\r\n if (retries < 3) {\r\n get(params, cb)\r\n } else {\r\n retries = 0\r\n }\r\n }\r\n })\r\n }\r\n\r\n function stormodtagerAdresseTekst (data) {\r\n let adresse = data.vejnavn\r\n if (data.husnr) {\r\n adresse += ' ' + data.husnr\r\n }\r\n if (data.etage || data.dør) {\r\n adresse += ','\r\n }\r\n if (data.etage) {\r\n adresse += ' ' + data.etage + '.'\r\n }\r\n if (data.dør) {\r\n adresse += ' ' + data.dør\r\n }\r\n adresse += ', '\r\n if (data.supplerendebynavn) {\r\n adresse += data.supplerendebynavn + ', '\r\n }\r\n adresse += data.stormodtagerpostnr + ' ' + data.stormodtagerpostnrnavn\r\n return adresse\r\n }\r\n\r\n function getAutocompleteResponse (type, q, currentCaretPos, d, cb) {\r\n const params = { q, type, caretpos: currentCaretPos, dataSource: d }\r\n if (options.fuzzy) {\r\n params.fuzzy = ''\r\n }\r\n if (adgangsadresseid) {\r\n params.adgangsadresseid = adgangsadresseid\r\n }\r\n if (skipVejnavn) {\r\n params.startfra = 'adgangsadresse'\r\n }\r\n skipVejnavn = false\r\n\t\t hasAddress = true\r\n const adgangsadresseRestricted = !!adgangsadresseid\r\n\r\n // Vi begrænser kun til en bestemt adgangsadresseid én gang\r\n adgangsadresseid = null\r\n\r\n get(params, function (result) {\r\n // eslint-disable-next-line no-constant-condition\r\n if (typeof result === 'string') {\r\n // an indicator that we have been deliver edi json\r\n result = JSON.parse(result)\r\n usingDawa = false\r\n } else {\r\n usingDawa = true\r\n }\r\n\r\n if (!Array.isArray(result)) {\r\n console.error('DAWA autocomplete returned invalid result', result)\r\n return\r\n }\r\n const processedResult = result.reduce(function (memo, row) {\r\n if ((row.type === 'adgangsadresse' || row.type === 'adresse') && row.data.stormodtagerpostnr) {\r\n // Vi har modtaget et stormodtagerpostnr. Her vil vi muligvis gerne vise stormodtagerpostnummeret\r\n const stormodtagerEntry = jQuery.extend({}, row)\r\n stormodtagerEntry.tekst = stormodtagerAdresseTekst(row.data)\r\n stormodtagerEntry.forslagstekst = stormodtagerEntry.tekst\r\n\r\n let rows = []\r\n // Omvendt, hvis brugeren har indtastet den almindelige adresse eksakt, så er der ingen\r\n // grund til at vise stormodtagerudgaven\r\n if (q !== stormodtagerEntry.tekst) {\r\n rows.push(row)\r\n }\r\n\r\n // Hvis brugeren har indtastet stormodtagerudgaven af adressen eksakt, så viser vi\r\n // ikke den almindelige udgave\r\n if (q !== row.tekst) {\r\n rows.push(stormodtagerEntry)\r\n }\r\n\r\n // brugeren har indtastet stormodtagerpostnummeret, såvi viser stormodtager udgaven først.\r\n if (rows.length > 1 && q.indexOf(row.data.stormodtagerpostnr) !== -1) {\r\n rows = [rows[1], rows[0]]\r\n }\r\n memo = memo.concat(rows)\r\n } else {\r\n memo.push(row)\r\n }\r\n return memo\r\n }, []).map(function (row) {\r\n return {\r\n label: row.forslagstekst,\r\n value: row\r\n }\r\n })\r\n if (adgangsadresseRestricted && processedResult.length === 1) {\r\n // der er kun en adresse på adgangsadressen\r\n element.val(processedResult[0].value.tekst)\r\n element.selectionStart = caretpos = processedResult[0].value.caretpos\r\n element.autocomplete('close')\r\n autocompleteWidget._trigger('select', null, processedResult[0].value)\r\n hasAddress = true\r\n } else {\r\n\t\t\t\t cb(processedResult)\r\n\t\t\t\t hasAddress = false\r\n }\r\n })\r\n }\r\n\r\n const autocompleteOptions = $.extend({}, options, {\r\n source: debounce(function (request, response) {\r\n const q = request.term\r\n const d = request.d\r\n caretpos = element[0].selectionStart\r\n return getAutocompleteResponse(targetType, q, caretpos, d, response)\r\n }, 250),\r\n select: function (event, ui) {\r\n if (event) {\r\n event.preventDefault()\r\n }\r\n if (ui) {\r\n const item = ui.item.value\r\n const edi = item.d\r\n element.val(item.tekst)\r\n element[0].selectionStart = element[0].selectionEnd = caretpos = item.caretPos\r\n if (item.type !== targetType) {\r\n if (item.type === 'adgangsadresse') {\r\n adgangsadresseid = item.data.id\r\n }\r\n if (item.type === 'vejnavn') {\r\n skipVejnavn = true\r\n }\r\n setTimeout(function () {\r\n if (element && element.autocomplete) {\r\n element.autocomplete('search')\r\n }\r\n })\r\n\r\n if (edi) {\r\n autocompleteWidget._trigger('select', null, item)\r\n }\r\n } else {\r\n if (element && element.autocomplete) {\r\n element.autocomplete('close')\r\n }\r\n if (autocompleteWidget && autocompleteWidget._trigger) {\r\n autocompleteWidget._trigger('select', null, item)\r\n }\r\n }\r\n }\r\n }\r\n })\r\n\r\n element.autocomplete(autocompleteOptions)\r\n element.on('autocompletefocus', function (event) {\r\n event.preventDefault()\r\n })\r\n\r\n // der er tilsyneladende ingen skudsikker måde at få en event når\r\n // caret positionen ændrer sig, så vi benytter en timer i stedet.\r\n setInterval(function () {\r\n const currentCaretpos = element[0].selectionStart\r\n if (element[0] === document.activeElement && caretpos !== currentCaretpos) {\r\n caretpos = currentCaretpos\r\n element.autocomplete('search')\r\n }\r\n }, 100)\r\n\r\n if (options.prefillValue && options.prefillValue.length > 0) {\r\n element.val(options.prefillValue)\r\n }\r\n }\r\n})\r\n","\r\n+function ($) {\r\n \"use strict\";\r\n\r\n // MODAL CLASS DEFINITION\r\n // ======================\r\n\r\n var Modal = function (element, options) {\r\n this.options = options\r\n this.$element = $(element)\r\n this.$backdrop =\r\n this.isShown = null\r\n\r\n if (this.options.remote) this.$element.load(this.options.remote)\r\n }\r\n\r\n Modal.DEFAULTS = {\r\n backdrop: true\r\n , keyboard: true\r\n , show: true\r\n }\r\n\r\n Modal.prototype.toggle = function (_relatedTarget) {\r\n return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\r\n }\r\n\r\n Modal.prototype.show = function (_relatedTarget) {\r\n var that = this\r\n var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\r\n\r\n this.$element.trigger(e)\r\n\r\n if (this.isShown || e.isDefaultPrevented()) return\r\n\r\n this.isShown = true\r\n\r\n this.escape()\r\n\r\n this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\r\n\r\n this.backdrop(function () {\r\n var transition = $.support.transition && that.$element.hasClass('fade')\r\n\r\n if (!that.$element.parent().length) {\r\n that.$element.appendTo(document.body) // don't move modals dom position\r\n }\r\n\r\n that.$element.show()\r\n\r\n if (transition) {\r\n that.$element[0].offsetWidth // force reflow\r\n }\r\n\r\n that.$element\r\n .addClass('in')\r\n .attr('aria-hidden', false)\r\n\r\n that.enforceFocus()\r\n\r\n var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\r\n\r\n transition ?\r\n that.$element.find('.modal-dialog') // wait for modal to slide in\r\n .one($.support.transition.end, function () {\r\n that.$element.focus().trigger(e)\r\n })\r\n .emulateTransitionEnd(300) :\r\n that.$element.focus().trigger(e)\r\n })\r\n }\r\n\r\n Modal.prototype.hide = function (e) {\r\n if (e) e.preventDefault()\r\n\r\n e = $.Event('hide.bs.modal')\r\n\r\n this.$element.trigger(e)\r\n\r\n if (!this.isShown || e.isDefaultPrevented()) return\r\n\r\n this.isShown = false\r\n\r\n this.escape()\r\n\r\n $(document).off('focusin.bs.modal')\r\n\r\n this.$element\r\n .removeClass('in')\r\n .attr('aria-hidden', true)\r\n .off('click.dismiss.modal')\r\n\r\n $.support.transition && this.$element.hasClass('fade') ?\r\n this.$element\r\n .one($.support.transition.end, $.proxy(this.hideModal, this))\r\n .emulateTransitionEnd(300) :\r\n this.hideModal()\r\n }\r\n\r\n Modal.prototype.enforceFocus = function () {\r\n $(document)\r\n .off('focusin.bs.modal') // guard against infinite focus loop\r\n .on('focusin.bs.modal', $.proxy(function (e) {\r\n if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\r\n this.$element.focus()\r\n }\r\n }, this))\r\n }\r\n\r\n Modal.prototype.escape = function () {\r\n if (this.isShown && this.options.keyboard) {\r\n this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\r\n e.which == 27 && this.hide()\r\n }, this))\r\n } else if (!this.isShown) {\r\n this.$element.off('keyup.dismiss.bs.modal')\r\n }\r\n }\r\n\r\n Modal.prototype.hideModal = function () {\r\n var that = this\r\n this.$element.hide()\r\n this.backdrop(function () {\r\n that.removeBackdrop()\r\n that.$element.trigger('hidden.bs.modal')\r\n })\r\n }\r\n\r\n Modal.prototype.removeBackdrop = function () {\r\n this.$backdrop && this.$backdrop.remove()\r\n this.$backdrop = null\r\n }\r\n\r\n Modal.prototype.backdrop = function (callback) {\r\n var that = this\r\n var animate = this.$element.hasClass('fade') ? 'fade' : ''\r\n\r\n if (this.isShown && this.options.backdrop) {\r\n var doAnimate = $.support.transition && animate\r\n\r\n this.$backdrop = $('
    ')\r\n .appendTo(document.body)\r\n\r\n this.$element.on('click.dismiss.modal', $.proxy(function (e) {\r\n if (e.target !== e.currentTarget) return\r\n this.options.backdrop == 'static'\r\n ? this.$element[0].focus.call(this.$element[0])\r\n : this.hide.call(this)\r\n }, this))\r\n\r\n if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\r\n\r\n this.$backdrop.addClass('in')\r\n\r\n if (!callback) return\r\n\r\n doAnimate ?\r\n this.$backdrop\r\n .one($.support.transition.end, callback)\r\n .emulateTransitionEnd(150) :\r\n callback()\r\n\r\n } else if (!this.isShown && this.$backdrop) {\r\n this.$backdrop.removeClass('in')\r\n\r\n $.support.transition && this.$element.hasClass('fade') ?\r\n this.$backdrop\r\n .one($.support.transition.end, callback)\r\n .emulateTransitionEnd(150) :\r\n callback()\r\n\r\n } else if (callback) {\r\n callback()\r\n }\r\n }\r\n\r\n\r\n // MODAL PLUGIN DEFINITION\r\n // =======================\r\n\r\n var old = $.fn.modal\r\n\r\n $.fn.modal = function (option, _relatedTarget) {\r\n return this.each(function () {\r\n var $this = $(this)\r\n var data = $this.data('bs.modal')\r\n var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\r\n\r\n if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\r\n if (typeof option == 'string') data[option](_relatedTarget)\r\n else if (options.show) data.show(_relatedTarget)\r\n })\r\n }\r\n\r\n $.fn.modal.Constructor = Modal\r\n\r\n\r\n // MODAL NO CONFLICT\r\n // =================\r\n\r\n $.fn.modal.noConflict = function () {\r\n $.fn.modal = old\r\n return this\r\n }\r\n\r\n\r\n // MODAL DATA-API\r\n // ==============\r\n\r\n $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\r\n var $this = $(this)\r\n var href = $this.attr('href')\r\n var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\r\n var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\r\n\r\n e.preventDefault()\r\n\r\n $target\r\n .modal(option, this)\r\n .one('hide', function () {\r\n $this.is(':visible') && $this.focus()\r\n })\r\n })\r\n\r\n $(document)\r\n .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })\r\n .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\r\n\r\n}(window.jQuery);\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * bootbox.js v4.0.0\r\n *\r\n * http://bootboxjs.com/license.txt\r\n */\r\n// @see https://github.com/makeusabrew/bootbox/issues/71\r\nwindow.bootbox = window.bootbox || (function init($, undefined) {\r\n \"use strict\";\r\n\r\n // the base DOM structure needed to create a modal\r\n var templates = {\r\n dialog:\r\n \"\",\r\n header:\r\n \"\",\r\n footer:\r\n \"\",\r\n closeButton:\r\n \"\",\r\n form:\r\n \"
    \",\r\n inputs: {\r\n text:\r\n \"\"\r\n }\r\n };\r\n\r\n // cache a reference to the jQueryfied body element\r\n //var appendTo = $(\"body\"); //CUSTOMIZED FOR IF-SHOP\r\n\r\n var defaults = {\r\n // default language\r\n locale: \"en\",\r\n // show backdrop or not\r\n backdrop: true,\r\n // animate the modal in/out\r\n animate: true,\r\n // additional class string applied to the top level dialog\r\n className: null,\r\n // whether or not to include a close button\r\n closeButton: true,\r\n // show the dialog immediately by default\r\n show: true\r\n };\r\n\r\n // our public object; augmented after our private API\r\n var exports = {};\r\n\r\n /**\r\n * @private\r\n */\r\n function _t(key) {\r\n var locale = locales[defaults.locale];\r\n return locale ? locale[key] : locales.en[key];\r\n }\r\n\r\n function processCallback(e, dialog, callback) {\r\n e.preventDefault();\r\n\r\n // by default we assume a callback will get rid of the dialog,\r\n // although it is given the opportunity to override this\r\n\r\n // so, if the callback can be invoked and it *explicitly returns false*\r\n // then we'll set a flag to keep the dialog active...\r\n var preserveDialog = $.isFunction(callback) && callback(e) === false;\r\n\r\n // ... otherwise we'll bin it\r\n if (!preserveDialog) {\r\n dialog.modal(\"hide\");\r\n }\r\n }\r\n\r\n function getKeyLength(obj) {\r\n // @TODO defer to Object.keys(x).length if available?\r\n var k, t = 0;\r\n for (k in obj) {\r\n t++;\r\n }\r\n return t;\r\n }\r\n\r\n function each(collection, iterator) {\r\n var index = 0;\r\n $.each(collection, function (key, value) {\r\n iterator(key, value, index++);\r\n });\r\n }\r\n\r\n function sanitize(options) {\r\n var buttons;\r\n var total;\r\n\r\n\r\n if (typeof options !== \"object\") {\r\n throw new Error(\"Please supply an object of options\");\r\n }\r\n\r\n if (!options.message) {\r\n throw new Error(\"Please specify a message\");\r\n }\r\n\r\n // make sure any supplied options take precedence over defaults\r\n options = $.extend({}, defaults, options);\r\n\r\n if (!options.buttons) {\r\n options.buttons = {};\r\n }\r\n\r\n // we only support Bootstrap's \"static\" and false backdrop args\r\n // supporting true would mean you could dismiss the dialog without\r\n // explicitly interacting with it\r\n options.backdrop = options.backdrop ? \"static\" : false;\r\n\r\n buttons = options.buttons;\r\n\r\n total = getKeyLength(buttons);\r\n\r\n each(buttons, function (key, button, index) {\r\n\r\n if ($.isFunction(button)) {\r\n // short form, assume value is our callback. Since button\r\n // isn't an object it isn't a reference either so re-assign it\r\n button = buttons[key] = {\r\n callback: button\r\n };\r\n }\r\n\r\n // before any further checks make sure by now button is the correct type\r\n if ($.type(button) !== \"object\") {\r\n throw new Error(\"button with key \" + key + \" must be an object\");\r\n }\r\n\r\n if (!button.label) {\r\n // the lack of an explicit label means we'll assume the key is good enough\r\n button.label = key;\r\n }\r\n\r\n if (!button.className) {\r\n if (total <= 2 && index === total - 1) {\r\n // always add a primary to the main option in a two-button dialog\r\n button.className = \"btn-primary\";\r\n } else {\r\n button.className = \"btn-default\";\r\n }\r\n }\r\n });\r\n\r\n return options;\r\n }\r\n\r\n function mapArguments(args, properties) {\r\n var argn = args.length;\r\n var options = {};\r\n\r\n if (argn < 1 || argn > 2) {\r\n throw new Error(\"Invalid argument length\");\r\n }\r\n\r\n if (argn === 2 || typeof args[0] === \"string\") {\r\n options[properties[0]] = args[0];\r\n options[properties[1]] = args[1];\r\n } else {\r\n options = args[0];\r\n }\r\n\r\n return options;\r\n }\r\n\r\n function mergeArguments(defaults, args, properties) {\r\n return $.extend(true, {}, defaults, mapArguments(args, properties));\r\n }\r\n\r\n function mergeButtons(labels, args, properties) {\r\n return validateButtons(\r\n mergeArguments(createButtons.apply(null, labels), args, properties),\r\n labels\r\n );\r\n }\r\n\r\n function createLabels() {\r\n var buttons = {};\r\n\r\n for (var i = 0, j = arguments.length; i < j; i++) {\r\n var argument = arguments[i];\r\n var key = argument.toLowerCase();\r\n var value = argument.toUpperCase();\r\n\r\n buttons[key] = {\r\n label: _t(value)\r\n };\r\n }\r\n\r\n return buttons;\r\n }\r\n\r\n function createButtons() {\r\n return {\r\n buttons: createLabels.apply(null, arguments)\r\n };\r\n }\r\n\r\n function validateButtons(options, buttons) {\r\n var allowedButtons = {};\r\n each(buttons, function (key, value) {\r\n allowedButtons[value] = true;\r\n });\r\n\r\n each(options.buttons, function (key) {\r\n if (allowedButtons[key] === undefined) {\r\n throw new Error(\"button key \" + key + \" is not allowed (options are \" + buttons.join(\"\\n\") + \")\");\r\n }\r\n });\r\n\r\n return options;\r\n }\r\n\r\n exports.alert = function () {\r\n var options;\r\n\r\n options = mergeButtons([\"ok\"], arguments, [\"message\", \"callback\"]);\r\n\r\n if (options.callback && !$.isFunction(options.callback)) {\r\n throw new Error(\"alert requires callback property to be a function when provided\");\r\n }\r\n\r\n /**\r\n * overrides\r\n */\r\n options.buttons.ok.callback = options.onEscape = function () {\r\n if ($.isFunction(options.callback)) {\r\n return options.callback();\r\n }\r\n return true;\r\n };\r\n\r\n return exports.dialog(options);\r\n };\r\n\r\n exports.confirm = function () {\r\n var options;\r\n\r\n options = mergeButtons([\"cancel\", \"confirm\"], arguments, [\"message\", \"callback\"]);\r\n\r\n /**\r\n * overrides; undo anything the user tried to set they shouldn't have\r\n */\r\n options.buttons.cancel.callback = options.onEscape = function () {\r\n return options.callback(false);\r\n };\r\n\r\n options.buttons.confirm.callback = function () {\r\n return options.callback(true);\r\n };\r\n\r\n // confirm specific validation\r\n if (!$.isFunction(options.callback)) {\r\n throw new Error(\"confirm requires a callback\");\r\n }\r\n\r\n return exports.dialog(options);\r\n };\r\n\r\n exports.prompt = function () {\r\n var options;\r\n var defaults;\r\n var dialog;\r\n var form;\r\n var input;\r\n var shouldShow;\r\n\r\n // we have to create our form first otherwise\r\n // its value is undefined when gearing up our options\r\n // @TODO this could be solved by allowing message to\r\n // be a function instead...\r\n form = $(templates.form);\r\n\r\n defaults = {\r\n buttons: createLabels(\"cancel\", \"confirm\"),\r\n value: \"\"\r\n };\r\n\r\n options = validateButtons(\r\n mergeArguments(defaults, arguments, [\"title\", \"callback\"]),\r\n [\"cancel\", \"confirm\"]\r\n );\r\n\r\n // capture the user's show value; we always set this to false before\r\n // spawning the dialog to give us a chance to attach some handlers to\r\n // it, but we need to make sure we respect a preference not to show it\r\n shouldShow = (options.show === undefined) ? true : options.show;\r\n\r\n /**\r\n * overrides; undo anything the user tried to set they shouldn't have\r\n */\r\n options.message = form;\r\n\r\n options.buttons.cancel.callback = options.onEscape = function () {\r\n return options.callback(null);\r\n };\r\n\r\n options.buttons.confirm.callback = function () {\r\n return options.callback(input.val());\r\n };\r\n\r\n options.show = false;\r\n\r\n // prompt specific validation\r\n if (!options.title) {\r\n throw new Error(\"prompt requires a title\");\r\n }\r\n\r\n if (!$.isFunction(options.callback)) {\r\n throw new Error(\"prompt requires a callback\");\r\n }\r\n\r\n // create the input\r\n input = $(templates.inputs.text);\r\n input.val(options.value);\r\n\r\n // now place it in our form\r\n form.append(input);\r\n\r\n form.on(\"submit\", function (e) {\r\n e.preventDefault();\r\n // @TODO can we actually click *the* button object instead?\r\n // e.g. buttons.confirm.click() or similar\r\n dialog.find(\".btn-primary\").click();\r\n });\r\n\r\n dialog = exports.dialog(options);\r\n\r\n // clear the existing handler focusing the submit button...\r\n dialog.off(\"shown.bs.modal\");\r\n\r\n // ...and replace it with one focusing our input, if possible\r\n dialog.on(\"shown.bs.modal\", function () {\r\n input.focus();\r\n });\r\n\r\n if (shouldShow === true) {\r\n dialog.modal(\"show\");\r\n }\r\n\r\n return dialog;\r\n };\r\n\r\n exports.dialog = function (options) {\r\n options = sanitize(options);\r\n\r\n var dialog = $(templates.dialog);\r\n dialog.addClass(options.className); //CUSTOMIZED FOR IF-SHOP\r\n var body = dialog.find(\".modal-body\");\r\n var buttons = options.buttons;\r\n var buttonStr = \"\";\r\n var callbacks = {\r\n onEscape: options.onEscape\r\n };\r\n\r\n each(buttons, function (key, button) {\r\n\r\n // @TODO I don't like this string appending to itself; bit dirty. Needs reworking\r\n // can we just build up button elements instead? slower but neater. Then button\r\n // can just become a template too\r\n buttonStr += \"\";\r\n callbacks[key] = button.callback;\r\n });\r\n\r\n $(\"#\" + \"dk-ifshop-ShopContainer\").append(dialog); //CUSTOMIZED FOR IF-SHOP\r\n body.find(\".bootbox-body\").html(options.message);\r\n \r\n if (options.animate === true) {\r\n // dialog.addClass(\"fade\"); //CUSTOMIZED FOR IF-SHOP\r\n }\r\n\r\n if (options.className) {\r\n dialog.addClass(options.className);\r\n }\r\n\r\n if (options.title) {\r\n body.before(templates.header);\r\n }\r\n\r\n if (options.closeButton) {\r\n var closeButton = $(templates.closeButton);\r\n\r\n if (options.title) {\r\n dialog.find(\".modal-header\").prepend(closeButton);\r\n } else {\r\n closeButton.css(\"margin-top\", \"-29px\").prependTo(body);\r\n closeButton.css(\"margin-right\", \"-23px\").prependTo(body);\r\n }\r\n }\r\n\r\n if (options.title) {\r\n dialog.find(\".modal-title\").html(options.title);\r\n }\r\n\r\n if (buttonStr.length) {\r\n body.after(templates.footer);\r\n dialog.find(\".modal-footer\").html(buttonStr);\r\n }\r\n\r\n\r\n /**\r\n * Bootstrap event listeners; used handle extra\r\n * setup & teardown required after the underlying\r\n * modal has performed certain actions\r\n */\r\n\r\n dialog.on(\"hidden.bs.modal\", function (e) {\r\n // ensure we don't accidentally intercept hidden events triggered\r\n // by children of the current dialog. We shouldn't anymore now BS\r\n // namespaces its events; but still worth doing\r\n if (e.target === this) {\r\n dialog.remove();\r\n }\r\n });\r\n\r\n /*\r\n dialog.on(\"show.bs.modal\", function() {\r\n // sadly this doesn't work; show is called *just* before\r\n // the backdrop is added so we'd need a setTimeout hack or\r\n // otherwise... leaving in as would be nice\r\n if (options.backdrop) {\r\n dialog.next(\".modal-backdrop\").addClass(\"bootbox-backdrop\");\r\n }\r\n });\r\n */\r\n\r\n dialog.on(\"shown.bs.modal\", function () {\r\n dialog.find(\".btn-primary:first\").focus();\r\n });\r\n\r\n /**\r\n * Bootbox event listeners; experimental and may not last\r\n * just an attempt to decouple some behaviours from their\r\n * respective triggers\r\n */\r\n\r\n dialog.on(\"escape.close.bb\", function (e) {\r\n if (callbacks.onEscape) {\r\n processCallback(e, dialog, callbacks.onEscape);\r\n }\r\n });\r\n\r\n /**\r\n * Standard jQuery event listeners; used to handle user\r\n * interaction with our dialog\r\n */\r\n\r\n dialog.on(\"click\", \".modal-footer button\", function (e) {\r\n var callbackKey = $(this).data(\"bb-handler\");\r\n\r\n processCallback(e, dialog, callbacks[callbackKey]);\r\n\r\n });\r\n\r\n dialog.on(\"click\", \".bootbox-close-button\", function (e) {\r\n // onEscape might be falsy but that's fine; the fact is\r\n // if the user has managed to click the close button we\r\n // have to close the dialog, callback or not\r\n processCallback(e, dialog, callbacks.onEscape);\r\n });\r\n\r\n dialog.on(\"keyup\", function (e) {\r\n if (e.which === 27) {\r\n dialog.trigger(\"escape.close.bb\");\r\n }\r\n });\r\n\r\n // the remainder of this method simply deals with adding our\r\n // dialogent to the DOM, augmenting it with Bootstrap's modal\r\n // functionality and then giving the resulting object back\r\n // to our caller\r\n\r\n \r\n dialog.modal({\r\n backdrop: options.backdrop,\r\n keyboard: false,\r\n show: false\r\n });\r\n\r\n if (options.show) {\r\n dialog.modal(\"show\");\r\n }\r\n\r\n // @TODO should we return the raw element here or should\r\n // we wrap it in an object on which we can expose some neater\r\n // methods, e.g. var d = bootbox.alert(); d.hide(); instead\r\n // of d.modal(\"hide\");\r\n\r\n /*\r\n function BBDialog(elem) {\r\n this.elem = elem;\r\n }\r\n \r\n BBDialog.prototype = {\r\n hide: function() {\r\n return this.elem.modal(\"hide\");\r\n },\r\n show: function() {\r\n return this.elem.modal(\"show\");\r\n }\r\n };\r\n */\r\n\r\n return dialog;\r\n\r\n };\r\n\r\n exports.setDefaults = function (values) {\r\n $.extend(defaults, values);\r\n };\r\n\r\n exports.hideAll = function () {\r\n $(\".bootbox\").modal(\"hide\");\r\n };\r\n\r\n\r\n /**\r\n * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are\r\n * unlikely to be required. If this gets too large it can be split out into separate JS files.\r\n */\r\n var locales = {\r\n br: {\r\n OK: \"OK\",\r\n CANCEL: \"Cancelar\",\r\n CONFIRM: \"Sim\"\r\n },\r\n da: {\r\n OK: \"OK\",\r\n CANCEL: \"Annuller\",\r\n CONFIRM: \"Accepter\"\r\n },\r\n de: {\r\n OK: \"OK\",\r\n CANCEL: \"Abbrechen\",\r\n CONFIRM: \"Akzeptieren\"\r\n },\r\n en: {\r\n OK: \"OK\",\r\n CANCEL: \"Cancel\",\r\n CONFIRM: \"OK\"\r\n },\r\n es: {\r\n OK: \"OK\",\r\n CANCEL: \"Cancelar\",\r\n CONFIRM: \"Aceptar\"\r\n },\r\n fi: {\r\n OK: \"OK\",\r\n CANCEL: \"Peruuta\",\r\n CONFIRM: \"OK\"\r\n },\r\n fr: {\r\n OK: \"OK\",\r\n CANCEL: \"Annuler\",\r\n CONFIRM: \"D'accord\"\r\n },\r\n it: {\r\n OK: \"OK\",\r\n CANCEL: \"Annulla\",\r\n CONFIRM: \"Conferma\"\r\n },\r\n nl: {\r\n OK: \"OK\",\r\n CANCEL: \"Annuleren\",\r\n CONFIRM: \"Accepteren\"\r\n },\r\n pl: {\r\n OK: \"OK\",\r\n CANCEL: \"Anuluj\",\r\n CONFIRM: \"Potwierdź\"\r\n },\r\n ru: {\r\n OK: \"OK\",\r\n CANCEL: \"Отмена\",\r\n CONFIRM: \"Применить\"\r\n },\r\n zh_CN: {\r\n OK: \"OK\",\r\n CANCEL: \"取消\",\r\n CONFIRM: \"确认\"\r\n },\r\n zh_TW: {\r\n OK: \"OK\",\r\n CANCEL: \"取消\",\r\n CONFIRM: \"確認\"\r\n }\r\n };\r\n\r\n exports.init = function (_$) {\r\n window.bootbox = init(_$ || $);\r\n };\r\n\r\n return exports;\r\n\r\n}(window.jQuery));","/* eslint-disable no-unused-vars */\r\n/*\r\n * jQuery clueTip plugin\r\n * Version 0.9.8 (05/22/2008)\r\n * @requires jQuery v1.1.4+\r\n * @requires Dimensions plugin (for jQuery versions < 1.2.5)\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n *\r\n */\r\n; (function ($) {\r\n /*\r\n * @name clueTip\r\n * @type jQuery\r\n * @cat Plugins/tooltip\r\n * @return jQuery\r\n * @author Karl Swedberg\r\n *\r\n * @credit Inspired by Cody Lindley's jTip (http://www.codylindley.com)\r\n * @credit Thanks to the following people for their many and varied contributions:\r\n Shelane Enos, Glen Lipka, Hector Santos, Torben Schreiter, Dan G. Switzer, J�rn Zaefferer\r\n * @credit Thanks to Jonathan Chaffer, as always, for help with the hard parts. :-)\r\n */\r\n\r\n /**\r\n *\r\n * Displays a highly customizable tooltip when the user hovers (default) or clicks (optional) the matched element.\r\n * By default, the clueTip plugin loads a page indicated by the \"rel\" attribute via ajax and displays its contents.\r\n * If a \"title\" attribute is specified, its value is used as the clueTip's heading.\r\n * The attribute to be used for both the body and the heading of the clueTip is user-configurable.\r\n * Optionally, the clueTip's body can display content from an element on the same page.\r\n * * Just indicate the element's id (e.g. \"#some-id\") in the rel attribute.\r\n * Optionally, the clueTip's body can display content from the title attribute, when a delimiter is indicated.\r\n * * The string before the first instance of the delimiter is set as the clueTip's heading.\r\n * * All subsequent strings are wrapped in separate DIVs and placed in the clueTip's body.\r\n * The clueTip plugin allows for many, many more options. Pleasee see the examples and the option descriptions below...\r\n *\r\n *\r\n * @example $('#tip).cluetip();\r\n * @desc This is the most basic clueTip. It displays a 275px-wide clueTip on mouseover of the element with an ID of \"tip.\" On mouseout of the element, the clueTip is hidden.\r\n *\r\n *\r\n * @example $('a.clue').cluetip({\r\n * hoverClass: 'highlight',\r\n * sticky: true,\r\n * closePosition: 'bottom',\r\n * closeText: '\"close\"',\r\n * truncate: 60,\r\n * ajaxSettings: {\r\n * type: 'POST'\r\n * }\r\n * });\r\n * @desc Displays a clueTip on mouseover of all elements with class=\"clue\". The hovered element gets a class of \"highlight\" added to it (so that it can be styled appropriately. This is esp. useful for non-anchor elements.). The clueTip is \"sticky,\" which means that it will not be hidden until the user either clicks on its \"close\" text/graphic or displays another clueTip. The \"close\" text/graphic is set to diplay at the bottom of the clueTip (default is top) and display an image rather than the default \"Close\" text. Moreover, the body of the clueTip is truncated to the first 60 characters, which are followed by an ellipsis (...). Finally, the clueTip retrieves the content using POST rather than the $.ajax method's default \"GET.\"\r\n *\r\n * More examples can be found at http://plugins.learningjquery.com/cluetip/demo/\r\n *\r\n * Full list of options/settings can be found at the bottom of this file and at http://plugins.learningjquery.com/cluetip/\r\n */\r\n\r\n let $cluetip, $cluetipInner, $cluetipOuter, $cluetipTitle, $cluetipArrows, $dropShadow, imgCount\r\n $.fn.cluetip = function (js, options) {\r\n if (typeof js == 'object') {\r\n options = js\r\n js = null\r\n }\r\n return this.each(function (index) {\r\n const $this = $(this)\r\n\r\n // support metadata plugin (v1.0 and 2.0)\r\n const opts = $.extend(false, {}, $.fn.cluetip.defaults, options || {}, $.metadata ? $this.metadata() : $.meta ? $this.data() : {})\r\n\r\n // start out with no contents (for ajax activation)\r\n let cluetipContents = false\r\n const cluezIndex = parseInt(opts.cluezIndex, 10) - 1\r\n let isActive = false; let closeOnDelay = 0\r\n\r\n // create the cluetip divs\r\n if (!$('#cluetip').length) {\r\n $cluetipInner = $('
    ')\r\n $cluetipTitle = $('

    ')\r\n $cluetipOuter = $('
    ').append($cluetipInner).prepend($cluetipTitle)\r\n $cluetip = $('
    ').css({ zIndex: opts.cluezIndex })\r\n .append($cluetipOuter).append('
    ')[insertionType](insertionElement).hide()\r\n $('
    ').css({ position: 'absolute', zIndex: cluezIndex - 1 })\r\n .insertBefore('#cluetip').hide()\r\n $cluetip.css({ position: 'absolute', zIndex: cluezIndex })\r\n $cluetipOuter.css({ position: 'relative', zIndex: cluezIndex + 1 })\r\n $cluetipArrows = $('
    ').css({ zIndex: cluezIndex + 1 }).appendTo('#cluetip')\r\n }\r\n const dropShadowSteps = (opts.dropShadow) ? +opts.dropShadowSteps : 0\r\n if (!$dropShadow) {\r\n $dropShadow = $([])\r\n for (let i = 0; i < dropShadowSteps; i++) {\r\n $dropShadow = $dropShadow.add($('
    ').css({ zIndex: cluezIndex - i - 1, opacity: 0.1, top: 1 + i, left: 1 + i }))\r\n };\r\n $dropShadow.css({ position: 'absolute', backgroundColor: '#000' })\r\n .prependTo($cluetip)\r\n }\r\n const tipAttribute = $this.attr(opts.attribute); const ctClass = opts.cluetipClass\r\n if (!tipAttribute && !opts.splitTitle && !js) return true\r\n // if hideLocal is set to true, on DOM ready hide the local content that will be displayed in the clueTip\r\n if (opts.local && opts.hideLocal) { $(tipAttribute + ':first').hide() }\r\n const tOffset = parseInt(opts.topOffset, 10); const lOffset = parseInt(opts.leftOffset, 10)\r\n // vertical measurement variables\r\n let tipHeight, wHeight\r\n const defHeight = isNaN(parseInt(opts.height, 10)) ? 'auto' : (/\\D/g).test(opts.height) ? opts.height : opts.height + 'px'\r\n let sTop, linkTop, posY, tipY, mouseY, baseline\r\n // horizontal measurement variables\r\n const tipInnerWidth = isNaN(parseInt(opts.width, 10)) ? 275 : parseInt(opts.width, 10)\r\n const tipWidth = tipInnerWidth + (parseInt($cluetip.css('paddingLeft')) || 0) + (parseInt($cluetip.css('paddingRight')) || 0) + dropShadowSteps\r\n const linkWidth = this.offsetWidth\r\n let linkLeft, posX, tipX, mouseX, winWidth\r\n\r\n // parse the title\r\n let tipParts\r\n let tipTitle = (opts.attribute != 'title') ? $this.attr(opts.titleAttribute) : ''\r\n if (opts.splitTitle) {\r\n if (tipTitle == undefined) { tipTitle = '' }\r\n tipParts = tipTitle.split(opts.splitTitle)\r\n tipTitle = tipParts.shift()\r\n }\r\n let localContent\r\n\r\n /** *************************************\r\n * ACTIVATION\r\n ****************************************/\r\n\r\n // activate clueTip\r\n const activate = function (event) {\r\n if (!opts.onActivate($this)) {\r\n return false\r\n }\r\n isActive = true\r\n $cluetip.removeClass().css({ width: tipInnerWidth })\r\n if (tipAttribute == $this.attr('href')) {\r\n $this.css('cursor', opts.cursor)\r\n }\r\n $this.attr('title', '')\r\n if (opts.hoverClass) {\r\n $this.addClass(opts.hoverClass)\r\n }\r\n linkTop = posY = $this.offset().top\r\n linkLeft = $this.offset().left\r\n mouseX = event.pageX\r\n mouseY = event.pageY\r\n if ($this[0].tagName.toLowerCase() != 'area') {\r\n sTop = $(document).scrollTop()\r\n winWidth = $(window).width()\r\n }\r\n // position clueTip horizontally\r\n if (opts.positionBy == 'fixed') {\r\n posX = linkWidth + linkLeft + lOffset\r\n $cluetip.css({ left: posX })\r\n } else {\r\n posX = (linkWidth > linkLeft && linkLeft > tipWidth) ||\r\n linkLeft + linkWidth + tipWidth + lOffset > winWidth\r\n ? linkLeft - tipWidth - lOffset\r\n : linkWidth + linkLeft + lOffset\r\n if ($this[0].tagName.toLowerCase() == 'area' || opts.positionBy == 'mouse' || linkWidth + tipWidth > winWidth) { // position by mouse\r\n if (mouseX + 20 + tipWidth > winWidth) {\r\n $cluetip.addClass(' cluetip-' + ctClass)\r\n posX = (mouseX - tipWidth - lOffset) >= 0 ? mouseX - tipWidth - lOffset - parseInt($cluetip.css('marginLeft'), 10) + parseInt($cluetipInner.css('marginRight'), 10) : mouseX - (tipWidth / 2)\r\n } else {\r\n posX = mouseX + lOffset\r\n }\r\n }\r\n var pY = posX < 0 ? event.pageY + tOffset : event.pageY\r\n $cluetip.css({ left: (posX > 0 && opts.positionBy != 'bottomTop') ? posX : (mouseX + (tipWidth / 2) > winWidth) ? winWidth / 2 - tipWidth / 2 : Math.max(mouseX - (tipWidth / 2), 0) })\r\n }\r\n wHeight = $(window).height()\r\n\r\n /***************************************\r\n * load a string from cluetip method's first argument\r\n ***************************************/\r\n if (js) {\r\n $cluetipInner.html(js)\r\n cluetipShow(pY)\r\n // eslint-disable-next-line brace-style\r\n }\r\n\r\n /***************************************\r\n * load the title attribute only (or user-selected attribute).\r\n * clueTip title is the string before the first delimiter\r\n * subsequent delimiters place clueTip body text on separate lines\r\n ***************************************/\r\n\r\n else if (tipParts) {\r\n const tpl = tipParts.length\r\n for (let i = 0; i < tpl; i++) {\r\n if (i == 0) {\r\n $cluetipInner.html(tipParts[i])\r\n } else {\r\n $cluetipInner.append('
    ' + tipParts[i] + '
    ')\r\n }\r\n };\r\n cluetipShow(pY)\r\n // eslint-disable-next-line brace-style\r\n }\r\n /***************************************\r\n * load external file via ajax\r\n ***************************************/\r\n\r\n else if (!opts.local && tipAttribute.indexOf('#') != 0) {\r\n if (cluetipContents && opts.ajaxCache) {\r\n $cluetipInner.html(cluetipContents)\r\n cluetipShow(pY)\r\n } else {\r\n const ajaxSettings = opts.ajaxSettings\r\n ajaxSettings.url = tipAttribute\r\n ajaxSettings.beforeSend = function () {\r\n $cluetipOuter.children().empty()\r\n if (opts.waitImage) {\r\n $('#cluetip-waitimage')\r\n .css({ top: mouseY + 20, left: mouseX + 20 })\r\n .show()\r\n }\r\n }\r\n ajaxSettings.error = function () {\r\n if (isActive) {\r\n $cluetipInner.html('sorry, the contents could not be loaded')\r\n }\r\n }\r\n ajaxSettings.success = function (data) {\r\n cluetipContents = opts.ajaxProcess(data)\r\n if (isActive) {\r\n $cluetipInner.html(cluetipContents)\r\n }\r\n }\r\n ajaxSettings.complete = function () {\r\n imgCount = $('#cluetip-inner img').length\r\n if (imgCount && !$.browser.opera) {\r\n $('#cluetip-inner img').load(function () {\r\n imgCount--\r\n if (imgCount < 1) {\r\n $('#cluetip-waitimage').hide()\r\n if (isActive) cluetipShow(pY)\r\n }\r\n })\r\n } else {\r\n $('#cluetip-waitimage').hide()\r\n if (isActive) cluetipShow(pY)\r\n }\r\n }\r\n $.ajax(ajaxSettings)\r\n }\r\n\r\n /***************************************\r\n * load an element from the same page\r\n ***************************************/\r\n } else if (opts.local) {\r\n const $localContent = $(tipAttribute + ':first')\r\n const localCluetip = $.fn.wrapInner ? $localContent.wrapInner('
    ').children().clone(true) : $localContent.html()\r\n $.fn.wrapInner ? $cluetipInner.empty().append(localCluetip) : $cluetipInner.html(localCluetip)\r\n cluetipShow(pY)\r\n }\r\n }\r\n\r\n // get dimensions and options for cluetip and prepare it to be shown\r\n var cluetipShow = function (bpY) {\r\n $cluetip.addClass('cluetip-' + ctClass)\r\n\r\n if (opts.truncate) {\r\n const $truncloaded = $cluetipInner.text().slice(0, opts.truncate) + '...'\r\n $cluetipInner.html($truncloaded)\r\n }\r\n function doNothing () { }; // empty function\r\n tipTitle ? $cluetipTitle.show().html(tipTitle) : (opts.showTitle) ? $cluetipTitle.show().html(' ') : $cluetipTitle.hide()\r\n if (opts.sticky) {\r\n const $closeLink = $('
    ');\r\n (opts.closePosition == 'bottom') ? $closeLink.appendTo($cluetipInner) : (opts.closePosition == 'title') ? $closeLink.prependTo($cluetipTitle) : $closeLink.prependTo($cluetipInner)\r\n $closeLink.click(function () {\r\n cluetipClose()\r\n return false\r\n })\r\n if (opts.mouseOutClose) {\r\n if ($.fn.hoverIntent && opts.hoverIntent) {\r\n $cluetip.hoverIntent({\r\n over: doNothing,\r\n timeout: opts.hoverIntent.timeout,\r\n out: function () { $closeLink.trigger('click') }\r\n })\r\n } else {\r\n $cluetip.hover(doNothing,\r\n function () { $closeLink.trigger('click') })\r\n }\r\n } else {\r\n $cluetip.unbind('mouseout')\r\n }\r\n }\r\n // now that content is loaded, finish the positioning\r\n let direction = ''\r\n $cluetipOuter.css({ overflow: defHeight == 'auto' ? 'visible' : 'auto', height: defHeight })\r\n tipHeight = defHeight == 'auto' ? Math.max($cluetip.outerHeight(), $cluetip.height()) : parseInt(defHeight, 10)\r\n tipY = posY\r\n baseline = sTop + wHeight\r\n if (opts.positionBy == 'fixed') {\r\n tipY = posY - opts.dropShadowSteps + tOffset\r\n } else if ((posX < mouseX && Math.max(posX, 0) + tipWidth > mouseX) || opts.positionBy == 'bottomTop') {\r\n if (posY + tipHeight + tOffset > baseline && mouseY - sTop > tipHeight + tOffset) {\r\n tipY = mouseY - tipHeight - tOffset\r\n direction = 'top'\r\n } else {\r\n tipY = mouseY + tOffset\r\n direction = 'bottom'\r\n }\r\n } else if (posY + tipHeight + tOffset > baseline) {\r\n tipY = (tipHeight >= wHeight) ? sTop : baseline - tipHeight - tOffset\r\n } else if ($this.css('display') == 'block' || $this[0].tagName.toLowerCase() == 'area' || opts.positionBy == 'mouse') {\r\n tipY = bpY - tOffset\r\n } else {\r\n tipY = posY - opts.dropShadowSteps\r\n }\r\n if (direction == '') {\r\n posX < linkLeft ? direction = 'left' : direction = 'right'\r\n }\r\n $cluetip.css({ top: tipY + 'px' }).removeClass().addClass('clue-' + direction + '-' + ctClass).addClass(' cluetip-' + ctClass)\r\n if (opts.arrows) { // set up arrow positioning to align with element\r\n const bgY = (posY - tipY - opts.dropShadowSteps)\r\n $cluetipArrows.css({ top: (/(left|right)/.test(direction) && posX >= 0 && bgY > 0) ? bgY + 'px' : /(left|right)/.test(direction) ? 0 : '' }).show()\r\n } else {\r\n $cluetipArrows.hide()\r\n }\r\n\r\n // (first hide, then) ***SHOW THE CLUETIP***\r\n $dropShadow.hide()\r\n $cluetip.hide()[opts.fx.open](opts.fx.open != 'show' && opts.fx.openSpeed)\r\n if (opts.dropShadow) $dropShadow.css({ height: tipHeight, width: tipInnerWidth }).show()\r\n if ($.fn.bgiframe) { $cluetip.bgiframe() }\r\n // trigger the optional onShow function\r\n if (opts.delayedClose > 0) {\r\n closeOnDelay = setTimeout(cluetipClose, opts.delayedClose)\r\n }\r\n\r\n // CUSTOMIZED FOR IF-SHOP: $this[0] added to offer an easy accesspoint to the class to which the cluetip is added\r\n // opts.onShow($cluetip, $cluetipInner);\r\n opts.onShow($cluetip, $cluetipInner, $this[0])\r\n }\r\n\r\n /***************************************\r\n =INACTIVATION\r\n -------------------------------------- */\r\n const inactivate = function () {\r\n isActive = false\r\n $('#cluetip-waitimage').hide()\r\n if (!opts.sticky || (/click|toggle/).test(opts.activation)) {\r\n cluetipClose()\r\n clearTimeout(closeOnDelay)\r\n };\r\n if (opts.hoverClass) {\r\n $this.removeClass(opts.hoverClass)\r\n }\r\n $('.cluetip-clicked').removeClass('cluetip-clicked')\r\n }\r\n // close cluetip and reset some things\r\n var cluetipClose = function () {\r\n $cluetipOuter\r\n .parent().hide().removeClass().end()\r\n .children().empty()\r\n if (tipTitle) {\r\n $this.attr(opts.titleAttribute, tipTitle)\r\n }\r\n $this.css('cursor', '')\r\n if (opts.arrows) $cluetipArrows.css({ top: '' })\r\n }\r\n\r\n /***************************************\r\n =BIND EVENTS\r\n -------------------------------------- */\r\n // activate by click\r\n if ((/click|toggle/).test(opts.activation)) {\r\n $this.click(function (event) {\r\n if ($cluetip.is(':hidden') || !$this.is('.cluetip-clicked')) {\r\n $('.cluetip-clicked').removeClass('cluetip-clicked')\r\n activate(event)\r\n } else {\r\n inactivate(event)\r\n }\r\n this.blur()\r\n return false\r\n })\r\n // activate by focus; inactivate by blur\r\n } else if (opts.activation == 'focus') {\r\n $this.focus(function (event) {\r\n activate(event)\r\n })\r\n $this.blur(function (event) {\r\n inactivate(event)\r\n })\r\n // activate by hover\r\n // clicking is returned false if cluetip url is same as href url\r\n } else {\r\n $this.click(function () {\r\n if ($this.attr('href') && $this.attr('href') == tipAttribute && !opts.clickThrough) {\r\n return false\r\n }\r\n })\r\n // set up mouse tracking\r\n const mouseTracks = function (evt) {\r\n if (opts.tracking == true) {\r\n const trackX = posX - evt.pageX\r\n const trackY = tipY ? tipY - evt.pageY : posY - evt.pageY\r\n $this.mousemove(function (evt) {\r\n $cluetip.css({ left: evt.pageX + trackX, top: evt.pageY + trackY })\r\n })\r\n }\r\n }\r\n if ($.fn.hoverIntent && opts.hoverIntent) {\r\n $this.mouseover(function () { $this.attr('title', '') })\r\n .hoverIntent({\r\n sensitivity: opts.hoverIntent.sensitivity,\r\n interval: opts.hoverIntent.interval,\r\n over: function (event) {\r\n activate(event)\r\n mouseTracks(event)\r\n },\r\n timeout: opts.hoverIntent.timeout,\r\n out: function (event) { inactivate(event); $this.unbind('mousemove') }\r\n })\r\n } else {\r\n $this.hover(function (event) {\r\n activate(event)\r\n mouseTracks(event)\r\n }, function (event) {\r\n inactivate(event)\r\n $this.unbind('mousemove')\r\n })\r\n }\r\n }\r\n })\r\n }\r\n\r\n /*\r\n * options for clueTip\r\n *\r\n * each one can be explicitly overridden by changing its value.\r\n * for example: $.fn.cluetip.defaults.width = 200;\r\n * would change the default width for all clueTips to 200.\r\n *\r\n * each one can also be overridden by passing an options map to the cluetip method.\r\n * for example: $('a.example').cluetip({width: 200});\r\n * would change the default width to 200 for clueTips invoked by a link with class of \"example\"\r\n *\r\n */\r\n\r\n $.fn.cluetip.defaults = { // set up default options\r\n width: 275, // The width of the clueTip\r\n height: 'auto', // The height of the clueTip\r\n cluezIndex: 97, // Sets the z-index style property of the clueTip\r\n positionBy: 'auto', // Sets the type of positioning: 'auto', 'mouse','bottomTop', 'fixed'\r\n topOffset: 15, // Number of px to offset clueTip from top of invoking element\r\n leftOffset: 15, // Number of px to offset clueTip from left of invoking element\r\n local: false, // Whether to use content from the same page for the clueTip's body\r\n hideLocal: true, // If local option is set to true, this determines whether local content\r\n // to be shown in clueTip should be hidden at its original location\r\n attribute: 'rel', // the attribute to be used for fetching the clueTip's body content\r\n titleAttribute: 'title', // the attribute to be used for fetching the clueTip's title\r\n splitTitle: '', // A character used to split the title attribute into the clueTip title and divs\r\n // within the clueTip body. more info below [6]\r\n showTitle: true, // show title bar of the clueTip, even if title attribute not set\r\n cluetipClass: 'default', // class added to outermost clueTip div in the form of 'cluetip-' + clueTipClass.\r\n hoverClass: '', // class applied to the invoking element onmouseover and removed onmouseout\r\n waitImage: true, // whether to show a \"loading\" img, which is set in jquery.cluetip.css\r\n cursor: 'help',\r\n arrows: false, // if true, displays arrow on appropriate side of clueTip\r\n dropShadow: true, // set to false if you don't want the drop-shadow effect on the clueTip\r\n dropShadowSteps: 6, // adjusts the size of the drop shadow\r\n sticky: false, // keep visible until manually closed\r\n mouseOutClose: false, // close when clueTip is moused out\r\n activation: 'hover', // set to 'click' to force user to click to show clueTip\r\n // set to 'focus' to show on focus of a form element and hide on blur\r\n clickThrough: false, // if true, and activation is not 'click', then clicking on link will take user to the link's href,\r\n // even if href and tipAttribute are equal\r\n tracking: false, // if true, clueTip will track mouse movement (experimental)\r\n delayedClose: 0, // close clueTip on a timed delay (experimental)\r\n closePosition: 'top', // location of close text for sticky cluetips; can be 'top' or 'bottom' or 'title'\r\n closeText: 'Close', // text (or HTML) to to be clicked to close sticky clueTips\r\n truncate: 0, // number of characters to truncate clueTip's contents. if 0, no truncation occurs\r\n\r\n // effect and speed for opening clueTips\r\n fx: {\r\n open: 'show', // can be 'show' or 'slideDown' or 'fadeIn'\r\n openSpeed: ''\r\n },\r\n\r\n // settings for when hoverIntent plugin is used\r\n hoverIntent: {\r\n sensitivity: 3,\r\n interval: 50,\r\n timeout: 0\r\n },\r\n\r\n // function to run just before clueTip is shown.\r\n onActivate: function (e) { return true },\r\n\r\n // function to run just after clueTip is shown.\r\n onShow: function (ct, c) { },\r\n\r\n // whether to cache results of ajax request to avoid unnecessary hits to server\r\n ajaxCache: true,\r\n\r\n // process data retrieved via xhr before it's displayed\r\n ajaxProcess: function (data) {\r\n data = data.replace(//g, '').replace(/<(link|title)(.|\\s)*?\\/(link|title)>/g, '')\r\n return data\r\n },\r\n\r\n // can pass in standard $.ajax() parameters, not including error, complete, success, and url\r\n ajaxSettings: {\r\n dataType: 'html'\r\n },\r\n debug: false\r\n }\r\n\r\n /*\r\n * Global defaults for clueTips. Apply to all calls to the clueTip plugin.\r\n *\r\n * @example $.cluetip.setup({\r\n * insertionType: 'prependTo',\r\n * insertionElement: '#container'\r\n * });\r\n *\r\n * @property\r\n * @name $.cluetip.setup\r\n * @type Map\r\n * @cat Plugins/tooltip\r\n * @option String insertionType: Default is 'appendTo'. Determines the method to be used for inserting the clueTip into the DOM. Permitted values are 'appendTo', 'prependTo', 'insertBefore', and 'insertAfter'\r\n * @option String insertionElement: Default is 'body'. Determines which element in the DOM the plugin will reference when inserting the clueTip.\r\n *\r\n */\r\n\r\n var insertionType = 'appendTo'; var insertionElement = 'body'\r\n $.cluetip = {}\r\n $.cluetip.setup = function (options) {\r\n if (options && options.insertionType && (options.insertionType).match(/appendTo|prependTo|insertBefore|insertAfter/)) {\r\n insertionType = options.insertionType\r\n }\r\n if (options && options.insertionElement) {\r\n insertionElement = options.insertionElement\r\n }\r\n }\r\n// eslint-disable-next-line no-undef\r\n})(jQuery)\r\n","/**\r\n * jQuery Validation Plugin 1.9.0\r\n *\r\n * http://bassistance.de/jquery-plugins/jquery-plugin-validation/\r\n * http://docs.jquery.com/Plugins/Validation\r\n *\r\n * Copyright (c) 2006 - 2011 Jörn Zaefferer\r\n *\r\n * Licensed under MIT: http://www.opensource.org/licenses/mit-license.php\r\n */\r\n\r\n(function ($) {\r\n $.extend($.fn, {\r\n // http://docs.jquery.com/Plugins/Validation/validate\r\n validate: function (options) {\r\n\r\n // if nothing is selected, return nothing; can't chain anyway\r\n if (!this.length) {\r\n options && options.debug && window.console && console.warn(\"nothing selected, can't validate, returning nothing\");\r\n return;\r\n }\r\n\r\n // check if a validator for this form was already created\r\n var validator = $.data(this[0], 'validator');\r\n if (validator) {\r\n return validator;\r\n }\r\n\r\n // Add novalidate tag if HTML5.\r\n this.attr('novalidate', 'novalidate');\r\n\r\n validator = new $.validator(options, this[0]);\r\n $.data(this[0], 'validator', validator);\r\n\r\n if (validator.settings.onsubmit) {\r\n\r\n var inputsAndButtons = this.find(\"input, button\");\r\n\r\n // allow suppresing validation by adding a cancel class to the submit button\r\n inputsAndButtons.filter(\".cancel\").click(function () {\r\n validator.cancelSubmit = true;\r\n });\r\n\r\n // when a submitHandler is used, capture the submitting button\r\n if (validator.settings.submitHandler) {\r\n inputsAndButtons.filter(\":submit\").click(function () {\r\n validator.submitButton = this;\r\n });\r\n }\r\n\r\n // validate the form on submit\r\n this.submit(function (event) {\r\n if (validator.settings.debug)\r\n // prevent form submit to be able to see console output\r\n event.preventDefault();\r\n\r\n function handle() {\r\n if (validator.settings.submitHandler) {\r\n if (validator.submitButton) {\r\n // insert a hidden input as a replacement for the missing submit button\r\n var hidden = $(\"\").attr(\"name\", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);\r\n }\r\n validator.settings.submitHandler.call(validator, validator.currentForm);\r\n if (validator.submitButton) {\r\n // and clean up afterwards; thanks to no-block-scope, hidden can be referenced\r\n hidden.remove();\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // prevent submit for invalid forms or custom submit handlers\r\n if (validator.cancelSubmit) {\r\n validator.cancelSubmit = false;\r\n return handle();\r\n }\r\n if (validator.form()) {\r\n if (validator.pendingRequest) {\r\n validator.formSubmitted = true;\r\n return false;\r\n }\r\n return handle();\r\n } else {\r\n validator.focusInvalid();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n return validator;\r\n },\r\n // http://docs.jquery.com/Plugins/Validation/valid\r\n valid: function () {\r\n if ($(this[0]).is('form')) {\r\n return this.validate().form();\r\n } else {\r\n var valid = true;\r\n var validator = $(this[0].form).validate();\r\n this.each(function () {\r\n valid &= validator.element(this);\r\n });\r\n return valid;\r\n }\r\n },\r\n // attributes: space seperated list of attributes to retrieve and remove\r\n removeAttrs: function (attributes) {\r\n var result = {},\r\n $element = this;\r\n $.each(attributes.split(/\\s/), function (index, value) {\r\n result[value] = $element.attr(value);\r\n $element.removeAttr(value);\r\n });\r\n return result;\r\n },\r\n // http://docs.jquery.com/Plugins/Validation/rules\r\n rules: function (command, argument) {\r\n var element = this[0];\r\n\r\n if (command) {\r\n var settings = $.data(element.form, 'validator').settings;\r\n var staticRules = settings.rules;\r\n var existingRules = $.validator.staticRules(element);\r\n switch (command) {\r\n case \"add\":\r\n $.extend(existingRules, $.validator.normalizeRule(argument));\r\n staticRules[element.name] = existingRules;\r\n if (argument.messages)\r\n settings.messages[element.name] = $.extend(settings.messages[element.name], argument.messages);\r\n break;\r\n case \"remove\":\r\n if (!argument) {\r\n delete staticRules[element.name];\r\n return existingRules;\r\n }\r\n var filtered = {};\r\n $.each(argument.split(/\\s/), function (index, method) {\r\n filtered[method] = existingRules[method];\r\n delete existingRules[method];\r\n });\r\n return filtered;\r\n }\r\n }\r\n\r\n var data = $.validator.normalizeRules(\r\n $.extend(\r\n {},\r\n $.validator.metadataRules(element),\r\n $.validator.classRules(element),\r\n $.validator.attributeRules(element),\r\n $.validator.staticRules(element)\r\n ), element);\r\n\r\n // make sure required is at front\r\n if (data.required) {\r\n var param = data.required;\r\n delete data.required;\r\n data = $.extend({ required: param }, data)\r\n }\r\n\r\n return data;\r\n }\r\n })\r\n\r\n // Custom selectors\r\n $.extend($.expr[':'], {\r\n // http://docs.jquery.com/Plugins/Validation/blank\r\n blank: function (a) { return !$.trim(\"\" + a.value); },\r\n // http://docs.jquery.com/Plugins/Validation/filled\r\n filled: function (a) { return !!$.trim(\"\" + a.value); },\r\n // http://docs.jquery.com/Plugins/Validation/unchecked\r\n unchecked: function (a) { return !a.checked; }\r\n });\r\n\r\n // constructor for validator\r\n $.validator = function (options, form) {\r\n this.settings = $.extend(true, {}, $.validator.defaults, options);\r\n this.currentForm = form;\r\n this.init();\r\n };\r\n\r\n $.validator.format = function (source, params) {\r\n if (arguments.length == 1)\r\n return function () {\r\n var args = $.makeArray(arguments);\r\n args.unshift(source);\r\n return $.validator.format.apply(this, args);\r\n };\r\n if (arguments.length > 2 && params.constructor != Array) {\r\n params = $.makeArray(arguments).slice(1);\r\n }\r\n if (params.constructor != Array) {\r\n params = [params];\r\n }\r\n $.each(params, function (i, n) {\r\n source = source.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"g\"), n);\r\n });\r\n return source;\r\n };\r\n\r\n $.extend($.validator, {\r\n\r\n defaults: {\r\n duplicateValid: false,\r\n messages: {},\r\n groups: {},\r\n rules: {},\r\n errorClass: \"has-error\",\r\n errorTextClass: \"ecmt-notification-error\", //CUSTOMIZED FOR IF-SHOP: added to support better styling options for the label (replaced relevant places in code)\r\n validClass: \"valid\",\r\n errorElement: \"label\",\r\n focusInvalid: true,\r\n errorContainer: $([]),\r\n errorLabelContainer: $([]),\r\n onsubmit: true,\r\n ignore: \":hidden\",\r\n ignoreTitle: false,\r\n onfocusin: function (element, event) {\r\n this.lastActive = element;\r\n\r\n // hide error label and remove error class on focus if enabled\r\n if (this.settings.focusCleanup && !this.blockFocusCleanup) {\r\n this.settings.unhighlight && this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);\r\n this.addWrapper(this.errorsFor(element)).hide();\r\n }\r\n },\r\n onfocusout: function (element, event) {\r\n if (element.ifws_control) { //CUSTOMIZED FOR IF-SHOP: added to support special dropdown control\r\n if (element.ifws_control.jParent.find(':active').length > 0) {\r\n return false;\r\n }\r\n }\r\n if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {\r\n this.element(element, 'onfocusout');\r\n }\r\n },\r\n onkeyup: function (element, event) {\r\n if (element.name in this.submitted || element == this.lastElement) {\r\n this.element(element, 'onkeyup'); //CUSTOMIZED FOR IF-SHOP: xtra arg used to identify the validation action\r\n }\r\n },\r\n onclick: function (element, event) {\r\n // click on selects, radiobuttons and checkboxes\r\n if (element.name in this.submitted)\r\n this.element(element);\r\n // or option elements, check parent select in that case\r\n else if (element.parentNode.name in this.submitted)\r\n this.element(element.parentNode, 'onclick');\r\n },\r\n highlight: function (element, errorClass, validClass) {\r\n if (element.type === 'radio') {\r\n this.findByName(element.name).addClass(errorClass).removeClass(validClass);\r\n }\r\n else if (element.type === 'select-one') { //CUSTOMIZED FOR IF-SHOP: added to support special dropdown control\r\n $('select[name=' + element.name + ']').parent().addClass(errorClass).removeClass(validClass);\r\n }\r\n else if ($(element).hasClass('dropdownDisplay')) { //CUSTOMIZED FOR IF-SHOP: added to support special lazyload control\r\n $('input[name=' + element.name + ']').parent().addClass(errorClass).removeClass(validClass);\r\n }\r\n else {\r\n $(element).addClass(errorClass).removeClass(validClass);\r\n }\r\n },\r\n unhighlight: function (element, errorClass, validClass) {\r\n //CUSTOMIZED FOR IF-SHOP: \r\n if (this.customUnhighlight) {\r\n if (this.customUnhighlight(element, errorClass, validClass) === false) {\r\n return;\r\n }\r\n }\r\n if (element.type === 'radio') {\r\n this.findByName(element.name).removeClass(errorClass).addClass(validClass);\r\n }\r\n else if (element.type === 'select-one') { //CUSTOMIZED FOR IF-SHOP: added to support special dropdown control\r\n $('select[name=' + element.name + ']').parent().addClass(validClass).removeClass(errorClass);\r\n }\r\n else {\r\n $(element).removeClass(errorClass).addClass(validClass);\r\n }\r\n }\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults\r\n setDefaults: function (settings) {\r\n $.extend($.validator.defaults, settings);\r\n },\r\n\r\n messages: {\r\n required: '',//\"This field is required.\", //CUSTOMIZED FOR IF-SHOP: disabled to avoid uncustomizable messages\r\n remote: '',//\"Please fix this field.\",\r\n email: '',//\"Please enter a valid email address.\",\r\n url: '',//\"Please enter a valid URL.\",\r\n date: '',//\"Please enter a valid date.\",\r\n dateISO: '',//\"Please enter a valid date (ISO).\",\r\n number: '',//\"Please enter a valid number.\",\r\n digits: '',//\"Please enter only digits.\",\r\n creditcard: '',//\"Please enter a valid credit card number.\",\r\n equalTo: '',//\"Please enter the same value again.\",\r\n accept: '',//\"Please enter a value with a valid extension.\",\r\n maxlength: '',//$.validator.format(\"Please enter no more than {0} characters.\"),\r\n minlength: '',//$.validator.format(\"Please enter at least {0} characters.\"),\r\n rangelength: '',//$.validator.format(\"Please enter a value between {0} and {1} characters long.\"),\r\n range: '',//$.validator.format(\"Please enter a value between {0} and {1}.\"),\r\n max: '',//$.validator.format(\"Please enter a value less than or equal to {0}.\"),\r\n min: ''//$.validator.format(\"Please enter a value greater than or equal to {0}.\")\r\n },\r\n\r\n autoCreateRanges: false,\r\n\r\n prototype: {\r\n\r\n init: function () {\r\n this.labelContainer = $(this.settings.errorLabelContainer);\r\n this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);\r\n this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer);\r\n this.submitted = {};\r\n this.valueCache = {};\r\n this.pendingRequest = 0;\r\n this.pending = {};\r\n this.invalid = {};\r\n this.reset();\r\n\r\n var groups = (this.groups = {});\r\n $.each(this.settings.groups, function (key, value) {\r\n $.each(value.split(/\\s/), function (index, name) {\r\n groups[name] = key;\r\n });\r\n });\r\n var rules = this.settings.rules;\r\n $.each(rules, function (key, value) {\r\n rules[key] = $.validator.normalizeRule(value);\r\n });\r\n\r\n function delegate(event) {\r\n var validator = $.data(this[0].form, \"validator\"),\r\n eventType = \"on\" + event.type.replace(/^validate/, \"\"); \r\n validator && validator.settings && validator.settings[eventType] && validator.settings[eventType].call(validator, this[0], event); \r\n }\r\n $(this.currentForm)\r\n .validateDelegate(\"[type='text'], [type='password'], [type='file'], select, textarea, \" +\r\n \"[type='number'], [type='search'] ,[type='tel'], [type='url'], \" +\r\n \"[type='email'], [type='datetime'], [type='date'], [type='month'], \" +\r\n \"[type='week'], [type='time'], [type='datetime-local'], \" +\r\n \"[type='range'], [type='color'] \",\r\n \"focusin focusout keyup\", delegate)\r\n .validateDelegate(\"[type='radio'], [type='checkbox'], select, option\", \"click\", delegate);\r\n\r\n if (this.settings.invalidHandler)\r\n $(this.currentForm).bind(\"invalid-form.validate\", this.settings.invalidHandler);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/form\r\n form: function (dontShowErrors) {\r\n var _result = this.checkForm(dontShowErrors);\r\n $.extend(this.submitted, this.errorMap);\r\n this.invalid = $.extend({}, this.errorMap);\r\n if (!this.valid())\r\n $(this.currentForm).triggerHandler(\"invalid-form\", [this]);\r\n if (!dontShowErrors) { //CUSTOMIZED FOR IF-SHOP: added so the method can be used to validate whether all entries are done and the user can move on automatically to new sections. This avoids all being painted red as soon the first of many fields has been changed \r\n this.showErrors();\r\n return this.valid();\r\n }\r\n else {\r\n return _result;\r\n }\r\n },\r\n checkFormDuplicates: function(dontShowErrors){\r\n var _valid = true\r\n var _result = true\r\n this.prepareForm()\r\n for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) {\r\n // we need to support the scenario where we will validate several fields with the\r\n // same name, for now we will only support this when dontShowErrors is set, and checks can only be \r\n // made on elements that are visible to the user.\r\n if (this.findByName(elements[i].name).length != undefined &&\r\n this.findByName(elements[i].name).length > 1 &&\r\n this.settings.duplicateValid && dontShowErrors) { \r\n // adding support for checking duplicate names\r\n for (var cnt = 0; cnt < this.findByName(elements[i].name).length; cnt++) {\r\n try {\r\n var innerElm = this.findByName(elements[i].name)[cnt] \r\n if( !!( innerElm.offsetWidth || innerElm.offsetHeight || innerElm.getClientRects().length )){\r\n _result = _result && this.check(innerElm) \r\n } \r\n } catch (e) {\r\n window.console && console.log(e)\r\n }\r\n } \r\n } else {\r\n _result = this.check(elements[i], dontShowErrors) \r\n } \r\n if (!_result) {\r\n _valid = false\r\n }\r\n }\r\n if (dontShowErrors) {\r\n return _valid\r\n } else {\r\n return this.valid()\r\n }\r\n },\r\n checkForm: function (dontShowErrors) {\r\n var _valid = true\r\n if(dontShowErrors && this.settings.duplicateValid ){\r\n return this.checkFormDuplicates(dontShowErrors)\r\n }\r\n this.prepareForm();\r\n for (var i = 0, elements = (this.currentElements = this.elements()) ; elements[i]; i++) {\r\n var _result = this.check(elements[i], dontShowErrors);\r\n if (!_result) {\r\n _valid = false;\r\n }\r\n }\r\n if (dontShowErrors) {\r\n return _valid;\r\n }\r\n else {\r\n return this.valid();\r\n }\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/element\r\n element: function (element, action) {\r\n element = this.validationTargetFor(this.clean(element));\r\n this.lastElement = element;\r\n\r\n this.prepareElement(element);\r\n this.currentElements = $(element);\r\n var result = this.check(element, false, action); //CUSTOMIZED FOR IF-SHOP: xtra arg \"action\" used to identify the validation action\r\n if (result) {\r\n delete this.invalid[element.name];\r\n } else {\r\n this.invalid[element.name] = true;\r\n }\r\n if (!this.numberOfInvalids()) {\r\n // Hide error containers on last error\r\n this.toHide = this.toHide.add(this.containers);\r\n }\r\n this.showErrors();\r\n return result;\r\n },\r\n\r\n\r\n //CUSTOMIZED FOR IF-SHOP: forces a control to display a specific result - fail/not fail\r\n updateElement: function (element, rule, result) {\r\n element = this.validationTargetFor(this.clean(element));\r\n this.lastElement = element;\r\n\r\n this.prepareElement(element);\r\n this.currentElements = $(element);\r\n result = this.check(element, false, undefined, rule, result); //CUSTOMIZED FOR IF-SHOP: xtra arg \"action\" used to identify the validation action\r\n if (result) {\r\n delete this.invalid[element.name];\r\n } else {\r\n this.invalid[element.name] = true;\r\n }\r\n if (!this.numberOfInvalids()) {\r\n // Hide error containers on last error\r\n this.toHide = this.toHide.add(this.containers);\r\n }\r\n this.showErrors();\r\n return result;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/showErrors\r\n showErrors: function (errors) {\r\n if (errors) {\r\n // add items to error list and map\r\n $.extend(this.errorMap, errors);\r\n this.errorList = [];\r\n for (var name in errors) {\r\n this.errorList.push({\r\n message: errors[name],\r\n element: this.findByName(name)[0]\r\n });\r\n }\r\n // remove items from success list\r\n this.successList = $.grep(this.successList, function (element) {\r\n return !(element.name in errors);\r\n });\r\n }\r\n this.settings.showErrors\r\n ? this.settings.showErrors.call(this, this.errorMap, this.errorList)\r\n : this.defaultShowErrors();\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/resetForm\r\n resetForm: function () {\r\n if ($.fn.resetForm)\r\n $(this.currentForm).resetForm();\r\n this.submitted = {};\r\n this.lastElement = null;\r\n this.prepareForm();\r\n this.hideErrors();\r\n this.elements().removeClass(this.settings.errorClass);\r\n },\r\n\r\n numberOfInvalids: function () {\r\n return this.objectLength(this.invalid);\r\n },\r\n\r\n objectLength: function (obj) {\r\n var count = 0;\r\n for (var i in obj)\r\n count++;\r\n return count;\r\n },\r\n\r\n hideErrors: function () {\r\n this.addWrapper(this.toHide).hide();\r\n },\r\n\r\n valid: function () {\r\n return this.size() == 0;\r\n },\r\n\r\n size: function () {\r\n return this.errorList.length;\r\n },\r\n\r\n focusInvalid: function () {\r\n if (this.settings.focusInvalid) {\r\n try {\r\n $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])\r\n .filter(\":visible\")\r\n .focus()\r\n // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\r\n .trigger(\"focusin\");\r\n } catch (e) {\r\n // ignore IE throwing errors when focusing hidden elements\r\n }\r\n }\r\n },\r\n\r\n findLastActive: function () {\r\n var lastActive = this.lastActive;\r\n return lastActive && $.grep(this.errorList, function (n) {\r\n return n.element.name == lastActive.name;\r\n }).length == 1 && lastActive;\r\n },\r\n\r\n elements: function () {\r\n var validator = this,\r\n rulesCache = {};\r\n\r\n // select all valid inputs inside the form (no submit or reset buttons)\r\n var _result = $(this.currentForm)\r\n .find(\"input, select, textarea\")\r\n .not(\":submit, :reset, :image\")\r\n .not(this.settings.ignore)\r\n .filter(function () {\r\n !this.name && validator.settings.debug && window.console && console.error(\"%o has no name assigned\", this);\r\n\r\n // select only the first element for each name, and only those with rules specified\r\n if (this.name in rulesCache || !validator.objectLength($(this).rules()))\r\n return false;\r\n\r\n rulesCache[this.name] = true;\r\n return true;\r\n });\r\n\r\n var _validateDisabled = $(this.currentForm) //CUSTOMIZED FOR IF-SHOP: added to support that controls are hidden, until made ready by controls they depend on\r\n .find(\".validateDisabled\")\r\n .filter(function () {\r\n if (this.name in rulesCache || !validator.objectLength($(this).rules()))\r\n return false;\r\n\r\n rulesCache[this.name] = true;\r\n return true;\r\n });\r\n if (_validateDisabled.length) {\r\n _result = _result.add(_validateDisabled);\r\n }\r\n\r\n\r\n var _validateDisabledGroup = $(this.currentForm) //CUSTOMIZED FOR IF-SHOP: added to support that control groups are hidden, until made ready by controls they depend on\r\n .find(\".validateHiddenGroup:hidden\").find(\"input, select\")\r\n .filter(function () {\r\n if (this.name in rulesCache || !validator.objectLength($(this).rules()))\r\n return false;\r\n\r\n rulesCache[this.name] = true;\r\n return true;\r\n });\r\n if (_validateDisabledGroup.length) {\r\n _result = _result.add(_validateDisabledGroup);\r\n }\r\n\r\n return _result;\r\n },\r\n\r\n clean: function (selector) {\r\n return $(selector)[0];\r\n },\r\n\r\n errors: function () {\r\n return $(/*this.settings.errorElement +*/ \".\" + this.settings.errorTextClass, this.errorContext);\r\n },\r\n\r\n reset: function () {\r\n this.successList = [];\r\n this.errorList = [];\r\n this.errorMap = {};\r\n this.toShow = $([]);\r\n this.toHide = $([]);\r\n this.currentElements = $([]);\r\n },\r\n\r\n prepareForm: function () {\r\n this.reset();\r\n this.toHide = this.errors().add(this.containers);\r\n },\r\n\r\n prepareElement: function (element) {\r\n this.reset();\r\n this.toHide = this.errorsFor(element);\r\n },\r\n\r\n check: function (element, dontShowErrors, action, ruleName, result) {\r\n //CUSTOMIZED FOR IF-SHOP: custom handling of check action\r\n if (element.ifws_customCheck) {\r\n if (element.ifws_customCheck(element, action) === false) {\r\n //if the custom method returns false, return and ignore default functionality\r\n return;\r\n }\r\n }\r\n\r\n element = this.validationTargetFor(this.clean(element));\r\n if (!element) return true;\r\n var rules = $(element).rules();\r\n var dependencyMismatch = false;\r\n for (var method in rules) {\r\n if (ruleName == undefined || ruleName == method) { //CUSTOMIZED FOR IF-SHOP: allows to test only a specfic rule\r\n var rule = { method: method, parameters: rules[method] };\r\n try {\r\n if (result != undefined && ruleName) { //CUSTOMIZED FOR IF-SHOP: allows to force a specific result for a specific rule\r\n //do nothing\r\n }\r\n else {\r\n result = $.validator.methods[method].call(this, element.value.replace(/\\r/g, \"\"), element, rule.parameters, action); //CUSTOMIZED FOR IF-SHOP: also pases action\r\n }\r\n\r\n // if a method indicates that the field is optional and therefore valid,\r\n // don't mark it as valid when there are no other rules\r\n if (result == \"dependency-mismatch\") {\r\n dependencyMismatch = true;\r\n continue;\r\n }\r\n dependencyMismatch = false;\r\n\r\n if (result == \"pending\") {\r\n this.toHide = this.toHide.not(this.errorsFor(element));\r\n return;\r\n }\r\n\r\n if (!result) {\r\n if (!dontShowErrors) {\r\n this.formatAndAdd(element, rule, dontShowErrors);\r\n }\r\n return false;\r\n }\r\n } catch (e) {\r\n this.settings.debug && window.console && console.log(\"exception occured when checking element \" + element.id\r\n + \", check the '\" + rule.method + \"' method\", e);\r\n throw e;\r\n }\r\n }\r\n }\r\n if (dependencyMismatch)\r\n return;\r\n if (this.objectLength(rules))\r\n this.successList.push(element);\r\n return true;\r\n },\r\n\r\n //clearSubmitted: function (element) { //CUSTOMIZED FOR IF-SHOP\r\n // delete element.form.validator.submitted[element.id]; //to avoid that this element is validated for every next change\r\n // this.lastElement = undefined; //used for RegNr basically, also to avoid that the last element is validated for every next change\r\n //},\r\n\r\n clearElement: function (element) { //CUSTOMIZED FOR IF-SHOP\r\n this.clean('#' + element.id);\r\n delete this.invalid[element.name];\r\n this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);\r\n this.addWrapper(this.errorsFor(element)).hide();\r\n delete element.form.validator.submitted[element.id]; //to avoid that this element is validated for every next change\r\n this.lastElement = undefined; //used for RegNr basically, also to avoid that the last element is validated for every next change\r\n },\r\n\r\n // return the custom message for the given element and validation method\r\n // specified in the element's \"messages\" metadata\r\n customMetaMessage: function (element, method) {\r\n if (!$.metadata)\r\n return;\r\n\r\n var meta = this.settings.meta\r\n ? $(element).metadata()[this.settings.meta]\r\n : $(element).metadata();\r\n\r\n return meta && meta.messages && meta.messages[method];\r\n },\r\n\r\n // return the custom message for the given element name and validation method\r\n customMessage: function (name, method) {\r\n var m = this.settings.messages[name];\r\n if (m) {\r\n //CUSTOMIZED FOR IF-SHOP: rewritten code to allow the use of 'all' as a single message covering all rules\r\n if (m.constructor == String) {\r\n return m;\r\n }\r\n else if (m[method]) {\r\n return m[method];\r\n }\r\n else {\r\n return m['all'];\r\n }\r\n\r\n //return m && (m.constructor == String\r\n // ? m\r\n // : m[method]);\r\n }\r\n },\r\n\r\n // return the first defined argument, allowing empty strings\r\n findDefined: function () {\r\n for (var i = 0; i < arguments.length; i++) {\r\n if (arguments[i] !== undefined)\r\n return arguments[i];\r\n }\r\n return undefined;\r\n },\r\n\r\n defaultMessage: function (element, method) {\r\n return this.findDefined(\r\n this.customMessage(element.name, method),\r\n this.customMetaMessage(element, method)//,\r\n // title is never undefined, so handle empty string as undefined\r\n\r\n //CUSTOMIZED FOR IF-SHOP: last three lines are disabled due to unnessesary warning\r\n //!this.settings.ignoreTitle && element.title || undefined,\r\n //$.validator.messages[method],\r\n //\"Warning: No message defined for \" + element.name + \"\"\r\n );\r\n },\r\n\r\n formatAndAdd: function (element, rule) {\r\n var message = this.defaultMessage(element, rule.method),\r\n theregex = /\\$?\\{(\\d+)\\}/g;\r\n if (typeof message == \"function\") {\r\n message = message.call(this, rule.parameters, element);\r\n } else if (theregex.test(message)) {\r\n message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);\r\n }\r\n this.errorList.push({\r\n message: message,\r\n element: element,\r\n rule: rule.method //CUSTOMIZED FOR IF-SHOP: send info about the type of rule around\r\n });\r\n\r\n this.errorMap[element.name] = message;\r\n this.submitted[element.name] = message;\r\n },\r\n\r\n addWrapper: function (toToggle) {\r\n if (this.settings.wrapper)\r\n toToggle = toToggle.add(toToggle.parent(this.settings.wrapper));\r\n return toToggle;\r\n },\r\n\r\n defaultShowErrors: function () {\r\n if(this.settings.duplicateValid) return\r\n for (var i = 0; this.errorList[i]; i++) {\r\n var error = this.errorList[i];\r\n this.settings.highlight && this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);\r\n this.showLabel(error.element, error.message, error.rule); //CUSTOMIZED FOR IF-SHOP: (, error.rule) send info about the type of rule around\r\n }\r\n if (this.errorList.length) {\r\n this.toShow = this.toShow.add(this.containers);\r\n }\r\n if (this.settings.success) {\r\n for (var i = 0; this.successList[i]; i++) {\r\n this.showLabel(this.successList[i]);\r\n }\r\n }\r\n if (this.settings.unhighlight) {\r\n for (var i = 0, elements = this.validElements() ; elements[i]; i++) {\r\n this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass);\r\n }\r\n }\r\n this.toHide = this.toHide.not(this.toShow);\r\n this.hideErrors();\r\n this.addWrapper(this.toShow).show();\r\n },\r\n\r\n validElements: function () {\r\n return this.currentElements.not(this.invalidElements());\r\n },\r\n\r\n invalidElements: function () {\r\n return $(this.errorList).map(function () {\r\n return this.element;\r\n });\r\n },\r\n\r\n showLabel: function (element, message, rule) { //CUSTOMIZED FOR IF-SHOP: send info about the type of rule around\r\n if(this.settings.duplicateValid) return\r\n //CUSTOMIZED FOR IF-SHOP: custom handling of label display \r\n if (this.customShowLabel) {\r\n if (this.customShowLabel(element, message, rule) === false) {\r\n //if the custom method returns false, return and ignore default functionality\r\n return;\r\n }\r\n }\r\n var label = this.errorsFor(element);\r\n\r\n //CUSTOMIZED FOR IF-SHOP: only display element if there is a message. Added because radiobuttons turn ugly when the extra label is added below the input control\r\n if (!message) {\r\n return;\r\n }\r\n\r\n if (label.length) {\r\n // refresh error/success class\r\n\r\n // check if we have a generated label, replace the message then\r\n /*label.attr(\"generated\") && label.html(message);*/\r\n\r\n //CUSTOMIZED FOR IF-SHOP: dont update if the text is already displayed, otherwise hyperlinks insiden the text will not receive click event due to tis change caused by the input control loosing focus when we try to click the link.\r\n if (label.html() != message) {\r\n label.removeClass(this.settings.validClass).addClass(this.settings.errorTextClass);\r\n message = message.split('\\r\\n').join('\\\\\\r\\n') //CUSTOMIZED FOR IF-SHOP\r\n label.html(message);\r\n }\r\n } else {\r\n // create label\r\n label = $(\"<\" + this.settings.errorElement + \"/>\")\r\n .attr({ \"for\": this.idOrName(element), generated: true })\r\n .addClass(this.settings.errorTextClass)\r\n .html(message || \"\");\r\n if (this.settings.wrapper) {\r\n // make sure the element is visible, even in IE\r\n // actually showing the wrapped element is handled elsewhere\r\n label = label.hide().show().wrap(\"<\" + this.settings.wrapper + \"/>\").parent();\r\n }\r\n if (!this.labelContainer.append(label).length)\r\n this.settings.errorPlacement\r\n ? this.settings.errorPlacement(label, $(element))\r\n : label.insertAfter(element);\r\n }\r\n if (!message && this.settings.success) {\r\n label.text(\"\");\r\n typeof this.settings.success == \"string\"\r\n ? label.addClass(this.settings.success)\r\n : this.settings.success(label);\r\n }\r\n this.toShow = this.toShow.add(label);\r\n },\r\n\r\n errorsFor: function (element) {\r\n var name = this.idOrName(element);\r\n return this.errors().filter(function () {\r\n return $(this).attr('for') == name;\r\n });\r\n },\r\n\r\n idOrName: function (element) {\r\n return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);\r\n },\r\n\r\n validationTargetFor: function (element) {\r\n // if radio/checkbox, validate first element in group instead\r\n if (this.checkable(element)) {\r\n element = this.findByName(element.name).not(this.settings.ignore)[0];\r\n }\r\n return element;\r\n },\r\n\r\n checkable: function (element) {\r\n return /radio|checkbox/i.test(element.type);\r\n },\r\n\r\n findByName: function (name) {\r\n // select by name and filter by form for performance over form.find(\"[name=...]\")\r\n var form = this.currentForm;\r\n return $(document.getElementsByName(name)).map(function (index, element) {\r\n return element.form == form && element.name == name && element || null;\r\n });\r\n },\r\n\r\n getLength: function (value, element) {\r\n switch (element.nodeName.toLowerCase()) {\r\n case 'select':\r\n return $(\"option:selected\", element).length;\r\n case 'input':\r\n if (this.checkable(element))\r\n return this.findByName(element.name).filter(':checked').length;\r\n }\r\n return value.length;\r\n },\r\n\r\n depend: function (param, element) {\r\n return this.dependTypes[typeof param]\r\n ? this.dependTypes[typeof param](param, element)\r\n : true;\r\n },\r\n\r\n dependTypes: {\r\n \"boolean\": function (param, element) {\r\n return param;\r\n },\r\n \"string\": function (param, element) {\r\n return !!$(param, element.form).length;\r\n },\r\n \"function\": function (param, element) {\r\n return param(element);\r\n }\r\n },\r\n\r\n optional: function (element) {\r\n return !$.validator.methods.required.call(this, $.trim(element.value), element) && \"dependency-mismatch\";\r\n },\r\n\r\n startRequest: function (element) {\r\n if (!this.pending[element.name]) {\r\n this.pendingRequest++;\r\n this.pending[element.name] = true;\r\n }\r\n },\r\n\r\n stopRequest: function (element, valid) {\r\n this.pendingRequest--;\r\n // sometimes synchronization fails, make sure pendingRequest is never < 0\r\n if (this.pendingRequest < 0)\r\n this.pendingRequest = 0;\r\n delete this.pending[element.name];\r\n if (valid && this.pendingRequest == 0 && this.formSubmitted && this.form()) {\r\n $(this.currentForm).submit();\r\n this.formSubmitted = false;\r\n } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {\r\n $(this.currentForm).triggerHandler(\"invalid-form\", [this]);\r\n this.formSubmitted = false;\r\n }\r\n },\r\n\r\n previousValue: function (element) {\r\n return $.data(element, \"previousValue\") || $.data(element, \"previousValue\", {\r\n old: null,\r\n valid: true,\r\n message: this.defaultMessage(element, \"remote\")\r\n });\r\n }\r\n\r\n },\r\n\r\n classRuleSettings: {\r\n required: { required: true },\r\n email: { email: true },\r\n url: { url: true },\r\n date: { date: true },\r\n dateISO: { dateISO: true },\r\n dateDE: { dateDE: true },\r\n number: { number: true },\r\n numberDE: { numberDE: true },\r\n digits: { digits: true },\r\n creditcard: { creditcard: true }\r\n },\r\n\r\n addClassRules: function (className, rules) {\r\n className.constructor == String ?\r\n this.classRuleSettings[className] = rules :\r\n $.extend(this.classRuleSettings, className);\r\n },\r\n\r\n classRules: function (element) {\r\n var rules = {};\r\n var classes = $(element).attr('class');\r\n classes && $.each(classes.split(' '), function () {\r\n if (this in $.validator.classRuleSettings) {\r\n $.extend(rules, $.validator.classRuleSettings[this]);\r\n }\r\n });\r\n return rules;\r\n },\r\n\r\n attributeRules: function (element) {\r\n var rules = {};\r\n var $element = $(element);\r\n\r\n for (var method in $.validator.methods) {\r\n var value;\r\n // If .prop exists (jQuery >= 1.6), use it to get true/false for required\r\n if (method === 'required' && typeof $.fn.prop === 'function') {\r\n value = $element.prop(method);\r\n } else {\r\n value = $element.attr(method);\r\n }\r\n if (value) {\r\n rules[method] = value;\r\n } else if ($element[0].getAttribute(\"type\") === method) {\r\n rules[method] = true;\r\n }\r\n }\r\n\r\n // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs\r\n if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {\r\n delete rules.maxlength;\r\n }\r\n\r\n return rules;\r\n },\r\n\r\n metadataRules: function (element) {\r\n if (!$.metadata) return {};\r\n\r\n var meta = $.data(element.form, 'validator').settings.meta;\r\n return meta ?\r\n $(element).metadata()[meta] :\r\n $(element).metadata();\r\n },\r\n\r\n staticRules: function (element) {\r\n var rules = {};\r\n var validator = $.data(element.form, 'validator');\r\n if (validator.settings.rules) {\r\n rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};\r\n }\r\n return rules;\r\n },\r\n\r\n normalizeRules: function (rules, element) {\r\n // handle dependency check\r\n $.each(rules, function (prop, val) {\r\n // ignore rule when param is explicitly false, eg. required:false\r\n if (val === false) {\r\n delete rules[prop];\r\n return;\r\n }\r\n if (val.param || val.depends) {\r\n var keepRule = true;\r\n switch (typeof val.depends) {\r\n case \"string\":\r\n keepRule = !!$(val.depends, element.form).length;\r\n break;\r\n case \"function\":\r\n keepRule = val.depends.call(element, element);\r\n break;\r\n }\r\n if (keepRule) {\r\n rules[prop] = val.param !== undefined ? val.param : true;\r\n } else {\r\n delete rules[prop];\r\n }\r\n }\r\n });\r\n\r\n // evaluate parameters\r\n $.each(rules, function (rule, parameter) {\r\n rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;\r\n });\r\n\r\n // clean number parameters\r\n $.each(['minlength', 'maxlength', 'min', 'max'], function () {\r\n if (rules[this]) {\r\n rules[this] = Number(rules[this]);\r\n }\r\n });\r\n $.each(['rangelength', 'range'], function () {\r\n if (rules[this]) {\r\n rules[this] = [Number(rules[this][0]), Number(rules[this][1])];\r\n }\r\n });\r\n\r\n if ($.validator.autoCreateRanges) {\r\n // auto-create ranges\r\n if (rules.min && rules.max) {\r\n rules.range = [rules.min, rules.max];\r\n delete rules.min;\r\n delete rules.max;\r\n }\r\n if (rules.minlength && rules.maxlength) {\r\n rules.rangelength = [rules.minlength, rules.maxlength];\r\n delete rules.minlength;\r\n delete rules.maxlength;\r\n }\r\n }\r\n\r\n // To support custom messages in metadata ignore rule methods titled \"messages\"\r\n if (rules.messages) {\r\n delete rules.messages;\r\n }\r\n\r\n return rules;\r\n },\r\n\r\n // Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\r\n normalizeRule: function (data) {\r\n if (typeof data == \"string\") {\r\n var transformed = {};\r\n $.each(data.split(/\\s/), function () {\r\n transformed[this] = true;\r\n });\r\n data = transformed;\r\n }\r\n return data;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Validator/addMethod\r\n addMethod: function (name, method, message) {\r\n $.validator.methods[name] = method;\r\n $.validator.messages[name] = message != undefined ? message : $.validator.messages[name];\r\n if (method.length < 3) {\r\n $.validator.addClassRules(name, $.validator.normalizeRule(name));\r\n }\r\n },\r\n\r\n methods: {\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/required\r\n required: function (value, element, param) {\r\n // check if dependency is met\r\n if (!this.depend(param, element))\r\n return \"dependency-mismatch\";\r\n switch (element.nodeName.toLowerCase()) {\r\n case 'select':\r\n // could be an array for select-multiple or a string, both are fine this way\r\n var val = $(element).val();\r\n return val && val.length > 0;\r\n case 'input':\r\n if (this.checkable(element))\r\n return this.getLength(value, element) > 0;\r\n default:\r\n return $.trim(value).length > 0;\r\n }\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/remote\r\n remote: function (value, element, param) {\r\n if (this.optional(element))\r\n return \"dependency-mismatch\";\r\n\r\n var previous = this.previousValue(element);\r\n if (!this.settings.messages[element.name])\r\n this.settings.messages[element.name] = {};\r\n previous.originalMessage = this.settings.messages[element.name].remote;\r\n this.settings.messages[element.name].remote = previous.message;\r\n\r\n param = typeof param == \"string\" && { url: param } || param;\r\n\r\n if (this.pending[element.name]) {\r\n return \"pending\";\r\n }\r\n if (previous.old === value) {\r\n return previous.valid;\r\n }\r\n\r\n previous.old = value;\r\n var validator = this;\r\n this.startRequest(element);\r\n var data = {};\r\n data[element.name] = value;\r\n $.ajax($.extend(true, {\r\n url: param,\r\n mode: \"abort\",\r\n port: \"validate\" + element.name,\r\n dataType: \"json\",\r\n data: data,\r\n success: function (response) {\r\n validator.settings.messages[element.name].remote = previous.originalMessage;\r\n var valid = response === true;\r\n if (valid) {\r\n var submitted = validator.formSubmitted;\r\n validator.prepareElement(element);\r\n validator.formSubmitted = submitted;\r\n validator.successList.push(element);\r\n validator.showErrors();\r\n } else {\r\n var errors = {};\r\n var message = response || validator.defaultMessage(element, \"remote\");\r\n errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;\r\n validator.showErrors(errors);\r\n }\r\n previous.valid = valid;\r\n validator.stopRequest(element, valid);\r\n }\r\n }, param));\r\n return \"pending\";\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/minlength\r\n minlength: function (value, element, param) {\r\n return this.optional(element) || this.getLength($.trim(value), element) >= param;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/maxlength\r\n maxlength: function (value, element, param) {\r\n return this.optional(element) || this.getLength($.trim(value), element) <= param;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/rangelength\r\n rangelength: function (value, element, param) {\r\n var length = this.getLength($.trim(value), element);\r\n return this.optional(element) || (length >= param[0] && length <= param[1]);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/min\r\n min: function (value, element, param) {\r\n return this.optional(element) || value >= param;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/max\r\n max: function (value, element, param) {\r\n return this.optional(element) || value <= param;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/range\r\n range: function (value, element, param) {\r\n return this.optional(element) || (value >= param[0] && value <= param[1]);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/email\r\n email: function (value, element) {\r\n // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/\r\n return this.optional(element) || /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i.test(value);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/url\r\n url: function (value, element) {\r\n // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/\r\n return this.optional(element) || /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test(value);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/date\r\n date: function (value, element) {\r\n return this.optional(element) || !/Invalid|NaN/.test(new Date(value));\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/dateISO\r\n dateISO: function (value, element) {\r\n return this.optional(element) || /^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.test(value);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/number\r\n number: function (value, element) {\r\n return this.optional(element) || /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$/.test(value);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/digits\r\n digits: function (value, element) {\r\n return this.optional(element) || /^\\d+$/.test(value);\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/creditcard\r\n // based on http://en.wikipedia.org/wiki/Luhn\r\n creditcard: function (value, element) {\r\n if (this.optional(element))\r\n return \"dependency-mismatch\";\r\n // accept only spaces, digits and dashes\r\n if (/[^0-9 -]+/.test(value))\r\n return false;\r\n var nCheck = 0,\r\n nDigit = 0,\r\n bEven = false;\r\n\r\n value = value.replace(/\\D/g, \"\");\r\n\r\n for (var n = value.length - 1; n >= 0; n--) {\r\n var cDigit = value.charAt(n);\r\n var nDigit = parseInt(cDigit, 10);\r\n if (bEven) {\r\n if ((nDigit *= 2) > 9)\r\n nDigit -= 9;\r\n }\r\n nCheck += nDigit;\r\n bEven = !bEven;\r\n }\r\n\r\n return (nCheck % 10) == 0;\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/accept\r\n accept: function (value, element, param) {\r\n param = typeof param == \"string\" ? param.replace(/,/g, '|') : \"png|jpe?g|gif\";\r\n return this.optional(element) || value.match(new RegExp(\".(\" + param + \")$\", \"i\"));\r\n },\r\n\r\n // http://docs.jquery.com/Plugins/Validation/Methods/equalTo\r\n equalTo: function (value, element, param) {\r\n // bind to the blur event of the target in order to revalidate whenever the target field is updated\r\n // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead\r\n var target = $(param).unbind(\".validate-equalTo\").bind(\"blur.validate-equalTo\", function () {\r\n $(element).valid();\r\n });\r\n return value == target.val();\r\n }\r\n\r\n }\r\n\r\n });\r\n\r\n // deprecated, use $.validator.format instead\r\n $.format = $.validator.format;\r\n\r\n})(jQuery);\r\n\r\n// ajax mode: abort\r\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\r\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\r\n; (function ($) {\r\n var pendingRequests = {};\r\n // Use a prefilter if available (1.5+)\r\n if ($.ajaxPrefilter) {\r\n $.ajaxPrefilter(function (settings, _, xhr) {\r\n var port = settings.port;\r\n if (settings.mode == \"abort\") {\r\n if (pendingRequests[port]) {\r\n pendingRequests[port].abort();\r\n }\r\n pendingRequests[port] = xhr;\r\n }\r\n });\r\n } else {\r\n // Proxy ajax\r\n var ajax = $.ajax;\r\n $.ajax = function (settings) {\r\n var mode = (\"mode\" in settings ? settings : $.ajaxSettings).mode,\r\n port = (\"port\" in settings ? settings : $.ajaxSettings).port;\r\n if (mode == \"abort\") {\r\n if (pendingRequests[port]) {\r\n pendingRequests[port].abort();\r\n }\r\n return (pendingRequests[port] = ajax.apply(this, arguments));\r\n }\r\n return ajax.apply(this, arguments);\r\n };\r\n }\r\n})(jQuery);\r\n\r\n// provides cross-browser focusin and focusout events\r\n// IE has native support, in other browsers, use event caputuring (neither bubbles)\r\n\r\n// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation\r\n// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target\r\n; (function ($) {\r\n // only implement if not provided by jQuery core (since 1.4)\r\n // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs\r\n if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {\r\n $.each({\r\n focus: 'focusin',\r\n blur: 'focusout'\r\n }, function (original, fix) {\r\n $.event.special[fix] = {\r\n setup: function () {\r\n this.addEventListener(original, handler, true);\r\n },\r\n teardown: function () {\r\n this.removeEventListener(original, handler, true);\r\n },\r\n handler: function (e) {\r\n arguments[0] = $.event.fix(e);\r\n arguments[0].type = fix;\r\n return $.event.handle.apply(this, arguments);\r\n }\r\n };\r\n function handler(e) {\r\n\r\n e = $.event.fix(e);\r\n e.type = fix;\r\n if ($.event.handle) {//CUSTOMIZED FOR IF-SHOP: added to avoid exception if event.handle is undefined\r\n return $.event.handle.call(this, e);\r\n }\r\n }\r\n });\r\n };\r\n $.extend($.fn, {\r\n validateDelegate: function (delegate, type, handler) {\r\n return this.bind(type, function (event) {\r\n var target = $(event.target);\r\n if (target.is(delegate)) {\r\n return handler.apply(target, arguments);\r\n }\r\n });\r\n }\r\n });\r\n})(jQuery);\r\n","(function ($) {\r\n var cultures = $.cultures,\r\n en = cultures.en,\r\n standard = en.calendars.standard,\r\n culture = cultures[\"da\"] = $.extend(true, {}, en, {\r\n name: \"da\",\r\n englishName: \"Danish\",\r\n nativeName: \"dansk\",\r\n language: \"da\",\r\n numberFormat: {\r\n ',': \".\",\r\n '.': \",\",\r\n percent: {\r\n ',': \".\",\r\n '.': \",\"\r\n },\r\n currency: {\r\n pattern: [\"$ -n\", \"$ n\"],\r\n ',': \".\",\r\n '.': \",\",\r\n symbol: \"kr.\"\r\n }\r\n },\r\n calendars: {\r\n standard: $.extend(true, {}, standard, {\r\n '/': \"/\",\r\n firstDay: 1,\r\n days: {\r\n names: [\"søndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"lørdag\"],\r\n namesAbbr: [\"sø\", \"ma\", \"ti\", \"on\", \"to\", \"fr\", \"lø\"],\r\n namesShort: [\"sø\", \"ma\", \"ti\", \"on\", \"to\", \"fr\", \"lø\"]\r\n },\r\n months: {\r\n names: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\", \"\"],\r\n namesAbbr: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\", \"\"]\r\n },\r\n AM: null,\r\n PM: null,\r\n patterns: {\r\n d: \"dd-MM-yyyy\",\r\n e: \"dd/MM/yyyy\", /*IFWS*/\r\n g: \"ddMMyyyy\", /*IFWS*/\r\n h: \"ddMMyy\", /*IFWS*/\r\n D: \"d. MMMM yyyy\",\r\n t: \"HH:mm\",\r\n T: \"HH:mm:ss\",\r\n f: \"d. MMMM yyyy HH:mm\",\r\n F: \"d. MMMM yyyy HH:mm:ss\",\r\n M: \"d. MMMM\",\r\n Y: \"MMMM yyyy\"\r\n }\r\n })\r\n }\r\n }, cultures[\"da\"]);\r\n culture.calendar = culture.calendars.standard;\r\n})(jQuery);","/*!\r\n * 'addPlaceholder' Plugin for jQuery\r\n *\r\n * @author Ilia Draznin\r\n * @link http://iliadraznin.com/2011/02/jquery-placeholder-plugin/\r\n * @created 19-02-2011\r\n * @updated 06-04-2011\r\n * @version 1.0.3\r\n *\r\n * Description:\r\n * jQuery plugin that adds \"placeholder\" functionality (like in Chrome) to browsers that \r\n * don't support it natively (like Firefox 3.6 or lower, or IE naturally)\r\n * \r\n * Usage:\r\n * $(selector).addPlaceholder(options);\r\n */\r\n(function($){\r\n\r\n\t// add placeholder support check to jQuery.support\r\n\t// idea from March Gortz https://gist.github.com/373672\r\n\t$.extend($.support, { placeholder: !!('placeholder' in document.createElement('input')) });\r\n\r\n\t$.fn.addPlaceholder = function(options){\r\n\t\tvar settings = {\r\n\t\t\t'class': 'placeholder',\t\t// name of the class you want to use for placeholder styles\r\n\t\t\t'allowspaces': false,\t\t// if true doesn't trim value strings so \" \" input would NOT be replaced by placeholder (i.e. it's considered valid)\r\n\t\t\t'dopass': true,\t\t\t\t// these two allow you to ignore certain fields, it's a small speed optimization\r\n\t\t\t'dotextarea': true,\r\n\t\t\t'checkafill': false\t\t\t// if true there's a periodic check in case something auto-filled the password fields\r\n\t\t};\r\n\t\t\r\n\t\treturn this.each(function(){\r\n\t\t\t// if browser supports placeholder stop the function\r\n\t\t\tif ($.support.placeholder) return false;\r\n\t\t\t\r\n\t\t\t// get the options if there are any\r\n\t\t\t$.extend( settings, options );\r\n\t\t\t\r\n\t\t\t// tag must be either input or textarea, if 'dotextarea' is true, otherwise move to next element\r\n\t\t\t// using this.tagName instead of $(this).is() because it's faster\r\n\t\t\tif ( !( this.tagName.toLowerCase()=='input' || (settings['dotextarea'] && this.tagName.toLowerCase()=='textarea') ) ) return true;\r\n\t\t\t\r\n\t\t\t// finally let's get $(this) and do one last test for placeholder value\r\n\t\t\tvar $this = $(this),\r\n\t\t\t\tph = this.getAttribute('placeholder'),\r\n\t\t\t\tispass = $this.is('input[type=password]');\t\t// this is used twice so I'm assigning it to a variable\r\n\t\t\t\r\n\t\t\tif (!ph) return true;\r\n\t\t\t\r\n\t\t\t// so, we have a legit tag and it has a placeholder value, let's get to work\r\n\t\t\t\r\n\t\t\t// if the input is a password field and 'dopass' is true use passPlacehold()\r\n\t\t\tif (settings['dopass'] && ispass) {\r\n\t\t\t\tpassPlacehold($this, ph);\r\n\t\t\t}\r\n\t\t\t// in case 'dopass' was false double check it's not a password field and then\r\n\t\t\t// for both textarea and regular input the same function applies\r\n\t\t\telse if (!ispass) {\r\n\t\t\t\tinputPlacehold($this, ph)\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\tfunction inputPlacehold(el, ph) {\r\n\t\t\t// set as placeholder if value is empty or is equal to placeholder text\r\n\t\t\t// then use class as flag (instead of checking value)\r\n\t\t\tif ( valueEmpty(el.val()) || el.val()==ph ) {\r\n\t\t\t\tel.val(ph);\r\n\t\t\t\tel.addClass(settings['class']);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// setup the events for the field\r\n\t\t\tel.focusin(function(){\r\n\t\t\t\tif (el.hasClass(settings['class'])) {\r\n\t\t\t\t\tel.removeClass(settings['class']);\r\n\t\t\t\t\tel.val('');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tel.focusout(function(){\r\n\t\t\t\tif ( valueEmpty(el.val()) ) {\r\n\t\t\t\t\tel.val(ph);\r\n\t\t\t\t\tel.addClass(settings['class']);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\tfunction passPlacehold(el, ph) {\r\n\t\t\tel.addClass(settings['class']);\r\n\t\t\t// setup the initial placeholder, i.e. span\r\n\t\t\tvar span = $('',{\r\n\t\t\t\t'class': el.attr('class')+' '+settings['class'],\t// 'inherit' class from the input field + the placeholder class\r\n\t\t\t\ttext: ph,\r\n\t\t\t\tcss: {\r\n\t\t\t\t\tborder:\t\t'none',\t\t\t\t\t// since inherited styles from input, \"clean\" them for the span: remove border\r\n\t\t\t\t\tcursor:\t\t'text',\t\t\t\t\t// give text cursor so it looks like part of the input field\r\n\t\t\t\t\tbackground:\t'transparent',\t\t\t// clear background to be transparent\r\n\t\t\t\t\tposition:\t'absolute',\t\t\t\t// position the span appropriately\r\n\t\t\t\t\ttop:\t\tel.position().top,\r\n\t\t\t\t\tleft:\t\tel.position().left,\r\n\t\t\t\t\tlineHeight: el.height()+3+'px',\t\t// needs adjustment due to extra \"natural\" padding of input fields\r\n\t\t\t\t\tpaddingLeft:parseFloat(el.css('paddingLeft'))+2+'px'\t// ditto as above\r\n\t\t\t\t}\r\n\t\t\t}).insertAfter(el);\r\n\t\t\t\r\n\t\t\t// setup the events for the password placeholder\r\n\t\t\tel.focusin(function(){\r\n\t\t\t\tif (el.hasClass(settings['class'])) {\r\n\t\t\t\t\tspan.hide();\r\n\t\t\t\t\tel.removeClass(settings['class']);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tel.focusout(function(){\r\n\t\t\t\tif ( valueEmpty(el.val()) ) {\r\n\t\t\t\t\tspan.show();\r\n\t\t\t\t\tel.addClass(settings['class']);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tif (settings['checkafill']) {\r\n\t\t\t\t// periodically check the password field for content\r\n\t\t\t\t// in case an auto form filler has kicked in and filled it\r\n\t\t\t\t// setInterval replaced by self calling function with setTimeout\r\n\t\t\t\t// thanks to Paul Irish for the tip http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/\r\n\t\t\t\t(function checkPass(){\r\n\t\t\t\t\tif (!valueEmpty(el.val()) && el.hasClass(settings['class'])) {\r\n\t\t\t\t\t\tel.focusin();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsetTimeout(checkPass, 250);\r\n\t\t\t\t})();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// does a \"smart\" check to see if value is empty givem allowance for multiple spaces\r\n\t\tfunction valueEmpty( value ) {\r\n\t\t\treturn settings['allowspaces'] ? value==='' : $.trim(value)==='';\r\n\t\t}\r\n\t};\r\n})(jQuery);","/*!\r\n * jQuery Form Plugin\r\n * version: 3.43.0-2013.09.03\r\n * Requires jQuery v1.5 or later\r\n * Copyright (c) 2013 M. Alsup\r\n * Examples and documentation at: http://malsup.com/jquery/form/\r\n * Project repository: https://github.com/malsup/form\r\n * Dual licensed under the MIT and GPL licenses.\r\n * https://github.com/malsup/form#copyright-and-license\r\n */\r\n/*global ActiveXObject */\r\n; (function ($) {\r\n \"use strict\";\r\n\r\n /*\r\n Usage Note:\r\n -----------\r\n Do not use both ajaxSubmit and ajaxForm on the same form. These\r\n functions are mutually exclusive. Use ajaxSubmit if you want\r\n to bind your own submit handler to the form. For example,\r\n \r\n $(document).ready(function() {\r\n $('#myForm').on('submit', function(e) {\r\n e.preventDefault(); // <-- important\r\n $(this).ajaxSubmit({\r\n target: '#output'\r\n });\r\n });\r\n });\r\n \r\n Use ajaxForm when you want the plugin to manage all the event binding\r\n for you. For example,\r\n \r\n $(document).ready(function() {\r\n $('#myForm').ajaxForm({\r\n target: '#output'\r\n });\r\n });\r\n \r\n You can also use ajaxForm with delegation (requires jQuery v1.7+), so the\r\n form does not have to exist when you invoke ajaxForm:\r\n \r\n $('#myForm').ajaxForm({\r\n delegation: true,\r\n target: '#output'\r\n });\r\n \r\n When using ajaxForm, the ajaxSubmit function will be invoked for you\r\n at the appropriate time.\r\n */\r\n\r\n /**\r\n * Feature detection\r\n */\r\n var feature = {};\r\n feature.fileapi = $(\"\").get(0).files !== undefined;\r\n feature.formdata = window.FormData !== undefined;\r\n\r\n var hasProp = !!$.fn.prop;\r\n\r\n // attr2 uses prop when it can but checks the return type for\r\n // an expected string. this accounts for the case where a form \r\n // contains inputs with names like \"action\" or \"method\"; in those\r\n // cases \"prop\" returns the element\r\n $.fn.attr2 = function () {\r\n if (!hasProp)\r\n return this.attr.apply(this, arguments);\r\n var val = this.prop.apply(this, arguments);\r\n if ((val && val.jquery) || typeof val === 'string')\r\n return val;\r\n return this.attr.apply(this, arguments);\r\n };\r\n\r\n /**\r\n * ajaxSubmit() provides a mechanism for immediately submitting\r\n * an HTML form using AJAX.\r\n */\r\n $.fn.ajaxSubmit = function (options) {\r\n /*jshint scripturl:true */\r\n\r\n // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\r\n if (!this.length) {\r\n log('ajaxSubmit: skipping submit process - no element selected');\r\n return this;\r\n }\r\n\r\n var method, action, url, $form = this;\r\n\r\n if (typeof options == 'function') {\r\n options = { success: options };\r\n }\r\n else if (options === undefined) {\r\n options = {};\r\n }\r\n\r\n method = options.type || this.attr2('method');\r\n action = options.url || this.attr2('action');\r\n\r\n url = (typeof action === 'string') ? $.trim(action) : '';\r\n url = url || window.location.href || '';\r\n if (url) {\r\n // clean url (don't include hash vaue)\r\n url = (url.match(/^([^#]+)/) || [])[1];\r\n }\r\n\r\n options = $.extend(true, {\r\n url: url,\r\n success: $.ajaxSettings.success,\r\n type: method || $.ajaxSettings.type,\r\n iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'\r\n }, options);\r\n\r\n // hook for manipulating the form data before it is extracted;\r\n // convenient for use with rich editors like tinyMCE or FCKEditor\r\n var veto = {};\r\n this.trigger('form-pre-serialize', [this, options, veto]);\r\n if (veto.veto) {\r\n log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\r\n return this;\r\n }\r\n\r\n // provide opportunity to alter form data before it is serialized\r\n if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\r\n log('ajaxSubmit: submit aborted via beforeSerialize callback');\r\n return this;\r\n }\r\n\r\n var traditional = options.traditional;\r\n if (traditional === undefined) {\r\n traditional = $.ajaxSettings.traditional;\r\n }\r\n\r\n var elements = [];\r\n var qx, a = this.formToArray(options.semantic, elements);\r\n if (options.data) {\r\n options.extraData = options.data;\r\n qx = $.param(options.data, traditional);\r\n }\r\n\r\n // give pre-submit callback an opportunity to abort the submit\r\n if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\r\n log('ajaxSubmit: submit aborted via beforeSubmit callback');\r\n return this;\r\n }\r\n\r\n // fire vetoable 'validate' event\r\n this.trigger('form-submit-validate', [a, this, options, veto]);\r\n if (veto.veto) {\r\n log('ajaxSubmit: submit vetoed via form-submit-validate trigger');\r\n return this;\r\n }\r\n\r\n var q = $.param(a, traditional);\r\n if (qx) {\r\n q = (q ? (q + '&' + qx) : qx);\r\n }\r\n if (options.type.toUpperCase() == 'GET') {\r\n options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\r\n options.data = null; // data is null for 'get'\r\n }\r\n else {\r\n options.data = q; // data is the query string for 'post'\r\n }\r\n\r\n var callbacks = [];\r\n if (options.resetForm) {\r\n callbacks.push(function () { $form.resetForm(); });\r\n }\r\n if (options.clearForm) {\r\n callbacks.push(function () { $form.clearForm(options.includeHidden); });\r\n }\r\n\r\n // perform a load on the target only if dataType is not provided\r\n if (!options.dataType && options.target) {\r\n var oldSuccess = options.success || function () { };\r\n callbacks.push(function (data) {\r\n var fn = options.replaceTarget ? 'replaceWith' : 'html';\r\n $(options.target)[fn](data).each(oldSuccess, arguments);\r\n });\r\n }\r\n else if (options.success) {\r\n callbacks.push(options.success);\r\n }\r\n\r\n options.success = function (data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg\r\n var context = options.context || this; // jQuery 1.4+ supports scope context\r\n for (var i = 0, max = callbacks.length; i < max; i++) {\r\n callbacks[i].apply(context, [data, status, xhr || $form, $form]);\r\n }\r\n };\r\n\r\n if (options.error) {\r\n var oldError = options.error;\r\n options.error = function (xhr, status, error) {\r\n var context = options.context || this;\r\n oldError.apply(context, [xhr, status, error, $form]);\r\n };\r\n }\r\n\r\n if (options.complete) {\r\n var oldComplete = options.complete;\r\n options.complete = function (xhr, status) {\r\n var context = options.context || this;\r\n oldComplete.apply(context, [xhr, status, $form]);\r\n };\r\n }\r\n\r\n // are there files to upload?\r\n\r\n // [value] (issue #113), also see comment:\r\n // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219\r\n var fileInputs = $('input[type=file]:enabled', this).filter(function () { return $(this).val() != ''; });\r\n\r\n var hasFileInputs = fileInputs.length > 0;\r\n var mp = 'multipart/form-data';\r\n var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);\r\n\r\n var fileAPI = feature.fileapi && feature.formdata;\r\n log(\"fileAPI :\" + fileAPI);\r\n var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;\r\n\r\n var jqxhr;\r\n\r\n // options.iframe allows user to force iframe mode\r\n // 06-NOV-09: now defaulting to iframe mode if file input is detected\r\n if (options.iframe !== false && (options.iframe || shouldUseFrame)) {\r\n // hack to fix Safari hang (thanks to Tim Molendijk for this)\r\n // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\r\n if (options.closeKeepAlive) {\r\n $.get(options.closeKeepAlive, function () {\r\n jqxhr = fileUploadIframe(a);\r\n });\r\n }\r\n else {\r\n jqxhr = fileUploadIframe(a);\r\n }\r\n }\r\n else if ((hasFileInputs || multipart) && fileAPI) {\r\n jqxhr = fileUploadXhr(a);\r\n }\r\n else {\r\n jqxhr = $.ajax(options);\r\n }\r\n\r\n $form.removeData('jqxhr').data('jqxhr', jqxhr);\r\n\r\n // clear element array\r\n for (var k = 0; k < elements.length; k++)\r\n elements[k] = null;\r\n\r\n // fire 'notify' event\r\n this.trigger('form-submit-notify', [this, options]);\r\n return this;\r\n\r\n // utility fn for deep serialization\r\n function deepSerialize(extraData) {\r\n var serialized = $.param(extraData, options.traditional).split('&');\r\n var len = serialized.length;\r\n var result = [];\r\n var i, part;\r\n for (i = 0; i < len; i++) {\r\n // #252; undo param space replacement\r\n serialized[i] = serialized[i].replace(/\\+/g, ' ');\r\n part = serialized[i].split('=');\r\n // #278; use array instead of object storage, favoring array serializations\r\n result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);\r\n }\r\n return result;\r\n }\r\n\r\n // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)\r\n function fileUploadXhr(a) {\r\n var formdata = new FormData();\r\n\r\n for (var i = 0; i < a.length; i++) {\r\n formdata.append(a[i].name, a[i].value);\r\n }\r\n\r\n if (options.extraData) {\r\n var serializedData = deepSerialize(options.extraData);\r\n for (i = 0; i < serializedData.length; i++)\r\n if (serializedData[i])\r\n formdata.append(serializedData[i][0], serializedData[i][1]);\r\n }\r\n\r\n options.data = null;\r\n\r\n var s = $.extend(true, {}, $.ajaxSettings, options, {\r\n contentType: false,\r\n processData: false,\r\n cache: false,\r\n type: method || 'POST'\r\n });\r\n\r\n if (options.uploadProgress) {\r\n // workaround because jqXHR does not expose upload property\r\n s.xhr = function () {\r\n var xhr = $.ajaxSettings.xhr();\r\n if (xhr.upload) {\r\n xhr.upload.addEventListener('progress', function (event) {\r\n var percent = 0;\r\n var position = event.loaded || event.position; /*event.position is deprecated*/\r\n var total = event.total;\r\n if (event.lengthComputable) {\r\n percent = Math.ceil(position / total * 100);\r\n }\r\n options.uploadProgress(event, position, total, percent);\r\n }, false);\r\n }\r\n return xhr;\r\n };\r\n }\r\n\r\n s.data = null;\r\n var beforeSend = s.beforeSend;\r\n s.beforeSend = function (xhr, o) {\r\n o.data = formdata;\r\n if (beforeSend)\r\n beforeSend.call(this, xhr, o);\r\n };\r\n return $.ajax(s);\r\n }\r\n\r\n // private function for handling file uploads (hat tip to YAHOO!)\r\n function fileUploadIframe(a) {\r\n var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;\r\n var deferred = $.Deferred();\r\n\r\n // #341\r\n deferred.abort = function (status) {\r\n xhr.abort(status);\r\n };\r\n\r\n if (a) {\r\n // ensure that every serialized input is still enabled\r\n for (i = 0; i < elements.length; i++) {\r\n el = $(elements[i]);\r\n if (hasProp)\r\n el.prop('disabled', false);\r\n else\r\n el.removeAttr('disabled');\r\n }\r\n }\r\n\r\n s = $.extend(true, {}, $.ajaxSettings, options);\r\n s.context = s.context || s;\r\n id = 'jqFormIO' + (new Date().getTime());\r\n if (s.iframeTarget) {\r\n $io = $(s.iframeTarget);\r\n n = $io.attr2('name');\r\n if (!n)\r\n $io.attr2('name', id);\r\n else\r\n id = n;\r\n }\r\n else {\r\n $io = $('