Team:NTU Taiwan/javascript/jquery.videoBG.js
From 2013.igem.org
/**
* @preserve Copyright 2011 Syd Lawrence ( www.sydlawrence.com ). * Version: 0.2 * * Licensed under MIT and GPLv2. * * Usage: $('body').videoBG(options); * */
(function( $ ){
$.fn.videoBG = function( selector, options ) {
var options = {}; if (typeof selector == "object") { options = $.extend({}, $.fn.videoBG.defaults, selector); } else if (!selector) { options = $.fn.videoBG.defaults; } else { return $(selector).videoBG(options); }
var container = $(this);
// check if elements available otherwise it will cause issues if (!container.length) return;
// container to be at least relative if (container.css('position') == 'static' || !container.css('position')) container.css('position','relative');
// we need a width if (options.width == 0) options.width = container.width();
// we need a height if (options.height == 0) options.height = container.height();
// get the wrapper var wrap = $.fn.videoBG.wrapper(); wrap.height(options.height) .width(options.width);
// if is a text replacement if (options.textReplacement) {
// force sizes options.scale = true;
// set sizes and forcing text out container.width(options.width) .height(options.height) .css('text-indent','-9999px'); } else {
// set the wrapper above the video wrap.css('z-index',options.zIndex+1); }
// move the contents into the wrapper wrap.html(container.clone(true));
// get the video var video = $.fn.videoBG.video(options);
// if we are forcing width / height if (options.scale) {
// overlay wrapper wrap.height(options.height) .width(options.width);
// video video.height(options.height) .width(options.width); }
// add it all to the container container.html(wrap); container.append(video);
return video.find("video")[0]; }
// set to fullscreen $.fn.videoBG.setFullscreen = function($el) { var windowWidth = $(window).width(), windowHeight = $(window).height();
$el.css('min-height',0).css('min-width',0); $el.parent().width(windowWidth).height(windowHeight); // if by width if (windowWidth / windowHeight > $el.aspectRatio) { $el.width(windowWidth).height('auto'); // shift the element up var height = $el.height(); var shift = (height - windowHeight) / 2; if (shift < 0) shift = 0; $el.css("top",-shift); } else { $el.width('auto').height(windowHeight); // shift the element left var width = $el.width(); var shift = (width - windowWidth) / 2; if (shift < 0) shift = 0; $el.css("left",-shift);
// this is a hack mainly due to the iphone if (shift === 0) { var t = setTimeout(function() { $.fn.videoBG.setFullscreen($el); },500); } }
$('body > .videoBG_wrapper').width(windowWidth).height(windowHeight);
}
// get the formatted video element $.fn.videoBG.video = function(options) {
$('html, body').scrollTop(-1);
// video container var $div = $('<div/>'); $div.addClass('videoBG') .css('position',options.position) .css('z-index',options.zIndex) .css('top',0) .css('left',0) .css('height',options.height) .css('width',options.width) .css('opacity',options.opacity) .css('overflow','hidden');
// video element var $video = $('<video/>'); $video.css('position','absolute') .css('z-index',options.zIndex) .attr('poster',options.poster) .css('top',0) .css('left',0) .css('min-width','100%') .css('min-height','100%');
if (options.autoplay) { $video.attr('autoplay',options.autoplay); }
// if fullscreen if (options.fullscreen) { $video.bind('canplay',function() { // set the aspect ratio $video.aspectRatio = $video.width() / $video.height(); $.fn.videoBG.setFullscreen($video); })
// listen out for screenresize var resizeTimeout; $(window).resize(function() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { $.fn.videoBG.setFullscreen($video); },100); }); $.fn.videoBG.setFullscreen($video); }
// video standard element
var v = $video[0];
// if meant to loop if (options.loop) { loops_left = options.loop;
// cant use the loop attribute as firefox doesnt support it $video.bind('ended', function(){
// if we have some loops to throw if (loops_left) // replay that bad boy v.play();
// if not forever if (loops_left !== true) // one less loop loops_left--;
});
}
// when can play, play $video.bind('canplay', function(){
if (options.autoplay) // replay that bad boy v.play();
});
// if supports video
if ($.fn.videoBG.supportsVideo()) {
// supports webm if ($.fn.videoBG.supportType('webm')){
// play webm $video.attr('src',options.webm); } // supports mp4 else if ($.fn.videoBG.supportType('mp4')) {
// play mp4 $video.attr('src',options.mp4);
// $video.html('<source src="'.options.mp4.'" />');
} // throw ogv at it then else {
// play ogv $video.attr('src',options.ogv); }
}
// image for those that dont support the video var $img = $('<img/>'); $img.attr('src',options.poster) .css('position','absolute') .css('z-index',options.zIndex) .css('top',0) .css('left',0) .css('min-width','100%') .css('min-height','100%');
// add the image to the video // if suuports video if ($.fn.videoBG.supportsVideo()) { // add the video to the wrapper $div.html($video); }
// nope - whoa old skool else {
// add the image instead $div.html($img); }
// if text replacement if (options.textReplacement) {
// force the heights and widths $div.css('min-height',1).css('min-width',1); $video.css('min-height',1).css('min-width',1); $img.css('min-height',1).css('min-width',1);
$div.height(options.height).width(options.width); $video.height(options.height).width(options.width); $img.height(options.height).width(options.width); }
if ($.fn.videoBG.supportsVideo()) { v.play(); } return $div; }
// check if suuports video $.fn.videoBG.supportsVideo = function() { return (document.createElement('video').canPlayType); }
// check which type is supported $.fn.videoBG.supportType = function(str) {
// if not at all supported if (!$.fn.videoBG.supportsVideo()) return false;
// create video var v = document.createElement('video');
// check which? switch (str) { case 'webm' : return (v.canPlayType('video/webm; codecs="vp8, vorbis"')); break; case 'mp4' : return (v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')); break; case 'ogv' : return (v.canPlayType('video/ogg; codecs="theora, vorbis"')); break; } // nope return false; }
// get the overlay wrapper $.fn.videoBG.wrapper = function() { var $wrap = $('<div/>'); $wrap.addClass('videoBG_wrapper') .css('position','absolute') .css('top',0) .css('left',0); return $wrap; }
// these are the defaults $.fn.videoBG.defaults = { mp4:, ogv:, webm:, poster:, autoplay:true, loop:true, scale:false, position:"absolute", opacity:1, textReplacement:false, zIndex:0, width:0, height:0, fullscreen:false, imgFallback:true }
})( jQuery );