124 lines
4.6 KiB
JavaScript
124 lines
4.6 KiB
JavaScript
/*!
|
|
* jquery.counterup.js 2.1.0
|
|
*
|
|
* Copyright 2013, Benjamin Intal http://gambit.ph @bfintal
|
|
* Released under the GPL v2 License
|
|
*
|
|
* Amended by Jeremy Paris, Ciro Mattia Gonano and others
|
|
*
|
|
* Date: Feb 24, 2017
|
|
*/
|
|
(function ($) {
|
|
"use strict";
|
|
|
|
$.fn.counterUp = function (options) {
|
|
|
|
// Defaults
|
|
var settings = $.extend({
|
|
'time': 400,
|
|
'delay': 10,
|
|
'offset': 100,
|
|
'beginAt': 0,
|
|
'formatter': false,
|
|
'context': 'window',
|
|
callback: function () {
|
|
}
|
|
}, options),
|
|
s;
|
|
|
|
return this.each(function () {
|
|
|
|
// Store the object
|
|
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 diheaders = 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);
|
|
|
|
// Convert time to total seconds
|
|
if (isTime) {
|
|
var times = num.split(':'),
|
|
m = 1;
|
|
s = 0;
|
|
while (times.length > 0) {
|
|
s += m * parseInt(times.pop(), 10);
|
|
m *= 60;
|
|
}
|
|
}
|
|
|
|
// Generate list of incremental numbers to display
|
|
for (var i = diheaders; i >= counter.beginAt / num * diheaders; i--) {
|
|
|
|
var newNum = parseFloat(num / diheaders * i).toFixed(decimalPlaces);
|
|
|
|
// Add incremental seconds and convert back to time
|
|
if (isTime) {
|
|
newNum = parseInt(s / diheaders * 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);
|
|
}
|
|
|
|
// Preserve commas if input had commas
|
|
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);
|
|
|
|
// Updates the number until we're done
|
|
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);
|
|
|
|
// Start the count up
|
|
setTimeout($this.data('counterup-func'), counter.delay);
|
|
};
|
|
|
|
// Perform counts when the element gets into view
|
|
$this.waypoint(function (direction) {
|
|
counterUpper();
|
|
// Removed this.destroy() to allow re-triggering as requested by user
|
|
}, { offset: counter.offset + "%", context: counter.context });
|
|
});
|
|
|
|
};
|
|
|
|
})(jQuery);
|