');
this.$timer = $timer;
this.$elmt.prepend($timer);
}
// Overlay
if (overlay) {
$overlay = $('
');
if (typeof overlay === 'string') {
$overlay.css('background-image', 'url(' + overlay + ')');
}
this.$overlay = $overlay;
this.$elmt.prepend($overlay);
}
// Container
this.$elmt.addClass('vegas-container');
if (!isBody) {
this.$elmt.append($wrapper);
}
this.trigger('init');
this._goto(this.slide);
},
_preload: function () {
var video, img, i;
for (i = 0; i < this.settings.slides.length; i++) {
if (this.settings.preload || this.settings.preloadImages) {
if (this.settings.slides[i].src) {
img = new Image();
img.src = this.settings.slides[i].src;
}
}
if (this.settings.preload || this.settings.preloadVideos) {
if (this.support.video && this.settings.slides[i].video) {
video = this._video(this.settings.slides[i].video);
video.preload = true;
video.muted = true;
videoCache[this.settings.slides[i].video.toString()] = video;
}
}
}
},
_slideShow: function () {
var self = this;
if (this.total > 1 && !this.paused && !this.noshow) {
this.timeout = setTimeout(function () {
self.next();
}, this._options('delay'));
}
},
_timer: function (state) {
var self = this;
clearTimeout(this.timeout);
if (!this.$timer) {
return;
}
this.$timer
.removeClass('vegas-timer-running')
.find('div')
.css('transition-duration', '0ms');
if (this.paused || this.noshow) {
return;
}
if (state) {
setTimeout(function () {
self.$timer
.addClass('vegas-timer-running')
.find('div')
.css('transition-duration', self._options('delay') - 100 + 'ms');
}, 100);
}
},
_video: function (srcs) {
var video,
source;
if (videoCache[srcs.toString()]) {
return videoCache[srcs.toString()];
}
if (srcs instanceof Array === false) {
srcs = [ srcs ];
}
video = document.createElement('video');
srcs.forEach(function (src) {
source = document.createElement('source');
source.src = src;
video.appendChild(source);
});
return video;
},
_options: function (key, i) {
if (i === undefined) {
i = this.slide;
}
if (this.settings.slides[i][key] !== undefined) {
return this.settings.slides[i][key];
}
return this.settings[key];
},
_goto: function (nb) {
if (typeof this.settings.slides[nb] === 'undefined') {
nb = 0;
}
this.slide = nb;
var $slide,
self = this,
$slides = this.$elmt.children('.vegas-slide'),
src = this.settings.slides[nb].src,
videos = this.settings.slides[nb].video,
delay = this._options('delay'),
duration = this._options('transitionDelay'),
align = this._options('align'),
valign = this._options('valign'),
color = this._options('color') || this.$elmt.css('background-color'),
fill = this._options('fill') ? 'cover' : 'contain',
transition = this._options('transition'),
total = $slides.length,
isRandom = transition === 'random',
video,
img;
if (isRandom) {
transition = this.transitions[Math.floor(Math.random() * (this.transitions.length - 1))];
}
if (transition !== 'none' && this.transitions.indexOf(transition) < 0) {
console.error("Vegas: Transition " + transition + " doesn't exist.");
}
if (duration > delay) {
duration = delay;
}
// Video ?
if (this.support.video && videos) {
video = this._video(videos);
$slide = $(video)
.addClass('vegas-video')
.addClass('vegas-slide')
.addClass('vegas-transition-' + transition)
.css('background-color', color);
if (this.support.objectFit) {
$slide
.css('object-position', align + ' ' + valign)
.css('object-fit', fill)
.css('width', '100%')
.css('height', '100%');
} else if (fill === 'contain') {
$slide
.css('width', '100%')
.css('height', '100%');
}
// Image ?
} else {
img = new Image();
$slide = $('
')
.addClass('vegas-slide')
.addClass('vegas-transition-' + transition)
.css('background-image', 'url(' + src + ')')
.css('background-color', color)
.css('background-position', align + ' ' + valign)
.css('background-size', fill);
}
if (!self.support.transition) {
$slide.css('display', 'none');
}
if (total) {
$slides.eq(total - 1).after($slide);
} else {
this.$elmt.prepend($slide);
}
$slides
.css('transition', 'all 0ms')
.each(function () {
this.className = ' vegas-slide';
this.className += ' vegas-transition-' + transition;
this.className += ' vegas-transition-' + transition + '-in';
if (this.tagName === 'VIDEO') {
this.className += ' vegas-video';
}
}
);
self._timer(false);
function go () {
self._timer(true);
setTimeout(function () {
if (self.support.transition) {
$slides
.css('transition', 'all ' + duration + 'ms')
.addClass('vegas-transition-' + transition + '-out');
}
$slide
.css('transition', 'all ' + duration + 'ms')
.addClass('vegas-transition-' + transition + '-in');
if (!self.support.transition) {
$slide.fadeIn(duration);
}
for (var i = 0; i < $slides.length - 1; i++) {
$slides.eq(i).remove();
}
self.trigger('walk');
self._slideShow();
}, 100);
}
if (video) {
if (video.readyState === 4) {
video.currentTime = 0;
video.play();
go();
} else {
video.oncanplay = function () {
video.play();
if (!video._started) {
video._started = true;
go();
}
};
}
} else {
img.src = src;
img.onload = go;
}
},
shuffle: function () {
var temp,
rand;
for (var i = this.total - 1; i > 0; i--) {
rand = Math.floor(Math.random() * (i + 1));
temp = this.settings.slides[i];
this.settings.slides[i] = this.settings.slides[rand];
this.settings.slides[rand] = temp;
}
},
play: function () {
if (this.paused) {
this.paused = false;
this.next();
this.trigger('play');
}
},
pause: function () {
this._timer(false);
this.paused = true;
this.trigger('pause');
},
toggle: function () {
if (this.paused) {
this.play();
} else {
this.pause();
}
},
playing: function () {
return !this.paused && !this.noshow;
},
current: function (advanced) {
if (advanced) {
return {
slide: this.slide,
data: this.settings.slides[this.slide]
};
}
return this.slide;
},
jump: function (nb) {
if (nb < 0 || nb > this.total - 1 || nb === this.slide) {
return;
}
this.slide = nb;
this._goto(this.slide);
},
next: function () {
this.slide++;
if (this.slide >= this.total) {
this.slide = 0;
}
this._goto(this.slide);
},
previous: function () {
this.slide--;
if (this.slide < 0) {
this.slide = this.total - 1;
}
this._goto(this.slide);
},
trigger: function (fn) {
var params = [];
if (fn !== 'init') {
params = [
this.slide,
this.settings.slides[this.slide]
];
}
this.$elmt.trigger('vegas' + fn, params);
if (typeof this.settings[fn] === 'function') {
this.settings[fn].apply(this.$elmt, params);
}
},
options: function (key, value) {
var oldSlides = this.settings.slides;
if (typeof key === 'object') {
this.settings = $.extend({}, defaults, $.vegas.defaults, key);
} else if (typeof key === 'string') {
if (value === undefined) {
return this.settings[key];
}
this.settings[key] = value;
} else {
return this.settings;
}
// In case slides have changed
if (this.settings.slides !== oldSlides) {
this.total = this.settings.slides.length;
this.noshow = this.total < 2;
this._preload();
}
}
};
$.fn.vegas = function(options) {
var args = arguments,
error = false,
returns;
if (options === undefined || typeof options === 'object') {
return this.each(function () {
if (!this._vegas) {
this._vegas = new Vegas(this, options);
}
});
} else if (typeof options === 'string') {
this.each(function () {
var instance = this._vegas;
if (!instance) {
throw new Error('No Vegas applied to this element.');
}
if (typeof instance[options] === 'function' && options[0] !== '_') {
returns = instance[options].apply(instance, [].slice.call(args, 1));
} else {
error = true;
}
});
if (error) {
throw new Error('No method "' + options + '" in Vegas.');
}
return returns !== undefined ? returns : this;
}
};
$.vegas = {};
$.vegas.defaults = defaults;
$.vegas.isVideoCompatible = function () {
return /(Android|webOS|Phone|iPad|iPod|BlackBerry|Windows Phone)/i.test(navigator.userAgent);
};
})(typeof jQuery !== 'undefined' ? jQuery :
typeof Zepto !== 'undefined' ? Zepto : null
);