{"version":3,"sources":["menuEventsDesktop.js","appNexus.b1.js","lazyLoad.b1.js","utmHandler.js"],"names":["global","factory","define","amd","window","root","onEnterKeyToggleMenu","mainMenu","submenuContainers","querySelectorAll","i","length","addEventListener","event","preventDefault","submenu","this","parentNode","querySelector","style","display","setAttribute","onEscapeKeyCloseMenu","submenus","keyCode","closest","submenuContainer","focus","closeSubmenu","onTabCloseSubmenu","allSubmenuActionableElements","firstActionableElement","lastActionableElement","shiftKey","onBlurSubmenuContainerClose","relatedTarget","onMouseEnterOpenMenu","menuElement","onMouseLeaveCloseMenu","mainMenus","document","setAllEvents","AppNexus","exports","module","apntag","constants","parameters","CONFIGURATION","ASTURL","PARAMETERSURL","HTMLDIVPREFIX","MEMBERID","SKINADID","UTMZCOOKIE","ATTEMPTRATE","ATTEMPTS","get","constantName","isAstLoaded","isAstLoading","areParametersDefined","loadAdsEvent","createEvent","atsLoadedEvent","onParametersLoaded","nativeAdTemplates","requestHttpGet","url","request","XMLHttpRequest","open","send","_printInformation","time","localStorage","getItem","console","info","_printAdInformation","text","_trackAdRequestStartEvent","body","dispatchEvent","CustomEvent","detail","data","eventType","handler","name","_trackAdRequestEndEvent","measureName","targetId","markNameStart","markNameEnd","performance","now","_ajaxRequest","callback","xmlHttpRequest","onreadystatechange","readyState","status","JSON","parse","responseText","err","setRequestHeader","_astAdLoadedHandler","_astAdAvailableHandler","response","adType","indexOf","native","image","nativeAdDiv","element","getElementById","templateElement","template","innerHTML","isMobileDevice","innerTemplate","fragment","createRange","createContextualFragment","nativePosition","headerDiv","sponsoredMobile","regex","src","href","clickUrl","textContent","sponsoredBy","title","icon","cta","result","impressionTrackers","clickTrackers","jsTrackers","iframeForNativeAd","createElement","onload","cssForIframe","value","styleElement","iframeStyles","Image","contentWindow","appendChild","exec","push","scr","type","async","head","bindEventsToNativeAdCard","classList","add","removeAttribute","createNativeAd","_astAdNoBidHandler","parentElement","remove","_astDefineTag","divElementId","width","height","index","nativeLayouts","undefined","allowedFormatsArray","keywords","original","undesiredKeys","clonedObject","Array","isArray","key","includes","_omit","isNativeSupported","dataset","currentPlacement","placements","filter","el","toLowerCase","replace","split","required","max_length","ref","defineTag","member","tagId","sizes","allowedFormats","customIframeProps","showTag","_executeRequestToAppNexus","setPageOpts","disablePsa","_createAppNexusRequest","overwriteAds","selector","elementId","appNexusRequests","adElements","prototype","slice","call","sort","a","b","indexA","id","indexB","widthA","Math","round","getAttribute","heightA","offsetParent","anq","loadTags","_astLoadedCallback","onEvent","_attachEventToLoad","object","attachEvent","_loadAstScriptAsync","tag","getElementsByTagName","script","location","protocol","insertBefore","_adParametersLoadedCallback","_adParametersLoadedAndRefreshCallback","refresh","adsIds","getIdsFromElements","concat","clearRequest","setKeywords","_checkUtmCookie","resolve","attempts","RegExp","match","cookie","_getCookieByName","setTimeout","bind","_loadAds","Promise","escape","Date","getTime","params","paramname","skinAd","firstChild","elements","map","initEvent","createRequestsCallback","iframeBody","clickAdFunction","e","j","removeEventListener","refreshAds","aboveElementIds","belowElementIds","refreshAdsAndUpdateParams","refreshAdByName","regenerateAds","overwrite","generateAllAds","param","loadAdOnDemand","randomNumber","floor","random","deleteAdByTagName","requests","tags","deleteAllAdsBySelector","tagsId","nativeIds","div","lazyLoad","init","viewportMarginObserver","spriteIntersectionObserver","listingContainer","lazySelectors","removeClass","lazyElements","forEach","srcset","loadFullImage","attachNoPhotosAvailable","noPhotoElement","noPhotoInline","pictureElement","onErrorSrc","removeSources","img","picture","removeChild","loadFullVideo","lazyVideo","source","children","videoSource","tagName","load","lazyImage","target","srcsetImage","hasCustomErrorHandling","onerror","srcsetValues","lazyLoadSpriteImages","spriteImages","IntersectionObserver","entries","entry","intersectionRatio","isIntersecting","spriteImage","lazysprite","unobserve","rootMargin","observe","LoadImages","lazyImages","lowQualityImage","threshold","viewportIntersectionObserver","MutationObserver","attributes","childList","characterData","loadNoLazyLoadImageError","onViewportElements","offViewportElements","intersectionObserver","changes","from","find","c","isOnViewport","margin","getBoundingClientRect","rect","bottom","right","top","innerHeight","documentElement","clientHeight","left","innerWidth","clientWidth","addOnViewportListener","addOffViewportListener","removeOnViewportListener","splice","removeOffViewportListener","getParameterValue","parameter","URLSearchParams","search","getParameterValueFromHash","hash","removeQueryString","createUtmUrl","utmSource","utmMedium","utmCampaign","utmTerm","utmContent","gclid","refer","separator","query","Object","keys","encodeURIComponent","join","setParameters","utm_source","utm_medium","utm_campaign","utm_term","utm_content","httpReferer","referrer","entranceUrl","setUtmParameters","fetch","ok","json","nhsRefer","HttpReferer","gaUtmSource","UtmSource","gaUtmMedium","UtmMedium","gaUtmCampaign","UtmCampaign","gaUtmTerm","UtmTerm","gaUtmContent","UtmContent","nhsEntranceUrl","EntranceUrl"],"mappings":"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","file":"../miscscriptsdesktop-021d0da42a.b1.min.js","sourceRoot":"..","sourcesContent":["(function (global, factory) {\r\n \"use strict\";\r\n if (\"function\" === typeof define && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // and to the global (window) object in case any JS module is expecting\r\n // the AppNexusModule to exists on the window object.\r\n define([], function () {\r\n factory(global);\r\n });\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n factory(global);\r\n }\r\n}(\"undefined\" !== typeof window ? window : {},\r\n function (root) {\r\n \"use strict\";\r\n\r\n // This module set the keyboard events to any fly-out menus for accessibility, like the mega menu.\r\n // It requires specific html data structure and data attributes to work:\r\n // -Main menu container must have a \"data-is-menu\" data attribute.\r\n // -Hidden submenus must contain a \"data-is-submenu\" data attribute.\r\n // -Elements that open its respective submenus must be anchors with a \"data-opens-submenu\" data attribute,\r\n // immediately follow by the \"data-is-submenu\" submenu container element.\r\n\r\n var ESCAPE_KEY_CODE = 27;\r\n var TAB_KEY_CODE = 9;\r\n\r\n /**\r\n * Shows or hides submenu sections for menu options that have submenus.\r\n * @param {object} mainMenu The main menu container element.\r\n */\r\n var onEnterKeyToggleMenu = function (mainMenu) {\r\n var submenuContainers = mainMenu.querySelectorAll(\"[data-opens-submenu]\");\r\n\r\n for (var i = 0; i < submenuContainers.length; ++i) {\r\n var currentSubmenuContainer = submenuContainers[i];\r\n currentSubmenuContainer.addEventListener(\"click\", function (event) {\r\n event.preventDefault();\r\n\r\n var submenu = this.parentNode.querySelector(\"[data-is-submenu]\");\r\n\r\n if (submenu.style.display === \"\" || submenu.style.display === \"none\") {\r\n submenu.style.display = \"block\";\r\n this.setAttribute(\"aria-expanded\", \"true\");\r\n } else {\r\n submenu.style.display = \"none\";\r\n this.setAttribute(\"aria-expanded\", \"false\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Closes the current open submenu when hitting the escape key in the keyboard.\r\n * @param {object} mainMenu The main menu container element.\r\n */\r\n var onEscapeKeyCloseMenu = function (mainMenu) {\r\n var submenus = mainMenu.querySelectorAll(\"[data-is-submenu]\");\r\n\r\n for (var i = 0; i < submenus.length; ++i) {\r\n var currentSubmenu = submenus[i];\r\n currentSubmenu.addEventListener(\"keydown\", function (event) {\r\n if (event.keyCode === ESCAPE_KEY_CODE) {\r\n var submenu = this.closest(\"[data-is-submenu]\");\r\n var submenuContainer = submenu.parentNode.querySelector(\"[data-opens-submenu]\");\r\n\r\n submenu.style.display = \"none\";\r\n submenuContainer.setAttribute(\"aria-expanded\", \"false\");\r\n submenuContainer.focus();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Hides the current open/active submenu.\r\n * @param {object} submenu The visible submenu element to close/hide.\r\n */\r\n var closeSubmenu = function(submenu) {\r\n var submenuContainer = submenu.parentNode.querySelector(\"[data-opens-submenu]\");\r\n\r\n submenu.style.display = \"none\";\r\n submenuContainer.setAttribute(\"aria-expanded\", \"false\");\r\n }\r\n \r\n /**\r\n * Closes the submenu when navigating it with keyboard:\r\n * 1- When the focus is in the first actionable element of the submenu and the user hits shift+tab.\r\n * 2- When the user is in the last actionable element of the submenu and the user hits tab.\r\n * @param {object} mainMenu The main menu container element.\r\n */\r\n var onTabCloseSubmenu = function(mainMenu) {\r\n var submenus = mainMenu.querySelectorAll(\"[data-is-submenu]\");\r\n for (var i = 0; i < submenus.length; ++i) {\r\n var currentSubmenu = submenus[i];\r\n var allSubmenuActionableElements = currentSubmenu.querySelectorAll(\"a, input\");\r\n var firstActionableElement = allSubmenuActionableElements[0];\r\n var lastActionableElement = allSubmenuActionableElements[allSubmenuActionableElements.length - 1];\r\n\r\n firstActionableElement.addEventListener(\"keydown\", function(event) {\r\n if (event.shiftKey && event.keyCode === TAB_KEY_CODE) {\r\n var submenu = this.closest(\"[data-is-submenu]\");\r\n closeSubmenu(submenu);\r\n }\r\n });\r\n\r\n lastActionableElement.addEventListener(\"keydown\", function(event) {\r\n if (!event.shiftKey && event.keyCode === TAB_KEY_CODE) {\r\n var submenu = this.closest(\"[data-is-submenu]\");\r\n closeSubmenu(submenu);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * When the focus is in any open submenu options, if the submenu is open and the next tab is going to the submenu, then hides the submenu.\r\n * @param {object} mainMenu The main menu container element.\r\n */\r\n var onBlurSubmenuContainerClose = function (mainMenu) {\r\n var submenuContainers = mainMenu.querySelectorAll(\"[data-opens-submenu]\");\r\n\r\n for (var i = 0; i < submenuContainers.length; ++i) {\r\n var currentSubmenuContainer = submenuContainers[i];\r\n\r\n currentSubmenuContainer.addEventListener(\"blur\", function (event) {\r\n if (event.relatedTarget &&\r\n !event.relatedTarget.closest(\"[data-is-submenu]\")) {\r\n var submenu = this.parentNode.querySelector(\"[data-is-submenu]\");\r\n\r\n submenu.style.display = \"none\";\r\n this.setAttribute(\"aria-expanded\", \"false\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * When hovering with the mouse a menu option with the that contains a submenu, opens the submenu.\r\n * This is normally done with css but if the user was navigating the menu with the keyboard before, then the menu may not display on hover.\r\n * @param {any} menuElement\r\n */\r\n var onMouseEnterOpenMenu = function (menuElement) {\r\n var submenuContainers = menuElement.querySelectorAll(\"[data-opens-submenu]\");\r\n\r\n for (var i = 0; i < submenuContainers.length; ++i) {\r\n var currentSubmenuContainer = submenuContainers[i].parentNode;\r\n currentSubmenuContainer.addEventListener(\"mouseenter\", function () {\r\n var submenu = this.querySelector(\"[data-is-submenu]\");\r\n\r\n submenu.style.display = \"block\";\r\n this.querySelector(\"[data-opens-submenu]\").setAttribute(\"aria-expanded\", \"true\");\r\n\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * When hovering with the mouse a menu option with the that contains a submenu, closes the submenu.\r\n * This is normally done with css but if the user was navigating the menu with the keyboard before, then the submenu may not hide.\r\n * @param {any} menuElement\r\n */\r\n var onMouseLeaveCloseMenu = function (menuElement) {\r\n var submenuContainers = menuElement.querySelectorAll(\"[data-opens-submenu]\");\r\n\r\n for (var i = 0; i < submenuContainers.length; ++i) {\r\n var currentSubmenu = submenuContainers[i].parentNode;\r\n currentSubmenu.addEventListener(\"mouseleave\", function () {\r\n var submenu = this.querySelector(\"[data-is-submenu]\");\r\n\r\n submenu.style.display = \"none\";\r\n this.querySelector(\"[data-opens-submenu]\").setAttribute(\"aria-expanded\", \"true\");\r\n\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets all the keyboard events to navigate the header menus with the keyboard.\r\n */\r\n var setAllEvents = function () {\r\n var mainMenus = document.querySelectorAll(\"[data-is-menu]\");\r\n\r\n for (var i = 0; i < mainMenus.length; ++i) {\r\n var mainMenu = mainMenus[i];\r\n\r\n onEnterKeyToggleMenu(mainMenu);\r\n onEscapeKeyCloseMenu(mainMenu);\r\n onTabCloseSubmenu(mainMenu);\r\n onBlurSubmenuContainerClose(mainMenu);\r\n onMouseEnterOpenMenu(mainMenu);\r\n onMouseLeaveCloseMenu(mainMenu);\r\n }\r\n }\r\n\r\n setAllEvents();\r\n\r\n }));","// ReSharper disable all InconsistentNaming\r\n(function (global, factory) {\r\n \"use strict\";\r\n\r\n if (\"function\" === typeof define && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // and to the global (window) object in case any JS module is expecting\r\n // the AppNexusModule to exists on the window object.\r\n define([], function () {\r\n return (global.AppNexus = factory(global));\r\n });\r\n } else if (\"object\" === typeof exports) {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code \r\n // is expected to work with this AppNexusModule.\r\n module.exports = (global.AppNexus = factory(global));\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.AppNexus = factory(global);\r\n }\r\n}(\"undefined\" !== typeof window ? window : {},\r\n function (root) {\r\n \"use strict\";\r\n /* In order to avoid AppNexus running twice or more. Flag is set to true once AppNexus ran.*/\r\n if (root.apntag) {\r\n return;\r\n }\r\n /**\r\n * \r\n * Using module pattern to avoid unintended modifications to the constants values needed during the execution of the script. ECMAScript5 limitation not const word exists.\r\n * \r\n * @constant \r\n */\r\n var CONFIGURATION = (function () {\r\n // \r\n var constants = {\r\n \"ASTURL\": \"//acdn.adnxs.com/ast/ast.js\", // URL were the AST JS resource is located.\r\n \"PARAMETERSURL\": \"/GetAdParameters?url=\", // URL of the AJAX call to get the parameters.\r\n \"HTMLDIVPREFIX\": \"nhs_\", // Prefix shared by the ID propert of all DIV elements where we are expecting an ad.\r\n \"MEMBERID\": 3232,\r\n \"SKINADID\": \"nhs_Sponsorship\",\r\n \"UTMZCOOKIE\": \"__utmz\",\r\n \"ATTEMPTRATE\": 500,\r\n \"ATTEMPTS\": 10, \r\n };\r\n\r\n var retrieveValue = function (constantName) {\r\n return constants[constantName];\r\n };\r\n\r\n return {\r\n get: retrieveValue // Expose a get method to return the value of the constants that have being defined in this module.\r\n };\r\n })();\r\n\r\n /**\r\n * @var Empty apntag.\r\n */\r\n var apntag;\r\n\r\n /**\r\n * @var Empty parameter object to stored the backend values passed as keywords to AppNexus.\r\n */\r\n var parameters;\r\n\r\n /**\r\n * @var Flag to indicate if the AST JS Library has already being loaded. If the AST Library has not being loaded value will be 'false', otherwise 'true'.\r\n */\r\n var isAstLoaded = false;\r\n\r\n /**\r\n * @var Flag to indicate if the request to load the AST JS Library has been started. If the AST Library has is being loaded value will be 'false', otherwise 'true'. \r\n */\r\n var isAstLoading = false;\r\n\r\n /**\r\n * @var Flag to indicate if the AJAX request to load the parameters to being sent to AppNexus has being retrived from the server. If the parameters has been loaded value will be 'true', otherwise 'false'.\r\n */\r\n var areParametersDefined = false;\r\n\r\n /**\r\n * @event Custom event to indicate a new call for Ads at AppNexus must be executed.\r\n */\r\n var loadAdsEvent = document.createEvent(\"Event\");\r\n\r\n /**\r\n * @event Custom event to indicate the AST JS library has been loaded.\r\n */\r\n var atsLoadedEvent = document.createEvent(\"Event\");\r\n\r\n /**\r\n * @type {Function[]} List of functions to run after the Parameters get loaded\r\n */\r\n var onParametersLoaded = [];\r\n\r\n /**\r\n * @type {object} to store in memory the native ads templates.\r\n */\r\n var nativeAdTemplates = { };\r\n\r\n const timing = {};\r\n\r\n /**\r\n *\r\n * Executes an XML Http Request for a given URL.\r\n *\r\n * @param {string} url URL where the file being requested lives.\r\n */\r\n function requestHttpGet(url) {\r\n var request = new XMLHttpRequest();\r\n request.open('GET', url);\r\n request.send();\r\n }\r\n \r\n /**\r\n * logs event and time information if a appnexus cookie is present.\r\n * @param event - a string that represents an event or action that occurred\r\n * in the application.\r\n * @param time - is a variable that represents the time associated with the event being logged.\r\n */\r\n const _printInformation = (event, time) => {\r\n if (localStorage.getItem('debugAppNexus')) {\r\n console.info(`${event} time: ${time}`);\r\n }\r\n };\r\n /**\r\n * logs the provided text to the console if a specific cookie 'debugAppNexus' is present.\r\n * @param text - The `text` parameter is a string that contains information to be printed.\r\n */\r\n const _printAdInformation = (text) => {\r\n if (localStorage.getItem('debugAppNexus')) {\r\n console.info(text);\r\n }\r\n };\r\n /**\r\n * dispatches on demand custom event to records the timing when ast script start.\r\n */\r\n const _trackAdScriptStartEvent = () => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markStart',\r\n name: 'ads_script_start'\r\n } }\r\n }));\r\n };\r\n /**\r\n * dispatches on demand custom event to records the timing when ast script end.\r\n */\r\n const _trackAdsScriptEndEvent = () => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markEnd',\r\n measureName: 'ads_script_measure',\r\n markNameStart: 'ads_script_start',\r\n markNameEnd: 'ads_script_end'\r\n } }\r\n }));\r\n _printInformation('Ads script', performance.now());\r\n };\r\n /**\r\n * dispatches on demand custom event to records the timing when ad parameters start.\r\n */\r\n const _trackAdParametersStartEvent = () => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markStart',\r\n name: 'ads_parameters_definition_start'\r\n } }\r\n }));\r\n };\r\n /**\r\n * dispatches on demand custom event to records the timing when ad parameters end.\r\n */\r\n const _trackAdParametersEndEvent = () => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markEnd',\r\n measureName: 'ads_parameters_definition_measure',\r\n markNameStart: 'ads_parameters_definition_start',\r\n markNameEnd: 'ads_parameters_definition_end'\r\n } }\r\n }));\r\n\r\n _printInformation('Ad parameters', performance.now());\r\n };\r\n /**\r\n * dispatches on demand custom event to records the timing when ad request start.\r\n */\r\n const _trackAdRequestStartEvent = () => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markStart',\r\n name: 'ad_request_start'\r\n } }\r\n }));\r\n };\r\n\r\n /**\r\n * dispatches on demand custom event to records the timing when ast request end.\r\n */\r\n const _trackAdRequestEndEvent = (event) => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: {\r\n eventType: 'SitespeedEvent',\r\n handler: 'markEnd',\r\n measureName: `ad_${event.targetId}_measure`,\r\n markNameStart: 'ad_request_start',\r\n markNameEnd: `ad_${event.targetId}_end`\r\n } }\r\n }));\r\n _printInformation(`${event.targetId}`, performance.now());\r\n };\r\n\r\n /**\r\n *\r\n * Method to insert a Native Ad into a page.\r\n *\r\n * @param {string} nativeAdDiv HTML Element ID where the Native Ad is going to be added.\r\n * @param {object} response AppNexus response with the Native Ad information.\r\n * @param {string} template HTML template that will be used to create the ad.\r\n */\r\n function createNativeAd(nativeAdDiv, response, template, isMobileDevice) {\r\n if (!response || !response.native) {\r\n return;\r\n }\r\n\r\n var fragment = document.createRange().createContextualFragment(template);\r\n var nativePosition = document.getElementById(nativeAdDiv);\r\n var headerDiv = fragment.querySelector(\"#nhs_adsAdvertisementIframe\");\r\n var sponsoredMobile = fragment.querySelector(\"#nhs_nativeSponsorIframe\");\r\n var regex = /(?:<\\/script>/g;\r\n\r\n if (nativePosition) {\r\n fragment.querySelector(\"#nhs_nativeImgIframe\").src = response.native.image.url;\r\n fragment.querySelector(\"[data-native-contact]\").href = response.native.clickUrl;\r\n\r\n fragment.querySelector(\"[data-native-contact]\").textContent = `Sponsored by ${response.native.sponsoredBy}`;\r\n fragment.querySelector(\"#nhs_nativeHeadlineIframe\").textContent = response.native.title\r\n fragment.querySelector(\"#nhs_nativeDescriptionIframe\").textContent = response.native.body;\r\n fragment.querySelector(\"#nhs_nativeBuilderLogoIframe\").src = response.native.icon.url;\r\n fragment.querySelector(\"[data-native-cta]\").textContent = response.native.cta;\r\n\r\n if (headerDiv) {\r\n headerDiv.textContent = \"Sponsored by \" + response.native.sponsoredBy;\r\n }\r\n\r\n if (sponsoredMobile) {\r\n sponsoredMobile.textContent = \"Sponsored by \" + response.native.sponsoredBy;\r\n }\r\n \r\n var impressionTrackers = response.native.impressionTrackers || [];\r\n var clickTrackers = response.native.clickTrackers || [];\r\n var jsTrackers = [];\r\n var result;\r\n\r\n var iframeForNativeAd = document.createElement(\"iframe\");\r\n iframeForNativeAd.setAttribute('title', \"Sponsored Ad\");\r\n\r\n iframeForNativeAd.onload = function () {\r\n const cssForIframe = document.querySelector('[data-native-ad-styles]').value;\r\n const circularFontPath = 'https://beta-nhs-static-secure.akamaized.net/wwwroot/fonts/CircularXX-variable.woff2';\r\n const souvenirFontPath = 'https://beta-nhs-static-secure.akamaized.net/wwwroot/fonts/SouvenirStd-Light.woff2';\r\n\r\n const styleElement = document.createElement('style');\r\n styleElement.textContent = `\r\n @font-face {\r\n font-display: swap;\r\n font-family: \"Circular XX\";\r\n src: url('${circularFontPath}') format('woff2');\r\n font-weight: 400 700;\r\n unicode-range: U+0020-007E, U+00A0-00A1, U+00A7, U+00A9-00AC, U+00AE, U+00B4, U+00BB, U+00BF-00C2, U+00C4, U+00C6-00CF, U+00D1-00D4, U+00D6, U+00D9-00DC, U+00E0-00E2, U+00E4, U+00E6-00EF, U+00F1-00F4, U+00F6, U+00F9-00FC, U+00FF, U+0152-0153, U+0178, U+02C6, U+02DA, U+02DC, U+2013-2014, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+20AC, U+2122, U+2212, U+2215;\r\n }\r\n \r\n @font-face {\r\n font-display: swap;\r\n font-family: 'ITC Souvenir Std';\r\n src: url('${souvenirFontPath}') format('woff2');\r\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n }\r\n `;\r\n\r\n var iframeStyles = document.createElement('link');\r\n iframeStyles.setAttribute('href', cssForIframe);\r\n iframeStyles.setAttribute('rel', \"stylesheet\");\r\n\r\n // impression trackers \r\n var i;\r\n for (i = 0; i < impressionTrackers.length; i += 1) {\r\n var image = new Image();\r\n image.src = impressionTrackers[i];\r\n image.style.display = \"none\";\r\n iframeForNativeAd.contentWindow.document.body.appendChild(image);\r\n }\r\n\r\n // JS trackers\r\n while ((result = regex.exec((response.native.javascriptTrackers))) !== null) {\r\n jsTrackers.push(result[1]);\r\n }\r\n\r\n for (i = 0; i < jsTrackers.length; i += 1) {\r\n var scr = document.createElement(\"script\");\r\n\r\n scr.type = \"text/javascript\";\r\n scr.async = true;\r\n scr.src = jsTrackers[i];\r\n iframeForNativeAd.contentWindow.document.head.appendChild(scr);\r\n }\r\n\r\n iframeForNativeAd.contentWindow.document.head.appendChild(iframeStyles);\r\n iframeForNativeAd.contentWindow.document.head.appendChild(styleElement);\r\n iframeForNativeAd.contentWindow.document.body.appendChild(fragment);\r\n\r\n bindEventsToNativeAdCard(iframeForNativeAd, nativePosition, clickTrackers, isMobileDevice);\r\n };\r\n\r\n nativePosition.appendChild(iframeForNativeAd);\r\n nativePosition.classList.add(\"loaded\");\r\n nativePosition.removeAttribute('hidden');\r\n }\r\n }\r\n\r\n /**\r\n * \r\n * Method to clone an orignal object except for one property.\r\n * \r\n * @private \r\n * @param {object} original Object to be cloned.\r\n * @param {string[]} undesiredKeys name of the keys we do not want to exist on the cloned object.\r\n * @returns {object} a clone version of the original object with all properties except one.\r\n */\r\n var _omit = function (original, undesiredKeys) {\r\n var clonedObject = {};\r\n\r\n if (!Array.isArray(undesiredKeys))\r\n return original;\r\n\r\n for (var key in original) {\r\n if (!undesiredKeys.includes(key)) {\r\n clonedObject[key] = original[key];\r\n }\r\n }\r\n\r\n return clonedObject;\r\n };\r\n\r\n /**\r\n * \r\n * Executes a GET request via AJAX to the URL specified and executes the callback once the action has returned.\r\n * Parses the information obtained as a JSON before passing it to the callback function\r\n * \r\n * @private\r\n * @param {string} url Location of the server where the GET action will be executed\r\n * @param {function} callback JavaScript function to execute if the AJAX request is succesfull.\r\n */\r\n var _ajaxRequest = function (url, callback) {\r\n _trackAdParametersStartEvent();\r\n var xmlHttpRequest = new XMLHttpRequest();\r\n\r\n xmlHttpRequest.onreadystatechange = function () {\r\n if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) {\r\n var data;\r\n\r\n try {\r\n data = JSON.parse(xmlHttpRequest.responseText);\r\n } catch (err) {\r\n return;\r\n }\r\n\r\n _trackAdParametersEndEvent();\r\n // If callback function was passed execute it, once the AJAX has returned.\r\n if (\"function\" === typeof callback && null !== data) {\r\n callback(data);\r\n }\r\n }\r\n };\r\n\r\n xmlHttpRequest.open(\"GET\", url, true);\r\n xmlHttpRequest.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n xmlHttpRequest.setRequestHeader(\"Cache-Control\", \"no-cache\");\r\n xmlHttpRequest.setRequestHeader(\"Content-type\", \"application/json; charset=utf-8\");\r\n xmlHttpRequest.send();\r\n };\r\n\r\n const _astAdLoadedHandler = (event) => {\r\n _printAdInformation(\"Ad loaded \");\r\n _printAdInformation(event);\r\n _trackAdRequestEndEvent(event);\r\n };\r\n\r\n /**\r\n *\r\n * Handles the Ad Available event for the apntag.\r\n * Handles the render of the ad if the available ad is native, otherwise does nothing as the AST library handles the rendering of banner ads.\r\n * Handles the render of the ad if the available ad is native, otherwise does nothing as the AST library handles the rendering of banner ads.\r\n *\r\n * @private\r\n * @param {object} response Available ad information.\r\n */\r\n var _astAdAvailableHandler = function (response) {\r\n\r\n if (response.adType.indexOf(\"native\") !== -1 && !!response.native && !!response.native.image && !!response.native.image.url) {\r\n var nativeAdDiv = response.targetId;\r\n var element = document.getElementById(response.targetId);\r\n const templateElement = document.getElementById(\"nativeAd\");\r\n let template = templateElement && templateElement.innerHTML;\r\n const isMobileDevice = !!document.querySelector('[data-ismobiledevice=\"true\"]');\r\n\r\n if (element) {\r\n const innerTemplate = element.querySelector(\"[data-native-ad-template]\");\r\n template = innerTemplate ? innerTemplate.innerHTML : template;\r\n }\r\n\r\n if (nativeAdTemplates[response.targetId]) {\r\n template = nativeAdTemplates[response.targetId];\r\n } else {\r\n nativeAdTemplates[response.targetId] = template;\r\n }\r\n \r\n createNativeAd(nativeAdDiv, response, template, isMobileDevice);\r\n } else {\r\n const element = document.getElementById(response.targetId);\r\n if (element) {\r\n element.removeAttribute('hidden');\r\n }\r\n }\r\n };\r\n \r\n /**\r\n *\r\n * Handles the Ad no bid event for apntag.\r\n * If the ad has not been bid then hide the parent div so that the space without the ad is not shown.\r\n * \"No bid\" means no offer in an ad auction, resulting in an empty advertising space.\r\n * We use an OnEvent to listen if the ad is noBid: true, the latter is a property that comes in the response\r\n * if the ad was bid the response says noBid:False.\r\n * @param {object} response - Ad information, if it was not bid.\r\n * See more details at.\r\n * @see {@link https://docs.xandr.com/bundle/seller-tag/page/seller-tag/on-event.html}\r\n * @see {@link https://docs.xandr.com/bundle/seller-tag/page/seller-tag/ad-object-api.html}\r\n */\r\n var _astAdNoBidHandler = function (response) {\r\n _printAdInformation(\"Ad no bid \");\r\n _printAdInformation(response);\r\n _trackAdRequestEndEvent(response);\r\n const element = document.getElementById(response.targetId);\r\n if (!element){\r\n return;\r\n }\r\n const parentElement = element.closest('[data-ad-parent]');\r\n if (parentElement) {\r\n parentElement.remove();\r\n }\r\n };\r\n\r\n /**\r\n * \r\n * Initialize the apntag object with the global page options.\r\n * \r\n * @private \r\n */\r\n var _astGlobalOptions = function () {\r\n apntag.setPageOpts({\r\n member: CONFIGURATION.get(\"MEMBERID\"),\r\n disablePsa: true,\r\n });\r\n };\r\n /**\r\n * \r\n * Define an Ad Tag to the apntag object.\r\n * \r\n * @private\r\n * @param {String} divElementId div Element Id\r\n * @param {Number} width width\r\n * @param {Number} height height\r\n * @param {Number} index index\r\n */\r\n var _astDefineTag = function (divElementId, width, height, index) {\r\n var nativeLayouts = undefined;\r\n var allowedFormatsArray = [\"banner\"];\r\n var data = JSON.parse(parameters);\r\n var keywords = _omit(data, [\"placements\", \"useLazyLoad\"]);\r\n var element = document.getElementById(divElementId);\r\n var isNativeSupported = element.dataset.native === \"true\";\r\n var currentPlacement = data.placements.filter(function (el) {\r\n var elementId = divElementId.toLowerCase().replace(CONFIGURATION.get(\"HTMLDIVPREFIX\"), \"\");\r\n return elementId.toLowerCase().indexOf(el.split(\"|\")[1].toLowerCase()) > -1;\r\n });\r\n\r\n if (\"undefined\" === typeof currentPlacement || null === currentPlacement || 0 === currentPlacement.length)\r\n return;\r\n\r\n\r\n if (divElementId.indexOf(\"native\") !== -1 || isNativeSupported) {\r\n allowedFormatsArray = [\"native\"];\r\n nativeLayouts = {\r\n title: { required: true, max_length: 70 },\r\n body: { required: true, max_length: 120 },\r\n image: { required: false },\r\n sponsoredBy: { required: true, max_length: 60 },\r\n icon: { required: false },\r\n cta: { required: false }\r\n }\r\n }\r\n\r\n currentPlacement = currentPlacement[0].split(\"|\")[0];\r\n keywords.ref = ++index; // Ad ref parameter to Ad call.\r\n\r\n apntag.defineTag({\r\n member: CONFIGURATION.get(\"MEMBERID\"),\r\n tagId: currentPlacement * 1, // Placement ID in console.\r\n sizes: [width, height],\r\n allowedFormats: allowedFormatsArray,\r\n targetId: divElementId,\r\n keywords: keywords,\r\n native: nativeLayouts,\r\n customIframeProps: {\r\n title: 'Advertising'\r\n }\r\n });\r\n apntag.showTag(divElementId);\r\n };\r\n\r\n /**\r\n * \r\n * Executes a request to App Nexus servers for new ads.\r\n * \r\n * @private\r\n * @param {String} divElementId div Element Id\r\n * @param {Number} width width\r\n * @param {Number} height height\r\n * @param {Number} index index\r\n * @return {Function} Function with the parameters defined for an ad placement.\r\n */\r\n var _executeRequestToAppNexus = function (divElementId, width, height, index) {\r\n return function () {\r\n _astGlobalOptions();\r\n _astDefineTag(divElementId, width, height, index);\r\n };\r\n };\r\n\r\n\r\n /**\r\n * \r\n * Search for HTML elements with the class \"nhs_AstDiv\" and execute a define call to AppNexus server for that position\r\n * \r\n * @private \r\n * @param {Boolean} overwriteAds Overwrite Ads flag\r\n * @param {String} selector Element class name or CSS Selector\r\n */\r\n var _createAppNexusRequest = function (overwriteAds, selector) {\r\n var index;\r\n var elementId;\r\n var element;\r\n var width;\r\n var height;\r\n var appNexusRequests = [];\r\n\r\n // We receive parameter named \"selector\" for load Ads regarding to class name sent from each View or PartialView (https://builderhomesite.atlassian.net/browse/BDXNHS-1569)\r\n var adElements = document.querySelectorAll(selector);\r\n var adElements = Array.prototype.slice.call(adElements);\r\n\r\n adElements = adElements.sort(function (a, b) {\r\n var indexA = a && a.id && a.id.indexOf(\"native\") > 1;\r\n var indexB = b && b.id && b.id.indexOf(\"native\") > 1;\r\n var widthA = 1000 - Math.round(a.getAttribute(\"data-width\")) ;\r\n var heightA = Math.round(a.getAttribute(\"data-height\"));\r\n var widthB = 1000 - Math.round(b.getAttribute(\"data-width\")) ;\r\n var heightB = Math.round(b.getAttribute(\"data-height\"));\r\n\r\n indexA = (indexA * 1000) + widthA + heightA;\r\n indexB = (indexB * 1000) + widthB + heightB;\r\n\r\n return indexB - indexA;\r\n });\r\n\r\n if (!adElements || 0 === adElements.length) return;\r\n\r\n var length = adElements.length;\r\n\r\n for (index = 0; index < length; index += 1) {\r\n element = adElements[index];\r\n elementId = element.id;\r\n const isNativeSupported = elementId.includes('native') || element.dataset.native === 'true';\r\n width = Math.round(element.getAttribute(\"data-width\"));\r\n height = Math.round(element.getAttribute(\"data-height\"));\r\n\r\n if (0 === width && 0 === height && elementId !== CONFIGURATION.get(\"SKINADID\")) {\r\n continue;\r\n }\r\n\r\n // Ignore Ad containers that already have some content inside them, and ignore any element hidden via CSS.\r\n // Making an exception for Skin Ad. The offsetParent is null for elements with position \"Fixed\" as its the case of the Skin Ad.\r\n if ((!!element.querySelector('iFrame') && !overwriteAds) || (element.offsetParent === null && elementId !== CONFIGURATION.get(\"SKINADID\"))\r\n && !isNativeSupported) {\r\n continue;\r\n }\r\n\r\n appNexusRequests.push(_executeRequestToAppNexus(elementId, width, height, index));\r\n }\r\n\r\n length = appNexusRequests.length;\r\n for (index = 0; index < length; index += 1) {\r\n apntag.anq.push(appNexusRequests[index]);\r\n }\r\n\r\n // All tags have been sent to AppNexus, ask AppNexus to load all the ads at once.\r\n apntag.loadTags();\r\n };\r\n /**\r\n * \r\n * Indicates the AST JS Library is already loaded, and trigger the loadAdsEvent.\r\n */\r\n var _astLoadedCallback = function () {\r\n isAstLoaded = true;\r\n isAstLoading = false;\r\n apntag = root.apntag;\r\n\r\n if (!apntag)\r\n return;\r\n\r\n apntag.onEvent('adLoaded', _astAdLoadedHandler);\r\n apntag.onEvent(\"adAvailable\", _astAdAvailableHandler);\r\n apntag.onEvent(\"adNoBid\", _astAdNoBidHandler);\r\n root.dispatchEvent(loadAdsEvent);\r\n };\r\n\r\n /**\r\n * \r\n * Attachs an event to the object, checks the browser supports to choose the better option to handle the load event.\r\n * \r\n * @private \r\n * @param {object} object - Object where the load event will be attached.\r\n * @param {function} event - Function that will be executed when the event load for the object is triggered.\r\n */\r\n var _attachEventToLoad = function (object, event) {\r\n if (object.addEventListener) {\r\n object.addEventListener(\"load\", event, false);\r\n } else if (root.attachEvent) {\r\n object.attachEvent(\"onload\", event);\r\n }\r\n };\r\n\r\n /**\r\n * \r\n * Load the AST Script async.\r\n *\r\n * @private \r\n * @param {function} callback - Function to execute when the load of the AST.js file has finished.\r\n */\r\n var _loadAstScriptAsync = function () {\r\n if (isAstLoaded) {\r\n // AST JS Library has already been loaded. Do not load it again.\r\n return;\r\n }\r\n _trackAdScriptStartEvent();\r\n var tag = document.getElementsByTagName(\"meta\")[0];\r\n var script = document.createElement(\"script\");\r\n\r\n _attachEventToLoad(script,\r\n function () {\r\n root.dispatchEvent(atsLoadedEvent);\r\n _trackAdsScriptEndEvent();\r\n });\r\n script.async = true;\r\n script.src = document.location.protocol + CONFIGURATION.get(\"ASTURL\");\r\n script.type = \"text/javascript\";\r\n tag.parentNode.insertBefore(script, tag);\r\n isAstLoading = true;\r\n };\r\n\r\n /**\r\n * \r\n * Callback function to be executed when the AJAX to retrieve the Ad Parameters has returned. Stores the data in the global parameters variable and changes the value of the areParametersDefined flag to true.\r\n * \r\n * @private \r\n * @callback \r\n * @param {object} data JSON object with the parameters.\r\n */\r\n var _adParametersLoadedCallback = function (data) {\r\n parameters = data;\r\n areParametersDefined = true;\r\n\r\n for (var i = 0; i < onParametersLoaded.length; i++) {\r\n var callback = onParametersLoaded[i];\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n }\r\n onParametersLoaded = [];\r\n };\r\n /**\r\n * \r\n * Callback function to be executed when the AJAX to retrieve the Ad Parameters and refresh the parameters.\r\n * \r\n * @private \r\n * @callback \r\n * @param {object} data JSON object with the parameters.\r\n */\r\n var _adParametersLoadedAndRefreshCallback = function (data) {\r\n parameters = data;\r\n areParametersDefined = true;\r\n for (var i = 0; i < onParametersLoaded.length; i++) {\r\n var callback = onParametersLoaded[i];\r\n if (typeof callback === \"function\") {\r\n callback();\r\n } \r\n }\r\n onParametersLoaded = [];\r\n if (\"undefined\" === typeof apntag ||\r\n null === apntag ||\r\n \"function\" !== typeof apntag.refresh ||\r\n !areParametersDefined) {\r\n return;\r\n }\r\n\r\n let adsIds = getIdsFromElements(document.querySelectorAll(\".nhs_ASTAboveDiv\"));\r\n adsIds = adsIds.concat(getIdsFromElements(document.querySelectorAll(\".nhs_ASTBelowDiv\")));\r\n let keywords = JSON.parse(parameters);\r\n delete keywords[\"placements\"];\r\n delete keywords[\"useLazyLoad\"];\r\n apntag.clearRequest()\r\n for (var i = 0; i < adsIds.length; i++) {\r\n apntag.setKeywords(adsIds[i], keywords);\r\n document.getElementById(adsIds[i]).innerHTML = \"\";\r\n }\r\n _createAppNexusRequest(true, \".nhs_ASTAboveDiv\");\r\n _createAppNexusRequest(true, \".nhs_ASTBelowDiv\");\r\n };\r\n\r\n /**\r\n * @private\r\n * Helps to get a cookie by name.\r\n * \r\n * @param {string} name of the cookie \r\n * @returns the value of the cookie if is present otherwise null.\r\n */\r\n const _getCookieByName = function (name) {\r\n const regex = new RegExp(`(^| )${name}=([^;]+)`);\r\n const match = document.cookie.match(regex);\r\n if (match) {\r\n return match[2];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks for the existence of a utm cookie and resolves a promise if the cookie is found\r\n * or the maximum number of attempts is reached.\r\n * @param {function} resolve is a function that is called when the condition for resolving the promise is met.\r\n * @param {number} attempts is used to keep track of the number of\r\n * attempts made to check for the UTM cookie. It starts with a default value of 1.\r\n */\r\n const _checkUtmCookie = function(resolve, attempts = 1) {\r\n const cookie = _getCookieByName(CONFIGURATION.get(\"UTMZCOOKIE\"));\r\n if (cookie || attempts >= CONFIGURATION.get(\"ATTEMPTS\")) {\r\n resolve();\r\n return;\r\n }\r\n setTimeout(_checkUtmCookie.bind(null, resolve, attempts + 1), CONFIGURATION.get(\"ATTEMPTRATE\"));\r\n }\r\n\r\n /**\r\n * Check if the utm cookie is ready to be used.\r\n */\r\n const _isUtmCookieReady = function () {\r\n return new Promise((resolve) => {\r\n setTimeout(_checkUtmCookie.bind(null, resolve), CONFIGURATION.get(\"ATTEMPTRATE\"));\r\n });\r\n };\r\n\r\n /**\r\n * \r\n * Initialize and executes the process to load the Ads from AppNexus.\r\n *\r\n * @private \r\n */\r\n const _loadAds = async function () {\r\n _trackAdRequestStartEvent();\r\n await _isUtmCookieReady();\r\n var url = CONFIGURATION.get(\"PARAMETERSURL\") + escape(window.location.href) + \"&_=\" + new Date().getTime();\r\n const params = document.querySelectorAll('[data-ads-parameter]');\r\n for (let i = 0; i < params.length; i++) {\r\n var value = params[i].value;\r\n var name = params[i].dataset.paramname;\r\n url = url + `&${name}=${value}`;\r\n }\r\n var skinAd = document.getElementById(CONFIGURATION.get(\"SKINADID\"));\r\n\r\n if (\"undefined\" !== skinAd && null !== skinAd) {\r\n document.body.insertBefore(skinAd, document.body.firstChild);\r\n }\r\n\r\n if (document.querySelectorAll(\".nhs_ASTAboveDiv, .nhs_ASTBelowDiv\").length === 0) {\r\n // The page does not have any ad container defined in the HTML.\r\n return;\r\n }\r\n\r\n // Trigger an AJAX Request to obtain the parameters we need to pass into AppNexus calls while we wait until the AST Library is ready.\r\n _ajaxRequest(url, _adParametersLoadedCallback);\r\n\r\n if (isAstLoaded) {\r\n // The AST JS library has been loaded we can make calls to AppNexus.\r\n // Trigger onLoadAdsEvent to execute the call to AppNexus and generate the Ads.\r\n root.dispatchEvent(loadAdsEvent);\r\n } else if (!isAstLoading) {\r\n // The AST JS library has not been loaded and there's not request to load it.\r\n // Trigger a request to load the AST JS library and add a request to load Ads in the adRequestsQueue.\r\n _loadAstScriptAsync(_astLoadedCallback);\r\n }\r\n };\r\n\r\n /**\r\n * \r\n * Causes a new ad server call and refreshes the specific ad element on the page.\r\n * \r\n * @public \r\n * @param {string} divElementId The unique identifier of a specific ad slot. One or more identifiers can be specified in an array.\r\n */\r\n var refreshAd = function (divElementId) {\r\n if (\"undefined\" === typeof apntag || null === apntag || \"function\" !== typeof apntag.refresh || !areParametersDefined) {\r\n return;\r\n }\r\n\r\n apntag.refresh([divElementId]);\r\n };\r\n\r\n /**\r\n * \r\n * Causes a new ad server call and refreshes all the ad elements on the page.\r\n * \r\n * @public \r\n */\r\n var refreshAllAds = function () {\r\n\r\n if (\"undefined\" === typeof apntag ||\r\n null === apntag ||\r\n \"function\" !== typeof apntag.refresh ||\r\n !areParametersDefined) {\r\n return;\r\n }\r\n\r\n var aboveElementIds = getIdsFromElements(document.querySelectorAll(\".nhs_ASTAboveDiv\"))\r\n var belowElementIds = getIdsFromElements(document.querySelectorAll(\".nhs_ASTBelowDiv\"))\r\n\r\n apntag.refresh(aboveElementIds);\r\n apntag.refresh(belowElementIds);\r\n };\r\n\r\n /**\r\n * \r\n * Causes a new ad server call and refreshes all the ad elements on the page.\r\n * \r\n * @public \r\n */\r\n var refreshAllAdsAndUpdateParams = function () {\r\n _trackAdRequestStartEvent();\r\n var url = CONFIGURATION.get(\"PARAMETERSURL\") + escape(window.location.href) + \"&_=\" + new Date().getTime();\r\n const params = document.querySelectorAll('[data-ads-parameter]');\r\n for (let i = 0; i < params.length; i++) {\r\n var value = params[i].value;\r\n var name = params[i].dataset.paramname;\r\n url = url + `&${name}=${value}`;\r\n }\r\n _ajaxRequest(url, _adParametersLoadedAndRefreshCallback);\r\n };\r\n\r\n /**\r\n *\r\n * Get the element Id from Array.\r\n *\r\n * @param {String} elements Array of elements.\r\n */\r\n var getIdsFromElements = function (elements) {\r\n return Array.prototype.slice.call(elements).map(function (element) {\r\n return element.id;\r\n });\r\n };\r\n\r\n /**\r\n * \r\n * Delete an element from the AppNexus Call.\r\n * \r\n * @param {String} tagId Identifier of the ad impression, usually the ID of the HTML container for the Ad. \r\n */\r\n var deleteAdOnDemand = function (tagId) {\r\n if (apntag && apntag.requests && apntag.requests.tags) {\r\n delete apntag.requests.tags[tagId];\r\n }\r\n };\r\n\r\n /**\r\n * \r\n * Delete an element from the AppNexus Call.\r\n * \r\n * @param {String} tagId Identifier of the ad impression, usually the ID of the HTML container for the Ad. \r\n */\r\n var deleteAdsOnDemand = function (tagsId) {\r\n if (apntag && apntag.requests && apntag.requests.tags) {\r\n Array.prototype.map.call(tagsId, function (tagId) {\r\n delete apntag.requests.tags[tagId];\r\n });\r\n }\r\n };\r\n\r\n /**\r\n *\r\n * Simplify the Ads creation in one only call\r\n *\r\n * @param {Boolean} param Decides if ad its going to be overwritten.\r\n * @public \r\n */\r\n var generateAllAds = function (param) {\r\n param = typeof param === \"undefined\" ? true : !!param;\r\n\r\n if (\"undefined\" === typeof apntag || null === apntag || \"function\" !== typeof apntag.refresh || !areParametersDefined) {\r\n return;\r\n }\r\n\r\n _createAppNexusRequest(param, \".nhs_ASTAboveDiv\");\r\n _createAppNexusRequest(param, \".nhs_ASTBelowDiv\");\r\n };\r\n\r\n /**\r\n * \r\n * Causes a new ad server call. This method should be used only when the elements where the ads are going to be displayed are added via JavaScript.\r\n *\r\n * @param {Boolean} overwrite overwrite\r\n * @param {String} selector selector\r\n * @public \r\n */\r\n var regenerateAdCalls = function (overwrite, selector) {\r\n _trackAdRequestStartEvent();\r\n if (\"undefined\" === typeof apntag || null === apntag || \"function\" !== typeof apntag.refresh || !areParametersDefined) {\r\n return;\r\n }\r\n\r\n _createAppNexusRequest(overwrite, selector);\r\n };\r\n\r\n /**\r\n *\r\n * Creates a new ad request on demand to the given query selector expression passed as parameter.\r\n *\r\n * @param {String | HTMLElement[]} selector - query selector expression that will be used to find the ad(s) we want to create on demand.\r\n * @public \r\n */\r\n var createAdOnDemand = function (selector) {\r\n var index;\r\n var elementId;\r\n var element;\r\n var width;\r\n var height;\r\n var appNexusRequests = [];\r\n\r\n //This is to validate if the global variable is undefined and if contains the push method.\r\n if (\"undefined\" === typeof apntag || null === apntag || \"function\" !== typeof apntag.anq.push) {\r\n return;\r\n }\r\n\r\n // If the parameters has not being defined call the function itself to wait for the AJAX to get the parameters to end.\r\n if (!areParametersDefined) {\r\n onParametersLoaded.push(function () {\r\n _createAppNexusRequest(false, selector);\r\n });\r\n return;\r\n }\r\n\r\n if (typeof selector !== \"string\" && !Array.isArray(selector)) return;\r\n\r\n var adElements = Array.isArray(selector) ? selector : document.querySelectorAll(selector);\r\n\r\n if (!adElements || 0 === adElements.length) return;\r\n\r\n var length = adElements.length;\r\n var randomNumber = Math.floor(Math.random() * 2000) + 100;\r\n\r\n for (index = 0; index < length; index += 1) {\r\n element = adElements[index];\r\n elementId = element.id;\r\n width = Math.round(element.getAttribute(\"data-width\"));\r\n height = Math.round(element.getAttribute(\"data-height\"));\r\n\r\n if (0 === width && 0 === height) continue;\r\n\r\n // HACK: Index parameter could be tracked in AppNexus code to identify each ad so we are using the index plus a random base to avoid collisions.\r\n // This code can be improved.\r\n appNexusRequests.push(_executeRequestToAppNexus(elementId, width, height, index + randomNumber));\r\n }\r\n\r\n length = appNexusRequests.length;\r\n\r\n for (index = 0; index < length; index += 1) {\r\n apntag.anq.push(appNexusRequests[index]);\r\n }\r\n\r\n // All tags have been sent to AppNexus, ask AppNexus to load all the ads at once.\r\n apntag.loadTags();\r\n };\r\n\r\n /**\r\n *\r\n * Deletes an ad tag previously requested from the AppNexus manager. This method prevents tags removed from the HTML to be requested to the ads server.\r\n * @param {String} selector a string containing one or more selectors to match. This string must be a valid CSS selector string.\r\n */\r\n var deleteAdsBySelector = function(selector) {\r\n var nativeIds = [];\r\n var elements = document.querySelectorAll(selector);\r\n \r\n if (elements && elements.length > 0) {\r\n Array.prototype.map.call(elements, function (div) {\r\n nativeIds.push(div.id);\r\n });\r\n }\r\n\r\n if (nativeIds.length > 0) {\r\n deleteAdsOnDemand(nativeIds);\r\n }\r\n }\r\n\r\n // Attach an event listener to the root object (window) for the custom onLoadAdsEvent event.\r\n loadAdsEvent.initEvent(\"onLoadAdsEvent\", false, false);\r\n\r\n // Initial load with default parameters for _createAppNexusRequest, related to ticket https://builderhomesite.atlassian.net/browse/BDXNHS-1569\r\n root.addEventListener(\"onLoadAdsEvent\", function () {\r\n var createRequestsCallback = function () {\r\n _createAppNexusRequest(false, \".nhs_ASTAboveDiv\");\r\n _createAppNexusRequest(false, \".nhs_ASTBelowDiv\");\r\n };\r\n\r\n if (!areParametersDefined) {\r\n onParametersLoaded.push(createRequestsCallback);\r\n } else {\r\n createRequestsCallback();\r\n }\r\n }, false);\r\n\r\n // Attach an event listener to the root object (window) for the custom onLoadAdsEvent event.\r\n atsLoadedEvent.initEvent(\"onAstLoadedEvent\", false, false);\r\n root.addEventListener(\"onAstLoadedEvent\", _astLoadedCallback, false);\r\n\r\n if (\"function\" === typeof define && define.amd && \"complete\" === document.readyState) {\r\n // If the module was loaded using RequireJS there will be a race condition with the windows onload event.\r\n _loadAds();\r\n } else {\r\n // On the load event of the root element (window) trigger a call to load Ads.\r\n _attachEventToLoad(root, _loadAds);\r\n }\r\n\r\n /**\r\n *\r\n * Attaches the click event to the native ad card of the SRP\r\n *\r\n * @public \r\n */\r\n var bindEventsToNativeAdCard = function (iframeForNativeAd, nativePosition, clickTrackers, isMobileDevice) {\r\n var iframeBody = iframeForNativeAd.contentWindow.document.body;\r\n\r\n var onBeginTouch = function (e) {\r\n iframeBody.addEventListener(\"touchend\", clickAdFunction);\r\n }\r\n\r\n var onMove = function (e) {\r\n iframeBody.removeEventListener('touchend', clickAdFunction);\r\n };\r\n\r\n var clickAdFunction = function (e) {\r\n e.preventDefault();\r\n for (var j = 0; j < clickTrackers.length; j += 1) {\r\n requestHttpGet(clickTrackers[j]);\r\n }\r\n\r\n const url = iframeBody.querySelector(\"[data-native-contact]\").href;\r\n window.open(url, \"_blank\");\r\n \r\n\r\n return false;\r\n };\r\n\r\n if (!isMobileDevice) {\r\n\r\n iframeForNativeAd.addEventListener(\"mouseenter\",\r\n function () {\r\n iframeBody.classList.add(\"nhs_Hover\");\r\n });\r\n\r\n iframeForNativeAd.addEventListener(\"mouseleave\",\r\n function () {\r\n iframeBody.classList.remove(\"nhs_Hover\");\r\n });\r\n\r\n iframeBody.addEventListener(\"click\", clickAdFunction);\r\n\r\n } else {\r\n\r\n iframeBody.addEventListener(\"touchstart\", onBeginTouch);\r\n iframeBody.addEventListener(\"touchmove\", onMove);\r\n\r\n }\r\n }\r\n\r\n return {\r\n refreshAds: refreshAllAds,\r\n refreshAdsAndUpdateParams: refreshAllAdsAndUpdateParams,\r\n refreshAdByName: refreshAd,\r\n regenerateAds: regenerateAdCalls,\r\n generateAllAds: generateAllAds,\r\n loadAdOnDemand: createAdOnDemand,\r\n deleteAdByTagName: deleteAdOnDemand,\r\n deleteAllAdsBySelector: deleteAdsBySelector,\r\n };\r\n }));","(function (global, factory) {\r\n \"use strict\";\r\n\r\n if (\"function\" === typeof define && define.amd) {\r\n // If supports for AMD is available return the value to the AMD Loader\r\n // and to the global (window) object in case any JS module is expecting\r\n // the lazyLoad to exists on the window object.\r\n define([], function () {\r\n return (global.lazyLoad = factory(global));\r\n });\r\n } else if (\"object\" === typeof exports) {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code \r\n // is expected to work with this lazyLoad.\r\n module.exports = (global.lazyLoad = factory(global));\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.lazyLoad = factory(global);\r\n global.lazyLoad.init();\r\n }\r\n}(\"undefined\" !== typeof window ? window : {}, function (root) {\r\n \"use strict\";\r\n\r\n var listingContainer = root.document.getElementById(\"listing-container\");\r\n var lazySelectors = \"[data-lazy-load], .nhs_lazyLoadImage, img.async, img.asyncBrand\";\r\n var viewportMarginObserver;\r\n var spriteIntersectionObserver;\r\n\r\n var removeClass = function () {\r\n if (!this) {\r\n return;\r\n }\r\n\r\n var lazyElements = [].slice.call(this.querySelectorAll(lazySelectors)) || [];\r\n lazyElements.push(this);\r\n lazyElements.forEach(function(element) {\r\n element.dataset.srcset \r\n && element.srcset\r\n && element.getAttribute('data-img-error') !== 'true'\r\n && element.dataset.srcset !== element.srcset \r\n && loadFullImage(element);\r\n element.classList.remove(\"nhs_lazyLoadImage\", \"nhs_lazyLoadSize\", \"async\", \"asyncBrand\");\r\n element.removeAttribute(\"data-lazy-load\");\r\n element.removeAttribute(\"data-src\");\r\n });\r\n };\r\n\r\n var attachNoPhotosAvailable = function () {\r\n this.classList.remove(\"nhs_lazyLoadImage\", \"nhs_lazyLoadSize\", \"async\");\r\n this.removeAttribute(\"data-lazy-load\");\r\n this.removeAttribute(\"data-src\");\r\n const noPhotoElement = this.dataset.noPhotoElement;\r\n const noPhotoInline = document.querySelector(`[data-no-photo=\"${noPhotoElement}\"]`);\r\n if (noPhotoInline) {\r\n noPhotoInline.removeAttribute('hidden');\r\n const pictureElement = this.closest('picture');\r\n if (pictureElement) {\r\n pictureElement.remove();\r\n } else {\r\n this.remove();\r\n }\r\n return;\r\n }\r\n if (typeof this.dataset.onErrorSrc === 'string') {\r\n this.src = this.dataset.onErrorSrc;\r\n this.dispatchEvent(new CustomEvent(\"onImageLoadError\"));\r\n } else {\r\n this.src =\r\n \"https://beta-nhs-static-secure.akamaized.net/GlobalResources14/Default/images/no_photo/no_photos_180x120.png\";\r\n if (this.srcset) {\r\n //This will be needed since there are invalid images and there's the scenario where we also need to update the\r\n // srcset and not only the src.\r\n this.srcset =\r\n \"https://beta-nhs-static-secure.akamaized.net/GlobalResources14/Default/images/no_photo/no_photos_180x120.png\";\r\n }\r\n }\r\n this.setAttribute('data-img-error', 'true');\r\n removeSources(this);\r\n removeClass(this);\r\n };\r\n\r\n function removeSources(img) {\r\n var picture = img.closest('picture');\r\n if(picture) {\r\n picture.querySelectorAll('source').forEach(function(element) {\r\n picture.removeChild(element);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Function used to lazy load videos\r\n * @param {*} lazyVideo \r\n */\r\n function loadFullVideo(lazyVideo) {\r\n for (var source in lazyVideo.children) {\r\n var videoSource = lazyVideo.children[source];\r\n\r\n if (typeof videoSource.tagName === \"string\" && videoSource.tagName === \"SOURCE\") {\r\n videoSource.src = videoSource.dataset.src;\r\n }\r\n }\r\n\r\n lazyVideo.load();\r\n removeClass.call(lazyVideo);\r\n }\r\n\r\n function loadFullImage(lazyImage) {\r\n if (lazyImage.target) {\r\n lazyImage = lazyImage.target;\r\n }\r\n\r\n if (!lazyImage) {\r\n lazyImage = this;\r\n }\r\n\r\n var srcsetImage = lazyImage.dataset.srcset;\r\n if (lazyImage.tagName !== 'SOURCE') {\r\n lazyImage.onload = removeClass;\r\n\r\n if (typeof lazyImage.dataset.hasCustomErrorHandling === 'undefined') {\r\n lazyImage.onerror = attachNoPhotosAvailable;\r\n }\r\n }\r\n\r\n if (srcsetImage !== \"\" && srcsetImage) {\r\n var srcsetValues = srcsetImage.split(\" \");\r\n\r\n if (srcsetValues[0] && srcsetValues[0].indexOf(\"http\") >= 0) {\r\n if (lazyImage.tagName !== 'SOURCE') {\r\n lazyImage.src = srcsetValues[0];\r\n }\r\n lazyImage.srcset = srcsetImage;\r\n }\r\n } else if (lazyImage.dataset.src) {\r\n lazyImage.src = lazyImage.dataset.src;\r\n } else {\r\n removeClass.call(lazyImage);\r\n }\r\n }\r\n\r\n function viewportIntersectionObserver() {\r\n var lazyImages = [].slice.call(root.document.querySelectorAll(lazySelectors));\r\n var config = {\r\n root: null,\r\n rootMargin: \"200px 0px\",\r\n threshold: 0.25\r\n };\r\n\r\n\t\tif (!('IntersectionObserver' in window) || !('IntersectionObserverEntry' in window)) {\r\n\t\t\tfor (var i = 0; i < lazyImages.length; i++) {\r\n\t\t\t\tvar element = lazyImages[i];\r\n\t\t\t\tloadFullImage(element);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tviewportMarginObserver = new IntersectionObserver(function (entries) {\r\n\r\n for (var i = 0; i < entries.length; i++) {\r\n var entry = entries[i];\r\n\r\n if (entry.intersectionRatio > 0 && entry.isIntersecting) {\r\n var lowQualityImage = entry.target.getAttribute(\"data-lowquality\");\r\n var lazyImage = entry.target;\r\n\r\n if (lowQualityImage) {\r\n entry.target.removeAttribute(\"data-lowquality\");\r\n lazyImage.onload = loadFullImage;\r\n lazyImage.onerror = loadFullImage;\r\n lazyImage.src = lowQualityImage;\r\n viewportMarginObserver.unobserve(lazyImage);\r\n } else {\r\n if(lazyImage.tagName === 'VIDEO'){\r\n loadFullVideo(lazyImage);\r\n } else{\r\n loadFullImage(lazyImage);\r\n }\r\n viewportMarginObserver.unobserve(lazyImage);\r\n }\r\n }\r\n }\r\n\t\t\t}, config);\r\n\r\n for (var index = 0; index < lazyImages.length; index++) {\r\n var lazyImage = lazyImages[index];\r\n viewportMarginObserver.observe(lazyImage);\r\n }\r\n\t\t}\r\n }\r\n\r\n function getSprites() {\r\n return document.querySelectorAll(\"[data-lazysprite]\");\r\n }\r\n\r\n function lazyLoadSpriteImages() {\r\n var spriteImages = getSprites();\r\n\r\n var config = {\r\n root: null,\r\n rootMargin: \"50px 0px\"\r\n };\r\n\r\n\t\tif (!('IntersectionObserver' in window) || !('IntersectionObserverEntry' in window)) {\r\n\t\t\tfor (var i = 0; i < spriteImages.length; i++) {\r\n\t\t\t\tvar element = spriteImages[i];\r\n\t\t\t\telement.classList.add(element.dataset.lazysprite);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tspriteIntersectionObserver = new IntersectionObserver(function (entries) {\r\n for (var index = 0; index < entries.length; index++) {\r\n var entry = entries[index];\r\n \r\n if (entry.intersectionRatio > 0 && entry.isIntersecting) {\r\n\t\t\t\t\t\tvar spriteImage = entry.target;\r\n\r\n\t\t\t\t\t\tspriteImage.classList.add(spriteImage.dataset.lazysprite);\r\n\r\n\t\t\t\t\t\tspriteIntersectionObserver.unobserve(spriteImage);\r\n\t\t\t\t\t}\r\n }\r\n\t\t\t}, config);\r\n\r\n for (var index = 0; index < spriteImages.length; index++) {\r\n var spriteImage = spriteImages[index];\r\n \r\n spriteIntersectionObserver.observe(spriteImage);\r\n }\r\n\r\n\t\t}\r\n }\r\n\r\n // ReSharper disable once InconsistentNaming\r\n function LoadImages() {\r\n viewportIntersectionObserver();\r\n lazyLoadSpriteImages();\r\n }\r\n\r\n if (listingContainer) {\r\n var observer = new MutationObserver(function () {\r\n LoadImages();\r\n });\r\n\r\n observer.observe(listingContainer, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true\r\n });\r\n }\r\n\r\n function loadNoLazyLoadImageError() {\r\n document\r\n .querySelectorAll('img[data-error-image-no-lazy]')\r\n .forEach(function(element) {\r\n removeSources(element);\r\n });\r\n }\r\n\r\n var init = function () {\r\n LoadImages();\r\n };\r\n\r\n /**\r\n * Checks if an HTML Element is on the Viewport.\r\n *\r\n * @private \r\n * @param {HTMLElement} element Element to check.\r\n * @param {Number} margin Margin\r\n * @returns {Boolean} Wheter the Element is on the viewport or not.\r\n */\r\n var isOnViewport = function (element, margin) {\r\n if (!element || !element.getBoundingClientRect)\r\n return false;\r\n\r\n margin = margin ? margin : 0;\r\n var rect = element.getBoundingClientRect();\r\n\r\n return !!(rect.width && rect.height && (\r\n rect.bottom + margin >= 0 && rect.right + margin >= 0 &&\r\n rect.top <= (window.innerHeight || document.documentElement.clientHeight) + margin &&\r\n rect.left <= (window.innerWidth || document.documentElement.clientWidth) + margin));\r\n };\r\n\r\n var onViewportElements = [];\r\n var offViewportElements = []; \r\n var onElementsVisibilityChangeHandler = function (changes) { \r\n changes = Array.from(changes);\r\n\r\n onViewportElements.filter(function(info){\r\n return !!changes.find(function(c){\r\n return c.isIntersecting && c.target === info.element;\r\n });\r\n }).forEach(function(info){\r\n info.callback();\r\n });\r\n\r\n offViewportElements.filter(function(info){\r\n return !!changes.find(function(c){\r\n return !c.isIntersecting && c.target === info.element;\r\n });\r\n }).forEach(function(info){\r\n info.callback();\r\n }); \r\n };\r\n var intersectionObserver = window.IntersectionObserver ? new IntersectionObserver(onElementsVisibilityChangeHandler) : void(0); \r\n\r\n var addOnViewportListener = function (element, callback, margin) {\r\n onViewportElements.push({element : element, callback : callback, margin: margin});\r\n intersectionObserver.observe(element);\r\n };\r\n\r\n var addOffViewportListener = function(element, callback, margin){\r\n offViewportElements.push({element : element, callback : callback, margin: margin});\r\n intersectionObserver.observe(element);\r\n };\r\n\r\n var removeOnViewportListener = function (element, callback) {\r\n var info = onViewportElements.find(function(info){\r\n return info.element === element && info.callback === callback;\r\n });\r\n\r\n if(!info) return;\r\n\r\n intersectionObserver.unobserve(info.element);\r\n onViewportElements.splice(onViewportElements.indexOf(info), 1);\r\n };\r\n\r\n var removeOffViewportListener = function(element, callback){\r\n var info = offViewportElements.find(function(info){\r\n return info.element === element && info.callback === callback;\r\n });\r\n\r\n if(!info) return;\r\n\r\n intersectionObserver.unobserve(info);\r\n offViewportElements.splice(offViewportElements.indexOf(info), 1); \r\n };\r\n\r\n loadNoLazyLoadImageError();\r\n return {\r\n init: init,\r\n isOnViewport : isOnViewport,\r\n addOnViewportListener: addOnViewportListener,\r\n addOffViewportListener: addOffViewportListener,\r\n removeOnViewportListener : removeOnViewportListener,\r\n removeOffViewportListener : removeOffViewportListener,\r\n loadNoLazyLoadImageError: loadNoLazyLoadImageError,\r\n };\r\n}));","(function utmHandler(global) {\r\n 'use strict';\r\n\r\n function getParameterValue(url, parameter) {\r\n const searchParams = new URLSearchParams(url.search);\r\n return searchParams.get(parameter) || null;\r\n }\r\n\r\n function getParameterValueFromHash(url, parameter) {\r\n const search = url.hash.replace('#', '?');\r\n const searchParams = new URLSearchParams(search);\r\n return searchParams.get(parameter) || null;\r\n }\r\n\r\n function setParameters(url, parameters) {\r\n const separator = url.includes('?') ? '&' : '?';\r\n const query = [];\r\n Object.keys(parameters).forEach((key) => {\r\n const value = parameters[key];\r\n if (value !== null) {\r\n query.push(`${key}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (query.length) {\r\n return `${url}${separator}${query.join('&')}`;\r\n }\r\n\r\n return `${url}`;\r\n }\r\n\r\n /**\r\n * Removes the query string from a URL.\r\n * @param {string} url - The URL to remove the query string from.\r\n * @returns {string} The URL without the query string.\r\n */\r\n function removeQueryString(url) {\r\n if (!url) {\r\n return url;\r\n }\r\n const urlWithoutQueryString = url.split('?')[0];\r\n return urlWithoutQueryString;\r\n }\r\n\r\n function createUtmUrl() {\r\n const location = window.location;\r\n const path = '/setUtmParameters';\r\n const utmSource = getParameterValue(location, 'utm_source') || getParameterValueFromHash(location, 'utm_source');\r\n const utmMedium = getParameterValue(location, 'utm_medium') || getParameterValueFromHash(location, 'utm_medium');\r\n const utmCampaign = getParameterValue(location, 'utm_campaign') ||\r\n getParameterValueFromHash(location, 'utm_campaign');\r\n const utmTerm = getParameterValue(location, 'utm_term') || getParameterValueFromHash(location, 'utm_term');\r\n const utmContent = getParameterValue(location, 'utm_content') || getParameterValueFromHash(location, 'utm_content');\r\n const gclid = getParameterValue(location, 'gclid') || getParameterValueFromHash(location, 'gclid');\r\n const refer = getParameterValue(location, 'refer') || getParameterValueFromHash(location, 'refer');\r\n const httpReferer = document.referrer;\r\n const entranceUrl = document.location.href;\r\n\r\n const url = setParameters(path, {\r\n utm_source: utmSource,\r\n utm_medium: utmMedium,\r\n utm_campaign: utmCampaign,\r\n utm_term: utmTerm,\r\n utm_content: utmContent,\r\n gclid,\r\n httpReferer,\r\n entranceUrl,\r\n refer: removeQueryString(refer),\r\n });\r\n return url;\r\n }\r\n\r\n async function setUtmParameters() {\r\n const url = createUtmUrl();\r\n const response = await fetch(url);\r\n\r\n if (response.ok) {\r\n const data = await response.json();\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: {\r\n eventType: 'GAEvent',\r\n nhsRefer: data.HttpReferer || '',\r\n gaUtmSource: data.UtmSource || '',\r\n gaUtmMedium: data.UtmMedium || '',\r\n gaUtmCampaign: data.UtmCampaign || '',\r\n gaUtmTerm: data.UtmTerm || '',\r\n gaUtmContent: data.UtmContent || '',\r\n nhsEntranceUrl: data.EntranceUrl || '',\r\n }\r\n }\r\n }));\r\n }\r\n }\r\n\r\n if (document.readyState === 'complete') {\r\n setUtmParameters();\r\n } else {\r\n global.addEventListener('load', setUtmParameters);\r\n }\r\n}(window));\r\n"]}