HEX
Server: LiteSpeed
System: Linux spg20.cloudpowerdns.com 5.14.0-611.35.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Feb 25 03:46:09 EST 2026 x86_64
User: carrerup (3153)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/carrerup/.trash/techland/libs/countTo/jquery.countTo.js
/* https://github.com/mhuggins/jquery-countTo

   CountTo */

(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);

    });

  };

}));