"use strict"; document.addEventListener("DOMContentLoaded", function () { var timer = []; var initialValue = []; var timeUnits = ["week", "day", "hour", "minute", "second"]; Array.prototype.slice.call(document.getElementsByClassName("ub-countdown")).forEach(function (instance, i) { timer[i] = setInterval(function () { var timeLeft = parseInt(instance.getAttribute("data-enddate")) - Math.floor(Date.now() / 1000); var largestUnit = instance.getAttribute("data-largestunit"); var smallestUnit = instance.getAttribute("data-smallestunit"); var seconds = timeLeft % 60; var minutes = (timeLeft - seconds) % 3600 / 60; var hours = (timeLeft - minutes * 60 - seconds) / 3600; if (timeUnits.indexOf(largestUnit) < 2) { hours %= 24; } var days = (timeLeft - hours * 3600 - minutes * 60 - seconds) / 86400; if (largestUnit === "week") { days %= 7; } var weeks = (timeLeft - days * 86400 - hours * 3600 - minutes * 60 - seconds) / 604800; var animationDirection = "decrease"; var generateValue = function generateValue(arr) { return arr.reduce(function (sum, currDigit, j) { return sum + Math.pow(10, arr.length - j - 1) * currDigit; }, 0); }; if (!initialValue[i]) { //use queryselector only once, then use saved value in future iterations of the loop initialValue[i] = Array.prototype.slice.call(instance.querySelectorAll(".ub-countdown-odometer")).map(function (unit) { return Array.prototype.slice.call(unit.children).map(function (c) { return parseInt(c.innerHTML); }); }); var conversionFactor = [7, 24, 60, 60, 1]; if (largestUnit && smallestUnit) { var amounts = Array(timeUnits.indexOf(largestUnit)).fill(0).concat(initialValue[i].map(function (arr) { return generateValue(arr); }), Array(4 - timeUnits.indexOf(smallestUnit)).fill(0)); if (timeLeft > amounts.reduce(function (total, current, j) { return total + current * conversionFactor.slice(j, 4).reduce(function (curFactor, current) { return curFactor * current; }, 1); }, 0)) { animationDirection = "increase"; } } } if (timeLeft >= 0) { if (instance.querySelector(".ub-countdown-odometer-container")) { var breakIntoDigits = function breakIntoDigits(num, minDigits) { //adapted from from https://stackoverflow.com/a/7784664 var digits = []; while (num > 0) { digits.push(num % 10); num = parseInt(num / 10); } var missingDigits = minDigits - digits.length; return (missingDigits > 0 ? Array(missingDigits).fill(0) : []).concat(digits.reverse()); }; var integerArray = function integerArray(limit1, limit2) { if (limit1 === limit2) { return [limit1]; } else if (limit1 < limit2) { return Array.apply(null, Array(limit2 - limit1 + 1)).map(function (_, i) { return i; }).map(function (a) { return a + limit1; }); } else { return Array.apply(null, Array(limit1 - limit2 + 1)).map(function (_, i) { return i; }).map(function (a) { return limit1 - a; }); } }; //make array of max values var _timeUnits = ["week", "day", "hour", "minute", "second"]; var maxValues = [0, 6, 23, 59, 59].slice(_timeUnits.indexOf(largestUnit), _timeUnits.indexOf(smallestUnit) + 1); if (_timeUnits.indexOf(largestUnit) < 3) { maxValues[0] = 0; } var replacements = [weeks, days, hours, minutes, seconds].slice(_timeUnits.indexOf(largestUnit), _timeUnits.indexOf(smallestUnit) + 1).map(function (r, j) { return breakIntoDigits(r, Math.floor(Math.log10(maxValues[j] || Math.max(generateValue(initialValue[i][j]), r) || 1) + 1)); }); var incomingDigits = []; //should also contain digits for other values initialValue[i].forEach(function (display, j) { if (display.every(function (digit, k) { return digit === replacements[j][k]; })) { incomingDigits.push(display); } else { var currentValue = generateValue(display); var newValue = generateValue(replacements[j]); var digitCount = maxValues[j] ? Math.floor(Math.log10(maxValues[j])) + 1 : currentValue === 0 && newValue === 0 ? 1 : Math.floor(Math.log10(Math.max(currentValue, newValue))) + 1; var addExtraZeroes = function addExtraZeroes(arr, targetLength) { return [].concat(Array(targetLength - arr.length).fill(0), arr); }; if (display.length < digitCount) { addExtraZeroes(display, digitCount); } if (replacements[j].count < digitCount) { addExtraZeroes(replacements[j], digitCount); } if (animationDirection === "increase") { var maxDigits = breakIntoDigits(maxValues[j] || newValue); if (maxDigits.length === 0) { maxDigits = [0]; } var extraDigits = []; var prevDigits = []; incomingDigits.push(replacements[j].map(function (d, k) { var currentMax = display[k - 1] === maxDigits[k - 1] ? maxDigits[i] : 9; if (prevDigits.length > 1) { var prevDigits2 = prevDigits.slice(1, prevDigits.length - 1); var cycle = prevDigits2.map(function (p) { return integerArray(0, maxDigits[k - 1] === p ? maxDigits[k] : 9); }); extraDigits = cycle.reduce(function (prev, curr) { return prev.concat(curr); }, []); } if (d === display[k]) { if (newValue > currentValue) { prevDigits = prevDigits.length > 0 ? integerArray(d, currentMax).concat(extraDigits, integerArray(0, d)) : [d]; } else { prevDigits = extraDigits.concat(integerArray(0, d)); } } else if (display[k] < d) { if (prevDigits.length > 1) { prevDigits = integerArray(display[k], currentMax).concat(extraDigits, integerArray(0, d)); } else { prevDigits = integerArray(display[k], d); } } else { prevDigits = integerArray(display[k], currentMax).concat(extraDigits, integerArray(0, d)); } return prevDigits.length > 1 ? prevDigits : d; })); } else if (animationDirection === "decrease") { var _maxDigits = breakIntoDigits(maxValues[j] || currentValue); if (_maxDigits.length === 0) { _maxDigits = [0]; } var _extraDigits = []; var _prevDigits = []; incomingDigits.push(replacements[j].map(function (d, k) { var currentMax = replacements[j][k - 1] === _maxDigits[k - 1] ? _maxDigits[k] : 9; if (_prevDigits.length > 1) { var prevDigits2 = _prevDigits.slice(1, _prevDigits.length - 1); var cycle = prevDigits2.map(function (p) { return integerArray(0, _maxDigits[k - 1] === p ? _maxDigits[k] : 9); }); _extraDigits = cycle.reduce(function (prev, curr) { return prev.concat(curr); }, []); } if (d === display[k]) { if (newValue < currentValue) { _prevDigits = _prevDigits.length > 0 ? integerArray(d, currentMax).concat(_extraDigits, integerArray(0, d)) : [d]; } else { _prevDigits = integerArray(d, currentMax).concat(_extraDigits, integerArray(0, d)); } } else if (display[k] > d) { if (_prevDigits.length > 1) { _prevDigits = integerArray(d, currentMax).concat(_extraDigits, integerArray(0, display[k])); } else { _prevDigits = integerArray(d, display[k]); } } else { _prevDigits = integerArray(d, currentMax).concat(_extraDigits, integerArray(0, display[k])); } return _prevDigits.length > 1 ? _prevDigits : d; })); } } }); var odometerSlot = Array.prototype.slice.call(instance.querySelectorAll(".ub-countdown-odometer")).map(function (a) { return Array.prototype.slice.call(a.children); }); var finishedTransitions = 0; var transitionCount = incomingDigits.reduce(function (collection, currentArray) { return collection.concat(currentArray); }, []).filter(function (a) { return Array.isArray(a); }).length; var removeExtraZeroes = function removeExtraZeroes() { maxValues.forEach(function (m, j) { if (m === 0) { //at least one extra leading zero is spotted if (initialValue[i][j][0] === 0) { var curVal = generateValue(initialValue[i][j]); var targetLength = (curVal ? Math.floor(Math.log10(curVal)) : 0) + 1; //eliminate element containing extra zero odometerSlot[j].slice(0, initialValue[i][j].length - targetLength).forEach(function (o) { o.parentNode.removeChild(o); }); initialValue[i][j] = initialValue[i][j].slice(initialValue[i][j].length - targetLength); } } }); }; incomingDigits.forEach(function (arr, j) { arr.forEach(function (d, k) { if (Array.isArray(d)) { odometerSlot[j][k].classList.add("ub-countdown-odometer-digits"); odometerSlot[j][k].classList.remove("ub-countdown-odometer-digit"); odometerSlot[j][k].innerHTML = d.map(function (dd) { return "
".concat(dd, "
"); }).join(""); //do pre-animation prep if (animationDirection === "decrease") { odometerSlot[j][k].style.transform = "translateY(".concat(100 * (1 / d.length - 1), "%)"); } //animate setTimeout(function () { odometerSlot[j][k].style.transition = "all 0.3s"; if (animationDirection === "increase") { odometerSlot[j][k].style.transform = "translateY(".concat(100 * (1 / d.length - 1), "%)"); } else { odometerSlot[j][k].style.transform = "translateY(0px)"; } //event listener for end of animation odometerSlot[j][k].addEventListener("transitionend", function () { //switch to pre-animation style odometerSlot[j][k].classList.add("ub-countdown-odometer-digit"); odometerSlot[j][k].classList.remove("ub-countdown-odometer-digits"); odometerSlot[j][k].removeAttribute("style"); //check if there are leading zeroes to be removed odometerSlot[j][k].innerHTML = replacements[j][k]; initialValue[i][j][k] = replacements[j][k]; finishedTransitions++; if (finishedTransitions === transitionCount) { removeExtraZeroes(); } }, { once: true }); }, 40); } }); }); animationDirection = "decrease"; } else { if (instance.querySelector(".ub_countdown_week")) instance.querySelector(".ub_countdown_week").innerHTML = weeks; if (instance.querySelector(".ub_countdown_day")) instance.querySelector(".ub_countdown_day").innerHTML = days; if (instance.querySelector(".ub_countdown_hour")) instance.querySelector(".ub_countdown_hour").innerHTML = hours; if (instance.querySelector(".ub_countdown_minute")) instance.querySelector(".ub_countdown_minute").innerHTML = minutes; if (instance.querySelector(".ub_countdown_second")) instance.querySelector(".ub_countdown_second").innerHTML = seconds; if (instance.querySelector(".ub_countdown_circular_container")) { if (instance.querySelector(".ub_countdown_circle_week")) { instance.querySelector(".ub_countdown_circle_week .ub_countdown_circle_path").style.strokeDasharray = "".concat(weeks * 219.911 / 52, "px, 219.911px"); instance.querySelector(".ub_countdown_circle_week .ub_countdown_circle_trail").style.strokeLinecap = weeks > 0 ? "round" : "butt"; } if (instance.querySelector(".ub_countdown_circle_day")) { instance.querySelector(".ub_countdown_circle_day .ub_countdown_circle_path").style.strokeDasharray = "".concat(days * 219.911 / 7, "px, 219.911px"); instance.querySelector(".ub_countdown_circle_day .ub_countdown_circle_trail").style.strokeLinecap = days > 0 ? "round" : "butt"; } if (instance.querySelector(".ub_countdown_circle_hour")) { instance.querySelector(".ub_countdown_circle_hour .ub_countdown_circle_path").style.strokeDasharray = "".concat(hours * 219.911 / 24, "px, 219.911px"); instance.querySelector(".ub_countdown_circle_hour .ub_countdown_circle_trail").style.strokeLinecap = hours > 0 ? "round" : "butt"; } if (instance.querySelector(".ub_countdown_circle_minute")) { instance.querySelector(".ub_countdown_circle_minute .ub_countdown_circle_path").style.strokeDasharray = "".concat(minutes * 219.911 / 60, "px, 219.911px"); instance.querySelector(".ub_countdown_circle_minute .ub_countdown_circle_trail").style.strokeLinecap = minutes > 0 ? "round" : "butt"; } if (instance.querySelector(".ub_countdown_circle_second")) { instance.querySelector(".ub_countdown_circle_second .ub_countdown_circle_path").style.strokeDasharray = "".concat(seconds * 219.911 / 60, "px, 219.911px"); instance.querySelector(".ub_countdown_circle_second .ub_countdown_circle_trail").style.strokeLinecap = seconds > 0 ? "round" : "butt"; } } } } else { clearInterval(timer[i]); if (!isNaN(timeLeft)) { instance.innerHTML = instance.getAttribute("data-expirymessage"); } } }, 1000); }); });; "use strict"; if (!Element.prototype.matches) { Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; } if (!Element.prototype.closest) { Element.prototype.closest = function (s) { var el = this; do { if (el.matches(s)) return el; el = el.parentElement || el.parentNode; } while (el !== null && el.nodeType === 1); return null; }; } function ub_hashHeaderScroll() { var scrollType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "auto"; var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; if (window.location.hash) { var targetHeading = document.getElementById(window.location.hash.slice(1)); var probableHeaders; try { probableHeaders = document.elementsFromPoint(window.innerWidth / 2, 0); } catch (e) { probableHeaders = document.msElementsFromPoint(window.innerWidth / 2, 0); } var stickyHeaders = Array.prototype.slice.call(probableHeaders).filter(function (e) { return ["fixed", "sticky"].includes(window.getComputedStyle(e).position); }); var stickyHeaderHeights = stickyHeaders.map(function (h) { return h.offsetHeight; }); var deficit = targetHeading.getBoundingClientRect().y || targetHeading.getBoundingClientRect().top; switch (scrollType) { default: window.scrollBy(0, deficit); break; case "off": window.scrollBy(0, deficit); break; case "auto": window.scrollBy(0, deficit - (stickyHeaders.length ? Math.max.apply(Math, stickyHeaderHeights) : 0)); break; case "fixedamount": window.scrollBy(0, deficit - offset); break; case "namedelement": window.scrollBy(0, deficit - (document.querySelector(target) ? document.querySelector(target).offsetHeight : 0)); break; } } } document.addEventListener("DOMContentLoaded", function () { var instances = []; if (document.getElementById("ub_table-of-contents-toggle-link")) { instances.push(document.getElementById("ub_table-of-contents-toggle-link")); } else { instances = Array.prototype.slice.call(document.getElementsByClassName("ub_table-of-contents-toggle-link")); } instances.forEach(function (instance) { var block = instance.closest(".ub_table-of-contents"); var tocContainer = block.querySelector(".ub_table-of-contents-container"); var containerStyle = tocContainer.style; var tocExtraContainer = block.querySelector(".ub_table-of-contents-extra-container"); var extraContainerStyle = tocExtraContainer.style; var tocMain = tocExtraContainer.parentNode; var mainStyle = block.style; var showButton = block.getAttribute("data-showtext") || "show"; var hideButton = block.getAttribute("data-hidetext") || "hide"; tocContainer.removeAttribute("style"); var padding = 60; function mobileEvent(mql) { if (mql.matches) { if (!tocMain.classList.contains("ub_table-of-contents-collapsed")) { tocMain.classList.add("ub_table-of-contents-collapsed"); instance.innerHTML = showButton; tocContainer.classList.add("ub-hide"); } } else { if (JSON.parse(tocMain.dataset.initiallyshow)) { tocMain.classList.remove("ub_table-of-contents-collapsed"); instance.innerHTML = hideButton; tocContainer.classList.remove("ub-hide"); } } } var mobileQuery = window.matchMedia("(max-width: 800px)"); if (JSON.parse(block.getAttribute("data-initiallyhideonmobile"))) { mobileQuery.addListener(mobileEvent); } instance.addEventListener("click", function (event) { event.preventDefault(); var curWidth = block.offsetWidth; if (block.classList.contains("ub_table-of-contents-collapsed")) { //begin showing tocExtraContainer.classList.remove("ub-hide"); tocContainer.classList.remove("ub-hide"); var targetHeight = tocExtraContainer.offsetHeight + padding / 2; //doesn't include padding tocContainer.classList.add("ub-hiding"); tocExtraContainer.classList.add("ub-hiding"); mainStyle.width = "".concat(curWidth, "px"); //also take into account number of columns setTimeout(function () { mainStyle.width = "auto"; block.classList.remove("ub_table-of-contents-collapsed"); var fullWidth = getComputedStyle(block).width.slice(0, -2); mainStyle.width = "".concat(curWidth, "px"); setTimeout(function () { Object.assign(containerStyle, { height: "".concat(targetHeight, "px"), width: "100px" }); Object.assign(extraContainerStyle, { height: "".concat(targetHeight, "px"), width: "100px" }); tocContainer.classList.remove("ub-hiding"); tocExtraContainer.classList.remove("ub-hiding"); mainStyle.width = "".concat(fullWidth, "px"); setTimeout(function () { tocContainer.style.width = "".concat(fullWidth - padding, "px"); tocExtraContainer.style.width = "".concat(fullWidth - padding, "px"); }, 50); }, 50); }, 50); } else { //begin hiding mainStyle.width = "".concat(block.offsetWidth, "px"); Object.assign(containerStyle, { height: "".concat(tocContainer.offsetHeight, "px"), width: "".concat(tocContainer.offsetWidth, "px") }); Object.assign(extraContainerStyle, { height: "".concat(tocExtraContainer.offsetHeight, "px"), width: "".concat(tocExtraContainer.offsetWidth, "px") }); setTimeout(function () { tocContainer.classList.add("ub-hiding"); Object.assign(containerStyle, { height: "0", width: "0" }); Object.assign(extraContainerStyle, { height: "0", width: "0" }); block.classList.add("ub_table-of-contents-collapsed"); padding = parseInt(getComputedStyle(tocExtraContainer).paddingLeft.slice(0, -2)) + parseInt(getComputedStyle(tocExtraContainer).paddingRight.slice(0, -2)); //measure width of toc title + toggle button, then use it as width of block mainStyle.width = "".concat(5 + padding + instance.closest(".ub_table-of-contents-header-container").scrollWidth, "px"); }, 50); } instance.innerHTML = tocContainer.classList.contains("ub-hiding") ? hideButton : showButton; mobileQuery.removeListener(mobileEvent); }); tocContainer.addEventListener("transitionend", function () { if (tocContainer.offsetHeight === 0) { //hiding is done tocContainer.classList.remove("ub-hiding"); tocContainer.classList.add("ub-hide"); tocExtraContainer.classList.remove("ub-hiding"); tocExtraContainer.classList.add("ub-hide"); if (containerStyle.display === "block") { containerStyle.display = ""; } if (extraContainerStyle.display === "block") { extraContainerStyle.display = ""; } mainStyle.minWidth = ""; } Object.assign(containerStyle, { height: "", width: "" }); Object.assign(extraContainerStyle, { height: "", width: "" }); mainStyle.width = ""; }); }); if (window.location.hash) { var sourceToC = document.querySelector(".ub_table-of-contents"); if (sourceToC) { var type = sourceToC.dataset.scrolltype; var offset = type === "fixedamount" ? sourceToC.dataset.scrollamount : 0; var target = type === "namedelement" ? sourceToC.dataset.scrolltarget : ""; setTimeout(function () { return ub_hashHeaderScroll(type, target, offset); }, 50); } } }); window.onhashchange = function () { var sourceToC = document.querySelector(".ub_table-of-contents"); if (sourceToC) { var type = sourceToC.dataset.scrolltype; var offset = type === "fixedamount" ? sourceToC.dataset.scrollamount : 0; var target = type === "namedelement" ? sourceToC.dataset.scrolltarget : ""; ub_hashHeaderScroll(type, target, offset); } }; Array.prototype.slice.call(document.querySelectorAll(".ub_table-of-contents-container li > a")).forEach(function (link) { link.addEventListener("click", function (e) { var hashlessLink = link.href.replace(link.hash, ""); var targetPageNumber = /[?&]page=\d+/g.exec(hashlessLink); var currentPageNumber = /[?&]page=\d+/g.exec(window.location.search); if (window.location.href.includes(hashlessLink) && (currentPageNumber === null || targetPageNumber && currentPageNumber[0] === targetPageNumber[0])) { var tocData = link.closest(".ub_table-of-contents").dataset; var type = tocData.scrolltype; var offset = type === "fixedamount" ? tocData.scrollamount : 0; var target = type === "namedelement" ? tocData.scrolltarget : ""; e.preventDefault(); history.pushState(null, "", link.hash); ub_hashHeaderScroll(type, target, offset); } }); });;