{"version":3,"sources":["ixp-countdown-timer.js"],"names":["runtime","ticker","tick","callback","frameFunc","now","Math","floor","Date","setTimeout","timerFunc","status","requestAnimationFrame","callbacks","register","id","o","Object","assign","deregister","has","start","tickTime","values","forEach","stop","constants","keys","css","timerRunning","timerEnded","years","months","days","hours","minutes","seconds","selectors","element","counterItem","value","timerRunningContent","timerEndedContent","momentDurationLight","absCeil","number","ceil","absFloor","normalizeUnits","units","aliases","toLowerCase","undefined","monthsToDays","daysToMonths","makeGetter","name","this","_data","NaN","Duration","durationinMS","_milliseconds","_days","_months","_bubble","milliseconds","proto","prototype","as","round","Error","asMilliseconds","monthsFromDays","data","components","initialize","options","_rootDOMEl","$el","get","_endDate","parse","endDate","updateTimer","instanceId","bind","onDocumentReady","setupTimerItemVisibility","onGetCssClassesToPreserve","updateTimerDisplay","_timer","expired","_self","arguments","dateDifference","timer","filter","_","index","_array","indexOf","shownAs","map","el","abs","reduce","acc","key","classList","toggle","remove","add","querySelector","innerHTML","toString","padStart","onGetScaffolding","scaffoldingKey","builder","scaffolding","scaffoldContainer","allowedDropTargets","getParamMapOverrides","val","window","ixp"],"mappings":"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","file":"ixp-countdown-timer.min.js","sourcesContent":["(function (runtime) {\n var ticker = (function () {\n var callbacks = {};\n var status = \"stopped\";\n\n function tick(callback) {\n var frameFunc = function () {\n // get the current time rounded down to a whole second\n var now = 1000 * Math.floor(Date.now() / 1000);\n // run the callback\n callback(now);\n // wait for the next whole second\n setTimeout(timerFunc, now + 1000 - Date.now());\n },\n timerFunc = function () {\n if (status == \"running\") requestAnimationFrame(frameFunc);\n };\n timerFunc();\n }\n\n return {\n register: function (id, callback) {\n var o = {};\n o[id] = callback;\n\n callbacks = Object.assign(callbacks, o);\n },\n deregister: function (id) {\n delete callbacks[id];\n },\n has: function (id) {\n return callbacks[id] || null;\n },\n start: function () {\n if (status === \"running\") return;\n status = \"running\";\n tick(function (tickTime) {\n Object.values(callbacks).forEach(function (callback) {\n callback(tickTime);\n });\n });\n },\n stop: function () {\n status = \"stop\";\n },\n status: function () {\n return status;\n },\n };\n })();\n\n var constants = {\n keys: [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"],\n css: {\n timerRunning: \"ixp-timer-running\",\n timerEnded: \"ixp-timer-ended\",\n years: \"ixp-timer-show-year\",\n months: \"ixp-timer-show-month\",\n days: \"ixp-timer-show-day\",\n hours: \"ixp-timer-show-hour\",\n minutes: \"ixp-timer-show-minute\",\n seconds: \"ixp-timer-show-second\",\n },\n selectors: {\n element: \".ixp-component-countdown-timer\",\n counterItem: \".ixp-counter-item\",\n years: \".ixp-year\",\n months: \".ixp-month\",\n days: \".ixp-day\",\n hours: \".ixp-hour\",\n minutes: \".ixp-minute\",\n seconds: \".ixp-second\",\n value: \".ixp-value\",\n timerRunningContent: \".ixp-component-countdown-timer-running-content\",\n timerEndedContent: \".ixp-component-countdown-timer-ended-content\",\n },\n };\n\n /******************************************************************* */\n /* Time Handling functions inspired by moment.js diff */\n /******************************************************************* */\n\n var momentDurationLight = (function () {\n var aliases = {\n years: \"years\",\n months: \"months\",\n days: \"days\",\n hours: \"hours\",\n minutes: \"minutes\",\n seconds: \"seconds\",\n milliseconds: \"millseconds\",\n };\n\n /******************************************************************* */\n /* Utils */\n /******************************************************************* */\n function absCeil(number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n function absFloor(number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function normalizeUnits(units) {\n return typeof units === \"string\" ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function monthsToDays(months) {\n // the reverse of daysToMonths\n return (months * 146097) / 4800;\n }\n\n function daysToMonths(days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return (days * 4800) / 146097;\n }\n\n function makeGetter(name) {\n return function () {\n return this._data[name] ? this._data[name] : NaN;\n };\n }\n /******************************************************************* */\n /* Constructor */\n /******************************************************************* */\n function Duration(durationinMS) {\n this._milliseconds = durationinMS || 0;\n this._days = 0;\n\n this._months = 0;\n\n this._data = {};\n\n this._bubble();\n }\n\n var proto = Duration.prototype;\n\n proto.as = function (units) {\n var days,\n months,\n milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === \"months\" || units === \"years\") {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n switch (units) {\n case \"months\":\n return months;\n case \"years\":\n return months / 12;\n }\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case \"days\":\n return days + milliseconds / 864e5;\n case \"hours\":\n return days * 24 + milliseconds / 36e5;\n case \"minutes\":\n return days * 1440 + milliseconds / 6e4;\n case \"seconds\":\n return days * 86400 + milliseconds / 1000;\n default:\n throw new Error(\"Unknown unit \" + units);\n }\n }\n };\n\n proto.asMilliseconds = function () {\n return this._milliseconds;\n };\n\n proto._bubble = function () {\n var milliseconds = this._milliseconds,\n days = this._days,\n months = this._months,\n data = this._data,\n seconds,\n minutes,\n hours,\n years,\n monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n };\n\n proto.years = makeGetter(\"years\");\n proto.months = makeGetter(\"months\");\n proto.days = makeGetter(\"days\");\n proto.hours = makeGetter(\"hours\");\n proto.minutes = makeGetter(\"minutes\");\n proto.seconds = makeGetter(\"seconds\");\n proto.milliseconds = makeGetter(\"millseconds\");\n\n return Duration;\n })();\n\n runtime.components.register(\"ixp-countdown-timer\", {\n initialize: function (options) {\n // get native DOM element from jQuery Wrapper\n this._rootDOMEl = this.$el.get(0);\n this._endDate = new Date(Date.parse(this.endDate));\n this.updateTimer();\n\n ticker.register(this.instanceId, this.tick.bind(this));\n },\n onDocumentReady: function () {\n this.setupTimerItemVisibility();\n\n ticker.start();\n },\n onGetCssClassesToPreserve: function() {\n return [constants.css.years, constants.css.months, constants.css.days,constants.css.hours, constants.css.minutes,constants.css.seconds]\n },\n tick: function (tickTime) {\n this.updateTimer(tickTime);\n this.updateTimerDisplay();\n\n if (this._timer.expired == true && ticker.has(this.instanceId)) {\n ticker.deregister(this.instanceId);\n }\n },\n updateTimer: function (/* [now] */) {\n var _self = this,\n now = arguments[0] ? new Date(arguments[0]) : new Date(),\n dateDifference = new momentDurationLight(_self._endDate - now);\n\n var timer = constants.keys\n .filter(function (_, index, _array) {\n return index >= _array.indexOf(_self.shownAs);\n })\n .map(function (el, index) {\n var o = {};\n if (index > 0) {\n o[el] = Math.abs(dateDifference[el]());\n } else {\n o[el] = Math.abs(Math.floor(dateDifference.as(el)));\n }\n\n return o;\n })\n .reduce(function (acc, el) {\n return Object.assign(acc, el);\n }, {});\n\n timer.expired = dateDifference.asMilliseconds() < 0;\n\n _self._timer = timer;\n },\n setupTimerItemVisibility: function () {\n var _self = this;\n\n constants.keys.forEach(function (key) {\n _self._rootDOMEl.classList.toggle(constants.css[key], _self._timer[key] != null);\n });\n },\n updateTimerDisplay: function () {\n var _self = this;\n\n if (_self._timer.expired == true) {\n _self._rootDOMEl.classList.remove(constants.css.timerRunning);\n _self._rootDOMEl.classList.add(constants.css.timerEnded);\n }\n\n constants.keys.forEach(function (key) {\n var value = _self._timer.expired == true ? 0 : _self._timer[key] || 0;\n _self._rootDOMEl.querySelector(constants.selectors.counterItem + constants.selectors[key] + \" \" + constants.selectors.value).innerHTML = value.toString().padStart(2, 0);\n });\n },\n // studio\n onGetScaffolding: function (scaffoldingKey, builder, options) {\n return { scaffolding: [builder.scaffoldContainer(\"Countdown Timer\")] };\n },\n allowedDropTargets: function () {\n return [\"Container\"];\n },\n getParamMapOverrides: function () {\n return {\n endDate: function (val) {\n this._endDate = new Date(Date.parse(val));\n if (!ticker.has(_self.instanceId)) {\n ticker.register(_self.instanceId, _self.tick.bind(_self));\n }\n },\n shownAs: function (val) {\n this.shownAs = (\"\" + val).toLowerCase();\n this.updateTimer();\n this.setupTimerItemVisibility();\n this.updateTimerDisplay();\n },\n };\n },\n });\n})(window.ixp.runtime);\n"]}