src/assets/js/youtubeplayer.js (208 lines of code) (raw):
(function ($) {
// create deferred object
// ------
var YTdeferred = $.Deferred();
window.onYouTubeIframeAPIReady = function () {
// resolve when youtube callback is called passing YT as a parameter
YTdeferred.resolve(window.YT);
};
// async scripts
// ------
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// document ready
// ------
$(document).ready(function () {
// whenever youtube callback was called = deferred resolved your custom function will be executed with YT as an argument
YTdeferred.done(function (YT) {
$(document).video_cta({
yt_object: YT,
cta: '.video-link, a[title|="Open Popup Video"], .video-popup a',
default_target: $('#video-popup'),
});
if ($('.video-banner').length) {
$('.video-banner').each(function () {
$(this).video_banner({ yt_object: YT });
});
}
});
});
// Call to action overlay video
// ------
$.fn.video_cta = function (options) {
var settings = $.extend(
{
yt_object: null,
container: '<div id="stdVideo"><div id="stdVideo-player"></div></div>',
container_id: 'stdVideo-player',
close: '#stdVideo-close',
cta: '.video-link',
cta_container: '.video-cta',
youtube_id_data: 'youtube_id',
target_data: 'youtube_target',
default_target: null,
},
options
);
var $link = $(settings.cta);
var $link_container = $link.closest(settings.cta_container);
var yt_player;
var $container;
var $target = settings.default_target;
var playing = false;
var is_ios = navigator.userAgent.match(/(iPod|iPhone|iPad)/) != null;
var is_android = /(android)/i.test(navigator.userAgent);
var mobileOS = is_ios || is_android;
if (settings.default_target.length) {
settings.default_target.find('.bg').on('click', closeVideo);
}
$('body')
// Deregister to avoiding multiple bindings.
.off('keyup.escCloseVideo')
.on('keyup.escCloseVideo', function (e) {
// 27 is the escape key.
if (e.originalEvent.keyCode === 27 && closeVideo) {
closeVideo();
}
});
if ($(settings.close).length) {
$(settings.close).on('click', closeVideo);
}
this.on('click', settings.cta, function (e) {
e.preventDefault();
if ($('#' + settings.container_id).length && playing) {
closeVideo({ fast: true });
}
$link = $(this);
$link_container = $link.closest(settings.cta_container);
$target = $('#' + $link.data(settings.target_data)).length
? $('#' + $link.data(settings.target_data))
: settings.default_target;
$link.addClass('loading');
$target.addClass('loading');
var id =
typeof $link.data(settings.youtube_id_data) !== typeof undefined &&
$link.data(settings.youtube_id_data) !== false
? $link.data(settings.youtube_id_data)
: $link.attr('href');
loadVideo(id);
});
// The API calls this function when the player state changes
/*
ENDED
PLAYING
PAUSED
BUFFERING
CUED
*/
function onPlayerStateChange(event) {
// Open video player when playing
if (event.data == settings.yt_object.PlayerState.PLAYING && !playing) {
openVideo();
// Close video when ended
} else if (event.data == settings.yt_object.PlayerState.ENDED) {
closeVideo();
}
}
// The API calls this function when the player is ready.
function onPlayerReady() {
if (playing) {
closeVideo();
}
if (mobileOS) {
openVideo();
} else {
yt_player.playVideo();
}
}
function loadVideo(id) {
$container = $(settings.container);
// if (settings.close) {
// $close = $(settings.close);
// $close.appendTo($container);
// $close.on('click', closeVideo);
// }
if ($('#' + $link.data(settings.target_data)).length) {
// if custom target
$container.appendTo($target);
} else {
// if default player
$container.appendTo($target.find('.cell'));
$target.velocity('fadeIn');
}
// creating a player: https://developers.google.com/youtube/iframe_api_reference#Getting_Started
yt_player = new settings.yt_object.Player(settings.container_id, {
height: '390',
width: '640',
videoId: id,
events: {
onReady: onPlayerReady,
onStateChange: onPlayerStateChange,
},
playerVars: {
controls: 1,
enablejsapi: 1,
loop: 0,
showinfo: 0,
modestbranding: 1,
},
});
}
function openVideo() {
playing = true;
$container.addClass('playing');
$link_container.addClass('playing');
$link.removeClass('loading');
$target.removeClass('loading');
}
function closeVideo(options) {
if (!yt_player || !yt_player.stopVideo) {
console.log(
'Bailing early from closeVideo due to yt_player being undefined or stopVideo method missing.'
);
return;
}
var v = $.extend(
{
fast: false,
},
options
);
yt_player.stopVideo();
playing = false;
$container.removeClass('playing');
$link_container.removeClass('playing');
if (!$('#' + $link.data(settings.target_data)).length) {
$target.velocity('fadeOut');
}
if (v.fast) {
yt_player = null;
$container.remove();
} else {
setTimeout(function () {
yt_player = null;
$container.remove();
}, 1000);
}
}
};
// Banner background video
// ------
$.fn.video_banner = function (options) {
var settings = $.extend(
{
yt_object: null,
},
options
);
var $player = this;
var $container = $player.parent();
var $wrapper = $container.parent();
var $banner = $wrapper.parent();
var $window = $(window);
var element_id = $player.attr('id');
var video_id = $player.data('youtube_id');
var started = false;
var player = new settings.yt_object.Player(element_id, {
height: '390',
width: '640',
videoId: video_id,
events: {
onReady: onPlayerReady,
onStateChange: onPlayerStateChange,
},
playerVars: {
autoplay: 1,
controls: 0,
autohide: 1,
wmode: 'opaque',
mute: 1,
showinfo: 0,
modestbranding: 1,
loop: 1,
enablejsapi: 1,
playlist: video_id,
},
});
// The API calls this function when the player is ready.
function onPlayerReady() {
player.mute();
}
// The API calls this function when the player's state changes.
function onPlayerStateChange(event) {
if (event.data == settings.yt_object.PlayerState.PLAYING && !started) {
$wrapper.addClass('playing');
started = true;
}
}
function videoSize() {
var windowHeight = $banner.outerHeight();
var videoHeight = $wrapper.outerHeight();
var scale = windowHeight / videoHeight;
if (videoHeight < windowHeight) {
$wrapper.css({
'-webkit-transform': 'scale(' + scale + ') translateY(-50%)',
transform: 'scale(' + scale + ') translateY(-50%)',
});
} else {
$wrapper.attr('style', '');
}
}
$window.on('load resize', function () {
videoSize();
});
};
})(jQuery);