(function($) { $.fn.registerCountdown = function(onExpire) { var endtime = this.attr('data-endtime'); var now = new Date(); now.setTime(this.attr('data-now')); var stringTemplate = this.attr('data-template'); var element = this; var id = element.attr('id'); getTimeRemaining = function(endtime){ var remainingTime = endtime - Date.parse(now); var seconds = Math.floor( (remainingTime/1000) % 60 ); var minutes = Math.floor( (remainingTime/1000/60) % 60 ); var hours = Math.floor( (remainingTime/(1000*60*60)) % 24 ); return { 'total': remainingTime, 'hours' : hours, 'minutes': minutes, 'seconds': seconds }; }; initializeClock = function(endtime){ function updateClock(){ now.setSeconds(now.getSeconds() + 1); var time = getTimeRemaining(endtime); if($('#'+id).html() != undefined){ if(time.total <= 0){ clearInterval(registeredInterval); onExpire(); element.parent().css('animation', '0.5s linear 0s normal none 3 running blink'); element.find('span').text(sprintf(stringTemplate, ['00', '00', '00'])); }else{ element.find('span').text(sprintf(stringTemplate, [addLeadingZero(time.hours.toString()), addLeadingZero(time.minutes.toString()), addLeadingZero(time.seconds)])); } } } var time = getTimeRemaining(endtime); if(time.total > 0){ updateClock(); } var registeredInterval = setInterval(updateClock,1000); }; addLeadingZero = function(time){ return ('0' + time).slice(-2); }; sprintf = function(string, values){ $.each(values, function(key, value){ var regex = '%'+(key+1); string = string.replace(new RegExp(regex, 'g'), value); }); return string; } initializeClock(endtime); }; }(jQuery));