{"version":3,"file":"../cp_cookie_consent_v2.js","sources":["cp_cookie_consent_v2.js"],"sourcesContent":["/**\n * Adds banner and panel on the page for cookie management by user. Updates Google Tag Manager consent settings.\n */\nconst cpCookieConsent = (() => {\n let props = {\n cookieName: 'cpCookieConsent',\n cookieDelimiter: ',',\n cookieKeyValueDelimiter: ':',\n cookieDeniedValue: 'denied',\n cookieGrantedValue: 'granted',\n updateAllKey: 'all',\n lang: 'en',\n showDeclineAllButton: false,\n showManageButton: true,\n consentStateDefault: {}, // initial value sets in init() method\n managerCategories: [\n {\n id: 'necessary',\n title: 'Strictly necessary',\n // consentVars: ['security_storage', 'functionality_storage'],// TODO: Decide necessary or not\n description: `These cookies are required to support the core functionality of our website.`,\n disabled: true\n },\n {\n id: 'performance',\n title: 'Performance',\n consentVars: [\n 'analytics_storage',\n // 'personalization_storage'\n ],\n description: `These cookies enable us to analyse the use of the website in order to measure and improve performance.`\n },\n {\n id: 'marketing',\n title: 'Marketing',\n consentVars: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n description: `These cookies are used to measure and improve the performance of our marketing campaigns.`\n },\n // {\n // id: 'uncategorized',\n // title: 'Uncategorized',\n // description: `lorem ipsum uncategorized`\n // }\n ],\n strings: {\n en: {\n buttonAcceptAll: 'Accept all cookies',\n buttonOnlyNecessary: 'Only use necessary',\n buttonManage: 'Customise cookies',\n buttonApply: 'Apply',\n message: 'Lorem ipsum Cookie Policy',\n mClose: 'Close cookie manager',\n mContentText: '

Lorem, ipsum

Lorem ipsum dolor sit amet consectetur adipisicing elit. Expedita voluptatibus quae architecto consequuntur officiis. Quas autem libero praesentium optio, eveniet sequi et laudantium doloribus reiciendis, excepturi, sed error soluta magnam!',\n mAccordionOption1: 'Performance',\n },\n ru: {}\n },\n classes: {\n container: 'cp-cookie-consent',\n wrapper: 'cp-cookie-consent__wrapper',\n content: 'cp-cookie-consent__content',\n text: 'cp-cookie-consent__text',\n buttons: 'cp-cookie-consent__buttons',\n button: 'cp-cookie-consent-button',\n footer: 'cp-cookie-consent__footer',\n footerWrapper: 'cp-cookie-consent__footer-wrapper',\n footerLink: 'cp-cookie-consent__footer-link',\n manager: 'cp-cookie-consent-manager',\n mPanel: 'cp-cookie-consent-manager__panel',\n mPanelControls: 'cp-cookie-consent-manager__panel-controls',\n mPanelControlsClose: 'cp-cookie-consent-manager__panel-controls-close',\n mPanelContent: 'cp-cookie-consent-manager__panel-content',\n mPanelContentText: 'cp-cookie-consent-manager__panel-content-text',\n mPanelList: 'cp-cookie-consent-manager__list',\n mPanelListRow: 'cp-cookie-consent-manager__list-row',\n mPanelListCollapse: 'cp-cookie-consent-manager__list-collapse',\n mPanelListRowControl: 'cp-cookie-consent-manager__list-row-control',\n mPanelListRowControlJs: 'js-cp-cookie-consent-switch',\n mPanelSwitch: 'switch',\n mPanelSlider: 'slider',\n mAccordionTrigger: 'cp-cookie-consent-manager-dd-trigger',\n mAccordionTriggerJs: 'js-cp-cookie-consent-accordion-trigger',\n mFooter: 'cp-cookie-consent-manager__footer',\n consentScrollLocked: 'cp-consent-scroll-locked',\n active: 'active'\n },\n ids: {\n acceptAllButton: 'cpCookieConsentAcceptAll',\n onlyNecessaryButton: 'cpCookieConsentOnlyNecessary',\n manageButton: 'cpCookieConsentManage',\n applySettingsButton: 'cpCookieMangerApply',\n mAcceptAllButton: 'cpCookieConsentAcceptAllManager',\n managerCloseButton: 'cpCookieManagerClose'\n },\n footerLinks: []\n };\n let consentCookieValueStored = '';\n let consentCookieValueCurrent = '';\n let consentState = {};\n let showManager = false;\n let bannerRef = null;\n let managerRef = null;\n const storeDays = Math.floor(365 / 2);\n const waitForUpdate = 500;\n\n /**\n * Sets Google Tag cookie consent defaults.\n * Code should be called inside tag before gtag initialisation.\n * @param {*} newProps - configuration object, modifies existing props. Needs additional parsing for multi-level objects.\n * @example \n * // Start script\n * cpCookieConsent.init();\n */\n const init = (newProps) => {\n props.consentStateDefault = {\n ad_storage: props.cookieDeniedValue,\n analytics_storage: props.cookieDeniedValue,\n ad_user_data: props.cookieDeniedValue,\n ad_personalization: props.cookieDeniedValue,\n personalization_storage: props.cookieDeniedValue,\n functionality_storage: props.cookieDeniedValue,\n security_storage: props.cookieDeniedValue,\n };\n if (newProps) {\n const strings = { ...props.strings };\n props = { ...props, ...newProps };\n if (newProps.strings) {\n Object.keys(newProps.strings).forEach(key => {\n const element = newProps.strings[key];\n strings[key] = { ...strings[key], ...element };\n });\n props.strings = strings;\n }\n if (newProps.managerCategories) {\n props.managerCategories = [...newProps.managerCategories];\n }\n }\n consentCookieValueStored = readCookie(props.cookieName) ?? '';\n consentCookieValueCurrent = consentCookieValueStored;\n setGtagConsentDefaults();\n };\n\n /**\n * Updates tag manager and renders consent banner. Should be called before closing tag.\n * @example \n * // Start script\n * cpCookieConsent.init();\n */\n const initUI = () => {\n updateConsentState();\n updateGtagConsent();\n renderBanner();\n }\n\n const readCookie = (cookieName) => {\n const nameEQ = cookieName + '=';\n const ca = document.cookie.split(';');\n for (const element of ca) {\n let c = element;\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n };\n\n const createCookie = (cookieName, value, days) => {\n let expires = '';\n if (days) {\n const date = new Date();\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n expires = '; expires=' + date.toGMTString();\n }\n document.cookie = cookieName + '=' + value + expires + '; path=/';\n };\n\n const clearAllPaths = (window, cookieBase) => {\n let p = window.location.pathname.split('/');\n window.document.cookie = cookieBase + '; path=/';\n while (p.length > 0) {\n window.document.cookie = cookieBase + '; path=' + p.join('/');\n p.pop();\n };\n };\n\n const deleteAllCookies = () => {\n let cookies = window.document.cookie.split('; ');\n for (const element of cookies) {\n let encodedCookieName = encodeURIComponent(element.split(\";\")[0].split(\"=\")[0]);\n let cookieBase = encodedCookieName + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT';\n if (encodedCookieName === props.cookieName) {\n continue;\n }\n clearAllPaths(window, cookieBase);\n let d = window.location.hostname.split('.');\n while (d.length > 0) {\n if (encodedCookieName === props.cookieName) { break; };\n clearAllPaths(window, cookieBase + '; domain=' + d.join('.'));\n d.shift();\n }\n }\n };\n\n /**\n * Should be called only one time per page\n */\n const setGtagConsentDefaults = () => {\n consentState = props.consentStateDefault;\n window.dataLayer = window.dataLayer || [];\n window.gtag = function () { dataLayer.push(arguments); }\n window.gtag('set', 'wait_for_update', waitForUpdate);\n updateConsentState();\n };\n\n /**\n * Makes gtag api call\n */\n const updateGtagConsent = () => {\n window.gtag('consent', 'update', consentState);\n dataLayer.push({ 'event': 'cookie_consent_update' });\n };\n\n /**\n * Updates current consent state in code, not in gtag\n */\n const updateConsentState = () => {\n let newConsentState = props.consentStateDefault;\n if (!consentCookieValueStored) {\n // Set default state if cookie is not set\n consentState = newConsentState;\n // window.gtag('consent', 'default', consentState);\n } else {\n newConsentState = props.consentStateDefault;\n // Create and set state by specified categories\n props.managerCategories.forEach(category => {\n const storedValue = getCategoryValueByName(category.id, consentCookieValueStored);\n if (\n storedValue\n && (storedValue === props.cookieGrantedValue || storedValue === props.cookieDeniedValue)\n && category?.consentVars?.length\n ) {\n category.consentVars.forEach(consentVar => {\n newConsentState[consentVar] = storedValue;\n });\n }\n });\n consentState = newConsentState;\n // updateGtagConsent();\n }\n };\n\n const updateManagerCookieState = (newCategoryName, newValue) => {\n // Update current values\n const values = props.managerCategories.map((category, index) => {\n let categoryName = category.id;\n let categoryValue = props.cookieDeniedValue;\n if (index === 0) {\n categoryValue = props.cookieGrantedValue;\n }\n const currentValue = getCategoryValueByName(categoryName, consentCookieValueCurrent);\n if (currentValue) {\n categoryValue = currentValue;\n }\n if (newCategoryName && newValue && category.id === newCategoryName) {\n categoryValue = newValue;\n }\n // Update all categories by same value\n if (newCategoryName === props.updateAllKey && newValue) {\n categoryValue = category.id !== props.managerCategories[0].id ? newValue : props.cookieGrantedValue;\n }\n return `${categoryName}${props.cookieKeyValueDelimiter}${categoryValue}`;\n });\n consentCookieValueCurrent = values.join(`${props.cookieDelimiter}`);\n };\n\n const getCategoryValueByName = (categoryName, str) => {\n const categories = new RegExp(`(${categoryName})(:)(?[\\\\w]*)`, 'g');\n const result = categories.exec(str);\n return result?.groups?.value;\n }\n\n const checkIfCookieSet = () => {\n return consentCookieValueStored && (\n consentCookieValueStored !== '0'\n && consentCookieValueStored !== '1'\n && consentCookieValueStored !== '2'\n );\n }\n\n const toggleBodyScroll = (close) => {\n if (close) {\n return document.body.classList.remove(props.classes.consentScrollLocked);\n }\n document.body.classList.toggle(props.classes.consentScrollLocked);\n };\n\n const closeManager = (ref) => {\n showManager = false;\n toggleBodyScroll(true);\n ref?.classList.remove(props.classes.active);\n renderManager();\n };\n\n const openManager = () => {\n showManager = true;\n toggleBodyScroll();\n renderManager();\n };\n\n const triggerCustomGaEvent = () => {\n dataLayer.push({ 'event': 'cb_accept' });\n };\n\n const onAcceptAllClick = (event) => {\n event.preventDefault();\n updateManagerCookieState(props.updateAllKey, props.cookieGrantedValue);\n consentCookieValueStored = consentCookieValueCurrent;\n createCookie(props.cookieName, consentCookieValueStored, storeDays);\n closeManager(managerRef);\n renderBanner();\n updateConsentState();\n updateGtagConsent();\n triggerCustomGaEvent();\n }\n\n const onDeclineAllClick = (event) => {\n event.preventDefault();\n deleteAllCookies();\n updateManagerCookieState(props.updateAllKey, props.cookieDeniedValue);\n consentCookieValueStored = consentCookieValueCurrent;\n createCookie(props.cookieName, consentCookieValueStored, storeDays);\n closeManager(managerRef);\n renderBanner();\n updateConsentState();\n updateGtagConsent();\n }\n\n const bindBannerEvents = (ref) => {\n if (!ref) { return; }\n const acceptAllButton = ref.querySelector('#' + props.ids.acceptAllButton);\n const onlyNecessaryButton = ref.querySelector('#' + props.ids.onlyNecessaryButton);\n const manageButton = ref.querySelector('#' + props.ids.manageButton);\n if (acceptAllButton) {\n acceptAllButton.addEventListener('click', (e) => {\n onAcceptAllClick(e);\n });\n }\n if (onlyNecessaryButton) {\n onlyNecessaryButton.addEventListener('click', (e) => {\n onDeclineAllClick(e);\n });\n }\n if (manageButton) {\n manageButton.addEventListener('click', (e) => {\n e.preventDefault();\n // Set accept all default state if no cookie found\n if (!checkIfCookieSet()) {\n props.managerCategories.forEach(category => {\n updateManagerCookieState(category.id, props.cookieGrantedValue);\n })\n } else {\n updateManagerCookieState();\n }\n openManager();\n });\n }\n };\n\n const bindManagerEvents = (ref) => {\n if (!ref) { return; }\n const managerCloseBytton = document.getElementById(props.ids.managerCloseButton);\n const accordionTriggers = ref.querySelectorAll(`.${props.classes.mAccordionTriggerJs}`);\n const applySettingsButton = ref.querySelector(`#${props.ids.applySettingsButton}`);\n const acceptAllButton = ref.querySelector(`#${props.ids.mAcceptAllButton}`);\n const switches = ref.querySelectorAll(`.${props.classes.mPanelListRowControlJs}`);\n if (managerCloseBytton) {\n managerCloseBytton.addEventListener('click', (e) => {\n closeManager(ref);\n });\n }\n if (accordionTriggers) {\n accordionTriggers.forEach(trigger => {\n trigger.addEventListener('click', (e) => {\n e.preventDefault();\n const element = e.currentTarget;\n element.classList.toggle(props.classes.active);\n const collapseTarget = element.getAttribute('data-target');\n const collapse = ref.querySelector(`#${collapseTarget}`);\n if (!collapse) { return; }\n collapse.classList.toggle(props.classes.active);\n });\n })\n }\n if (switches) {\n switches.forEach(item => {\n item.addEventListener('change', (e) => {\n e.preventDefault();\n const element = e.currentTarget;\n const value = element.checked ? props.cookieGrantedValue : props.cookieDeniedValue;\n updateManagerCookieState(element.name, value);\n });\n })\n }\n if (acceptAllButton) {\n acceptAllButton.addEventListener('click', (e) => {\n onAcceptAllClick(e);\n });\n }\n if (applySettingsButton) {\n applySettingsButton.addEventListener('click', (e) => {\n deleteAllCookies();\n // Store settings in cookie\n consentCookieValueStored = consentCookieValueCurrent;\n // Close panel\n closeManager(managerRef);\n // Hide banner\n renderBanner();\n // Create consent cookie\n createCookie(props.cookieName, consentCookieValueStored, storeDays);\n // Update Google Tag\n updateConsentState();\n updateGtagConsent();\n });\n }\n };\n\n const renderManagerGroups = (lang) => {\n const panelManagerList = document.createElement('div');\n panelManagerList.classList.add(props.classes.mPanelList);\n const targetBase = 'cpConsentAccordionTarget';\n if (!props.managerCategories?.length) {\n return panelManagerList;\n }\n props.managerCategories.forEach((category, index) => {\n const panelManagerListRow = document.createElement('div');\n panelManagerListRow.classList.add(props.classes.mPanelListRow);\n const panelManagerDdTrigger = document.createElement('button');\n panelManagerDdTrigger.type = 'button';\n panelManagerDdTrigger.classList.add(props.classes.mAccordionTrigger);\n panelManagerDdTrigger.classList.add(props.classes.mAccordionTrigger, props.classes.mAccordionTriggerJs);\n panelManagerDdTrigger.setAttribute('data-target', `${targetBase}${index}`);\n panelManagerDdTrigger.innerText = category.title;\n const panelManagerControl = document.createElement('div');\n panelManagerControl.classList.add(props.classes.mPanelListRowControl);\n const cookie = readCookie(props.cookieName);\n const categoryValue = getCategoryValueByName(category.id, consentCookieValueCurrent);\n let isCategoryChecked = categoryValue === props.cookieGrantedValue ? 'checked' : '';\n panelManagerControl.innerHTML = `\n \n `;\n const panelManagerCollapse = document.createElement('div');\n panelManagerCollapse.classList.add(props.classes.mPanelListCollapse);\n panelManagerCollapse.id = `${targetBase}${index}`;\n panelManagerCollapse.innerHTML = category.description ?? '';\n\n panelManagerListRow.append(panelManagerDdTrigger);\n if (!category.disabled) {\n panelManagerListRow.append(panelManagerControl);\n }\n panelManagerList.append(panelManagerListRow);\n panelManagerList.append(panelManagerCollapse);\n });\n return panelManagerList;\n };\n\n const renderManager = () => {\n const lang = props.lang;\n if (managerRef) {\n document.body.removeChild(managerRef);\n managerRef = null;\n }\n if (!showManager) { return; }\n const container = document.createElement('div');\n container.classList.add(props.classes.manager, props.classes.active);\n const panel = document.createElement('div');\n panel.classList.add(props.classes.mPanel);\n const panelControls = document.createElement('div');\n panelControls.classList.add(props.classes.mPanelControls);\n const panelControlsClose = document.createElement('button');\n panelControlsClose.type = 'button';\n panelControlsClose.id = props.ids.managerCloseButton;\n panelControlsClose.classList.add(props.classes.mPanelControlsClose);\n panelControlsClose.setAttribute('aria-label', props.strings[lang].mClose);\n panelControlsClose.setAttribute('title', props.strings[lang].mClose);\n const panelContent = document.createElement('div');\n panelContent.classList.add(props.classes.mPanelContent);\n const panelContentText = document.createElement('div');\n panelContentText.classList.add(props.classes.mPanelContentText);\n panelContentText.innerHTML = props.strings[lang].mContentText;\n const panelManagerList = renderManagerGroups(lang);\n const panelFooter = document.createElement('div');\n panelFooter.classList.add(props.classes.mFooter);\n const panelFooterButtonApply = document.createElement('button');\n panelFooterButtonApply.classList.add(props.classes.button);\n panelFooterButtonApply.textContent = props.strings[lang].buttonApply;\n panelFooterButtonApply.id = props.ids.applySettingsButton;\n const panelFooterButtonAcceptAll = document.createElement('button');\n panelFooterButtonAcceptAll.className = props.classes.button;\n panelFooterButtonAcceptAll.textContent = props.strings[lang].buttonAcceptAll;\n panelFooterButtonAcceptAll.id = props.ids.mAcceptAllButton;\n\n panelControls.append(panelControlsClose);\n panel.append(panelControls);\n panelContent.append(panelContentText);\n panelContent.append(panelManagerList);\n panel.append(panelContent);\n panelFooter.append(panelFooterButtonApply);\n panelFooter.append(panelFooterButtonAcceptAll);\n panel.append(panelFooter);\n container.append(panel);\n document.body.append(container);\n managerRef = container;\n bindManagerEvents(managerRef);\n };\n\n const renderBanner = () => {\n const hasCookie = checkIfCookieSet();\n if (hasCookie) {\n if (bannerRef) {\n document.body.removeChild(bannerRef);\n bannerRef = null;\n }\n return;\n }\n if (!hasCookie) {\n ;\n deleteAllCookies();\n }\n const container = document.createElement('div');\n container.classList.add(props.classes.container);\n const wrapper = document.createElement('div');\n wrapper.classList.add(props.classes.wrapper);\n const content = document.createElement('div');\n content.classList.add(props.classes.content);\n const text = document.createElement('div');\n const textContainer = document.createElement('div');\n textContainer.innerHTML = props.strings[props.lang].message;\n text.classList.add(props.classes.text);\n const buttons = document.createElement('div');\n buttons.classList.add(props.classes.buttons);\n const footer = document.createElement('div');\n footer.classList.add(props.classes.footer);\n const footerWrapper = document.createElement('div');\n footerWrapper.classList.add(props.classes.footerWrapper);\n const footerLink = document.createElement('a');\n footerLink.classList.add(props.classes.footerLink);\n footerLink.textContent = props.strings[props.lang].cookiePolicyLink;\n // Add buttons\n for (let i = 0; i < 3; i++) {\n const button = document.createElement('button');\n button.classList.add(props.classes.button);\n button.type = 'button';\n const strings = [\n props.strings[props.lang].buttonAcceptAll,\n props.strings[props.lang].buttonOnlyNecessary,\n props.strings[props.lang].buttonManage\n ];\n const ids = [\n props.ids.acceptAllButton,\n props.ids.onlyNecessaryButton,\n props.ids.manageButton\n ];\n button.textContent = strings[i];\n button.id = ids[i]\n // Hide decline all button\n if (props.showManageButton && !props.showDeclineAllButton && i === 1) {\n continue;\n }\n // Hide manage button\n if (!props.showManageButton && props.showDeclineAllButton && i === 2) {\n continue;\n }\n buttons.append(button);\n }\n // Add footer links\n if (props.footerLinks?.length) {\n props.footerLinks.forEach((link) => {\n const element = link;\n const footerLink = document.createElement('a');\n footerLink.classList.add(element.class || props.classes.footerLink);\n footerLink.href = element.href;\n footerLink.textContent = element.text;\n footerWrapper.append(footerLink);\n });\n }\n text.append(textContainer);\n content.append(text);\n content.append(buttons);\n wrapper.append(content);\n container.append(wrapper);\n if (props.footerLinks?.length) {\n footerWrapper.append(footerLink);\n footer.append(footerWrapper);\n }\n container.append(footer);\n document.body.append(container);\n bannerRef = container;\n bindBannerEvents(bannerRef);\n renderManager();\n };\n\n return {\n init: init,\n initUI: initUI\n }\n})();"],"names":["cpCookieConsent","let","props","cookieName","cookieDelimiter","cookieKeyValueDelimiter","cookieDeniedValue","cookieGrantedValue","updateAllKey","lang","showDeclineAllButton","showManageButton","consentStateDefault","managerCategories","id","title","description","disabled","consentVars","strings","en","buttonAcceptAll","buttonOnlyNecessary","buttonManage","buttonApply","message","mClose","mContentText","mAccordionOption1","ru","classes","container","wrapper","content","text","buttons","button","footer","footerWrapper","footerLink","manager","mPanel","mPanelControls","mPanelControlsClose","mPanelContent","mPanelContentText","mPanelList","mPanelListRow","mPanelListCollapse","mPanelListRowControl","mPanelListRowControlJs","mPanelSwitch","mPanelSlider","mAccordionTrigger","mAccordionTriggerJs","mFooter","consentScrollLocked","active","ids","acceptAllButton","onlyNecessaryButton","manageButton","applySettingsButton","mAcceptAllButton","managerCloseButton","footerLinks","consentCookieValueStored","consentCookieValueCurrent","consentState","showManager","bannerRef","managerRef","storeDays","Math","floor","waitForUpdate","readCookie","nameEQ","element","document","cookie","split","c","charAt","substring","length","indexOf","createCookie","value","days","expires","date","Date","setTime","getTime","toGMTString","clearAllPaths","window","cookieBase","p","location","pathname","join","pop","deleteAllCookies","encodedCookieName","encodeURIComponent","d","hostname","shift","updateGtagConsent","gtag","dataLayer","push","event","updateConsentState","newConsentState","forEach","category","storedValue","getCategoryValueByName","consentVar","updateManagerCookieState","newCategoryName","newValue","values","map","index","categoryName","categoryValue","currentValue","str","RegExp","exec","groups","checkIfCookieSet","toggleBodyScroll","close","body","classList","remove","toggle","closeManager","ref","renderManager","onAcceptAllClick","preventDefault","renderBanner","bindBannerEvents","querySelector","addEventListener","e","bindManagerEvents","managerCloseBytton","accordionTriggers","switches","getElementById","querySelectorAll","trigger","currentTarget","collapseTarget","getAttribute","collapse","item","checked","name","renderManagerGroups","panelManagerList","createElement","targetBase","add","panelManagerListRow","panelManagerDdTrigger","panelManagerControl","type","setAttribute","innerText","isCategoryChecked","panelManagerCollapse","innerHTML","append","panel","panelControls","panelControlsClose","panelContent","panelContentText","panelFooter","panelFooterButtonApply","panelFooterButtonAcceptAll","removeChild","textContent","className","hasCookie","textContainer","cookiePolicyLink","i","class","href","init","ad_storage","analytics_storage","ad_user_data","ad_personalization","personalization_storage","functionality_storage","security_storage","newProps","Object","keys","key","arguments","initUI"],"mappings":"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"}