/*!
 * 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 nums = [];
				var divisions = $settings.time / $settings.delay;
				var num = $this.text();
				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 );
