You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							148 lines
						
					
					
						
							5.9 KiB
						
					
					
				| /* 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 | |
|         var 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 tag = document.createElement('script'); | |
|     tag.src = "//www.youtube.com/iframe_api"; | |
|     var firstScriptTag = document.getElementsByTagName('script')[0]; | |
|     firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); | |
| 
 | |
|     // create plugin | |
|  | |
|     $.fn.tubular = function (options) { | |
|         return this.each(function () { | |
|             if (!$.data(this, 'tubular_instantiated')) { // let's only run one | |
|                 $.data(this, 'tubular_instantiated',  | |
|                 tubular(this, options)); | |
|             } | |
|         }); | |
|     } | |
| 
 | |
| })(jQuery, window); |