Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

youtube-background

Package Overview
Dependencies
Maintainers
1
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

youtube-background - npm Package Compare versions

Comparing version 1.0.7 to 1.0.8

gulpfile.js

1210

jquery.youtube-background.js

@@ -1,609 +0,819 @@

/* jquery.youtube-background v1.0.7 | Nikola Stamatovic <@stamat> | MIT */
/**
* jquery.youtube-background v1.0.8 | Nikola Stamatovic <@stamat> | MIT
*/
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
(function () {
'use strict';
function hasClass(element, className) {
if (element.classList) {
return element.classList.contains(className);
}
return new RegExp('\\b'+ className+'\\b').test(element.className);
}
//native addClass, removeClass, hasClass and toggleClass
if (!window.hasOwnProperty('d0')) {
window.d0 = {};
function addClass(element, className) {
if (element.classList) {
element.classList.add(className);
return;
}
d0.hasClass = function(element, className) {
if (element.classList) {
return element.classList.contains(className);
}
return new RegExp('\\b'+ className+'\\b').test(element.className);
};
if (!hasClass(element, className)) {
element.className += ' ' + className;
}
}
d0.addClass = function(element, className) {
if (element.classList) {
element.classList.add(className);
return;
}
function removeClass(element, className) {
if (element.classList) {
element.classList.remove(className);
return;
}
if (!d0.hasClass(element, className)) {
element.className += ' ' + className;
}
};
element.className = element.className.replace(new RegExp('\\b'+ className+'\\b', 'g'), '');
}
d0.removeClass = function(element, className) {
if (element.classList) {
element.classList.remove(className);
return;
}
function isMobile() {
let is_mobile = false;
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) is_mobile = true;})(navigator.userAgent||navigator.vendor||window.opera);
element.className = element.className.replace(new RegExp('\\b'+ className+'\\b', 'g'), '');
};
return is_mobile;
}
d0.toogleClass = function(element, className) {
if (d0.hasClass(element, className)) {
d0.removeClass(element, className);
} else {
d0.addClass(element, className);
}
};
}
function parseResolutionString(res) {
var pts = res.split(/\s?:\s?/i);
if (pts.length < 2) {
return 16/9;
}
function YoutubeBackground(elem, params, id, uid) {
this.is_mobile = this.isMobile();
var w = parseInt(pts[0], 10);
var h = parseInt(pts[1], 10);
this.element = elem;
this.ytid = id;
this.uid = uid;
this.player = null;
this.buttons = {};
if (isNaN(w) || isNaN(h)) {
return 16/9;
}
this.state = {};
this.state.play = false;
this.state.mute = false;
return w/h;
}
this.params = {};
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
this.defaults = {
'pause': false, //deprecated
'play-button': false,
'mute-button': false,
'autoplay': true,
'muted': true,
'loop': true,
'mobile': false,
'load-background': true,
'resolution': '16:9',
'offset': 200
};
function YoutubeBackground(elem, params, id, uid) {
this.is_mobile = isMobile();
this.__init__ = function () {
if (!this.ytid) {
return;
}
this.element = elem;
this.ytid = id;
this.uid = uid;
this.player = null;
this.buttons = {};
this.parseProperties(params);
this.params.resolution_mod = this.parseResolutionString(this.params.resolution);
this.state.playing = this.params.autoplay;
this.state.muted = this.params.muted;
this.state = {};
this.state.play = false;
this.state.mute = false;
this.buildHTML();
this.injectIFrame();
this.params = {};
this.defaults = {
'pause': false, //deprecated
'play-button': false,
'mute-button': false,
'autoplay': true,
'muted': true,
'loop': true,
'mobile': false,
'load-background': true,
'resolution': '16:9',
'onStatusChange': function() {},
'inline-styles': true,
'fit-box': false,
'offset': 200
};
if (this.params['play-button']) {
this.generateActionButton({
name: 'play',
className: 'play-toggle',
innerHtml: '<i class="fa"></i>',
initialState: false,
stateClassName: 'paused',
condition_parameter: 'autoplay',
stateChildClassNames: ['fa-pause-circle', 'fa-play-circle'],
actions: ['play', 'pause']
});
}
this.__init__ = function () {
if (!this.ytid) {
return;
}
if (this.params['mute-button']) {
this.generateActionButton({
name: 'mute',
className: 'mute-toggle',
innerHtml: '<i class="fa"></i>',
initialState: true,
stateClassName: 'muted',
condition_parameter: 'muted',
stateChildClassNames: ['fa-volume-up', 'fa-volume-mute'],
actions: ['unmute', 'mute']
});
}
}
this.parseProperties(params);
this.params.resolution_mod = parseResolutionString(this.params.resolution);
this.state.playing = this.params.autoplay;
this.state.muted = this.params.muted;
this.__init__();
}
this.buildHTML();
this.injectIFrame();
YoutubeBackground.prototype.initYTPlayer = function () {
var self = this;
if (window.hasOwnProperty('YT')) {
this.player = new YT.Player(this.uid, {
events: {
'onReady': function(event) {
self.onVideoPlayerReady(event);
},
'onStateChange': function(event) {
self.onVideoStateChange(event);
},
'onError' : function(event) {
//console.error('player_api', event);
}
}
});
}
};
if (this.params['play-button']) {
this.generateActionButton({
name: 'play',
className: 'play-toggle',
innerHtml: '<i class="fa"></i>',
initialState: false,
stateClassName: 'paused',
condition_parameter: 'autoplay',
stateChildClassNames: ['fa-pause-circle', 'fa-play-circle'],
actions: ['play', 'pause']
});
}
YoutubeBackground.prototype.onVideoPlayerReady = function (event) {
if (this.params.autoplay) {
event.target.playVideo();
}
};
if (this.params['mute-button']) {
this.generateActionButton({
name: 'mute',
className: 'mute-toggle',
innerHtml: '<i class="fa"></i>',
initialState: true,
stateClassName: 'muted',
condition_parameter: 'muted',
stateChildClassNames: ['fa-volume-up', 'fa-volume-mute'],
actions: ['unmute', 'mute']
});
}
};
YoutubeBackground.prototype.onVideoStateChange = function (event) {
if (event.data === 0 && this.params.loop) {
event.target.playVideo();
}
this.__init__();
}
if (event.data === -1 && this.params.autoplay) {
event.target.playVideo();
}
YoutubeBackground.prototype.initYTPlayer = function () {
var self = this;
if (event.data === 1) {
this.iframe.style.opacity = 1;
}
};
if (window.hasOwnProperty('YT')) {
this.player = new YT.Player(this.uid, {
events: {
'onReady': function(event) {
self.onVideoPlayerReady(event);
},
'onStateChange': function(event) {
self.onVideoStateChange(event);
},
'onError' : function(event) {
//console.error('player_api', event);
}
}
});
}
};
YoutubeBackground.prototype.parseProperties = function (params) {
if (!params) {
this.params = this.defaults;
} else {
//load in defaults
for (var k in this.defaults) {
if (!this.params.hasOwnProperty(k)) {
this.params[k] = this.defaults[k];
}
}
}
YoutubeBackground.prototype.onVideoPlayerReady = function (event) {
if (this.params.autoplay) {
event.target.playVideo();
}
};
// load params from data attributes
for (var k in this.params) {
var data = this.element.getAttribute('data-ytbg-'+k);
YoutubeBackground.prototype.onVideoStateChange = function (event) {
if (event.data === 0 && this.params.loop) {
event.target.playVideo();
}
if (data !== undefined && data !== null) {
switch (data) {
case data === 'false':
data = false;
break;
case data === 'true':
data = true;
break;
}
if (event.data === -1 && this.params.autoplay) {
event.target.playVideo();
}
this.params[k] = data;
}
}
if (event.data === 1) {
this.iframe.style.opacity = 1;
}
//pause deprecated
if (this.params.pause) {
this.params['play-button'] = this.params.pause;
}
};
this.params["onStatusChange"](event);
};
YoutubeBackground.prototype.injectIFrame = function () {
this.iframe = document.createElement('iframe');
this.iframe.setAttribute('frameborder', 0);
this.iframe.setAttribute('allow', ['autoplay; mute']);
var src = 'https://www.youtube.com/embed/'+this.ytid+'?enablejsapi=1&disablekb=1&controls=0&rel=0&iv_load_policy=3&cc_load_policy=0&playsinline=1&showinfo=0&modestbranding=1&fs=0&origin='+window.location.origin;
YoutubeBackground.prototype.parseProperties = function (params) {
if (!params) {
this.params = this.defaults;
} else {
for (var k in this.defaults) {
if (!params.hasOwnProperty(k)) {
//load in defaults if the param hasn't been set
this.params[k] = this.defaults[k];
}
}
}
if (this.params.muted) {
src += '&mute=1';
}
// load params from data attributes
for (var k in this.params) {
var data = this.element.getAttribute('data-ytbg-'+k);
if (this.params.autoplay) {
src += '&autoplay=1';
}
if (data !== undefined && data !== null) {
data = data === 'false' ? false : data;
this.params[k] = data;
}
}
if (this.params.loop) {
src += '&loop=1';
}
//pause deprecated
if (this.params.pause) {
this.params['play-button'] = this.params.pause;
}
};
this.iframe.src = src;
YoutubeBackground.prototype.injectIFrame = function () {
this.iframe = document.createElement('iframe');
this.iframe.setAttribute('frameborder', 0);
this.iframe.setAttribute('allow', ['autoplay; mute']);
var src = 'https://www.youtube.com/embed/'+this.ytid+'?enablejsapi=1&disablekb=1&controls=0&rel=0&iv_load_policy=3&cc_load_policy=0&playsinline=1&showinfo=0&modestbranding=1&fs=0&origin='+window.location.origin;
if (this.uid) {
this.iframe.id = this.uid;
}
if (this.params.muted) {
src += '&mute=1';
}
this.iframe.style.top = '50%';
this.iframe.style.left = '50%';
this.iframe.style.transform = 'translateX(-50%) translateY(-50%)';
this.iframe.style.position = 'absolute';
this.iframe.style.opacity = 0;
if (this.params.autoplay) {
src += '&autoplay=1';
}
this.element.parentNode.appendChild(this.iframe);
this.iframe.parentNode.removeChild(this.element);
if (this.params.loop) {
src += '&loop=1';
}
var self = this;
this.iframe.src = src;
function onResize() {
var h = self.iframe.parentNode.offsetHeight + self.params.offset; // since showinfo is deprecated and ignored after September 25, 2018. we add +200 to hide it in the overflow
var w = self.iframe.parentNode.offsetWidth + self.params.offset;
var res = self.params.resolution_mod;
if (this.uid) {
this.iframe.id = this.uid;
}
if (res > w/h) {
self.iframe.style.width = h*res + 'px';
self.iframe.style.height = h + 'px';
} else {
self.iframe.style.width = w + 'px';
self.iframe.style.height = w/res + 'px';
}
}
if (this.params['inline-styles']) {
this.iframe.style.top = '50%';
this.iframe.style.left = '50%';
this.iframe.style.transform = 'translateX(-50%) translateY(-50%)';
this.iframe.style.position = 'absolute';
this.iframe.style.opacity = 0;
}
window.addEventListener('resize', onResize);
onResize();
};
this.element.parentNode.appendChild(this.iframe);
this.iframe.parentNode.removeChild(this.element);
YoutubeBackground.prototype.buildHTML = function () {
var parent = this.element.parentNode;
// wrap
var wrapper = document.createElement('div');
wrapper.className = 'youtube-background';
parent.insertBefore(wrapper, this.element);
wrapper.appendChild(this.element);
var id = this.element.id;
this.element.id = '';
wrapper.id = id;
if (this.params['fit-box']) {
this.iframe.style.width = '100%';
this.iframe.style.height = '100%';
} else {
var self = this;
//set css rules
var wrapper_styles = {
"height" : "100%",
"width" : "100%",
"z-index": "0",
"position": "absolute",
"overflow": "hidden",
"top": 0, // added by @insad
"left": 0,
"bottom": 0,
"right": 0
};
function onResize() {
var h = self.iframe.parentNode.offsetHeight + self.params.offset; // since showinfo is deprecated and ignored after September 25, 2018. we add +200 to hide it in the overflow
var w = self.iframe.parentNode.offsetWidth + self.params.offset;
var res = self.params.resolution_mod;
if (!this.params['mute-button']) {
wrapper_styles["pointer-events"] = "none" // avoid right mouse click popup menu
}
if (res > w/h) {
self.iframe.style.width = h*res + 'px';
self.iframe.style.height = h + 'px';
} else {
self.iframe.style.width = w + 'px';
self.iframe.style.height = w/res + 'px';
}
}
if (this.params['load-background']) {
wrapper_styles['background-image'] = 'url(https://img.youtube.com/vi/'+this.ytid+'/maxresdefault.jpg)';
wrapper_styles['background-size'] = 'cover';
wrapper_styles['background-repeat'] = 'no-repeat';
wrapper_styles['background-position'] = 'center';
}
window.addEventListener('resize', onResize);
onResize();
}
};
for (var property in wrapper_styles) {
wrapper.style[property] = wrapper_styles[property];
}
YoutubeBackground.prototype.buildHTML = function () {
var parent = this.element.parentNode;
// wrap
var wrapper = document.createElement('div');
wrapper.className = 'youtube-background';
parent.insertBefore(wrapper, this.element);
wrapper.appendChild(this.element);
var id = this.element.id;
this.element.id = '';
wrapper.id = id;
wrapper.parentNode.style.position = 'relative';
//set css rules
var wrapper_styles = {
"height" : "100%",
"width" : "100%",
"z-index": "0",
"position": "absolute",
"overflow": "hidden",
"top": 0, // added by @insad
"left": 0,
"bottom": 0,
"right": 0
};
if (this.is_mobile && !this.params.mobile) {
return wrapper;
}
if (!this.params['mute-button']) {
wrapper_styles["pointer-events"] = "none"; // avoid right mouse click popup menu
}
// set play/mute controls wrap
if (this.params['play-button'] || this.params['mute-button']) {
var controls = document.createElement('div');
controls.className = 'video-background-controls';
if (this.params['load-background']) {
wrapper_styles['background-image'] = 'url(https://img.youtube.com/vi/'+this.ytid+'/maxresdefault.jpg)';
wrapper_styles['background-size'] = 'cover';
wrapper_styles['background-repeat'] = 'no-repeat';
wrapper_styles['background-position'] = 'center';
}
controls.style.position = 'absolute';
controls.style.top = '10px';
controls.style.right = '10px';
controls.style['z-index'] = 2;
if (this.params['inline-styles']) {
for (var property in wrapper_styles) {
wrapper.style[property] = wrapper_styles[property];
}
this.controls_element = controls;
wrapper.parentNode.appendChild(controls);
}
wrapper.parentNode.style.position = 'relative';
}
return wrapper;
};
if (this.is_mobile && !this.params.mobile) {
return wrapper;
}
YoutubeBackground.prototype.play = function () {
if (this.buttons.hasOwnProperty('play')) {
var btn_obj = this.buttons.play;
d0.removeClass(btn_obj.element, btn_obj.button_properties.stateClassName);
d0.addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0])
d0.removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
// set play/mute controls wrap
if (this.params['play-button'] || this.params['mute-button']) {
var controls = document.createElement('div');
controls.className = 'video-background-controls';
if (this.player) {
this.player.playVideo();
}
}
controls.style.position = 'absolute';
controls.style.top = '10px';
controls.style.right = '10px';
controls.style['z-index'] = 2;
YoutubeBackground.prototype.pause = function () {
if (this.buttons.hasOwnProperty('play')) {
var btn_obj = this.buttons.play;
d0.addClass(btn_obj.element, btn_obj.button_properties.stateClassName);
d0.removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0])
d0.addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
this.controls_element = controls;
wrapper.parentNode.appendChild(controls);
}
if (this.player) {
this.player.pauseVideo();
}
}
return wrapper;
};
YoutubeBackground.prototype.unmute = function () {
if (this.buttons.hasOwnProperty('mute')) {
var btn_obj = this.buttons.mute;
d0.removeClass(btn_obj.element, btn_obj.button_properties.stateClassName);
d0.addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0])
d0.removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
YoutubeBackground.prototype.play = function () {
if (this.buttons.hasOwnProperty('play')) {
var btn_obj = this.buttons.play;
removeClass(btn_obj.element, btn_obj.button_properties.stateClassName);
addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0]);
removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
if (this.player) {
this.player.unMute();
}
}
if (this.player) {
this.player.playVideo();
}
};
YoutubeBackground.prototype.mute = function () {
if (this.buttons.hasOwnProperty('mute')) {
var btn_obj = this.buttons.mute;
d0.addClass(btn_obj.element, btn_obj.button_properties.stateClassName);
d0.removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0])
d0.addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
YoutubeBackground.prototype.pause = function () {
if (this.buttons.hasOwnProperty('play')) {
var btn_obj = this.buttons.play;
addClass(btn_obj.element, btn_obj.button_properties.stateClassName);
removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0]);
addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
if (this.player) {
this.player.mute();
}
}
if (this.player) {
this.player.pauseVideo();
}
};
//TODO: refactor states to be equal for all buttons
YoutubeBackground.prototype.generateActionButton = function (obj) {
var btn = document.createElement('button');
btn.className = obj.className;
btn.innerHTML = obj.innerHtml;
d0.addClass(btn.firstChild, obj.stateChildClassNames[0]);
YoutubeBackground.prototype.unmute = function () {
if (this.buttons.hasOwnProperty('mute')) {
var btn_obj = this.buttons.mute;
removeClass(btn_obj.element, btn_obj.button_properties.stateClassName);
addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0]);
removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
if (this.params[obj.condition_parameter] == obj.initialState) {
d0.addClass(btn, obj.stateClassName);
d0.removeClass(btn.firstChild, obj.stateChildClassNames[0]);
d0.addClass(btn.firstChild, obj.stateChildClassNames[1]);
}
if (this.player) {
this.player.unMute();
}
};
var self = this;
btn.addEventListener('click', function(e) {
if (d0.hasClass(this, obj.stateClassName)) {
self.state[obj.name] = false;
self[obj.actions[0]]();
} else {
self.state[obj.name] = true;
self[obj.actions[1]]();
}
});
YoutubeBackground.prototype.mute = function () {
if (this.buttons.hasOwnProperty('mute')) {
var btn_obj = this.buttons.mute;
addClass(btn_obj.element, btn_obj.button_properties.stateClassName);
removeClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[0]);
addClass(btn_obj.element.firstChild, btn_obj.button_properties.stateChildClassNames[1]);
}
this.buttons[obj.name] = {
element: btn,
button_properties: obj
};
if (this.player) {
this.player.mute();
}
};
this.controls_element.appendChild(btn);
};
//TODO: refactor states to be equal for all buttons
YoutubeBackground.prototype.generateActionButton = function (obj) {
var btn = document.createElement('button');
btn.className = obj.className;
btn.innerHTML = obj.innerHtml;
addClass(btn.firstChild, obj.stateChildClassNames[0]);
if (this.params[obj.condition_parameter] === obj.initialState) {
addClass(btn, obj.stateClassName);
removeClass(btn.firstChild, obj.stateChildClassNames[0]);
addClass(btn.firstChild, obj.stateChildClassNames[1]);
}
YoutubeBackground.prototype.parseResolutionString = function (res) {
var pts = res.split(/\s?:\s?/i);
if (pts.length < 2) {
return 16/9;
}
var self = this;
btn.addEventListener('click', function(e) {
if (hasClass(this, obj.stateClassName)) {
self.state[obj.name] = false;
self[obj.actions[0]]();
} else {
self.state[obj.name] = true;
self[obj.actions[1]]();
}
});
var w = parseInt(pts[0], 10);
var h = parseInt(pts[1], 10);
this.buttons[obj.name] = {
element: btn,
button_properties: obj
};
if (isNaN(w) || isNaN(h)) {
return 16/9;
}
this.controls_element.appendChild(btn);
};
return w/h;
};
function VimeoBackground(elem, params, id, uid) {
this.is_mobile = isMobile();
YoutubeBackground.prototype.isMobile = function (event) {
var is_mobile = false;
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) is_mobile = true;})(navigator.userAgent||navigator.vendor||window.opera);
this.element = elem;
this.ytid = id;
this.uid = uid;
this.player = null;
this.buttons = {};
return is_mobile;
};
this.state = {};
this.state.play = false;
this.state.mute = false;
YoutubeBackground.prototype.error = function (message, value) {
if (window.hasOwnProperty('console')
&& window.console.hasOwnProperty('error')) {
console.error(message, value);
}
};
this.params = {};
function ActivityMonitor(on_activity, on_inactivity, activity_timeout, inactivity_timeout, events) {
this.timer = null;
this.timeout = inactivity_timeout || 10000;
this.activity_timer = null; //for event throttling
this.activity_timeout = activity_timeout || 1000;
this.last_activity = null;
this.defaults = {
'pause': false, //deprecated
'play-button': false,
'mute-button': false,
'autoplay': true,
'muted': true,
'loop': true,
'mobile': false,
'load-background': true,
'resolution': '16:9',
'inline-styles': true,
'fit-box': false,
'offset': 200
};
this.resetTimer = function() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
this.__init__ = function () {
if (!this.ytid) {
return;
}
var self = this;
this.timer = setTimeout(function() {
if (self.last_activity + self.timeout + self.activity_timeout
>= new Date().getTime()) {
if (on_inactivity) {
on_inactivity();
}
}
}, this.timeout);
};
this.parseProperties(params);
this.params.resolution_mod = parseResolutionString(this.params.resolution);
this.state.playing = this.params.autoplay;
this.state.muted = this.params.muted;
this.logActivity = function() {
this.last_activity = new Date().getTime();
this.buildHTML();
this.injectIFrame();
};
if (on_activity) {
on_activity();
}
};
this.__init__();
}
this.onActivity = function() {
if (!this.activity_timer) {
var self = this;
this.activity_timer = setTimeout(function(){
self.logActivity();
self.resetTimer();
VimeoBackground.prototype.parseProperties = function (params) {
if (!params) {
this.params = this.defaults;
} else {
//load in defaults
for (var k in this.defaults) {
if (!this.params.hasOwnProperty(k)) {
this.params[k] = this.defaults[k];
}
}
}
clearTimeout(self.activity_timer);
self.activity_timer = null;
}, this.activity_timeout);
}
};
// load params from data attributes
for (var k in this.params) {
var data = this.element.getAttribute('data-ytbg-'+k);
this.__init__ = function() {
var self = this;
if (data !== undefined && data !== null) {
data = data === 'false' ? false : data;
this.params[k] = data;
}
}
if (!events) {
events = ['click', 'mousemove', 'scroll'];
} else {
if (typeof events === 'string') {
events = [events];
}
}
//pause deprecated
if (this.params.pause) {
this.params['play-button'] = this.params.pause;
}
};
for (var i = 0; i < events.length; i++) {
document.addEventListener(events[i], function() {
self.onActivity();
});
}
};
VimeoBackground.prototype.injectIFrame = function () {
this.iframe = document.createElement('iframe');
this.iframe.setAttribute('frameborder', 0);
this.iframe.setAttribute('allow', ['autoplay; mute']);
var src = 'https://player.vimeo.com/video/'+this.ytid+'?background=1&controls=0';
this.__init__();
}
if (this.params.muted) {
src += '&muted=1';
}
function VideoBackgrounds(selector, params) {
this.elements = selector;
if (this.params.autoplay) {
src += '&autoplay=1';
}
if (typeof selector === 'string') {
this.elements = document.querySelectorAll(selector);
}
if (this.params.loop) {
src += '&loop=1&autopause=0';
}
this.index = {};
this.re = {};
this.re.YOUTUBE = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i;
this.iframe.src = src;
this.__init__ = function () {
for (var i = 0; i < this.elements.length; i++) {
var element = this.elements[i];
if (this.uid) {
this.iframe.id = this.uid;
}
var link = element.getAttribute('data-youtube');
var ytid = this.getYTID(link);
var uid = this.generateUID(ytid);
if (this.params['inline-styles']) {
this.iframe.style.top = '50%';
this.iframe.style.left = '50%';
this.iframe.style.transform = 'translateX(-50%) translateY(-50%)';
this.iframe.style.position = 'absolute';
this.iframe.style.opacity = 1;
}
var yb = new YoutubeBackground(element, params, ytid, uid);
this.element.parentNode.appendChild(this.iframe);
this.iframe.parentNode.removeChild(this.element);
if (!uid) {
continue;
}
if (this.params['fit-box']) {
this.iframe.style.width = '100%';
this.iframe.style.height = '100%';
} else {
var self = this;
this.index[uid] = yb;
}
function onResize() {
var h = self.iframe.parentNode.offsetHeight + self.params.offset; // since showinfo is deprecated and ignored after September 25, 2018. we add +200 to hide it in the overflow
var w = self.iframe.parentNode.offsetWidth + self.params.offset;
var res = self.params.resolution_mod;
var self = this;
if (res > w/h) {
self.iframe.style.width = h*res + 'px';
self.iframe.style.height = h + 'px';
} else {
self.iframe.style.width = w + 'px';
self.iframe.style.height = w/res + 'px';
}
}
this.initYTPlayers(function() {
//TODO: FIX!
if (params &&
(params.hasOwnProperty('activity_timeout')
|| params.hasOwnProperty('inactivity_timeout'))) {
this.activity_monitor = new ActivityMonitor(function () {
self.playVideos();
}, function() {
self.pauseVideos();
},
params ? params.activity_timeout : null,
params ? params.inactivity_timeout : null,
['mousemove', 'scroll']
);
}
});
};
window.addEventListener('resize', onResize);
onResize();
}
};
this.__init__();
}
VimeoBackground.prototype.buildHTML = function () {
var parent = this.element.parentNode;
// wrap
var wrapper = document.createElement('div');
wrapper.className = 'youtube-background';
parent.insertBefore(wrapper, this.element);
wrapper.appendChild(this.element);
var id = this.element.id;
this.element.id = '';
wrapper.id = id;
VideoBackgrounds.prototype.getYTID = function (link) {
if (link !== undefined && link !== null) {
var pts = link.match(this.re.YOUTUBE);
if (pts && pts.length) {
this.re.YOUTUBE.lastIndex = 0; //regex needs a reset in for loops, I always forget this
return pts[1];
}
}
return null;
};
//set css rules
var wrapper_styles = {
"height" : "100%",
"width" : "100%",
"z-index": "0",
"position": "absolute",
"overflow": "hidden",
"top": 0, // added by @insad
"left": 0,
"bottom": 0,
"right": 0
};
VideoBackgrounds.prototype.generateUID = function (pref) {
//index the instance
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive
}
if (!this.params['mute-button']) {
wrapper_styles["pointer-events"] = "none"; // avoid right mouse click popup menu
}
var uid = pref +'-'+ getRandomIntInclusive(0, 9999);
while (this.index.hasOwnProperty(uid)) {
uid = pref +'-'+ getRandomIntInclusive(0, 9999);
}
if (this.params['load-background']) {
//TODO: wrapper_styles['background-image'] = 'url(https://img.youtube.com/vi/'+this.ytid+'/maxresdefault.jpg)';
wrapper_styles['background-size'] = 'cover';
wrapper_styles['background-repeat'] = 'no-repeat';
wrapper_styles['background-position'] = 'center';
}
return uid;
};
if (this.params['inline-styles']) {
for (var property in wrapper_styles) {
wrapper.style[property] = wrapper_styles[property];
}
VideoBackgrounds.prototype.pauseVideos = function () {
for (var k in this.index) {
this.index[k].pause();
}
};
wrapper.parentNode.style.position = 'relative';
}
VideoBackgrounds.prototype.playVideos = function () {
for (var k in this.index) {
this.index[k].play();
}
};
if (this.is_mobile && !this.params.mobile) {
return wrapper;
}
VideoBackgrounds.prototype.initYTPlayers = function (callback) {
var self = this;
return wrapper;
};
window.onYouTubeIframeAPIReady = function () {
for (var k in self.index) {
self.index[k].initYTPlayer();
}
function ActivityMonitor(on_activity, on_inactivity, activity_timeout, inactivity_timeout, events) {
this.timer = null;
this.timeout = inactivity_timeout || 10000;
this.activity_timer = null; //for event throttling
this.activity_timeout = activity_timeout || 1000;
this.last_activity = null;
if (callback) {
setTimeout(callback, 100);
}
};
this.resetTimer = function() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
if (window.hasOwnProperty('YT') && window.YT.loaded) {
window.onYouTubeIframeAPIReady();
}
};
var self = this;
this.timer = setTimeout(function() {
if (self.last_activity + self.timeout + self.activity_timeout
>= new Date().getTime()) {
if (on_inactivity) {
on_inactivity();
}
}
}, this.timeout);
};
if (window.hasOwnProperty('jQuery')) {
(function ($) {
$.fn.youtube_background = function(params) {
var $this = $(this);
new VideoBackgrounds(this, params);
return $this;
};
})(jQuery);
}
this.logActivity = function() {
this.last_activity = new Date().getTime();
if (on_activity) {
on_activity();
}
};
this.onActivity = function() {
if (!this.activity_timer) {
var self = this;
this.activity_timer = setTimeout(function(){
self.logActivity();
self.resetTimer();
clearTimeout(self.activity_timer);
self.activity_timer = null;
}, this.activity_timeout);
}
};
this.__init__ = function() {
var self = this;
if (!events) {
events = ['click', 'mousemove', 'scroll'];
} else {
if (typeof events === 'string') {
events = [events];
}
}
for (var i = 0; i < events.length; i++) {
document.addEventListener(events[i], function() {
self.onActivity();
});
}
};
this.__init__();
}
function VideoBackgrounds(selector, params) {
this.elements = selector;
if (typeof selector === 'string') {
this.elements = document.querySelectorAll(selector);
}
this.index = {};
this.re = {};
this.re.YOUTUBE = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i;
this.re.VIMEO = /(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(\d+)(?:[a-zA-Z0-9_\-]+)?/i;
this.__init__ = function () {
for (var i = 0; i < this.elements.length; i++) {
var element = this.elements[i];
var link = element.getAttribute('data-youtube');
var vid_data = this.getVidID(link);
if (!vid_data) {
continue;
}
var uid = this.generateUID(vid_data.id);
if (!uid) {
continue;
}
if (vid_data.type === 'YOUTUBE') {
var yb = new YoutubeBackground(element, params, vid_data.id, uid);
this.index[uid] = yb;
} else if (vid_data.type === 'VIMEO') {
var vm = new VimeoBackground(element, params, vid_data.id, uid);
this.index[uid] = vm;
}
}
var self = this;
this.initYTPlayers(function() {
//TODO: FIX!
if (params &&
(params.hasOwnProperty('activity_timeout')
|| params.hasOwnProperty('inactivity_timeout'))) {
this.activity_monitor = new ActivityMonitor(function () {
self.playVideos();
}, function() {
self.pauseVideos();
},
params ? params.activity_timeout : null,
params ? params.inactivity_timeout : null,
['mousemove', 'scroll']
);
}
});
};
this.__init__();
}
VideoBackgrounds.prototype.getYTID = function (link) {
if (link !== undefined && link !== null) {
var pts = link.match(this.re.YOUTUBE);
if (pts && pts.length) {
this.re.YOUTUBE.lastIndex = 0; //regex needs a reset in for loops, I always forget this
return pts[1];
}
}
return null;
};
VideoBackgrounds.prototype.getVidID = function (link) {
if (link !== undefined && link !== null) {
for (var k in this.re) {
var pts = link.match(this.re[k]);
if (pts && pts.length) {
this.re[k].lastIndex = 0;
return {
id: pts[1],
type: k
}
}
}
}
return null;
};
VideoBackgrounds.prototype.generateUID = function (pref) {
//index the instance
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive
}
var uid = pref +'-'+ getRandomIntInclusive(0, 9999);
while (this.index.hasOwnProperty(uid)) {
uid = pref +'-'+ getRandomIntInclusive(0, 9999);
}
return uid;
};
VideoBackgrounds.prototype.pauseVideos = function () {
for (var k in this.index) {
this.index[k].pause();
}
};
VideoBackgrounds.prototype.playVideos = function () {
for (var k in this.index) {
this.index[k].play();
}
};
VideoBackgrounds.prototype.initYTPlayers = function (callback) {
var self = this;
window.onYouTubeIframeAPIReady = function () {
for (var k in self.index) {
if (self.index[k] instanceof YoutubeBackground) {
self.index[k].initYTPlayer();
}
}
if (callback) {
setTimeout(callback, 100);
}
};
if (window.hasOwnProperty('YT') && window.YT.loaded) {
window.onYouTubeIframeAPIReady();
}
};
if (typeof jQuery == 'function') {
(function ($) {
$.fn.youtube_background = function (params) {
var $this = $(this);
new VideoBackgrounds(this, params);
return $this;
};
})(jQuery);
}
window.VideoBackgrounds = VideoBackgrounds;
}());
{
"name": "youtube-background",
"version": "1.0.7",
"version": "1.0.8",
"description": "Simple jQuery plugin for embedding YouTube videos as a cover background",

@@ -19,5 +19,4 @@ "main": "jquery.youtube-background.js",

],
"author": "Nikola Stamatovic <nikola.stamatovic@me.com>",
"contributors": [
],
"author": "Nikola Stamatovic <@stamat>",
"contributors": [],
"license": "MIT",

