youtube-background
Advanced tools
Comparing version 1.0.7 to 1.0.8
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
75746
0
16
1554
145
14
1
1