diff --git a/src/jquery.counter.js b/src/jquery.counter.js index 71a14cf..1fc9845 100644 --- a/src/jquery.counter.js +++ b/src/jquery.counter.js @@ -4,7 +4,7 @@ * Copyright (c) 2012 Sophilabs * MIT License */ - + !(function (context, definition) { if (typeof define == 'function' && typeof define.amd == 'object') define(['jquery'], definition); else definition(context['$']); @@ -20,6 +20,17 @@ return data.down ? stop >= current : stop <= current; }; + var isFired = false; // Whether counterFire is fired + var checkFire = function(data) { + var fire = 0; + var current = 0; + $.each(data.parts, function(i, part) { + fire += (fire * part.limit) + part.fire; + current += (current * part.limit) + part.value; + }); + return data.down ? fire >= current : fire <= current; + }; + var tick = function() { var e = $(this); var data = e.data('counter'); @@ -36,10 +47,33 @@ } i--; } + refresh(e, i); + if (checkStop(data)) { clearInterval(data.intervalId); - e.trigger("counterStop"); + e.trigger('counterStop'); + } + + if (!isFired && checkFire(data)) { + var current = 0, + currentStr = '', + n = data.parts.length; + $.each(data.parts, function(i, part) { + current += (current * part.limit) + part.value; + + var digits = part.value + ''; + while (digits.length < part.padding) { + digits = '0' + digits; + } + currentStr += digits; + if (i + 1 < n) { + currentStr += ':'; + } + }); + + e.trigger('counterFire', [current, currentStr]); + isFired = true; } }; @@ -158,6 +192,10 @@ if (stop) { stop = split(stop, /([^0-9]+)/); } + var fire = options.fire || e.attr('data-fire'); + if (fire) { + fire = split(fire, /([^0-9]+)/); + } e.html(''); $.each(format, function(index, value) { if (/^\d+$/.test(value)) { @@ -171,6 +209,11 @@ part.stop = parseInt(stop ? stop[stop.length - format.length + index] : (data.down ? 0 : part.limit), 10); part.stop = part.stop > part.limit ? part.limit : part.stop; part.stop = part.stop < 0 ? 0 : part.stop; + + part.fire = parseInt(fire ? fire[fire.length - format.length + index] : (data.down ? 0 : part.limit), 10); + part.fire = part.fire > part.limit ? part.limit : part.fire; + part.fire = part.fire < 0 ? 0 : part.fire; + var epart = $('').addClass('part').addClass('part' + index); var digits = part.value + ''; while (digits.length < part.padding) { @@ -185,11 +228,17 @@ e.append($('').addClass('separator').addClass('separator' + index).text(value)); } }); + if (!checkStop(data)) { data.intervalId = setInterval($.proxy(tick, this), data.interval); } else { e.trigger("counterStop"); } + + if (!isFired && checkFire(data)) { + e.trigger("counterFire"); + } + e.data('counter', data); return this; });