/** @preserve jquery animatenumber plugin v0.0.10 * (c) 2013, alexandr borisov. * https://github.com/aishek/jquery-animatenumber */ // ['...'] notation using to avoid names minification by google closure compiler (function($) { var reverse = function(value) { return value.split('').reverse().join(''); }; var defaults = { numberstep: function(now, tween) { var floored_number = math.floor(now), target = $(tween.elem); target.text(floored_number); } }; var handle = function( tween ) { var elem = tween.elem; if ( elem.nodetype && elem.parentnode ) { var handler = elem._animatenumbersetter; if (!handler) { handler = defaults.numberstep; } handler(tween.now, tween); } }; if (!$.tween || !$.tween.prophooks) { $.fx.step.number = handle; } else { $.tween.prophooks.number = { set: handle }; } var extract_number_parts = function(separated_number, group_length) { var numbers = separated_number.split('').reverse(), number_parts = [], current_number_part, current_index, q; for(var i = 0, l = math.ceil(separated_number.length / group_length); i < l; i++) { current_number_part = ''; for(q = 0; q < group_length; q++) { current_index = i * group_length + q; if (current_index === separated_number.length) { break; } current_number_part = current_number_part + numbers[current_index]; } number_parts.push(current_number_part); } return number_parts; }; var remove_precending_zeros = function(number_parts) { var last_index = number_parts.length - 1, last = reverse(number_parts[last_index]); number_parts[last_index] = reverse(parseint(last, 10).tostring()); return number_parts; }; $.animatenumber = { numberstepfactories: { /** * creates numberstep handler, which appends string to floored animated number on each step. * * @example * // will animate to 100 with "1 %", "2 %", "3 %", ... * $('#someid').animatenumber({ * number: 100, * numberstep: $.animatenumber.numberstepfactories.append(' %') * }); * * @params {string} suffix string to append to animated number * @returns {function} numberstep-compatible function for use in animatenumber's parameters */ append: function(suffix) { return function(now, tween) { var floored_number = math.floor(now), target = $(tween.elem); target.prop('number', now).text(floored_number + suffix); }; }, /** * creates numberstep handler, which format floored numbers by separating them to groups. * * @example * // will animate with 1 ... 217,980 ... 95,217,980 ... 7,095,217,980 * $('#world-population').animatenumber({ * number: 7095217980, * numberstep: $.animatenumber.numberstepfactories.separator(',') * }); * * @params {string} [separator=' '] string to separate number groups * @params {string} [group_length=3] number group length * @returns {function} numberstep-compatible function for use in animatenumber's parameters */ separator: function(separator, group_length) { separator = separator || ' '; group_length = group_length || 3; return function(now, tween) { var floored_number = math.floor(now), separated_number = floored_number.tostring(), target = $(tween.elem); if (separated_number.length > group_length) { var number_parts = extract_number_parts(separated_number, group_length); separated_number = remove_precending_zeros(number_parts).join(separator); separated_number = reverse(separated_number); } target.prop('number', now).text(separated_number); }; } } }; $.fn.animatenumber = function() { var options = arguments[0], settings = $.extend({}, defaults, options), target = $(this), args = [settings]; for(var i = 1, l = arguments.length; i < l; i++) { args.push(arguments[i]); } // needs of custom step function usage if (options.numberstep) { // assigns custom step functions var items = this.each(function(){ this._animatenumbersetter = options.numberstep; }); // cleanup of custom step functions after animation var generic_complete = settings.complete; settings.complete = function() { items.each(function(){ delete this._animatenumbersetter; }); if ( generic_complete ) { generic_complete.apply(this, arguments); } }; } return target.animate.apply(target, args); }; }(jquery));