/*!

* jquery.counterup.js 1.0

*

* Copyright 2013, Benjamin Intal http://gambit.ph @bfintal

* Released under the GPL v2 License

*

* Date: Nov 26, 2013

*/

(function( $ ){

  "use strict";



  $.fn.counterUp = function( options ) {



    // Defaults

    var settings = $.extend({

        'time': 400,

        'delay': 10

    }, options);



    return this.each(function(){



        // Store the object

        var $this = $(this);

        var $settings = settings;



        var counterUpper = function() {

            var divisions = $settings.time / $settings.delay;

            var num = $this.attr('data-value');

            var nums = [num];

            var isComma = /[0-9]+,[0-9]+/.test(num);

            num = num.replace(/,/g, '');

            var isInt = /^[0-9]+$/.test(num);

            var isFloat = /^[0-9]+\.[0-9]+$/.test(num);

            var decimalPlaces = isFloat ? (num.split('.')[1] || []).length : 0;



            // Generate list of incremental numbers to display

            for (var i = divisions; i >= 1; i--) {



                // Preserve as int if input was int

                var newNum = parseInt(num / divisions * i);



                // Preserve float if input was float

                if (isFloat) {

                    newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces);

                }



                // Preserve commas if input had commas

                if (isComma) {

                    while (/(\d+)(\d{3})/.test(newNum.toString())) {

                        newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1'+','+'$2');

                    }

                }



                nums.unshift(newNum);

            }



            $this.data('counterup-nums', nums);

            $this.text('0');



            // Updates the number until we're done

            var f = function() {

                $this.text($this.data('counterup-nums').shift());

                if ($this.data('counterup-nums').length) {

                    setTimeout($this.data('counterup-func'), $settings.delay);

                } else {

                    delete $this.data('counterup-nums');

                    $this.data('counterup-nums', null);

                    $this.data('counterup-func', null);

                }

            };

            $this.data('counterup-func', f);



            // Start the count up

            setTimeout($this.data('counterup-func'), $settings.delay);

        };



        // Perform counts when the element gets into view

        $this.waypoint(counterUpper, { offset: '100%', triggerOnce: true });

    });



  };



})( jQuery );