diff options
Diffstat (limited to 'chimere/static/jme/plugins/poster.js')
| -rw-r--r-- | chimere/static/jme/plugins/poster.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/chimere/static/jme/plugins/poster.js b/chimere/static/jme/plugins/poster.js new file mode 100644 index 0000000..a4c038c --- /dev/null +++ b/chimere/static/jme/plugins/poster.js @@ -0,0 +1,145 @@ +/** + * Simple Poster Plugin for jme + * @author Matt Dertinger + * @version 1.0.0 + * + * http://protofunc.com/jme + * http://github.com/aFarkas/jMediaelement + * + * @description + * + * HTML: + * + * <video class="player" preload="none" poster="../media/big-buck-bunny-trailer.png" controls="controls"> + * ... + * </video> + * + * OR + * + * <div class="fallback"> + * <img class="photo" src="../media/big-buck-bunny-trailer.png" alt="" data-enabled="enabled" /> + * ... + * </div> + * + * API: + * + * $('video, audio').setPosterAttribute() + * + * $('video, audio').enablePoster(index|object) + * + * $('video, audio').disablePoster(index|object) + * + * Config: + * + * Documentation: + * + */ +(function($){ + //enable posters + $(document).bind('jmeEmbed', function(e, data){ + data = data.data; + var mm = $(e.target); + mm.setPosterAttribute(); + if ($.attr(e.target, 'poster')) { + data.posterDisplay = $('<img />', { + src : $.attr(e.target, 'poster'), + "class": "poster-display inactive-poster-display", + alt : "" + }).insertAfter(e.target); + if( data.posterDisplay ){ + mm.enablePoster(data.posterDisplay, data); + } + //add fullwindow support + if(data.posterDisplay.videoOverlay && mm.is('video')){ + data.posterDisplay + .videoOverlay({ + fullscreenClass: 'poster-in-fullscreen', + video: mm, + startCSS: { + width: 'auto', + zIndex: 99999 + }, + position: { + bottom: 0, + left: 0, + right: 0 + } + }) + ; + } + mm + .bind('play', function(){ + mm.disablePoster(data.posterDisplay, data); + }) + .bind('ended', function(){ + mm.enablePoster(data.posterDisplay, data); + //worarkound: + mm.pause(); + }) + ; + } + }); + + /* + * extend jme api + */ + $.multimediaSupport.fn._extend({ + positionPoster: function(object, _data){ + object = (isFinite(object)) ? posters.filter(':eq('+ object +')') : $(object); + if( !_data ){ + _data = $.data(this.element, 'mediaElemSupport'); + } + // Only if the poster is visible + if (!_data.posterDisplay || _data.posterDisplay.is(":hidden")) { return; } + _data.posterDisplay.height($(this.element).height() + "px"); // Need incase controlsBelow + _data.posterDisplay.width($(this.element).width() + "px"); // Could probably do 100% of box + }, + disablePoster: function(object, _data){ + object = (isFinite(object)) ? posters.filter(':eq('+ object +')') : $(object); + if( !_data ){ + _data = $.data(this.element, 'mediaElemSupport'); + } + object.removeAttr('data-enabled'); + _data.posterDisplay.addClass('inactive-poster-display').fadeOut('slow'); + }, + enablePoster: function(object, _data){ + var posters = $('img.poster-display', this.element), + that = this, + mm = $(this.element), + posterData, + found + ; + + if( !_data ){ + _data = mm.data('mediaElemSupport'); + } + object = (isFinite(object)) ? posters.filter(':eq('+ object +')') : $(object); + posters + .filter('[data-enabled]') + .each(function(){ + if(this !== object[0]){ + that.disablePoster(this, _data); + } + }) + ; + if (!object[0]) { return; } + + posterData = $.data(object[0], 'jmePoster') || $.data(object[0], 'jmePoster', {load: false}); + posterData.posterDisplay = _data.posterDisplay; + posterData.posterDisplay.removeClass('inactive-poster-display').fadeIn("slow"); + // We may not need this. But if we do, we should make it respect config. + /* if (this.options.fit) { + that.positionPoster(this, _data); + } */ + object.attr('data-enabled', 'enabled'); + + }, + setPosterAttribute: function() { + if (!$.attr(this.element, 'poster')) { + var image = $('img.photo[data-enabled]', this.element).first(); + if (image) { $.attr(this.element, 'poster', image.attr('src')); } + } + } + }, true); + +})(jQuery); |
