{"version":3,"sources":["jquery.syotimer.js","syotimer.lang.js"],"names":["factory","jQuery","define","amd","module","exports","root","undefined","window","require","$","DAY","HOUR","MINUTE","SECOND","LAYOUT_TYPES","d","h","m","s","UNIT_LINKED_LIST","list","next","current","currentIndex","this","indexOf","length","prev","DEFAULTS","year","month","day","hour","minute","second","timeZone","ignoreTransferTime","layout","periodic","periodInterval","periodUnit","doubleNumbers","effectType","lang","headTitle","footTitle","afterDeadline","timerBlock","bodyBlock","html","ITEMS_HAS_OPTIONS","SyoTimer","init","settings","options","extend","itemTypes","staticMethod","getItemTypesByLayout","_itemsHas","i","each","data","_render","apply","_perSecondHandler","elementBox","timerItem","getTimerItem","headBlock","class","footBlock","itemBlocks","item","clone","addClass","append","timerBlocks","css","currentDate","Date","deadLineDate","differenceInMilliSec","getDifferenceWithTimezone","secondsToDeadLine","getSecondsToDeadLine","_refreshUnitsDom","_applyEffectSwitch","unitList","unitsToDeadLine","getUnitsToDeadLine","unit","unitValue","itemBlock","format2","syotimerLang","getNumeral","unitItemBlock","nextUnit","element","setTimeout","animate","opacity","timerCellValue","text","timerCellUnit","timerCell","push","additionalInUnit","differenceInUnit","periodUnitInSeconds","fullTimeUnitsBetween","differenceInSeconds","Math","floor","getPeriodUnit","ceil","abs","unitInMilliSec","given_period_unit","differenceByLocalTimezone","getTime","amendmentOnTimezone","amendmentOnTransferTime","parseFloat","getTimezoneOffset","number","isUse","methods","setOption","name","value","hasOwnProperty","fn","syotimer","otherArgs","Array","prototype","slice","call","arguments","error","rus","handler","eng","por","spa","heb","universal","rusNumeral"],"mappings":"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","file":"jquery.syotimer.min.js","sourcesContent":[" var DAY = \"day\",\n HOUR = \"hour\",\n MINUTE = \"minute\",\n SECOND = \"second\";\n var DAY_IN_SEC = 24 * 60 * 60;\n var HOUR_IN_SEC = 60 * 60;\n var MINUTE_IN_SEC = 60;\n var LAYOUT_TYPES = {\n d: DAY,\n h: HOUR,\n m: MINUTE,\n s: SECOND\n };\n var UNIT_LINKED_LIST = {\n list: [SECOND, MINUTE, HOUR, DAY],\n next: function(current) {\n var currentIndex = this.list.indexOf(current);\n return (currentIndex < this.list.length ) ? this.list[currentIndex + 1] : false;\n },\n prev: function(current) {\n var currentIndex = this.list.indexOf(current);\n return (currentIndex > 0 ) ? this.list[currentIndex - 1] : false;\n }\n };\n\n var DEFAULTS = {\n year: 2034,\n month: 7,\n day: 31,\n hour: 0,\n minute: 0,\n second: 0,\n timeZone: 'local', // setting the time zone of deadline.\n // If 'local' then the time zone is ignored and\n // the deadline is determined by local time of the user.\n // Otherwise, specifies the offset from the UTC\n ignoreTransferTime: false, // If `true` then transfer to summer/winter time will not be considered.\n layout: 'dhms', // sets an order of layout of units of the timer:\n // days (d) of hours ('h'), minute ('m'), second ('s').\n periodic: false, //`true` - the timer is periodic.\n // If the date until which counts the timer is reached,\n // the next value date which will count down\n // the timer is incremented by the value `periodInterval`\n periodInterval: 7, // the period of the timer in `periodUnit`\n // (if `periodic` is set to `true`)\n periodUnit: 'd', // the unit of measurement period timer\n\n doubleNumbers: true, // `true` - show hours, minutes and seconds with leading zeros\n // (2 hours 5 minutes 4 seconds = 02:05:04)\n effectType: 'none', // The effect of changing the value of seconds\n lang: 'eng', // localization of a countdown signatures (days, hours, minutes, seconds)\n headTitle: '', // text above the countdown (may be as html string)\n footTitle: '', // text under the countdown (may be as html string)\n afterDeadline: function(timerBlock){\n timerBlock.bodyBlock.html('

The countdown is finished!

');\n }\n };\n\n var ITEMS_HAS_OPTIONS = {\n second: false,\n minute: false,\n hour: false,\n day: false\n };\n\n var SyoTimer = {\n /**\n * Init syotimer on DOM\n * @param settings\n * @returns {Array|Object|*}\n */\n init: function(settings) {\n var options = $.extend({}, DEFAULTS, settings || {});\n options.itemTypes = staticMethod.getItemTypesByLayout(options.layout);\n options._itemsHas = $.extend({}, ITEMS_HAS_OPTIONS);\n for (var i = 0; i < options.itemTypes.length; i++) {\n options._itemsHas[options.itemTypes[i]] = true;\n }\n return this.each(function() {\n var elementBox = $(this);\n elementBox.data('syotimer-options', options);\n SyoTimer._render.apply(this, []);\n SyoTimer._perSecondHandler.apply(this, []);\n });\n },\n\n /**\n * Rendering base elements of countdown\n * @private\n */\n _render: function() {\n var elementBox = $(this),\n options = elementBox.data('syotimer-options');\n\n var timerItem = staticMethod.getTimerItem(),\n headBlock = $('
', {\"class\": 'syotimer__head'})\n .html(options.headTitle),\n bodyBlock = $('
', {\"class\": 'syotimer__body'}),\n footBlock = $('
', {\"class\": 'syotimer__footer'})\n .html(options.footTitle),\n itemBlocks = {};\n\n for (var i = 0; i < options.itemTypes.length; i++) {\n var item = timerItem.clone();\n item.addClass('syotimer-cell_type_' + options.itemTypes[i]);\n bodyBlock.append(item);\n itemBlocks[options.itemTypes[i]] = item;\n }\n var timerBlocks = {\n headBlock: headBlock,\n bodyBlock: bodyBlock,\n footBlock: footBlock\n };\n elementBox.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 * @private\n */\n _perSecondHandler: function() {\n var elementBox = $(this),\n options = elementBox.data('syotimer-options');\n $('.syotimer-cell > .syotimer-cell__value', elementBox).css( 'opacity', 1 );\n var currentDate = new Date(),\n deadLineDate = new Date(\n options.year,\n options.month - 1,\n options.day,\n options.hour,\n options.minute,\n options.second\n ),\n differenceInMilliSec = staticMethod.getDifferenceWithTimezone(currentDate, deadLineDate, options),\n secondsToDeadLine = staticMethod.getSecondsToDeadLine(differenceInMilliSec, options);\n if ( secondsToDeadLine >= 0 ) {\n SyoTimer._refreshUnitsDom.apply(this, [secondsToDeadLine]);\n SyoTimer._applyEffectSwitch.apply(this, [options.effectType]);\n } else {\n elementBox = $.extend(elementBox, elementBox.data('syotimer-blocks'));\n options.afterDeadline( elementBox );\n }\n },\n\n /**\n * Refresh unit DOM of countdown\n * @param secondsToDeadLine\n * @private\n */\n _refreshUnitsDom: function(secondsToDeadLine) {\n var elementBox = $(this),\n options = elementBox.data('syotimer-options'),\n itemBlocks = elementBox.data('syotimer-items'),\n unitList = options.itemTypes,\n unitsToDeadLine = staticMethod.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(var i = 0; i < unitList.length; i++) {\n var unit = unitList[i],\n unitValue = unitsToDeadLine[unit],\n itemBlock = itemBlocks[unit];\n itemBlock.data('syotimer-unit-value', unitValue);\n $('.syotimer-cell__value', itemBlock).html(staticMethod.format2(\n unitValue,\n (unit !== DAY) ? options.doubleNumbers : false\n ));\n $('.syotimer-cell__unit', itemBlock).html($.syotimerLang.getNumeral(\n unitValue,\n options.lang,\n unit\n ));\n }\n },\n\n /**\n * Applying effect of changing numbers\n * @param effectType\n * @param unit\n * @private\n */\n _applyEffectSwitch: function(effectType, unit) {\n unit = unit || SECOND;\n var element = this,\n elementBox = $(element);\n if ( effectType === 'none' ) {\n setTimeout(function () {\n SyoTimer._perSecondHandler.apply(element, []);\n }, 1000);\n } else if ( effectType === 'opacity' ) {\n var itemBlocks = elementBox.data('syotimer-items'),\n unitItemBlock = itemBlocks[unit];\n if (unitItemBlock) {\n var nextUnit = UNIT_LINKED_LIST.next(unit),\n unitValue = unitItemBlock.data('syotimer-unit-value');\n $('.syotimer-cell__value', unitItemBlock).animate(\n {opacity: 0.1},\n 1000,\n 'linear',\n function () {\n SyoTimer._perSecondHandler.apply(element, []);\n }\n );\n if (nextUnit && unitValue === 0) {\n SyoTimer._applyEffectSwitch.apply(element, [effectType, nextUnit]);\n }\n }\n }\n }\n };\n\n var staticMethod = {\n /**\n * Return once cell DOM of countdown: day, hour, minute, second\n * @returns {object}\n */\n getTimerItem: function() {\n var timerCellValue = $('
', {\n \"class\": 'syotimer-cell__value',\n \"text\": '0'\n }),\n timerCellUnit = $('
', {\"class\": 'syotimer-cell__unit'}),\n timerCell = $('
', {\"class\": 'syotimer-cell'});\n timerCell.append(timerCellValue)\n .append(timerCellUnit);\n return timerCell;\n },\n\n getItemTypesByLayout: function(layout) {\n var itemTypes = [];\n for (var i = 0; i < layout.length; i++) {\n itemTypes.push(LAYOUT_TYPES[layout[i]]);\n }\n return itemTypes;\n },\n\n /**\n * Getting count of seconds to deadline\n * @param differenceInMilliSec\n * @param options\n * @returns {*}\n */\n getSecondsToDeadLine: function(differenceInMilliSec, options) {\n var secondsToDeadLine,\n differenceInSeconds = differenceInMilliSec / 1000;\n differenceInSeconds = Math.floor( differenceInSeconds );\n if ( options.periodic ) {\n var additionalInUnit,\n differenceInUnit,\n periodUnitInSeconds = staticMethod.getPeriodUnit(options.periodUnit),\n 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 additionalInUnit = differenceInSeconds % periodUnitInSeconds;\n\n // fix когда дедлайн раньше текущей даты,\n // возникает баг с неправильным расчетом интервала при different пропорциональной periodUnit\n if ( ( additionalInUnit === 0 ) && ( differenceInSeconds < 0 ) ) {\n differenceInUnit--;\n }\n secondsToDeadLine = Math.abs( differenceInUnit * periodUnitInSeconds + additionalInUnit );\n } else {\n secondsToDeadLine = differenceInSeconds;\n }\n return secondsToDeadLine;\n },\n\n /**\n * Getting count of units to deadline\n * @param secondsToDeadLine\n * @returns {{}}\n */\n getUnitsToDeadLine: function(secondsToDeadLine) {\n var unit = DAY,\n unitsToDeadLine = {};\n do {\n var unitInMilliSec = staticMethod.getPeriodUnit(unit);\n unitsToDeadLine[unit] = Math.floor(secondsToDeadLine / unitInMilliSec);\n secondsToDeadLine = secondsToDeadLine % unitInMilliSec;\n } while (unit = UNIT_LINKED_LIST.prev(unit));\n return unitsToDeadLine;\n },\n\n /**\n * Determine a unit of period in milliseconds\n * @param given_period_unit\n * @returns {number}\n */\n getPeriodUnit: function(given_period_unit) {\n switch (given_period_unit) {\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 return 1;\n }\n },\n\n getDifferenceWithTimezone: function(currentDate, deadLineDate, options) {\n var differenceByLocalTimezone = deadLineDate.getTime() - currentDate.getTime(),\n amendmentOnTimezone = 0,\n amendmentOnTransferTime = 0,\n amendment;\n if ( options.timeZone !== 'local' ) {\n var timezoneOffset = parseFloat(options.timeZone) * staticMethod.getPeriodUnit(HOUR),\n localTimezoneOffset = - currentDate.getTimezoneOffset() * staticMethod.getPeriodUnit(MINUTE);\n amendmentOnTimezone = (timezoneOffset - localTimezoneOffset) * 1000;\n }\n if ( options.ignoreTransferTime ) {\n var currentTimezoneOffset = -currentDate.getTimezoneOffset() * staticMethod.getPeriodUnit(MINUTE),\n deadLineTimezoneOffset = -deadLineDate.getTimezoneOffset() * staticMethod.getPeriodUnit(MINUTE);\n amendmentOnTransferTime = (currentTimezoneOffset - deadLineTimezoneOffset) * 1000;\n }\n amendment = amendmentOnTimezone + amendmentOnTransferTime;\n return differenceByLocalTimezone - amendment;\n },\n\n /**\n * Formation of numbers with leading zeros\n * @param number\n * @param isUse\n * @returns {string}\n */\n format2: function(number, isUse) {\n isUse = (isUse !== false);\n return ( ( number <= 9 ) && isUse ) ? ( \"0\" + number ) : ( \"\" + number );\n }\n };\n\n var methods = {\n setOption: function(name, value) {\n var elementBox = $(this),\n options = elementBox.data('syotimer-options');\n if ( options.hasOwnProperty( name ) ) {\n options[name] = value;\n elementBox.data('syotimer-options', options);\n }\n }\n };\n\n $.fn.syotimer = function(options){\n if ( typeof options === 'string' && ( options === \"setOption\" ) ) {\n var otherArgs = Array.prototype.slice.call(arguments, 1);\n return this.each(function() {\n methods[options].apply( this, otherArgs );\n });\n } else if (options === null || options === undefined || typeof options === 'object'){\n return SyoTimer.init.apply(this, [options]);\n } else {\n $.error('SyoTimer. Error in call methods: methods is not exist');\n }\n };\n"," $.syotimerLang = {\n rus: {\n second: ['секунда', 'секунды', 'секунд'],\n minute: ['минута', 'минуты', 'минут'],\n hour: ['час', 'часа', 'часов'],\n day: ['день', 'дня', 'дней'],\n handler: 'rusNumeral'\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 /**\n * Universal function for get correct inducement of nouns after a numeral (`number`)\n * @param number\n * @returns {number}\n */\n universal: function(number) {\n return ( number === 1 ) ? 0 : 1;\n },\n\n /**\n * Get correct inducement of nouns after a numeral for Russian language (rus)\n * @param number\n * @returns {number}\n */\n rusNumeral: function(number) {\n var cases = [2, 0, 1, 1, 1, 2],\n index;\n if ( number % 100 > 4 && number % 100 < 20 ) {\n index = 2;\n } else {\n index = cases[(number % 10 < 5) ? number % 10 : 5];\n }\n return index;\n },\n\n /**\n * Getting the correct declension of words after numerals\n * @param number\n * @param lang\n * @param unit\n * @returns {string}\n */\n getNumeral: function(number, lang, unit) {\n var handlerName = $.syotimerLang[lang].handler || 'universal',\n index = this[handlerName](number);\n return $.syotimerLang[lang][unit][index];\n }\n };\n"]}