/** * jwplayerControlbar component of the JW Player. * * @author jeroen * @version 1.0alpha * @lastmodifiedauthor zach * @lastmodifieddate 2010-04-11 */ (function($) { var controlbars = {}; /** Hooking the jwplayerControlbar up to jQuery. **/ $.fn.jwplayerControlbar = function(player, domelement) { controlbars[player.id] = $.extend({}, $.fn.jwplayerControlbar.defaults, player.config.plugins.controlbar); buildElements(player, domelement); buildHandlers(player); }; $.fn.jwplayerControlbar.positions = { BOTTOM: 'BOTTOM', TOP: 'TOP', OVER: 'OVER' }; /** Map with config for the jwplayerControlbar plugin. **/ $.fn.jwplayerControlbar.defaults = { fontsize: 10, fontcolor: '000000', position: $.fn.jwplayerControlbar.positions.BOTTOM, leftmargin: 0, rightmargin: 0, scrubber: 'none' }; /** Draw the jwplayerControlbar elements. **/ function buildElements(player, domelement) { // Draw the background. domelement.parents(":first").append('
'); $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); switch (controlbars[player.id].position) { case $.fn.jwplayerControlbar.positions.TOP: $("#" + player.id + '_jwplayerControlbar').css('top', 0); break; default: $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); domelement.parents(":first").css('height', parseInt(domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); break; } $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); // Draw all elements on top of the bar. buildElement('capLeft', 'left', true, player); buildElement('playButton', 'left', false, player); buildElement('pauseButton', 'left', true, player); buildElement('divider1', 'left', true, player); buildElement('elapsedText', 'left', true, player); buildElement('timeSliderRail', 'left', false, player); buildElement('timeSliderBuffer', 'left', false, player); buildElement('timeSliderProgress', 'left', false, player); buildElement('timeSliderThumb', 'left', false, player); buildElement('capRight', 'right', true, player); // TODO if (false) { buildElement('fullscreenButton', 'right', false, player); buildElement('normalscreenButton', 'right', true, player); buildElement('divider2', 'right', true, player); } if (!$.fn.jwplayerUtils.isiPad()) { buildElement('volumeSliderRail', 'right', false, player); buildElement('volumeSliderProgress', 'right', true, player); buildElement('muteButton', 'right', false, player); buildElement('unmuteButton', 'right', true, player); buildElement('divider3', 'right', true, player); } buildElement('durationText', 'right', true, player); } /** Draw a single element into the jwplayerControlbar. **/ function buildElement(element, align, offset, player) { var nam = player.id + '_' + element; $('#' + player.id + '_jwplayerControlbar').append('
'); $('#' + nam).css('position', 'absolute'); $('#' + nam).css('top', '0px'); if (element.indexOf('Text') > 0) { $('#' + nam).html('00:00'); $('#' + nam).css('font', controlbars[player.id].fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); $('#' + nam).css('text-align', 'center'); $('#' + nam).css('font-weight', 'bold'); $('#' + nam).css('cursor', 'default'); var wid = 14 + 3 * controlbars[player.id].fontsize; $('#' + nam).css('color', '#' + controlbars[player.id].fontcolor.substr(-6)); } else if (element.indexOf('divider') === 0) { $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); var wid = player.skin.controlbar.elements.divider.width; } else { $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); var wid = player.skin.controlbar.elements[element].width; } if (align == 'left') { $('#' + nam).css(align, controlbars[player.id].leftmargin); if (offset) { controlbars[player.id].leftmargin += wid; } } else if (align == 'right') { $('#' + nam).css(align, controlbars[player.id].rightmargin); if (offset) { controlbars[player.id].rightmargin += wid; } } $('#' + nam).css('width', wid); $('#' + nam).css('height', player.skin.controlbar.elements.background.height); } /** Add interactivity to the jwplayerControlbar elements. **/ function buildHandlers(player) { // Register events with the buttons. buildHandler('playButton', 'play', player); buildHandler('pauseButton', 'pause', player); buildHandler('muteButton', 'mute', player, true); buildHandler('unmuteButton', 'mute', player, false); buildHandler('fullscreenButton', 'fullscreen', player, true); buildHandler('normalscreenButton', 'fullscreen', player, false); addSliders(player); // Register events with the player. player.buffer(bufferHandler); player.state(stateHandler); player.time(timeHandler); player.mute(muteHandler); player.volume(volumeHandler); player.complete(completeHandler); // Trigger a few events so the bar looks good on startup. resizeHandler({ id: player.id, fulscreen: player.fullscreen(), width: player.width(), height: player.height() }); timeHandler({ id: player.id, duration: player.duration(), position: 0 }); bufferHandler({ id: player.id, bufferProgress: 0 }); muteHandler({ id: player.id, mute: player.mute() }); stateHandler({ id: player.id, newstate: $.fn.jwplayer.states.IDLE }); volumeHandler({ id: player.id, volume: player.volume() }); } /** Set a single button handler. **/ function buildHandler(element, handler, player, args) { var nam = player.id + '_' + element; $('#' + nam).css('cursor', 'pointer'); if (handler == 'fullscreen') { $('#' + nam).mouseup(function(evt) { evt.stopPropagation(); player.fullscreen(!player.fullscreen()); resizeHandler({ id: player.id, fullscreen: player.fullscreen(), width: player.width(), height: player.height() }); }); } else { $('#' + nam).mouseup(function(evt) { evt.stopPropagation(); if (!$.fn.jwplayerUtils.isNull(args)) { player[handler](args); } else { player[handler](); } }); } } /** Set the volume drag handler. **/ function addSliders(player) { var bar = '#' + player.id + '_jwplayerControlbar'; var trl = '#' + player.id + '_timeSliderRail'; var vrl = '#' + player.id + '_volumeSliderRail'; $(bar).css('cursor', 'pointer'); $(trl).css('cursor', 'pointer'); $(vrl).css('cursor', 'pointer'); $(bar).mousedown(function(evt) { if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { controlbars[player.id].scrubber = 'time'; } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { controlbars[player.id].scrubber = 'volume'; } }); $(bar).mouseup(function(evt) { evt.stopPropagation(); sliderUp(evt.pageX, player); }); $(bar).mousemove(function(evt) { if (controlbars[player.id].scrubber == 'time') { controlbars[player.id].mousedown = true; var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; $('#' + player.id + '_timeSliderThumb').css('left', xps); } }); } /** The slider has been moved up. **/ function sliderUp(msx, player) { controlbars[player.id].mousedown = false; if (controlbars[player.id].scrubber == 'time') { var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; var wid = $('#' + player.id + '_timeSliderRail').width(); var pos = xps / wid * controlbars[player.id].currentDuration; if (pos < 0) { pos = 0; } else if (pos > controlbars[player.id].currentDuration) { pos = controlbars[player.id].currentDuration - 3; } player.seek(pos); if (player.model.state != $.fn.jwplayer.states.PLAYING) { player.play(); } } else if (controlbars[player.id].scrubber == 'volume') { var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; var wid = $('#' + player.id + '_volumeSliderRail').width(); var pct = Math.round(xps / wid * 100); if (pct < 0) { pct = 0; } else if (pct > 100) { pct = 100; } if (player.model.mute) { player.mute(false); } player.volume(pct); } controlbars[player.id].scrubber = 'none'; } /** Update the buffer percentage. **/ function bufferHandler(event) { if (!$.fn.jwplayerUtils.isNull(event.bufferPercent)) { controlbars[event.id].currentBuffer = event.bufferPercent; } var wid = $('#' + event.id + '_timeSliderRail').width(); var bufferWidth = isNaN(Math.round(wid * controlbars[event.id].currentBuffer / 100)) ? 0 : Math.round(wid * controlbars[event.id].currentBuffer / 100); $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); } /** Update the mute state. **/ function muteHandler(event) { if (event.mute) { $('#' + event.id + '_muteButton').css('display', 'none'); $('#' + event.id + '_unmuteButton').css('display', 'block'); $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); } else { $('#' + event.id + '_muteButton').css('display', 'block'); $('#' + event.id + '_unmuteButton').css('display', 'none'); $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); } } /** Update the playback state. **/ function stateHandler(event) { // Handle the play / pause button if (event.newstate == $.fn.jwplayer.states.BUFFERING || event.newstate == $.fn.jwplayer.states.PLAYING) { $('#' + event.id + '_pauseButton').css('display', 'block'); $('#' + event.id + '_playButton').css('display', 'none'); } else { $('#' + event.id + '_pauseButton').css('display', 'none'); $('#' + event.id + '_playButton').css('display', 'block'); } // Show / hide progress bar if (event.newstate == $.fn.jwplayer.states.IDLE) { $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); $('#' + event.id + '_timeSliderProgress').css('display', 'none'); $('#' + event.id + '_timeSliderThumb').css('display', 'none'); } else { $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); if (event.newstate != $.fn.jwplayer.states.BUFFERING) { $('#' + event.id + '_timeSliderProgress').css('display', 'block'); $('#' + event.id + '_timeSliderThumb').css('display', 'block'); } } } /** Handles event completion **/ function completeHandler(event) { timeHandler($.extend(event, { position: 0, duration: controlbars[event.id].currentDuration })); } /** Update the playback time. **/ function timeHandler(event) { if (!$.fn.jwplayerUtils.isNull(event.position)) { controlbars[event.id].currentPosition = event.position; } if (!$.fn.jwplayerUtils.isNull(event.duration)) { controlbars[event.id].currentDuration = event.duration; } var progress = (controlbars[event.id].currentPosition === controlbars[event.id].currentDuration === 0) ? 0 : controlbars[event.id].currentPosition / controlbars[event.id].currentDuration; var railWidth = $('#' + event.id + '_timeSliderRail').width(); var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); var railLeft = $('#' + event.id + '_timeSliderRail').position().left; var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); var thumbPosition = railLeft + progressWidth; $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); if (!controlbars[event.id].mousedown) { $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); } $('#' + event.id + '_durationText').html(timeFormat(controlbars[event.id].currentDuration)); $('#' + event.id + '_elapsedText').html(timeFormat(controlbars[event.id].currentPosition)); } /** Format the elapsed / remaining text. **/ function timeFormat(sec) { str = '00:00'; if (sec > 0) { str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); } return str; } /** Flip the player size to/from full-browser-screen. **/ function resizeHandler(event) { controlbars[event.id].width = event.width; controlbars[event.id].fullscreen = event.fullscreen; if (event.fullscreen) { $('#' + event.id + '_normalscreenButton').css('display', 'block'); $('#' + event.id + '_fullscreenButton').css('display', 'none'); // TODO if (false) { $(window).resize(function() { resizeBar(player); }); } } else { $('#' + event.id + '_normalscreenButton').css('display', 'none'); $('#' + event.id + '_fullscreenButton').css('display', 'block'); // TODO if (false) { $(window).resize(null); } } resizeBar(event); timeHandler(event); bufferHandler(event); } /** Resize the jwplayerControlbar. **/ function resizeBar(event) { var lft = controlbars[event.id].left; var top = controlbars[event.id].top; var wid = controlbars[event.id].width; var hei = $('#' + event.id + '_jwplayerControlbar').height(); if (controlbars[event.id].position == 'over') { lft += 1 * controlbars[event.id].margin; top -= 1 * controlbars[event.id].margin + hei; wid -= 2 * controlbars[event.id].margin; } if (controlbars[event.id].fullscreen) { lft = controlbars[event.id].margin; top = $(window).height() - controlbars[event.id].margin - hei; wid = $(window).width() - 2 * controlbars[event.id].margin; $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); } else { $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); } $('#' + event.id + '_jwplayerControlbar').css('left', lft); $('#' + event.id + '_jwplayerControlbar').css('top', top); $('#' + event.id + '_jwplayerControlbar').css('width', wid); $('#' + event.id + '_timeSliderRail').css('width', (wid - controlbars[event.id].leftmargin - controlbars[event.id].rightmargin)); } /** Update the volume level. **/ function volumeHandler(event) { var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; var railWidth = $('#' + event.id + '_volumeSliderRail').width(); var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); } })(jQuery); /** * JW Player controller component * * @author zach * @version 1.0alpha * @lastmodifieddate 2010-04-11 */ (function($) { var mediaParams = function() { return { volume: 100, fullscreen: false, mute: false, width: 480, height: 320, duration: 0, source: 0, sources: [], buffer: 0, position: 0, state: $.fn.jwplayer.states.IDLE }; }; $.fn.jwplayerController = function(player) { return { play: play(player), pause: pause(player), seek: seek(player), stop: stop(player), volume: volume(player), mute: mute(player), resize: resize(player), fullscreen: fullscreen(player), load: load(player), mediaInfo: mediaInfo(player), addEventListener: addEventListener(player), removeEventListener: removeEventListener(player), sendEvent: sendEvent(player) }; }; function play(player) { return function() { try { switch (player.model.state) { case $.fn.jwplayer.states.IDLE: player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, player.media.play); player.media.load(player.model.sources[player.model.source].file); break; case $.fn.jwplayer.states.PAUSED: player.media.play(); break; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Switch the pause state of the player. **/ function pause(player) { return function() { try { switch (player.model.state) { case $.fn.jwplayer.states.PLAYING: case $.fn.jwplayer.states.BUFFERING: player.media.pause(); break; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Seek to a position in the video. **/ function seek(player) { return function(position) { try { switch (player.model.state) { case $.fn.jwplayer.states.PLAYING: case $.fn.jwplayer.states.PAUSED: case $.fn.jwplayer.states.BUFFERING: player.media.seek(position); break; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Stop playback and loading of the video. **/ function stop(player) { return function() { try { player.media.stop(); return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Get / set the video's volume level. **/ function volume(player) { return function(arg) { try { switch ($.fn.jwplayerUtils.typeOf(arg)) { case "function": player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); break; case "number": player.media.volume(arg); return true; case "string": player.media.volume(parseInt(arg, 10)); return true; default: return player.model.volume; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Get / set the mute state of the player. **/ function mute(player) { return function(arg) { try { switch ($.fn.jwplayerUtils.typeOf(arg)) { case "function": player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); break; case "boolean": player.media.mute(arg); break; default: return player.model.mute; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Resizes the video **/ function resize(player) { return function(arg1, arg2) { try { switch ($.fn.jwplayerUtils.typeOf(arg1)) { case "function": player.addEventListener($.fn.jwplayer.events.JWPLAYER_RESIZE, arg1); break; case "number": player.media.resize(arg1, arg2); break; case "string": player.media.resize(arg1, arg2); break; default: break; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Jumping the player to/from fullscreen. **/ function fullscreen(player) { return function(arg) { try { switch ($.fn.jwplayerUtils.typeOf(arg)) { case "function": player.addEventListener($.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); break; case "boolean": player.media.fullscreen(arg); break; default: return player.model.fullscreen; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Loads a new video **/ function load(player) { return function(arg) { try { switch ($.fn.jwplayerUtils.typeOf(arg)) { case "function": player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); break; default: player.media.load(arg); break; } return $.jwplayer(player.id); } catch (err) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); } return false; }; } /** Returns the meta **/ function mediaInfo(player) { return function() { try { var result = {}; for (var mediaParam in mediaParams()) { result[mediaParam] = player.model[mediaParam]; } return result; } catch (err) { $.fn.jwplayerUtils.log("error", err); } return false; }; } /** Add an event listener. **/ function addEventListener(player) { return function(type, listener, count) { try { if (player.listeners[type] === undefined) { player.listeners[type] = []; } player.listeners[type].push({ listener: listener, count: count }); } catch (err) { $.fn.jwplayerUtils.log("error", err); } return false; }; } /** Remove an event listener. **/ function removeEventListener(player) { return function(type, listener) { try { for (var lisenterIndex in player.listeners[type]) { if (player.listeners[type][lisenterIndex] == listener) { player.listeners[type].slice(lisenterIndex, lisenterIndex + 1); break; } } } catch (err) { $.fn.jwplayerUtils.log("error", err); } return false; }; } /** Send an event **/ function sendEvent(player) { return function(type, data) { data = $.extend({ id: player.id, version: player.version }, data); if ((player.config.debug !== undefined) && (player.config.debug.toString().toLowerCase() == 'console')) { $.fn.jwplayerUtils.log(type, data); } for (var listenerIndex in player.listeners[type]) { try { player.listeners[type][listenerIndex].listener(data); } catch (err) { $.fn.jwplayerUtils.log("There was an error while handling a listener", err); } if (player.listeners[type][listenerIndex].count === 1) { delete player.listeners[type][listenerIndex]; } else if (player.listeners[type][listenerIndex].count > 0) { player.listeners[type][listenerIndex].count = player.listeners[type][listenerIndex].count - 1; } } }; } })(jQuery); /** * Core component of the JW Player (initialization, API). * * @author jeroen * @version 1.0alpha * @lastmodifiedauthor zach * @lastmodifieddate 2010-04-11 */ (function($) { /** Map with all players on the page. **/ var players = {}; /** Hooking the controlbar up to jQuery. **/ $.fn.jwplayer = function(options) { return this.each(function() { $.fn.jwplayerUtils.log("Starting setup", this); return setupJWPlayer($(this), 0, options); }); }; function setupJWPlayer(player, step, options) { try { switch (step) { case 0: var model = $.fn.jwplayerModel(player, options); var jwplayer = { model: model, listeners: {} }; return setupJWPlayer(jwplayer, step + 1); case 1: player.controller = $.fn.jwplayerController(player); players[player.model.config.id] = player; setupJWPlayer($.extend(player, api(player)), step + 1); return player; case 2: $.fn.jwplayerSkinner(player, function() { setupJWPlayer(player, step + 1); }); break; case 3: $.fn.jwplayerView(player); setupJWPlayer(player, step + 1); break; case 4: $.fn.jwplayerModel.setActiveMediaProvider(player); if ((player.media === undefined) || !player.media.hasChrome) { setupJWPlayer(player, step + 1); } break; case 5: $.fn.jwplayerDisplay($.jwplayer(player.id), player.model.domelement); if (player.media === undefined) { player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); } else { setupJWPlayer(player, step + 1); } break; case 6: if (!$.fn.jwplayerUtils.isiPhone()) { $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); } setupJWPlayer(player, step + 1); break; case 7: player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); setupJWPlayer(player, step + 1); break; default: if (player.config.autostart === true) { player.play(); } break; } } catch (err) { $.fn.jwplayerUtils.log("Setup failed at step " + step, err); } } /** Map with config for the controlbar plugin. **/ $.fn.jwplayer.defaults = { autostart: false, file: undefined, height: 295, image: undefined, skin: undefined, volume: 90, width: 480, mute: false, bufferlength: 5, start: 0, position: 0, debug: undefined, flashplayer: undefined, repeat: false }; /** A factory for API calls that either set listeners or return data **/ function dataListenerFactory(player, dataType, eventType) { return function(arg) { switch ($.fn.jwplayerUtils.typeOf(arg)) { case "function": if (!$.fn.jwplayerUtils.isNull(eventType)) { player.addEventListener(eventType, arg); } break; default: if (!$.fn.jwplayerUtils.isNull(dataType)) { return player.controller.mediaInfo()[dataType]; } return player.controller.mediaInfo(); } return $.jwplayer(player.id); }; } function api(player) { if (!$.fn.jwplayerUtils.isNull(player.id)) { return player; } return { play: player.controller.play, pause: player.controller.pause, stop: player.controller.stop, seek: player.controller.seek, resize: player.controller.resize, fullscreen: player.controller.fullscreen, volume: player.controller.volume, mute: player.controller.mute, load: player.controller.load, addEventListener: player.controller.addEventListener, removeEventListener: player.controller.removeEventListener, sendEvent: player.controller.sendEvent, ready: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_READY), error: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_ERROR), complete: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE), state: dataListenerFactory(player, 'state', $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE), buffer: dataListenerFactory(player, 'buffer', $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER), time: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME), position: dataListenerFactory(player, 'position'), duration: dataListenerFactory(player, 'duration'), width: dataListenerFactory(player, 'width'), height: dataListenerFactory(player, 'height'), meta: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_META), id: player.model.config.id, config: player.model.config, version: '0.1-alpha', skin: player.skin }; } function jwplayer(selector) { if ($.fn.jwplayerUtils.isNull(selector)) { for (var player in players) { return api(players[player]); } } else { if (selector.indexOf('#') === 0) { selector = selector.substr(1, selector.length); } return api(players[selector]); } return null; } $.fn.jwplayer.states = { IDLE: 'IDLE', BUFFERING: 'BUFFERING', PLAYING: 'PLAYING', PAUSED: 'PAUSED' }; $.fn.jwplayer.events = { JWPLAYER_READY: 'jwplayerReady', JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', JWPLAYER_RESIZE: 'jwplayerResize', //JWPLAYER_LOCKED: 'jwplayerLocked', //JWPLAYER_UNLOCKED: 'jwplayerLocked', JWPLAYER_ERROR: 'jwplayerError', JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', JWPLAYER_MEDIA_COMPLETE: 'jwplayerMediaComplete', JWPLAYER_MEDIA_TIME: 'jwplayerMediaTime', JWPLAYER_MEDIA_VOLUME: 'jwplayerMediaVolume', JWPLAYER_MEDIA_META: 'jwplayerMediaMeta', JWPLAYER_MEDIA_MUTE: 'jwplayerMediaMute', JWPLAYER_PLAYER_STATE: 'jwplayerPlayerState' }; /** Extending jQuery **/ $.extend({ 'jwplayer': jwplayer }); /** Automatically initializes the player for all