/**

* Counter wrapper.
*
* @author Htmlstream
* @version 1.0
* @requires appear.js (v1.0.3)
*
*/

;(function($){

'use strict';

$.HSCore.components.HSCounter = {

        /**
         *
         *
         * @var Object _baseConfig
         */
        _baseConfig : {
                bounds: -100,
                debounce: 10,
                time: 6000,
                fps: 60,
                commaSeparated: false
        },

        /**
         *
         *
         * @var jQuery _pageCollection
         */
        _pageCollection : $(),

        /**
         * Initialization of Counter wrapper.
         *
         * @param String selector (optional)
         * @param Object config (optional)
         *
         * @return jQuery pageCollection - collection of initialized items.
         */
        init: function(selector, config){

                this.collection = $(selector) && $(selector).length ? $(selector) : $();
                if(!this.collection.length) return;

                this.config = config && $.isPlainObject(config) ? $.extend({}, this._baseConfig, config) : this._baseConfig;
                this.config.itemSelector = selector;

                this.initCounters();

        },

        /**
         * Initialization of each Counter of the page.
         *
         * @return undefined
         */
        initCounters: function() {

                var self = this;

                appear({

                        bounds: self.config['bounds'],
                        debounce: self.config['debounce'],

                        init: function() {

                                self.collection.each(function(i, el) {

                                        var $item = $(el),
                                                        value = parseInt($item.text(), 10);

                                                $item.text('0').data('value', value);

                                                self._pageCollection = self._pageCollection.add($item);

                                });

                        },

                        elements: function() {
                                return document.querySelectorAll(self.config['itemSelector']);
                        },

                        appear: function(el) {

                                var $item = $(el),
                                                counter = 1,
                                                endValue = $item.data('value'),
                                                iterationValue = parseInt(endValue / ((self.config['time'] / self.config['fps'])), 10),
                                                isCommaSeparated = $item.data('comma-separated'),
                                                isReduced = $item.data('reduce-thousands-to');

                                if(iterationValue == 0) iterationValue = 1;

                                $item.data('intervalId', setInterval(function(){

                                        if(isCommaSeparated){

                                                $item.text(self.getCommaSeparatedValue(counter+= iterationValue));

                                        }
                                        else if(isReduced) {
                                                $item.text(self.getCommaReducedValue(counter+= iterationValue, isReduced));
                                        }
                                        else {

                                                $item.text(counter+= iterationValue);
                                        }

                                        if(counter > endValue) {

                                                clearInterval($item.data('intervalId'));
                                                if(isCommaSeparated) {
                                                        $item.text(self.getCommaSeparatedValue(endValue));
                                                }
                                                else if(isReduced) {
                                                        $item.text(self.getCommaReducedValue(endValue, isReduced));
                                                }
                                                else {
                                                        $item.text(endValue);
                                                }

                                                return;

                                        }

                                }, self.config['time'] / self.config['fps']));

                        }

                });

        },

        /**
         *
         *
         * @param Number value
         *
         * @return String
         */
        getCommaReducedValue: function(value, additionalText) {

                return parseInt(value / 1000, 10) + additionalText;

        },

        /**
         * Returns comma separated value.
         *
         * @param Number value
         *
         * @return String
         */
        getCommaSeparatedValue: function(value) {

                value = new String(value);

                switch(value.length) {

                        case 4:

                                return value.substr(0, 1) + ',' + value.substr(1);

                        break;

                        case 5:

                                return value.substr(0, 2) + ',' + value.substr(2);

                        break;

                        case 6:

                                return value.substr(0, 3) + ',' + value.substr(3);

                        break;
                        case 7:

                                value = value.substr(0, 1) + ',' + value.substr(1);
                                return value.substr(0, 5) + ',' + value.substr(5);

                        break;

                        case 8:

                                value = value.substr(0, 2) + ',' + value.substr(2);
                                return value.substr(0, 6) + ',' + value.substr(6);

                        break;

                        case 9:

                                value = value.substr(0, 3) + ',' + value.substr(3);
                                return value.substr(0, 7) + ',' + value.substr(7);

                        break;

                        case 10:

                                value = value.substr(0, 1) + ',' + value.substr(1);
                                value = value.substr(0, 5) + ',' + value.substr(5);
                                return value.substr(0, 9) + ',' + value.substr(9);

                        break;

                        default:

                                return value;

                }

        }

};

})(jQuery);