forked from extern/egroupware
172 lines
6.5 KiB
JavaScript
172 lines
6.5 KiB
JavaScript
/*
|
|
* blueimp Gallery Video Factory JS 1.1.1
|
|
* https://github.com/blueimp/Gallery
|
|
*
|
|
* Copyright 2013, Sebastian Tschan
|
|
* https://blueimp.net
|
|
*
|
|
* Licensed under the MIT license:
|
|
* http://www.opensource.org/licenses/MIT
|
|
*/
|
|
|
|
/* global define, window, document */
|
|
|
|
(function (factory) {
|
|
'use strict';
|
|
if (typeof define === 'function' && define.amd) {
|
|
// Register as an anonymous AMD module:
|
|
define([
|
|
'./blueimp-helper',
|
|
'./blueimp-gallery'
|
|
], factory);
|
|
} else {
|
|
// Browser globals:
|
|
factory(
|
|
window.blueimp.helper || window.jQuery,
|
|
window.blueimp.Gallery
|
|
);
|
|
}
|
|
}(function ($, Gallery) {
|
|
'use strict';
|
|
|
|
$.extend(Gallery.prototype.options, {
|
|
// The class for video content elements:
|
|
videoContentClass: 'video-content',
|
|
// The class for video when it is loading:
|
|
videoLoadingClass: 'video-loading',
|
|
// The class for video when it is playing:
|
|
videoPlayingClass: 'video-playing',
|
|
// The list object property (or data attribute) for the video poster URL:
|
|
videoPosterProperty: 'poster',
|
|
// The list object property (or data attribute) for the video sources array:
|
|
videoSourcesProperty: 'sources'
|
|
});
|
|
|
|
var handleSlide = Gallery.prototype.handleSlide;
|
|
|
|
$.extend(Gallery.prototype, {
|
|
|
|
handleSlide: function (index) {
|
|
handleSlide.call(this, index);
|
|
if (this.playingVideo) {
|
|
this.playingVideo.pause();
|
|
}
|
|
},
|
|
|
|
videoFactory: function (obj, callback, videoInterface) {
|
|
var that = this,
|
|
options = this.options,
|
|
videoContainerNode = this.elementPrototype.cloneNode(false),
|
|
videoContainer = $(videoContainerNode),
|
|
errorArgs = [{
|
|
type: 'error',
|
|
target: videoContainerNode
|
|
}],
|
|
video = videoInterface || document.createElement('video'),
|
|
url = this.getItemProperty(obj, options.urlProperty),
|
|
type = this.getItemProperty(obj, options.typeProperty),
|
|
title = this.getItemProperty(obj, options.titleProperty),
|
|
posterUrl = this.getItemProperty(obj, options.videoPosterProperty),
|
|
posterImage,
|
|
sources = this.getItemProperty(
|
|
obj,
|
|
options.videoSourcesProperty
|
|
),
|
|
source,
|
|
playMediaControl,
|
|
isLoading,
|
|
hasControls;
|
|
videoContainer.addClass(options.videoContentClass);
|
|
if (title) {
|
|
videoContainerNode.title = title;
|
|
}
|
|
if (video.canPlayType) {
|
|
if (url && type && video.canPlayType(type)) {
|
|
video.src = url;
|
|
} else {
|
|
while (sources && sources.length) {
|
|
source = sources.shift();
|
|
url = this.getItemProperty(source, options.urlProperty);
|
|
type = this.getItemProperty(source, options.typeProperty);
|
|
if (url && type && video.canPlayType(type)) {
|
|
video.src = url;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (posterUrl) {
|
|
video.poster = posterUrl;
|
|
posterImage = this.imagePrototype.cloneNode(false);
|
|
$(posterImage).addClass(options.toggleClass);
|
|
posterImage.src = posterUrl;
|
|
posterImage.draggable = false;
|
|
videoContainerNode.appendChild(posterImage);
|
|
}
|
|
playMediaControl = document.createElement('a');
|
|
playMediaControl.setAttribute('target', '_blank');
|
|
if (!videoInterface) {
|
|
playMediaControl.setAttribute('download', title);
|
|
}
|
|
playMediaControl.href = url;
|
|
if (video.src) {
|
|
video.controls = true;
|
|
(videoInterface || $(video))
|
|
.on('error', function () {
|
|
that.setTimeout(callback, errorArgs);
|
|
})
|
|
.on('pause', function () {
|
|
isLoading = false;
|
|
videoContainer
|
|
.removeClass(that.options.videoLoadingClass)
|
|
.removeClass(that.options.videoPlayingClass);
|
|
if (hasControls) {
|
|
that.container.addClass(that.options.controlsClass);
|
|
}
|
|
delete that.playingVideo;
|
|
if (that.interval) {
|
|
that.play();
|
|
}
|
|
})
|
|
.on('playing', function () {
|
|
isLoading = false;
|
|
videoContainer
|
|
.removeClass(that.options.videoLoadingClass)
|
|
.addClass(that.options.videoPlayingClass);
|
|
if (that.container.hasClass(that.options.controlsClass)) {
|
|
hasControls = true;
|
|
that.container.removeClass(that.options.controlsClass);
|
|
} else {
|
|
hasControls = false;
|
|
}
|
|
})
|
|
.on('play', function () {
|
|
window.clearTimeout(that.timeout);
|
|
isLoading = true;
|
|
videoContainer.addClass(that.options.videoLoadingClass);
|
|
that.playingVideo = video;
|
|
});
|
|
$(playMediaControl).on('click', function (event) {
|
|
that.preventDefault(event);
|
|
if (isLoading) {
|
|
video.pause();
|
|
} else {
|
|
video.play();
|
|
}
|
|
});
|
|
videoContainerNode.appendChild(
|
|
(videoInterface && videoInterface.element) || video
|
|
);
|
|
}
|
|
videoContainerNode.appendChild(playMediaControl);
|
|
this.setTimeout(callback, [{
|
|
type: 'load',
|
|
target: videoContainerNode
|
|
}]);
|
|
return videoContainerNode;
|
|
}
|
|
});
|
|
|
|
return Gallery;
|
|
}));
|