@@ -27,5 +26,18 @@ "bugs": {

},
"peerDependencies": {
"jquery": ">=1.7.0"
"devDependencies": {
"@rollup/plugin-commonjs": "^16.0.0",
"@rollup/plugin-node-resolve": "^10.0.0",
"fs": "0.0.1-security",
"gulp": "^4.0.2",
"gulp-cached": "^1.1.1",
"gulp-connect": "^5.7.0",
"gulp-jshint": "^2.1.0",
"jshint": "^2.12.0",
"jshint-stylish": "^2.2.1",
"rollup": "^2.33.3",
"rollup-plugin-license": "^2.3.0",
"rollup-plugin-terser": "^7.0.2",
"serve": "^11.0.2",
"yargs": "^16.1.1"
}
}

@@ -61,2 +61,4 @@ # jquery.youtube-background

**mobile** | false | boolean | Keep the youtube embed on mobile
**fit-box** | false | boolean | Set iframe to fit the container, meaning `width: 100%; height: 100%`
**inline-styles** | true | boolean | Enable/disable inline styles from the iframe and wrapper. The default wrapper styles are: `background-size: cover;`, `background-repeat: no-repeat;` and `background-position: center;`; the default iframe styles are `top: 50%;`, `left: 50%;`, `transform: translateX(-50%) translateY(-50%);`, `position: absolute;`, and `opacity: 0;`
**load-background** | true | boolean | Fetch background from youtube

@@ -77,3 +79,5 @@ **offset** | 200 | int | showinfo:0 id deprecated since September 25, 2018. - this setting makes the video a bit larger than it's viewport to hide the info elements

* **data-ytbg-resolution**
* **data-ytbg-fit-box**
* **data-ytbg-load-background**
* **data-ytbg-inline-styles**

@@ -100,4 +104,4 @@ #### Example - Properties as HTML attributes

jQuery('[data-youtube]').youtube_background({
'play-button': true
});
'play-button': true
});
});

@@ -107,2 +111,26 @@ </script>

## Development
Development setup uses **GULP with Rollup** to bundle ES modules into IIFE `jquery.youtube-background.js` and `jquery.youtube-background.min.js`
To install the required packages for running **GULP**, run:
```
npm install
```
To run the server on `http://localhost:4040`, run:
```
gulp
```
Code will automatically be packaged into IIFE while you develop.
To generate minified version of the code, run:
```
gulp build --production
```
## todo

@@ -109,0 +137,0 @@ - [x] Autoplay property

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc