/*! lg-autoplay - v1.0.4 - 2017-03-28

(function (root, factory) {

if (typeof define === 'function' && define.amd) {
  // AMD. Register as an anonymous module unless amdModuleId is set
  define(['jquery'], function (a0) {
    return (factory(a0));
  });
} else if (typeof exports === 'object') {
  // Node. Does not work with strict CommonJS, but
  // only CommonJS-like environments that support module.exports,
  // like Node.
  module.exports = factory(require('jquery'));
} else {
  factory(jQuery);
}

}(this, function ($) {

(function() {

'use strict';

var defaults = {
    autoplay: false,
    pause: 5000,
    progressBar: true,
    fourceAutoplay: false,
    autoplayControls: true,
    appendAutoplayControlsTo: '.lg-toolbar'
};

/**
 * Creates the autoplay plugin.
 * @param {object} element - lightGallery element
 */
var Autoplay = function(element) {

    this.core = $(element).data('lightGallery');

    this.$el = $(element);

    // Execute only if items are above 1
    if (this.core.$items.length < 2) {
        return false;
    }

    this.core.s = $.extend({}, defaults, this.core.s);
    this.interval = false;

    // Identify if slide happened from autoplay
    this.fromAuto = true;

    // Identify if autoplay canceled from touch/drag
    this.canceledOnTouch = false;

    // save fourceautoplay value
    this.fourceAutoplayTemp = this.core.s.fourceAutoplay;

    // do not allow progress bar if browser does not support css3 transitions
    if (!this.core.doCss()) {
        this.core.s.progressBar = false;
    }

    this.init();

    return this;
};

Autoplay.prototype.init = function() {
    var _this = this;

    // append autoplay controls
    if (_this.core.s.autoplayControls) {
        _this.controls();
    }

    // Create progress bar
    if (_this.core.s.progressBar) {
        _this.core.$outer.find('.lg').append('<div class="lg-progress-bar"><div class="lg-progress"></div></div>');
    }

    // set progress
    _this.progress();

    // Start autoplay
    if (_this.core.s.autoplay) {
        _this.$el.one('onSlideItemLoad.lg.tm', function() {
            _this.startlAuto();
        });
    }

    // cancel interval on touchstart and dragstart
    _this.$el.on('onDragstart.lg.tm touchstart.lg.tm', function() {
        if (_this.interval) {
            _this.cancelAuto();
            _this.canceledOnTouch = true;
        }
    });

    // restore autoplay if autoplay canceled from touchstart / dragstart
    _this.$el.on('onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm', function() {
        if (!_this.interval && _this.canceledOnTouch) {
            _this.startlAuto();
            _this.canceledOnTouch = false;
        }
    });

};

Autoplay.prototype.progress = function() {

    var _this = this;
    var _$progressBar;
    var _$progress;

    _this.$el.on('onBeforeSlide.lg.tm', function() {

        // start progress bar animation
        if (_this.core.s.progressBar && _this.fromAuto) {
            _$progressBar = _this.core.$outer.find('.lg-progress-bar');
            _$progress = _this.core.$outer.find('.lg-progress');
            if (_this.interval) {
                _$progress.removeAttr('style');
                _$progressBar.removeClass('lg-start');
                setTimeout(function() {
                    _$progress.css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
                    _$progressBar.addClass('lg-start');
                }, 20);
            }
        }

        // Remove setinterval if slide is triggered manually and fourceautoplay is false
        if (!_this.fromAuto && !_this.core.s.fourceAutoplay) {
            _this.cancelAuto();
        }

        _this.fromAuto = false;

    });
};

// Manage autoplay via play/stop buttons
Autoplay.prototype.controls = function() {
    var _this = this;
    var _html = '<span class="lg-autoplay-button lg-icon"></span>';

    // Append autoplay controls
    $(this.core.s.appendAutoplayControlsTo).append(_html);

    _this.core.$outer.find('.lg-autoplay-button').on('click.lg', function() {
        if ($(_this.core.$outer).hasClass('lg-show-autoplay')) {
            _this.cancelAuto();
            _this.core.s.fourceAutoplay = false;
        } else {
            if (!_this.interval) {
                _this.startlAuto();
                _this.core.s.fourceAutoplay = _this.fourceAutoplayTemp;
            }
        }
    });
};

// Autostart gallery
Autoplay.prototype.startlAuto = function() {
    var _this = this;

    _this.core.$outer.find('.lg-progress').css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
    _this.core.$outer.addClass('lg-show-autoplay');
    _this.core.$outer.find('.lg-progress-bar').addClass('lg-start');

    _this.interval = setInterval(function() {
        if (_this.core.index + 1 < _this.core.$items.length) {
            _this.core.index++;
        } else {
            _this.core.index = 0;
        }

        _this.fromAuto = true;
        _this.core.slide(_this.core.index, false, false, 'next');
    }, _this.core.s.speed + _this.core.s.pause);
};

// cancel Autostart
Autoplay.prototype.cancelAuto = function() {
    clearInterval(this.interval);
    this.interval = false;
    this.core.$outer.find('.lg-progress').removeAttr('style');
    this.core.$outer.removeClass('lg-show-autoplay');
    this.core.$outer.find('.lg-progress-bar').removeClass('lg-start');
};

Autoplay.prototype.destroy = function() {

    this.cancelAuto();
    this.core.$outer.find('.lg-progress-bar').remove();
};

$.fn.lightGallery.modules.autoplay = Autoplay;

})();

}));