-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathtock.min.js
1 lines (1 loc) · 4.65 KB
/
tock.min.js
1
Date.now=Date.now||function(){return+new Date};if(typeof Function.prototype.bind!="function"){Function.prototype.bind=function(ctx){var args=Array.prototype.slice.call(arguments,1),fn=this;return function(){args.push.apply(args,arguments);return fn.apply(ctx,args)}}}(function(root,factory){if(typeof define==="function"&&define.amd){define(factory)}else if(typeof exports==="object"){module.exports=factory()}else{root.Tock=factory()}})(this,function(){function _tick(){this.time+=this.interval;if(this.countdown&&this.duration_ms-this.time<0){this.final_time=0;this.go=false;this.callback(this);clearTimeout(this.timeout);this.complete(this);return}else{this.callback(this)}var diff=Date.now()-this.start_time-this.time,next_interval_in=diff>0?this.interval-diff:this.interval;if(next_interval_in<=0){this.missed_ticks=Math.floor(Math.abs(next_interval_in)/this.interval);this.time+=this.missed_ticks*this.interval;if(this.go){_tick.call(this)}}else if(this.go){this.timeout=setTimeout(_tick.bind(this),next_interval_in)}}function _startCountdown(duration){this.duration_ms=duration;this.start_time=Date.now();this.time=0;this.go=true;_tick.call(this)}function _startTimer(start_offset){this.start_time=start_offset||Date.now();this.time=0;this.go=true;_tick.call(this)}var MILLISECONDS_RE=/^\s*(\+|-)?\d+\s*$/,MM_SS_RE=/^(\d{1,2}):(\d{2})$/,MM_SS_ms_OR_HH_MM_SS_RE=/^(\d{1,2}):(\d{2})(?::|\.)(\d{2,3})$/,MS_PER_HOUR=36e5,MS_PER_MIN=6e4,MS_PER_SEC=1e3,yyyy_mm_dd_HH_MM_SS_ms_RE=/^(\d{4})-([0-1]\d)-([0-3]\d)(?:\s|T)(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3})Z?)?$/;var Tock=function(options){options=options||{};if(!(this instanceof Tock))return new Tock(options);Tock.instances=(Tock.instances||0)+1;this.go=false;this.timeout=null;this.missed_ticks=null;this.interval=options.interval||10;this.countdown=options.countdown||false;this.start_time=0;this.pause_time=0;this.final_time=0;this.duration_ms=0;this.time=0;this.callback=options.callback||function(){};this.complete=options.complete||function(){}};Tock.prototype.reset=function(){if(this.countdown){return false}this.stop();this.start_time=0;this.time=0};Tock.prototype.start=function(time){if(this.go)return false;time=time?this.timeToMS(time):0;this.start_time=time;this.pause_time=0;if(this.countdown){_startCountdown.call(this,time)}else{_startTimer.call(this,Date.now()-time)}};Tock.prototype.stop=function(){this.pause_time=this.lap();this.go=false;clearTimeout(this.timeout);if(this.countdown){this.final_time=this.duration_ms-this.time}else{this.final_time=Date.now()-this.start_time}};Tock.prototype.pause=function(){if(this.go){this.pause_time=this.lap();this.stop()}else{if(this.pause_time){if(this.countdown){_startCountdown.call(this,this.pause_time)}else{_startTimer.call(this,Date.now()-this.pause_time)}this.pause_time=0}}};Tock.prototype.lap=function(){if(this.go){var now;if(this.countdown){now=this.duration_ms-(Date.now()-this.start_time)}else{now=Date.now()-this.start_time}return now}return this.pause_time||this.final_time};Tock.prototype.msToTime=function(ms){var milliseconds=this.zeroPad(ms%MS_PER_SEC,3),seconds=this.zeroPad(Math.floor(ms/MS_PER_SEC%60),2),minutes=this.zeroPad(Math.floor(ms/MS_PER_MIN%60),2);return minutes+":"+seconds+"."+milliseconds};Tock.prototype.zeroPad=function(input,length){input=input.toString();while(input.length<length){input="0"+input}return input};Tock.prototype.msToTimecode=function(ms,show_ms){var seconds=this.zeroPad(Math.floor(ms/MS_PER_SEC%60),2),minutes=this.zeroPad(Math.floor(ms/MS_PER_MIN%60),2),hours=this.zeroPad(Math.floor(ms/MS_PER_HOUR),2),millisec=show_ms?":"+this.zeroPad(Math.floor(ms%MS_PER_SEC),3):"";return hours+":"+minutes+":"+seconds+millisec};Tock.prototype.timeToMS=function(time){if(MILLISECONDS_RE.test(String(time))){return time}var ms,time_split,match,date,now=new Date;if(MM_SS_RE.test(time)){time_split=time.split(":");ms=parseInt(time_split[0],10)*MS_PER_MIN;ms+=parseInt(time_split[1],10)*MS_PER_SEC}else{match=time.match(MM_SS_ms_OR_HH_MM_SS_RE);if(match){if(match[3].length==3||parseInt(match[3],10)>59){ms=parseInt(match[1],10)*MS_PER_MIN;ms+=parseInt(match[2],10)*MS_PER_SEC;ms+=parseInt(match[3],10)}else{ms=parseInt(match[1],10)*MS_PER_HOUR;ms+=parseInt(match[2],10)*MS_PER_MIN;ms+=parseInt(match[3],10)*MS_PER_SEC}}else if(yyyy_mm_dd_HH_MM_SS_ms_RE.test(time)){date=new Date;now=new Date;match=time.match(yyyy_mm_dd_HH_MM_SS_ms_RE);date.setYear(match[1]);date.setMonth(match[2]);date.setDate(match[3]);date.setHours(match[4]);date.setMinutes(match[5]);date.setSeconds(match[6]);if(typeof match[7]!=="undefined"){date.setMilliseconds(match[7])}ms=Math.max(0,date.getTime()-now.getTime())}else{now=new Date;ms=Date.parse(time);if(!isNaN(ms)){ms=Math.max(0,ms-now.getTime())}else{ms=0}}}return ms};return Tock});