diff options
Diffstat (limited to 'Varsity_Template/template/vendors/counter')
| -rw-r--r-- | Varsity_Template/template/vendors/counter/jquery.countTo.js | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/Varsity_Template/template/vendors/counter/jquery.countTo.js b/Varsity_Template/template/vendors/counter/jquery.countTo.js new file mode 100644 index 0000000..5940912 --- /dev/null +++ b/Varsity_Template/template/vendors/counter/jquery.countTo.js @@ -0,0 +1,130 @@ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + var CountTo = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, CountTo.DEFAULTS, this.dataOptions(), options); + this.init(); + }; + + CountTo.DEFAULTS = { + from: 0, // the number the element should start at + to: 0, // the number the element should end at + speed: 1000, // how long it should take to count between the target numbers + refreshInterval: 100, // how often the element should be updated + decimals: 0, // the number of decimal places to show + formatter: formatter, // handler for formatting the value before rendering + onUpdate: null, // callback method for every time the element is updated + onComplete: null // callback method for when the element finishes updating + }; + + CountTo.prototype.init = function () { + this.value = this.options.from; + this.loops = Math.ceil(this.options.speed / this.options.refreshInterval); + this.loopCount = 0; + this.increment = (this.options.to - this.options.from) / this.loops; + }; + + CountTo.prototype.dataOptions = function () { + var options = { + from: this.$element.data('from'), + to: this.$element.data('to'), + speed: this.$element.data('speed'), + refreshInterval: this.$element.data('refresh-interval'), + decimals: this.$element.data('decimals') + }; + + var keys = Object.keys(options); + + for (var i in keys) { + var key = keys[i]; + + if (typeof(options[key]) === 'undefined') { + delete options[key]; + } + } + + return options; + }; + + CountTo.prototype.update = function () { + this.value += this.increment; + this.loopCount++; + + this.render(); + + if (typeof(this.options.onUpdate) == 'function') { + this.options.onUpdate.call(this.$element, this.value); + } + + if (this.loopCount >= this.loops) { + clearInterval(this.interval); + this.value = this.options.to; + + if (typeof(this.options.onComplete) == 'function') { + this.options.onComplete.call(this.$element, this.value); + } + } + }; + + CountTo.prototype.render = function () { + var formattedValue = this.options.formatter.call(this.$element, this.value, this.options); + this.$element.text(formattedValue); + }; + + CountTo.prototype.restart = function () { + this.stop(); + this.init(); + this.start(); + }; + + CountTo.prototype.start = function () { + this.stop(); + this.render(); + this.interval = setInterval(this.update.bind(this), this.options.refreshInterval); + }; + + CountTo.prototype.stop = function () { + if (this.interval) { + clearInterval(this.interval); + } + }; + + CountTo.prototype.toggle = function () { + if (this.interval) { + this.stop(); + } else { + this.start(); + } + }; + + function formatter(value, options) { + return value.toFixed(options.decimals); + } + + $.fn.countTo = function (option) { + return this.each(function () { + var $this = $(this); + var data = $this.data('countTo'); + var init = !data || typeof(option) === 'object'; + var options = typeof(option) === 'object' ? option : {}; + var method = typeof(option) === 'string' ? option : 'start'; + + if (init) { + if (data) data.stop(); + $this.data('countTo', data = new CountTo(this, options)); + } + + data[method].call(data); + }); + }; +})); |
