/** * Time-To jQuery plug-in * Show countdown timer or realtime clock * * @author Oleksii Teterin * @version 1.3.0 * @license MIT http://opensource.org/licenses/MIT * @date 2019-05-14 */ (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof exports==="object"){module.exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){var SECONDS_PER_DAY=86400;var SECONDS_PER_HOUR=3600;var defaults={callback:null,step:null,stepCount:1,captionSize:0,countdown:true,countdownAlertLimit:10,displayCaptions:false,displayDays:0,displayHours:true,fontFamily:"Verdana, sans-serif",fontSize:0,lang:"en",languages:{},seconds:0,start:true,theme:"white",width:25,height:30,gap:11,vals:[0,0,0,0,0,0,0,0,0],limits:[9,9,9,2,9,5,9,5,9],iSec:8,iHour:4,tickTimeout:1e3,intervalId:null,tickCount:0};var methods={start:function(sec){var intervalId;if(sec){init.call(this,sec);intervalId=setTimeout(tick.bind(this),1e3);this.data("ttStartTime",$.now());this.data("intervalId",intervalId)}},stop:function(){var data=this.data();if(data.intervalId){clearTimeout(data.intervalId);this.data("intervalId",null)}return data},reset:function(sec){var data=methods.stop.call(this);var secs=typeof sec==="undefined"?data.seconds:sec;this.find("div").css({backgroundPosition:"left center"});this.find("ul").parent().removeClass("timeTo-alert");init.call(this,secs,true)}};var dictionary={en:{days:"days",hours:"hours",min:"minutes",sec:"seconds"},ru:{days:"дней",hours:"часов",min:"минут",sec:"секунд"},ua:{days:"днiв",hours:"годин",min:"хвилин",sec:"секунд"},de:{days:"Tag",hours:"Uhr",min:"Minuten",sec:"Secunden"},fr:{days:"jours",hours:"heures",min:"minutes",sec:"secondes"},es:{days:"días",hours:"horas",min:"minutos",sec:"segundos"},sp:{days:"días",hours:"horas",min:"minutos",sec:"segundos"},it:{days:"giorni",hours:"ore",min:"minuti",sec:"secondi"},nl:{days:"dagen",hours:"uren",min:"minuten",sec:"seconden"},no:{days:"dager",hours:"timer",min:"minutter",sec:"sekunder"},pt:{days:"dias",hours:"horas",min:"minutos",sec:"segundos"},tr:{days:"gün",hours:"saat",min:"dakika",sec:"saniye"},pl:{days:"dni",hours:"godziny",min:"minuty",sec:"secundy"}};if(typeof $.support.transition==="undefined"){$.support.transition=function(){var thisBody=document.body||document.documentElement;var thisStyle=thisBody.style;var support=thisStyle.transition!==undefined||thisStyle.WebkitTransition!==undefined||thisStyle.MozTransition!==undefined||thisStyle.MsTransition!==undefined||thisStyle.OTransition!==undefined;return support}()}$.fn.timeTo=function(){var options={};var now=Date.now();var j,arg,num,method,time,days,tt,sec,m,t;for(j=0;jnow){options.seconds=Math.floor((time-now)/1e3)}else{options.seconds=0}}else if(options.time||!options.seconds){time=options.time;if(!time){time=new Date(now)}if(typeof time==="object"&&time.getTime){options.seconds=time.getDate()*SECONDS_PER_DAY+time.getHours()*SECONDS_PER_HOUR+time.getMinutes()*60+time.getSeconds();options.countdown=false}else if(typeof time==="string"){tt=time.split(":");sec=0;m=1;while(tt.length){t=tt.pop();sec+=t*m;m*=60}options.seconds=sec;options.countdown=false}}if(options.countdown!==false&&options.seconds>SECONDS_PER_DAY&&typeof options.displayDays==="undefined"){days=Math.floor(options.seconds/SECONDS_PER_DAY);options.displayDays=days<10&&1||days<100&&2||3}else if(options.displayDays===true){options.displayDays=3}else if(options.displayDays){options.displayDays=options.displayDays>0?Math.floor(options.displayDays):3}return this.each(function(){var $this=$(this);var data=$this.data();var defs,opt,i,css,language,left,ulhtml,style,dhtml1,dhtml2,dot2,maxWidth,captionSize,fsStyleVal,fsStyle,thtml,marginRight,dhtml,$digits,dif,vals,limits;if(data.intervalId){clearInterval(data.intervalId);data.intervalId=null}if(!data.vals){if(data.opt){opt=data.options}else{opt=options}defs=Object.keys(defaults).reduce(function(obj,key){if(Array.isArray(defaults[key])){obj[key]=defaults[key].slice(0)}else{obj[key]=defaults[key]}return obj},{});data=$.extend(defs,opt);data.options=opt;data.height=Math.round(data.fontSize*100/93)||data.height;data.width=Math.round(data.fontSize*.8+data.height*.13)||data.width;data.displayHours=!!(data.displayDays||data.displayHours);css={fontFamily:data.fontFamily};if(data.fontSize>0){css.fontSize=data.fontSize+"px"}language=data.languages[data.lang]||dictionary[data.lang];$this.addClass("timeTo").addClass("timeTo-"+data.theme).css(css);left=Math.round(data.height/10);ulhtml='';style=data.fontSize?' style="width:'+data.width+"px; height:"+data.height+'px;"':' style=""';dhtml1='
"+ulhtml;dhtml2=""+ulhtml;dot2=":";maxWidth=Math.round(data.width*2+3);captionSize=data.captionSize||data.fontSize&&Math.round(data.fontSize*.43);fsStyleVal=captionSize?"font-size:"+captionSize+"px;":"";fsStyle=captionSize?' style="'+fsStyleVal+'"':"";thtml=(data.displayCaptions?(data.displayHours?'
$1"+language.hours+"
"+dot2:"")+'
$1"+language.min+"
"+dot2+'
$1"+language.sec+"
":(data.displayHours?"$1"+dot2:"")+"$1"+dot2+"$1").replace(/\$1/g,dhtml1+dhtml2);if(data.displayDays>0){marginRight=Math.round(data.fontSize*.4||defaults.gap);dhtml=dhtml1;for(i=data.displayDays-1;i>0;i-=1){dhtml+=i===1?dhtml2.replace('">',"margin-right:"+marginRight+'px">'):dhtml2}if(data.displayDays===1){dhtml=dhtml.replace('">',"margin-right:"+marginRight+'px">')}thtml=(data.displayCaptions?'
$1'+'
'+language.days+"
":"$1").replace(/\$1/,dhtml)+thtml}$this.html(thtml)}else if(method!=="reset"){$.extend(data,options)}$digits=$this.find("div");if($digits.length=0;i-=1,j-=1){val=parseInt(str.substr(j,1),10);data.vals[i]=val;$digits.eq(i).children().html(val)}if(isInterval||force){data.ttStartTime=Date.now();data.intervalId=setTimeout(tick.bind(this),1e3);this.data("intervalId",data.intervalId)}}function tick(digit){var me=this;var $digits=this.find("ul");var data=this.data();var n,$ul,$li,step,tickTimeout,timeDiff;if(!data.vals||$digits.length===0){if(data.intervalId){clearTimeout(data.intervalId);this.data("intervalId",null)}if(data.callback){data.callback()}return}if(typeof digit==="undefined"){digit=data.iSec}this.data("tickCount",data.tickCount+1);n=data.vals[digit];$ul=$digits.eq(digit);$li=$ul.children();step=data.countdown?-1:1;$li.eq(1).html(n);n+=step;if(typeof data.step==="function"&&data.tickCount%data.stepCount===0){this.data("tickCount",0);data.step()}if(digit===data.iSec){tickTimeout=data.tickTimeout;timeDiff=Date.now()-data.ttStartTime;data.sec+=step;tickTimeout+=Math.abs(data.seconds-data.sec)*tickTimeout-timeDiff;data.intervalId=setTimeout(tick.bind(this),tickTimeout)}if(n<0||n>data.limits[digit]){if(n<0){n=data.limits[digit];if(digit===data.iHour&&data.displayDays>0&&data.vals[digit-1]===0){n=3}}else{n=0}if(digit>0){tick.call(this,digit-1)}}else if(!data.countdown&&digit===data.iHour&&data.displayDays>0&&data.vals[digit-1]===2&&data.vals[digit]===3){n=0;tick.call(this,digit-1)}$li.eq(0).html(n);if($.support.transition){$ul.addClass("transition");$ul.css({top:0});setTimeout(function(){$ul.removeClass("transition");$li.eq(1).html(n);$ul.css({top:"-"+data.height+"px"});if(step>0||digit!==data.iSec){return}if(data.sec===data.countdownAlertLimit){$digits.parent().addClass("timeTo-alert")}if(data.sec===0){$digits.parent().removeClass("timeTo-alert");if(data.intervalId){clearTimeout(data.intervalId);me.data("intervalId",null)}if(typeof data.callback==="function"){data.callback()}}},410)}else{$ul.stop().animate({top:0},400,digit!==data.iSec?null:function(){$li.eq(1).html(n);$ul.css({top:"-"+data.height+"px"});if(step>0||digit!==data.iSec){return}if(data.sec===data.countdownAlertLimit){$digits.parent().addClass("timeTo-alert")}else if(data.sec===0){$digits.parent().removeClass("timeTo-alert");if(data.intervalId){clearTimeout(data.intervalId);me.data("intervalId",null)}if(typeof data.callback==="function"){data.callback()}}})}data.vals[digit]=n}return $});