| Current Path : /home/ereika83/public_html/wp-content/uploads/pp_projects/3726/js/ |
| Current File : /home/ereika83/public_html/wp-content/uploads/pp_projects/3726/js/sales-page--all.js |
/*! Backstretch - v2.0.4 - 2013-06-19
* http://srobbin.com/jquery-plugins/backstretch/
* Copyright (c) 2013 Scott Robbin; Licensed MIT */
(function(a,d,p){a.fn.backstretch=function(c,b){(c===p||0===c.length)&&a.error("No images were supplied for Backstretch");0===a(d).scrollTop()&&d.scrollTo(0,0);return this.each(function(){var d=a(this),g=d.data("backstretch");if(g){if("string"==typeof c&&"function"==typeof g[c]){g[c](b);return}b=a.extend(g.options,b);g.destroy(!0)}g=new q(this,c,b);d.data("backstretch",g)})};a.backstretch=function(c,b){return a("body").backstretch(c,b).data("backstretch")};a.expr[":"].backstretch=function(c){return a(c).data("backstretch")!==p};a.fn.backstretch.defaults={centeredX:!0,centeredY:!0,duration:5E3,fade:0};var r={left:0,top:0,overflow:"hidden",margin:0,padding:0,height:"100%",width:"100%",zIndex:-999999},s={position:"absolute",display:"none",margin:0,padding:0,border:"none",width:"auto",height:"auto",maxHeight:"none",maxWidth:"none",zIndex:-999999},q=function(c,b,e){this.options=a.extend({},a.fn.backstretch.defaults,e||{});this.images=a.isArray(b)?b:[b];a.each(this.images,function(){a("<img />")[0].src=this});this.isBody=c===document.body;this.$container=a(c);this.$root=this.isBody?l?a(d):a(document):this.$container;c=this.$container.children(".backstretch").first();this.$wrap=c.length?c:a('<div class="backstretch"></div>').css(r).appendTo(this.$container);this.isBody||(c=this.$container.css("position"),b=this.$container.css("zIndex"),this.$container.css({position:"static"===c?"relative":c,zIndex:"auto"===b?0:b,background:"none"}),this.$wrap.css({zIndex:-999998}));this.$wrap.css({position:this.isBody&&l?"fixed":"absolute"});this.index=0;this.show(this.index);a(d).on("resize.backstretch",a.proxy(this.resize,this)).on("orientationchange.backstretch",a.proxy(function(){this.isBody&&0===d.pageYOffset&&(d.scrollTo(0,1),this.resize())},this))};q.prototype={resize:function(){try{var a={left:0,top:0},b=this.isBody?this.$root.width():this.$root.innerWidth(),e=b,g=this.isBody?d.innerHeight?d.innerHeight:this.$root.height():this.$root.innerHeight(),j=e/this.$img.data("ratio"),f;j>=g?(f=(j-g)/2,this.options.centeredY&&(a.top="-"+f+"px")):(j=g,e=j*this.$img.data("ratio"),f=(e-b)/2,this.options.centeredX&&(a.left="-"+f+"px"));this.$wrap.css({width:b,height:g}).find("img:not(.deleteable)").css({width:e,height:j}).css(a)}catch(h){}return this},show:function(c){if(!(Math.abs(c)>this.images.length-1)){var b=this,e=b.$wrap.find("img").addClass("deleteable"),d={relatedTarget:b.$container[0]};b.$container.trigger(a.Event("backstretch.before",d),[b,c]);this.index=c;clearInterval(b.interval);b.$img=a("<img />").css(s).bind("load",function(f){var h=this.width||a(f.target).width();f=this.height||a(f.target).height();a(this).data("ratio",h/f);a(this).fadeIn(b.options.speed||b.options.fade,function(){e.remove();b.paused||b.cycle();a(["after","show"]).each(function(){b.$container.trigger(a.Event("backstretch."+this,d),[b,c])})});b.resize()}).appendTo(b.$wrap);b.$img.attr("src",b.images[c]);return b}},next:function(){return this.show(this.index<this.images.length-1?this.index+1:0)},prev:function(){return this.show(0===this.index?this.images.length-1:this.index-1)},pause:function(){this.paused=!0;return this},resume:function(){this.paused=!1;this.next();return this},cycle:function(){1<this.images.length&&(clearInterval(this.interval),this.interval=setInterval(a.proxy(function(){this.paused||this.next()},this),this.options.duration));return this},destroy:function(c){a(d).off("resize.backstretch orientationchange.backstretch");clearInterval(this.interval);c||this.$wrap.remove();this.$container.removeData("backstretch")}};var l,f=navigator.userAgent,m=navigator.platform,e=f.match(/AppleWebKit\/([0-9]+)/),e=!!e&&e[1],h=f.match(/Fennec\/([0-9]+)/),h=!!h&&h[1],n=f.match(/Opera Mobi\/([0-9]+)/),t=!!n&&n[1],k=f.match(/MSIE ([0-9]+)/),k=!!k&&k[1];l=!((-1<m.indexOf("iPhone")||-1<m.indexOf("iPad")||-1<m.indexOf("iPod"))&&e&&534>e||d.operamini&&"[object OperaMini]"==={}.toString.call(d.operamini)||n&&7458>t||-1<f.indexOf("Android")&&e&&533>e||h&&6>h||"palmGetResource"in d&&e&&534>e||-1<f.indexOf("MeeGo")&&-1<f.indexOf("NokiaBrowser/8.5.0")||k&&6>=k)})(jQuery,window);
/* jQuery tubular plugin
|* by Sean McCambridge
|* http://www.seanmccambridge.com/tubular
|* version: 1.0
|* updated: October 1, 2012
|* since 2010
|* licensed under the MIT License
|* Enjoy.
|*
|* Thanks,
|* Sean */
(function ($, window) {
// test for feature support and return if failure
// defaults
var defaults = {
ratio: 16 / 9, // usually either 4/3 or 16/9 -- tweak as needed
videoId: 'ZCAnLxRvNNc', // toy robot in space is a good default, no?
mute: true,
repeat: true,
width: $(window).width(),
wrapperZIndex: 99,
playButtonClass: 'tubular-play',
pauseButtonClass: 'tubular-pause',
muteButtonClass: 'tubular-mute',
volumeUpClass: 'tubular-volume-up',
volumeDownClass: 'tubular-volume-down',
increaseVolumeBy: 10,
start: 0
};
// methods
var tubular = function (node, options) { // should be called on the wrapper div
options = $.extend({}, defaults, options),
$body = $('body'); // cache body node
$node = $(node); // cache wrapper node
// build container
var tubularContainer = '<div id="tubular-container" style="overflow: hidden; position: fixed; z-index: 1; width: 100%; height: 100%"><div id="tubular-player" style="position: absolute"></div></div><div id="tubular-shield" style="width: 100%; height: 100%; z-index: 2; position: absolute; left: 0; top: 0;"></div>';
// set up css prereq's, inject tubular container and set up wrapper defaults
$('html,body').css({'width': '100%', 'height': '100%'});
$body.prepend(tubularContainer);
$node.css({position: 'relative', 'z-index': options.wrapperZIndex});
// set up iframe player, use global scope so YT api can talk
window.player;
window.onYouTubeIframeAPIReady = function () {
player = new YT.Player('tubular-player', {
width: options.width,
height: Math.ceil(options.width / options.ratio),
videoId: options.videoId,
playerVars: {
controls: 0,
showinfo: 0,
modestbranding: 1,
wmode: 'transparent'
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
};
window.onPlayerReady = function (e) {
resize();
if (options.mute) e.target.mute();
e.target.seekTo(options.start);
e.target.playVideo();
};
window.onPlayerStateChange = function (state) {
if (state.data === 0 && options.repeat) { // video ended and repeat option is set true
player.seekTo(options.start); // restart
}
};
// resize handler updates width, height and offset of player after resize/init
var resize = function () {
var width = $(window).width(),
pWidth, // player width, to be defined
height = $(window).height(),
pHeight, // player height, tbd
$tubularPlayer = $('#tubular-player');
// when screen aspect ratio differs from video, video must center and underlay one dimension
if (width / options.ratio < height) { // if new video height < window height (gap underneath)
pWidth = Math.ceil(height * options.ratio); // get new player width
$tubularPlayer.width(pWidth).height(height).css({left: (width - pWidth) / 2, top: 0}); // player width is greater, offset left; reset top
} else { // new video width < window width (gap to right)
pHeight = Math.ceil(width / options.ratio); // get new player height
$tubularPlayer.width(width).height(pHeight).css({left: 0, top: (height - pHeight) / 2}); // player height is greater, offset top; reset left
}
};
// events
$(window).on('resize.tubular', function () {
resize();
});
$body.on('click', '.' + options.playButtonClass, function (e) { // play button
e.preventDefault();
player.playVideo();
}).on('click', '.' + options.pauseButtonClass, function (e) { // pause button
e.preventDefault();
player.pauseVideo();
}).on('click', '.' + options.muteButtonClass, function (e) { // mute button
e.preventDefault();
(player.isMuted()) ? player.unMute() : player.mute();
}).on('click', '.' + options.volumeDownClass, function (e) { // volume down button
e.preventDefault();
var currentVolume = player.getVolume();
if (currentVolume < options.increaseVolumeBy) currentVolume = options.increaseVolumeBy;
player.setVolume(currentVolume - options.increaseVolumeBy);
}).on('click', '.' + options.volumeUpClass, function (e) { // volume up button
e.preventDefault();
if (player.isMuted()) player.unMute(); // if mute is on, unmute
var currentVolume = player.getVolume();
if (currentVolume > 100 - options.increaseVolumeBy) currentVolume = 100 - options.increaseVolumeBy;
player.setVolume(currentVolume + options.increaseVolumeBy);
})
};
// load yt iframe js api
var load_yt_api = function () {
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
tag.id = 'yt_api_script';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
};
load_yt_api();
// create plugin
$.fn.tubular = function (options) {
if (typeof options == 'string') {
if (options == 'remove') {
}
} else if (typeof options == 'object')
return this.each(function () {
if (!$.data(this, 'tubular_instantiated')) { // let's only run one
$.data(this, 'tubular_instantiated', tubular(this, options));
}
});
}
})(jQuery, window);
/*
* ******************************************************************************
* jquery.mb.components
* file: jquery.mb.YTPlayer.js
*
* Copyright (c) 2001-2013. Matteo Bicocchi (Pupunzi);
* Open lab srl, Firenze - Italy
* email: matteo@open-lab.com
* site: http://pupunzi.com
* blog: http://pupunzi.open-lab.com
* http://open-lab.com
*
* Licences: MIT, GPL
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* last modified: 18/03/13 22.42
* *****************************************************************************
*/
/*Browser detection patch*/
(function(){if(!(8>jQuery.fn.jquery.split(".")[1])){jQuery.browser={};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.msie=!1;var a=navigator.userAgent;jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var c,b;if(-1!=(b=a.indexOf("Opera"))){if(jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=a.substring(b+6),-1!=(b= a.indexOf("Version")))jQuery.browser.fullVersion=a.substring(b+8)}else if(-1!=(b=a.indexOf("MSIE")))jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer",jQuery.browser.fullVersion=a.substring(b+5);else if(-1!=(b=a.indexOf("Chrome")))jQuery.browser.webkit=!0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=a.substring(b+7);else if(-1!=(b=a.indexOf("Safari"))){if(jQuery.browser.webkit=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=a.substring(b+7),-1!=(b=a.indexOf("Version")))jQuery.browser.fullVersion= a.substring(b+8)}else if(-1!=(b=a.indexOf("Firefox")))jQuery.browser.mozilla=!0,jQuery.browser.name="Firefox",jQuery.browser.fullVersion=a.substring(b+8);else if((c=a.lastIndexOf(" ")+1)<(b=a.lastIndexOf("/")))jQuery.browser.name=a.substring(c,b),jQuery.browser.fullVersion=a.substring(b+1),jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()&&(jQuery.browser.name=navigator.appName);if(-1!=(a=jQuery.browser.fullVersion.indexOf(";")))jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0, a);if(-1!=(a=jQuery.browser.fullVersion.indexOf(" ")))jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,a);jQuery.browser.majorVersion=parseInt(""+jQuery.browser.fullVersion,10);isNaN(jQuery.browser.majorVersion)&&(jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10));jQuery.browser.version=jQuery.browser.majorVersion}})(jQuery);
/*******************************************************************************
* jQuery.mb.components: jquery.mb.CSSAnimate
******************************************************************************/
jQuery.fn.CSSAnimate=function(a,b,k,l,f){return this.each(function(){var c=jQuery(this);if(0!==c.length&&a){"function"==typeof b&&(f=b,b=jQuery.fx.speeds._default);"function"==typeof k&&(f=k,k=0);"function"==typeof l&&(f=l,l="cubic-bezier(0.65,0.03,0.36,0.72)");if("string"==typeof b)for(var j in jQuery.fx.speeds)if(b==j){b=jQuery.fx.speeds[j];break}else b=null;if(jQuery.support.transition){var e="",h="transitionEnd";jQuery.browser.webkit?(e="-webkit-",h="webkitTransitionEnd"):jQuery.browser.mozilla? (e="-moz-",h="transitionend"):jQuery.browser.opera?(e="-o-",h="otransitionend"):jQuery.browser.msie&&(e="-ms-",h="msTransitionEnd");j=[];for(d in a){var g=d;"transform"===g&&(g=e+"transform",a[g]=a[d],delete a[d]);"transform-origin"===g&&(g=e+"transform-origin",a[g]=a[d],delete a[d]);j.push(g);c.css(g)||c.css(g,0)}d=j.join(",");c.css(e+"transition-property",d);c.css(e+"transition-duration",b+"ms");c.css(e+"transition-delay",k+"ms");c.css(e+"transition-timing-function",l);c.css(e+"backface-visibility", "hidden");setTimeout(function(){c.css(a)},0);setTimeout(function(){c.called||!f?c.called=!1:f()},b+20);c.on(h,function(a){c.off(h);c.css(e+"transition","");a.stopPropagation();"function"==typeof f&&(c.called=!0,f());return!1})}else{for(var d in a)"transform"===d&&delete a[d],"transform-origin"===d&&delete a[d],"auto"===a[d]&&delete a[d];if(!f||"string"===typeof f)f="linear";c.animate(a,b,f)}}})}; jQuery.fn.CSSAnimateStop=function(){var a="",b="transitionEnd";jQuery.browser.webkit?(a="-webkit-",b="webkitTransitionEnd"):jQuery.browser.mozilla?(a="-moz-",b="transitionend"):jQuery.browser.opera?(a="-o-",b="otransitionend"):jQuery.browser.msie&&(a="-ms-",b="msTransitionEnd");jQuery(this).css(a+"transition","");jQuery(this).off(b)}; jQuery.support.transition=function(){var a=(document.body||document.documentElement).style;return void 0!==a.transition||void 0!==a.WebkitTransition||void 0!==a.MozTransition||void 0!==a.MsTransition||void 0!==a.OTransition}();
/*
* Metadata - jQuery plugin for parsing metadata from elements
* Copyright (c) 2006 John Resig, Yehuda Katz, Jörn Zaefferer, Paul McLanahan
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
(function(c){c.extend({metadata:{defaults:{type:"class",name:"metadata",cre:/({.*})/,single:"metadata"},setType:function(b,c){this.defaults.type=b;this.defaults.name=c},get:function(b,f){var d=c.extend({},this.defaults,f);d.single.length||(d.single="metadata");var a=c.data(b,d.single);if(a)return a;a="{}";if("class"==d.type){var e=d.cre.exec(b.className);e&&(a=e[1])}else if("elem"==d.type){if(!b.getElementsByTagName)return;e=b.getElementsByTagName(d.name);e.length&&(a=c.trim(e[0].innerHTML))}else void 0!= b.getAttribute&&(e=b.getAttribute(d.name))&&(a=e);0>a.indexOf("{")&&(a="{"+a+"}");a=eval("("+a+")");c.data(b,d.single,a);return a}}});c.fn.metadata=function(b){return c.metadata.get(this[0],b)}})(jQuery);
/***************************************************************************************/
if(typeof ytp != "object")
ytp ={};
String.prototype.getVideoID=function(){
var movieURL;
if(this.substr(0,16)=="http://youtu.be/"){
movieURL= this.replace("http://youtu.be/","");
}else if(this.indexOf("http")>-1){
movieURL = this.match(/[\\?&]v=([^&#]*)/)[1];
}else{
movieURL = this
}
return movieURL;
};
var isDevice = 'ontouchstart' in window;
function onYouTubePlayerAPIReady() {
if(jQuery.mbYTPlayer.YTAPIReady)
return;
jQuery(document).trigger("YTAPIReady");
jQuery.mbYTPlayer.YTAPIReady=true;
}
(function (jQuery) {
jQuery.mbYTPlayer = {
name : "jquery.mb.YTPlayer",
version : "2.3.2",
author : "Matteo Bicocchi",
defaults : {
containment : "body",
ratio : "16/9",
showYTLogo : false,
videoURL : null,
startAt : 0,
autoPlay : true,
addRaster : false,
opacity : 1,
quality : "default",
mute : false,
loop : true,
showControls : true,
showAnnotations : false,
printUrl : true,
onReady : function (event) {},
onStateChange : function (event) {},
onPlaybackQualityChange: function (event) {},
onError : function (event) {}
},
//todo: use @font-face instead
controls : {
play : "<img src='images/play.png'>",
pause : "<img src='images/pause.png'>",
mute : "<img src='images/mute.png'>",
unmute: "<img src='images/unmute.png'>",
onlyYT: "<img src='images/onlyVideo.png'>",
ytLogo: "<img src='images/YTLogo.png'>"
},
rasterImg : "",
rasterImgRetina: "",
buildPlayer: function (options) {
if (isDevice)
return;
document.YTP = {};
return this.each(function () {
var YTPlayer = this;
var $YTPlayer = jQuery(YTPlayer);
YTPlayer.loop = 0;
YTPlayer.opt = {};
var property = {};
if (jQuery.metadata) {
jQuery.metadata.setType("class");
property = $YTPlayer.metadata();
}
if (jQuery.isEmptyObject(property))
property = $YTPlayer.data("property") ? eval('(' + $YTPlayer.data("property") + ')') : {};
jQuery.extend(YTPlayer.opt, jQuery.mbYTPlayer.defaults, options, property);
if (!$YTPlayer.attr("id"))
$YTPlayer.attr("id", "id_" + new Date().getTime());
YTPlayer.opt.id = YTPlayer.id;
YTPlayer.isAlone = false;
/*to maintain back compatibility
* ***********************************************************/
if (YTPlayer.opt.isBgndMovie)
YTPlayer.opt.containment = "body";
if (YTPlayer.opt.isBgndMovie && YTPlayer.opt.isBgndMovie.mute != undefined)
YTPlayer.opt.mute = YTPlayer.opt.isBgndMovie.mute;
if (!YTPlayer.opt.videoURL)
YTPlayer.opt.videoURL = $YTPlayer.attr("href");
/************************************************************/
var playerID = "mbYTP_" + YTPlayer.id;
var videoID = this.opt.videoURL ? this.opt.videoURL.getVideoID() : $YTPlayer.attr("href") ? $YTPlayer.attr("href").getVideoID() : false;
YTPlayer.opt.showAnnotations = (YTPlayer.opt.showAnnotations) ? '0' : '3';
var playerVars = { 'autoplay': 0, 'modestbranding': 1, 'controls': 0, 'showinfo': 0, 'rel': 0, 'enablejsapi': 1, 'version': 3, 'playerapiid': playerID, 'origin': '*', 'allowfullscreen': true, 'wmode': "transparent", 'iv_load_policy': YTPlayer.opt.showAnnotations};
var canPlayHTML5 = false;
var v = document.createElement('video');
if (v.canPlayType) {
canPlayHTML5 = true;
}
if (canPlayHTML5 && !jQuery.browser.msie)
jQuery.extend(playerVars, {'html5': 1});
var playerBox = jQuery("<div/>").attr("id", playerID).addClass("playerBox");
var overlay = jQuery("<div/>").css({position: "absolute", top: 0, left: 0, width: "100%", height: "100%"}).addClass("YTPOverlay"); //YTPlayer.isBackground ? "fixed" :
YTPlayer.opt.containment = YTPlayer.opt.containment == "self" ? jQuery(this) : jQuery(YTPlayer.opt.containment);
YTPlayer.isBackground = YTPlayer.opt.containment.get(0).tagName.toLowerCase() == "body";
if (YTPlayer.opt.addRaster) {
var retina = (window.retina || window.devicePixelRatio > 1);
overlay.css({backgroundImage: "url(" + (retina ? jQuery.mbYTPlayer.rasterImgRetina : jQuery.mbYTPlayer.rasterImg) + ")"});
}
var wrapper = jQuery("<div/>").addClass("mbYTP_wrapper").attr("id", "wrapper_" + playerID);
wrapper.css({position: "absolute", zIndex: 1, minWidth: "100%", minHeight: "100%", overflow: "hidden", opacity: 0});
playerBox.css({position: "absolute", zIndex: 0, width: "100%", height: "100%", top: 0, left: 0, overflow: "hidden", opacity: this.opt.opacity});
wrapper.append(playerBox);
if (YTPlayer.isBackground && document.YTP.isInit)
return;
YTPlayer.opt.containment.children().each(function () {
if (jQuery(this).css("position") == "static")
jQuery(this).css("position", "relative");
});
if (YTPlayer.isBackground) {
jQuery("body").css({position: "relative", minWidth: "100%", minHeight: "100%", zIndex: 1, boxSizing: "border-box"});
wrapper.css({position: "fixed", top: 0, left: 0, zIndex: 0});
$YTPlayer.hide();
YTPlayer.opt.containment.prepend(wrapper);
} else
YTPlayer.opt.containment.prepend(wrapper);
YTPlayer.wrapper = wrapper;
playerBox.css({opacity: 1});
playerBox.after(overlay);
if(!YTPlayer.isBackground){
overlay.on("mouseenter",function(){
$YTPlayer.find(".mb_YTVPBar").addClass("visible");
}).on("mouseleave",function(){
$YTPlayer.find(".mb_YTVPBar").removeClass("visible");
})
}
// add YT API to the header
var tag = document.createElement('script');
tag.src = "http://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
jQuery(document).on("YTAPIReady", function () {
if ((YTPlayer.isBackground && document.YTP.isInit) || YTPlayer.opt.isInit)
return;
if(YTPlayer.isBackground && ytp && ytp.stopMovieOnClick)
jQuery(document).off("mousedown.ytplayer").on("mousedown,.ytplayer",function(e){
var target = jQuery(e.target);
if(target.is("a") || target.parents().is("a")){
player.pauseYTP();
YTPlayer.wrapper.css({opacity:0});
}
});
if (YTPlayer.isBackground)
document.YTP.isInit = true;
YTPlayer.opt.isInit = true;
YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100;
jQuery(document).on("getVideoInfo_" + YTPlayer.opt.id, function () {
var player = new YT.Player(playerID, {
videoId : videoID,
playerVars: playerVars,
events : {
'onReady': function (event) {
YTPlayer.player = event.target;
YTPlayer.playerEl = YTPlayer.player.getIframe();
$YTPlayer.optimizeDisplay();
$(window).on("resize.YTP",function () {
$YTPlayer.optimizeDisplay();
});
if (YTPlayer.opt.showControls)
jQuery(YTPlayer).buildYTPControls();
YTPlayer.player.setPlaybackQuality(YTPlayer.opt.quality);
if (YTPlayer.opt.startAt > 0)
YTPlayer.player.seekTo(parseFloat(YTPlayer.opt.startAt), true);
if (!YTPlayer.opt.autoPlay) {
YTPlayer.checkForStartAt = setInterval(function () {
if (YTPlayer.player.getCurrentTime() >= YTPlayer.opt.startAt) {
clearInterval(YTPlayer.checkForStartAt);
$YTPlayer.pauseYTP();
/*
if (YTPlayer.opt.mute) {
jQuery(YTPlayer).muteYTPVolume();
}else{
jQuery(YTPlayer).unmuteYTPVolume();
}
*/
}
}, 1);
} else {
$YTPlayer.playYTP();
YTPlayer.player.setVolume(YTPlayer.opt.vol);
/*
if (YTPlayer.opt.mute) {
jQuery(YTPlayer).muteYTPVolume();
}else{
jQuery(YTPlayer).unmuteYTPVolume();
}
*/
}
if (typeof YTPlayer.opt.onReady == "function")
YTPlayer.opt.onReady($YTPlayer);
},
'onStateChange' : function (event) {
/*
-1 (unstarted)
0 (ended)
1 (playing)
2 (paused)
3 (buffering)
5 (video cued).
*/
if (typeof event.target.getPlayerState != "function")
return;
var state = event.target.getPlayerState();
var playerBox = jQuery(YTPlayer.playerEl);
var controls = jQuery("#controlBar_" + YTPlayer.id);
playerBox.css({opacity: 1});
var data = YTPlayer.opt;
if (state == 0) {
if (YTPlayer.state == state)
return;
YTPlayer.state = state;
YTPlayer.player.pauseVideo();
var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
if (data.loop) {
YTPlayer.wrapper.css({opacity: 0});
YTPlayer.player.seekTo(startAt);
$YTPlayer.playYTP();
} else if (!YTPlayer.isBackground) {
YTPlayer.player.seekTo(startAt, true);
$YTPlayer.playYTP();
setTimeout(function () {
$YTPlayer.pauseYTP();
}, 10);
}
if (!data.loop && YTPlayer.isBackground)
YTPlayer.wrapper.CSSAnimate({opacity: 0}, 2000);
else if (data.loop) {
YTPlayer.wrapper.css({opacity: 0});
YTPlayer.loop++;
}
controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
jQuery(YTPlayer).trigger("YTPEnd");
}
if (state == 3) {
if (YTPlayer.state == state)
return;
YTPlayer.state = state;
controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
jQuery(YTPlayer).trigger("YTPBuffering");
}
if (state == -1) {
if (YTPlayer.state == state)
return;
YTPlayer.state = state;
jQuery(YTPlayer).trigger("YTPUnstarted");
}
if (state == 1) {
if (YTPlayer.state == state)
return;
YTPlayer.state = state;
if(YTPlayer.opt.mute){
$YTPlayer.muteYTPVolume();
YTPlayer.opt.mute = false;
}
if (YTPlayer.opt.autoPlay && YTPlayer.loop == 0) {
YTPlayer.wrapper.CSSAnimate({opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity}, 2000);
} else if(! YTPlayer.isBackground) {
YTPlayer.wrapper.css({opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity});
}else{
setTimeout(function () {
jQuery(YTPlayer.playerEl).CSSAnimate({opacity: 1}, 2000);
YTPlayer.wrapper.CSSAnimate({opacity: YTPlayer.opt.opacity}, 2000);
}, 1000);
}
controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.pause);
$YTPlayer.css({background: "transparent"});
jQuery(YTPlayer).trigger("YTPStart");
}
if (state == 2) {
if (YTPlayer.state == state)
return;
YTPlayer.state = state;
controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
jQuery(YTPlayer).trigger("YTPPause");
}
},
'onPlaybackQualityChange': function () {},
'onError' : function () {}
}
});
});
//Get video info from FEEDS API
//todo: add video title and other info
if (!jQuery.browser.msie) { //YTPlayer.opt.ratio == "auto" &&
jQuery.getJSON('http://gdata.youtube.com/feeds/api/videos/' + videoID + '?v=2&alt=jsonc', function (data, status, xhr) {
var videoData = data.data;
if (YTPlayer.opt.ratio == "auto")
if (videoData.aspectRatio && videoData.aspectRatio === "widescreen")
YTPlayer.opt.ratio = "16/9";
else
YTPlayer.opt.ratio = "4/3";
if (!YTPlayer.isBackground) {
var bgndURL = videoData.thumbnail.hqDefault;
$YTPlayer.css({background: "url(" + bgndURL + ") center center", backgroundSize: "cover"});
}
jQuery(document).trigger("getVideoInfo_" + YTPlayer.opt.id);
});
} else {
YTPlayer.opt.ratio == "auto" ? YTPlayer.opt.ratio = "16/9" : YTPlayer.opt.ratio;
jQuery(document).trigger("getVideoInfo_" + YTPlayer.opt.id);
}
})
});
},
changeMovie: function (url, opt) {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
if (opt) {
jQuery.extend(data, opt);
}
data.movieURL = url.getVideoID();
jQuery(YTPlayer).getPlayer().loadVideoByUrl("http://www.youtube.com/v/" + data.movieURL, 0);
jQuery(YTPlayer).optimizeDisplay();
},
getPlayer: function () {
return jQuery(this).get(0).player;
},
playerDestroy: function () {
var playerBox = this.get(0).opt.wrapper;
playerBox.remove();
jQuery("#controlBar_" + this.get(0).id).remove();
},
playYTP: function () {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
var controls = jQuery("#controlBar_" + YTPlayer.id);
var playBtn = controls.find(".mb_YTVPPlaypause");
playBtn.html(jQuery.mbYTPlayer.controls.pause);
YTPlayer.player.playVideo();
},
toggleLoops: function () {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
if (data.loop == 1) {
data.loop = 0;
} else {
if(data.startAt) {
YTPlayer.player.seekTo(data.startAt);
} else {
YTPlayer.player.playVideo();
}
data.loop = 1;
}
},
stopYTP: function () {
var YTPlayer = jQuery(this).get(0);
var controls = jQuery("#controlBar_" + YTPlayer.id);
var playBtn = controls.find(".mb_YTVPPlaypause");
playBtn.html(jQuery.mbYTPlayer.controls.play);
YTPlayer.player.stopVideo();
},
pauseYTP: function () {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
var controls = jQuery("#controlBar_" + YTPlayer.id);
var playBtn = controls.find(".mb_YTVPPlaypause");
playBtn.html(jQuery.mbYTPlayer.controls.play);
YTPlayer.player.pauseVideo();
},
setYTPVolume: function (val) {
var YTPlayer = jQuery(this).get(0);
if (!val && !YTPlayer.opt.vol && player.getVolume() == 0)
jQuery(YTPlayer).unmuteYTPVolume();
else if ((!val && YTPlayer.player.getVolume() > 0) || (val && YTPlayer.player.getVolume() == val))
jQuery(YTPlayer).muteYTPVolume();
else
YTPlayer.opt.vol = val;
YTPlayer.player.setVolume(YTPlayer.opt.vol);
},
muteYTPVolume: function () {
var YTPlayer = jQuery(this).get(0);
YTPlayer.opt.vol = YTPlayer.player.getVolume() || 50;
YTPlayer.player.mute();
YTPlayer.player.setVolume(0);
var controls = jQuery("#controlBar_" + YTPlayer.id);
var muteBtn = controls.find(".mb_YTVPMuteUnmute");
muteBtn.html(jQuery.mbYTPlayer.controls.unmute);
},
unmuteYTPVolume: function () {
var YTPlayer = jQuery(this).get(0);
YTPlayer.player.unMute();
YTPlayer.player.setVolume(YTPlayer.opt.vol);
var controls = jQuery("#controlBar_" + YTPlayer.id);
var muteBtn = controls.find(".mb_YTVPMuteUnmute");
muteBtn.html(jQuery.mbYTPlayer.controls.mute);
},
manageYTPProgress: function () {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
var controls = jQuery("#controlBar_" + YTPlayer.id);
var progressBar = controls.find(".mb_YTVPProgress");
var loadedBar = controls.find(".mb_YTVPLoaded");
var timeBar = controls.find(".mb_YTVTime");
var totW = progressBar.outerWidth();
var currentTime = Math.floor(YTPlayer.player.getCurrentTime());
var totalTime = Math.floor(YTPlayer.player.getDuration());
var timeW = (currentTime * totW) / totalTime;
var startLeft = 0;
var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100;
loadedBar.css({left: startLeft, width: loadedW + "%"});
timeBar.css({left: 0, width: timeW});
return {totalTime: totalTime, currentTime: currentTime};
},
buildYTPControls: function () {
var YTPlayer = jQuery(this).get(0);
var data = YTPlayer.opt;
var controlBar = jQuery("<span/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTVPBar").css({whiteSpace: "noWrap", position: YTPlayer.isBackground ? "fixed" : "absolute", zIndex: YTPlayer.isBackground ? 10000 : 1000}).hide();
var buttonBar = jQuery("<div/>").addClass("buttonBar");
var playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTVPPlaypause").click(function () {
if (YTPlayer.player.getPlayerState() == 1)
jQuery(YTPlayer).pauseYTP();
else
jQuery(YTPlayer).playYTP();
});
var MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTVPMuteUnmute").click(function () {
if (YTPlayer.player.getVolume()==0) {
jQuery(YTPlayer).unmuteYTPVolume();
} else {
jQuery(YTPlayer).muteYTPVolume();
}
});
var idx = jQuery("<span/>").addClass("mb_YTVPTime");
var viewOnYT = jQuery(jQuery.mbYTPlayer.controls.ytLogo).on("click", function () {window.open(data.videoURL, "viewOnYT")});
var viewOnlyYT = jQuery(jQuery.mbYTPlayer.controls.onlyYT).on("click",
function () {
if(!YTPlayer.isAlone){
jQuery(YTPlayer.wrapper).css({zIndex: 10000}).CSSAnimate({opacity: 1}, 1000, 0);
YTPlayer.isAlone = true;
}else{
jQuery(YTPlayer.wrapper).CSSAnimate({opacity: YTPlayer.opt.opacity}, 500, function () {
jQuery(YTPlayer.wrapper).css({zIndex: -1});
});
YTPlayer.isAlone = false;
}
});
var movieUrl = jQuery("<span/>").addClass("mb_YTVPUrl").append(viewOnYT);
var onlyVideo = jQuery("<span/>").addClass("mb_OnlyYT").append(viewOnlyYT);
var progressBar = jQuery("<div/>").addClass("mb_YTVPProgress").css("position", "absolute").click(function (e) {
timeBar.css({width: (e.clientX - timeBar.offset().left)});
YTPlayer.timeW = e.clientX - timeBar.offset().left;
controlBar.find(".mb_YTVPLoaded").css({width: 0});
var totalTime = Math.floor(YTPlayer.player.getDuration());
YTPlayer.goto = (timeBar.outerWidth() * totalTime) / progressBar.outerWidth();
YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), true);
controlBar.find(".mb_YTVPLoaded").css({width: 0});
});
var loadedBar = jQuery("<div/>").addClass("mb_YTVPLoaded").css("position", "absolute");
var timeBar = jQuery("<div/>").addClass("mb_YTVTime").css("position", "absolute");
progressBar.append(loadedBar).append(timeBar);
buttonBar.append(playpause).append(MuteUnmute).append(idx);
if (data.printUrl && data.videoURL.indexOf("http") >= 0)
buttonBar.append(movieUrl);
if (YTPlayer.isBackground)
buttonBar.append(onlyVideo);
controlBar.append(buttonBar).append(progressBar);
if (!YTPlayer.isBackground) {
controlBar.addClass("inlinePlayer");
YTPlayer.wrapper.before(controlBar);
} else {
jQuery("body").after(controlBar);
}
controlBar.fadeIn();
clearInterval(YTPlayer.getState);
var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
YTPlayer.getState = setInterval(function () {
var prog = jQuery(YTPlayer).manageYTPProgress();
controlBar.find(".mb_YTVPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime));
if (data.loop && parseFloat(YTPlayer.player.getDuration() - 1) < YTPlayer.player.getCurrentTime() && YTPlayer.player.getPlayerState() == 1) {
YTPlayer.player.seekTo(startAt);
//YTPlayer.player.play();
jQuery(YTPlayer).trigger("YTPEnd");
//jQuery(YTPlayer).playYTP();
}
}, 1);
},
formatTime : function (s) {
var min = Math.floor(s / 60);
var sec = Math.floor(s - (60 * min));
return (min < 9 ? "0" + min : min) + " : " + (sec < 9 ? "0" + sec : sec);
}
};
jQuery.fn.toggleVolume = function () {
var YTPlayer = this.get(0);
if (!YTPlayer)
return;
if (YTPlayer.player.isMuted()) {
jQuery(YTPlayer).unmuteYTPVolume();
return true;
} else {
jQuery(YTPlayer).muteYTPVolume();
return false;
}
};
jQuery.fn.optimizeDisplay = function () {
var YTPlayer = this.get(0);
var data = YTPlayer.opt;
var playerBox = jQuery(YTPlayer.playerEl);
var win = {};
var el = !YTPlayer.isBackground ? data.containment : jQuery(window);
win.width = el.width();
win.height = el.height();
var margin = 24;
var vid = {};
vid.width = win.width + ((win.width * margin) / 100);
vid.height = data.ratio == "16/9" ? Math.ceil((9 * win.width) / 16) : Math.ceil((3 * win.width) / 4);
vid.marginTop = -((vid.height - win.height) / 2);
vid.marginLeft = -((win.width * (margin / 2)) / 100);
if (vid.height < win.height) {
vid.height = win.height + ((win.height * margin) / 100);
vid.width = data.ratio == "16/9" ? Math.floor((16 * win.height) / 9) : Math.floor((4 * win.height) / 3);
vid.marginTop = -((win.height * (margin / 2)) / 100);
vid.marginLeft = -((vid.width - win.width) / 2);
}
playerBox.css({width: vid.width, height: vid.height, marginTop: vid.marginTop, marginLeft: vid.marginLeft});
};
jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer;
jQuery.fn.changeMovie = jQuery.mbYTPlayer.changeMovie;
jQuery.fn.getPlayer = jQuery.mbYTPlayer.getPlayer;
jQuery.fn.playerDestroy = jQuery.mbYTPlayer.playerDestroy;
jQuery.fn.buildYTPControls = jQuery.mbYTPlayer.buildYTPControls;
jQuery.fn.playYTP = jQuery.mbYTPlayer.playYTP;
jQuery.fn.toggleLoops = jQuery.mbYTPlayer.toggleLoops;
jQuery.fn.stopYTP = jQuery.mbYTPlayer.stopYTP;
jQuery.fn.pauseYTP = jQuery.mbYTPlayer.pauseYTP;
jQuery.fn.muteYTPVolume = jQuery.mbYTPlayer.muteYTPVolume;
jQuery.fn.unmuteYTPVolume = jQuery.mbYTPlayer.unmuteYTPVolume;
jQuery.fn.setYTPVolume = jQuery.mbYTPlayer.setYTPVolume;
jQuery.fn.manageYTPProgress = jQuery.mbYTPlayer.manageYTPProgress;
jQuery.mbYTPlayer.YTAPIReady = false;
})(jQuery);
var vpa_heartbeat = new function () {
this.interval = 10000;
this.server_url = '';
this.queue = [];
this.state = 'STOPPED'; // DOING_AJAX / IDLE / STOPPED
var that = this;
this.set = function (settings) {
for (var i in settings)
this[i] = settings[i];
}
this.add = function (beat, add_method) {
add_method = add_method || 'append';
if (add_method == 'replace') {
for (var i in this.queue) {
if (this.queue[i].event_type == 'video_checkpoint') {
this.queue.splice(i, 1);
}
}
}
this.queue.push(beat);
}
this.stop = function () {
this.state = 'STOPPED';
}
this.refresh = function () {
setTimeout(function () {
that.push();
}, that.interval);
}
this.push = function (queue) {
if (typeof queue == 'undefined') {
if (this.state == 'DOING_AJAX')
return;
queue = this.queue;
if (queue.length < 1) {
this.refresh();
return;
}
this.queue = [];
this.state = 'DOING_AJAX';
}
$.ajax({
type: "GET",
url: this.server_url,
data: {
stats: JSON.stringify(queue)
},
dataType: "jsonp",
timeout: 9000,
success: function (result) {
console.log('beat sent!');
},
error: function () {
console.log('bead not sent.');
},
complete: function () {
if (that.state == 'STOPPED')
return;
that.refresh();
that.state = 'IDLE';
}
});
}
};
var ModulesSalesPage =
{
'sales-area_arrows_delay': {
listener: function (event, currentTime) {
if (currentTime >= parseInt(js_options['sales-area_arrows_delay'], 10)) {
$('.option__sales-area_arrows').css('visibility', 'visible');
}
},
activate: function () {
if (js_options['sales-area_arrows'] !== 'delayed')
return;
$('#video-events').on('timeupdate', this.listener);
},
deactivate: function () {
$('#video-events').off('timeupdate', this.listener);
}
},
'modal-form' : {
activate: function () {
var that = this;
if (is_editable) {
return;
}
switch(js_options['modal-form_element-click']) {
case 'button':
$('.call-modal-form-button ').on('click', function(e) {
e.preventDefault();
that.show_overlay();
})
break;
case 'overlay':
$('.call-modal-form-overlay').on('click', function(e) {
e.preventDefault();
that.show_overlay();
})
ModulesVideoOnly['overlay-button'].activate();
break;
}
},
deactivate: function () {
},
show_overlay: function () {
$('.simplemodal-container').fadeIn(300)
},
hide_overlay: function () {
$('.simplemodal-container').fadeOut(200)
}
}
};
jQuery(document).ready(function () {
for (var i in js_options) {
if (typeof ModulesSalesPage[i] !== 'undefined' && js_options[i]) {
ModulesSalesPage[i].activate();
}
}
});
jQuery(document).ready(function ($) {
var success_redirect = false;
$('body').on('focus', 'form.form-optin :input', function () {
$(this).removeClass('erreur');
});
$('form.form-optin').submit(function (event) {
//validate first
var $form = $(this);
var _bail = false;
$(this).find(":input:text").each(function () {
if (jQuery.trim($(this).val()) == '') {
$(this).addClass('erreur');
_bail = true;
}
});
if (_bail)
return false;
$(this).plainOverlay('show', {
color: '#000000',
opacity: 0.85,
progress: function () {
return $('<i style="color:#FFF" class="fa fa-spinner fa-spin"></i>');
}
});
if ($(this).data('submit-type') != 'browser') {
event.preventDefault();
var post_data = $(this).serializeArray();
post_data.push({name: 'g2w', value: $(this).data('g2w')});
$.ajax({
url: site_url + '/endpoint/save-lead/' + project_id + '/' + $(this).data('service') + '/' + $(this).data('list'),
dataType: 'jsonp',
data: post_data,
success: function (data) {
form_submitted_cb($form);
}
});
} else {
$('#optin_submit_iframe').data('blank-src', 0).data('form', $(this));
}
if ($form.data('after-submit-form') == 'page' && $form.data('open-in') == 'new') {
window.open($form.data('target-url'), '_blank');
}
});
$('#optin_submit_iframe').load(function () {
if ($(this).data('blank-src') != 0)
return;
form_submitted_cb($(this).data('form'));
$(this).removeData('form');
});
function form_submitted_cb($form) {
$form.plainOverlay('hide');
try {
vpa_heartbeat.add({
project_id: project_id,
event_type: page_type + '_optin',
is_conversion: 1
});
} catch (err) {
}
if ($form.data('overlay') === true) {
ModulesVideoOnly['overlay-optin'].hide_overlay();
cookie.set('overlay_user_subscribed_' + project_id, true);
if ($form.data('after-submit-form') == 'page' && $form.data('open-in') == 'same') {
window.top.location.href = $form.data('target-url');
}
//redirect to URL in case it's set
if ($form.data('redirect-url')) {
window.top.location.href = $form.data('redirect-url');
}
return true;
} else {
var $parent = $form.closest('.optin__wrapper');
$parent.find('.optin-success').show();
$parent.find('.form__wrapper').hide();
//redirect to URL in case it's set
if ($form.data('redirect-url')) {
window.top.location.href = $form.data('redirect-url');
}
}
}
$('.simplemodal-container .modalCloseImg').on('click', function() {
ModulesSalesPage['modal-form'].hide_overlay();
})
});
!function () {
var project_type;
if (typeof page_type === 'undefined')
project_type = 'video-only';
else
project_type = page_type;
function visibility_callback(el) {
var scope;
if (project_type == 'video-only') {
scope = el.contentWindow;
} else if (project_type == 'sales-page') {
scope = window;
}
if (element_is_in_viewport(el)) {
scope.postMessage('pp_video_is_visible', "*");
} else {
scope.postMessage('pp_video_not_visible', "*");
}
}
function element_is_in_viewport(el) {
var rect = el.getBoundingClientRect();
return (
rect.top > -rect.height
/*&&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)*/
);
}
var check_element_visibility = function () {
var videos;
if (project_type == 'video-only')
videos = document.querySelectorAll("iframe.pressplay-video");
else if (project_type == 'sales-page')
videos = document.querySelectorAll(".video-holder");
for (var i = 0, els = videos.length; i < els; i++) {
visibility_callback(videos[i]);
}
};
var events = ['DOMContentLoaded', 'load', 'resize', 'scroll'];
for (var i in events) {
window.addEventListener(events[i], check_element_visibility, false);
}
}();
/* global videojs, YT */
/* jshint browser: true */
(function () {
/**
* @fileoverview YouTube Media Controller - Wrapper for YouTube Media API
*/
/**
* YouTube Media Controller - Wrapper for YouTube Media API
* @param {videojs.Player|Object} player
* @param {Object=} options
* @param {Function=} ready
* @constructor
*/
function addEventListener(element, event, cb) {
if (!element.addEventListener) {
element.attachEvent(event, cb);
} else {
element.addEventListener(event, cb, true);
}
}
videojs.Youtube = videojs.MediaTechController.extend({
/** @constructor */
init: function (player, options, ready) {
// No event is triggering this for YouTube
this['featuresProgressEvents'] = false;
this['featuresTimeupdateEvents'] = false;
videojs.MediaTechController.call(this, player, options, ready);
this.isIos = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
this.isAndroid = /(Android)/g.test(navigator.userAgent);
//used to prevent play events on IOS7 and Android > 4.2 until the user has clicked the player
this.playVideoIsAllowed = !(this.isIos || this.isAndroid);
// Copy the JavaScript options if they exists
if (typeof options['source'] !== 'undefined') {
for (var key in options['source']) {
if (options['source'].hasOwnProperty(key)) {
player.options()[key] = options['source'][key];
}
}
}
this.userQuality = videojs.Youtube.convertQualityName(player.options()['quality']);
// Save those for internal usage
this.player_ = player;
this.playerEl_ = document.getElementById(player.id());
this.playerEl_.className += ' vjs-youtube';
// Create the Quality button
this.qualityButton = document.createElement('div');
this.qualityButton.setAttribute('class', 'vjs-quality-button vjs-menu-button vjs-control');
this.qualityButton.setAttribute('tabindex', 0);
var qualityContent = document.createElement('div');
this.qualityButton.appendChild(qualityContent);
this.qualityTitle = document.createElement('span');
qualityContent.appendChild(this.qualityTitle);
if (player.options()['quality'] !== 'undefined') {
setInnerText(this.qualityTitle, player.options()['quality'] || 'auto');
}
var qualityMenu = document.createElement('div');
qualityMenu.setAttribute('class', 'vjs-menu');
this.qualityButton.appendChild(qualityMenu);
this.qualityMenuContent = document.createElement('ul');
this.qualityMenuContent.setAttribute('class', 'vjs-menu-content');
qualityMenu.appendChild(this.qualityMenuContent);
this.id_ = this.player_.id() + '_youtube_api';
this.el_ = videojs.Component.prototype.createEl('iframe', {
id: this.id_,
className: 'vjs-tech',
scrolling: 'no',
marginWidth: 0,
marginHeight: 0,
frameBorder: 0
});
this.el_.setAttribute('allowFullScreen', '');
this.playerEl_.insertBefore(this.el_, this.playerEl_.firstChild);
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
var ieVersion = Number(RegExp.$1);
this.addIframeBlocker(ieVersion);
} else if (!/(iPad|iPhone|iPod|android)/g.test(navigator.userAgent)) {
// the pointer-events: none block the mobile player
this.el_.className += ' onDesktop';
this.addIframeBlocker();
}
this.parseSrc(player.options()['src']);
this.playOnReady = this.player_.options()['autoplay'] || false;
this.forceSSL = !!(
typeof this.player_.options()['forceSSL'] === 'undefined' ||
this.player_.options()['forceSSL'] === true
);
this.forceHTML5 = !!(
typeof this.player_.options()['forceHTML5'] === 'undefined' ||
this.player_.options()['forceHTML5'] === true
);
this.updateIframeSrc();
var self = this;
player.ready(function () {
var controlBar = self.playerEl_.querySelectorAll('.vjs-control-bar')[0];
controlBar.appendChild(self.qualityButton);
if (self.playOnReady && !self.player_.options()['ytcontrols']) {
if (typeof self.player_.loadingSpinner !== 'undefined') {
self.player_.loadingSpinner.show();
}
if (typeof self.player_.bigPlayButton !== 'undefined') {
self.player_.bigPlayButton.hide();
}
}
player.trigger('loadstart');
});
this.on('dispose', function () {
if (this.ytplayer) {
this.ytplayer.destroy();
}
if (!this.player_.options()['ytcontrols']) {
this.player_.off('waiting', this.bindedWaiting);
}
// Remove the poster
this.playerEl_.querySelectorAll('.vjs-poster')[0].style.backgroundImage = 'none';
// If still connected to the DOM, remove it.
if (this.el_.parentNode) {
this.el_.parentNode.removeChild(this.el_);
}
// Get rid of the created DOM elements
if (this.qualityButton.parentNode) {
this.qualityButton.parentNode.removeChild(this.qualityButton);
}
if (typeof this.player_.loadingSpinner !== 'undefined') {
this.player_.loadingSpinner.hide();
}
if (typeof this.player_.bigPlayButton !== 'undefined') {
this.player_.bigPlayButton.hide();
}
if (this.iframeblocker) {
this.playerEl_.removeChild(this.iframeblocker);
}
});
}
});
videojs.Youtube.prototype.updateIframeSrc = function () {
var params = {
enablejsapi: 1,
/*jshint -W106 */
iv_load_policy: 1,
/*jshint +W106 */
playerapiid: this.id(),
disablekb: 1,
wmode: 'transparent',
controls: (this.player_.options()['ytcontrols']) ? 1 : 0,
html5: (this.player_.options()['forceHTML5']) ? 1 : null,
playsinline: (this.player_.options()['playsInline']) ? 1 : 0,
showinfo: 0,
modestbranding: 1,
rel: 0,
autoplay: (this.playOnReady) ? 1 : 0,
loop: (this.player_.options()['loop']) ? 1 : 0,
list: this.playlistId,
vq: this.userQuality,
origin: window.location.protocol + '//' + window.location.host,
fs: 0
};
// When running with no Web server, we can't specify the origin or it will break the YouTube API messages
if (window.location.protocol === 'file:') {
delete params.origin;
}
// Delete unset properties
for (var prop in params) {
if (params.hasOwnProperty(prop) &&
( typeof params[prop] === 'undefined' || params[prop] === null )
) {
delete params[prop];
}
}
var self = this;
if (this.videoId === null) {
this.el_.src = 'about:blank';
setTimeout(function () {
self.triggerReady();
}, 500);
} else {
this.el_.src = (
(this.forceSSL || window.location.protocol === 'file:') ?
'https:'
: window.location.protocol
) + '//www.youtube.com/embed/' + this.videoId + '?' + videojs.Youtube.makeQueryString(params);
if (this.player_.options()['ytcontrols']) {
// Disable the video.js controls if we use the YouTube controls
this.player_.controls(false);
} else if (typeof this.player_.poster() === 'undefined') {
// Don't use player.poster(), it will fail here because the tech is still null in constructor
setTimeout(function () {
var posterEl = self.playerEl_.querySelectorAll('.vjs-poster')[0];
posterEl.style.backgroundImage = 'url(https://img.youtube.com/vi/' + self.videoId + '/0.jpg)';
posterEl.style.display = '';
}, 100);
}
this.bindedWaiting = function () {
self.onWaiting();
};
this.player_.on('waiting', this.bindedWaiting);
if (videojs.Youtube.apiReady) {
this.loadYoutube();
} else {
// Add to the queue because the YouTube API is not ready
videojs.Youtube.loadingQueue.push(this);
// Load the YouTube API if it is the first YouTube video
if (!videojs.Youtube.apiLoading) {
var tag = document.createElement('script');
tag.onerror = function (e) {
self.onError(e);
};
tag.src = ( !this.forceSSL && window.location.protocol !== 'file:' ) ?
'//www.youtube.com/iframe_api'
: 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
videojs.Youtube.apiLoading = true;
}
}
}
};
videojs.Youtube.prototype.onWaiting = function (/*e*/) {
// Make sure to hide the play button while the spinner is there
this.player_.bigPlayButton.hide();
this.player_.posterImage.hide();
};
videojs.Youtube.prototype.addIframeBlocker = function (ieVersion) {
this.iframeblocker = videojs.Component.prototype.createEl('div');
this.iframeblocker.className = 'iframeblocker';
this.iframeblocker.style.position = 'absolute';
this.iframeblocker.style.left = 0;
this.iframeblocker.style.right = 0;
this.iframeblocker.style.top = 0;
this.iframeblocker.style.bottom = 0;
this.iframeblocker.style.zIndex = 9996;
// Odd quirk for IE8 (doesn't support rgba)
if (ieVersion && ieVersion < 9) {
this.iframeblocker.style.opacity = 0.01;
} else {
this.iframeblocker.style.background = 'rgba(255, 255, 255, 0.01)';
}
var self = this;
addEventListener(this.iframeblocker, 'mousemove', function (e) {
if (!self.player_.userActive()) {
self.player_.userActive(true);
}
e.stopPropagation();
e.preventDefault();
});
addEventListener(this.iframeblocker, 'click', function (/*e*/) {
if (self.paused()) {
self.play();
} else {
self.pause();
}
});
this.playerEl_.insertBefore(this.iframeblocker, this.el_.nextSibling);
};
videojs.Youtube.prototype.parseSrc = function (src) {
this.srcVal = src;
if (src) {
// Regex to parse the video ID
var regId = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = src.match(regId);
if (match && match[2].length === 11) {
this.videoId = match[2];
} else {
this.videoId = null;
}
// Regex to parse the playlist ID
var regPlaylist = /[?&]list=([^#\&\?]+)/;
match = src.match(regPlaylist);
if (match !== null && match.length > 1) {
this.playlistId = match[1];
} else {
// Make sure their is no playlist
if (this.playlistId) {
delete this.playlistId;
}
}
// Parse video quality option
var regVideoQuality = /[?&]vq=([^#\&\?]+)/;
match = src.match(regVideoQuality);
if (match !== null && match.length > 1) {
this.userQuality = match[1];
setInnerText(this.qualityTitle, videojs.Youtube.parseQualityName(this.userQuality));
}
}
};
videojs.Youtube.prototype.src = function (src) {
if (typeof src !== 'undefined') {
this.parseSrc(src);
if (this.el_.src === 'about:blank') {
this.updateIframeSrc();
return;
}
delete this.defaultQuality;
if (this.videoId !== null) {
if (this.player_.options()['autoplay'] && this.playVideoIsAllowed) {
this.ytplayer.loadVideoById({
videoId: this.videoId,
suggestedQuality: this.userQuality
});
} else {
this.ytplayer.cueVideoById({
videoId: this.videoId,
suggestedQuality: this.userQuality
});
}
// Update the poster
this.playerEl_.querySelectorAll('.vjs-poster')[0].style.backgroundImage =
'url(https://img.youtube.com/vi/' + this.videoId + '/0.jpg)';
this.player_.poster('https://img.youtube.com/vi/' + this.videoId + '/0.jpg');
}
/* else Invalid URL */
}
return this.srcVal;
};
videojs.Youtube.prototype.load = function () {
};
videojs.Youtube.prototype.play = function () {
if (this.videoId !== null) {
// Make sure to not display the spinner for mobile
if (!this.player_.options()['ytcontrols']) {
// Display the spinner until the video is playing by YouTube
this.player_.trigger('waiting');
}
if (this.isReady_) {
// Sync the player volume with YouTube
this.ytplayer.setVolume(this.player_.volume() * 100);
if (this.volumeVal > 0) {
this.ytplayer.unMute();
} else {
this.ytplayer.mute();
}
if (this.playVideoIsAllowed) {
this.ytplayer.playVideo();
}
} else {
this.playOnReady = true;
}
}
};
videojs.Youtube.prototype.pause = function () {
this.ytplayer.pauseVideo();
};
videojs.Youtube.prototype.paused = function () {
return (this.ytplayer) ?
(this.lastState !== YT.PlayerState.PLAYING && this.lastState !== YT.PlayerState.BUFFERING)
: true;
};
videojs.Youtube.prototype.currentTime = function () {
return (this.ytplayer && this.ytplayer.getCurrentTime) ? this.ytplayer.getCurrentTime() : 0;
};
videojs.Youtube.prototype.setCurrentTime = function (seconds) {
this.ytplayer.seekTo(seconds, true);
this.player_.trigger('timeupdate');
};
videojs.Youtube.prototype.duration = function () {
return (this.ytplayer && this.ytplayer.getDuration) ? this.ytplayer.getDuration() : 0;
};
videojs.Youtube.prototype.currentSrc = function () {
return this.srcVal;
};
videojs.Youtube.prototype.volume = function () {
if (this.ytplayer && isNaN(this.volumeVal)) {
this.volumeVal = this.ytplayer.getVolume() / 100.0;
this.player_.volume(this.volumeVal);
}
return this.volumeVal;
};
videojs.Youtube.prototype.setVolume = function (percentAsDecimal) {
if (typeof(percentAsDecimal) !== 'undefined' && percentAsDecimal !== this.volumeVal) {
this.ytplayer.setVolume(percentAsDecimal * 100.0);
this.volumeVal = percentAsDecimal;
this.player_.trigger('volumechange');
}
};
videojs.Youtube.prototype.muted = function () {
return this.mutedVal;
};
videojs.Youtube.prototype.setMuted = function (muted) {
if (muted) {
this.ytplayer.mute();
this._stored_volume = this.volumeVal;
this.player_.volume(0);
} else {
this.ytplayer.unMute();
this.player_.volume(this._stored_volume);
}
this.mutedVal = muted;
this.player_.trigger('volumechange');
};
videojs.Youtube.prototype.buffered = function () {
if (this.ytplayer && this.ytplayer.getVideoBytesLoaded) {
var loadedBytes = this.ytplayer.getVideoBytesLoaded();
var totalBytes = this.ytplayer.getVideoBytesTotal();
if (!loadedBytes || !totalBytes) {
return 0;
}
var duration = this.ytplayer.getDuration();
var secondsBuffered = (loadedBytes / totalBytes) * duration;
var secondsOffset = (this.ytplayer.getVideoStartBytes() / totalBytes) * duration;
return videojs.createTimeRange(secondsOffset, secondsOffset + secondsBuffered);
} else {
return videojs.createTimeRange(0, 0);
}
};
videojs.Youtube.prototype.supportsFullScreen = function () {
return true;
};
// YouTube is supported on all platforms
videojs.Youtube.isSupported = function () {
return true;
};
// You can use video/youtube as a media in your HTML5 video to specify the source
videojs.Youtube.canPlaySource = function (srcObj) {
return (srcObj.type === 'video/youtube');
};
// Always can control the volume
videojs.Youtube.canControlVolume = function () {
return true;
};
////////////////////////////// YouTube specific functions //////////////////////////////
// All videos created before YouTube API is loaded
videojs.Youtube.loadingQueue = [];
// Create the YouTube player
videojs.Youtube.prototype.loadYoutube = function () {
this.ytplayer = new YT.Player(this.id_, {
events: {
onReady: function (e) {
e.target.vjsTech.onReady();
},
onStateChange: function (e) {
e.target.vjsTech.onStateChange(e.data);
},
onPlaybackQualityChange: function (e) {
e.target.vjsTech.onPlaybackQualityChange('hd720');
},
onError: function (e) {
e.target.vjsTech.onError(e.data);
}
}
});
this.player_['ytplayer'] = this.ytplayer;
this.ytplayer.vjsTech = this;
};
// Transform a JavaScript object into URL params
videojs.Youtube.makeQueryString = function (args) {
var array = [];
for (var key in args) {
if (args.hasOwnProperty(key)) {
array.push(key + '=' + args[key]);
}
}
return array.join('&');
};
// Called when YouTube API is ready to be used
window.onYouTubeIframeAPIReady = function () {
var yt;
while ((yt = videojs.Youtube.loadingQueue.shift())) {
yt.loadYoutube();
}
videojs.Youtube.loadingQueue = [];
videojs.Youtube.apiReady = true;
};
videojs.Youtube.prototype.onReady = function () {
this.isReady_ = true;
this.triggerReady();
this.player_.trigger('loadedmetadata');
// The duration is loaded so we might as well fire off the timeupdate and duration events
// this allows for the duration of the video (timeremaining) to be displayed if styled
// to show the control bar initially. This gives the user the ability to see how long the video
// is before clicking play
this.player_.trigger('durationchange');
this.player_.trigger('timeupdate');
// Let the player take care of itself as soon as the YouTube is ready
// The loading spinner while waiting for the tech would be impossible otherwise
if (typeof this.player_.loadingSpinner !== 'undefined') {
this.player_.loadingSpinner.hide();
}
if (this.player_.options()['muted']) {
this.setMuted(true);
}
// Play ASAP if they clicked play before it's ready
if (this.playOnReady) {
this.playOnReady = false;
this.play();
}
};
videojs.Youtube.prototype.updateQualities = function () {
function setupEventListener(el) {
addEventListener(el, 'click', function () {
var quality = this.getAttribute('data-val');
self.ytplayer.setPlaybackQuality(quality);
self.userQuality = quality;
setInnerText(self.qualityTitle, videojs.Youtube.parseQualityName(quality));
var selected = self.qualityMenuContent.querySelector('.vjs-selected');
if (selected) {
videojs.Youtube.removeClass(selected, 'vjs-selected');
}
videojs.Youtube.addClass(this, 'vjs-selected');
});
}
var qualities = this.ytplayer.getAvailableQualityLevels();
var self = this;
if (qualities.indexOf(this.userQuality) < 0) {
setInnerText(self.qualityTitle, videojs.Youtube.parseQualityName(this.defaultQuality));
}
if (qualities.length === 0) {
this.qualityButton.style.display = 'none';
} else {
this.qualityButton.style.display = '';
while (this.qualityMenuContent.hasChildNodes()) {
this.qualityMenuContent.removeChild(this.qualityMenuContent.lastChild);
}
for (var i = 0; i < qualities.length; ++i) {
var el = document.createElement('li');
el.setAttribute('class', 'vjs-menu-item');
setInnerText(el, videojs.Youtube.parseQualityName(qualities[i]));
el.setAttribute('data-val', qualities[i]);
if (qualities[i] === this.quality) {
videojs.Youtube.addClass(el, 'vjs-selected');
}
setupEventListener(el);
this.qualityMenuContent.appendChild(el);
}
}
};
videojs.Youtube.prototype.onStateChange = function (state) {
if (state !== this.lastState) {
switch (state) {
case -1:
this.player_.trigger('durationchange');
break;
case YT.PlayerState.ENDED:
// Replace YouTube play button by our own
if (!this.player_.options()['ytcontrols']) {
this.playerEl_.querySelectorAll('.vjs-poster')[0].style.display = 'block';
if (typeof this.player_.bigPlayButton !== 'undefined') {
this.player_.bigPlayButton.show();
}
}
this.player_.trigger('ended');
break;
case YT.PlayerState.PLAYING:
this.playVideoIsAllowed = true;
this.updateQualities();
this.player_.trigger('timeupdate');
this.player_.trigger('durationchange');
this.player_.trigger('playing');
this.player_.trigger('play');
break;
case YT.PlayerState.PAUSED:
this.player_.trigger('pause');
break;
case YT.PlayerState.BUFFERING:
this.player_.trigger('timeupdate');
// Make sure to not display the spinner for mobile
if (!this.player_.options()['ytcontrols']) {
this.player_.trigger('waiting');
}
break;
case YT.PlayerState.CUED:
break;
}
this.lastState = state;
}
};
videojs.Youtube.convertQualityName = function (name) {
switch (name) {
case '144p':
return 'tiny';
case '240p':
return 'small';
case '360p':
return 'medium';
case '480p':
return 'large';
case '720p':
return 'hd720';
case '1080p':
return 'hd1080';
}
return 'auto';
};
videojs.Youtube.parseQualityName = function (name) {
switch (name) {
case 'tiny':
return '144p';
case 'small':
return '240p';
case 'medium':
return '360p';
case 'large':
return '480p';
case 'hd720':
return '720p';
case 'hd1080':
return '1080p';
}
return 'auto';
};
videojs.Youtube.prototype.onPlaybackQualityChange = function (quality) {
if (typeof this.defaultQuality === 'undefined') {
this.defaultQuality = quality;
if (typeof this.userQuality !== 'undefined') {
return;
}
}
this.quality = quality;
setInnerText(this.qualityTitle, videojs.Youtube.parseQualityName(quality));
switch (quality) {
case 'medium':
this.player_.videoWidth = 480;
this.player_.videoHeight = 360;
break;
case 'large':
this.player_.videoWidth = 640;
this.player_.videoHeight = 480;
break;
case 'hd720':
this.player_.videoWidth = 960;
this.player_.videoHeight = 720;
break;
case 'hd1080':
this.player_.videoWidth = 1440;
this.player_.videoHeight = 1080;
break;
case 'highres':
this.player_.videoWidth = 1920;
this.player_.videoHeight = 1080;
break;
case 'small':
this.player_.videoWidth = 320;
this.player_.videoHeight = 240;
break;
case 'tiny':
this.player_.videoWidth = 144;
this.player_.videoHeight = 108;
break;
default:
this.player_.videoWidth = 0;
this.player_.videoHeight = 0;
break;
}
this.player_.trigger('ratechange');
};
videojs.Youtube.prototype.onError = function (error) {
this.player_.error(error);
if (error === 100 || error === 101 || error === 150) {
this.player_.bigPlayButton.hide();
this.player_.loadingSpinner.hide();
this.player_.posterImage.hide();
}
};
/**
* Add a CSS class name to an element
* @param {Element} element Element to add class name to
* @param {String} classToAdd Classname to add
*/
videojs.Youtube.addClass = function (element, classToAdd) {
if ((' ' + element.className + ' ').indexOf(' ' + classToAdd + ' ') === -1) {
element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
}
};
/**
* Remove a CSS class name from an element
* @param {Element} element Element to remove from class name
* @param {String} classToRemove Classname to remove
*/
videojs.Youtube.removeClass = function (element, classToRemove) {
var classNames, i;
if (element.className.indexOf(classToRemove) === -1) {
return;
}
classNames = element.className.split(' ');
// no arr.indexOf in ie8, and we don't want to add a big shim
for (i = classNames.length - 1; i >= 0; i--) {
if (classNames[i] === classToRemove) {
classNames.splice(i, 1);
}
}
element.className = classNames.join(' ');
};
// Cross-browsers support (IE8 wink wink)
function setInnerText(element, text) {
if (typeof element === 'undefined') {
return false;
}
var textProperty = ('innerText' in element) ? 'innerText' : 'textContent';
try {
element[textProperty] = text;
} catch (anException) {
//IE<9 FIX
element.setAttribute('innerText', text);
}
}
// Stretch the YouTube poster
var style = document.createElement('style');
var def = ' ' +
'.vjs-youtube .vjs-poster { background-size: cover !important; }' +
'.vjs-youtube .vjs-poster, ' +
'.vjs-youtube .vjs-loading-spinner, ' +
'.vjs-youtube .vjs-text-track-display{' +
' pointer-events: none !important;' +
' }' +
'.vjs-youtube.vjs-user-active .iframeblocker { display: none; }' +
'.vjs-youtube.vjs-user-inactive .vjs-tech.onDesktop { pointer-events: none; }' +
'.vjs-quality-button > div:first-child > span:first-child { position:relative;top:7px }';
style.setAttribute('type', 'text/css');
document.getElementsByTagName('head')[0].appendChild(style);
if (style.styleSheet) {
style.styleSheet.cssText = def;
} else {
style.appendChild(document.createTextNode(def));
}
// IE8 fix for indexOf
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (elt /*, from*/) {
var len = this.length >>> 0; // jshint ignore:line
var from = Number(arguments[1]) || 0;
from = (from < 0) ?
Math.ceil(from)
: Math.floor(from);
if (from < 0) {
from += len;
}
for (; from < len; from++) {
if (from in this && this[from] === elt) {
return from;
}
}
return -1;
};
}
})();
var VimeoState = {
UNSTARTED: -1,
ENDED: 0,
PLAYING: 1,
PAUSED: 2,
BUFFERING: 3
};
videojs.Vimeo = videojs.MediaTechController.extend({
init: function(player, options, ready){
videojs.MediaTechController.call(this, player, options, ready);
// Copy the JavaScript options if they exists
if (typeof options['source'] != 'undefined') {
for (var key in options['source']) {
player.options()[key] = options['source'][key];
}
}
this.player_ = player;
this.player_el_ = document.getElementById(this.player_.id());
// Copy the JavaScript options if they exists
if (typeof options['source'] != 'undefined') {
for (var key in options['source']) {
player.options()[key] = options['source'][key];
}
}
// Disable lockShowing because we always use Vimeo controls
this.player_.controls(false);
this.id_ = this.player_.id() + '_vimeo_api';
this.player_el_.className += ' vjs-youtube';
this.el_ = videojs.Component.prototype.createEl('iframe', {
id: this.id_,
className: 'vjs-tech',
scrolling: 'no',
marginWidth: 0,
marginHeight: 0,
frameBorder: 0,
webkitAllowFullScreen: 'true',
mozallowfullscreen: 'true',
allowFullScreen: 'true'
});
this.player_el_.insertBefore(this.el_, this.player_el_.firstChild);
this.baseUrl = '//player.vimeo.com/video/';
this.vimeo = {};
this.vimeoInfo = {};
var self = this;
this.el_.onload = function() { self.onLoad(); };
this.startMuted = player.options()['muted'];
this.src(player.options()['src']);
}
});
videojs.Vimeo.prototype.dispose = function(){
this.vimeo.api('unload');
delete this.vimeo;
this.el_.parentNode.removeChild(this.el_);
videojs.MediaTechController.prototype.dispose.call(this);
};
videojs.Vimeo.prototype.src = function(src) {
this.isReady_ = false;
// Regex that parse the video ID for any Vimeo URL
var regExp = /^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?([0-9]+)/;
var match = src.match(regExp);
if (match){
this.videoId = match[5];
}
var params = {
api: 1,
byline: 0,
portrait: 0,
show_title: 0,
show_byline: 0,
show_portait: 0,
fullscreen: 1,
color: this.player_.options()['color'], //'F70B0B',
player_id: this.id_,
autoplay: (this.player_.options()['autoplay'])? 1 : 0,
loop: (this.player_.options()['loop']) ? 1 : 0
};
this.el_.src = this.baseUrl + this.videoId + '?' + videojs.Vimeo.makeQueryString(params);
};
videojs.Vimeo.prototype.load = function(){};
videojs.Vimeo.prototype.play = function(){ this.vimeo.api('play'); };
videojs.Vimeo.prototype.pause = function(){ this.vimeo.api('pause'); };
videojs.Vimeo.prototype.paused = function(){
return this.vimeoInfo.state !== VimeoState.PLAYING &&
this.vimeoInfo.state !== VimeoState.BUFFERING;
};
videojs.Vimeo.prototype.currentTime = function(){ return this.vimeoInfo.time || 0; };
videojs.Vimeo.prototype.setCurrentTime = function(seconds){
this.vimeo.api('seekTo', seconds);
this.player_.trigger('timeupdate');
};
videojs.Vimeo.prototype.duration = function(){ return this.vimeoInfo.duration || 0; };
videojs.Vimeo.prototype.buffered = function(){ return videojs.createTimeRange(0, (this.vimeoInfo.buffered*this.vimeoInfo.duration) || 0); };
videojs.Vimeo.prototype.volume = function() { return (this.vimeoInfo.muted)? this.vimeoInfo.muteVolume : this.vimeoInfo.volume; };
videojs.Vimeo.prototype.setVolume = function(percentAsDecimal){
this.vimeo.api('setvolume', percentAsDecimal);
this.vimeoInfo.volume = percentAsDecimal;
this.player_.trigger('volumechange');
};
videojs.Vimeo.prototype.muted = function() { return this.vimeoInfo.muted || false; };
videojs.Vimeo.prototype.setMuted = function(muted) {
if (muted) {
this.vimeoInfo.muteVolume = this.vimeoInfo.volume;
this.setVolume(0);
} else {
this.setVolume(this.vimeoInfo.muteVolume);
}
this.vimeoInfo.muted = muted;
this.player_.trigger('volumechange');
};
videojs.Vimeo.prototype.onReady = function(){
this.isReady_ = true;
this.triggerReady();
this.player_.trigger('loadedmetadata');
if (this.startMuted) {
this.setMuted(true);
this.startMuted = false;
}
};
videojs.Vimeo.prototype.onLoad = function(){
if (this.vimeo.api) {
this.vimeo.api('unload');
delete this.vimeo;
}
this.vimeo = $f(this.el_);
this.vimeoInfo = {
state: VimeoState.UNSTARTED,
volume: 1,
muted: false,
muteVolume: 1,
time: 0,
duration: 0,
buffered: 0,
url: this.baseUrl + this.videoId,
error: null
};
var self = this;
this.vimeo.addEvent('ready', function(id){
self.onReady();
self.vimeo.addEvent('loadProgress', function(data, id){ self.onLoadProgress(data); });
self.vimeo.addEvent('playProgress', function(data, id){ self.onPlayProgress(data); });
self.vimeo.addEvent('play', function(id){ self.onPlay(); });
self.vimeo.addEvent('pause', function(id){ self.onPause(); });
self.vimeo.addEvent('finish', function(id){ self.onFinish(); });
self.vimeo.addEvent('seek', function(data, id){ self.onSeek(data); });
});
};
videojs.Vimeo.prototype.onLoadProgress = function(data){
var durationUpdate = !this.vimeoInfo.duration;
this.vimeoInfo.duration = data.duration;
this.vimeoInfo.buffered = data.percent;
this.player_.trigger('progress');
if (durationUpdate) this.player_.trigger('durationchange');
};
videojs.Vimeo.prototype.onPlayProgress = function(data){
this.vimeoInfo.time = data.seconds;
this.player_.trigger('timeupdate');
this.player_.trigger('durationchange');
};
videojs.Vimeo.prototype.onPlay = function(){
this.vimeoInfo.state = VimeoState.PLAYING;
this.player_.trigger('play');
};
videojs.Vimeo.prototype.onPause = function(){
this.vimeoInfo.state = VimeoState.PAUSED;
this.player_.trigger('pause');
};
videojs.Vimeo.prototype.onFinish = function(){
this.vimeoInfo.state = VimeoState.ENDED;
this.player_.trigger('ended');
};
videojs.Vimeo.prototype.onSeek = function(data){
this.vimeoInfo.time = data.seconds;
this.player_.trigger('timeupdate');
this.player_.trigger('seeked');
};
videojs.Vimeo.prototype.onError = function(error){
this.player_.error = error;
this.player_.trigger('error');
};
videojs.Vimeo.isSupported = function(){
return true;
};
videojs.Vimeo.prototype.supportsFullScreen = function() {
return false;
};
videojs.Vimeo.canPlaySource = function(srcObj){
return (srcObj.type == 'video/vimeo');
};
videojs.Vimeo.makeQueryString = function(args){
var array = [];
for (var key in args){
if (args.hasOwnProperty(key)){
array.push(encodeURIComponent(key) + '=' + encodeURIComponent(args[key]));
}
}
return array.join('&');
};
// Froogaloop API -------------------------------------------------------------
// From https://github.com/vimeo/player-api/blob/master/javascript/froogaloop.js
var Froogaloop = (function(){
// Define a local copy of Froogaloop
function Froogaloop(iframe) {
// The Froogaloop object is actually just the init constructor
return new Froogaloop.fn.init(iframe);
}
var eventCallbacks = {},
hasWindowEvent = false,
isReady = false,
slice = Array.prototype.slice,
playerDomain = '';
Froogaloop.fn = Froogaloop.prototype = {
element: null,
init: function(iframe) {
if (typeof iframe === "string") {
iframe = document.getElementById(iframe);
}
this.element = iframe;
// Register message event listeners
playerDomain = getDomainFromUrl(this.element.getAttribute('src'));
return this;
},
/*
* Calls a function to act upon the player.
*
* @param {string} method The name of the Javascript API method to call. Eg: 'play'.
* @param {Array|Function} valueOrCallback params Array of parameters to pass when calling an API method
* or callback function when the method returns a value.
*/
api: function(method, valueOrCallback) {
if (!this.element || !method) {
return false;
}
var self = this,
element = self.element,
target_id = element.id !== '' ? element.id : null,
params = !isFunction(valueOrCallback) ? valueOrCallback : null,
callback = isFunction(valueOrCallback) ? valueOrCallback : null;
// Store the callback for get functions
if (callback) {
storeCallback(method, callback, target_id);
}
postMessage(method, params, element);
return self;
},
/*
* Registers an event listener and a callback function that gets called when the event fires.
*
* @param eventName (String): Name of the event to listen for.
* @param callback (Function): Function that should be called when the event fires.
*/
addEvent: function(eventName, callback) {
if (!this.element) {
return false;
}
var self = this,
element = self.element,
target_id = element.id !== '' ? element.id : null;
storeCallback(eventName, callback, target_id);
// The ready event is not registered via postMessage. It fires regardless.
if (eventName != 'ready') {
postMessage('addEventListener', eventName, element);
}
else if (eventName == 'ready' && isReady) {
callback.call(null, target_id);
}
return self;
},
/*
* Unregisters an event listener that gets called when the event fires.
*
* @param eventName (String): Name of the event to stop listening for.
*/
removeEvent: function(eventName) {
if (!this.element) {
return false;
}
var self = this,
element = self.element,
target_id = element.id !== '' ? element.id : null,
removed = removeCallback(eventName, target_id);
// The ready event is not registered
if (eventName != 'ready' && removed) {
postMessage('removeEventListener', eventName, element);
}
}
};
/**
* Handles posting a message to the parent window.
*
* @param method (String): name of the method to call inside the player. For api calls
* this is the name of the api method (api_play or api_pause) while for events this method
* is api_addEventListener.
* @param params (Object or Array): List of parameters to submit to the method. Can be either
* a single param or an array list of parameters.
* @param target (HTMLElement): Target iframe to post the message to.
*/
function postMessage(method, params, target) {
if (!target.contentWindow.postMessage) {
return false;
}
var url = target.getAttribute('src').split('?')[0],
data = JSON.stringify({
method: method,
value: params
});
if (url.substr(0, 2) === '//') {
url = window.location.protocol + url;
}
target.contentWindow.postMessage(data, url);
}
/**
* Event that fires whenever the window receives a message from its parent
* via window.postMessage.
*/
function onMessageReceived(event) {
var data, method;
try {
data = JSON.parse(event.data);
method = data.event || data.method;
}
catch(e) {
//fail silently... like a ninja!
}
if (method == 'ready' && !isReady) {
isReady = true;
}
// Handles messages from moogaloop only
if (event.origin != playerDomain) {
return false;
}
var value = data.value,
eventData = data.data,
target_id = target_id === '' ? null : data.player_id,
callback = getCallback(method, target_id),
params = [];
if (!callback) {
return false;
}
if (value !== undefined) {
params.push(value);
}
if (eventData) {
params.push(eventData);
}
if (target_id) {
params.push(target_id);
}
return params.length > 0 ? callback.apply(null, params) : callback.call();
}
/**
* Stores submitted callbacks for each iframe being tracked and each
* event for that iframe.
*
* @param eventName (String): Name of the event. Eg. api_onPlay
* @param callback (Function): Function that should get executed when the
* event is fired.
* @param target_id (String) [Optional]: If handling more than one iframe then
* it stores the different callbacks for different iframes based on the iframe's
* id.
*/
function storeCallback(eventName, callback, target_id) {
if (target_id) {
if (!eventCallbacks[target_id]) {
eventCallbacks[target_id] = {};
}
eventCallbacks[target_id][eventName] = callback;
}
else {
eventCallbacks[eventName] = callback;
}
}
/**
* Retrieves stored callbacks.
*/
function getCallback(eventName, target_id) {
if (target_id) {
return eventCallbacks[target_id][eventName];
}
else {
return eventCallbacks[eventName];
}
}
function removeCallback(eventName, target_id) {
if (target_id && eventCallbacks[target_id]) {
if (!eventCallbacks[target_id][eventName]) {
return false;
}
eventCallbacks[target_id][eventName] = null;
}
else {
if (!eventCallbacks[eventName]) {
return false;
}
eventCallbacks[eventName] = null;
}
return true;
}
/**
* Returns a domain's root domain.
* Eg. returns http://vimeo.com when http://vimeo.com/channels is sbumitted
*
* @param url (String): Url to test against.
* @return url (String): Root domain of submitted url
*/
function getDomainFromUrl(url) {
if (url.substr(0, 2) === '//') {
url = window.location.protocol + url;
}
var url_pieces = url.split('/'),
domain_str = '';
for(var i = 0, length = url_pieces.length; i < length; i++) {
if(i<3) {domain_str += url_pieces[i];}
else {break;}
if(i<2) {domain_str += '/';}
}
return domain_str;
}
function isFunction(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
}
function isArray(obj) {
return toString.call(obj) === '[object Array]';
}
// Give the init function the Froogaloop prototype for later instantiation
Froogaloop.fn.init.prototype = Froogaloop.fn;
// Listens for the message event.
// W3C
if (window.addEventListener) {
window.addEventListener('message', onMessageReceived, false);
}
// IE
else {
window.attachEvent('onmessage', onMessageReceived);
}
// Stretch the Vimeo poster
var style = document.createElement('style');
var def = ' ' +
'.vjs-vimeo .vjs-poster { background-size: cover !important; }' +
'.vjs-vimeo .vjs-poster {' +
' pointer-events: none !important;' +
' }';
style.setAttribute('type', 'text/css');
document.getElementsByTagName('head')[0].appendChild(style);
if (style.styleSheet) {
style.styleSheet.cssText = def;
} else {
style.appendChild(document.createTextNode(def));
}
// Expose froogaloop to the global object
return (window.Froogaloop = window.$f = Froogaloop);
})();
/**
* Created by snayps on 11/6/14.
*/
(function() {
var defaults = {
xpos: 0,
ypos: 0
},
extend = function() {
var args, target, i, object, property;
args = Array.prototype.slice.call(arguments);
target = args.shift() || {};
for (i in args) {
object = args[i];
for (property in object) {
if (object.hasOwnProperty(property)) {
if (typeof object[property] === 'object') {
target[property] = extend(target[property], object[property]);
} else {
target[property] = object[property];
}
}
}
}
return target;
},
_timer = function(sec) {
this.hours = sec / 3600 ^ 0;
this.minute = (sec - this.hours * 3600) / 60 ^ 0;
this.second = sec - this.hours * 3600 - this.minute * 60;
},
add_zero = function(num) {
return (num < 10) ? '0' + num : num;
}
/**
* register countdown plugin
*/
videojs.plugin('countdown', function(options) {
var settings, video, div, player;
settings = extend(defaults, options);
player = this;
/* Grab the necessary DOM elements */
video = player.el();
// create the countdown element
div = document.createElement('div');
div.className = 'vjs-countdown';
if ((settings.ypos == 0) && (settings.xpos == 0)) // Top left
{
div.style.top = "0";
div.style.left = "0";
}
else if ((settings.ypos == 0) && (settings.xpos == 100)) // Top right
{
div.style.top = "0";
div.style.right = "0";
}
else if ((settings.ypos == 100) && (settings.xpos == 100)) // Bottom right
{
div.style.bottom = "0";
div.style.right = "0";
}
else if ((settings.ypos == 100) && (settings.xpos == 0)) // Bottom left
{
div.style.bottom = "0";
div.style.left = "0";
}
else if ((settings.ypos == 50) && (settings.xpos == 50)) // Center
{
div.style.top = '50%';
div.style.left = '50%';
div.style.marginLeft = '-35px';
}
// add the countdown to the player
video.appendChild(div);
//update time
player.on('timeupdate', function () {
var current_time = player.currentTime() ? player.currentTime() : 1;
var duration = player.duration();
var sec = 0;
if (current_time && duration) {
sec = Math.floor(duration - current_time);
}
var timer = new _timer(sec);
div.innerHTML = add_zero(timer.hours) + ' : ' + add_zero(timer.minute) + ' : ' + add_zero(timer.second)
});
});
})();
// videojs-speed-plugin
videojs.plugin('speed', function(options) {
var player = this,
items = [],
selectedItem;
function changeSpeed(item) {
var opt = item.options();
item.selected(true);
console.log(player);
try {
if (player.ytplayer) {
player.ytplayer.setPlaybackRate(opt.rate)
} else {
player.playbackRate(opt.rate);
}
} catch(err) {
console.log('player speed error:' + err.message);
}
var nodes = player.controlBar.speedButton.el().firstChild.children;
for (var i = 0, l = nodes.length; i < l; i++) {
if (nodes[i].className == 'vjs-current-speed') {
nodes[i].innerHTML = opt.label;
}
}
}
videojs.SpeedMenuItem = videojs.MenuItem.extend({
init: function(player, options) {
videojs.MenuItem.call(this, player, options);
this.on('click', this.onClick);
}
});
videojs.SpeedMenuItem.prototype.onClick = function(e) {
for (var i = 0, l = items.length; i < l; i++) {
items[i].selected(false);
}
changeSpeed(this);
}
videojs.SpeedButton = videojs.MenuButton.extend({
init: function(player, options){
videojs.MenuButton.call(this, player, options);
}
});
videojs.SpeedButton.prototype.createItems = function() {
var item;
options.forEach(function(opt) {
item = new videojs.SpeedMenuItem(player, { label: opt.text, rate: opt.rate });
item.className = item.className + " speed-item";
if (opt.selected) {
selectedItem = item;
}
items.push(item);
});
return items;
}
player.ready(function() {
var button = new videojs.SpeedButton(player, {
el: videojs.Component.prototype.createEl(null, {
className: 'vjs-res-button vjs-menu-button vjs-control',
innerHTML: '<div class="vjs-control-content" style="font-size: 11px; line-height: 28px;"><span class="vjs-current-speed"></span></div>',
role: 'button'
})
});
player.controlBar.speedButton = player.controlBar.addChild(button);
changeSpeed(selectedItem);
try {
if (player.c.P.id.indexOf('html5') == -1) { // FIXME player.c.P
button.hide();
}
} catch (err) {
console.log("can't detect tech.");
}
});
});
(function(vjs) {
var
extend = function(obj) {
var arg, i, k;
for (i = 1; i < arguments.length; i++) {
arg = arguments[i];
for (k in arg) {
if (arg.hasOwnProperty(k)) {
obj[k] = arg[k];
}
}
}
return obj;
},
defaults = {
type: 'text', // Annotation, text
Annotation_url: '',
text_block: 'my text block',
color_text: '#FFFFFF',
click_url: '#',
start_time: null,
end_time: null,
opacity: 0.7,
height: 20,
width: 40,
left: 50,
top: 20,
background: '#00FF00'
},
annotationOverlay = function(options) {
var player = this,
settings = extend({}, defaults, options || {}),
showingAnnotation = false,
isClose = false;
if (settings.start_time === null)
settings.start_time = 0;
if (settings.end_time === null)
settings.end_time = player.duration() + 1;
overlay = {
checkOverlay: function() {
if ((player.currentTime() >= settings.start_time) && (player.currentTime() < settings.end_time) && !isClose) {
overlay.showAnnotation();
} else {
overlay.hideAnnotation();
}
},
showAnnotation: function() {
if (showingAnnotation) {
return;
}
showingAnnotation = true;
var holderDiv = document.createElement('div');
holderDiv.id = 'vjs-annotation-overlay-holder';
holderDiv.style.height = settings.height + '%';
holderDiv.style.width = (settings.width > 100 ? 100 : settings.width) + '%';
holderDiv.style.left = ((settings.left + settings.width) > 100 ? ( 100 - settings.width) : settings.left) + '%';
holderDiv.style.top = ((settings.top + settings.height) > 100 ? ( 100 - settings.height) : settings.top) + '%';
holderDiv.style.color = settings.color_text;
var closeLink = document.createElement('a');
closeLink.className = 'boxclose';
holderDiv.appendChild(closeLink);
closeLink.onclick = function(e) {
e.preventDefault();
overlay.hideAnnotation();
isClose = true;
};
switch(settings.type) {
case 'text':
var innerBlock = document.createElement('div');
innerBlock.innerHTML = '<div class="annotation-text">' + settings.text_block + '</div>';
break;
case 'image':
var innerBlock = document.createElement('img');
innerBlock.src = settings.Annotation_url;
break;
}
innerBlock.onclick = function() {
player.pause();
window.open(settings.click_url);
};
innerBlock.style.opacity = settings.opacity;
innerBlock.style.backgroundColor = settings.background;
innerBlock.style.borderRadius = '7px';
holderDiv.appendChild(innerBlock);
player.el().appendChild(holderDiv);
},
hideAnnotation: function() {
if (!showingAnnotation) {
return;
}
showingAnnotation = false;
player.el().removeChild(document.getElementById('vjs-annotation-overlay-holder'));
}
};
player.on('timeupdate', overlay.checkOverlay);
};
vjs.plugin('annotationOverlay', annotationOverlay);
}(window.videojs));
/*
A simple jQuery modal (http://github.com/kylefox/jquery-modal)
Version 0.5.5
*/
!function(a){var b=null;a.modal=function(c,d){a.modal.close();var e,f;if(this.$body=a("body"),this.options=a.extend({},a.modal.defaults,d),this.options.doFade=!isNaN(parseInt(this.options.fadeDuration,10)),c.is("a"))if(f=c.attr("href"),/^#/.test(f)){if(this.$elm=a(f),1!==this.$elm.length)return null;this.open()}else this.$elm=a("<div>"),this.$body.append(this.$elm),e=function(a,b){b.elm.remove()},this.showSpinner(),c.trigger(a.modal.AJAX_SEND),a.get(f).done(function(d){b&&(c.trigger(a.modal.AJAX_SUCCESS),b.$elm.empty().append(d).on(a.modal.CLOSE,e),b.hideSpinner(),b.open(),c.trigger(a.modal.AJAX_COMPLETE))}).fail(function(){c.trigger(a.modal.AJAX_FAIL),b.hideSpinner(),c.trigger(a.modal.AJAX_COMPLETE)});else this.$elm=c,this.open()},a.modal.prototype={constructor:a.modal,open:function(){var b=this;this.options.doFade?(this.block(),setTimeout(function(){b.show()},this.options.fadeDuration*this.options.fadeDelay)):(this.block(),this.show()),this.options.escapeClose&&a(document).on("keydown.modal",function(b){27==b.which&&a.modal.close()}),this.options.clickClose&&this.blocker.click(a.modal.close)},close:function(){this.unblock(),this.hide(),a(document).off("keydown.modal")},block:function(){var b=this.options.doFade?0:this.options.opacity;this.$elm.trigger(a.modal.BEFORE_BLOCK,[this._ctx()]),this.blocker=a('<div class="jquery-modal blocker"></div>').css({top:0,right:0,bottom:0,left:0,width:"100%",height:"100%",position:"fixed",zIndex:this.options.zIndex,background:this.options.overlay,opacity:b}),this.$body.append(this.blocker),this.options.doFade&&this.blocker.animate({opacity:this.options.opacity},this.options.fadeDuration),this.$elm.trigger(a.modal.BLOCK,[this._ctx()])},unblock:function(){this.options.doFade?this.blocker.fadeOut(this.options.fadeDuration,function(){a(this).remove()}):this.blocker.remove()},show:function(){this.$elm.trigger(a.modal.BEFORE_OPEN,[this._ctx()]),this.options.showClose&&(this.closeButton=a('<a href="#close-modal" rel="modal:close" class="close-modal '+this.options.closeClass+'">'+this.options.closeText+"</a>"),this.$elm.append(this.closeButton)),this.$elm.addClass(this.options.modalClass+" current"),this.center(),this.options.doFade?this.$elm.fadeIn(this.options.fadeDuration):this.$elm.show(),this.$elm.trigger(a.modal.OPEN,[this._ctx()])},hide:function(){this.$elm.trigger(a.modal.BEFORE_CLOSE,[this._ctx()]),this.closeButton&&this.closeButton.remove(),this.$elm.removeClass("current"),this.options.doFade?this.$elm.fadeOut(this.options.fadeDuration):this.$elm.hide(),this.$elm.trigger(a.modal.CLOSE,[this._ctx()])},showSpinner:function(){this.options.showSpinner&&(this.spinner=this.spinner||a('<div class="'+this.options.modalClass+'-spinner"></div>').append(this.options.spinnerHtml),this.$body.append(this.spinner),this.spinner.show())},hideSpinner:function(){this.spinner&&this.spinner.remove()},center:function(){this.$elm.css({position:"fixed",top:"50%",left:"50%",marginTop:-(this.$elm.outerHeight()/2),marginLeft:-(this.$elm.outerWidth()/2),zIndex:this.options.zIndex+1})},_ctx:function(){return{elm:this.$elm,blocker:this.blocker,options:this.options}}},a.modal.prototype.resize=a.modal.prototype.center,a.modal.close=function(a){if(b){a&&a.preventDefault(),b.close();var c=b.$elm;return b=null,c}},a.modal.resize=function(){b&&b.resize()},a.modal.isActive=function(){return b?!0:!1},a.modal.defaults={overlay:"#000",opacity:.75,zIndex:1,escapeClose:!0,clickClose:!0,closeText:"Close",closeClass:"",modalClass:"modal",spinnerHtml:null,showSpinner:!0,showClose:!0,fadeDuration:null,fadeDelay:1},a.modal.BEFORE_BLOCK="modal:before-block",a.modal.BLOCK="modal:block",a.modal.BEFORE_OPEN="modal:before-open",a.modal.OPEN="modal:open",a.modal.BEFORE_CLOSE="modal:before-close",a.modal.CLOSE="modal:close",a.modal.AJAX_SEND="modal:ajax:send",a.modal.AJAX_SUCCESS="modal:ajax:success",a.modal.AJAX_FAIL="modal:ajax:fail",a.modal.AJAX_COMPLETE="modal:ajax:complete",a.fn.modal=function(c){return 1===this.length&&(b=new a.modal(this,c)),this},a(document).on("click.modal",'a[rel="modal:close"]',a.modal.close),a(document).on("click.modal",'a[rel="modal:open"]',function(b){b.preventDefault(),a(this).modal()})}(jQuery);
/*
* jQuery.plainOverlay
* https://github.com/anseki/jquery-plainoverlay
*
* Copyright (c) 2014 anseki
* Licensed under the MIT license.
*/
;
(function ($, undefined) {
'use strict';
var APP_NAME = 'plainOverlay',
// builtin progress element
newProgress = (function () {
function experimental(props, supports, prefix, sep) { // similar to Compass
sep = sep === undefined ? ';' : sep;
return $.map(props, function (prop) {
return $.map(supports, function (support) {
return (prefix || '') + support + prop;
}).join(sep);
}).join(sep);
}
var isLegacy, domId = 'jQuery-' + APP_NAME,
supports = ['-webkit-', '-moz-', '-ms-', '-o-', ''], prefix = domId + '-progress',
cssText = '.' + prefix + '{' + experimental(['box-sizing:border-box'], ['-webkit-', '-moz-', '']) + ';width:100%;height:100%;border-top:3px solid #17f29b;' + experimental(['border-radius:50%'], supports) + ';-webkit-tap-highlight-color:rgba(0,0,0,0);transform:translateZ(0);box-shadow:0 0 1px rgba(0,0,0,0);' + experimental(['animation-name:' + domId + '-spin', 'animation-duration:1s', 'animation-timing-function:linear', 'animation-iteration-count:infinite'], supports) + '}' + experimental(['keyframes ' + domId + '-spin{from{' + experimental(['transform:rotate(0deg)'], supports) + '}to{' + experimental(['transform:rotate(360deg)'], supports) + '}}'], supports, '@', '') + '.' + prefix + '-legacy{width:100%;height:50%;padding-top:25%;text-align:center;white-space:nowrap;*zoom:1}.' + prefix + '-legacy:after,.' + prefix + '-legacy:before{content:" ";display:table}.' + prefix + '-legacy:after{clear:both}.' + prefix + '-legacy div{width:18%;height:100%;margin:0 1%;background-color:#17f29b;float:left;visibility:hidden}.' + prefix + '-1 div.' + prefix + '-1,.' + prefix + '-2 div.' + prefix + '-1,.' + prefix + '-2 div.' + prefix + '-2,.' + prefix + '-3 div.' + prefix + '-1,.' + prefix + '-3 div.' + prefix + '-2,.' + prefix + '-3 div.' + prefix + '-3{visibility:visible}',
adjustProgress = function () {
var progressWH = Math.min(300, // max w/h
(this.isBody ?
Math.min(this.jqWin.width(), this.jqWin.height()) :
Math.min(this.jqTarget.innerWidth(), this.jqTarget.innerHeight())) * 0.9);
this.jqProgress.width(progressWH).height(progressWH);
if (!this.showProgress) { // CSS Animations
this.jqProgress.children('.' + prefix).css('borderTopWidth',
Math.max(3, progressWH / 30)); // min width
}
},
showProgressLegacy = function (start) {
var that = this;
if (that.timer) {
clearTimeout(that.timer);
}
if (that.progressCnt) {
that.jqProgress.removeClass(prefix + '-' + that.progressCnt);
}
if (that.isShown) {
that.progressCnt = !start && that.progressCnt < 3 ? that.progressCnt + 1 : 0;
if (that.progressCnt) {
that.jqProgress.addClass(prefix + '-' + that.progressCnt);
}
that.timer = setTimeout(function () {
that.showProgress();
}, 500);
}
};
return function (overlay) {
var jqProgress, sheet;
// Graceful Degradation
if (typeof isLegacy !== 'boolean') {
isLegacy = (function () { // similar to Modernizr
function contains(str, substr) {
return !!~('' + str).indexOf(substr);
}
var res, feature,
modElem = document.createElement('modernizr'),
mStyle = modElem.style,
omPrefixes = 'Webkit Moz O ms',
cssomPrefixes = omPrefixes.split(' '),
tests = {},
_hasOwnProperty = ({}).hasOwnProperty,
hasOwnProp = _hasOwnProperty !== undefined &&
_hasOwnProperty.call !== undefined ?
function (object, property) {
return _hasOwnProperty.call(object, property);
} :
function (object, property) {
return (property in object) &&
object.constructor.prototype[property] === undefined;
};
function testProps(props) {
var i;
for (i in props) {
if (!contains(props[i], '-') && mStyle[props[i]] !== undefined) {
return true;
}
}
return false;
}
function testPropsAll(prop) {
var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
return testProps(props);
}
tests.borderradius = function () {
return testPropsAll('borderRadius');
};
tests.cssanimations = function () {
return testPropsAll('animationName');
};
tests.csstransforms = function () {
return !!testPropsAll('transform');
};
res = false;
for (feature in tests) {
if (hasOwnProp(tests, feature) && !tests[feature]()) {
res = true;
break;
}
}
mStyle.cssText = '';
modElem = null;
return res;
})();
}
if (!overlay.elmDoc.getElementById(domId)) { // Add style rules
if (overlay.elmDoc.createStyleSheet) { // IE
sheet = overlay.elmDoc.createStyleSheet();
sheet.owningElement.id = domId;
sheet.cssText = cssText;
} else {
sheet = (overlay.elmDoc.getElementsByTagName('head')[0] || overlay.elmDoc.documentElement)
.appendChild(overlay.elmDoc.createElement('style'));
sheet.type = 'text/css';
sheet.id = domId;
sheet.textContent = cssText;
}
}
if (isLegacy) {
jqProgress = $('<div><div class="' + prefix + '-legacy">' +
'<div class="' + prefix + '-3" /><div class="' + prefix + '-2" /><div class="' + prefix + '-1" /><div class="' + prefix + '-2" /><div class="' + prefix + '-3" /></div></div>');
overlay.showProgress = showProgressLegacy;
} else {
jqProgress = $('<div><div class="' + prefix + '" /></div>');
}
overlay.adjustProgress = adjustProgress;
return jqProgress;
};
})();
function Overlay(jqTarget, options, curObject) {
var that = this, elmTarget = jqTarget.get(0);
that.duration = options.duration;
that.opacity = options.opacity;
that.isShown = false;
that.jqTargetOrg = jqTarget;
// that.jqWin = that.jqTarget.ownerDocument.defaultView; // Not supported by IE
if ($.isWindow(elmTarget) || elmTarget.nodeType === 9) { // window or document -> body
that.jqTarget = $('body');
} else if (elmTarget.nodeName.toLowerCase() === 'iframe' ||
elmTarget.nodeName.toLowerCase() === 'frame') { // iframe or frame -> body of it
// contentDocument not supported by IE
that.jqWin = $(elmTarget.contentWindow);
that.elmDoc = elmTarget.contentWindow.document;
that.jqTarget = $('body', that.elmDoc);
that.isFrame = true;
} else {
that.jqTarget = jqTarget;
}
that.jqWin = that.jqWin || $(window);
that.elmDoc = that.elmDoc || document;
that.isBody = that.jqTarget.get(0).nodeName.toLowerCase() === 'body';
if (curObject) {
// Remove jqProgress that exists always, because it may be replaced.
if (curObject.jqProgress) {
if (curObject.timer) {
clearTimeout(curObject.timer);
}
curObject.jqProgress.remove();
delete curObject.jqProgress;
}
curObject.reset(true); // Restore styles
curObject.jqOverlay.stop();
}
that.jqOverlay = (curObject && curObject.jqOverlay ||
$('<div class="plainoverlay" />').css({
position: that.isBody ? 'fixed' : 'absolute',
left: 0,
top: 0,
display: 'none',
cursor: 'wait'
}).appendTo(that.jqTarget)
).css({backgroundColor: options.fillColor, zIndex: options.zIndex});
if (that.jqProgress = options.progress === false ? undefined :
(typeof options.progress === 'function' ?
options.progress.call(that.jqTarget, options) : newProgress(that))) {
that.jqProgress.css({
position: that.isBody ? 'fixed' : 'absolute',
display: 'none',
zIndex: options.zIndex + 1,
cursor: 'wait'
}).appendTo(that.jqTarget);
}
// Not shared methods for calling per object in event of one element.
that.callAdjust = (function (that) {
return that.adjustProgress ? function () {
that.adjustProgress();
that.adjust();
} : function () {
that.adjust();
};
})(that);
that.avoidFocus = (function (that) {
return function (e) {
// $(that.elmDoc.activeElement).blur();
// e.preventDefault();
// return false;
};
})(that);
that.avoidScroll = (function (that) {
return function (e) {
(function (jqView) {
jqView.scrollLeft(that.scrLeft).scrollTop(that.scrTop);
})(that.isBody ? that.jqWin : that.jqTarget);
e.preventDefault();
return false;
};
})(that);
if (curObject) {
if (curObject.timer) {
clearTimeout(curObject.timer);
}
curObject = undefined; // Erase
}
}
Overlay.prototype.show = function () {
var that = this, inlineStyles, position, calMarginR, calMarginB, jqActive;
that.reset(true); // Restore styles
inlineStyles = that.jqTarget.get(0).style;
that.orgPosition = inlineStyles.position;
position = that.jqTarget.css('position');
if (position !== 'relative' && position !== 'absolute' && position !== 'fixed') {
that.jqTarget.css('position', 'relative');
}
that.orgOverflow = inlineStyles.overflow;
calMarginR = that.jqTarget.prop('clientWidth');
calMarginB = that.jqTarget.prop('clientHeight');
that.jqTarget.css('overflow', 'hidden');
calMarginR -= that.jqTarget.prop('clientWidth');
calMarginB -= that.jqTarget.prop('clientHeight');
that.addMarginR = that.addMarginB = 0;
if (calMarginR < 0) {
that.addMarginR = -calMarginR;
}
if (calMarginB < 0) {
that.addMarginB = -calMarginB;
}
if (that.isBody) {
if (that.addMarginR) {
that.orgMarginR = inlineStyles.marginRight;
that.jqTarget.css('marginRight', '+=' + that.addMarginR);
}
if (that.addMarginB) {
that.orgMarginB = inlineStyles.marginBottom;
that.jqTarget.css('marginBottom', '+=' + that.addMarginB);
}
} else { // change these in adjust()
if (that.addMarginR) {
that.orgMarginR = inlineStyles.paddingRight;
that.orgWidth = inlineStyles.width;
}
if (that.addMarginB) {
that.orgMarginB = inlineStyles.paddingBottom;
that.orgHeight = inlineStyles.height;
}
}
that.jqActive = undefined;
jqActive = $(that.elmDoc.activeElement);
if (that.isBody && !that.isFrame) {
that.jqActive = jqActive.blur();
} // Save activeElement
else if (that.jqTarget.has(jqActive.get(0)).length) {
jqActive.blur();
}
that.jqTarget.focusin(that.avoidFocus);
(function (jqView) {
that.scrLeft = jqView.scrollLeft();
that.scrTop = jqView.scrollTop();
jqView.scroll(that.avoidScroll);
})(that.isBody ? that.jqWin : that.jqTarget);
that.jqWin.resize(that.callAdjust);
that.callAdjust();
that.isShown = true;
that.jqOverlay.stop().fadeTo(that.duration, that.opacity,
function () {
that.jqTargetOrg.trigger('plainoverlayshow');
});
if (that.jqProgress) {
if (that.showProgress) {
that.showProgress(true);
}
that.jqProgress.fadeIn(that.duration);
}
};
Overlay.prototype.hide = function () {
var that = this;
if (!that.isShown) {
return;
}
that.jqOverlay.stop().fadeOut(that.duration,
function () {
that.reset();
that.jqTargetOrg.trigger('plainoverlayhide');
});
if (that.jqProgress) {
that.jqProgress.fadeOut(that.duration);
}
};
Overlay.prototype.adjust = function () {
var calW, calH;
if (this.isBody) {
// base of overlay size and progress position is window.
calW = this.jqWin.width();
calH = this.jqWin.height();
this.jqOverlay.width(calW).height(calH);
if (this.jqProgress) {
this.jqProgress.css({
left: (calW - this.jqProgress.outerWidth()) / 2,
top: (calH - this.jqProgress.outerHeight()) / 2
});
}
} else {
if (this.addMarginR) {
calW = this.jqTarget.css({paddingRight: this.orgMarginR, width: this.orgWidth})
.width(); // original size
this.jqTarget.css('paddingRight', '+=' + this.addMarginR).width(calW - this.addMarginR);
}
if (this.addMarginB) {
calH = this.jqTarget.css({paddingBottom: this.orgMarginB, height: this.orgHeight})
.height(); // original size
this.jqTarget.css('paddingBottom', '+=' + this.addMarginB).height(calH - this.addMarginB);
}
// base of overlay size is element size that includes hidden area.
calW = Math.max(this.jqTarget.prop('scrollWidth'), this.jqTarget.innerWidth()); // for IE bug
calH = Math.max(this.jqTarget.prop('scrollHeight'), this.jqTarget.innerHeight());
this.jqOverlay.width(calW).height(calH);
if (this.jqProgress) {
// base of progress position is element size that doesn't include hidden area.
calW = this.jqTarget.innerWidth();
calH = this.jqTarget.innerHeight();
this.jqProgress.css({
left: (calW - this.jqProgress.outerWidth()) / 2 + this.scrLeft,
top: (calH - this.jqProgress.outerHeight()) / 2 + this.scrTop
});
}
}
};
Overlay.prototype.reset = function (forceHide) {
// default: display of jqOverlay and jqProgress is kept
var that = this;
if (forceHide) {
that.jqOverlay.css('display', 'none');
if (that.jqProgress) {
that.jqProgress.css('display', 'none');
}
}
if (!that.isShown) {
return;
}
that.jqTarget.css({position: that.orgPosition, overflow: that.orgOverflow});
if (that.isBody) {
if (that.addMarginR) {
that.jqTarget.css('marginRight', that.orgMarginR);
}
if (that.addMarginB) {
that.jqTarget.css('marginBottom', that.orgMarginB);
}
} else {
if (that.addMarginR) {
that.jqTarget.css({paddingRight: that.orgMarginR, width: that.orgWidth});
}
if (that.addMarginB) {
that.jqTarget.css({paddingBottom: that.orgMarginB, height: that.orgHeight});
}
}
that.jqTarget.off('focusin', that.avoidFocus);
if (that.jqActive && that.jqActive.length) {
that.jqActive.focus();
} // Restore activeElement
(function (jqView) {
jqView.off('scroll', that.avoidScroll).scrollLeft(that.scrLeft).scrollTop(that.scrTop);
})(that.isBody ? that.jqWin : that.jqTarget);
that.jqWin.off('resize', that.callAdjust);
that.isShown = false;
};
function init(jq, options) {
var opt = $.extend({
duration: 200,
opacity: 0.6,
zIndex: 9997
// Optional: progress, show, hide
}, options);
opt.fillColor = opt.fillColor || opt.color /* alias */ || '#888';
return jq.each(function () {
var that = $(this);
that.data(APP_NAME, new Overlay(that, opt, that.data(APP_NAME)));
if (typeof opt.show === 'function') {
that.on('plainoverlayshow', opt.show);
}
if (typeof opt.hide === 'function') {
that.on('plainoverlayhide', opt.hide);
}
});
}
function overlayShow(jq, options) {
return jq.each(function () {
var that = $(this), overlay;
if (options || !(overlay = that.data(APP_NAME))) {
overlay = init(that, options).data(APP_NAME);
}
overlay.show();
});
}
function overlayHide(jq) {
return jq.each(function () {
var overlay = $(this).data(APP_NAME);
if (overlay) {
overlay.hide();
}
});
}
$.fn[APP_NAME] = function (action, options) {
return (
action === 'show' ? overlayShow(this, options) :
action === 'hide' ? overlayHide(this) :
init(this, action)); // options.
};
})(jQuery);
function array_unique(e){var t={},n,r=e.length,i=[];for(n=0;n<r;n+=1)t[e[n]]=e[n];for(n in t)i.push(t[n]);return i}
// Copyright (c) 2012 Florian H., https://github.com/js-coder https://github.com/js-coder/cookie.js
!function(e,t){var n=function(){return n.get.apply(n,arguments)},r=n.utils={isArray:Array.isArray||function(e){return Object.prototype.toString.call(e)==="[object Array]"},isPlainObject:function(e){return!!e&&Object.prototype.toString.call(e)==="[object Object]"},toArray:function(e){return Array.prototype.slice.call(e)},getKeys:Object.keys||function(e){var t=[],n="";for(n in e)e.hasOwnProperty(n)&&t.push(n);return t},escape:function(e){return String(e).replace(/[,;"\\=\s%]/g,function(e){return encodeURIComponent(e)})},retrieve:function(e,t){return e==null?t:e}};n.defaults={},n.expiresMultiplier=86400,n.set=function(n,i,s){if(r.isPlainObject(n))for(var o in n)n.hasOwnProperty(o)&&this.set(o,n[o],i);else{s=r.isPlainObject(s)?s:{expires:s};var u=s.expires!==t?s.expires:this.defaults.expires||"",a=typeof u;a==="string"&&u!==""?u=new Date(u):a==="number"&&(u=new Date(+(new Date)+1e3*this.expiresMultiplier*u)),u!==""&&"toGMTString"in u&&(u=";expires="+u.toGMTString());var f=s.path||this.defaults.path;f=f?";path="+f:"";var l=s.domain||this.defaults.domain;l=l?";domain="+l:"";var c=s.secure||this.defaults.secure?";secure":"";e.cookie=r.escape(n)+"="+r.escape(i)+u+f+l+c}return this},n.remove=function(e){e=r.isArray(e)?e:r.toArray(arguments);for(var t=0,n=e.length;t<n;t++)this.set(e[t],"",-1);return this},n.empty=function(){return this.remove(r.getKeys(this.all()))},n.get=function(e,n){n=n||t;var i=this.all();if(r.isArray(e)){var s={};for(var o=0,u=e.length;o<u;o++){var a=e[o];s[a]=r.retrieve(i[a],n)}return s}return r.retrieve(i[e],n)},n.all=function(){if(e.cookie==="")return{};var t=e.cookie.split("; "),n={};for(var r=0,i=t.length;r<i;r++){var s=t[r].split("=");n[decodeURIComponent(s[0])]=decodeURIComponent(s[1])}return n},n.enabled=function(){if(navigator.cookieEnabled)return!0;var e=n.set("_","_").get("_")==="_";return n.remove("_"),e},typeof define=="function"&&define.amd?define(function(){return n}):typeof exports!="undefined"?exports.cookie=n:window.cookie=n}(document);
var ModulesVideoOnly =
{
'video-behavior_resume': {
_flag_can_update_time: false,
_seek_to_time: 0,
activate: function () {
var _flag = this._flag_can_update_time;
var that = this;
$('body')
.on('click', '.js--playback-restart', function (event) {
event.preventDefault();
get_vpa_player().currentTime(0).pause().play();
that.hide_overlay();
})
.on('click', '.js--playback-resume', function (event) {
event.preventDefault();
get_vpa_player().currentTime(that._seek_to_time).pause().play();
that.hide_overlay();
});
if (get_vpa_player()) {
//check to see if resume cookie is set.
//if set, resume playing and remove cookie
if (cookie.get('video_current_time')) {
get_vpa_player().one('durationchange', function () {
that._seek_to_time = cookie.get('video_current_time');
_flag = true;
that.show_overlay_content();
});
} else {
_flag = true;
}
get_vpa_player().on('timeupdate', function () {
if (_flag !== true)
return;
var time = Math.round(this.currentTime());
cookie.set('video_current_time', time);
});
get_vpa_player().on('ended', function () {
cookie.remove('video_current_time');
});
}
},
show_overlay_content: function () {
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_resume_playback();
get_vpa_player().pause();
},
hide_overlay: function () {
$('.video-holder').plainOverlay('hide');
this.deactivate();
get_vpa_player().play();
},
deactivate: function () {
cookie.remove('video_current_time');
}
},
'video-behavior_autostart': {
activate: function () {
get_vpa_player().play();
},
deactivate: function () {
}
},
'video-controls_controlbar': {
activate: function () {
get_vpa_player().one('playing', function () {
if (cookie.get('vpa_visit_count') && +cookie.get('vpa_visit_count') >= js_options['video-controls_visit']) {
get_vpa_player().controlBar.show();
if (js_options['video-controls_always-visible'] && js_options['video-controls_always-visible'] != '0') {
$(get_vpa_player().controlBar.el()).css({'opacity': 1, 'visibility': 'visible'});
}
}
});
if (js_options['video-controls_always-visible'] == '0') {
$(get_vpa_player().controlBar.el()).css({'opacity': 0, 'visibility': 'hidden'});
get_vpa_player().on('mouseover', function () {
$(get_vpa_player().controlBar.el()).css({'opacity': 1, 'visibility': 'visible'});
})
get_vpa_player().on('mouseout', function () {
$(get_vpa_player().controlBar.el()).css({'opacity': 0, 'visibility': 'hidden'});
})
}
},
deactivate: function () {
get_vpa_player().controlBar.hide();
}
},
'video-controls_play-button-middle': {
activate: function () {
if (js_options['video-settings_source'] == 'youtube')
return;
get_vpa_player().bigPlayButton.removeClass('display-none');
get_vpa_player().one('playing', function () {
get_vpa_player().bigPlayButton.show();
if (!get_vpa_player().paused())
get_vpa_player().bigPlayButton.hide();
});
get_vpa_player().on('play', function () {
this.bigPlayButton.hide();
});
get_vpa_player().on('pause', function () {
if (!is_video_strong_paused())
this.bigPlayButton.show();
});
},
deactivate: function () {
get_vpa_player().bigPlayButton.addClass('display-none');
}
},
'video-controls_play-button-controlbar': {
activate: function () {
get_vpa_player().one('playing', function () {
get_vpa_player().controlBar.playToggle.show();
});
},
deactivate: function () {
get_vpa_player().controlBar.playToggle.hide();
}
},
'video-controls_fullscreen': {
activate: function () {
get_vpa_player().one('playing', function () {
get_vpa_player().controlBar.fullscreenToggle.show();
});
},
deactivate: function () {
get_vpa_player().controlBar.fullscreenToggle.hide();
get_vpa_player().on('dblclick', function(e) {
return;
});
}
},
'video-controls_volume-control': {
activate: function () {
get_vpa_player().one('playing', function () {
get_vpa_player().controlBar.muteToggle.show();
});
},
deactivate: function () {
get_vpa_player().controlBar.muteToggle.hide();
}
},
'video-controls_progress-control': {
activate: function () {
get_vpa_player().one('playing', function () {
get_vpa_player().controlBar.progressControl.show();
});
},
deactivate: function () {
get_vpa_player().controlBar.progressControl.hide();
}
},
'video-controls_time-control': {
activate: function () {
get_vpa_player().one('playing', function () {
get_vpa_player().controlBar.currentTimeDisplay.show();
get_vpa_player().controlBar.timeDivider.show();
get_vpa_player().controlBar.durationDisplay.show();
});
},
deactivate: function () {
get_vpa_player().controlBar.currentTimeDisplay.hide();
get_vpa_player().controlBar.timeDivider.hide();
get_vpa_player().controlBar.durationDisplay.hide();
}
},
'video-controls_countdown': {
activate: function () {
this. show_overlay();
},
deactivate: function () {
this.hide_overlay();
},
show_overlay: function () {
$('.vjs-countdown').show();
},
hide_overlay: function () {
$('.vjs-countdown').hide();
}
},
'video-speed': {
activate: function () {
get_vpa_player().controlBar.speedButton.show();
},
deactivate: function () {
get_vpa_player().controlBar.speedButton.hide();
},
show_overlay: function () {
get_vpa_player().controlBar.speedButton.show();
},
hide_overlay: function () {
get_vpa_player().controlBar.speedButton.hide();
}
},
'video-watermark': {
halt_wmr: false,
listener: function () {
if (this.halt_wmr)
return;
if (typeof this.timepoint_wmr === 'undefined') {
this.timepoint_wmr = parseFloat(js_options['video-watermark_custom-time'].toFixed(1));
}
if (typeof this.timepoint_wmr === 'number' && (this.timepoint_wmr % 1) === 0) {
var current_time = Math.floor(this.currentTime());
} else {
var current_time = this.currentTime().toFixed(1);
}
current_time = parseFloat(current_time);
if (current_time == this.timepoint_wmr || current_time > this.timepoint_wmr) {
this.halt_wmr = true;
$('.vjs-watermark-block').show(1000);
}
},
activate: function () {
var that = this;
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
});
},
deactivate: function () {
this.hide_overlay();
},
show_overlay: function () {
$('.vjs-watermark-block').show();
},
hide_overlay: function () {
$('.vjs-watermark-block').hide();
}
},
'overlay-optin': {
halt_optin: false,
listener: function () {
console.log('time: ' + get_vpa_player().duration());
if (this.halt_optin)
return;
if (typeof this.timepoint === 'undefined') {
switch (js_options['overlay-optin_time']) {
case 'start':
this.timepoint = 0;
break;
case 'end':
this.timepoint = parseInt(get_vpa_player().duration()) - 1;
break;
default:
this.timepoint = js_options['overlay-optin_custom-time'];
}
this.timepoint = parseFloat(this.timepoint.toFixed(1));
}
if (typeof this.timepoint === 'number' && (this.timepoint % 1) === 0) {
var current_time = Math.floor(this.currentTime());
} else {
var current_time = this.currentTime().toFixed(1);
}
current_time = parseFloat(current_time);
if (current_time == this.timepoint || current_time > this.timepoint) {
this.halt_optin = true;
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_overlay_optin();
var that = this;
setTimeout(function () {
that.pause();
}, 10);
}
},
show_overlay_content: function () {
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_overlay_optin();
get_vpa_player().pause();
},
hide_overlay: function () {
$('.video-holder').plainOverlay('hide');
this.deactivate();
get_vpa_player().play();
},
activate: function () {
if (parseInt(js_options['overlay-optin_not-show-after'])
&& parseInt(js_options['overlay-optin_not-show-view-count']) <= parseInt(getViewsCountVideo())) {
return;
}
if (js_options['overlay-optin_hide-after-subscription']
&& getOverlayUserSubscribed()) {
return;
}
var that = this;
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
$('.overlay--optin .overlay_skip').bind('click touchstart', function () {
if (is_editable) {
return;
}
that.hide_overlay();
});
});
},
deactivate: function () {
get_vpa_player().off('timeupdate', this.listener);
}
},
'share-gateway': {
listener: function () {
this.halt_gtw = false;
if (this.halt_gtw)
return;
if (typeof this.timepoint_gtw === 'undefined') {
switch (js_options['share-gateway_time']) {
case 'start':
this.timepoint_gtw = 0;
break;
case 'end':
this.timepoint_gtw = get_vpa_player().duration() - 1;
break;
default:
this.timepoint_gtw = js_options['share-gateway_custom-time'];
}
this.timepoint_gtw = parseFloat(this.timepoint_gtw.toFixed(1));
}
if (typeof this.timepoint_gtw === 'number' && (this.timepoint_gtw % 1) === 0) {
var current_time = Math.floor(this.currentTime());
} else {
var current_time = this.currentTime().toFixed(1);
}
current_time = parseFloat(current_time);
if (current_time == this.timepoint_gtw || current_time > this.timepoint_gtw) {
this.halt_gtw = true;
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_share_gateway();
var that = this;
setTimeout(function () {
that.pause();
}, 10);
}
},
show_overlay: function () {
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_share_gateway();
get_vpa_player().pause();
},
hide_overlay: function () {
$('.video-holder').plainOverlay('hide');
this.deactivate();
if (get_vpa_player().paused())
get_vpa_player().play();
},
activate: function () {
if (parseInt(js_options['share-gateway_not-show-after'])
&& parseInt(js_options['share-gateway_not-show-view-count']) <= parseInt(getViewsCountVideo())) {
return;
}
var that = this;
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
$('.overlay--gateway .overlay_skip').bind('click touchstart', function () {
if (is_editable) {
return;
}
that.hide_overlay();
});
});
},
deactivate: function () {
get_vpa_player().off('timeupdate', this.listener);
}
},
'cta': {
listener: function () {
if (is_video_strong_paused())
return;
this.halt_cta = false;
if (this.halt_cta)
return;
if (typeof this.timepoint_cta === 'undefined') {
switch (js_options['cta_time']) {
case 'start':
this.timepoint_cta = 0;
break;
case 'end':
this.timepoint_cta = get_vpa_player().duration() - 1;
break;
default:
this.timepoint_cta = js_options['cta_custom-time'];
}
this.timepoint_cta = parseFloat(this.timepoint_cta.toFixed(1));
}
if (typeof this.timepoint_cta === 'number' && (this.timepoint_cta % 1) === 0) {
var current_time = Math.floor(this.currentTime());
} else {
var current_time = this.currentTime().toFixed(1);
}
current_time = parseFloat(current_time);
if (current_time == this.timepoint_cta || current_time > this.timepoint_cta) {
this.halt_cta = true;
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_cta_overlay();
var that = this;
setTimeout(function () {
that.pause();
}, 10);
}
},
show_overlay: function () {
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_cta_overlay();
get_vpa_player().pause();
},
hide_overlay: function () {
$('.video-holder').plainOverlay('hide');
this.deactivate();
if (get_vpa_player().paused())
get_vpa_player().play();
},
activate: function () {
if (parseInt(js_options['cta_not-show-after'])
&& parseInt(js_options['cta_not-show-view-count']) <= parseInt(getViewsCountVideo())) {
return;
}
var that = this;
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
$('.overlay--cta .overlay_skip').bind('click touchstart', function () {
if (is_editable) {
return;
}
that.hide_overlay();
});
});
},
deactivate: function () {
get_vpa_player().off('timeupdate', this.listener);
}
},
'video-behavior_onend': {
activate: function () {
get_vpa_player().on('ended', function () {
var that = this;
this.pause();
switch (js_options['video-behavior_onend']) {
case 'replay':
this.play();
break;
case 'last_frame':
this.currentTime(this.duration());
setTimeout(function () {
that.pause();
}, 100);
break;
case 'first_frame':
this.currentTime(1);
setTimeout(function () {
that.pause();
}, 100);
break;
case 'black_frame':
$('#vpa_video').append('<div class="vjs-blackout"> </div>')
break;
default:
break;
}
});
get_vpa_player().on('play', function () {
var $blackout = $('#vpa_video').find('.vjs-blackout');
if ($blackout.length) {
$blackout.remove();
}
});
},
deactivate: function () {
}
},
'pause-viewport': {
activate: function () {
function viewport_cb(event) {
if (event.data === 'pp_video_is_visible') {
if (is_video_strong_paused() === false && (!get_vpa_player().paused() || (get_vpa_player().paused() && jQuery(get_vpa_player().el()).data('paused_niv') === 'true')))
get_vpa_player().play();
jQuery(get_vpa_player().el()).data('paused_niv', 'false');
}
else if (event.data === 'pp_video_not_visible') {
if (!get_vpa_player().paused())
jQuery(get_vpa_player().el()).data('paused_niv', 'true');
get_vpa_player().pause();
}
}
window.addEventListener("message", viewport_cb, false);
},
deactivate: function () {
}
},
'pause-outside-tab': {
activate: function () {
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
hidden = "hidden";
visibilityChange = "visibilitychange";
} else if (typeof document.mozHidden !== "undefined") {
hidden = "mozHidden";
visibilityChange = "mozvisibilitychange";
} else if (typeof document.msHidden !== "undefined") {
hidden = "msHidden";
visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
hidden = "webkitHidden";
visibilityChange = "webkitvisibilitychange";
}
// If the page is hidden, pause the video;
function handleVisibilityChange() {
if (document[hidden]) {
get_vpa_player().pause();
} else {
}
}
document.addEventListener(visibilityChange, handleVisibilityChange, false);
},
deactivate: function () {
}
},
'sales-area_timed-delay': {
timepoint: js_options['sales-area_timed-delay-amount'],
halt: false,
listener: function () {
var that = ModulesVideoOnly['sales-area_timed-delay'];
if (that.halt)
return;
if (Math.floor(this.currentTime()) >= that.timepoint) {
that.halt = true;
that.show_sales_area();
}
},
show_sales_area: function () {
$('.salesWrapper').show();
},
activate: function () {
var that = this;
if (js_options['sales-area_timed-delay-visit'] &&
parseInt(getVisitCount(), 10) >= parseInt(js_options['sales-area_timed-delay-visit-count'], 10)) {
this.show_sales_area();
} else {
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
});
}
},
deactivate: function () {
get_vpa_player().off('timeupdate', this.listener);
}
},
'overlay-annotation' : {
show_overlay: function () {
},
hide_overlay: function () {
},
activate: function () {
},
deactivate: function () {
}
},
'overlay-button': {
listener: function () {
if (is_video_strong_paused())
return;
this.halt_button = false;
if (this.halt_button)
return;
if (typeof this.timepoint_button === 'undefined') {
switch (js_options['overlay-button_time']) {
case 'start':
this.timepoint_button = 0;
break;
case 'end':
this.timepoint_button = get_vpa_player().duration() - 1;
break;
default:
this.timepoint_button = js_options['overlay-button_custom-time'];
}
this.timepoint_button = parseFloat(this.timepoint_button.toFixed(1));
}
if (typeof this.timepoint_button === 'number' && (this.timepoint_button % 1) === 0) {
var current_time = Math.floor(this.currentTime());
} else {
var current_time = this.currentTime().toFixed(1);
}
current_time = parseFloat(current_time);
if (current_time == this.timepoint_button || current_time > this.timepoint_button) {
this.halt_button = true;
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_overlay_button();
var that = this;
setTimeout(function () {
that.pause();
}, 10);
}
},
show_overlay: function () {
if (get_vpa_player().isFullscreen())
get_vpa_player().exitFullscreen();
show_overlay_button();
get_vpa_player().pause();
},
hide_overlay: function () {
$('.video-holder').plainOverlay('hide');
this.deactivate();
if (get_vpa_player().paused())
get_vpa_player().play();
},
activate: function () {
var that = this;
get_vpa_player().on('loadedmetadata', function () {
get_vpa_player().on('timeupdate', that.listener);
$('.overlay--button .overlay_skip').bind('click touchstart', function () {
if (is_editable) {
return;
}
that.hide_overlay();
});
});
},
deactivate: function () {
get_vpa_player().off('timeupdate', this.listener);
}
}
};
function show_overlay_optin() {
$('.video-holder').plainOverlay('show', {
color: js_options['overlay-optin_background-color'] || 'black',
opacity: js_options['overlay-optin_overlay-opacity'] || 0.75,
progress: function () {
return $(".overlay--optin").first().clone(true);
}
});
adjust_overlay_content();
}
function show_share_gateway() {
$('.video-holder').plainOverlay('show', {
color: js_options['share-gateway_background-color'] || 'black',
opacity: js_options['share-gateway_overlay-opacity'] || 0.75,
progress: function () {
return $(".overlay--gateway").first().clone(true);
}
});
adjust_overlay_content();
}
function show_cta_overlay() {
$('.video-holder').plainOverlay('show', {
color: js_options['cta_background'] || 'black',
opacity: js_options['cta_overlay-opacity'] || 0.75,
progress: function () {
return $(".overlay--cta").first().clone(true);
}
});
adjust_overlay_content();
}
function show_resume_playback() {
$('.video-holder').plainOverlay('show', {
color: '#000000',
opacity: 0.75,
progress: function () {
return $(".overlay--playback-resume").first().clone(true);
}
});
adjust_overlay_content();
}
function show_overlay_button() {
$('.video-holder').plainOverlay('show', {
color: js_options['overlay-optin_background-color'] || 'black',
opacity: js_options['overlay-optin_overlay-opacity'] || 0.75,
progress: function () {
return $(".overlay--button").first().clone(true);
}
});
adjust_overlay_content();
}
function get_vpa_player(force_tech) {
if (typeof window['vpa_player'] === 'undefined') {
var $vpa_video = $('#vpa_video');
force_tech = force_tech || $vpa_video.closest('.video-js-wrapper').data('tech');
var video_setup = $vpa_video.closest('.video-js-wrapper').data('setup');
switch (force_tech) {
case 'html5':
if (!supports_h264_baseline_video()) {
video_setup.techOrder = ['flash', 'html5'];
}
window['vpa_player'] = videojs('vpa_video', video_setup);
window.vpa_player.src(video_setup['src']);
break;
case 'youtube':
window['vpa_player'] = videojs('vpa_video', video_setup);
break;
case 'vimeo':
window['vpa_player'] = videojs('vpa_video', video_setup);
break;
default:
break;
}
window['vpa_player'].bigPlayButton.hide();
}
return window['vpa_player'];
}
function is_video_strong_paused() {
return ($('.overlay').is(':visible') || $('.cta').is(':visible'));
}
function get_scaling_prefix() {
var prefixes = 'zoom transform WebkitTransform MozTransform OTransform msTransform'.split(' ');
for (var i = 0; i < prefixes.length; i++) {
if (document.createElement('div').style[prefixes[i]] !== undefined) {
return prefixes[i];
}
}
return false;
}
function supports_h264_baseline_video() {
if (!(!!document.createElement('video').canPlayType)) {
return false;
}
var v = document.createElement("video");
return v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');
}
function adjust_overlay_content() {
var $wrapper = $('.overlay:visible');
var $content = $wrapper.find('.overlay_content');
var wrapper_height = function () {
return $wrapper.height();
};
var content_height = function () {
return $content[0].scrollHeight;
};
var scaling_prefix = get_scaling_prefix();
switch (scaling_prefix) {
case 'zoom':
$content.css(scaling_prefix, '100%');
break;
case 'transform':
case 'WebkitTransform':
case 'MozTransform':
case 'OTransform':
case 'msTransform':
$content.css(scaling_prefix, $content.css(scaling_prefix) + ' scale(1)').css('marginTop', '0');
break;
default:
break;
}
if (content_height() > wrapper_height()) {
var delta_height = content_height() - wrapper_height();
var delta = 200 - content_height() * 100 / wrapper_height();
switch (scaling_prefix) {
case 'zoom':
$content.css(scaling_prefix, delta + '%');
break;
case 'transform':
case 'WebkitTransform':
case 'MozTransform':
case 'OTransform':
case 'msTransform':
$content.css(scaling_prefix, 'scale(' + delta / 100 + ')').css('marginTop', '-' + delta_height / 2 + 'px');
break;
default:
break;
}
}
}
jQuery(document).ready(function () {
//console.log(document.cookie);
if (js_options['video-settings_source'] == 'vimeo') {
get_vpa_player().posterImage.show();
}
//count number of time person loads this page
cookie.set('vpa_visit_count', !!cookie.get('vpa_visit_count') ? +cookie.get('vpa_visit_count') + 1 : 1);
get_vpa_player().ready(function () {
if ($.inArray(js_options['video-settings_poster'], ['none', 'remote']) != -1) {
get_vpa_player().bigPlayButton.show();
}
if (js_options['video-settings_poster'] == 'none' && (js_options['video-behavior_autostart'] == 1
&& !(js_options['video-behavior_resume'] == 1 && getVisitCount() > 1))) {
this.posterImage.hide();
}
this.one('play', function () {
vpa_heartbeat.add({
project_id: project_id,
event_type: 'video_view'
});
});
$(this.el()).bind('contextmenu', function (event) {
event.preventDefault()
});
//below prevents video click to pause, when control bar is hidden
// $(this.el()).bind('mousedown', function () {
// if (get_vpa_player().controlBar.width() <= 0) {
// get_vpa_player().play();
// }
// });
var __flag_val = null;
get_vpa_player().on('timeupdate', function () {
if (typeof this.__stored_times === 'undefined')
this.__stored_times = [];
var ctime = Math.round(this.currentTime());
if (__flag_val === ctime)
return;
else
__flag_val = ctime;
var video_duration = Math.round(this.duration());
if ($.inArray(this.__stored_times, ctime) < 0) {
this.__stored_times.push(ctime);
try {
vpa_heartbeat.add({
project_id: project_id,
event_type: 'video_checkpoint',
video_times: array_unique(getRanges(this.__stored_times.sort())),
video_duration: video_duration
}, 'replace');
} catch (err) {
}
}
//trigger video timeupdate event on sale page
trigger_parent_window_video_timeupdate(ctime);
});
//load video modules
for (var i in ModulesVideoOnly) {
if (typeof js_options[i] !== 'undefined' && js_options[i]) {
ModulesVideoOnly[i].activate();
} else {
ModulesVideoOnly[i].deactivate();
}
}
if (typeof this.controlBar !== 'undefined') {
this.controlBar.fullscreenToggle.hide();
this.controlBar.volumeControl.hide();
this.controlBar.muteToggle.hide();
this.controlBar.hide();
}
});
get_vpa_player().on('firstplay', function() {
//count number views this video
var str_views_count_video = 'views_video_count_' + project_id;
cookie.set(str_views_count_video, !!cookie.get(str_views_count_video) ? +cookie.get(str_views_count_video) + 1 : 1);
get_vpa_player().posterImage.hide();
});
adjust_video_dimensions();
});
function adjust_video_dimensions() {
var $video_holder = $('.video-holder:visible');
if (page_type == 'sales-page') {
get_vpa_player().width($video_holder.width());
get_vpa_player().height($video_holder.height());
} else {
get_vpa_player().width(window.innerWidth);
get_vpa_player().height(window.innerHeight);
}
//$video_holder.css('height', $video_holder.height());
//$video_holder.css('width', $video_holder.width());
}
function trigger_parent_window_video_timeupdate(time) {
try {
if (window.document.getElementById('video-events')) {
window.parent.$('#video-events').trigger('timeupdate', time);
}
} catch (err) {
console.log('video-events not updated: timeupdate');
}
}
function getRanges(array) {
var ranges = [], rstart, rend;
for (var i = 0; i < array.length; i++) {
rstart = array[i];
rend = rstart;
while (array[i + 1] - array[i] == 1) {
rend = array[i + 1]; // increment the index if the numbers sequential
i++;
}
ranges.push(rstart == rend ? rstart + '' : rstart + '-' + rend);
}
return ranges;
}
function getVisitCount() {
return parseInt(cookie.get('vpa_visit_count'), 10) || 0;
}
function getViewsCountVideo() {
return parseInt(cookie.get('views_video_count_' + project_id), 10) || 0;
}
function getOverlayUserSubscribed() {
return cookie.get('overlay_user_subscribed_' + project_id) || false;
}