(function($) { "use strict"; $.fn.counterUp = function(options) { var settings = $.extend({ time: 400, delay: 10, offset: 100, beginAt: 0, formatter: false, context: "window", callback: function() {} }, options), s; return this.each(function() { var $this = $(this), counter = { time: $(this).data("counterup-time") || settings.time, delay: $(this).data("counterup-delay") || settings.delay, offset: $(this).data("counterup-offset") || settings.offset, beginAt: $(this).data("counterup-beginat") || settings.beginAt, context: $(this).data("counterup-context") || settings.context }; var counterUpper = function() { var nums = []; var divisions = counter.time / counter.delay; var num = $(this).attr("data-num") ? $(this).attr("data-num") : $this.text(); var isComma = /[0-9]+,[0-9]+/.test(num); num = num.replace(/,/g, ""); var decimalPlaces = (num.split(".")[1] || []).length; if (counter.beginAt > num) counter.beginAt = num; var isTime = /[0-9]+:[0-9]+:[0-9]+/.test(num); if (isTime) { var times = num.split(":"), m = 1; s = 0; while (times.length > 0) { s += m * parseInt(times.pop(), 10); m *= 60 } } for (var i = divisions; i >= counter.beginAt / num * divisions; i--) { var newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces); if (isTime) { newNum = parseInt(s / divisions * i); var hours = parseInt(newNum / 3600) % 24; var minutes = parseInt(newNum / 60) % 60; var seconds = parseInt(newNum % 60, 10); newNum = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds) } if (isComma) { while (/(\d+)(\d{3})/.test(newNum.toString())) { newNum = newNum.toString().replace(/(\d+)(\d{3})/, "$1" + "," + "$2") } } if (settings.formatter) { newNum = settings.formatter.call(this, newNum) } nums.unshift(newNum) } $this.data("counterup-nums", nums); $this.text(counter.beginAt); var f = function() { if (!$this.data("counterup-nums")) { settings.callback.call(this); return } $this.html($this.data("counterup-nums").shift()); if ($this.data("counterup-nums").length) { setTimeout($this.data("counterup-func"), counter.delay) } else { $this.data("counterup-nums", null); $this.data("counterup-func", null); settings.callback.call(this) } }; $this.data("counterup-func", f); setTimeout($this.data("counterup-func"), counter.delay) }; $this.waypoint(function(direction) { counterUpper(); this.destroy() }, { offset: counter.offset + "%", context: counter.context }) }) } })(jQuery);