' : '') + '' + '' + ''; return link; } /* remove menu hover effect and close other dropdown if you open a new one. */ window.document.addEventListener('click', function (event) { var openMenus = document.querySelectorAll('#postnordTopbar [aria-expanded="true"]'); for (var i = 0; openMenus.length > i; i++) { if (openMenus[i] !== event.target && !openMenus[i].parentNode.contains(event.target)) { openMenus[i].setAttribute('aria-expanded', 'false'); var element = openMenus[i].parentElement.querySelector('.main-menu-dropdown-content[aria-hidden="false"]') || openMenus[i].parentElement.querySelector('.mobile-main-menu-dropdown-content[aria-hidden="false"]'); if (element) { element.setAttribute('aria-hidden', 'true'); } } } }); function addToolToTopbar(dynamicTool, topbar, translations) { if (dynamicTool && dynamicTool.url && dynamicTool.url.indexOf('elinonline') > -1) { /* This if-statement can be removed when the market site stopped adding ELIN manually */ return; } dynamicServices.push(dynamicTool); function helperSanitizeName(dynamicTool, langKey) { var dtAttrItem = dynamicTool.i18n[langKey]; if (!dtAttrItem) { /** Use first element if target language is not present */ dtAttrItem = dynamicTool.i18n[Object.keys(dynamicTool.i18n)[0]]; } return dtAttrItem; } /** Add dynamic toolbar's name and explanation text to static translations */ translations['DYNAMIC_TOOL_' + dynamicTool.id + '_NAME'] = { en: helperSanitizeName(dynamicTool, 'EN').name, sv: helperSanitizeName(dynamicTool, 'SV').name, no: helperSanitizeName(dynamicTool, 'NO').name, da: helperSanitizeName(dynamicTool, 'DA').name, fi: helperSanitizeName(dynamicTool, 'FI').name }; translations['DYNAMIC_TOOL_' + dynamicTool.id + '_TEXT'] = { en: helperSanitizeName(dynamicTool, 'EN').explanationText, sv: helperSanitizeName(dynamicTool, 'SV').explanationText, no: helperSanitizeName(dynamicTool, 'NO').explanationText, da: helperSanitizeName(dynamicTool, 'DA').explanationText, fi: helperSanitizeName(dynamicTool, 'FI').explanationText }; updateMyServicesView(services, iam, topbar); } function getServiceOrdering() { /* Determines the order in which they appear in the waffle menu list, the lower number the higher up */ /* Sites can inject their own services so thats why we have to do this client side */ var waffleMenuServices = { skickadirekt: 5, onlineporto: 5, ncp: 10, shippingtoolpremium: 15, directmail: 20, mailouts: 20, skapautskickV2: 20, claimspublic: 25, elin: 35, ecnow: 40, packsoft: 45, web2printdk: 45, toolDK0: 30, toolSE0: 51, toolSE1: 55, toolSE2: 60, alltoolsse: 65, alltoolsdk: 65 }; /* Only show link back to market site if on the portal */ if (isOnPortalDomain() || isDev()) { waffleMenuServices.postnorddk = '4'; waffleMenuServices.postnordfi = '4'; waffleMenuServices.postnordno = '4'; waffleMenuServices.postnordse = '4'; } return waffleMenuServices; } function isOnPortalDomain() { return location.hostname.endsWith('portal.postnord.com'); } function isDev() { return location.hostname.startsWith('localhost'); } return { fetchMyServices: fetchMyServices, services: services, updateMyUserInfoView: updateMyUserInfoView, addToolToTopbar: addToolToTopbar };};function removeTrailingSlash(url) { if (url) { var lastChar = url.slice(-1); var hasTrailingSlash = lastChar === '/'; return hasTrailingSlash ? url.slice(0, -1) : url; }}function getCurrentSiteTxt() { return document.location.hostname;}function getCurrentSiteOrigin() { return document.location.origin;}window.LoginItemsService = function LoginItemsService(options) { var loginItemsMap = {}; var loginItems = []; function serviceSupportsSelectedMarket(currentSelectedMarket, service) { /* If supported market not specified, then it is free for all! */ if (!service.supportedMarkets) { return true; } return service.supportedMarkets.indexOf(currentSelectedMarket) !== -1; } function svgString() { return ( '' ); } function svgStringMobile() { return ( '' ); } function createLink(element, item) { var div = document.createElement('div'); div.className = 'loginBtnText focus-class-links'; div.tabIndex = -1; div.dataset.xtranslate = item.i18nKey; var link = document.createElement('a'); link.href = item.url; link.className = 'loginBtn'; link.tabIndex = 4; link.id = 'loginitem-' + item.id; link.setAttribute('role', 'loginItem_' + item.id); /* Append this svg first, because its troublesome being string */ link.innerHTML = svgString(); /* Then append span as first child to preceed the svg in the views */ link.insertBefore(div, link.childNodes[0]); element.appendChild(link); } function createMobileViewLink(element, item) { var text = document.createElement('span'); text.dataset.xtranslate = item.i18nKey; var link = document.createElement('a'); link.href = item.url; link.className = 'loginBtn loginBtnMobile'; /* Append this svg first, because its troublesome being string */ link.innerHTML = svgStringMobile(); /* Then append span as first child to preceed the svg in the views */ link.insertBefore(text, link.childNodes[0]); var div = document.createElement('div'); div.setAttribute('aria-hidden', 'true'); div.className = 'mobil-menu-dynamic-login-item'; div.setAttribute('role', 'loginItem_' + item.id); div.appendChild(link); element.appendChild(div); } function getI18nNameKey(itemId) { return 'DYNAMIC_LOGIN_ITEM_' + itemId + '_NAME'; } function sanitizeI18n(loginItem, langKey) { var dtAttrItem = loginItem.i18n[langKey]; if (!dtAttrItem) { /* Use first element if target language is not present */ dtAttrItem = loginItem.i18n[Object.keys(loginItem.i18n)[0]]; } return dtAttrItem; } function updateLoginItemsView(topbar) { var loginItemsElements = document.querySelectorAll('[role=loginItems]'); for (var i = 0; i < loginItemsElements.length; i++) { var loginItemElement = loginItemsElements[i]; for (var x = 0; x < loginItems.length; x++) { var loginItem = loginItems[x]; loginItem.i18nKey = getI18nNameKey(loginItem.id); /* 'forceShowItem' for sites like postnord.dk, otherwise, market specific. */ if (loginItem.forceShowItem || serviceSupportsSelectedMarket(topbar.market, loginItem)) { var existingItems = loginItemElement.querySelectorAll('[role=loginItem_' + loginItem.id + ']'); /* Create only if loginItem is still not on the view */ if (!existingItems.length) { if (loginItemElement.id === 'loginItemsMobileView') { createMobileViewLink(loginItemElement, loginItem); } else { createLink(loginItemElement, loginItem); } } } else { /* Seek and remove these items, there could be multiple depending on view. */ var targetItems = loginItemElement.querySelectorAll('[role=loginItem_' + loginItem.id + ']'); for (var z = 0; z < targetItems.length; z++) { targetItems[z].parentElement.removeChild(targetItems[z]); } } } } topbar.rerunI18nOfTopbarComponents(); } function addLoginItemsToTopbar(paramItems, topbar, translations) { for (var x = 0; x < paramItems.length; x++) { var loginItem = paramItems[x]; /* Populate the map for uniqueness of entries, may override former entries */ loginItemsMap[loginItem.id] = loginItem; /* Add dynamic toolbar's name and explanation text to static translations */ translations[getI18nNameKey(loginItem.id)] = { en: sanitizeI18n(loginItem, 'EN').name, sv: sanitizeI18n(loginItem, 'SV').name, no: sanitizeI18n(loginItem, 'NO').name, da: sanitizeI18n(loginItem, 'DA').name, fi: sanitizeI18n(loginItem, 'FI').name }; translations['DYNAMIC_LOGIN_ITEM_' + loginItem.id + '_TEXT'] = { en: sanitizeI18n(loginItem, 'EN').explanationText, sv: sanitizeI18n(loginItem, 'SV').explanationText, no: sanitizeI18n(loginItem, 'NO').explanationText, da: sanitizeI18n(loginItem, 'DA').explanationText, fi: sanitizeI18n(loginItem, 'FI').explanationText }; } /* Update list value based on the map */ var renewedItems = []; for (var z in loginItemsMap) { if (loginItemsMap.hasOwnProperty(z)) { renewedItems.push(loginItemsMap[z]); } } loginItems = renewedItems; /* Update html view */ updateLoginItemsView(topbar); } return { addLoginItemsToTopbar: addLoginItemsToTopbar, updateLoginItemsView: updateLoginItemsView };};window.UserPreferenceService = function UserPreferenceService(options) { /* Services that will not load user settings from backend, */ /* due to some technical reasons and by a team's request. */ /* These services will use the local storage of browser instead. */ var excludedUris = ['/skickadirekt', '/onlineporto', '/shippingtoolpro', '/onboard', '/mypages-modal']; var excludedHosts = [ 'postnord-se.test', 'postnord-dk.test', /*'www.postnord.se',*/ 'www.postnord.dk', 'www.postnord.fi', 'www.postnord.no' ]; function isSiteExcluded() { for (var x = 0; x < excludedUris.length; x++) { var excludeUri = excludedUris[x]; if (location.pathname.startsWith(excludeUri)) { /* URI is excluded from loading saved user preference */ return true; } } for (var i = 0; i < excludedHosts.length; i++) { var excludedHost = excludedHosts[i]; if (location.hostname.startsWith(excludedHost)) { /* Host is excluded from loading saved user preference */ return true; } } return false; } return { isSiteExcluded: isSiteExcluded };};function httpHelper(requestData) { var url = requestData.url; var method = requestData.method; var authorization = requestData.authorization; var payload = requestData.payload; var headers = { 'Content-type': 'application/json' }; var body = null; if (authorization) { headers.Authorization = authorization; } if (payload) { body = JSON.stringify(payload); } return fetch(url, { method: method, headers: headers, body: body });}'use strict';window.PostNordTopbar = function PostNordTopbar(options) { var shouldDebugLogs = options.debugLogs === 'true'; var debugLog = getLogger(shouldDebugLogs); var cartItems = 0; var replayEvents = {}; /* can be used for retriggering events that maybe subjected to race condictions */ var rootUrl = options.currentSite; var translations = options.translations; var hasServerError = false; var hasTopbarLoaded = false; var hadLangageUrlParam = false; var clickedMobileMenuButton = ''; var topbarElement = window.document.getElementById('postnordTopbar'); var alertsFetcher = new window.AlertsFetcher(topbarElement, options); var menuItems = window.topbarMenuItems(options); var appendParamToUrl = function (url, param) { if (!url || !param && (!param.name || !param.value)) { return; } var resultUrl = new URL(url); resultUrl.searchParams.append(param.name, param.value); return resultUrl.href; }; var appendClientIdToUrl = function (url, clientId) { if (!url || !clientId) return; return appendParamToUrl(url, { name: 'client_id', value: clientId }); }; var myServices = new window.MyServicesService(appendClientIdToUrl(options.unifiedLoginUrl + '/authorization', options.unifiedLoginClientId), options.currentServiceId, options.translations); var logintItemsService = new window.LoginItemsService(options); var userPreferenceService = new window.UserPreferenceService(options); var ls = window.localStorageWrapper(); var markets = ['DK', 'FI', 'NO', 'SE']; var languages = [{ key: 'da', name: 'Dansk' }, { key: 'en', name: 'English' }, { key: 'no', name: 'Norsk' }, { key: 'sv', name: 'Svenska' }, { key: 'fi', name: 'Suomi' }]; /* This is for topbar internal use only, main use is to trigger external callbacks only, such that we */ /* bypass any internal (topbar local code) callbacks of change language or market listeners that could */ /* trigger requests to the backend systems. */ var topbarUserI18nChangeCallbacks = { languageCallbacks: [], marketCallbacks: [] }; var showLoginMenu = function (event, element) { event.preventDefault(); if (topbar.market === 'SE' || topbar.market === 'DK') { login(); } else { showMenu(event, element); } }; /* public Object */ var topbar = { get version() { return options.version; }, get stage() { return options.stage; }, get currentServiceId() { return options.currentServiceId; }, get currentServiceName() { return options.currentServiceName; }, get rootUrl() { return rootUrl; }, set rootUrl(url) { rootUrl = url; }, get user() { return getUser(); }, get userData() { return getUser(); }, get isLoggedIn() { return !!checkLoginStatus(); }, get isCashPayingUser() { return isCashPayingUser(); }, get isBusinessUser() { return isBusinessUser(); }, get isPrivateUser() { return isPrivateUser(); }, get isInternalUser() { return isInternalUser(); }, get isFederatedUser() { return isFederatedUser(); }, get isSwitchUser() { return isSwitchUser(); }, get readOnlyMode() { return hasAssumeUserAmr(); }, get menuType() { return getMenuType(); }, get myServices() { return myServices.services; }, get loginUrl() { return getLoginUrl(); }, get onboardingUrl() { return getOnboardingUrl(); }, get id_token() { return getIdToken(); }, get access_token() { return getAccessToken(); }, get session_id() { return getSessionId(); }, get hasServerError() { return hasServerError; }, set languages(newLanguages) { if (Array.isArray(newLanguages) && newLanguages.length > 0 && typeof newLanguages[0] === 'object' && newLanguages[0].key && typeof newLanguages[0].name) { updateSelectableLanguageUI(newLanguages); updateSelectedLanguageUI(topbar.language); languages = newLanguages; } else { console.warn('\nThe languages array that you tried to set was not in ' + 'the correct format.\nMake sure it is an object array, with above zero ' + 'length, with properties key and name.\nLike this: [{key: "en", name: "English"}]', newLanguages); } }, get languages() { return languages; }, get language() { return getLanguage(); }, set language(language) { if (validateLanguageKeyAgainsLanguages(language, languages)) { ls.setItem('language', language); triggerChangeLanguageEvent(language); } else { console.warn('Language does not exist among the existing languages for this page.', '\nYou tried to set:', language, '\nExisting languages are:', languages); } }, set markets(newMarkets) { if (Array.isArray(newMarkets) && newMarkets.length > 0) { updateSelectableMarketsUI(newMarkets, topbar.market); updateSelectedMarket(topbar.market); topbar.rerunI18nOfTopbarComponents(); } else { console.warn('\nThe markets array that you tried to set was not ' + 'the correct format.\nMake sure it is an array like this: ' + '["DK", "FI", "NO", "SE"]'); } }, get markets() { return markets; }, get market() { /* Local storage is the official storage, while the 'options.selectedMarket' is the default. */ return ls.getItem('market') || options.selectedMarket; }, set market(newMarket) { if (newMarket) { newMarket = newMarket.toUpperCase(); } if (markets.indexOf(newMarket) !== -1) { ls.setItem('market', newMarket); triggerChangeMarketsEvent(newMarket); } else { console.warn('\nThe market that you tried to set (' + newMarket + ')was not valid.' + '\nMake sure it is a string with one of these values:' + '\n"DK", "FI", "NO" or "SE".'); } }, get isInternational() { if (!checkLoginStatus()) { ls.setItem('isInternational', false); } var data = ls.getItem('isInternational'); var international = data && JSON.parse(data); return !!international; }, changeLanguage: function (e, language) { e.preventDefault(); this.language = language; setLanguageHeadertext(language); hideMenus(); updateLanguageForGoogleTagManager(language); updateSitesList(language); }, changeMarkets: function (e, market) { e.preventDefault(); this.market = market; hideMenus(); setLanguagesBasedOnMarket(market); /* This is needed for allowing cross domain tracking for the market sites */ if (isOnMarketDomain()) { var clientId = getGoogleAnalyticsClientId(); if (clientId) { var marketUrl = 'https://www.postnord.' + market + '/?' + clientId; location.href = marketUrl; } } updateMarketForGoogleTagManager(market); }, set cartItems(numberOfItems) { cartItems = numberOfItems; updateCartUI(cartItems); }, showMenu: showMenu, showSubmenu: showSubmenu, showLoginMenu: showLoginMenu, set onCartClick(func) { addCartClickEventListener(func); }, set onSelectOrg(func) { addSelectOrgEventListener(func); }, set onCachedRedirectUrlDetected(func) { addCachedRedirectUrlDetectedListener(func); }, set onChangeMarket(func) { /* To segragate external callbacks for later well targetted use. */ topbarUserI18nChangeCallbacks.marketCallbacks.push(func); addChangeMarketsEventListener(func); }, set onChangeLanguage(func) { /* To segragate external callbacks for later well targetted use. */ topbarUserI18nChangeCallbacks.languageCallbacks.push(func); addChangeLanguageEventListener(func); }, set onServiceWorkerRegistered(func) { addServiceWorkerRegisteredEventListener(func); }, set onSavedPreferences(func) { addSavedPreferencesEventListener(func); }, set onUsersLanguageAndMarketReady(func) { /* Services who are dependent to lang/market can add listeners when user pref are loaded. */ addUsersLanguageAndMarketReadyEventListener(func); }, set onRefreshedTokens(func) { addRefreshedTokensEventListener(func); }, set onLogout(func) { addLogoutEventListener(func); }, login: function () { login(); }, logout: function () { logout(); }, get logoutUrl() { return appendClientIdToUrl(options.unifiedLoginUrl + '/logout', options.unifiedLoginClientId); }, refreshTokens: function (config) { return refreshTokens(config); }, clearTokens: function () { clearTokens(); }, getAccessTokenAsync: function () { return validateOrRefreshTokens(); }, createNewUser: function () { location.href = getOnboardingUrl(); }, addLoginItemsToTopbar: function (loginItems) { logintItemsService.addLoginItemsToTopbar(loginItems, topbar, translations); }, addToolToTopbar: function (dynamicTool) { myServices.addToolToTopbar(dynamicTool, topbar, translations); }, addWebPushSubscription: function _callee() { return regeneratorRuntime.async(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.abrupt("return", addWebPushSubscription()); case 1: case "end": return _context.stop(); } } }, null, null, null, Promise); }, rerunI18nOfTopbarComponents: function () { /* There are instantces where you want to refresh page to reflect i18n, e.g added new tool etc */ /* But you cannot use the topbar.language assignment because it will effing call all callbacks! */ updateTranslationsUI(translations, this.language, topbarElement); updateTooltips(this.language, translations); }, hasAlertsBeenFetched: function () { return alertsFetcher.hasAlertsBeenFetched(topbar.access_token); }, get alerts() { return alertsFetcher.getAlerts(topbar.access_token); }, fetchAlerts: function () { triggerFetchAlerts(); }, fetchMoreAlerts: function () { /* empty for now */ }, readAllAlerts: function () { alertsFetcher.readAllAlerts(options.alertsEndpoint, topbar.access_token); }, /* 'id' has 2 forms, for public alerts it is the 'keyIds', for user alerts it is compound of 'id' and 'created' joined by an '_'. */ navigateToAlert: function (id, doRedirect, linkInMessageClicked, linkElem) { /* Call this to do preprocess before redirecting to the intended alerts page, is also the read alert. */ alertsFetcher.navigateToAlert(options.alertsEndpoint, topbar.access_token, id, doRedirect, linkInMessageClicked, linkElem); }, set onAlertsFetched(func) { addAlertsFetchedEventListener(func); }, set onAlertsAction(func) { /* Hooks for actions like read, etc */ addAlertsActionedEventListener(func); }, clearAlertsBadge: function () { /* This will just reset the number of unseen alerts (not to be confused with read) */ alertsFetcher.resetUnseenAlertsCount(options.alertsEndpoint, topbar.access_token, this.market); }, triggerEvent: function (e) { triggerEvent(e); }, get hasLoaded() { return hasTopbarLoaded; }, switchUser: function (data) { backupSwitchUserTokens(); switchUser(data); }, get selectedOrgNumber() { return getSelectedOrgNumber(); }, get selectedOrgName() { return getSelectedOrgName(); }, get organisations() { return getUserOrgs() || []; }, get authorities() { return getAuthIds(); }, get shouldUseProfileSwitch() { var orgs = getUserOrgs(); if (!orgs || !orgs.length) return false; return shouldUseProfileSwitch(orgs); }, get shouldDeleteSelectedOrg() { var orgs = getUserOrgs(); if (!orgs || !orgs.length) return false; return shouldDeleteSelectedOrg(orgs); }, enableFeatureToggles: function (features) { return enableFeatureToggles(features); }, clearAllFeatureToggles: function () { return clearAllFeatureToggles(); }, isFeatureEnabled: function (feature) { return isFeatureEnabled(feature); }, debugLog: function (msg) { return debugLog(msg); }, getUserSettings: function () { return getUserSettingsLocalStorage(); }, setUserSettings: function _callee2(key, value) { return regeneratorRuntime.async(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: return _context2.abrupt("return", updateUserSettings(key, value)); case 1: case "end": return _context2.stop(); } } }, null, null, null, Promise); } }; var disturbanceAlertsUtil = new window.DisturbanceAlertsUtil(options); var reminderAlertsUtil = new window.ReminderAlertsUtil(options, topbar); function checkForLoginError() { var href = location.href.toString(); if (href.indexOf('server_error') >= 0) { hasServerError = true; console.warn('Server error from IAM (500). Cannot login. '); location.assign(options.errorPage500Url); } } function initCart() { var desktopCart = document.getElementById('topbarCart'); var mobileCart = document.getElementById('topbarCartMobile'); if (!desktopCart || !mobileCart) { return; } desktopCart.addEventListener('click', function () { triggerCartClickEvent(); }); mobileCart.addEventListener('click', function () { triggerCartClickEvent(); }); if (options.stage) { desktopCart.removeAttribute('href'); mobileCart.removeAttribute('href'); } } var getOnboardingUrl = function () { var market = topbar.market; var isMarketNO = options.currentServiceId === 'postnordno'; if (isMarketNO) return 'https://portal.postnord.no/register'; if (market === 'SE' || market === 'DK' || market === 'FI') { return options.onboardingUrl + '?market=' + topbar.market; } return options.oldOnboardingUrl + rootUrl; }; function showMenu(e, element, mobileMenuClicked) { e.preventDefault(); if (mobileMenuClicked) { showCorrectContentInMobileMenu(mobileMenuClicked); closeMobileMenu(element, '.mobile-main-menu-dropdown-content', mobileMenuClicked); } else { /* You clicked on the menu in desktop mode */ var dropdown = element.parentNode.querySelector('.main-menu-dropdown-content'); var hiddenState = dropdown.getAttribute('aria-hidden'); var newHiddenState = hiddenState === 'true' ? 'false' : 'true'; dropdown.setAttribute('aria-hidden', newHiddenState); var expandedState = element.getAttribute('aria-expanded'); var newExpandedState = expandedState === 'true' ? 'false' : 'true'; element.setAttribute('aria-expanded', newExpandedState); } } function closeMobileMenu(element, htmlElement, mobileMenuClicked) { var dropdown = element.parentNode.querySelector(htmlElement); var hiddenState = dropdown.getAttribute('aria-hidden'); if (hiddenState === 'false' && mobileMenuClicked !== clickedMobileMenuButton) { clickedMobileMenuButton = mobileMenuClicked; return; } clickedMobileMenuButton = mobileMenuClicked; var newHiddenState = hiddenState === 'true' ? 'false' : 'true'; dropdown.setAttribute('aria-hidden', newHiddenState); var expandedState = element.getAttribute('aria-expanded'); var newExpandedState = expandedState === 'true' ? 'false' : 'true'; element.setAttribute('aria-expanded', newExpandedState); } function showSubmenu(clickedElement, submenuId) { var isExpanded = clickedElement.getAttribute('aria-expanded') === 'true'; clickedElement.setAttribute('aria-expanded', !isExpanded); if (submenuId) { var submenu = document.getElementById(submenuId); submenu.setAttribute('aria-hidden', '' + isExpanded); } } function showCorrectContentInMobileMenu(menuClicked) { var toolElement = document.getElementById('mobileToolsMenu'); var moreElement = document.getElementById('mobileMoreMenu'); if (menuClicked === 'tools') { toolElement.style.display = 'block'; moreElement.style.display = 'none'; } else { toolElement.style.display = 'none'; moreElement.style.display = 'block'; } } function hideMenus() { var openMenus = document.querySelectorAll('#postnordTopbar .main-menu-dropdown-content[aria-hidden="false"]'); for (var i = 0; openMenus.length > i; i++) { openMenus[i].setAttribute('aria-hidden', 'true'); } openMenus = document.querySelectorAll('#postnordTopbar button[aria-expanded="true"], #postnordTopbar div[aria-expanded="true"]'); for (var j = 0; openMenus.length > j; j++) { openMenus[j].setAttribute('aria-expanded', 'false'); } } function setLanguageHeadertext(language) { var languageHeader = document.getElementById('languageText'); for (var key in languages) { if (languages[key].key === language) { languageHeader.textContent = languages[key].name; } } /** Also change market indicator on language change */ setMarketHeadertext(topbar.market); } var setMarketHeadertext = function (market) { var marketHeader = document.getElementById('marketText'); switch (market) { case 'DK': marketHeader.textContent = translations.DENMARK[topbar.language] || translations.DENMARK.en; break; case 'SE': marketHeader.textContent = translations.SWEDEN[topbar.language] || translations.SWEDEN.en; break; case 'FI': marketHeader.textContent = translations.FINLAND[topbar.language] || translations.FINLAND.en; break; case 'NO': marketHeader.textContent = translations.NORWAY[topbar.language] || translations.NORWAY.en; break; } }; var setUpMarketSelectorDisplay = function () { setUserMarketFromCustomerNumbers(); setMarketSelectorDisplay(); }; function addAlertsFetchedEventListener(func) { topbarElement.addEventListener('alertsFetched', function (e) { func(e.detail.alerts); }, false); } function addAlertsActionedEventListener(func) { topbarElement.addEventListener('alertsActioned', function (e) { func(e.detail.alertsId); }, false); } function hideAlerts() { var list = window.document.querySelectorAll('[role=alertsElements]'); for (var i = 0; i < list.length; i++) { if (!list[i]) { return; } list[i].style.display = 'none'; } } var setupAlerts = function () { alertsFetcher.init(options.alertsEndpoint, topbar); if (options.currentServiceId === 'postnordno') { hideAlerts(); } if (topbar.isPrivateUser || topbar.isBusinessUser || topbar.isInternalUser) { /* Warning! use of market might cause race condition with user market settings */ var noAuthoritiesFoundAlert = null; var userAuthIds = getAuthIds(); if (isFederatedUser() && !userAuthIds.length) { noAuthoritiesFoundAlert = createAlertTemplate('INFORMATIVE_CONTEXTUAL', 'ATTENTION', 'NO_AUTHORITES_FOUND_FOR_THIS_USER', ['portal.postnord.com']); } alertsFetcher.fetchAlerts(options.alertsEndpoint, topbar.access_token, topbar.market, noAuthoritiesFoundAlert); var fetchAlertsInterval = function (alertsEndpoint, fetchAlerts) { if (topbar.isLoggedIn) { fetchAlerts(alertsEndpoint, topbar.access_token, topbar.market, noAuthoritiesFoundAlert); } }; setInterval(function () { return fetchAlertsInterval(options.alertsEndpoint, alertsFetcher.fetchAlerts); }, 60000 /* one minute */ ); } else { /* For public users, generic alerts, etc. */ alertsFetcher.fetchPublicAlerts(options.alertsEndpoint, topbar.market); var fetchPublicAlertsInterval = function (url, fetchPublicAlerts) { fetchPublicAlerts(url, topbar.market); }; setInterval(function () { return fetchPublicAlertsInterval(options.alertsEndpoint, alertsFetcher.fetchPublicAlerts); }, 300000 /* five minutes */ ); } /*topbar.onAlertsFetched = function () { showMessageIfFederatedUserHasNoAuthorities(); };*/ }; /* For force trigger of fetch alerts, e.g. user triggered or on market change. */ var triggerFetchAlerts = function () { if (topbar.access_token && topbar.isLoggedIn) { alertsFetcher.fetchAlerts(options.alertsEndpoint, topbar.access_token, topbar.market); } else { alertsFetcher.fetchPublicAlerts(options.alertsEndpoint, topbar.market); } }; var removeParamFromUrl = function (url, param) { if (!url || !param && !param.name) return; var resultUrl = new URL(url); resultUrl.searchParams.delete(param.name); return resultUrl.href; }; var removeOneTimeCodeFromUrl = function (url) { if (!url) return; var param = { name: 'oneTimeCode' }; return removeParamFromUrl(url, param); }; var appendLanguageToUrl = function (url) { if (!url) return; var language = getLanguage(); var cleanLanguage = language === 'zu' ? 'en' : language; /* backend don't support 'zu' language */ return appendParamToUrl(url, { name: 'language', value: cleanLanguage }); }; var appendRedirectionUrlToUrl = function (url, urlToAdd) { if (!url || !urlToAdd) return; return appendParamToUrl(url, { name: 'redirectionUrl', value: urlToAdd }); }; var appendSessionIdToUrl = function (url, sessionId) { if (!url || !sessionId) return; return appendParamToUrl(url, { name: 'authorization', value: sessionId }); }; var getLoginUrl = function () { if (options.currentServiceId === 'postnordno') { return 'https://portal.postnord.no/login'; } var currentUrl = removeOneTimeCodeFromUrl(location.href); var loginUrl = appendLanguageToUrl(menuItems.topbarLogin.url); /* language for IAM login page */ loginUrl = appendRedirectionUrlToUrl(loginUrl, currentUrl); loginUrl = appendClientIdToUrl(loginUrl, options.unifiedLoginClientId); return loginUrl; }; var login = function () { clearAlerts(); debugLog(`Login URL: ${getLoginUrl()}`); location.href = getLoginUrl(); }; function deleteCookie(name) { document.cookie = name + '=temp; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT'; } var clearTokens = function () { deleteCookie('IAM_access_token_expires'); deleteCookie('IAM_access_token'); clearAccessToken(); clearAccessTokenExpiryTime(); clearIdToken(); clearUser(); clearOrgData(); clearUserSettingsLocalStorage(); clearIsSwitchUser(); clearAssumedEmail(); clearSwitchUserRequestId(); }; var clearOrgData = function () { clearSelectedOrgName(); clearSelectedOrgNumber(); clearUserOrgs(); }; var clearAlerts = function () { hideReminderAlerts(); ls.removeItem('pn-disturbance-alerts'); ls.removeItem('pn-reminder-alerts'); ls.removeItem('pn-reminder-read-alerts'); }; var hideReminderAlerts = function () { var alertContainer = document.querySelector('.pn-reminder-alert'); alertContainer.classList.add('hidden'); }; function logoutCleanup() { clearTokens(); updateAllUrls(); updateUIOnLoginStatus(topbar.isLoggedIn); hideCart(); } var logout = function _callee3() { var isSwitchUserCached, sessionIdCached; return regeneratorRuntime.async(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: isSwitchUserCached = isSwitchUser(); sessionIdCached = getSessionId(); logoutCleanup(); clearAlerts(); if (!isSwitchUserCached) { _context3.next = 6; break; } return _context3.abrupt("return", switchUserLogout()); case 6: if (sessionIdCached) { clearSessionId(); backendLogout(sessionIdCached); } /*triggerLogoutEvent();*/ case 7: case "end": return _context3.stop(); } } }, null, null, null, Promise); }; var switchUserLogout = function () { clearIsSwitchUser(); clearAssumedEmail(); clearSwitchUserRequestId(); var isSwitchUserCallback = location.href.includes(`${getPortalUrl()}/switch-user-callback`); if (isLocalhost() || isSwitchUserCallback) { location.reload(); } else { location.href = options.userManagementUrl; } }; var backendLogout = function (sessionId) { var currentUrl = removeTrailingSlash(location.href); var redirectUrl = appendRedirectionUrlToUrl(options.unifiedLoginUrl + '/logout', currentUrl); redirectUrl = appendSessionIdToUrl(redirectUrl, sessionId); redirectUrl = appendClientIdToUrl(redirectUrl, options.unifiedLoginClientId); /* kill the IAM / Access & Login session */ location.href = redirectUrl; }; function getLanguage() { return ls.getItem('language') || getGeolocationLanguage(); } function getGeolocationLanguage() { var language = window.navigator.languages && window.navigator.languages[0] ? window.navigator.languages[0] : null; language = (language || window.navigator.userLanguage || window.navigator.language).toLowerCase(); if (language.indexOf('sv') !== -1 || language.indexOf('se') !== -1) { return 'sv'; } else if (language.indexOf('fi') !== -1) { return 'fi'; } else if (language.indexOf('no') !== -1 || language.indexOf('nn') !== -1) { return 'no'; } else if (language.indexOf('dk') !== -1 || language.indexOf('da') !== -1) { return 'da'; } else { return 'en'; } } function validateLanguageKeyAgainsLanguages(language, languages) { for (var key in languages) { if (languages[key].key === language) { return true; } } return false; } var updateTranslationsUI = function (translations, language, topbarElement) { var elems = topbarElement ? topbarElement.querySelectorAll('[data-xtranslate]') : []; /* alerts elems don't exist within the topbar elem */ var disturbanceAlertsElems = document.querySelector('.pn-disturbance-alert').querySelectorAll('[data-xtranslate]') || []; var reminderAlertsElems = document.querySelector('.pn-reminder-alert').querySelectorAll('[data-xtranslate]') || []; elems.forEach(function (elem) { return translateElement(elem, language, translations); }); disturbanceAlertsElems.forEach(function (elem) { return translateElement(elem, language, translations); }); reminderAlertsElems.forEach(function (elem) { return translateElement(elem, language, translations); }); }; var translateElement = function (elem, language, translations) { var value = translations[elem.getAttribute('data-xtranslate')] ? translations[elem.getAttribute('data-xtranslate')][language] || translations[elem.getAttribute('data-xtranslate')].en : elem.getAttribute('data-xtranslate'); elem.textContent = value; elem.setAttribute('aria-label', value); }; var updateUserSettings = function _callee4(key, value) { var payload; return regeneratorRuntime.async(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (!(userPreferenceService.isSiteExcluded() || !getAccessToken() || isSwitchUser() || !value)) { _context4.next = 2; break; } return _context4.abrupt("return"); case 2: _context4.prev = 2; payload = {}; payload[key] = value; _context4.next = 7; return regeneratorRuntime.awrap(updateUserSettingsRequest(payload, getAccessToken())); case 7: triggerSavedPreferencesEvent({ key: key, value: value }); _context4.next = 13; break; case 10: _context4.prev = 10; _context4.t0 = _context4["catch"](2); console.warn('[topbar] Failed to set user preference ' + key + ' preference to ' + value, _context4.t0); case 13: case "end": return _context4.stop(); } } }, null, null, [[2, 10]], Promise); }; var fetchUserSettings = function _callee5(accessToken) { var data; return regeneratorRuntime.async(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (!(userPreferenceService.isSiteExcluded() || !accessToken)) { _context5.next = 2; break; } return _context5.abrupt("return"); case 2: _context5.prev = 2; _context5.next = 5; return regeneratorRuntime.awrap(fetchUserSettingsRequest(accessToken)); case 5: data = _context5.sent; handleUserSettings(data); _context5.next = 12; break; case 9: _context5.prev = 9; _context5.t0 = _context5["catch"](2); console.warn('[topbar] Failed to get topbar user settings from backend', _context5.t0); case 12: case "end": return _context5.stop(); } } }, null, null, [[2, 9]], Promise); }; function fetchUserSettingsRequest(accessToken) { return new Promise(function (resolve, reject) { var url = options.topbarUserSettingsUrl + 'usersettings?_=' + new Date().getTime(); httpHelper({ url: url, method: 'GET', authorization: accessToken }).then(function (res) { return res.json(); }).then(function (data) { resolve(data); }).catch(function (err) { console.error(err); reject(); }); }); } var updateUserSettingsRequest = function _callee6(payload, accessToken) { return regeneratorRuntime.async(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.prev = 0; _context6.next = 3; return regeneratorRuntime.awrap(httpHelper({ url: options.topbarUserSettingsUrl + 'usersettings/', method: 'POST', authorization: accessToken, payload: payload })); case 3: _context6.next = 10; break; case 5: _context6.prev = 5; _context6.t0 = _context6["catch"](0); debugLog('Failed to update topbar user settings in backend'); debugLog(_context6.t0); throw new Error('Failed to update user settings.'); case 10: case "end": return _context6.stop(); } } }, null, null, [[0, 5]], Promise); }; function addUsersLanguageAndMarketReadyEventListener(func) { topbarElement.addEventListener('usersLanguageAndMarketReady', function (e) { func(e.detail); }, false); } var triggerUsersLanguageAndMarketReadyEvent = function (data) { var usersLanguageAndMarketReadyEvent = new CustomEvent('usersLanguageAndMarketReady', { bubbles: true, cancelable: true, detail: data }); triggerEvent(usersLanguageAndMarketReadyEvent); }; var addWebPushSubscription = function _callee8() { return regeneratorRuntime.async(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: if (isWebPushSupported()) { _context8.next = 2; break; } return _context8.abrupt("return"); case 2: navigator.serviceWorker.getRegistration().then(function (serviceWorker) { if (!serviceWorker) return; showPermissonOverlay(); Notification.requestPermission().then(function (permission) { hidePermissonOverlay(); if (permission === 'denied') { return; } else { serviceWorker.pushManager.subscribe({ applicationServerKey: options.webPushPublicVapidKey, userVisibleOnly: true }).then(function _callee7(subscription) { var payload, res; return regeneratorRuntime.async(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: hideWebPushNotificationsSuggestion(); if (subscription) { _context7.next = 3; break; } return _context7.abrupt("return"); case 3: payload = { endpoint: subscription.endpoint, keys: subscription.toJSON().keys, userId: topbar.user.userId }; _context7.next = 6; return regeneratorRuntime.awrap(httpHelper({ url: options.webPushNotificationsUrl + '/subscription', method: 'PUT', authorization: topbar.access_token, payload: payload })); case 6: res = _context7.sent; if (res.ok) { setCurrentWebPushNotificationSubscriptionState(subscription); } case 8: case "end": return _context7.stop(); } } }, null, null, null, Promise); }).catch(function (error) { hideWebPushNotificationsSuggestion(); /* could not subscribe. Most likely because user pressed deny when prompted to allow notifications */ }); } }); }); case 3: case "end": return _context8.stop(); } } }, null, null, null, Promise); }; var hideWebPushNotificationsSuggestion = function () { var element = document.getElementById('webPushNotificationsSuggestion'); if (element) { element.classList.add('pn-is-hidden'); } }; var setCurrentWebPushNotificationSubscriptionState = function (subscription) { var userId = topbar.user && topbar.user.userId; var endpoint = subscription && subscription.endpoint; if (!userId || !endpoint) return; ls.setItem('currentWebPushNotificationSubscriptionState', { userId: userId, endpoint: endpoint, created: Date.now() }); }; var isWebPushNotificationSubscriptionNewlyAdded = function (subscription) { var item = ls.getItem('currentWebPushNotificationSubscriptionState'); if (!item) return false; var isSameUserId = item.userId === (topbar.user && topbar.user.userId); var isSameEndpoint = item.endpoint === (subscription && subscription.endpoint); var isNewlyAdded = Date.now() - (item.lastModified || item.created) < 1000 * 3600 * 12; /* Has sub been created during the last 12 hours */ return isSameUserId && isSameEndpoint && isNewlyAdded; }; var addWebPushSubscriptionIfItsMissing = function _callee10(serviceWorker) { return regeneratorRuntime.async(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: serviceWorker.pushManager.getSubscription().then(function _callee9(subscription) { return regeneratorRuntime.async(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: if (!isSwitchUser()) { _context9.next = 3; break; } subscription.unsubscribe(); return _context9.abrupt("return"); case 3: if (!isWebPushNotificationSubscriptionNewlyAdded(subscription)) { _context9.next = 5; break; } return _context9.abrupt("return"); case 5: _context9.next = 7; return regeneratorRuntime.awrap(addWebPushSubscription()); case 7: case "end": return _context9.stop(); } } }, null, null, null, Promise); }); case 1: case "end": return _context10.stop(); } } }, null, null, null, Promise); }; var initWebPushNotifications = function (userSettings) { if (!isWebPushSupported() || !userSettings || !userSettings.webPushNotifications) return; navigator.serviceWorker.getRegistration().then(function (serviceWorker) { if (!serviceWorker) { topbar.onServiceWorkerRegistered = function (sw) { addWebPushSubscriptionIfItsMissing(sw); }; } else { addWebPushSubscriptionIfItsMissing(serviceWorker); } }); }; var isWebPushSupported = function () { return topbar.user && !isSwitchUser() && 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window; }; var showPermissonOverlay = function () { var defaultNotificationPermisson = Notification.permission === 'default'; if (defaultNotificationPermisson) { var overlay = document.createElement('div'); overlay.id = 'pn-notification-permission-overlay'; var topbarContainer = window.top.document.querySelector('#postnordTopbarContainer'); topbarContainer.appendChild(overlay); } }; var hidePermissonOverlay = function () { var topbarContainer = window.top.document.querySelector('#postnordTopbarContainer'); var overlay = topbarContainer.querySelector('#pn-notification-permission-overlay'); if (overlay) topbarContainer.removeChild(overlay); }; var setTextForMarket = { SE: 'SWEDEN', DK: 'DENMARK', NO: 'NORWAY', FI: 'FINLAND' }; function updateSelectableMarketsUI(newMarkets, selectedMarket) { var changeMarketElements = topbarElement.querySelectorAll('[data-name=' + menuItems.topbarMarkets.id + ']'); if (!changeMarketElements) { return; } for (var i = 0; i < changeMarketElements.length; i++) { var content = changeMarketElements[i].querySelectorAll('[role=marketSelector]'); for (var y = 0; y < content.length; y++) { content[y].innerHTML = ''; var newMarketList = ''; var tabindex = 6; for (var prop in newMarkets) { if (newMarkets.hasOwnProperty(prop)) { tabindex++; var m = newMarkets[prop]; var marketUrl = 'https://www.postnord.' + m.toLowerCase(); newMarketList += '' + '' + setTextForMarket[m] + '' + ''; } } content[y].innerHTML = newMarketList; } } } var getSiteUrl = function (linkId, language) { var sites = { PN_DA: { default: 'https://www.postnord.dk/en', da: 'https://www.postnord.dk' }, PN_FI: { default: 'https://www.postnord.fi/en', fi: 'https://www.postnord.fi' }, PN_NO: { default: 'https://www.postnord.no/en', no: 'https://www.postnord.no' }, PN_SV: { default: 'https://www.postnord.se/en', sv: 'https://www.postnord.se' }, PN_DE: { default: 'https://www.postnord.com/en/about-us/our-market/germany' }, PN_PORTAL: { default: 'https://portal.postnord.com' }, PN_STRALFORS: { default: 'https://www.stralfors.com' }, DIRECT_LINK: { default: 'https://www.directlink.com' } }; var keys = Object.keys(sites); /* Loop through sites URLs object */ for (var i = 0; i < keys.length; i++) { var key = keys[i]; var foundSiteMatch = key === linkId; if (foundSiteMatch) { var value = sites[key]; /* Try to find a language match, otherwise use the default URL */ return value[language] || value.default; } } }; function updateSitesList(language) { var serviceId = topbar.currentServiceId; if (serviceId !== 'pncom') { return; } var siteElem = topbarElement.querySelector('[data-name=' + menuItems.topbarSites.id + ']'); if (!siteElem) { return; } var siteList = siteElem.querySelectorAll('[role=siteSelector] > a'); if (!siteList) { return; } for (var i = 0; i < siteList.length; i++) { var link = siteList[i]; var linkId = link.dataset.xtranslate; var siteUrl = getSiteUrl(linkId, language); link.href = siteUrl; } } function getGoogleAnalyticsClientId() { var clientId = null; var ga = window[window.GoogleAnalyticsObject]; if (ga && ga.getAll) { clientId = ga.getAll()[0].get('linkerParam'); } return clientId; } /* Set correct language on tooltips for market and lanuage. */ function updateTooltips(language, translations) { if (!translations || !translations.length) return; var toolTipElements = document.querySelectorAll('[role=tooltip]'); for (var i = 0; i < toolTipElements.length; i++) { if (toolTipElements[i] !== undefined) { toolTipElements[i].title = translations[toolTipElements[i].name][language]; } } } var filterLanguagesBasedOnMarket = function (market) { if (!market) return; market = market.toUpperCase(); var languagesMap = { SE: { languages: createLanguages([{ sv: 'Svenska' }, { en: 'English' }]) }, DK: { languages: createLanguages([{ da: 'Dansk' }, { en: 'English' }]) }, NO: { languages: createLanguages([{ no: 'Norsk' }, { en: 'English' }]) }, FI: { languages: createLanguages([{ fi: 'Suomi' }, { sv: 'Svenska' }, { en: 'English' }]) } }; var languages = languagesMap[market] && languagesMap[market].languages || languagesMap.SE.languages; /* default to SE */ return languages; }; var createLanguages = function (languagesToAdd) { var languages = []; languagesToAdd.forEach(function (language) { var languageKey = Object.keys(language)[0]; var languageName = Object.values(language)[0]; languages.push(createLanguage(languageKey, languageName)); }); /* Add Zulu language in test stage */ if (isTestStage() || isLocalhost() || isDevStage()) { var zuluLanguage = createLanguage('zu', 'Zulu'); languages.push(zuluLanguage); } return languages; }; var createLanguage = function (key, name) { return { key: key, name: name }; }; var setLanguagesBasedOnMarket = function (market) { if (!market) return; market = market.toUpperCase(); var languages = filterLanguagesBasedOnMarket(market); var language = languages[0].key; topbar.languages = languages; if (preventOverwritingSelectedLanguage(market, language)) return; topbar.language = language; }; /* prevents change of language on market change, if the new market contains the same language */ var preventOverwritingSelectedLanguage = function (market, language) { var isSameLanguage = language === topbar.language; var isFiMarketSvLanguage = market === 'FI' && topbar.language === 'sv'; var isEnLanguage = topbar.language === 'en'; var isZuluLanguage = topbar.language === 'zu'; var rules = [isSameLanguage, isFiMarketSvLanguage, isEnLanguage, isZuluLanguage]; return rules.some(function (rule) { return rule; }); /* check if any rule is true */ }; var updateSelectableLanguageUI = function (languages, language) { var changeLanguagesElements = topbarElement.querySelectorAll('[data-name=' + menuItems.topbarLanguages.id + ']'); if (!changeLanguagesElements) return; setLanguageHeadertext(language); for (var i = 0; i < changeLanguagesElements.length; i++) { var changeLanguagesElement = changeLanguagesElements[i]; var content = changeLanguagesElement.querySelectorAll('[role=langageSelector]'); for (var y = 0; y < content.length; y++) { content[y].innerHTML = ''; var languageList = ''; var tabIndexForLanguage = 11; /* Start on 11, its the next index from the html in index.html */ for (var prop in languages) { if (languages.hasOwnProperty(prop)) { tabIndexForLanguage++; var l = languages[prop]; languageList += '' + '' + l.name + '' + ''; } } content[y].innerHTML = languageList; } } }; var updateSelectedLanguageUI = function (language) { var changeLanguagesElements = topbarElement.querySelectorAll('[data-name=' + menuItems.topbarLanguages.id + ']'); if (!changeLanguagesElements) return; for (var i = 0; i < changeLanguagesElements.length; i++) { var changeLanguagesElement = changeLanguagesElements[i]; var items = changeLanguagesElement.querySelectorAll('.dropdown-item'); for (var j = 0; j < items.length; j++) { var item = items[j]; item.className = item.getAttribute('data-value') === language ? 'dropdown-item selected' : 'dropdown-item'; } } }; var updateSelectedMarket = function (selectedCountry) { var changeMarketElements = topbarElement.querySelectorAll('[data-name=' + menuItems.topbarMarkets.id + ']'); if (!changeMarketElements) return; for (var i = 0; i < changeMarketElements.length; i++) { var changeMarketElement = changeMarketElements[i]; var items = changeMarketElement.querySelectorAll('.dropdown-item'); for (var j = 0; j < items.length; j++) { var item = items[j]; item.className = item.getAttribute('data-value') === selectedCountry ? 'dropdown-item selected' : 'dropdown-item'; } } }; /** Carts */ function updateCartUI(numberOfItems) { var items = window.document.querySelectorAll('[role=' + menuItems.topbarCart.id + ']'); for (var i = 0; i < items.length; i++) { if (!items[i]) { return; } var display = options.showCart || cartItems && cartItems > 0 ? '' : 'none'; if (!topbar.isLoggedIn) { display = 'none'; } items[i].parentNode.style.display = display; var badge = items[i].querySelector('.count-badge'); badge.title = numberOfItems ? numberOfItems : ''; badge.className = numberOfItems ? 'count-badge' : 'hide count-badge'; /* if undefined then hide the badge. */ badge.textContent = numberOfItems ? numberOfItems : ''; } } function hideCart() { var carts = window.document.querySelectorAll('[role=' + menuItems.topbarCart.id + ']'); for (var index = 0; index < carts.length; index++) { var cart = carts[index]; cart.style.display = 'none'; } } function setMarketSelectorDisplay() { var topbarMarketSelectorElements = topbarElement.querySelectorAll('.market-selector-container'); var user = pnTopbar.user; if (!topbarMarketSelectorElements) return; for (var i = 0; i < topbarMarketSelectorElements.length; i++) { var topbarMarketSelectorElement = topbarMarketSelectorElements[i]; topbarMarketSelectorElement.style.display = getMarketSelectorDisplayStyle(user); } } /* private methods */ function updateElementUrl(item) { var el = window.document.getElementById(item.id); if (el) { var authUrl = appendRedirectionUrlToUrl(options.unifiedLoginUrl + '/authorization', item.url); authUrl = appendClientIdToUrl(authUrl, options.unifiedLoginClientId); var url = topbar.isLoggedIn && item.iam ? authUrl : item.url; if (!item.noHref) { el.href = url; } if (item.hideInProd && isProdStage()) { el.parentElement.className = 'hide'; } } } function updateAllUrls() { for (var p in menuItems) { if (menuItems.hasOwnProperty(p)) { updateElementUrl(menuItems[p]); } } } function updateUIOnLoginStatus(isLoggedIn) { var loginElements = document.querySelectorAll('[role=' + menuItems.topbarLogin.id + ']'); var userElements = document.querySelectorAll('[role=' + menuItems.topbarUser.id + ']'); for (var i = 0; i < loginElements.length; i++) { if (!loginElements[i]) { return; } loginElements[i].style.display = isLoggedIn ? 'none' : 'flex'; } for (var y = 0; y < userElements.length; y++) { var element = userElements[y]; if (!element) { return; } element.style.display = isLoggedIn ? 'flex' : 'none'; } } var getMarketSelectorDisplayStyle = function (user) { var { email = '', hasOnlyOneMarket, hasSupportedMarket, showMarketSelector } = user || {}; var temporaryWhiteList = ['aliaksei.stryi@postnord.com', 'marben.dimson@postnord.com', 'andreas.major@postnord.com', 'niklas.dehnert@postnord.com', 'lisa.wilhelm@postnord.com', 'felix.baeuch@postnord.com', 'natalie.obernier@postnord.com']; if (temporaryWhiteList.includes(email.toLowerCase())) { debugLog('forcing market selector visible'); return 'flex'; } var shouldHideMarketSelector = hasOnlyOneMarket && hasSupportedMarket && !showMarketSelector; return pnTopbar.isInternational || shouldHideMarketSelector ? 'none' : 'flex'; }; var getUrlParam = function (paramName) { var queryString = location.search; var urlParams = new URLSearchParams(queryString); return urlParams.get(paramName); }; var refreshTokens = function _callee11(config) { var sessionId, reqOptions, userData; return regeneratorRuntime.async(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: if (!isSwitchUser()) { _context11.next = 2; break; } return _context11.abrupt("return"); case 2: _context11.prev = 2; sessionId = getSessionId(); if (sessionId) { _context11.next = 6; break; } throw new Error('No sessionId found when inside refreshTokens()'); case 6: debugLog(`refreshTokens() sessionId: ${sessionId}`); reqOptions = {}; if (config && config.forceRefresh) { reqOptions.forceRefreshToken = true; debugLog(`refreshTokens() forceRefresh`); } _context11.next = 11; return regeneratorRuntime.awrap(fetchUserData(sessionId, reqOptions)); case 11: userData = _context11.sent; _context11.next = 14; return regeneratorRuntime.awrap(handleUserData(userData)); case 14: dispatchRefreshEvent(userData.accessToken); return _context11.abrupt("return", userData.accessToken); case 18: _context11.prev = 18; _context11.t0 = _context11["catch"](2); logoutCleanup(); clearSessionId(); case 22: case "end": return _context11.stop(); } } }, null, null, [[2, 18]], Promise); }; function setAccessToken(accessToken, expiryTime) { if (!accessToken || !expiryTime) { throw new Error(`Expected accessToken and expiryTime. Got accessToken: ${accessToken} expiryTime: ${expiryTime}`); } ls.setItemWithExpiry('IAM_access_token', accessToken, expiryTime); } function clearAccessToken() { ls.removeItem('IAM_access_token'); } function clearAccessTokenExpiryTime() { ls.removeItem('IAM_access_token_expires'); } var getAccessToken = function () { return ls.getItemWithExpiry('IAM_access_token'); }; var removeDuplicates = function (array) { return [...new Set(array)]; }; var filterSelectedOrgs = function (orgs) { return orgs.filter(function (org) { return org.selected; }); }; var combineOrgsAuthIds = function (orgs) { return removeDuplicates(orgs.flatMap(function (org) { return org.authorities; })); }; var combineOrgsCustomerNumbers = function (orgs) { return removeDuplicates(orgs.flatMap(function (org) { return org.customerNumbers; })); }; /* populate the topbar user object with data from uas_data */ var handleUasData = function (uasData) { if (!uasData.organizations) return; var selectedOrgs = filterSelectedOrgs(uasData.organizations); var authIds = combineOrgsAuthIds(selectedOrgs); var customerNumbers = combineOrgsCustomerNumbers(selectedOrgs); setAuthIds(authIds); setCustomerNumbers(customerNumbers); }; var setIdToken = function (idToken) { if (!idToken) return; ls.setItem('id_token', idToken); var user = parseJwt(idToken); setUser(user); if (!user.uas_data) return; handleUasData(user.uas_data); }; var getIdToken = function () { return ls.getItem('id_token'); }; var clearIdToken = function () { return ls.removeItem('id_token'); }; function getSwitchUserTokens() { var user = ls.getItem('switch_user_backup'); var accessTokenExpiryTimeInMs = ls.getItem('switch_user_access_token_expiry_time_in_ms_backup'); var accessToken = ls.getItem('switch_user_access_token_backup'); var idToken = ls.getItem('switch_user_id_token_backup'); return { accessTokenExpiryTimeInMs: accessTokenExpiryTimeInMs, accessToken: accessToken, idToken: idToken, user: user }; } function backupSwitchUserTokens() { var accessTokenExpiryTimeInMs = getAccessTokenExpiryTime(); ls.setItem('switch_user_access_token_expiry_time_in_ms_backup', accessTokenExpiryTimeInMs); ls.setItem('switch_user_access_token_backup', getAccessToken()); ls.setItem('switch_user_id_token_backup', getIdToken()); ls.setItem('switch_user_backup', getUser()); } function hasBackedUpSwitchUserTokens() { var switchUserTokens = getSwitchUserTokens(); var accessToken = switchUserTokens.accessToken; var idToken = switchUserTokens.idToken; var user = switchUserTokens.user; return !!user && !!accessToken && !!idToken; } function restoreSwitchUserTokens() { var switchUserTokens = getSwitchUserTokens(); var accessToken = switchUserTokens.accessToken; var idToken = switchUserTokens.idToken; var user = switchUserTokens.user; setAccessTokenExpiryTime(switchUserTokens.accessTokenExpiryTimeInMs); setAccessToken(accessToken, switchUserTokens.accessTokenExpiryTimeInMs); setIdToken(idToken); setUser(user); clearSwitchUserTokens(); updateUserLoginUI(); } var getAssumedUserId = function () { return topbar.user && topbar.user.act_as; }; var isAssumedUser = function () { return Boolean(getAssumedUserId()); }; var getAssumedEmail = function () { return ls.getItem('assumed_email'); }; var setAssumedEmail = function (assumedEmail) { return ls.setItem('assumed_email', assumedEmail); }; var clearAssumedEmail = function () { return ls.removeItem('assumed_email'); }; var isSwitchUser = function () { return Boolean(ls.getItem('is_switch_user')); }; var setIsSwitchUser = function () { return ls.setItem('is_switch_user', true); }; var clearIsSwitchUser = function () { return ls.removeItem('is_switch_user'); }; var getSwitchUserRequestId = function () { return ls.getItem('switch_user_request_id'); }; var setSwitchUserRequestId = function (requestId) { return ls.setItem('switch_user_request_id', requestId); }; var clearSwitchUserRequestId = function () { return ls.removeItem('switch_user_request_id'); }; var switchUser = function (data) { if (!data) { debugLog('switchUser() called with no data'); clearSwitchUserTokens(); return; } var accessToken = data.access_token || data.accessToken; var jwt = data.jwt_token || data.idToken; var expiryTime = data.expiry_time || data.expiryTime; /* in sec */ var assumedEmail = data.assumedEmail || ''; var requestId = data.requestId || ''; if (!accessToken) { console.info('[topbar] switchUser() called with no access token'); return; } if (!jwt) { console.info('[topbar] switchUser() called with no JWT token'); return; } if (!expiryTime) { console.info('[topbar] switchUser() called with no expiry time'); return; } if (!assumedEmail) { console.info('[topbar] switchUser() called with no assumedEmail'); } if (!requestId) { console.info('[topbar] switchUser() called with no requestId'); } setIsSwitchUser(); setAssumedEmail(assumedEmail); clearOrgData(); setIdToken(jwt); if (requestId) { setSwitchUserRequestId(requestId); } var expiryTimeInMs = getExpiryTimeInMs(expiryTime); var shortenExpiryTimeInMs = subtractThreeMinutes(expiryTimeInMs); setAccessTokenExpiryTime(shortenExpiryTimeInMs); setAccessToken(accessToken, shortenExpiryTimeInMs); updateUserLoginUI(); if (!isLocalhost()) { location.href = getPortalUrlWithMarketAndLanguage(); } }; function clearSwitchUserTokens() { clearIsSwitchUser(); clearAssumedEmail(); clearSwitchUserRequestId(); ls.removeItem('switch_user_backup'); ls.removeItem('switch_user_access_token_expiry_time_in_ms_backup'); ls.removeItem('switch_user_access_token_backup'); ls.removeItem('switch_user_id_token_backup'); } function setSessionId(id) { ls.setItem('session_id', id); } function clearSessionId() { ls.removeItem('session_id'); } function getSessionId() { var sessionId = ls.getItem('session_id'); var hasSessionId = sessionId && sessionId !== 'undefined' && sessionId !== 'null'; if (!hasSessionId) return; return sessionId; } function getAccessTokenExpiryDate() { var expiryTimeInMs = getAccessTokenExpiryTime(); if (expiryTimeInMs) { expiryTimeInMs = parseInt(expiryTimeInMs, 10); var expiryDate = new Date(expiryTimeInMs); return expiryDate > new Date() ? expiryDate : null; } } function getAccessTokenExpiryTime() { return ls.getItemWithExpiry('IAM_access_token_expires'); } function setAccessTokenExpiryTime(expiryTime) { if (expiryTime) { ls.setItemWithExpiry('IAM_access_token_expires', expiryTime, expiryTime); } } var getSelectedOrgNumber = function () { return ls.getItem('selected_org_number'); }; var setSelectedOrgNumber = function (orgNumber) { return ls.setItem('selected_org_number', orgNumber); }; var clearSelectedOrgNumber = function () { return ls.removeItem('selected_org_number'); }; var getSelectedOrgName = function () { return ls.getItem('selected_org_name'); }; var setSelectedOrgName = function (orgName) { return ls.setItem('selected_org_name', orgName); }; var clearSelectedOrgName = function () { return ls.removeItem('selected_org_name'); }; var getUserOrgs = function () { return ls.getItem('user_orgs'); }; var setUserOrgs = function (orgs) { return ls.setItem('user_orgs', orgs); }; var clearUserOrgs = function () { return ls.removeItem('user_orgs'); }; var getAuthIds = function () { var user = getUser(); if (!user || !user.authoritylist) return []; return user.authoritylist; }; var setAuthIds = function (authIds) { if (!authIds && !authIds.length) return; var user = getUser(); if (!user) return; user.authoritylist = authIds; setUser(user); }; var setCustomerNumbers = function (customerNumbers) { if (!customerNumbers && !customerNumbers.length) return; var user = getUser(); if (!user) return; user.customernumberlist = customerNumbers; setUser(user); }; var setUserMarketFromCustomerNumbers = function () { var user = getUser(); if (!user) return; var marketsFromCN = []; var marketFromCN = ''; for (var key in user.marketCustomerNumbers) { if (user.marketCustomerNumbers.hasOwnProperty(key) && user.customernumberlist && user.marketCustomerNumbers[key].filter(function (cn) { return user.customernumberlist.includes(cn); }).length) { marketsFromCN.push(key); } } if (marketsFromCN.length) { marketFromCN = marketsFromCN[0].toUpperCase(); } user.hasOnlyOneMarket = marketsFromCN.length === 1; user.hasSupportedMarket = topbar.markets.includes(marketFromCN); setUser(user); if (user.hasOnlyOneMarket && user.hasSupportedMarket && !user.showMarketSelector) { if (ls.getItem('market') !== marketFromCN) { ls.setItem('market', marketFromCN); updateUserSettings('market', marketFromCN); } } /* NCPH-2080 set market to SE if user has multiple markets from customer numbers and is international*/ if (marketsFromCN.length > 1 && pnTopbar.isInternational) { ls.setItem('market', 'SE'); updateUserSettings('market', 'SE'); } }; var formatUserOrgs = function (orgs) { if (!orgs && !orgs.length) return []; return orgs.map(function (org) { return { organizationNumber: org.organizationNumber, organizationName: org.organizationName || '', authorities: org.authorities || [], customerNumbers: org.customerNumbers || [], selected: org.selected || false }; }).sort(sortByOrgName); }; var sortByOrgName = function (firstOrg, secondOrg) { return firstOrg.organizationName.localeCompare(secondOrg.organizationName); }; /* fix taken from: https://developer.mozilla.org/en-US/docs/Glossary/Base64#solution_1_%E2%80%93_escaping_the_string_before_encoding_it */ var base64ToUTF8 = function (str) { return decodeURIComponent(escape(window.atob(str))); }; var parseJwt = function (token) { if (token) { var base64Url = token.split('.')[1]; if (base64Url) { var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); return JSON.parse(base64ToUTF8(base64)); } } }; function removeUrlParams(params) { var urlParams = new URLSearchParams(location.search); params.forEach(function (param) { urlParams.delete(param); }); /* Prevent having a `?` left in the URL, if no other URL params */ var hasUrlParams = !!Array.from(urlParams).length; if (hasUrlParams) { history.replaceState(null, '', '?' + urlParams.toString() + location.hash); } else { history.replaceState(null, '', location.pathname + location.hash); } } /* If the topbar gets loaded in an iframe with id: refresh-tokens-iframe... */ /* it means that its only purpose was to refresh tokens for its parent because they share local storage */ function terminateSelf() { var self = window.parent.document.getElementById('refresh-tokens-iframe'); if (self) { self.parentNode.removeChild(self); } } var setRefreshTokenInterval = function () { var checkToken = function _callee12() { var accessToken; return regeneratorRuntime.async(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: accessToken = getAccessToken(); /*debugLog(`setRefreshTokenInterval() checkToken: ${accessToken}`);*/ if (!accessToken) { _context12.next = 3; break; } return _context12.abrupt("return"); case 3: _context12.next = 5; return regeneratorRuntime.awrap(refreshTokens()); case 5: case "end": return _context12.stop(); } } }, null, null, null, Promise); }; /* Check immediately and then every minute */ checkToken(); var oneMinute = 1000 * 60; setInterval(checkToken, oneMinute); }; function dispatchRefreshEvent(accessToken) { var refreshedTokensEvent = new CustomEvent('refreshedTokens', { detail: { access_token: accessToken }, bubbles: true, cancelable: true }); window.parent.pnTopbar.triggerEvent(refreshedTokensEvent); } function getUser() { return ls.getItem('user'); } function setUser(data) { ls.setItem('user', data); ls.setItem('userData', data); } function clearUser() { ls.removeItem('user'); ls.removeItem('userData'); } /* business users who have validated with a cash paying method */ var isCashPayingUser = function () { var user = getUser(); if (!user || !user.authoritylist) return false; var cashPayingUserAuthId = '250'; return user.authoritylist.includes(cashPayingUserAuthId); }; var isBusinessUser = function () { if (isCashPayingUser()) return false; var user = getUser(); return user && (user.uas_data || user.authoritylist) ? true : false; }; var isPrivateUser = function () { if (isBusinessUser()) return false; var user = getUser(); return user && (user.userId || user.userid) && !user.uas_data ? true : false; }; var isInternalUser = function () { var user = getUser(); if (!user || !user.authoritylist) return false; var internalAuthIds = ['12', '15', '19', '23', '40', '50', '60', '110', '111', '112', '113', '114', '119', '199']; var hasInternalAuthId = user.authoritylist.some(function (authId) { return internalAuthIds.includes(authId); }); return hasInternalAuthId ? true : false; }; var isFederatedUser = function () { var user = getUser(); if (!user) return false; /* there's a known bug in iam where amr is missing on private postnord federated users so we check for azure_groups instead */ var hasPnFedAmr = user.amr && user.amr.includes('pnfed'); var hasAzureGroups = !user.authoritylist && !!user.azure_groups; return hasPnFedAmr || hasAzureGroups; }; var hasAssumeUserAmr = function () { var user = getUser(); if (!user || !user.amr) return false; return user.amr.includes('au'); }; var hasPostnordEmail = function () { var user = getUser(); if (!user || !user.email) return false; return user.email.endsWith('@postnord.com'); }; var getMenuType = function () { var sideMenuState = localStorage.getItem('pnMenuTypeState') || null; if (sideMenuState) { return sideMenuState; } var sideMenu = document.querySelector('pn-side-menu'); if (sideMenu && sideMenu.type) { return sideMenu.type; } }; var isBaseMenuType = function () { return getMenuType() === 'base'; }; var checkLoginStatus = function () { var user = ls.getItem('user'); if (!user) return; var accessToken = getAccessToken(); if (!accessToken) { debugLog('checkLoginStatus: access token does not exist'); return; } return true; }; var waitForHtmlElement = function (selector) { return new Promise(function (resolve, reject) { var elementExist = document.querySelector(selector); if (elementExist) resolve(elementExist); /* executed when mutations are observed */ var callback = function (mutationList, observer) { var element = document.querySelector(selector); if (!element) return; resolve(element); observer.disconnect(); /* once we have resolved we don't need the observer anymore */ }; var observerConfig = { childList: true, subtree: true }; /* which mutations to observe */ var observer = new MutationObserver(callback); observer.observe(document.documentElement, observerConfig); }); }; /* events */ var addMenuTypeEventListener = function _callee13() { var sideMenu; return regeneratorRuntime.async(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: _context13.next = 2; return regeneratorRuntime.awrap(waitForHtmlElement('pn-side-menu')); case 2: sideMenu = document.querySelector('pn-side-menu'); if (sideMenu) { _context13.next = 5; break; } return _context13.abrupt("return"); case 5: sideMenu.addEventListener('menuTypeClicked', function () { return setLogoUrl(); }); case 6: case "end": return _context13.stop(); } } }, null, null, null, Promise); }; function addRefreshedTokensEventListener(func) { topbarElement.addEventListener('refreshedTokens', function (e) { func(e.detail.access_token); }, false); } function addCartClickEventListener(func) { topbarElement.addEventListener('cartClicked', function (e) { func(); }, false); } function triggerCartClickEvent() { var cartEvent = new CustomEvent('cartClicked', { detail: {}, bubbles: true, cancelable: true }); triggerEvent(cartEvent); } var triggerServiceWorkerRegisteredEvent = function (serviceWorker) { var serviceWorkerRegistered = new CustomEvent('serviceWorkerRegistered', { detail: { serviceWorker: serviceWorker }, bubbles: true, cancelable: true }); triggerEvent(serviceWorkerRegistered); webAppListener(); }; var webAppListener = function () { window.matchMedia('(display-mode: standalone)').addEventListener('change', function (event) { /* Set the notification count when switching from browser to web app. */ if (event.matches) { alertsFetcher.updateAppIconBadge(); } }); }; var addServiceWorkerRegisteredEventListener = function (func) { topbarElement.addEventListener('serviceWorkerRegistered', function (e) { func(e.detail.serviceWorker); }, false); }; function addChangeLanguageEventListener(func) { topbarElement.addEventListener('changeLanguage', function (e) { func(e.detail.language); }, false); } function triggerChangeLanguageEvent(language) { var languageEvent = new CustomEvent('changeLanguage', { detail: { language: language }, bubbles: true, cancelable: true }); triggerEvent(languageEvent); } function addSavedPreferencesEventListener(func) { topbarElement.addEventListener('savedPreferences', function (e) { func(); }, false); } function triggerSavedPreferencesEvent(update) { var savedPreferencesEvent = new CustomEvent('savedPreferences', { detail: update, bubbles: true, cancelable: true }); triggerEvent(savedPreferencesEvent); } function addChangeMarketsEventListener(func) { topbarElement.addEventListener('changeMarkets', function (e) { func(e.detail.markets); }, false); } function addPageTitleChangeEventListener() { new MutationObserver(function () { debugLog('Page title changed, prepending alerts count.'); alertsFetcher.setPageTitle(); }).observe(document.querySelector('head > title'), { childList: true }); } var triggerChangeMarketsEvent = function (newMarkets) { var changeMarketsEvent = new CustomEvent('changeMarkets', { detail: { markets: newMarkets }, bubbles: true, cancelable: true }); setMarketHeadertext(newMarkets); triggerEvent(changeMarketsEvent); }; function addLogoutEventListener(func) { topbarElement.addEventListener('logout', function (e) { func(); }, false); } var triggerLogoutEvent = function () { var logoutEvent = new CustomEvent('logout', { detail: {}, bubbles: true, cancelable: true }); triggerEvent(logoutEvent); }; var triggerSelectOrgNumberEvent = function (orgNumber) { var event = new CustomEvent('selectOrg', { detail: { orgNumber }, bubbles: true, cancelable: false }); triggerEvent(event); }; function addSelectOrgEventListener(func) { topbarElement.addEventListener('selectOrg', function (e) { func(e.detail.orgNumber); }, false); } var redirectUrlEventName = 'cachedRedirectUrlDetected'; function addCachedRedirectUrlDetectedListener(func) { topbarElement.addEventListener(redirectUrlEventName, function (e) { func(e.detail.url); }, false); if (replayEvents[redirectUrlEventName]) { triggerEvent(replayEvents[redirectUrlEventName]); replayEvents[redirectUrlEventName] = null; } } var triggerEvent = function (e) { topbarElement.dispatchEvent(e); window.dispatchEvent(new window.CustomEvent('resize')); }; var updateUserLoginUI = function () { if (topbar.isLoggedIn) { myServices.updateMyUserInfoView(getUser()); } var userEmail = ''; var userEmailDivs = document.querySelectorAll('[role=userInformationEmail]'); if (topbar.user) { userEmail = topbar.user.email || topbar.user.uniqueSecurityName || ''; } var assumedEmail = getAssumedEmail(); if (assumedEmail) { var actingAsElem = document.querySelector('.switchUserEmail'); if (actingAsElem) actingAsElem.textContent = assumedEmail; } for (var i = 0; i < userEmailDivs.length; i++) { userEmailDivs[i].textContent = userEmail; } }; function initDataLayerForGoogleTagManager() { window.dataLayer = window.dataLayer || []; var pageInfo = { language: topbar.language, country: topbar.market }; var userInfo = { loggedIn: topbar.isLoggedIn && topbar.isLoggedIn.toString(), type: 'public' }; if (topbar.isLoggedIn) { if (topbar.isBusinessUser) { userInfo.type = 'company with agreement'; } else { userInfo.type = 'private'; } } window.dataLayer.push({ pageInfo: pageInfo }); window.dataLayer.push({ userInfo: userInfo }); } function updateLanguageForGoogleTagManager(language) { window.dataLayer.map(function (item) { if (item.pageInfo && item.pageInfo.language) { item.pageInfo.language = language; } return item; }); } function updateMarketForGoogleTagManager(market) { if (!market) { return; } market = market.toUpperCase(); /* Update old GA structure */ window.dataLayer.map(function (item) { if (item.market) { item.market = market; } return item; }); /* Update new GA structure */ window.dataLayer.map(function (item) { if (item.pageInfo && item.pageInfo.country) { item.pageInfo.country = market; } return item; }); } var imposeSelectedLanguage = function (language) { setHtmlLanguageTag(language); updateTranslationsUI(translations, language, topbarElement); updateSelectedLanguageUI(language); setLanguageHeadertext(language); updateTooltips(language, translations); }; var setHtmlLanguageTag = function (language) { var html = document.documentElement; html.setAttribute('lang', language); }; var imposeSelectedMarket = function (market) { updateSelectedMarket(market); updateCartUI(); /* cart updates based on market */ }; var renderMarketLanguageUI = function () { updateSelectableLanguageUI(languages, topbar.language); imposeSelectedLanguage(topbar.language); updateSitesList(topbar.language); updateSelectableMarketsUI(topbar.markets, topbar.market); imposeSelectedMarket(topbar.market); setLanguagesBasedOnMarket(topbar.market); updateSelectableLanguageUI(topbar.languages, topbar.language); updateSelectableMarketsUI(topbar.markets, topbar.market); if (!getAccessToken()) { triggerUsersLanguageAndMarketReadyEvent({ market: topbar.market, language: topbar.language }); } }; var getUserSettingsLocalStorage = function () { return ls.getItem('user_settings'); }; var setUserSettingsLocalStorage = function (data) { return ls.setItem('user_settings', data); }; var clearUserSettingsLocalStorage = function () { return ls.removeItem('user_settings'); }; var handleUserSettings = function (data) { setUserSettingsLocalStorage(data); initWebPushNotifications(data); if (userPreferenceService.isSiteExcluded()) return; /* if user does not have a setting in the backend, init user settings using NCP default market */ var userMarket = options.selectedMarket; if (!topbar.user || !isSwitchUser()) { /* Do not impose market if user was switched into */ if (data.market) { userMarket = data.market; } else { /* If no existing market settings for this user, add initial market settings of user */ updateUserSettings('market', userMarket); } ls.setItem('market', userMarket); imposeSelectedMarket(userMarket); updateSelectableMarketsUI(topbar.markets, userMarket); setLanguagesBasedOnMarket(userMarket); } /* if user does not have a setting in the backend, init user settings using geolocation language */ var userLanguage = getLanguage(); /* If language param found in URL, then don't use langage from user settings */ if (!hadLangageUrlParam) { if (data.language) { if (topbar.user && !isSwitchUser()) { /* don't impose a language if the user was switched into */ userLanguage = data.language; } } else { /* if no existing language settings for this user, add initial language settings of user */ updateUserSettings('language', userLanguage); } } /* Update which login site is visible per market */ logintItemsService.updateLoginItemsView(topbar); /* This will just trigger the external callbacks, in contrast to invoking onChangeLanguage eventListener */ /* which triggers the whole wire of events including the sending of new market value to the backend as the */ /* new market preference of user, thus triggering a loop. */ for (var i = 0; i < topbarUserI18nChangeCallbacks.marketCallbacks.length; i++) { topbarUserI18nChangeCallbacks.marketCallbacks[i](userMarket); } /* by setting to localstorage directly instead of topbar, we avoid the overhead calls in the listeners */ ls.setItem('language', userLanguage); imposeSelectedLanguage(userLanguage); updateSelectableLanguageUI(languages, userLanguage); updateSitesList(userLanguage); /* This will just trigger the external callbacks, in contrast to invoking onChangeLanguage eventListener */ /* which triggers the whole wire of events including the sending of new language value to the backend as the */ /* new language preference of user, thus triggering a loop. */ for (var j = 0; j < topbarUserI18nChangeCallbacks.languageCallbacks.length; j++) { topbarUserI18nChangeCallbacks.languageCallbacks[j](userLanguage); } /* there are services that is waiting for this setup to start its logic */ triggerUsersLanguageAndMarketReadyEvent({ market: userMarket, language: userLanguage }); }; var setMarketAndLanguageBasedOnUrl = function (market, language) { if (!market && !language) return; /* by setting to localstorage directly instead of topbar, we avoid the overhead calls in the listeners */ if (market) { ls.setItem('market', market); updateUserSettings('market', market); } if (language) { ls.setItem('language', language); updateUserSettings('language', language); } removeUrlParams(['market', 'language']); hadLangageUrlParam = true; /* store state in cache since we just removed it from the URL */ }; var getUrlLanguage = function () { var urlLanguage = getUrlParam('language'); if (urlLanguage) return urlLanguage.toString(); }; var getUrlMarket = function () { var urlMarket = getUrlParam('market'); if (urlMarket) return urlMarket.toString(); }; var setLogoUrl = function () { var url = getPortalUrlWithMarketAndLanguage(); window.document.getElementById('topbarLogo').href = url; window.document.getElementById('topbarLogoMobile').href = url; }; var getPortalUrlWithMarketAndLanguage = function () { return `${getPortalUrl()}/${topbar.market.toLowerCase()}/${topbar.language.toLowerCase()}`; }; var getPortalUrl = function () { return 'https://' + options.portalUrl; }; var setPageTitle = function () { if (!options.pageTitle) return; var translatedTitle = translations[options.pageTitle] && translations[options.pageTitle][topbar.language]; document.title = translatedTitle || options.pageTitle; }; var isCompanyUser = function () { return topbar && topbar.user && topbar.isBusinessUser && topbar.user.authoritylist && topbar.user.authoritylist.indexOf('12') === -1 && topbar.user.authoritylist.indexOf('16') === -1 && topbar.user.authoritylist.indexOf('114') === -1; }; var isDevStage = function () { return options.stage === 'dev'; }; var isTestStage = function () { return options.stage === 'test'; }; var isProdStage = function () { return options.stage === 'prod'; }; var isOnPortalDomain = function () { return location.hostname.endsWith('portal.postnord.com'); }; var isOnMarketDomain = function () { return location.href.startsWith('https://www.postnord.'); }; var isLocalhost = function () { return location.hostname === 'localhost'; }; var initServiceWorker = function () { if (document.readyState === 'complete') { registerServiceWorker(); } else { window.addEventListener('load', function () { registerServiceWorker(); }); } }; var registerServiceWorker = function () { if (!isOnPortalDomain() && options.stage !== 'localhost') return; /* doesn't work to register a service worker from a different domain */ if (navigator && 'serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js').then(function (sw) { loadManifestFile(); triggerServiceWorkerRegisteredEvent(sw); }); } }; var loadManifestFile = function () { if (options.stage === 'localhost' && options.manifestFile) { var head = document.getElementsByTagName('head')[0]; var manifestEl = document.createElement('link'); manifestEl.rel = 'manifest'; manifestEl.href = options.manifestFile; head.appendChild(manifestEl); } }; var saveUserTypeToLocalStorage = function () { if (!topbar.isLoggedIn) return; if (isOnPortalDomain() || isLocalhost()) { ls.setItem('pnPortalMostRecentLoggedInUserType', isBusinessUser() ? 'BUSINESS' : isCashPayingUser() ? 'CASHPAYING' : 'BASE'); } }; function isInternetExplorer() { var ua = window.navigator.userAgent; if (!ua) { return false; } var msie = ua.indexOf('MSIE '); return msie > 0 || !!window.navigator.userAgent.match(/Trident.*rv:11./); } function browserSuggestion() { var isToasterClosed = sessionStorage.getItem('pntopbar-outdated-browser-toaster-closed'); if (!isInternetExplorer() || isToasterClosed || !isOnPortalDomain()) { return; } /* To get here you need to have IE, have not closed the suggestion window before and you are in the portal domain */ var element = document.createElement('div'); element.id = 'pntopbar-outdated-browser-toaster'; element.innerHTML = '' + '
' + '' + '
' + ''; var close = element.querySelector('.toaster-close'); if (close) { close.addEventListener('click', function () { element.outerHTML = ''; sessionStorage.setItem('pntopbar-outdated-browser-toaster-closed', Date.now()); }); topbarElement.appendChild(element); } } var showEnvTagInTopbar = function () { if (isProdStage()) return; var topbarTxtDesktop = document.querySelector('#mainMenuDropdown'); var topbarLogoMobile = document.querySelector('#topbarLogoMobile'); var envTagExist = topbarElement.querySelector('.pn-topbar-stage-tag-container'); if (topbarTxtDesktop && topbarLogoMobile && !envTagExist) { var desktopHtml = createEnvTagHtml('desktop'); insertAfter(desktopHtml, topbarTxtDesktop); var mobileHtml = createEnvTagHtml('mobile'); insertAfter(mobileHtml, topbarLogoMobile); topbarLogoMobile.style.marginRight = '0px'; } }; function insertAfter(elem, referenceNode) { referenceNode.parentNode.insertBefore(elem, referenceNode.nextSibling); } var createEnvTagHtml = function (menuType) { if (!menuType === 'desktop' || !menuType === 'mobile') return ''; var container = document.createElement('div'); var tag = document.createElement('div'); container.classList.add('pn-topbar-stage-tag-container'); container.classList.add('pn-topbar-stage-tag-' + menuType); tag.classList.add(['pn-topbar-stage-tag']); tag.textContent = isTestStage() ? 'Test' : 'Dev'; container.appendChild(tag); return container; }; function initEventListeners() { addMenuTypeEventListener(); /* no need to await this */ disturbanceAlertsUtil.initEventListners(); reminderAlertsUtil.initEventListners(); addChangeLanguageEventListener(function (language) { imposeSelectedLanguage(language); setPageTitle(); updateUserSettings('language', language); /* Update to reflect language */ alertsFetcher.updateAlertsDisplayOnEvent(topbar.access_token); }); addChangeMarketsEventListener(function (market) { imposeSelectedMarket(market); updateUserSettings('market', market); triggerFetchAlerts(); /* there are alerts that are market specific */ logintItemsService.updateLoginItemsView(topbar); /* update which login site is visible per market */ overrideUI(); /* hide create account btn for SE market */ }); addPageTitleChangeEventListener(); } function initPublicTopbarFunctions(params) { topbar.onLogout = function () { /* Its like this when I ported this but I think the main reason of the creator is as "cleanup" */ myServices.fetchMyServices(menuItems.topbarMyServices.url, topbar); }; topbar.openMainMenu = function () { stopPropagation(); var elements = document.querySelectorAll('[role=mainMenuDropdownSelector]'); for (var i = 0; i < elements.length; i++) { elements[i].classList.toggle('show'); } }; topbar.openMyAccount = function () { location.replace(`${options.myPages}/customer-numbers`); }; topbar.openNotificationsSettings = function () { if (isPrivateUser() || isCompanyUser()) { location.replace(`${options.myPages}/user-settings`); } }; } var createTopbarLoadedEvent = function () { hasTopbarLoaded = true; window.dispatchEvent(new CustomEvent('topbarLoaded', { detail: window.pnTopbar })); }; var fetchSelectedOrgTokenAssumedUser = function _callee14(sessionId, orgNumber, userId) { var url, res, json, data; return regeneratorRuntime.async(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: if (sessionId) { _context14.next = 3; break; } debugLog('fetchSelectedOrgTokenAssumedUser: missing sessionId'); return _context14.abrupt("return"); case 3: if (orgNumber) { _context14.next = 6; break; } debugLog('fetchSelectedOrgTokenAssumedUser: missing orgNumber'); return _context14.abrupt("return"); case 6: if (userId) { _context14.next = 9; break; } debugLog('fetchSelectedOrgTokenAssumedUser: missing userId'); return _context14.abrupt("return"); case 9: url = `${options.unifiedLoginUrl}/assumeToken?selectedOrg=${orgNumber}&userId=${userId}`; _context14.prev = 10; _context14.next = 13; return regeneratorRuntime.awrap(httpHelper({ url: appendClientIdToUrl(url, options.unifiedLoginClientId), method: 'GET', authorization: sessionId })); case 13: res = _context14.sent; if (!(res.status === 400)) { _context14.next = 20; break; } _context14.next = 17; return regeneratorRuntime.awrap(res.json()); case 17: json = _context14.sent; if (!(json.error === 'Switching to this org not permitted')) { _context14.next = 20; break; } return _context14.abrupt("return", undefined); case 20: if (res.ok) { _context14.next = 22; break; } throw new Error('Failed to fetch selected org token. sessionId: ' + sessionId); case 22: _context14.next = 24; return regeneratorRuntime.awrap(res.json()); case 24: data = _context14.sent; if (!data.assumedEmail) { data.assumedEmail = getAssumedEmail() || ''; } return _context14.abrupt("return", data); case 29: _context14.prev = 29; _context14.t0 = _context14["catch"](10); console.error(_context14.t0); case 32: case "end": return _context14.stop(); } } }, null, null, [[10, 29]], Promise); }; var fetchSelectedOrgTokenSwitchUser = function _callee15(sessionId, orgNumber, requestId) { var url, res, data, token; return regeneratorRuntime.async(function _callee15$(_context15) { while (1) { switch (_context15.prev = _context15.next) { case 0: if (sessionId) { _context15.next = 3; break; } debugLog('fetchSelectedOrgTokenSwitchUser: missing sessionId'); return _context15.abrupt("return"); case 3: if (orgNumber) { _context15.next = 6; break; } debugLog('fetchSelectedOrgTokenSwitchUser: missing orgNumber'); return _context15.abrupt("return"); case 6: if (requestId) { _context15.next = 9; break; } debugLog('fetchSelectedOrgTokenSwitchUser: missing requestId'); return _context15.abrupt("return"); case 9: url = `${options.unifiedLoginUrl}/switchToken?selectedOrg=${orgNumber}&requestId=${requestId}`; _context15.prev = 10; _context15.next = 13; return regeneratorRuntime.awrap(httpHelper({ url: appendClientIdToUrl(url, options.unifiedLoginClientId), method: 'GET', authorization: sessionId })); case 13: res = _context15.sent; if (res.ok) { _context15.next = 16; break; } throw new Error('Failed to fetch selected org token. sessionId: ' + sessionId); case 16: _context15.next = 18; return regeneratorRuntime.awrap(res.json()); case 18: data = _context15.sent; token = data.token; if (!token.assumedEmail) { token.assumedEmail = getAssumedEmail() || ''; } return _context15.abrupt("return", token); case 24: _context15.prev = 24; _context15.t0 = _context15["catch"](10); console.error(_context15.t0); case 27: case "end": return _context15.stop(); } } }, null, null, [[10, 24]], Promise); }; var fetchSelectedOrgToken = function _callee16(sessionId, orgNumber) { var url, res; return regeneratorRuntime.async(function _callee16$(_context16) { while (1) { switch (_context16.prev = _context16.next) { case 0: if (sessionId) { _context16.next = 3; break; } debugLog('fetchSelectedOrgToken: missing sessionId'); return _context16.abrupt("return"); case 3: if (orgNumber) { _context16.next = 6; break; } debugLog('fetchSelectedOrgToken: missing orgNumber'); return _context16.abrupt("return"); case 6: url = `${options.unifiedLoginUrl}/changeOrg?selectedOrg=${orgNumber}`; _context16.prev = 7; _context16.next = 10; return regeneratorRuntime.awrap(httpHelper({ url: appendClientIdToUrl(url, options.unifiedLoginClientId), method: 'POST', authorization: sessionId })); case 10: res = _context16.sent; if (res.ok) { _context16.next = 13; break; } throw new Error('Failed to fetch selected org token. sessionId: ' + sessionId); case 13: return _context16.abrupt("return", fetchUserData(sessionId, { forceRefreshToken: true })); case 16: _context16.prev = 16; _context16.t0 = _context16["catch"](7); console.error(_context16.t0); case 19: case "end": return _context16.stop(); } } }, null, null, [[7, 16]], Promise); }; var initUserMarketCustomerNumbers = function _callee17() { var meData, isFromSharedLogin, user; return regeneratorRuntime.async(function _callee17$(_context17) { while (1) { switch (_context17.prev = _context17.next) { case 0: if (pnTopbar.isLoggedIn) { _context17.next = 2; break; } return _context17.abrupt("return"); case 2: _context17.next = 4; return regeneratorRuntime.awrap(fetchUserDataFromUMS()); case 4: meData = _context17.sent; if (meData) { _context17.next = 7; break; } return _context17.abrupt("return"); case 7: isFromSharedLogin = hasPostnordEmail() && !pnTopbar.isFederatedUser; if (!isFromSharedLogin) redirectToLoginWhenUserInfoIsInvalid(meData); if (!(pnTopbar.isInternalUser || !pnTopbar.isBusinessUser)) { _context17.next = 11; break; } return _context17.abrupt("return"); case 11: user = getUser(); if (user) { _context17.next = 14; break; } return _context17.abrupt("return"); case 14: user.marketCustomerNumbers = meData.marketCustomerNumbers; user.showMarketSelector = !!meData.showTopbarMarketSelector; user.isInternational = Array.isArray(meData.importCustomerNumbers) && meData.importCustomerNumbers.some(function (importCustomerNumber) { return user.customernumberlist.includes(importCustomerNumber); }); setUser(user); setUpMarketSelectorDisplay(); if (user.isInternational) { ls.setItem('isInternational', user.isInternational); } else { ls.removeItem('isInternational'); } case 20: case "end": return _context17.stop(); } } }, null, null, null, Promise); }; var fetchUserDataFromUMS = function _callee18() { var accessToken, res; return regeneratorRuntime.async(function _callee18$(_context18) { while (1) { switch (_context18.prev = _context18.next) { case 0: _context18.prev = 0; _context18.next = 3; return regeneratorRuntime.awrap(validateOrRefreshTokens()); case 3: accessToken = _context18.sent; if (accessToken) { _context18.next = 6; break; } throw new Error('fetchUserDataFromUMS: no access token found.'); case 6: _context18.next = 8; return regeneratorRuntime.awrap(httpHelper({ url: `${options.umsApiUrl}/v1/me`, method: 'GET', authorization: accessToken })); case 8: res = _context18.sent; if (!(res.status === 404)) { _context18.next = 12; break; } debugLog(`fetchUserDataFromUMS: user not found in UMS`); return _context18.abrupt("return"); case 12: return _context18.abrupt("return", res.json()); case 15: _context18.prev = 15; _context18.t0 = _context18["catch"](0); console.error(_context18.t0); case 18: case "end": return _context18.stop(); } } }, null, null, [[0, 15]], Promise); }; var deleteSelectedOrgToken = function _callee19(sessionId) { var res; return regeneratorRuntime.async(function _callee19$(_context19) { while (1) { switch (_context19.prev = _context19.next) { case 0: if (sessionId) { _context19.next = 3; break; } debugLog('deleteSelectedOrgToken: missing sessionId'); return _context19.abrupt("return"); case 3: _context19.prev = 3; _context19.next = 6; return regeneratorRuntime.awrap(httpHelper({ url: `${options.unifiedLoginUrl}/selectedOrg`, method: 'DELETE', authorization: sessionId })); case 6: res = _context19.sent; if (res.ok) { _context19.next = 9; break; } throw new Error('Failed to delete selected org token. sessionId: ' + sessionId); case 9: return _context19.abrupt("return", fetchUserData(sessionId, { forceRefreshToken: true })); case 12: _context19.prev = 12; _context19.t0 = _context19["catch"](3); console.error(_context19.t0); case 15: case "end": return _context19.stop(); } } }, null, null, [[3, 12]], Promise); }; var fetchUserData = function _callee20(sessionId, reqOptions) { var shouldForceRefreshToken, res; return regeneratorRuntime.async(function _callee20$(_context20) { while (1) { switch (_context20.prev = _context20.next) { case 0: _context20.prev = 0; shouldForceRefreshToken = Boolean(reqOptions && reqOptions.forceRefreshToken); _context20.next = 4; return regeneratorRuntime.awrap(httpHelper({ url: appendClientIdToUrl(`${options.unifiedLoginUrl}/user?forceRefresh=${shouldForceRefreshToken}`, options.unifiedLoginClientId), method: 'GET', authorization: sessionId })); case 4: res = _context20.sent; if (res.ok) { _context20.next = 7; break; } throw new Error('Failed to refresh IAM token. sessionId: ' + sessionId); case 7: return _context20.abrupt("return", res.json()); case 10: _context20.prev = 10; _context20.t0 = _context20["catch"](0); console.error(_context20.t0); logoutCleanup(); clearSessionId(); case 15: case "end": return _context20.stop(); } } }, null, null, [[0, 10]], Promise); }; var fetchSessionId = function (oneTimeCode) { return new Promise(function (resolve, reject) { httpHelper({ url: appendClientIdToUrl(`${options.unifiedLoginUrl}/token?oneTimeCode=${oneTimeCode}`, options.unifiedLoginClientId), method: 'GET' }).then(function (res) { if (!res.ok) { throw new Error('Failed to fetch sessionId'); } return res; }).then(function (res) { return res.json(); }).then(function (data) { if (!data.token) { throw new Error('Failed to get token after parsing data'); } resolve(data.token); }).catch(function (err) { console.error(err); reject(); }); }); }; var handleUserData = function _callee21(data) { var expiryTimeInMs, shortenExpiryTimeInMs; return regeneratorRuntime.async(function _callee21$(_context21) { while (1) { switch (_context21.prev = _context21.next) { case 0: if (data) { _context21.next = 2; break; } return _context21.abrupt("return"); case 2: setIdToken(data.idToken); expiryTimeInMs = getExpiryTimeInMs(data.expiryTime); shortenExpiryTimeInMs = subtractThreeMinutes(expiryTimeInMs); setAccessTokenExpiryTime(shortenExpiryTimeInMs); setAccessToken(data.accessToken, shortenExpiryTimeInMs); /* we do this here to get the authIds for the user's selected org again */ _context21.next = 9; return regeneratorRuntime.awrap(initOrgList()); case 9: setUpMarketSelectorDisplay(); case 10: case "end": return _context21.stop(); } } }, null, null, null, Promise); }; function validateIamTokens() { if (!checkLoginStatus()) { logoutCleanup(); throw new Error('[topbar] IAM token is not valid.'); } } /* Ugly way of making the UI not look weird during login. * This happend after fetching IAM tokens asynchronous. */ function asyncTokenHotfix() { document.querySelector('#topbarLogin').style.display = 'none'; setLanguageHeadertext(getLanguage()); } var validateOrRefreshTokens = function _callee22() { var accessToken; return regeneratorRuntime.async(function _callee22$(_context22) { while (1) { switch (_context22.prev = _context22.next) { case 0: _context22.prev = 0; validateIamTokens(); return _context22.abrupt("return", getAccessToken()); case 5: _context22.prev = 5; _context22.t0 = _context22["catch"](0); debugLog('validateOrRefreshTokens catch: refresh token'); _context22.next = 10; return regeneratorRuntime.awrap(refreshTokens()); case 10: accessToken = _context22.sent; if (!accessToken) { _context22.next = 13; break; } return _context22.abrupt("return", accessToken); case 13: case "end": return _context22.stop(); } } }, null, null, [[0, 5]], Promise); }; var validateSwitchUserAccessToken = function _callee23() { var accessToken, res; return regeneratorRuntime.async(function _callee23$(_context23) { while (1) { switch (_context23.prev = _context23.next) { case 0: _context23.prev = 0; _context23.next = 3; return regeneratorRuntime.awrap(validateOrRefreshTokens()); case 3: accessToken = _context23.sent; if (accessToken) { _context23.next = 6; break; } throw new Error('validateSwitchUserAccessToken: no access token found.'); case 6: _context23.next = 8; return regeneratorRuntime.awrap(httpHelper({ url: `${options.iamAccountUrl}/userinfo`, method: 'GET', authorization: `Bearer ${accessToken}` })); case 8: res = _context23.sent; if (res.ok) { _context23.next = 11; break; } throw new Error('Switch user access token is no longer valid: ' + accessToken); case 11: _context23.next = 17; break; case 13: _context23.prev = 13; _context23.t0 = _context23["catch"](0); debugLog(_context23.t0.message); switchUserLogout(); case 17: case "end": return _context23.stop(); } } }, null, null, [[0, 13]], Promise); }; var handleUserSetup = function _callee24() { var userData; return regeneratorRuntime.async(function _callee24$(_context24) { while (1) { switch (_context24.prev = _context24.next) { case 0: _context24.prev = 0; _context24.next = 3; return regeneratorRuntime.awrap(fetchUserData(getSessionId())); case 3: userData = _context24.sent; _context24.next = 6; return regeneratorRuntime.awrap(handleUserData(userData)); case 6: _context24.next = 12; break; case 8: _context24.prev = 8; _context24.t0 = _context24["catch"](0); logoutCleanup(); return _context24.abrupt("return", clearSessionId()); case 12: case "end": return _context24.stop(); } } }, null, null, [[0, 8]], Promise); }; var selectOrgByOrgNumber = function _callee25(orgNumber) { var data, _data, _data2; return regeneratorRuntime.async(function _callee25$(_context25) { while (1) { switch (_context25.prev = _context25.next) { case 0: _context25.prev = 0; if (!isAssumedUser()) { _context25.next = 8; break; } _context25.next = 4; return regeneratorRuntime.awrap(fetchSelectedOrgTokenAssumedUser(getSessionId(), orgNumber, topbar.user.act_as)); case 4: data = _context25.sent; if (data) { switchUser(data); } _context25.next = 20; break; case 8: if (!isSwitchUser()) { _context25.next = 15; break; } _context25.next = 11; return regeneratorRuntime.awrap(fetchSelectedOrgTokenSwitchUser(getSessionId(), orgNumber, getSwitchUserRequestId())); case 11: _data = _context25.sent; switchUser(_data); _context25.next = 20; break; case 15: _context25.next = 17; return regeneratorRuntime.awrap(fetchSelectedOrgToken(getSessionId(), orgNumber)); case 17: _data2 = _context25.sent; _context25.next = 20; return regeneratorRuntime.awrap(handleUserData(_data2)); case 20: _context25.next = 26; break; case 22: _context25.prev = 22; _context25.t0 = _context25["catch"](0); debugLog('selectOrgByOrgNumber: failed to handle new selected org token'); console.error(_context25.t0); case 26: case "end": return _context25.stop(); } } }, null, null, [[0, 22]], Promise); }; var setupNewLogin = function _callee26(oneTimeCode) { var sessionId; return regeneratorRuntime.async(function _callee26$(_context26) { while (1) { switch (_context26.prev = _context26.next) { case 0: _context26.prev = 0; _context26.next = 3; return regeneratorRuntime.awrap(fetchSessionId(oneTimeCode)); case 3: sessionId = _context26.sent; if (sessionId) { setSessionId(sessionId); } _context26.next = 9; break; case 7: _context26.prev = 7; _context26.t0 = _context26["catch"](0); case 9: _context26.prev = 9; removeUrlParams(['oneTimeCode', 'sessionId']); return _context26.finish(9); case 12: case "end": return _context26.stop(); } } }, null, null, [[0, 7, 9, 12]], Promise); }; var setupTokens = function _callee27() { var isNewLogin; return regeneratorRuntime.async(function _callee27$(_context27) { while (1) { switch (_context27.prev = _context27.next) { case 0: isNewLogin = getUrlParam('oneTimeCode'); if (!isNewLogin) { _context27.next = 4; break; } _context27.next = 4; return regeneratorRuntime.awrap(setupNewLogin(isNewLogin)); case 4: if (getSessionId()) { _context27.next = 7; break; } debugLog('setupTokens: no sessionId'); return _context27.abrupt("return"); case 7: if (!(!isSwitchUser() && hasBackedUpSwitchUserTokens())) { _context27.next = 13; break; } restoreSwitchUserTokens(); _context27.next = 11; return regeneratorRuntime.awrap(validateOrRefreshTokens()); case 11: debugLog('setupTokens: restored switch user tokens'); return _context27.abrupt("return"); case 13: if (!isSwitchUser()) { _context27.next = 18; break; } _context27.next = 16; return regeneratorRuntime.awrap(validateSwitchUserAccessToken()); case 16: /* validate token in backend */ debugLog('setupTokens: validated switch user access token'); return _context27.abrupt("return"); case 18: if (!(getAccessToken() || getUser())) { _context27.next = 23; break; } _context27.next = 21; return regeneratorRuntime.awrap(validateOrRefreshTokens()); case 21: /* validate token expiry date in frontend */ debugLog('setupTokens: validated access token'); return _context27.abrupt("return"); case 23: if (getUser()) { _context27.next = 30; break; } asyncTokenHotfix(); _context27.next = 27; return regeneratorRuntime.awrap(handleUserSetup()); case 27: _context27.next = 29; return regeneratorRuntime.awrap(validateOrRefreshTokens()); case 29: debugLog('setupTokens: refreshed access token and user data'); case 30: case "end": return _context27.stop(); } } }, null, null, null, Promise); }; var clearOrgHtml = function () { var orgContainer = document.body.querySelectorAll('.pn-topbar-org-list'); if (orgContainer.length) { orgContainer.forEach(function (element) { return element.textContent = ''; }); } }; var createRightArrowSvg = function () { var svgElement = document.createElement('div'); svgElement.classList.add('pn-topbar-icon-right-arrow'); svgElement.innerHTML = ''; return svgElement; }; var createLoadingSvg = function (color) { var svgElement = document.createElement('div'); svgElement.classList.add('pn-topbar-icon-loading'); color = color || '#005D92'; if (color && color.toLowerCase() === '#fff' || color === 'white') { svgElement.classList.add('pn-topbar-icon-color-white'); } svgElement.innerHTML = ``; return svgElement; }; var addOrgToHtml = function (orgName, orgNumber, authIds, customerNumbers) { var orgContainer = document.body.querySelectorAll('.pn-topbar-org-list'); if (orgContainer.length) { orgContainer.forEach(function (element) { var orgContainerElement = document.createElement('button'); var orgTxtContainerElement = document.createElement('div'); orgTxtContainerElement.classList.add('pn-topbar-org-container-txt'); orgTxtContainerElement.appendChild(createOrgNameElement(orgName)); orgTxtContainerElement.appendChild(createOrgNumberElement(orgNumber)); orgContainerElement.appendChild(orgTxtContainerElement); orgContainerElement.appendChild(createRightArrowSvg()); orgContainerElement.dataset.orgName = orgName; orgContainerElement.dataset.orgNumber = orgNumber; orgContainerElement.dataset.authorities = JSON.stringify(authIds); orgContainerElement.dataset.customerNumbers = JSON.stringify(customerNumbers); element.appendChild(orgContainerElement); }); } }; var createOrgNameElement = function (orgName) { var orgNameElement = document.createElement('h3'); orgNameElement.className = 'pn-topbar-org-name'; orgNameElement.textContent = orgName; return orgNameElement; }; var createOrgNumberElement = function (orgNumber) { var orgNumberElement = document.createElement('p'); orgNumberElement.className = 'pn-topbar-org-number'; orgNumberElement.textContent = orgNumber; return orgNumberElement; }; var showElementBySelectorAll = function (selector) { var elements = document.body.querySelectorAll(selector); if (elements.length) { elements.forEach(function (element) { element.style.display = 'flex'; }); } }; var showOrgListElement = function () { return showElementBySelectorAll('.pn-topbar-org-list'); }; var showSelectedOrgElement = function () { return showElementBySelectorAll('.pn-topbar-selected-org-container'); }; var showSelectedOrgName = function (orgName) { showSelectedOrgElement(); var selectedOrgNameElements = document.querySelectorAll('.pn-topbar-selected-org-name'); var selectedOrgNameTopLabelElement = document.querySelector('.pn-topbar-selected-org-name-top-label'); if (selectedOrgNameElements.length) { selectedOrgNameElements.forEach(function (element) { element.textContent = orgName; }); } if (selectedOrgNameTopLabelElement) { var userLabelElement = document.querySelector('.pn-topbar-user-label'); userLabelElement.style.display = 'none'; selectedOrgNameTopLabelElement.textContent = orgName; selectedOrgNameTopLabelElement.style.display = 'block'; } }; var showSelectedOrgNumber = function (orgNumber) { showSelectedOrgElement(); var selectedOrgNumberElements = document.querySelectorAll('.pn-topbar-selected-org-number'); if (selectedOrgNumberElements.length) { selectedOrgNumberElements.forEach(function (element) { element.textContent = orgNumber; }); } }; var parseArrayFromDataAttribute = function (element, attribute) { var result = []; try { result = JSON.parse(element.getAttribute('data-' + attribute)); } catch (error) { debugLog('Could not parse authorities from HTML attribute: ' + attribute); } return result; }; var handleSelectOrgClick = function _callee28(event) { var orgName, orgNumber, authIds, customerNumbers; return regeneratorRuntime.async(function _callee28$(_context28) { while (1) { switch (_context28.prev = _context28.next) { case 0: event.preventDefault(); orgName = event.currentTarget.getAttribute('data-org-name'); orgNumber = event.currentTarget.getAttribute('data-org-number'); authIds = parseArrayFromDataAttribute(event.currentTarget, 'authorities'); customerNumbers = parseArrayFromDataAttribute(event.currentTarget, 'customer-numbers'); /* show loading icon */ event.currentTarget.querySelector('.pn-topbar-icon-right-arrow').style.display = 'none'; event.currentTarget.appendChild(createLoadingSvg()); setAuthIds(authIds); setCustomerNumbers(customerNumbers); setSelectedOrgName(orgName); setSelectedOrgNumber(orgNumber); _context28.next = 13; return regeneratorRuntime.awrap(selectOrgByOrgNumber(orgNumber)); case 13: triggerSelectOrgNumberEvent(orgNumber); location.reload(); case 15: case "end": return _context28.stop(); } } }, null, null, null, Promise); }; var handleSelectDefaultOrg = function _callee29(org) { return regeneratorRuntime.async(function _callee29$(_context29) { while (1) { switch (_context29.prev = _context29.next) { case 0: if (org) { _context29.next = 2; break; } return _context29.abrupt("return"); case 2: if (org.authorities) setAuthIds(org.authorities); if (org.customerNumbers) setCustomerNumbers(org.customerNumbers); if (org.organizationName) setSelectedOrgName(org.organizationName); if (!org.organizationNumber) { _context29.next = 9; break; } setSelectedOrgNumber(org.organizationNumber); _context29.next = 9; return regeneratorRuntime.awrap(selectOrgByOrgNumber(org.organizationNumber)); case 9: location.reload(); case 10: case "end": return _context29.stop(); } } }, null, null, null, Promise); }; var initSelectedOrgNumberEventListeners = function () { var orgLists = document.querySelectorAll('.pn-topbar-org-list'); if (!orgLists && !orgLists.length) return; /* loop over desktop and mobile HTML */ orgLists.forEach(function (orgList) { var orgBtns = orgList.querySelectorAll('.pn-topbar-org-list > button'); if (!orgBtns && !orgBtns.length) return; orgBtns.forEach(function (orgBtn) { return orgBtn.addEventListener('click', handleSelectOrgClick); }); }); }; var renderSelectedOrg = function _callee30(orgs) { var selectedOrgs, isAllOrgsSelected, selectedOrg, selectedOrgName, selectedOrgNumber; return regeneratorRuntime.async(function _callee30$(_context30) { while (1) { switch (_context30.prev = _context30.next) { case 0: if (!(!orgs || !orgs.length)) { _context30.next = 2; break; } return _context30.abrupt("return"); case 2: selectedOrgs = filterSelectedOrgs(orgs); if (!(!selectedOrgs || !selectedOrgs.length)) { _context30.next = 6; break; } debugLog('renderSelectedOrg: no selected orgs found.'); return _context30.abrupt("return"); case 6: isAllOrgsSelected = selectedOrgs.length > 1; /* by default, all orgs are selected */ if (!isAllOrgsSelected) { _context30.next = 15; break; } debugLog('renderSelectedOrg: all orgs are selected by default so set the first org as selected.'); if (!isAssumedUser()) { _context30.next = 12; break; } debugLog('renderSelectedOrg: do not select a default org due to is assumed user.'); return _context30.abrupt("return"); case 12: _context30.next = 14; return regeneratorRuntime.awrap(handleSelectDefaultOrg(selectedOrgs[0])); case 14: return _context30.abrupt("return"); case 15: selectedOrg = selectedOrgs[0]; if (selectedOrg) { if (selectedOrg.customerNumbers) setCustomerNumbers(selectedOrg.customerNumbers); if (selectedOrg.organizationNumber) setSelectedOrgNumber(selectedOrg.organizationNumber); if (selectedOrg.organizationName) setSelectedOrgName(selectedOrg.organizationName); if (selectedOrg.authorities) setAuthIds(selectedOrg.authorities); } selectedOrgName = getSelectedOrgName(); selectedOrgNumber = getSelectedOrgNumber(); if (selectedOrgName) showSelectedOrgName(selectedOrgName); if (selectedOrgNumber) showSelectedOrgNumber(selectedOrgNumber); case 21: case "end": return _context30.stop(); } } }, null, null, null, Promise); }; var renderOrgs = function (orgs) { var selectedOrgs = filterSelectedOrgs(orgs); var isAllOrgsSelected = selectedOrgs.length > 1; /* by default, all orgs are selected */ orgs.forEach(function (org) { var orgName = org.organizationName || ''; var orgNumber = org.organizationNumber; var authIds = org.authorities || []; var customerNumbers = org.customerNumbers || []; /* filter out the current selected org in the list */ /* if all orgs are selected = no previous selection, show all */ if (org.selected && !isAllOrgsSelected) return; if (orgNumber) addOrgToHtml(orgName, orgNumber, authIds, customerNumbers); }); }; var initUserOrgs = function () { var user = getUser(); var hasOrg = Boolean(user && user.uas_data && user.uas_data.organizations && user.uas_data.organizations.length); if (!hasOrg) { setUserOrgs([]); debugLog('initUserOrgs: no user orgs found'); return; } var orgs = user.uas_data.organizations; setUserOrgs(formatUserOrgs(orgs)); }; var initOrgList = function _callee31() { var orgs, userSettings, data; return regeneratorRuntime.async(function _callee31$(_context31) { while (1) { switch (_context31.prev = _context31.next) { case 0: initUserOrgs(); orgs = getUserOrgs(); userSettings = pnTopbar.getUserSettings(); if (!(!orgs || !orgs.length || !userSettings)) { _context31.next = 5; break; } return _context31.abrupt("return"); case 5: if (!(!shouldUseProfileSwitch(orgs) && !userSettings.forceMultiProfile)) { _context31.next = 14; break; } if (!shouldDeleteSelectedOrg(orgs)) { _context31.next = 12; break; } _context31.next = 9; return regeneratorRuntime.awrap(deleteSelectedOrgToken(getSessionId())); case 9: data = _context31.sent; _context31.next = 12; return regeneratorRuntime.awrap(handleUserData(data)); case 12: debugLog('initOrgList: should not use profile switch'); return _context31.abrupt("return"); case 14: clearOrgHtml(); _context31.next = 17; return regeneratorRuntime.awrap(renderSelectedOrg(orgs)); case 17: renderOrgs(orgs); showOrgListElement(); initSelectedOrgNumberEventListeners(); case 20: case "end": return _context31.stop(); } } }, null, null, null, Promise); }; /* feature toggles */ var enableFeatureToggles = function (features) { if (!features || !Array.isArray(features)) { console.warn('Example: pnTopbar.enableFeatureToggles(["PROFILE_SELECTOR"])'); return; } ls.setItem('PN_TOPBAR_FEATURE_TOGGLES', JSON.stringify(features)); location.reload(); }; var clearAllFeatureToggles = function () { return ls.removeItem('PN_TOPBAR_FEATURE_TOGGLES'); }; var isFeatureEnabled = function (feature) { if (!feature) return false; var featureToggles = ls.getItem('PN_TOPBAR_FEATURE_TOGGLES'); if (!featureToggles || !Array.isArray(featureToggles)) return false; return featureToggles.includes(feature); }; var hideCreateAccBtnMobile = function () { var btnMobile = document.querySelector('.pn-topbar-create-account-btn-mobile'); if (btnMobile) btnMobile.style.display = 'none'; }; var showCreateAccBtnMobile = function () { var btnMobile = document.querySelector('.pn-topbar-create-account-btn-mobile'); if (btnMobile) btnMobile.style.display = 'flex'; }; var hideLoginIcon = function () { var icon = document.querySelector('.pn-topbar-login-angle-icon'); if (icon) icon.style.display = 'none'; }; var showLoginIcon = function () { var icon = document.querySelector('.pn-topbar-login-angle-icon'); if (icon) icon.style.display = 'flex'; }; var overrideLoginSE = function () { /* NCPH-1373: go to login page if SE market */ topbar.market === 'SE' || topbar.market === 'DK' ? hideLoginIcon() : showLoginIcon(); topbar.market === 'SE' || topbar.market === 'DK' ? hideCreateAccBtnMobile() : showCreateAccBtnMobile(); }; var updateAssumedAsTxt = function () { var assumedEmail = getAssumedEmail(); if (!assumedEmail) return; var actingAsElemContainer = document.querySelector('.pn-topbar-acting-as-container'); var actingAsElem = document.querySelector('.pn-topbar-acting-as'); if (!actingAsElemContainer && !actingAsElem) return; actingAsElem.textContent = assumedEmail; actingAsElem.classList.remove('hidden'); actingAsElemContainer.classList.remove('hidden'); }; var updateLoginStatusTxt = function () { if (isAssumedUser()) return; var elem = document.querySelector('.pn-topbar-logged-in'); if (!elem) return; elem.dataset.xtranslate = 'ACTING_AS'; }; var hideMyAccountBtn = function () { var elem = document.querySelector('.topbarMyAccountBtn'); if (!elem) return; elem.classList.add('hidden'); }; var updateLogoutBtnTxt = function () { var elem = document.querySelector('.pn-topbar-logout-btn'); if (!elem) return; elem.dataset.xtranslate = 'SWITCH_BACK'; }; var createAlertTemplate = function (notificationType, titleTranslationKey, messageTranslationKey, filterUrls) { if (!notificationType && (notificationType !== 'REMINDER' || notificationType !== 'INFORMATIVE_CONTEXTUAL' || notificationType !== 'DISTURBANCE')) return; return { notificationType, portalAreaFilters: filterUrls || [], title: { en: translations[titleTranslationKey].en, sv: translations[titleTranslationKey].sv, da: translations[titleTranslationKey].da, fi: translations[titleTranslationKey].fi, no: translations[titleTranslationKey].no }, message: { en: translations[messageTranslationKey].en, sv: translations[messageTranslationKey].sv, da: translations[messageTranslationKey].da, fi: translations[messageTranslationKey].fi, no: translations[messageTranslationKey].no } }; }; /* sends an email to the userId for requesting full access */ var switchUserRequestFullAccess = function _callee32(sessionId, userId) { var res; return regeneratorRuntime.async(function _callee32$(_context32) { while (1) { switch (_context32.prev = _context32.next) { case 0: if (sessionId) { _context32.next = 2; break; } throw new Error('switchUserRequestFullAccess: missing sessionId'); case 2: if (userId) { _context32.next = 4; break; } throw new Error('switchUserRequestFullAccess: missing userId'); case 4: _context32.next = 6; return regeneratorRuntime.awrap(httpHelper({ url: `${options.unifiedLoginUrl}/switchRequest`, method: 'POST', authorization: sessionId, payload: { impersonatedUserId: userId, language: getLanguage() } })); case 6: res = _context32.sent; if (res.ok) { _context32.next = 9; break; } throw new Error('Failed to request full switch user access. userId: ' + userId); case 9: case "end": return _context32.stop(); } } }, null, null, null, Promise); }; var handleSwitchUserFullAccessClick = function _callee33(event) { var prefix, suffix, userFallbackStr, loadingIcon, div; return regeneratorRuntime.async(function _callee33$(_context33) { while (1) { switch (_context33.prev = _context33.next) { case 0: prefix = translations.REQUEST_FULL_ACCESS_EMAIL_CONFIRMATION_PREFIX[topbar.language]; suffix = translations.REQUEST_FULL_ACCESS_EMAIL_CONFIRMATION_SUFFIX[topbar.language]; userFallbackStr = translations.USER[topbar.language].toLowerCase(); if (window.confirm(`${prefix} ${getAssumedEmail() || userFallbackStr} ${suffix}`)) { _context33.next = 5; break; } return _context33.abrupt("return"); case 5: loadingIcon = event.currentTarget.querySelector('button > div > div'); loadingIcon.replaceWith(createLoadingSvg('white')); _context33.prev = 7; _context33.next = 10; return regeneratorRuntime.awrap(switchUserRequestFullAccess(getSessionId(), getAssumedUserId())); case 10: reminderAlertsUtil.handleAlerts([createAlertTemplate('INFORMATIVE_CONTEXTUAL', 'FULL_ACCESS_REQUESTED', 'EMAIL_SENT_TO_USER', ['portal.postnord.com'])]); disturbanceAlertsUtil.handleAlerts([]); _context33.next = 17; break; case 14: _context33.prev = 14; _context33.t0 = _context33["catch"](7); disturbanceAlertsUtil.handleAlerts([createAlertTemplate('DISTURBANCE', 'ERROR', 'ERROR_SENDING_EMAIL_TO_USER', ['portal.postnord.com'])]); case 17: _context33.prev = 17; hideMenus(); div = document.createElement('div'); loadingIcon = document.querySelector('.switchUserFullAccessBtnText > div'); loadingIcon.replaceWith(div); return _context33.finish(17); case 23: case "end": return _context33.stop(); } } }, null, null, [[7, 14, 17, 23]], Promise); }; var initSwitchUserFullAccessBtn = function () { var container = document.querySelector('.switchUserFullAccessContainer'); if (!container || !getAssumedUserId()) return; container.addEventListener('click', function (event) { return handleSwitchUserFullAccessClick(event); }); container.classList.remove('hidden'); }; var updateRedDotState = function (visible) { var redDot = document.querySelector('#openLoggedInMenu .red-dot'); if (redDot) { redDot.setAttribute('aria-hidden', !visible); } }; var updateSwitchUserUI = function () { if (!isSwitchUser()) return; updateAssumedAsTxt(); updateLoginStatusTxt(); updateLogoutBtnTxt(); initSwitchUserFullAccessBtn(); updateRedDotState(true); if (isAssumedUser()) { hideMyAccountBtn(); } }; /* here we place domain specific hiding/showing/updating of elements */ var overrideUI = function () { overrideLoginSE(); updateSwitchUserUI(); }; /* check if user has non-empty first and last name, otherwise redirect to login */ var redirectToLoginWhenUserInfoIsInvalid = function (userInfo) { var notOnPortalDomain = !isOnPortalDomain(); if (notOnPortalDomain) return; var firstName = userInfo.given_name || userInfo.firstName; var lastName = userInfo.family_name || userInfo.lastName; var isEmptyString = function (str) { return str === undefined || str === null || str.toString() === ''; }; if (isEmptyString(firstName) || isEmptyString(lastName)) { debugLog(`User ${userInfo.username} has empty name, redirecting to the login flow`); clearUser(); topbar.login(); } }; var init = function _callee34() { return regeneratorRuntime.async(function _callee34$(_context34) { while (1) { switch (_context34.prev = _context34.next) { case 0: checkForLoginError(); _context34.prev = 1; overrideUI(); _context34.next = 5; return regeneratorRuntime.awrap(setupTokens()); case 5: _context34.next = 7; return regeneratorRuntime.awrap(fetchUserSettings(getAccessToken())); case 7: setRefreshTokenInterval(); myServices.fetchMyServices(menuItems.topbarMyServices.url, topbar); updateUserLoginUI(); updateAllUrls(); updateUIOnLoginStatus(topbar.isLoggedIn); browserSuggestion(); saveUserTypeToLocalStorage(); /* After session tokens and all UI components are setup, we can not take care of i18n */ setupAlerts(); setLogoUrl(); setPageTitle(); initCart(); initServiceWorker(); showEnvTagInTopbar(); initEventListeners(); initPublicTopbarFunctions(); initDataLayerForGoogleTagManager(); setMarketAndLanguageBasedOnUrl(getUrlMarket(), getUrlLanguage()); /* Set this last to make it have highest prio */ renderMarketLanguageUI(); _context34.next = 27; return regeneratorRuntime.awrap(initOrgList()); case 27: _context34.next = 29; return regeneratorRuntime.awrap(initUserMarketCustomerNumbers()); case 29: setUpMarketSelectorDisplay(); createTopbarLoadedEvent(); _context34.next = 38; break; case 33: _context34.prev = 33; _context34.t0 = _context34["catch"](1); console.error('[topbar]', _context34.t0); console.log('[topbar] Terminating self'); return _context34.abrupt("return", terminateSelf()); case 38: case "end": return _context34.stop(); } } }, null, null, [[1, 33]], Promise); }; init(); return topbar;};window.pnTopbar = new PostNordTopbar({"version":"2.4.78","debugLogs":"false","portalUrl":"portal.postnord.com","alertsEndpoint":"https://portal.postnord.com/api/alerts/","topbarUserSettingsUrl":"https://portal.postnord.com/usersettings/services/","userManagementUrl":"https://portal.postnord.com/user-management/","iamAccountUrl":"https://account.postnord.com","umsApiUrl":"https://portal.postnord.com/api/ums","iamAdminPortalUrl":"https://adminportal.prod.postnord.services/secure/dashboard","carts":{"shippingTool":"https://portal.postnord.com/skickadirekt/payment"},"showCart":false,"currentSite":"https://portal.postnord.com/","currentServiceId":"ncp","currentServiceName":"CUSTOMER_PORTAL","elementId":null,"hideTopbar":null,"isMarketSite":false,"myAlerts":"https://portal.postnord.com/my-pages/notifications","myPages":"https://portal.postnord.com/my-pages","myServices":"https://portal.postnord.com/pnmyservices","reportErrorUrl":"https://portal.postnord.com/errorcollector","stage":"prod","translations":{"messaging":{"en":"Customer Service","sv":"Kundservice","no":"Kundeservice","da":"Kundeservice","fi":"Asiakaspalvelu"},"notifications":{"en":"Notifications","sv":"Notiser","no":"Varslinger","da":"Notifikationer","fi":"Ilmoitukset"},"tools":{"en":"Tools","sv":"Verktyg","no":"Verktøy","da":"Værktøjer","fi":"Työkalut"},"sites":{"en":"Sites","sv":"Webbplatser","no":"Nettsteder","da":"Hjemmesider","fi":"Verkkosivustot"},"ACTIVE_SITE":{"en":"Active site","sv":"Aktiv webbplats","no":"Aktivt nettsted","da":"Aktivt websted","fi":"Aktiivinen verkkosivusto"},"ALL_TOOLS":{"en":"All tools","sv":"Alla verktyg","no":"Alle verktøy","da":"Alle værktøjer","fi":"Kaikki työkalut"},"shop":{"en":"Shop","sv":"Shop","no":"Shop","da":"Shop","fi":"Shop"},"help":{"en":"Help","sv":"Hjälp","no":"Hjelp","da":"Hjælp","fi":"Auta"},"more":{"en":"More","sv":"Mer","no":"Mer","da":"Mere","fi":"Lisää"},"login":{"en":"Log in","sv":"Logga in","no":"Logg inn","da":"Log ind","fi":"Kirjaudu sisään"},"ncp":{"en":"PostNord Portal","sv":"PostNord Portal","no":"PostNord Portal","da":"PostNord Portal","fi":"PostNord Portal"},"CUSTOMER_PORTAL":{"en":"Portal","sv":"Portal","no":"Kundeportalen","da":"Kundeportal","fi":"Portaali"},"DEVELOPER_PORTAL":{"en":"Developer Portal","sv":"Developer Portal","no":"Developer Portal","da":"Developer Portal","fi":"Developer Portal"},"PORTAL":{"en":"Portal","sv":"Portal","no":"Portal","da":"Portal","fi":"Portaali"},"PORTAL_BUSINESS":{"en":"Portal Business","sv":"Portal Business","no":"Portal Business","da":"Portal Business","fi":"Asiakasportaali"},"MY_ALERTS":{"en":"Notifications","sv":"Aviseringar","no":"Varslinger","da":"Underretninger","fi":"Ilmoitukset"},"account":{"en":"Account","sv":"Konto","no":"Konto","da":"Konto","fi":"Tili"},"LANGUAGE":{"en":"Language","sv":"Språk","no":"Språk","da":"Sprog","fi":"Kieli"},"CLAIMS_PUBLIC":{"en":"Claims","sv":"Reklamera","no":"Reklamera","da":"Reklamationer","fi":"Claims"},"LOGOUT":{"en":"Log out","sv":"Logga ut","no":"Logg ut","da":"Log ud","fi":"Kirjaudu ulos"},"MY_PAGES":{"en":"My Pages","sv":"Mina sidor","no":"Mine sider","da":"Min konto","fi":"Omat sivuni"},"CREATE_MAILOUTS":{"en":"Create Mail-outs","sv":"Skapa Utskick","no":"Skapa Utskick","da":"Skapa Utskick","fi":"Create Mail-outs"},"SEND_DIRECT":{"en":"Send Direct","sv":"Skicka Direkt","no":"Skicka Direkt","da":"Skicka Direkt","fi":"Send Direct"},"ONLINE_PORTO":{"en":"Online Porto","sv":"Online Porto","no":"Online Porto","da":"Online Porto","fi":"Online Porto"},"SHIPPING_TOOL_PREMIUM":{"en":"Send Direct Business","sv":"Skicka Direkt Business","no":"Skicka Direkt Business","da":"Online Porto Business","fi":"Send Direct Business"},"0_UNREAD_NOTIFICATIONS":{"en":"0 unread notifications","sv":"0 olästa meddelanden","no":"0 uleste varsler","da":"0 ulæste notifikationer","fi":"0 lukematonta ilmoitusta"},"ALL_NOTIFICATIONS":{"en":"All notifications","sv":"Alla notiser","no":"Alle varsler","da":"Alle notifikationer","fi":"Kaikki ilmoitukset"},"MY_ACCOUNT":{"en":"My account","sv":"Mitt konto","no":"Min konto","da":"Min konto","fi":"Tilini"},"NOTIFICATION_SETTINGS":{"en":"Notification settings","sv":"Notisinställningar","no":"Varslingsinnstillinger","da":"Meddelelsesindstillinger","fi":"Ilmoitusasetukset"},"DENMARK":{"en":"Denmark","sv":"Danmark","no":"Danmark","da":"Danmark","fi":"Tanska"},"FINLAND":{"en":"Finland","sv":"Finland","no":"Finland","da":"Finland","fi":"Suomi"},"NORWAY":{"en":"Norway","sv":"Norge","no":"Norge","da":"Norge","fi":"Norja"},"SWEDEN":{"en":"Sweden","sv":"Sverige","no":"Sverige","da":"Sverige","fi":"Ruotsi"},"SEE_ALL_OUR_TOOLS":{"en":"See all our tools","sv":"Se alla våra verktyg","no":"See all our tools","da":"Se alle vores værktøjer","fi":"Katso kaikki työkalut"},"SEND_LETTERS_AND_ADVERTISEMENTS":{"en":"Send letters and advertisements","sv":"Skicka brev och reklam","no":"Send letters and advertisements","da":"Send breve og reklamer","fi":"Lähetä kirjeitä ja mainoksia"},"POSTNORD_START_PAGE":{"en":"PostNords start page","sv":"PostNords startsida","no":"PostNords start page","da":"PostNords startside","fi":"PostNordin aloitussivu"},"INFORMATION_ABOUT_POSTNORD":{"en":"Information about PostNord","sv":"Information om PostNord","no":"Informasjon om PostNord","da":"Information om PostNord","fi":"Tietoa PostNordista"},"INFORMATION_ABOUT_POSTNORD_GROUP":{"en":"Information about PostNord Group","sv":"Information om PostNord Group","no":"Informasjon om PostNord Group","da":"Information om PostNord Group","fi":"Tietoja PostNord Groupista"},"BUY_SHIPPING_QUICKLY":{"en":"Buy shipping quickly and easily","sv":"Köp frakt snabbt och enkelt","no":"Buy shipping quickly and easily","da":"Køb fragt hurtigt og nemt","fi":"Lähetä nopeasti ja helposti "},"MAKE_A_COMPLAINT":{"en":"Make a complaint","sv":"Gör en reklamation","no":"Make a complaint","da":"Lav en klage","fi":"Tee korvausvaade"},"MANAGE_YOUR_SHIPMENTS":{"en":"Manage your shipments","sv":"Hantera dina försändelser","no":"Manage your shipments","da":"Håndtere dine forsendelser","fi":"Hallinnoi lähetyksiä"},"CREATE_NEW_ACCOUNT":{"en":"Create new account","sv":"Skapa nytt konto","no":"Create new account","da":"Opret ny konto","fi":"Luo uusi käyttäjätili"},"UPGRADE_TO_PREMIUM":{"en":"Upgrade to premium","sv":"Uppgradera till premium","no":"Upgrade to premium","da":"Opgrader til premium","fi":"Päivitä Premiumiin"},"CART":{"en":"Cart","sv":"Kundvagn","no":"Cart","da":"Varekurv","fi":"Ostoskori"},"COUNTRY":{"en":"Country","sv":"Land","no":"Land","da":"Land","fi":"Maa"},"CREATE_ACCOUNT":{"en":"Create account","sv":"Skapa konto","no":"Opprett konto","da":"Opret konto","fi":"Luo käyttäjätili"},"PACSOFT":{"en":"Pacsoft Online","sv":"Pacsoft Online","no":"Pacsoft Online","da":"Pacsoft Online","fi":"Pacsoft Online"},"BUY_SHIPPING_WITH_INVOICE":{"en":"Buy shipping with invoice","sv":"Köp frakt på faktura","no":"Kjøp frakt med fakturabetaling","da":"Køb fragt med fakturabetaling","fi":"Buy shipping with invoice"},"POSTNORD_ELIN":{"en":"Electronic invoice documents","sv":"Elektroniska fakturaunderlag","no":"Electronic invoice documents","da":"Electronic invoice documents","fi":"Electronic invoice documents"},"POSTNORD_ELIN_TEXT":{"en":"Elin","sv":"Elin","no":"Elin","da":"Elin","fi":"Elin"},"ECNOW_EXPLANATION":{"en":"Warehousing, logistics, and communication for e-commerce","sv":"Lager, logistik och kommunikation för e-handlare","no":" ","da":"Lager, logistik og kommunikation til e-handlere","fi":"Varastointi, logistiikka ja viestintä verkkokaupan tarpeisiin"},"EINVOICE":{"en":"E-invoice","sv":"E-faktura","no":"E-faktura","da":"E-faktura","fi":"E-lasku"},"SHIPPING_TOOL_TITLE":{"en":"Send Direct | PostNord Portal","sv":"Skicka Direkt | Lätt och billig frakt med paket och rek | PostNord Portal","no":"Send Direct | PostNord Portal","da":"Send Direct | PostNord Portal","fi":"Send Direct | PostNord Portal"},"CLAIMS_PUBLIC_TITLE":{"en":"Claims | PostNord Portal","sv":"Reklamationer | PostNord Portal","no":"Claims | PostNord Portal","da":"Reklamationer | PostNord Portal","fi":"Claims | PostNord Portal"},"ONLINE_PORTO_TITLE":{"en":"Online Porto | PostNord Portal","sv":"Online Porto | PostNord Portal","no":"Online Porto | PostNord Portal","da":"Online Porto | Køb portokod og pakkelabel nemt og billigt | PostNord","fi":"Online Porto | PostNord Portal"},"DIRECTMAIL_TITLE":{"en":"Create Mailouts | PostNord Portal","sv":"Skapa Utskick | Skicka information, reklam och nyhetsbrev | PostNord","no":"Create Mailouts | PostNord Portal","da":"Create Mailouts | PostNord Portal","fi":"Create Mailouts | PostNord Portal"},"ONBOARDING_TITLE":{"en":"Sign Up | PostNord Portal","sv":"Skapa Konto | PostNord Portal","no":"Sign Up | PostNord Portal","da":"Opret Konto | PostNord Portal","fi":"Sign Up | PostNord Portal"},"MESSAGING_TITLE":{"en":"Customer Service | PostNord Portal","sv":"Kundservice | PostNord Portal","no":"Kundeservice | PostNord Portal","da":"Kundeservice | PostNord Portal","fi":"Asiakaspalvelu | PostNord Portal"},"MYPAGES_TITLE":{"en":"My Account | PostNord Portal","sv":"Mitt Konto | PostNord Portal","no":"Min Konto | PostNord Portal","da":"Min Konto | PostNord Portal","fi":"Tilini | PostNord Portal"},"TRACKING_TITLE":{"en":"Tracking | PostNord","sv":"Spåra Försändelser | PostNord Portal","no":"Spor Forsendelser | PostNord Portal","da":"Spore Forsendelser | PostNord Portal","fi":"Seurata Lähetyksiä | PostNord Portal"},"VATSE_TITLE":{"en":"Customs & VAT | PostNord Portal","sv":"Betala Tull och Moms för paket från utlandet | PostNord Portal","no":"Customs & VAT | PostNord Portal","da":"Customs & VAT | PostNord Portal","fi":"Customs & VAT | PostNord Portal"},"NOTIFICATIONS_TITLE":{"en":"Notifications | PostNord Portal","sv":"Notiser | PostNord Portal","no":"Varslinger | PostNord Portal","da":"Underretninger | PostNord Portal","fi":"Ilmoitukset | PostNord Portal"},"YOUR_BROWSER_IS_OUTDATED":{"en":"Your browser is outdated","sv":"Din webbläsare är föråldrad","da":"Din browser er forældet","no":"Nettleseren din er utdatert","fi":"Your browser is outdated"},"OUTDATED_BROWSER_MSG":{"en":"Limited support for Internet Explorer. Some tools might work poorly since your browser is outdated. Consider switching to Chrome, Edge, Firefox, or a similar browser for a faster, smoother experience.","sv":"Begränsat stöd för Internet Explorer. Vissa verktyg kan fungera sämre eftersom din webbläsare är gammal. Överväg att byta till Chrome, Edge, Firefox eller liknande webbläsare för en snabbare och smidigare upplevelse.","da":"Begrænset support til Internet Explorer. Du kan opleve problemer med flere af funktionerne, da Internet Explorer er forældet. For en bedre oplevelse og fuld funktionalitet, anbefaler vi, at du skifter over til Chrome, Edge, Firefox eller en lignende browser.","no":"Limited support for Internet Explorer. Some tools might work poorly since your browser is outdated. Consider switching to Chrome, Edge, Firefox, or a similar browser for a faster, smoother experience.","fi":"Rajattu toimivuus Internet Explorer -selaimella. Osa toiminnoista saattaa toimia viallisesti, koska selain on vanhentunut. Suosittelemmme käyttämään jotakin seuraavista selaimista nopeamman ja sujuvamman käyttäjäkokemuksen varmistamiseksi: Chrome, Edge, Firefox tai vastaava."},"POSTBOXES_SITE_NAME":{"en":"Postboxes","sv":"Postboxar","da":"Postboxes","no":"Postboxes","fi":"Postboxes"},"POSTBOXES_SITE_TITLE":{"en":"Postbox - Fetch your post when it suits you and your company","sv":"Postbox – hämta posten när det passar dig och ditt företag eller förening","da":"Postbox - Fetch your post when it suits you and your company","no":"Postbox - Fetch your post when it suits you and your company","fi":"Postbox - Fetch your post when it suits you and your company"},"POSTBOXES_SITE_DESCRIPTION":{"en":"Postbox is both a service and unique address which can be used by companies and organisations for fetching post at times that suit them","sv":"Postbox är både en tjänst och unik adress som kan användas av företag, organisationer och föreningar för hämtning av post på tider som passar","da":"Postbox is both a service and unique address which can be used by companies and organisations for fetching post at times that suit them","no":"Postbox is both a service and unique address which can be used by companies and organisations for fetching post at times that suit them","fi":"Postbox is both a service and unique address which can be used by companies and organisations for fetching post at times that suit them"},"SENDOUT_ARRIVAL_SITE_NAME":{"en":"Delivery Day","sv":"Utdelningsdag","da":"Delivery Day","no":"Delivery Day","fi":"Delivery Day"},"SENDOUT_ARRIVAL_SITE_TITLE":{"en":"Delivery Day","sv":"Utdelningsdag","da":"Delivery Day","no":"Delivery Day","fi":"Delivery Day"},"SENDOUT_ARRIVAL_SITE_DESCRIPTION":{"en":"With the tool Delivery Day you can plan your deliveries and see when your letters will be delivered in your postcode area.","sv":"Med verktyget Utdelningsdag kan du planera dina utskick och se när brev delas ut i ditt postnummerområde.","da":"With the tool Delivery Day you can plan your deliveries and see when your letters will be delivered in your postcode area.","no":"With the tool Delivery Day you can plan your deliveries and see when your letters will be delivered in your postcode area.","fi":"With the tool Delivery Day you can plan your deliveries and see when your letters will be delivered in your postcode area."},"MAIL_DELIVERY_SITE_NAME":{"en":"Mail Delivery","sv":"Utkörning brev","da":"Mail Delivery","no":"Mail Delivery","fi":"Mail Delivery"},"MAIL_DELIVERY_SITE_TITLE":{"en":"Mail Delivery","sv":"Utkörning brev","da":"Mail Delivery","no":"Mail Delivery","fi":"Mail Delivery"},"MAIL_DELIVERY_SITE_DESCRIPTION":{"en":"Mail delivery is a service for companies that have a mailbox address but are not able to retrieve the mail themselves. We agree on a time and deliver when it suits your business.","sv":"Utkörning av post är för dig som inte vill lägga tid på att behöva hämta din post själv. Vi levererar posten vid din dörr på överenskommen plats och tid.","da":"Mail delivery is a service for companies that have a mailbox address but are not able to retrieve the mail themselves. We agree on a time and deliver when it suits your business.","no":"Mail delivery is a service for companies that have a mailbox address but are not able to retrieve the mail themselves. We agree on a time and deliver when it suits your business.","fi":"Mail delivery is a service for companies that have a mailbox address but are not able to retrieve the mail themselves. We agree on a time and deliver when it suits your business."},"SITE":{"en":"Site","sv":"Sida","no":"Side","da":"Side","fi":"Site"},"PN_PORTAL":{"en":"PostNord Portal","sv":"PostNord Portal","no":"PostNord Portal","da":"PostNord Portal","fi":"PostNord Portal"},"PN_DA":{"en":"PostNord Denmark","sv":"PostNord Danmark","no":"PostNord Danmark","da":"PostNord Danmark","fi":"PostNord Tanska"},"PN_FI":{"en":"PostNord Finland","sv":"PostNord Finland","no":"PostNord Finland","da":"PostNord Finland","fi":"PostNord Suomi"},"PN_NO":{"en":"PostNord Norway","sv":"PostNord Norge","no":"PostNord Norge","da":"PostNord Norge","fi":"PostNord Norja"},"PN_SV":{"en":"PostNord Sweden","sv":"PostNord Sverige","no":"PostNord Sverige","da":"PostNord Sverige","fi":"PostNord Ruotsi"},"PN_DE":{"en":"PostNord Germany","sv":"PostNord Tyskland","no":"PostNord Tyskland","da":"PostNord Tyskland","fi":"PostNord Saksa"},"PN_GROUP":{"en":"PostNord Group","sv":"PostNord Koncernen","no":"PostNord Group","da":"PostNord Koncernen","fi":"PostNord Group"},"PN_STRALFORS":{"en":"PostNord Strålfors","sv":"PostNord Strålfors","no":"PostNord Strålfors","da":"PostNord Strålfors","fi":"PostNord Strålfors"},"DIRECT_LINK":{"en":"Direct Link","sv":"Direct Link","no":"Direct Link","da":"Direct Link","fi":"Direct Link"},"MAIL_PICKUP_SITE_NAME":{"en":"Mail and Varubrev Pickup","sv":"Upphämtning av brev och varubrev","da":"Mail and Varubrev Pickup","no":"Mail and Varubrev Pickup","fi":"Mail and Varubrev Pickup"},"MAIL_PICKUP_SITE_TITLE":{"en":"Mail and Varubrev Pickup","sv":"Upphämtning av brev och varubrev","da":"Mail and Varubrev Pickup","no":"Mail and Varubrev Pickup","fi":"Mail and Varubrev Pickup"},"MAIL_PICKUP_SITE_DESCRIPTION":{"en":"Mail pickup means we pickup your mail and varubrev directly for faster delivery","sv":"Hämtning av post och varubrev innebär att vi hämtar ditt företags utgående post och varubrev för snabbare leverans","da":"Mail pickup means we pickup your mail and varubrev directly for faster delivery","no":"Mail pickup means we pickup your mail and varubrev directly for faster delivery","fi":"Mail pickup means we pickup your mail and varubrev directly for faster delivery"},"USER_MANAGEMENT":{"en":"User Management","sv":"User Management","da":"User Management","no":"User Management","fi":"User Management"},"SUBSCRIPTIONS_SITE_NAME":{"en":"Subscriptions","sv":"Prenumerationer","da":"Subscriptions","no":"Subscriptions","fi":"Subscriptions"},"SUBSCRIPTIONS_SITE_TITLE":{"en":"Pickup and delivery","sv":"Hämtning och utkörning","da":"Pickup and delivery","no":"Pickup and delivery","fi":"Pickup and delivery"},"SUBSCRIPTIONS_SITE_DESCRIPTION":{"en":"Subscriptions on PostNord services","sv":"Prenumerationer på tjänster inom PostNord","da":"Subscriptions on PostNord services","no":"Subscriptions on PostNord services","fi":"Subscriptions on PostNord services"},"MARKET_SITES_DESC":{"en":"Services and tools for sending and receiving your post","sv":"Tjänster och verktyg för att skicka och ta emot din post","da":"Services and tools for sending and receiving your post","no":"Services and tools for sending and receiving your post","fi":"Services and tools for sending and receiving your post"},"RIKTIGA_VYKORT":{"en":"Real Postcards","sv":"Riktiga Vykort","no":"Riktiga Vykort","da":"Riktiga Vykort","fi":"Riktiga Vykort"},"NOTIFICATIONS_MANAGEMENT":{"en":"Notifications management","sv":"Notifications management","no":"Notifications management","da":"Notifications management","fi":"Notifications management"},"NEXT":{"en":"Next","sv":"Nästa","no":"Neste","da":"Næste","fi":"Seuraava"},"PREVIOUS":{"en":"Previous","sv":"Föregående","no":"Tidligere","da":"Forrige","fi":"Edellinen"},"USER":{"en":"User","sv":"Användare","no":"Bruker","da":"Bruger","fi":"Käyttäjä"},"LOGGED_IN_AS":{"en":"Logged in as","sv":"Inloggad som","no":"Logget inn som","da":"Logget ind som","fi":"Kirjautunut sisään nimellä"},"ACTING_AS":{"en":"Acting as","sv":"Agerar som","no":"Fungerer som","da":"Fungerer som","fi":"Toimii mm"},"SWITCH_BACK":{"en":"Switch back","sv":"Växla tillbaka","no":"Bytt tilbake","da":"Skift tilbage","fi":"Vaihda takaisin"},"REQUEST_FULL_ACCESS":{"en":"Request full access","sv":"Begär full åtkomst","no":"Be om full tilgang","da":"Anmod om fuld adgang","fi":"Pyydä täyttä käyttöoikeutta"},"FULL_ACCESS_REQUESTED":{"en":"Full access requested","sv":"Full tillgång begärd","da":"Fuld adgang anmodet","fi":"Täysi käyttöoikeus pyydetty","no":"Full tilgang forespurt"},"REQUEST_FULL_ACCESS_EMAIL_CONFIRMATION_PREFIX":{"en":"Do you want to send an email to","sv":"Vill du skicka ett e-postmeddelande till","no":"Do you want to send an email to","da":"Do you want to send an email to","fi":"Do you want to send an email to"},"REQUEST_FULL_ACCESS_EMAIL_CONFIRMATION_SUFFIX":{"en":"and request full access?","sv":"och begära full åtkomst?","no":"and request full access?","da":"and request full access?","fi":"and request full access?"},"EMAIL_SENT_TO_USER":{"en":"Email sent to user.","sv":"E-post har skickat till användaren.","da":"E-mail sendt til bruger.","fi":"Sähköposti lähetetty käyttäjälle.","no":"E-post sendt til bruker."},"ERROR":{"en":"Error","sv":"Fel","no":"Feil","da":"Fejl","fi":"Poikkeamat"},"ERROR_SENDING_EMAIL_TO_USER":{"en":"Error sending email to user.","sv":"Det gick inte att skicka e-post till användaren.","no":"Feil ved sending av e-post til bruker.","da":"Fejl ved afsendelse af e-mail til bruger.","fi":"Virhe sähköpostin lähettämisessä käyttäjälle."},"ATTENTION":{"en":"Attention","sv":"Attention","da":"Attention","fi":"Attention","no":"Attention"},"NO_AUTHORITES_FOUND_FOR_THIS_USER":{"en":"You have logged in with an internal user without any authorities nor a relation to an organization. In case of your intention was to have rights in the Portal you may have encountered an issue and need to logout and login again after a while, or login with your shared user from this url - https://portal.postnord.com/shared.","sv":"You have logged in with an internal user without any authorities nor a relation to an organization. In case of your intention was to have rights in the Portal you may have encountered an issue and need to logout and login again after a while, or login with your shared user from this url - https://portal.postnord.com/shared.","da":"You have logged in with an internal user without any authorities nor a relation to an organization. In case of your intention was to have rights in the Portal you may have encountered an issue and need to logout and login again after a while, or login with your shared user from this url - https://portal.postnord.com/shared.","fi":"You have logged in with an internal user without any authorities nor a relation to an organization. In case of your intention was to have rights in the Portal you may have encountered an issue and need to logout and login again after a while, or login with your shared user from this url - https://portal.postnord.com/shared.","no":"You have logged in with an internal user without any authorities nor a relation to an organization. In case of your intention was to have rights in the Portal you may have encountered an issue and need to logout and login again after a while, or login with your shared user from this url - https://portal.postnord.com/shared."},"RETAIL_TRUMPET":{"en":"Retail trumpet","sv":"Retail trumpet","no":"Retail trumpet","da":"Retail trumpet","fi":"Retail trumpet"},"RETAIL_MESSAGES":{"en":"Retail messages","sv":"Retail messages","no":"Retail messages","da":"Retail messages","fi":"Retail messages"},"NORDIC_PLANNED_ROUTE":{"en":"Nordic Planned Route","sv":"NORDIC_PLANNED_ROUTE","no":"NORDIC_PLANNED_ROUTE","da":"NORDIC_PLANNED_ROUTE","fi":"NORDIC_PLANNED_ROUTE"}},"selectedMarket":"SE","messagingUrl":"https://portal.postnord.com/customerservice/","unifiedLoginUrl":"https://portal.postnord.com/api/unified-login/backend","unifiedLoginClientId":"ncpuflbusinessFEzuXI8HNGtir7SN","errorPage500Url":"https://portal.postnord.com/server-error-page/","onboardingUrl":"https://portal.postnord.com/onboard/","oldOnboardingUrl":"https://gate.ess.postnord.com/mga/sps/authsvc?PolicyId=urn:ibm:security:authentication:asf:uscAccountCreate&returnUrl=https://gate.ess.postnord.com/mga/oidc/endpoint/amapp-runtime-oidc/authorize%3Fclient_id%3DNCP%26scope%3Dopenid%2520profile%26response_type%3Did_token%2520token%26nonce=9ab36c71-07f4-11f0-b4d6-333d9546ebc2&state=9ab36c70-07f4-11f0-b4d6-333d9546ebc2&redirect_uri=","baseUserLandingSiteSE":"https://portal.postnord.com/skickadirekt/","baseUserLandingSiteDK":"https://portal.postnord.com/onlineporto/","webPushNotificationsUrl":"https://portal.postnord.com/api/user/web-push-notifications","webPushPublicVapidKey":"BCLHo8Z2s-81O1ufcbiDhS23XGisN4pkDrSf0DCbz0SkZd8OeTbh6gbpOqA52kaNkeP7XNJssyl9SSAyTxjqloU"});