{"version":3,"file":"zoomv.9724.min.js?t=771f4687825f7676feb3","mappings":"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","sources":["webpack://@hero-digital/zoom/./src/components/modules/jwplayer/jwplayer.js","webpack://@hero-digital/zoom/./src/js/utilities/utilities.js"],"sourcesContent":["import { getCookie } from '../../../js/utilities/utilities'\r\nclass JWPlayer {\r\n constructor(el) {\r\n this.el = el\r\n this.domMap = {\r\n $videoPlayers: el.querySelectorAll('.jw-video-player_video'),\r\n $blogVideoPlayers: el.querySelectorAll('.blog-video-player__video')\r\n }\r\n\r\n this.initPlayer()\r\n }\r\n\r\n initPlayer() {\r\n const { $videoPlayers, $blogVideoPlayers } = this.domMap\r\n\r\n $videoPlayers.forEach((video) => {\r\n this.loadAndSetupPlayer(video)\r\n })\r\n\r\n $blogVideoPlayers.forEach((video) => {\r\n this.loadAndSetupPlayer(video)\r\n })\r\n }\r\n\r\n loadAndSetupPlayer(video) {\r\n const script = document.createElement('script')\r\n script.src = video.dataset.src\r\n video.parentNode.appendChild(script)\r\n const videoData = video.getAttribute('data-video-file')\r\n const thumbnailData = video.getAttribute('data-thumbnail')\r\n const videoTitle = video.getAttribute('data-title')\r\n const videoDescription = video.getAttribute('data-description') || ''\r\n const captionsData = video.getAttribute('data-captions') \r\n const languageCookie = getCookie('_zm_lang') || false\r\n\r\n script.onload = () => {\r\n const config = {\r\n playlist: [\r\n {\r\n file: videoData,\r\n image: thumbnailData,\r\n title: videoTitle,\r\n description: videoDescription\r\n }\r\n ],\r\n autostart: false,\r\n floating: {\r\n mode: 'never'\r\n }\r\n }\r\n \r\n // Add tracks only if captionsData is available\r\n if (captionsData) {\r\n const tracks = JSON.parse(captionsData).map((track) => ({\r\n file: track.file,\r\n label: track.label,\r\n kind: track.kind || 'captions',\r\n default: languageCookie && track.lang_code === languageCookie \r\n // Match lang_code with _zm_lang cookie\r\n }))\r\n config.playlist[0].tracks = tracks // Add tracks to the playlist\r\n }\r\n\r\n const player = jwplayer(video).setup(config)\r\n\r\n player.on('ready', () => {\r\n if (captionsData) {\r\n const captions = JSON.parse(captionsData);\r\n let defaultTrackIndex;\r\n \r\n // Determine the default track based on languageCookie or fallback to English\r\n if (languageCookie) {\r\n console.log('defaultTrackIndex', defaultTrackIndex)\r\n defaultTrackIndex = captions.findIndex((track) => track.lang_code === languageCookie)\r\n }\r\n console.log('defaultTrackIndex', defaultTrackIndex);\r\n if (defaultTrackIndex === -1 || defaultTrackIndex === undefined) {\r\n // Fallback to English if no match is found or languageCookie is missing\r\n defaultTrackIndex = captions.findIndex((track) => track.lang_code === 'en' || track.label.toLowerCase() === 'english')\r\n }\r\n \r\n if (defaultTrackIndex !== -1) {\r\n // JW Player index starts at 1\r\n player.setCurrentCaptions(defaultTrackIndex + 1) \r\n }\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default JWPlayer","/**\r\n * A function which adds click detection to document\r\n * and performs a prescribed action when a click is detected\r\n * outside of the supllied element.\r\n * Use an array for params.exceptionClassArray to create exceptions.\r\n *\r\n * @param {Object} elem A DOM element\r\n * @param {Function} name of class to search for\r\n * @param {Object} an object containing parameters\r\n */\r\nexport function actionOnClickOutside(element, action, params = {}) {\r\n\tlet exceptionClassArray = params.exceptionClassArray || [];\r\n\tlet useCapture = params.useCapture || false;\r\n\r\n\tconst outsideClickListener = event => {\r\n\t\tif (!element.contains(event.target) && event.target.classList.length && !exceptionClassArray.includes(...event.target.classList)) {\r\n\t\t\taction();\r\n\t\t\tremoveClickListener();\r\n\t\t}\r\n\t}\r\n\r\n\tconst removeClickListener = () => {\r\n\t\tdocument.removeEventListener('click', outsideClickListener)\r\n\t}\r\n\r\n\tdocument.addEventListener('click', outsideClickListener, useCapture);\r\n\telement.clearListener = function () {\r\n\t\tremoveClickListener();\r\n\t}\r\n}\r\n\r\n/**\r\n * Simple function to return an array of sibling elements\r\n */\r\nexport function getSiblings(elem) {\r\n\treturn Array.prototype.filter.call(elem.parentNode.children, function (sibling) {\r\n\t\treturn sibling !== elem;\r\n\t});\r\n}\r\n\r\n/**\r\n * A function which traps tabbing to modal element.\r\n * Escape key will close modal.\r\n */\r\nexport function limitKeyboardAccesibility(element, closeFunction) {\r\n\t// get all accessibile elements, put into array\r\n\tconst focusableElsRaw = element.querySelectorAll(\r\n\t\t'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex=\"0\"]'\r\n\t);\r\n\tconst focusableEls = Array.prototype.slice.call(focusableElsRaw);\r\n\t// go through elements and pull out only the ones that are visible\r\n\tlet visibleEls = [].filter.call(focusableEls, el => {\r\n\t\treturn (el.offsetParent !== null);\r\n\t});\r\n\t// get the first and last elements\r\n\tconst firstFocusableEl = visibleEls[0];\r\n\tconst lastFocusableEl = visibleEls[visibleEls.length - 1];\r\n\t// set up keyboard handler\r\n\tconst KEY_TAB = 9;\r\n\tconst KEY_ESC = 27;\r\n\tconst keyHandler = (e) => {\r\n\t\t// special case to return when keyhandling is disabled on this element\r\n\t\tif (element.disableKeyHandler) return;\r\n\r\n\t\t// specials key actions\r\n\t\tswitch (e.keyCode) {\r\n\t\t\tcase KEY_TAB:\r\n\t\t\t\t// forward tab\r\n\t\t\t\tif (!e.shiftKey) {\r\n\t\t\t\t\tif (document.activeElement === lastFocusableEl) {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tfirstFocusableEl.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// backward tab\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (document.activeElement === firstFocusableEl) {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tlastFocusableEl.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase KEY_ESC:\r\n\t\t\t\tif (closeFunction) closeFunction();\r\n\t\t\t\tremoveKeyHandler();\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\t// clear function\r\n\tconst removeKeyHandler = () => {\r\n\t\tdocument.removeEventListener('keydown', keyHandler);\r\n\t}\r\n\t// attach clear function to element\r\n\telement.clearKeyHandler = () => {\r\n\t\tremoveKeyHandler();\r\n\t}\r\n\t// attach keyboard handler to doc\r\n\tdocument.addEventListener('keydown', keyHandler, false);\r\n}\r\n\r\n/**\r\n * A function which traverses all parents of a given DOM element\r\n * and returns the first parent with a class name that matches\r\n * the supplied class. This matches the JavaScript \"closest\"\r\n * function which IE11 does not support.\r\n *\r\n * @param {Object} elem A DOM element\r\n * @param {String} name of class to search for\r\n * @return {Object} the closest DOM parent with matching class\r\n */\r\nexport function closestByClass(el, clazz) {\r\n\t// Traverse the DOM up with a while loop\r\n\r\n\r\n\twhile (!el.classList.contains(clazz)) {\r\n\t\t// Increment the loop to the parent node\r\n\t\tel = el.parentNode;\r\n\t\tif (!el || el instanceof HTMLDocument) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t// At this point, the while loop has stopped and `el` represents the element that has\r\n\t// the class you specified in the second parameter of the function `clazz`\r\n\r\n\t// Then return the matched element\r\n\treturn el;\r\n}\r\n\r\n\r\n/**\r\n * Utility functions for setting and getting cookies\r\n */\r\nexport function setCookie(name, value, days) {\r\n\tvar expires = \"\";\r\n\tif (days) {\r\n\t\tvar date = new Date();\r\n\t\tdate.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n\t\texpires = \"; expires=\" + date.toUTCString();\r\n\t}\r\n\tif (typeof value === 'object') {\r\n\t\t// because of Safari bug handling JSON in cookies commas need to be stripped out\r\n\t\tlet obj = {};\r\n\t\tfor (const [key, item] of Object.entries(value)) {\r\n\t\t\tif (typeof item == 'string') obj[key] = item.replace(/,/,'U+0002C');\r\n\t\t\telse obj[key] = item;\r\n\t\t}\r\n\t\t// turn value into JSON\r\n\t\tvalue = JSON.stringify(obj);\r\n\t}\r\n\t// create cookie\r\n\tdocument.cookie = name + \"=\" + (value || \"\") + expires + \"; path=/;SameSite=Strict\";\r\n}\r\n\r\nexport function setCookieWithDomain(cookieName, value, days, domain) {\r\n try{\r\n var expires = \"\"\r\n if (days) {\r\n var date = new Date()\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000))\r\n expires = \"; expires=\" + date.toUTCString()\r\n }\r\n if (typeof value === 'object') {\r\n // because of Safari bug handling JSON in cookies commas need to be stripped out\r\n let obj = {}\r\n for (const [key, item] of Object.entries(value)) {\r\n if (typeof item == 'string') obj[key] = item.replace(/,/,'U+0002C')\r\n else obj[key] = item\r\n }\r\n // turn value into JSON\r\n value = JSON.stringify(obj)\r\n }\r\n // create cookie\r\n document.cookie = cookieName + \"=\" + (value || \"\") + expires + \"; path=/;secure;samesite=none;domain=.\" + domain \r\n }\r\n catch(err){\r\n console.log('set cookie error:', err)\r\n }\r\n } \r\n\r\n // Save content in localStorage with expiration\r\n export function saveToLocalStorage(key, content, expirationInMinutes = null) {\r\n\t const data = {\r\n\t content: content,\r\n\t timestamp: new Date().getTime(),\r\n\t expiration: expirationInMinutes ? expirationInMinutes * 60 * 1000 : null\r\n\t };\r\n\t localStorage.setItem(key, JSON.stringify(data));\r\n\t}\r\n\r\n // Retrieve content from localStorage with expiration check\r\n export function getFromLocalStorage(key) {\r\n const data = JSON.parse(localStorage.getItem(key));\r\n\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n if (data.expiration !== null && (new Date().getTime() - data.timestamp) > data.expiration) {\r\n localStorage.removeItem(key);\r\n return null;\r\n }\r\n\r\n return data.content;\r\n} \r\n\r\nexport function getCookie(name) {\r\n\tvar nameEQ = name + \"=\";\r\n\tvar ca = document.cookie.split(';');\r\n\t// see if value is JSON\r\n\tlet isJSON = function isJson(str) {\r\n\t\ttry {\r\n\t\t\tJSON.parse(str);\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\tfor (var i = 0; i < ca.length; i++) {\r\n\t\tvar c = ca[i];\r\n\t\twhile (c.charAt(0) == ' ') c = c.substring(1, c.length);\r\n\t\tif (c.indexOf(nameEQ) == 0) {\r\n\t\t\tlet content = c.substring(nameEQ.length, c.length);\r\n\t\t\tif (isJSON(content)) {\r\n\t\t\t\tcontent = JSON.parse(content);\r\n\t\t\t\t// replace commas\r\n\t\t\t\tfor (const [key, item] of Object.entries(content)) {\r\n\t\t\t\t\tif (typeof item == 'string') content[key] = item.replace('U+0002C',',')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn content;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n}\r\n\r\n// Get a cookie without an exact name - Adobe cookies are unique to a machine\r\nexport function getCookieFuzzy(nameStartsWith,nameEndsWith) {\r\n\tlet cookies = document.cookie.split(';');\r\n\t\r\n\t// see if value is JSON\r\n\tlet isJSON = function isJson(str) {\r\n\t\ttry {\r\n\t\t\tJSON.parse(str);\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\r\n\t// Loop through the cookies\r\n\tfor (var i = 0; i < cookies.length; i++) {\r\n\t\tvar cookie = cookies[i];\r\n\t\t\r\n\t\t// Trim the cookie\r\n\t\twhile (cookie.charAt(0) == ' ') cookie = cookie.substring(1, cookie.length);\r\n\r\n\t\t// Split the cookie name and value\r\n\t\tvar cookiePair = cookie.split('=');\r\n\r\n\t\t// Check that we got something to work with\r\n\t\tif (cookiePair.length > 1)\r\n\t\t{\r\n\t\t\t// Get the cookie name and value\r\n\t\t\tvar cookieName = cookiePair[0];\r\n\t\t\tvar cookieValue = cookiePair[1];\r\n\t\t\t\r\n\t\t\t// Name comparison\r\n\t\t\tif (cookieName.startsWith(nameStartsWith) && cookieName.endsWith(nameEndsWith))\r\n\t\t\t{\r\n\t\t\t\treturn cookieValue;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nexport function eraseCookie(name) {\r\n\tdocument.cookie = name + '=; Max-Age=-99999999;';\r\n}\r\n\r\nexport function eraseCookieByPath(name) {\r\n\tdocument.cookie = `${name}=; path=/; Max-Age=-99999999;`;\r\n}\r\n\r\n/**\r\n * Convert a string to title case\r\n */\r\nexport function toTitleCase(str) {\r\n\treturn str\r\n\t\t.toLowerCase()\r\n\t\t.split(' ')\r\n\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n\t\t.join(' ');\r\n};\r\n\r\n/**\r\n * Validate US zip code\r\n */\r\nexport function validateZipCode(str, allowPlusFour) {\r\n\tlet regexp;\r\n\tif (allowPlusFour) regexp = /^[0-9]{5}(?:-[0-9]{4})?$/;\r\n\telse regexp = /^[0-9]{5}?$/;\r\n\tif (regexp.test(str)) return true;\r\n\telse return false;\r\n};\r\n\r\n/**\r\n * Returns a function, that, as long as it continues to be invoked, will not\r\n * be triggered. The function will be called after it stops being called for\r\n * N milliseconds. If `immediate` is passed, trigger the function on the\r\n * leading edge, instead of the trailing.\r\n *\r\n * @param {Function} func A function to call after N milliseconds\r\n * @param {number} wait The number of milliseconds to wait\r\n * @param {boolean} immediate Trigger the function on the leading edge instead of the trailing\r\n * @return {Function} A function, that, as long as it continues to be invoked, will not be triggered\r\n */\r\nexport function debounce(func, wait, immediate) {\r\n\tvar timeout;\r\n\treturn function () {\r\n\t\tvar context = this,\r\n\t\t\targs = arguments;\r\n\t\tvar later = function () {\r\n\t\t\ttimeout = null;\r\n\t\t\tif (!immediate) func.apply(context, args);\r\n\t\t};\r\n\t\tvar callNow = immediate && !timeout;\r\n\t\tclearTimeout(timeout);\r\n\t\ttimeout = setTimeout(later, wait);\r\n\t\tif (callNow) func.apply(context, args);\r\n\t}\r\n}\r\n\r\n\r\n/* function to add smooth scrolling from a click event */\r\nexport function scrollAnchors(e, respond = null) {\r\n\te.preventDefault();\r\n\r\n\tfunction distanceToTop(el) {\r\n\t\treturn Math.floor((el.getBoundingClientRect().top) - 150);\r\n\t}\r\n\tvar targetID = (respond) ? respond.getAttribute('href') : this.getAttribute('href');\r\n\tvar targetAnchor = document.querySelector(targetID);\r\n\tif (!targetAnchor) return;\r\n\tvar originalTop = distanceToTop(targetAnchor);\r\n\t\r\n\t// detect if the user is on IE11\r\n\tconst isIE11 = !!window.MSInputMethodContext && !!document.documentMode;\r\n\tconst agent = window.navigator.userAgent.toLowerCase();\r\n\tconst isEdge = agent.indexOf(\"edge\") > -1 || agent.indexOf(\"edg\") > -1;\r\n\r\n\tif (isIE11 || isEdge) {\r\n\t\twindow.scroll(0, originalTop);\r\n\t} else {\r\n\t\twindow.scrollBy({\r\n\t\t\ttop: originalTop,\r\n\t\t\tleft: 0,\r\n\t\t\tbehavior: 'smooth'\r\n\t\t});\r\n\t}\r\n\r\n\tvar checkIfDone = setInterval(function () {\r\n\r\n\t\tif (distanceToTop(targetAnchor) === 0) {\r\n\t\t\ttargetAnchor.tabIndex = '-1';\r\n\t\t\ttargetAnchor.focus();\r\n\t\t\tconsole.log('scroll anchors');\r\n\t\t\t// Let's make sure the History API even exists first..\r\n\t\t\tif ('history' in window) {\r\n\r\n\t\t\t\twindow.history.pushState('', '', targetID);\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// Do it the old-fashioned way!\r\n\t\t\t\twindow.location = targetID;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tclearInterval(checkIfDone);\r\n\t\t}\r\n\t}, 100);\r\n}\r\n\r\n/* get browser window dimentions */\r\nexport function viewportSize() {\r\n\tconst vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\r\n\tconst vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\r\n\treturn { width: vw, height: vh }\r\n}\r\n\r\n/* test a string for JSON and return if true */\r\nexport function tryParseJSON (jsonString) {\r\n try {\r\n var o = JSON.parse(jsonString);\r\n\r\n // Handle non-exception-throwing cases:\r\n // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,\r\n // but... JSON.parse(null) returns null, and typeof null === \"object\", \r\n // so we must check for that, too. Thankfully, null is falsey, so this suffices:\r\n if (o && typeof o === \"object\") {\r\n return o;\r\n }\r\n }\r\n catch (e) { }\r\n\r\n return false;\r\n};\r\n\r\n// Function to remove a parameter from URL\r\nexport function removeURLParameter(url, parameter) {\r\n // Prefer not to use regex to avoid potential issues with special characters in parameter values\r\n var urlParts = url.split('?');\r\n if (urlParts.length >= 2) {\r\n var prefix = encodeURIComponent(parameter) + '=';\r\n var params = urlParts[1].split(/[&;]/g);\r\n\r\n // Reverse iteration to properly remove parameter\r\n for (var i = params.length; i-- > 0;) { \r\n if (params[i].lastIndexOf(prefix, 0) !== -1) { \r\n params.splice(i, 1);\r\n }\r\n }\r\n\r\n // Join back the parts\r\n url = urlParts[0] + (params.length > 0 ? '?' + params.join('&') : \"\");\r\n return url;\r\n } else {\r\n return url;\r\n }\r\n}\r\n\r\nexport function getURLParameter(url, parameter) {\r\n\tconst query = url.search\r\n\tconst params = new URLSearchParams(query)\r\n\treturn params[parameter] !== undefined ? params[parameter] : ''\r\n}"],"names":["JWPlayer","el","_classCallCheck","this","domMap","$videoPlayers","querySelectorAll","$blogVideoPlayers","initPlayer","key","value","_this","_this$domMap","forEach","video","loadAndSetupPlayer","script","document","createElement","src","dataset","parentNode","appendChild","videoData","getAttribute","thumbnailData","videoTitle","videoDescription","captionsData","languageCookie","getCookie","onload","config","playlist","file","image","title","description","autostart","floating","mode","tracks","JSON","parse","map","track","label","kind","default","lang_code","player","jwplayer","setup","on","defaultTrackIndex","captions","console","log","findIndex","undefined","toLowerCase","setCurrentCaptions","setCookie","name","days","expires","date","Date","setTime","getTime","toUTCString","_typeof","obj","_i","_Object$entries","Object","entries","length","_Object$entries$_i","_slicedToArray","item","replace","stringify","cookie","setCookieWithDomain","cookieName","domain","_i2","_Object$entries2","_Object$entries2$_i","err","saveToLocalStorage","content","expirationInMinutes","arguments","data","timestamp","expiration","localStorage","setItem","getFromLocalStorage","getItem","removeItem","nameEQ","ca","split","isJSON","str","e","i","c","charAt","substring","indexOf","_i3","_Object$entries3","_Object$entries3$_i"],"sourceRoot":""}