545 lines
13 KiB
JavaScript
545 lines
13 KiB
JavaScript
/** ----------------------------------------------------------------------------
|
|
* Video Background */
|
|
|
|
import {
|
|
$,
|
|
$window,
|
|
$doc,
|
|
$body
|
|
} from './utility';
|
|
|
|
var sightVideoPortfolio = {};
|
|
|
|
( function() {
|
|
var $this;
|
|
var YTdeferredDone = false;
|
|
var initAPI = false;
|
|
var process = false;
|
|
var contex = [];
|
|
var players = [];
|
|
var attrs = [];
|
|
|
|
// Create deferred object
|
|
var YTdeferred = $.Deferred();
|
|
|
|
if ( typeof window.onYouTubePlayerAPIReady !== 'undefined' ) {
|
|
if ( typeof window.sightYTAPIReady === 'undefined' ) {
|
|
window.sightYTAPIReady = [];
|
|
}
|
|
window.sightYTAPIReady.push( window.onYouTubePlayerAPIReady );
|
|
}
|
|
|
|
window.onYouTubePlayerAPIReady = function() {
|
|
if ( typeof window.sightYTAPIReady !== 'undefined' ) {
|
|
if ( window.sightYTAPIReady.length ) {
|
|
window.sightYTAPIReady.pop()();
|
|
}
|
|
}
|
|
|
|
// Resolve when youtube callback is called
|
|
// passing YT as a parameter.
|
|
YTdeferred.resolve( window.YT );
|
|
};
|
|
|
|
// Whenever youtube callback was called = deferred resolved
|
|
// your custom function will be executed with YT as an argument.
|
|
YTdeferred.done( function( YT ) {
|
|
YTdeferredDone = true;
|
|
} );
|
|
|
|
// Embedding youtube iframe api.
|
|
function embedYoutubeAPI() {
|
|
if ( 'function' === typeof( window.onYTReady ) ) {
|
|
return;
|
|
}
|
|
|
|
var tag = document.createElement( 'script' );
|
|
tag.src = 'https://www.youtube.com/iframe_api';
|
|
|
|
var firstScriptTag = document.getElementsByTagName( 'script' )[ 0 ];
|
|
firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );
|
|
}
|
|
|
|
$.fn.contexObject = function( id, type ) {
|
|
if ( 'string' === typeof id ) {
|
|
id = `[data-id="${id}"]`;
|
|
} else {
|
|
id = this;
|
|
}
|
|
|
|
if ( 'wrap' === type ) {
|
|
return $( id ).closest( '.sight-portfolio-video-wrap' );
|
|
} else if ( 'container' === type ) {
|
|
return $( id ).closest( '.sight-portfolio-video-container' );
|
|
} else if ( 'inner' === type ) {
|
|
return $( id ).closest( '.sight-portfolio-video-wrap' ).find( '.sight-portfolio-video-inner' );
|
|
} else {
|
|
return $( id );
|
|
}
|
|
};
|
|
|
|
// Object Video Portfolio.
|
|
sightVideoPortfolio = {
|
|
|
|
/** Initialize */
|
|
init: function( e ) {
|
|
if ( $( 'body' ).hasClass( 'wp-admin' ) ) {
|
|
return;
|
|
}
|
|
|
|
$this = sightVideoPortfolio;
|
|
|
|
// Init events.
|
|
$this.events( e );
|
|
},
|
|
|
|
// Video rescale.
|
|
rescaleVideoBackground: function() {
|
|
$( '.sight-portfolio-video-init' ).each( function() {
|
|
let w = $( this ).parent().width();
|
|
let h = $( this ).parent().height();
|
|
|
|
var hideControl = 400;
|
|
|
|
let id = $( this ).attr( 'data-id' );
|
|
|
|
if ( w / h > 16 / 9 ) {
|
|
if ( 'youtube' === $( this ).parent().data( 'video-mode' ) ) {
|
|
players[ id ].setSize( w, w / 16 * 9 + hideControl );
|
|
} else {
|
|
players[ id ].width( w );
|
|
players[ id ].height( w / 16 * 9 + hideControl );
|
|
}
|
|
} else {
|
|
if ( 'youtube' === $( this ).parent().data( 'video-mode' ) ) {
|
|
players[ id ].setSize( h / 9 * 16, h + hideControl );
|
|
} else {
|
|
players[ id ].width( h / 9 * 16 );
|
|
players[ id ].height( h + hideControl );
|
|
}
|
|
}
|
|
} );
|
|
},
|
|
|
|
// Init video background.
|
|
initVideoBackground: function( mode, object ) {
|
|
|
|
$( '.sight-portfolio-video-inner' ).each( function() {
|
|
|
|
// The mode.
|
|
if ( !$( this ).parent().is( `[data-video-mode="${mode}"]` ) ) {
|
|
return;
|
|
}
|
|
|
|
// The state.
|
|
var isInit = $( this ).hasClass( 'sight-portfolio-video-init' );
|
|
|
|
var id = null;
|
|
|
|
// Generate unique ID.
|
|
if ( !isInit ) {
|
|
id = Math.random().toString( 36 ).substr( 2, 9 );
|
|
} else {
|
|
id = $( this ).attr( 'data-id' );
|
|
}
|
|
|
|
// Create contex.
|
|
contex[ id ] = this;
|
|
|
|
// The monitor.
|
|
var isInView = $( contex[ id ] ).isInViewport();
|
|
|
|
// The actived.
|
|
var isActive = $( contex[ id ] ).hasClass( 'active' );
|
|
|
|
// Get video attrs.
|
|
var youtubeID = $( contex[ id ] ).parent().data( 'youtube-id' );
|
|
var videoType = $( contex[ id ] ).parent().data( 'video-type' );
|
|
var videoStart = $( contex[ id ] ).parent().data( 'video-start' );
|
|
var videoEnd = $( contex[ id ] ).parent().data( 'video-end' );
|
|
|
|
// Initialization.
|
|
if ( isInView && !isInit ) {
|
|
|
|
// Add init class.
|
|
$( contex[ id ] ).addClass( 'sight-portfolio-video-init' );
|
|
|
|
// Add unique ID.
|
|
$( contex[ id ] ).attr( 'data-id', id );
|
|
|
|
// Check video mode.
|
|
if ( 'youtube' === mode ) {
|
|
// Check video id.
|
|
if ( typeof youtubeID === 'undefined' || !youtubeID ) {
|
|
return;
|
|
}
|
|
|
|
// Video attrs.
|
|
attrs[ id ] = {
|
|
'videoId': youtubeID,
|
|
'startSeconds': videoStart,
|
|
'endSeconds': videoEnd,
|
|
'suggestedQuality': 'hd720'
|
|
};
|
|
|
|
// Creating a player.
|
|
players[ id ] = new YT.Player( contex[ id ], {
|
|
playerVars: {
|
|
autoplay: 0,
|
|
autohide: 1,
|
|
modestbranding: 1,
|
|
rel: 0,
|
|
showinfo: 0,
|
|
controls: 0,
|
|
disablekb: 1,
|
|
enablejsapi: 0,
|
|
iv_load_policy: 3,
|
|
playsinline: 1,
|
|
loop: 1
|
|
},
|
|
events: {
|
|
'onReady': function() {
|
|
|
|
players[ id ].cueVideoById( attrs[ id ] );
|
|
players[ id ].mute();
|
|
|
|
if ( 'always' === videoType ) {
|
|
$this.playVideo( id );
|
|
}
|
|
},
|
|
'onStateChange': function( e ) {
|
|
if ( e.data === 1 ) {
|
|
$( this ).contexObject( id ).closest( '.sight-portfolio-video-wrap' ).addClass( 'sight-portfolio-video-bg-init' );
|
|
$( this ).contexObject( id ).addClass( 'active' );
|
|
} else if ( e.data === 0 ) {
|
|
players[ id ].seekTo( attrs[ id ].startSeconds );
|
|
} else if ( e.data === 5 ) {
|
|
players[ id ].videoReady = true;
|
|
}
|
|
}
|
|
}
|
|
} );
|
|
} else {
|
|
// Creating a player.
|
|
players[ id ] = $( contex[ id ] );
|
|
|
|
// Ready play.
|
|
players[ id ].on( 'canplay', function() {
|
|
players[ id ].videoReady = true;
|
|
|
|
if ( true !== players[ id ].start ) {
|
|
players[ id ].start = true;
|
|
|
|
this.currentTime = videoStart ? videoStart : 0;
|
|
|
|
if ( 'always' === videoType ) {
|
|
$this.playVideo( id );
|
|
}
|
|
}
|
|
} );
|
|
|
|
// Play.
|
|
players[ id ].on( 'play', function() {
|
|
players[ id ].parents( '.sight-portfolio-video-wrap' ).addClass( 'sight-portfolio-video-bg-init' );
|
|
players[ id ].addClass( 'active' );
|
|
} );
|
|
|
|
// Ended.
|
|
players[ id ].on( 'timeupdate', function() {
|
|
if ( videoEnd && this.currentTime >= videoEnd ) {
|
|
players[ id ].trigger( 'pause' );
|
|
|
|
this.currentTime = videoStart;
|
|
|
|
players[ id ].trigger( 'play' );
|
|
}
|
|
} );
|
|
|
|
players[ id ].trigger( 'load' );
|
|
}
|
|
|
|
$this.rescaleVideoBackground();
|
|
}
|
|
|
|
// Pause and play.
|
|
if ( 'always' === videoType && isActive && isInit && ! $this.getVideoUpause( id ) ) {
|
|
|
|
if ( isInView ) {
|
|
$this.playVideo( id );
|
|
}
|
|
|
|
if ( ! isInView ) {
|
|
$this.pauseVideo( id );
|
|
}
|
|
}
|
|
} );
|
|
},
|
|
|
|
// Construct video background.
|
|
constructVideoBackground: function( object ) {
|
|
if ( $( 'body' ).hasClass( 'wp-admin' ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( process ) {
|
|
return;
|
|
}
|
|
|
|
process = true;
|
|
|
|
// Smart init API.
|
|
if ( !initAPI ) {
|
|
let elements = $( '[data-video-mode="youtube"][data-youtube-id]' );
|
|
|
|
if ( elements.length ) {
|
|
embedYoutubeAPI();
|
|
|
|
initAPI = true;
|
|
}
|
|
}
|
|
|
|
if ( !initAPI ) {
|
|
process = false;
|
|
}
|
|
|
|
// Play Video.
|
|
$this.initVideoBackground( 'local', object );
|
|
|
|
if ( initAPI && YTdeferredDone ) {
|
|
$this.initVideoBackground( 'youtube', object );
|
|
}
|
|
|
|
process = false;
|
|
},
|
|
|
|
// Get video type.
|
|
getVideoType: function( id ) {
|
|
return $( this ).contexObject( id, 'container' ).data( 'video-type' );
|
|
},
|
|
|
|
// Get video mode.
|
|
getVideoMode: function( id ) {
|
|
return $( this ).contexObject( id, 'container' ).data( 'video-mode' );
|
|
},
|
|
|
|
// Get video state.
|
|
getVideoState: function( id ) {
|
|
return players[ id ].videoState;
|
|
},
|
|
|
|
// Get video ready.
|
|
getVideoReady: function( id ) {
|
|
return players[ id ].videoReady ? players[ id ].videoReady : false;
|
|
},
|
|
|
|
// Get video upause.
|
|
getVideoUpause: function( id ) {
|
|
return players[ id ].videoUpause ? players[ id ].videoUpause : false;
|
|
},
|
|
|
|
// Get video volume.
|
|
getVideoVolume: function( id ) {
|
|
return players[ id ].videoVolume ? players[ id ].videoVolume : 'mute';
|
|
},
|
|
|
|
// Change video upause.
|
|
changeVideoUpause: function( id, val ) {
|
|
players[ id ].videoUpause = val;
|
|
},
|
|
|
|
// Play video.
|
|
playVideo: function( id ) {
|
|
if ( 'play' === players[ id ].videoState ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! players[ id ].videoReady ) {
|
|
return setTimeout(function(){
|
|
$this.playVideo( id );
|
|
}, 100);
|
|
}
|
|
|
|
if ( 'youtube' === $this.getVideoMode( id ) ) {
|
|
players[ id ].playVideo();
|
|
} else {
|
|
players[ id ].trigger( 'play' );
|
|
}
|
|
|
|
// Change control.
|
|
let control = $( this ).contexObject( id, 'wrap' ).find( '.sight-portfolio-player-state' );
|
|
|
|
$( control ).removeClass( 'sight-portfolio-player-pause' );
|
|
$( control ).addClass( 'sight-portfolio-player-play' );
|
|
|
|
// Set state.
|
|
players[ id ].videoState = 'play';
|
|
},
|
|
|
|
// Pause video.
|
|
pauseVideo: function( id ) {
|
|
if ( 'pause' === players[ id ].videoState ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! players[ id ].videoReady ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'youtube' === $this.getVideoMode( id ) ) {
|
|
players[ id ].pauseVideo();
|
|
} else {
|
|
players[ id ].trigger( 'pause' );
|
|
}
|
|
|
|
// Change control.
|
|
let control = $( this ).contexObject( id, 'wrap' ).find( '.sight-portfolio-player-state' );
|
|
|
|
$( control ).removeClass( 'sight-portfolio-player-play' );
|
|
$( control ).addClass( 'sight-portfolio-player-pause' );
|
|
|
|
// Set state.
|
|
players[ id ].videoState = 'pause';
|
|
},
|
|
|
|
// Unmute video.
|
|
unmuteVideo: function( id ) {
|
|
if ( ! players[ id ].videoReady ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'youtube' === $this.getVideoMode( id ) ) {
|
|
players[ id ].unMute();
|
|
} else {
|
|
players[ id ].prop( 'muted', false );
|
|
}
|
|
|
|
// Change control.
|
|
let control = $( this ).contexObject( id, 'wrap' ).find( '.sight-portfolio-player-volume' );
|
|
|
|
$( control ).removeClass( 'sight-portfolio-player-mute' );
|
|
$( control ).addClass( 'sight-portfolio-player-unmute' );
|
|
|
|
// Set state.
|
|
players[ id ].videoVolume = 'unmute';
|
|
},
|
|
|
|
// Mute video.
|
|
muteVideo: function( id ) {
|
|
if ( ! players[ id ].videoReady ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'youtube' === $this.getVideoMode( id ) ) {
|
|
players[ id ].mute();
|
|
} else {
|
|
players[ id ].prop( 'muted', true );
|
|
}
|
|
|
|
// Change control.
|
|
let control = $( this ).contexObject( id, 'wrap' ).find( '.sight-portfolio-player-volume' );
|
|
|
|
$( control ).removeClass( 'sight-portfolio-player-unmute' );
|
|
$( control ).addClass( 'sight-portfolio-player-mute' );
|
|
|
|
// Set state.
|
|
players[ id ].videoVolume = 'muted';
|
|
},
|
|
|
|
// Toogle video state.
|
|
toogleVideoState: function( id ) {
|
|
if ( 'play' === $this.getVideoState( id ) ) {
|
|
$this.pauseVideo( id );
|
|
} else {
|
|
$this.playVideo( id );
|
|
}
|
|
},
|
|
|
|
// Toogle video volume.
|
|
toogleVideoVolume: function( id ) {
|
|
if ( 'unmute' === $this.getVideoVolume( id ) ) {
|
|
$this.muteVideo( id );
|
|
} else {
|
|
$this.unmuteVideo( id );
|
|
}
|
|
},
|
|
|
|
/** Events */
|
|
events: function( e ) {
|
|
// State Control.
|
|
$doc.on( 'click', '.sight-portfolio-player-state', function() {
|
|
let id = $( this ).contexObject( false, 'inner' ).attr( 'data-id' );
|
|
|
|
$this.toogleVideoState( id );
|
|
|
|
if ( 'play' === $this.getVideoState( id ) ) {
|
|
$this.changeVideoUpause( id, false );
|
|
} else {
|
|
$this.changeVideoUpause( id, true );
|
|
}
|
|
} );
|
|
|
|
// Stop Control.
|
|
$doc.on( 'click', '.sight-portfolio-player-stop', function() {
|
|
let id = $( this ).contexObject( false, 'inner' ).attr( 'data-id' );
|
|
|
|
if ( 'play' === $this.getVideoState( id ) ) {
|
|
$this.changeVideoUpause( id, true );
|
|
}
|
|
|
|
$this.pauseVideo( id );
|
|
} );
|
|
|
|
// Volume Control.
|
|
$doc.on( 'click', '.sight-portfolio-player-volume', function() {
|
|
let id = $( this ).contexObject( false, 'inner' ).attr( 'data-id' );
|
|
|
|
$this.toogleVideoVolume( id );
|
|
} );
|
|
|
|
// Mouseover.
|
|
$doc.on( 'mouseover mousemove', '.sight-portfolio-entry__thumbnail', function() {
|
|
let id = $( this ).contexObject( false, 'inner' ).attr( 'data-id' );
|
|
|
|
if ( 'hover' === $this.getVideoType( id ) ) {
|
|
$this.playVideo( id );
|
|
}
|
|
} );
|
|
|
|
// Mouseout.
|
|
$doc.on( 'mouseout', '.sight-portfolio-entry__thumbnail', function() {
|
|
let id = $( this ).contexObject( false, 'inner' ).attr( 'data-id' );
|
|
|
|
if ( 'hover' === $this.getVideoType( id ) ) {
|
|
$this.pauseVideo( id );
|
|
}
|
|
} );
|
|
|
|
// Document scroll.
|
|
$window.on( 'load scroll resize scrollstop', function() {
|
|
$this.constructVideoBackground();
|
|
} );
|
|
|
|
// Document ready.
|
|
$doc.ready( function() {
|
|
$this.constructVideoBackground();
|
|
} );
|
|
|
|
// Post load.
|
|
$body.on( 'post-load', function() {
|
|
$this.constructVideoBackground();
|
|
} );
|
|
|
|
// Document resize.
|
|
$window.on( 'resize', function() {
|
|
$this.rescaleVideoBackground();
|
|
} );
|
|
|
|
// Init.
|
|
$this.constructVideoBackground();
|
|
}
|
|
};
|
|
} )();
|
|
|
|
// Initialize.
|
|
sightVideoPortfolio.init();
|