/**

* AutoRefresh Plugin
* @version 2.3.4
* @author Artus Kolanowski
* @author David Deutsch
* @license The MIT License (MIT)
*/

;(function($, window, document, undefined) {

/**
 * Creates the auto refresh plugin.
 * @class The Auto Refresh Plugin
 * @param {Owl} carousel - The Owl Carousel
 */
var AutoRefresh = function(carousel) {
        /**
         * Reference to the core.
         * @protected
         * @type {Owl}
         */
        this._core = carousel;

        /**
         * Refresh interval.
         * @protected
         * @type {number}
         */
        this._interval = null;

        /**
         * Whether the element is currently visible or not.
         * @protected
         * @type {Boolean}
         */
        this._visible = null;

        /**
         * All event handlers.
         * @protected
         * @type {Object}
         */
        this._handlers = {
                'initialized.owl.carousel': $.proxy(function(e) {
                        if (e.namespace && this._core.settings.autoRefresh) {
                                this.watch();
                        }
                }, this)
        };

        // set default options
        this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);

        // register event handlers
        this._core.$element.on(this._handlers);
};

/**
 * Default options.
 * @public
 */
AutoRefresh.Defaults = {
        autoRefresh: true,
        autoRefreshInterval: 500
};

/**
 * Watches the element.
 */
AutoRefresh.prototype.watch = function() {
        if (this._interval) {
                return;
        }

        this._visible = this._core.isVisible();
        this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
};

/**
 * Refreshes the element.
 */
AutoRefresh.prototype.refresh = function() {
        if (this._core.isVisible() === this._visible) {
                return;
        }

        this._visible = !this._visible;

        this._core.$element.toggleClass('owl-hidden', !this._visible);

        this._visible && (this._core.invalidate('width') && this._core.refresh());
};

/**
 * Destroys the plugin.
 */
AutoRefresh.prototype.destroy = function() {
        var handler, property;

        window.clearInterval(this._interval);

        for (handler in this._handlers) {
                this._core.$element.off(handler, this._handlers[handler]);
        }
        for (property in Object.getOwnPropertyNames(this)) {
                typeof this[property] != 'function' && (this[property] = null);
        }
};

$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;

})(window.Zepto || window.jQuery, window, document);