{"version":3,"file":"jquery.syotimer.min.js","sources":["../source/localization.ts","../source/constants.ts","../source/utils.ts","../source/SyoTimer.ts","../source/index.ts"],"sourcesContent":["import $ from 'jquery';\n\n$.syotimerLang = {\n rus: {\n second: ['секунда', 'секунды', 'секунд'],\n minute: ['минута', 'минуты', 'минут'],\n hour: ['час', 'часа', 'часов'],\n day: ['день', 'дня', 'дней'],\n handler: function rusNumeral(number, words) {\n const cases = [2, 0, 1, 1, 1, 2];\n if (number % 100 > 4 && number % 100 < 20) {\n return words[2];\n }\n const index = cases[number % 10 < 5 ? number % 10 : 5];\n return words[index];\n },\n },\n eng: {\n second: ['second', 'seconds'],\n minute: ['minute', 'minutes'],\n hour: ['hour', 'hours'],\n day: ['day', 'days'],\n },\n por: {\n second: ['segundo', 'segundos'],\n minute: ['minuto', 'minutos'],\n hour: ['hora', 'horas'],\n day: ['dia', 'dias'],\n },\n spa: {\n second: ['segundo', 'segundos'],\n minute: ['minuto', 'minutos'],\n hour: ['hora', 'horas'],\n day: ['día', 'días'],\n },\n heb: {\n second: ['שניה', 'שניות'],\n minute: ['דקה', 'דקות'],\n hour: ['שעה', 'שעות'],\n day: ['יום', 'ימים'],\n },\n};\n","import $ from 'jquery';\nimport type { SyoTimerInternalOptions, ItemsHas, LinkedList, UnitLong, UnitShort } from './types';\n\nexport const DAY: UnitLong = 'day';\nexport const HOUR: UnitLong = 'hour';\nexport const MINUTE: UnitLong = 'minute';\nexport const SECOND: UnitLong = 'second';\nexport const DAY_IN_SEC = 24 * 60 * 60;\nexport const HOUR_IN_SEC = 60 * 60;\nexport const MINUTE_IN_SEC = 60;\nexport const LAYOUT_TYPES: Record = {\n d: DAY,\n h: HOUR,\n m: MINUTE,\n s: SECOND,\n};\n\nexport const unitLinkedList: LinkedList = {\n list: [SECOND, MINUTE, HOUR, DAY],\n next(current) {\n const currentIndex = this.list.indexOf(current);\n return currentIndex < this.list.length ? this.list[currentIndex + 1] : null;\n },\n prev(current) {\n const currentIndex = this.list.indexOf(current);\n return currentIndex > 0 ? this.list[currentIndex - 1] : null;\n },\n};\n\nexport const defaultItemsHas: ItemsHas = {\n second: false,\n minute: false,\n hour: false,\n day: false,\n};\n\nexport const defaultOptions: SyoTimerInternalOptions = {\n date: 0,\n layout: 'dhms',\n periodic: false,\n periodInterval: 7,\n periodUnit: 'd',\n doubleNumbers: true,\n effectType: 'none',\n lang: 'eng',\n headTitle: '',\n footTitle: '',\n afterDeadline: (timerBlock) => {\n timerBlock.bodyBlock.html('

The countdown is finished!

');\n },\n itemTypes: ['day', 'hour', 'minute', 'second'],\n itemsHas: $.extend({}, defaultItemsHas),\n};\n","import {\n DAY,\n HOUR,\n MINUTE,\n SECOND,\n DAY_IN_SEC,\n HOUR_IN_SEC,\n MINUTE_IN_SEC,\n LAYOUT_TYPES,\n unitLinkedList,\n} from './constants';\nimport type { LanguageHandler, SyoTimerInternalOptions, Unit, UnitLong, UnitShort } from './types';\n\n/**\n * Determine a unit of period in milliseconds\n */\nfunction getPeriodUnit(periodUnit: Unit) {\n switch (periodUnit) {\n case 'd':\n case DAY:\n return DAY_IN_SEC;\n case 'h':\n case HOUR:\n return HOUR_IN_SEC;\n case 'm':\n case MINUTE:\n return MINUTE_IN_SEC;\n case 's':\n case SECOND:\n default:\n return 1;\n }\n}\n\n/**\n * Formation of numbers with leading zeros\n */\nexport function format2(numb: number, isUse?: boolean) {\n return numb <= 9 && !!isUse ? `0${numb}` : String(numb);\n}\n\nexport function getItemTypesByLayout(layout: string) {\n const itemTypes = [] as UnitLong[];\n for (let i = 0; i < layout.length; i += 1) {\n itemTypes.push(LAYOUT_TYPES[layout[i] as UnitShort]);\n }\n return itemTypes;\n}\n\n/**\n * Getting count of units to deadline\n */\nexport function getUnitsToDeadLine(secondsToDeadLine: number) {\n let remainsSeconds = secondsToDeadLine;\n let unit: UnitLong | null = DAY;\n const unitsToDeadLine: Record = {\n day: 0,\n hour: 0,\n minute: 0,\n second: 0,\n };\n do {\n const unitInMilliSec = getPeriodUnit(unit);\n unitsToDeadLine[unit] = Math.floor(remainsSeconds / unitInMilliSec);\n remainsSeconds %= unitInMilliSec;\n // eslint-disable-next-line no-cond-assign\n } while ((unit = unitLinkedList.prev(unit)));\n return unitsToDeadLine;\n}\n\n/**\n * Return once cell DOM of countdown: day, hour, minute, second\n */\nexport function getTimerItem() {\n const timerCellValue = $('
', {\n class: 'syotimer-cell__value',\n text: '0',\n });\n const timerCellUnit = $('
', { class: 'syotimer-cell__unit' });\n const timerCell = $('
', { class: 'syotimer-cell' });\n timerCell.append(timerCellValue).append(timerCellUnit);\n return timerCell;\n}\n\n/**\n * Getting count of seconds to deadline\n */\nexport function getSecondsToDeadLine(\n differenceInMilliSec: number,\n options: SyoTimerInternalOptions,\n) {\n let differenceInSeconds = differenceInMilliSec / 1000;\n differenceInSeconds = Math.floor(differenceInSeconds);\n\n if (!options.periodic) return differenceInSeconds;\n\n let differenceInUnit: number;\n const periodUnitInSeconds = getPeriodUnit(options.periodUnit);\n let fullTimeUnitsBetween = differenceInMilliSec / (periodUnitInSeconds * 1000);\n fullTimeUnitsBetween = Math.ceil(fullTimeUnitsBetween);\n fullTimeUnitsBetween = Math.abs(fullTimeUnitsBetween);\n if (differenceInSeconds >= 0) {\n differenceInUnit = fullTimeUnitsBetween % options.periodInterval;\n differenceInUnit = differenceInUnit === 0 ? options.periodInterval : differenceInUnit;\n differenceInUnit -= 1;\n } else {\n differenceInUnit = options.periodInterval - (fullTimeUnitsBetween % options.periodInterval);\n }\n\n const additionalInUnit = differenceInSeconds % periodUnitInSeconds;\n // fix когда дедлайн раньше текущей даты,\n // возникает баг с неправильным расчетом интервала при different пропорциональной periodUnit\n if (additionalInUnit === 0 && differenceInSeconds < 0) {\n differenceInUnit -= 1;\n }\n const secondsToDeadLine = Math.abs(differenceInUnit * periodUnitInSeconds + additionalInUnit);\n return secondsToDeadLine;\n}\n\n/**\n * Universal function for get correct inducement of nouns after a numeral (`number`)\n */\nconst universal: LanguageHandler = (n: number, words: string[]) => (n === 1 ? words[0] : words[1]);\n\n/**\n * Getting the correct declension of words after numerals\n */\nexport function getNumeral(n: number, lang: string, unit: UnitLong) {\n const handler: LanguageHandler = $.syotimerLang[lang].handler || universal;\n const words: string[] = $.syotimerLang[lang][unit];\n return handler(n, words);\n}\n","import $ from 'jquery';\nimport { defaultOptions, defaultItemsHas, DAY, SECOND, unitLinkedList } from './constants';\nimport {\n getItemTypesByLayout,\n getNumeral,\n getSecondsToDeadLine,\n getTimerItem,\n getUnitsToDeadLine,\n format2,\n} from './utils';\nimport type {\n SyoTimerOptions,\n SyoTimerInternalOptions,\n SyoTimerItemBlocks,\n SyoTimerEffectType,\n UnitLong,\n} from './types';\n\nexport class SyoTimer {\n element: JQuery;\n\n constructor(element: HTMLElement, options: SyoTimerInternalOptions) {\n this.element = $(element);\n this.element.data('syotimer-options', options);\n this.render();\n }\n\n /**\n * Rendering base elements of countdown\n * @private\n */\n private render() {\n const options = this.element.data('syotimer-options') as SyoTimerInternalOptions;\n\n const timerItem = getTimerItem();\n const headBlock = $('
', { class: 'syotimer__head' }).html(options.headTitle);\n const bodyBlock = $('
', { class: 'syotimer__body' });\n const footBlock = $('
', { class: 'syotimer__footer' }).html(options.footTitle);\n const itemBlocks: SyoTimerItemBlocks = {};\n\n for (let i = 0; i < options.itemTypes.length; i += 1) {\n const item = timerItem.clone();\n\n item.addClass(`syotimer-cell_type_${options.itemTypes[i]}`);\n bodyBlock.append(item);\n\n itemBlocks[options.itemTypes[i]] = item;\n }\n\n const timerBlocks = { headBlock, bodyBlock, footBlock };\n\n this.element\n .data('syotimer-blocks', timerBlocks)\n .data('syotimer-items', itemBlocks)\n .addClass('syotimer')\n .append(headBlock)\n .append(bodyBlock)\n .append(footBlock);\n }\n\n /**\n * Handler called per seconds while countdown is not over\n */\n tick() {\n const options = this.element.data('syotimer-options') as SyoTimerInternalOptions;\n $('.syotimer-cell > .syotimer-cell__value', this.element).css('opacity', 1);\n const currentTime = new Date().getTime();\n const deadLineTime = options.date instanceof Date ? options.date.getTime() : options.date;\n const differenceInMilliSec = deadLineTime - currentTime;\n const secondsToDeadLine = getSecondsToDeadLine(differenceInMilliSec, options);\n if (secondsToDeadLine >= 0) {\n this.refreshUnitsDom(secondsToDeadLine);\n this.applyEffectSwitch(options.effectType);\n } else {\n const elementBox = $.extend(this.element, this.element.data('syotimer-blocks'));\n options.afterDeadline(elementBox);\n }\n }\n\n /**\n * Refresh unit DOM of countdown\n * @private\n */\n private refreshUnitsDom(secondsToDeadLine: number) {\n const options = this.element.data('syotimer-options') as SyoTimerInternalOptions;\n const itemBlocks = this.element.data('syotimer-items');\n const unitList = options.itemTypes;\n const unitsToDeadLine = getUnitsToDeadLine(secondsToDeadLine);\n\n if (!options.itemsHas.day) {\n unitsToDeadLine.hour += unitsToDeadLine.day * 24;\n }\n if (!options.itemsHas.hour) {\n unitsToDeadLine.minute += unitsToDeadLine.hour * 60;\n }\n if (!options.itemsHas.minute) {\n unitsToDeadLine.second += unitsToDeadLine.minute * 60;\n }\n for (let i = 0; i < unitList.length; i += 1) {\n const unit = unitList[i];\n const unitValue = unitsToDeadLine[unit];\n const itemBlock = itemBlocks[unit];\n itemBlock.data('syotimer-unit-value', unitValue);\n $('.syotimer-cell__value', itemBlock).html(\n format2(unitValue, unit !== DAY ? options.doubleNumbers : false),\n );\n $('.syotimer-cell__unit', itemBlock).html(getNumeral(unitValue, options.lang, unit));\n }\n }\n\n /**\n * Applying effect of changing numbers\n * @private\n */\n private applyEffectSwitch(effectType: SyoTimerEffectType, unit: UnitLong = SECOND) {\n switch (effectType) {\n case 'opacity': {\n const itemBlocks = this.element.data('syotimer-items');\n const unitItemBlock = itemBlocks[unit];\n if (unitItemBlock) {\n const nextUnit = unitLinkedList.next(unit);\n const unitValue = unitItemBlock.data('syotimer-unit-value');\n $('.syotimer-cell__value', unitItemBlock).animate({ opacity: 0.1 }, 1000, 'linear', () =>\n this.tick(),\n );\n if (nextUnit && unitValue === 0) {\n this.applyEffectSwitch(effectType, nextUnit);\n }\n }\n return;\n }\n case 'none':\n default: {\n setTimeout(() => this.tick(), 1000);\n }\n }\n }\n}\n\nexport default function mapSyoTimer(elements: JQuery, inputOptions?: SyoTimerOptions) {\n const options = $.extend({}, defaultOptions, inputOptions || {});\n options.itemTypes = getItemTypesByLayout(options.layout);\n options.itemsHas = $.extend({}, defaultItemsHas);\n\n for (let i = 0; i < options.itemTypes.length; i += 1) {\n options.itemsHas[options.itemTypes[i]] = true;\n }\n\n return elements.each(function init() {\n const timer = new SyoTimer(this, options);\n timer.tick();\n });\n}\n","import $ from 'jquery';\nimport './localization';\nimport mapSyoTimer from './SyoTimer';\nimport type {\n SyoTimerOptions,\n SyoTimerMethods,\n SyoTimerOptionProps,\n SyoTimerOptionValues,\n} from './types';\n\nconst methods: Record = {\n setOption(name: SyoTimerOptionProps, value: SyoTimerOptionValues) {\n const elementBox = $(this);\n const options = elementBox.data('syotimer-options');\n if (Object.prototype.hasOwnProperty.call(options, name)) {\n options[name] = value;\n elementBox.data('syotimer-options', options);\n }\n },\n};\n\n$.fn.extend({\n syotimer(\n this: JQuery,\n options: SyoTimerOptions | SyoTimerMethods,\n property: SyoTimerOptionProps,\n value: SyoTimerOptionValues,\n ) {\n if (typeof options === 'string' && options === 'setOption') {\n return this.each(function method() {\n methods[options].apply(this, [property, value]);\n });\n }\n if (options === null || options === undefined || typeof options === 'object') {\n return mapSyoTimer(this, options);\n }\n return $.error('SyoTimer. Error in call methods: methods is not exist');\n },\n});\n"],"names":["syotimerLang","rus","second","minute","hour","day","handler","number","words","eng","por","spa","heb","DAY","HOUR","MINUTE","SECOND","LAYOUT_TYPES","d","h","m","s","unitLinkedList","list","next","current","currentIndex","this","indexOf","length","prev","defaultItemsHas","defaultOptions","date","layout","periodic","periodInterval","periodUnit","doubleNumbers","effectType","lang","headTitle","footTitle","afterDeadline","timerBlock","bodyBlock","html","itemTypes","itemsHas","$","extend","getPeriodUnit","universal","n","getNumeral","unit","element","options","data","render","SyoTimer","timerCellValue","timerCellUnit","timerCell","timerItem","class","text","append","headBlock","footBlock","itemBlocks","i","item","clone","addClass","timerBlocks","css","currentTime","Date","getTime","secondsToDeadLine","differenceInMilliSec","differenceInUnit","differenceInSeconds","Math","floor","periodUnitInSeconds","fullTimeUnitsBetween","ceil","abs","additionalInUnit","getSecondsToDeadLine","refreshUnitsDom","applyEffectSwitch","elementBox","numb","isUse","unitList","unitsToDeadLine","remainsSeconds","unitInMilliSec","getUnitsToDeadLine","unitValue","itemBlock","String","unitItemBlock","nextUnit","animate","opacity","_this","tick","setTimeout","mapSyoTimer","elements","inputOptions","push","getItemTypesByLayout","each","methods","setOption","name","value","Object","prototype","hasOwnProperty","call","fn","syotimer","property","apply","error"],"mappings":"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"}