Changeset 1278
- Timestamp:
- 09/16/10 03:02:08 (3 years ago)
- Location:
- trunk/html5
- Files:
-
- 4 deleted
- 12 edited
- 11 copied
-
build/build.xml (modified) (2 diffs)
-
jwplayer.html5.js (deleted)
-
jwplayer.html5.min.js (copied) (copied from branches/html5/jwplayer.html5.min.js)
-
jwplayer.html5.xml (modified) (1 diff)
-
src/html5/jwplayer.html5.api.js (modified) (1 diff)
-
src/html5/jwplayer.html5.controlbar.js (modified) (1 diff)
-
src/html5/jwplayer.html5.controller.js (modified) (1 diff)
-
src/html5/jwplayer.html5.defaultskin.js (modified) (1 diff)
-
src/html5/jwplayer.html5.display.js (modified) (1 diff)
-
src/html5/jwplayer.html5.eventdispatcher.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.eventdispatcher.js)
-
src/html5/jwplayer.html5.events.js (deleted)
-
src/html5/jwplayer.html5.extensionmap.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.extensionmap.js)
-
src/html5/jwplayer.html5.js (modified) (1 diff)
-
src/html5/jwplayer.html5.logo.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.logo.js)
-
src/html5/jwplayer.html5.mediavideo.js (modified) (1 diff)
-
src/html5/jwplayer.html5.model.js (modified) (1 diff)
-
src/html5/jwplayer.html5.playlist.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.playlist.js)
-
src/html5/jwplayer.html5.playlistitem.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.playlistitem.js)
-
src/html5/jwplayer.html5.playlistitemlevel.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.playlistitemlevel.js)
-
src/html5/jwplayer.html5.skin.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.skin.js)
-
src/html5/jwplayer.html5.skinloader.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.skinloader.js)
-
src/html5/jwplayer.html5.skinner.js (deleted)
-
src/html5/jwplayer.html5.states.js (deleted)
-
src/html5/jwplayer.html5.utils.animations.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.utils.animations.js)
-
src/html5/jwplayer.html5.utils.js (modified) (4 diffs)
-
src/html5/jwplayer.html5.utils.typechecker.js (copied) (copied from branches/html5/src/html5/jwplayer.html5.utils.typechecker.js)
-
src/html5/jwplayer.html5.view.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/html5/build/build.xml
r1277 r1278 8 8 9 9 <target name="concat" depends="clean"> 10 <concat destfile="${basedir}/ jwplayer.html5.js">10 <concat destfile="${basedir}/bin-debug/jwplayer.html5.js"> 11 11 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.js" /> 12 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.utils.js" /> 12 13 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.states.js" /> 13 14 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.events.js" /> 14 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.*.js" excludes="jwplayer.html5.js,jwplayer.html5.states.js,jwplayer.html5.events.js" /> 15 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.view.js" /> 16 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.*.js" excludes="jwplayer.html5.js,jwplayer.html5.states.js,jwplayer.html5.events.js,jwplayer.html5.utils.js,jwplayer.html5.api.js,jwplayer.html5.view.js" /> 17 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.api.js" /> 15 18 </concat> 16 19 </target> … … 20 23 </target> 21 24 22 <target name="build-release" depends=" concat">25 <target name="build-release" depends="build-debug"> 23 26 <java jar="${basedir}/build/yuicompressor-2.4.2.jar" fork="true"> 24 <arg line="'${basedir}/ jwplayer.html5.js'"/>27 <arg line="'${basedir}/bin-debug/jwplayer.html5.js'"/> 25 28 <arg line="-o '${basedir}/jwplayer.html5.min.js'"/> 26 29 </java> 27 30 </target> 28 31 29 <target name="build-zip" depends=" concat">32 <target name="build-zip" depends="build-release"> 30 33 <zip destfile="${basedir}/mediaplayer-html5.zip"> 31 34 <fileset dir="." includes="license.txt"/> -
trunk/html5/jwplayer.html5.xml
r1277 r1278 24 24 <description>location of the poster image; shown before the video starts and after it has completed.</description> 25 25 </flashvar> 26 <flashvar type="field"> 27 <name>start</name> 28 <default>0</default> 29 <description>position in seconds where playback has to start. Won't work for regular (progressive) videos, but only for streaming (HTTP/RTMP).</description> 30 </flashvar> 26 31 </flashvars> 27 32 -
trunk/html5/src/html5/jwplayer.html5.api.js
r1277 r1278 7 7 (function(jwplayer) { 8 8 9 jwplayer.html5._api = function(player) { 10 return { 11 play: player._controller.play, 12 pause: player._controller.pause, 13 stop: player._controller.stop, 14 seek: player._controller.seek, 15 16 resize: player._controller.resize, 17 //fullscreen: player._controller.fullscreen, 18 //volume: player._controller.volume, 19 //mute: player._controller.mute, 20 load: player._controller.load, 21 22 addEventListener: player._controller.addEventListener, 23 removeEventListener: player._controller.removeEventListener, 24 sendEvent: player._controller.sendEvent, 25 26 //ready: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_READY), 27 //error: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_ERROR), 28 //complete: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE), 29 //state: _dataListenerFactory(player, 'state', jwplayer.html5.events.JWPLAYER_PLAYER_STATE), 30 //buffer: _dataListenerFactory(player, 'buffer', jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER), 31 //time: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_TIME), 32 //meta: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_META) 33 34 getPosition: _dataListenerFactory(player, 'position'), 35 getDuration: _dataListenerFactory(player, 'duration'), 36 getBuffer: _dataListenerFactory(player, 'buffer'), 37 getWidth: _dataListenerFactory(player, 'width'), 38 getHeight: _dataListenerFactory(player, 'height'), 39 getFullscreen: _dataListenerFactory(player, 'buffer'), 40 setFullscreen: player._controller.fullscreen, 41 getVolume: _dataListenerFactory(player, 'volume'), 42 setVolume: player._controller.volume, 43 getMute: _dataListenerFactory(player, 'mute'), 44 setMute: player._controller.mute, 45 46 getState: function(){ 47 return player._media.getState(); 48 }, 49 50 getConfig: function(){ 51 return player._model.config; 52 }, 53 getVersion: function() { 54 return player.version; 55 }, 56 getPlaylist: function() { 57 return player._model.playlist; 58 }, 59 playlistItem: function(item) { 60 return player._controller.item(item); 61 }, 62 playlistNext: function() { 63 return player._controller.next(); 64 }, 65 playlistPrev: function() { 66 return player._controller.prev(); 67 }, 68 69 //UNIMPLEMENTED 70 getLevel: function() { 71 }, 72 getBandwidth: function() { 73 }, 74 getLockState: function() { 75 }, 76 lock: function() { 77 }, 78 unlock: function() { 79 } 80 9 jwplayer.html5.api = function(container, options) { 10 var _api = {}; 11 var _container = document.createElement('div'); 12 container.parentNode.replaceChild(_container, container); 13 _container.id = container.id; 14 15 var _model = new jwplayer.html5.model(_api, _container, options); 16 var _view = new jwplayer.html5.view(_api, _container, _model); 17 var _controller = new jwplayer.html5.controller(_api, _container, _model, _view); 18 19 _api.version = "1.0"; 20 _api.id = _container.id; 21 _api.skin = new jwplayer.html5.skin(); 22 23 _api.jwPlay = _controller.play; 24 _api.jwPause = _controller.pause; 25 _api.jwStop = _controller.stop; 26 _api.jwSeek = _controller.seek; 27 _api.jwPlaylistItem = _controller.item; 28 _api.jwPlaylistNext = _controller.next; 29 _api.jwPlaylistPrev = _controller.prev; 30 _api.jwResize = _controller.resize; 31 _api.jwLoad = _controller.load; 32 33 function _statevarFactory(statevar) { 34 return function() { 35 return _model[statevar]; 36 }; 37 } 38 39 _api.jwGetItem = _statevarFactory('item'); 40 _api.jwGetPosition = _statevarFactory('position'); 41 _api.jwGetDuration = _statevarFactory('duration'); 42 _api.jwGetBuffer = _statevarFactory('buffer'); 43 _api.jwGetWidth = _statevarFactory('width'); 44 _api.jwGetHeight = _statevarFactory('height'); 45 _api.jwGetFullscreen = _statevarFactory('fullscreen'); 46 _api.jwSetFullscreen = _controller.setFullscreen; 47 _api.jwGetVolume = _statevarFactory('volume'); 48 _api.jwSetVolume = _controller.setVolume; 49 _api.jwGetMute = _statevarFactory('mute'); 50 _api.jwSetMute = _controller.setMute; 51 52 _api.jwGetState = _statevarFactory('state'); 53 _api.jwGetVersion = function() { 54 return _api.version; 81 55 }; 56 _api.jwGetPlaylist = function() { 57 return _model.playlist; 58 }; 59 60 _api.jwAddEventListener = _controller.addEventListener; 61 _api.jwRemoveEventListener = _controller.removeEventListener; 62 _api.jwSendEvent = _controller.sendEvent; 63 64 //UNIMPLEMENTED 65 _api.jwGetLevel = function() { 66 }; 67 _api.jwGetBandwidth = function() { 68 }; 69 _api.jwGetLockState = function() { 70 }; 71 _api.jwLock = function() { 72 }; 73 _api.jwUnlock = function() { 74 }; 75 76 function _finishLoad(model, view, controller) { 77 return function() { 78 model.loadPlaylist(model.config, false); 79 model.setupPlugins(); 80 view.setup(model.getMedia().getDisplayElement()); 81 var evt = { 82 id: _api.id, 83 version: _api.version 84 }; 85 controller.sendEvent(jwplayer.api.events.JWPLAYER_READY, evt); 86 if (playerReady !== undefined) { 87 playerReady(evt); 88 } 89 90 if (window[model.config.playerReady] !== undefined) { 91 window[model.config.playerReady](evt); 92 } 93 94 model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 95 model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 96 "item": model.config.item 97 }); 98 99 if (model.config.autostart === true && !model.config.chromeless) { 100 controller.play(); 101 } 102 }; 103 } 104 105 _api.skin.load(_model.config.skin, _finishLoad(_model, _view, _controller)); 106 107 return _api; 82 108 }; 83 109 84 function _dataListenerFactory(player, dataType, eventType) {85 return function(arg) {86 switch (jwplayer.html5.utils.typeOf(arg)) {87 case "function":88 if (!jwplayer.html5.utils.isNull(eventType)) {89 player.addEventListener(eventType, arg);90 }91 break;92 default:93 if (!jwplayer.html5.utils.isNull(dataType)) {94 return player._controller.mediaInfo()[dataType];95 }96 return player._controller.mediaInfo();97 }98 return player;99 };100 }101 102 110 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.controlbar.js
r1277 r1278 6 6 */ 7 7 (function(jwplayer) { 8 var _positions = { 9 BOTTOM: 'BOTTOM', 10 TOP: 'TOP', 11 OVER: 'OVER' 8 /** Map with config for the jwplayerControlbar plugin. **/ 9 var _defaults = { 10 backgroundcolor: "000000", 11 margin: 10, 12 //font: "_sans", 13 font: "Arial,sans-serif", 14 fontsize: 10, 15 fontcolor: "000000", 16 fontstyle: "normal", 17 //fontweight: "normal", 18 fontweight: "bold", 19 buttoncolor: "ffffff", 20 position: jwplayer.html5.view.positions.BOTTOM, 21 idlehide: false, 22 layout: { 23 "left": { 24 "position": "left", 25 "elements": [{ 26 "name": "play", 27 "type": "button" 28 }, { 29 "name": "divider", 30 "type": "divider" 31 }, { 32 "name": "prev", 33 "type": "button" 34 }, { 35 "name": "divider", 36 "type": "divider" 37 }, { 38 "name": "next", 39 "type": "button" 40 }, { 41 "name": "divider", 42 "type": "divider" 43 }, { 44 "name": "elapsed", 45 "type": "text" 46 }] 47 }, 48 "center": { 49 "position": "center", 50 "elements": [{ 51 "name": "time", 52 "type": "slider" 53 }] 54 }, 55 "right": { 56 "position": "right", 57 "elements": [{ 58 "name": "duration", 59 "type": "text" 60 }, { 61 "name": "divider", 62 "type": "divider" 63 }, { 64 "name": "blank", 65 "type": "button" 66 }, { 67 "name": "fullscreen", 68 "type": "button" 69 }, { 70 "name": "divider", 71 "type": "divider" 72 }, { 73 "name": "mute", 74 "type": "button" 75 }, { 76 "name": "volume", 77 "type": "slider" 78 }] 79 } 80 } 12 81 }; 13 82 83 _css = jwplayer.html5.utils.css; 14 84 15 /** Map with config for the jwplayerControlbar plugin. **/ 16 var _defaults = { 17 fontsize: 10, 18 fontcolor: '000000', 19 position: _positions.BOTTOM, 20 leftmargin: 0, 21 rightmargin: 0, 22 scrubber: 'none' 85 _hide = function(element) { 86 _css(element, { 87 display: "none" 88 }); 23 89 }; 24 90 25 var _controlbar; 26 27 jwplayer.html5.controlbar = function(player) { 28 _controlbar = $.extend({}, _defaults, player.skin.controlbar.settings); 29 _buildElements(player); 30 _buildHandlers(player); 91 _show = function(element) { 92 _css(element, { 93 display: "block" 94 }); 31 95 }; 32 96 33 /** Draw the jwplayerControlbar elements. **/ 34 function _buildElements(player, domelement) { 35 // Draw the background. 36 player._model.domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 37 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 38 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 39 switch (_controlbar.position) { 40 case _positions.TOP: 41 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 42 break; 43 default: 44 $("#" + player.id + '_jwplayerControlbar').css('top', player.getHeight()); 45 player._model.domelement.parents(":first").css('height', parseInt(player._model.domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 46 break; 47 } 48 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 49 // Draw all elements on top of the bar. 50 _buildElement('capLeft', 'left', true, player); 51 _buildElement('playButton', 'left', false, player); 52 _buildElement('pauseButton', 'left', true, player); 53 _buildElement('divider1', 'left', true, player); 54 _buildElement('prevButton', 'left', true, player); 55 _buildElement('divider2', 'left', true, player); 56 _buildElement('nextButton', 'left', true, player); 57 _buildElement('divider3', 'left', true, player); 58 _buildElement('elapsedText', 'left', true, player); 59 _buildElement('timeSliderRail', 'left', false, player); 60 _buildElement('timeSliderBuffer', 'left', false, player); 61 _buildElement('timeSliderProgress', 'left', false, player); 62 _buildElement('timeSliderThumb', 'left', false, player); 63 _buildElement('capRight', 'right', true, player); 64 // TODO 65 if (false) { 66 _buildElement('fullscreenButton', 'right', false, player); 67 _buildElement('normalscreenButton', 'right', true, player); 68 _buildElement('divider4', 'right', true, player); 69 } 70 _buildElement('volumeSliderRail', 'right', false, player); 71 _buildElement('volumeSliderProgress', 'right', true, player); 72 _buildElement('muteButton', 'right', false, player); 73 _buildElement('unmuteButton', 'right', true, player); 74 _buildElement('divider5', 'right', true, player); 75 _buildElement('durationText', 'right', true, player); 76 } 77 78 79 /** Draw a single element into the jwplayerControlbar. **/ 80 function _buildElement(element, align, offset, player) { 81 var nam = player.id + '_' + element; 82 $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 83 $('#' + nam).css('position', 'absolute'); 84 $('#' + nam).css('top', '0px'); 85 if (element.indexOf('Text') > 0) { 86 $('#' + nam).html('00:00'); 87 $('#' + nam).css('font', _controlbar.fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 88 $('#' + nam).css('text-align', 'center'); 89 $('#' + nam).css('font-weight', 'bold'); 90 $('#' + nam).css('cursor', 'default'); 91 var wid = 14 + 3 * _controlbar.fontsize; 92 $('#' + nam).css('color', '#' + _controlbar.fontcolor.substr(-6)); 93 } else if (element.indexOf('divider') === 0) { 94 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 95 var wid = player.skin.controlbar.elements.divider.width; 96 } else { 97 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 98 var wid = player.skin.controlbar.elements[element].width; 99 } 100 if (align == 'left') { 101 $('#' + nam).css(align, _controlbar.leftmargin); 102 if (offset) { 103 _controlbar.leftmargin += wid; 104 } 105 } else if (align == 'right') { 106 $('#' + nam).css(align, _controlbar.rightmargin); 107 if (offset) { 108 _controlbar.rightmargin += wid; 109 } 110 } 111 $('#' + nam).css('width', wid); 112 $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 113 } 114 115 116 /** Add interactivity to the jwplayerControlbar elements. **/ 117 function _buildHandlers(player) { 118 // Register events with the buttons. 119 _buildHandler('playButton', 'play', player); 120 _buildHandler('pauseButton', 'pause', player); 121 _buildHandler('prevButton', 'playlistPrev', player); 122 _buildHandler('nextButton', 'playlistNext', player); 123 _buildHandler('muteButton', 'setMute', player, true); 124 _buildHandler('unmuteButton', 'setMute', player, false); 125 _buildHandler('fullscreenButton', 'setFullscreen', player, true); 126 _buildHandler('normalscreenButton', 'setFullscreen', player, false); 127 128 _addSliders(player); 129 130 // Register events with the player. 131 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 132 player.addEventListener(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, _stateHandler); 133 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, _timeHandler); 134 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 135 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 136 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 137 138 // Trigger a few events so the bar looks good on startup. 139 _resizeHandler({ 140 id: player.id, 141 fulscreen: player.getFullscreen(), 142 width: player.getWidth(), 143 height: player.getHeight() 144 }); 145 _timeHandler({ 146 id: player.id, 147 duration: player.getDuration(), 148 position: 0 149 }); 150 _bufferHandler({ 151 id: player.id, 152 bufferProgress: 0 153 }); 154 _muteHandler({ 155 id: player.id, 156 mute: player.getMute() 157 }); 158 _stateHandler({ 159 id: player.id, 160 newstate: jwplayer.html5.states.IDLE 161 }); 162 _volumeHandler({ 163 id: player.id, 164 volume: player.getVolume() 165 }); 166 } 167 168 169 /** Set a single button handler. **/ 170 function _buildHandler(element, handler, player, args) { 171 var nam = player.id + '_' + element; 172 $('#' + nam).css('cursor', 'pointer'); 173 if (handler == 'fullscreen') { 174 $('#' + nam).mouseup(function(evt) { 97 jwplayer.html5.controlbar = function(api, config) { 98 var _api = api; 99 var _settings = jwplayer.utils.extend({}, _defaults, _api.skin.getComponentSettings("controlbar"), config); 100 if (jwplayer.html5.utils.mapLength(_api.skin.getComponentLayout("controlbar")) > 0) { 101 _settings.layout = _api.skin.getComponentLayout("controlbar"); 102 } 103 var _wrapper; 104 var _dividerid = 0; 105 var _marginleft = 0; 106 var _marginright = 0; 107 var _scrubber = "none"; 108 var _mousedown; 109 var _currentPosition; 110 var _currentDuration; 111 var _currentBuffer; 112 var _width; 113 var _height; 114 var _prevElement; 115 var _elements = {}; 116 var _ready = false; 117 var _fadeOutTimeout; 118 119 120 function _buildBase() { 121 var wrappercss = { 122 height: _api.skin.getSkinElement("controlbar", "background").height, 123 backgroundColor: "#" + _settings.backgroundcolor 124 }; 125 126 _wrapper = document.createElement("div"); 127 _wrapper.id = _api.id + "_jwplayer_controlbar"; 128 _css(_wrapper, wrappercss); 129 130 _addElement("capLeft", "left", false, _wrapper); 131 var domelmentcss = { 132 position: "absolute", 133 height: _api.skin.getSkinElement("controlbar", "background").height, 134 background: " url(" + _api.skin.getSkinElement("controlbar", "background").src + ") repeat-x center left", 135 left: _api.skin.getSkinElement("controlbar", "capLeft").width 136 }; 137 _appendNewElement("elements", _wrapper, domelmentcss); 138 _addElement("capRight", "right", false, _wrapper); 139 } 140 141 this.getDisplayElement = function() { 142 return _wrapper; 143 }; 144 145 this.resize = function(width, height) { 146 if (!_ready && _wrapper.parentElement !== undefined) { 147 _ready = true; 148 if (_settings.position == jwplayer.html5.view.positions.OVER.toLowerCase()){ 149 document.getElementById(_api.id).onmousemove = _fadeOut; 150 } 151 } 152 _width = width; 153 _height = height; 154 if (_api.jwGetFullscreen()) { 155 _show(_elements.normalscreenButton); 156 _hide(_elements.fullscreenButton); 157 } else { 158 _hide(_elements.normalscreenButton); 159 _show(_elements.fullscreenButton); 160 } 161 var style = _resizeBar(); 162 _timeHandler({ 163 id: _api.id, 164 duration: _currentDuration, 165 position: _currentPosition 166 }); 167 _bufferHandler({ 168 id: _api.id, 169 bufferPercent: _currentBuffer 170 }); 171 return style; 172 }; 173 174 function _fadeOut() { 175 _wrapper.style.opacity = 1; 176 if (_fadeOutTimeout !== undefined) { 177 clearTimeout(_fadeOutTimeout); 178 } 179 _fadeOutTimeout = setTimeout(function() { 180 jwplayer.html5.utils.fadeTo(_wrapper, 0, 0.1, 1); 181 _fadeOutTimeout = undefined; 182 }, 2000); 183 } 184 185 function _fadeIn(){ 186 _wrapper.style.opacity = 1; 187 } 188 189 function _appendNewElement(id, parent, css) { 190 var element = document.createElement("div"); 191 _elements[id] = element; 192 element.id = _wrapper.id + "_" + id; 193 parent.appendChild(element); 194 if (css !== undefined) { 195 _css(element, css); 196 } 197 return element; 198 } 199 200 /** Draw the jwplayerControlbar elements. **/ 201 function _buildElements() { 202 _buildGroup(_settings.layout.left); 203 _buildGroup(_settings.layout.right, -1); 204 _buildGroup(_settings.layout.center); 205 } 206 207 /** Layout a group of elements**/ 208 function _buildGroup(group, order) { 209 var alignment = group.position == "right" ? "right" : "left"; 210 var elements = jwplayer.utils.extend([], group.elements); 211 if (order !== undefined) { 212 elements.reverse(); 213 } 214 for (var i = 0; i < elements.length; i++) { 215 _buildElement(elements[i], alignment); 216 } 217 } 218 219 function getNewDivivderId() { 220 return _dividerid++; 221 } 222 223 /** Draw a single element into the jwplayerControlbar. **/ 224 function _buildElement(element, alignment) { 225 switch (element.name) { 226 case "play": 227 _addElement("playButton", alignment, false); 228 _addElement("pauseButton", alignment, true); 229 _buildHandler("playButton", "jwPlay"); 230 _buildHandler("pauseButton", "jwPause"); 231 break; 232 case "divider": 233 _addElement("divider" + getNewDivivderId(), alignment, true); 234 break; 235 case "prev": 236 if (_api.jwGetPlaylist().length > 1) { 237 _addElement("prevButton", alignment, true); 238 _buildHandler("prevButton", "jwPlaylistPrev"); 239 } 240 break; 241 case "next": 242 if (_api.jwGetPlaylist().length > 1) { 243 _addElement("nextButton", alignment, true); 244 _buildHandler("nextButton", "jwPlaylistNext"); 245 } 246 break; 247 case "elapsed": 248 _addElement("elapsedText", alignment, true); 249 break; 250 case "time": 251 var offsetLeft = _api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 252 var offsetRight = _api.skin.getSkinElement("controlbar", "timeSliderCapRight") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapRight").width; 253 var offset = alignment == "left" ? offsetLeft : offsetRight; 254 var width = _api.skin.getSkinElement("controlbar", "timeSliderRail").width + offsetLeft + offsetRight; 255 var slidercss = { 256 height: _api.skin.getSkinElement("controlbar", "background").height, 257 position: "absolute", 258 top: 0, 259 width: width 260 }; 261 slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 262 var _timeslider = _appendNewElement("timeSlider", _elements.elements, slidercss); 263 _addElement("timeSliderCapLeft", alignment, true, _timeslider, alignment == "left" ? 0 : offset); 264 _addElement("timeSliderRail", alignment, false, _timeslider, offset); 265 _addElement("timeSliderBuffer", alignment, false, _timeslider, offset); 266 _addElement("timeSliderProgress", alignment, false, _timeslider, offset); 267 _addElement("timeSliderThumb", alignment, false, _timeslider, offset); 268 _addElement("timeSliderCapRight", alignment, true, _timeslider, alignment == "right" ? 0 : offset); 269 _addSliderListener("time"); 270 break; 271 case "fullscreen": 272 _addElement("fullscreenButton", alignment, false); 273 _addElement("normalscreenButton", alignment, true); 274 _buildHandler("fullscreenButton", "jwSetFullscreen", true); 275 _buildHandler("normalscreenButton", "jwSetFullscreen", false); 276 break; 277 case "volume": 278 var offsetLeft = _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 279 var offsetRight = _api.skin.getSkinElement("controlbar", "volumeSliderCapRight") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapRight").width; 280 var offset = alignment == "left" ? offsetLeft : offsetRight; 281 var width = _api.skin.getSkinElement("controlbar", "volumeSliderRail").width + offsetLeft + offsetRight; 282 var slidercss = { 283 height: _api.skin.getSkinElement("controlbar", "background").height, 284 position: "absolute", 285 top: 0, 286 width: width 287 }; 288 slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 289 var _volumeslider = _appendNewElement("volumeSlider", _elements.elements, slidercss); 290 _addElement("volumeSliderCapLeft", alignment, true, _volumeslider, alignment == "left" ? 0 : offset); 291 _addElement("volumeSliderRail", alignment, true, _volumeslider, offset); 292 _addElement("volumeSliderProgress", alignment, false, _volumeslider, offset); 293 _addElement("volumeSliderCapRight", alignment, true, _volumeslider, alignment == "right" ? 0 : offset); 294 _addSliderListener("volume"); 295 break; 296 case "mute": 297 _addElement("muteButton", alignment, false); 298 _addElement("unmuteButton", alignment, true); 299 _buildHandler("muteButton", "jwSetMute", true); 300 _buildHandler("unmuteButton", "jwSetMute", false); 301 302 break; 303 case "duration": 304 _addElement("durationText", alignment, true); 305 break; 306 } 307 } 308 309 function _addElement(element, alignment, offset, parent, position) { 310 if ((_api.skin.getSkinElement("controlbar", element) !== undefined || element.indexOf("Text") > 0 || element.indexOf("divider") === 0) && !(element.indexOf("divider") === 0 && _prevElement.indexOf("divider") === 0)) { 311 _prevElement = element; 312 var css = { 313 height: _api.skin.getSkinElement("controlbar", "background").height, 314 position: "absolute", 315 top: 0 316 }; 317 var wid; 318 if (element.indexOf("Text") > 0) { 319 element.innerhtml = "00:00"; 320 css.font = _settings.fontsize + "px/" + (_api.skin.getSkinElement("controlbar", "background").height + 1) + "px " + _settings.font; 321 css.color = _settings.fontcolor; 322 css.textAlign = "center"; 323 css.fontWeight = _settings.fontweight; 324 css.fontStyle = _settings.fontstyle; 325 css.cursor = "default"; 326 wid = 14 + 3 * _settings.fontsize; 327 css.color = "#" + _settings.fontcolor.substr(-6); 328 } else if (element.indexOf("divider") === 0) { 329 css.background = "url(" + _api.skin.getSkinElement("controlbar", "divider").src + ") repeat-x center left"; 330 wid = _api.skin.getSkinElement("controlbar", "divider").width; 331 } else { 332 css.background = "url(" + _api.skin.getSkinElement("controlbar", element).src + ") repeat-x center left"; 333 wid = _api.skin.getSkinElement("controlbar", element).width; 334 } 335 if (alignment == "left") { 336 css.left = position === undefined ? _marginleft : position; 337 if (offset) { 338 _marginleft += wid; 339 } 340 } else if (alignment == "right") { 341 css.right = position === undefined ? _marginright : position; 342 if (offset) { 343 _marginright += wid; 344 } 345 } 346 347 if (parent === undefined) { 348 parent = _elements.elements; 349 } 350 351 css.width = wid; 352 353 var newelement = _appendNewElement(element, parent, css); 354 if (_api.skin.getSkinElement("controlbar", element + "Over") !== undefined) { 355 newelement.onmouseover = function(evt) { 356 evt.stopPropagation(); 357 newelement.style["background-image"] = ["url(", _api.skin.getSkinElement("controlbar", element + "Over").src, ")"].join(""); 358 }; 359 newelement.onmouseout = function(evt) { 360 evt.stopPropagation(); 361 newelement.style["background-image"] = ["url(", _api.skin.getSkinElement("controlbar", element).src, ")"].join(""); 362 }; 363 } 364 365 } 366 } 367 368 function _addListeners() { 369 // Register events with the player. 370 //_api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, _playlistHandler); 371 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 372 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 373 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, _timeHandler); 374 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 375 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 376 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 377 } 378 379 /** Add interactivity to the jwplayerControlbar elements. **/ 380 function _init() { 381 // Trigger a few events so the bar looks good on startup. 382 _timeHandler({ 383 id: _api.id, 384 duration: _api.jwGetDuration(), 385 position: 0 386 }); 387 _bufferHandler({ 388 id: _api.id, 389 bufferProgress: 0 390 }); 391 _muteHandler({ 392 id: _api.id, 393 mute: _api.jwGetMute() 394 }); 395 _stateHandler({ 396 id: _api.id, 397 newstate: jwplayer.api.events.state.IDLE 398 }); 399 _volumeHandler({ 400 id: _api.id, 401 volume: _api.jwGetVolume() 402 }); 403 } 404 405 406 /** Set a single button handler. **/ 407 function _buildHandler(element, handler, args) { 408 if (_api.skin.getSkinElement("controlbar", element) !== undefined) { 409 var _element = _elements[element]; 410 if (_element !== null) { 411 _css(_element, { 412 cursor: "pointer" 413 }); 414 if (handler == "fullscreen") { 415 _element.onmouseup = function(evt) { 416 evt.stopPropagation(); 417 _api.jwSetFullscreen(!_api.jwGetFullscreen()); 418 }; 419 } else { 420 _element.onmouseup = function(evt) { 421 evt.stopPropagation(); 422 if (args !== null) { 423 _api[handler](args); 424 } else { 425 _api[handler](); 426 } 427 428 }; 429 } 430 } 431 } 432 } 433 434 /** Set the volume drag handler. **/ 435 function _addSliderListener(name) { 436 var bar = _elements[name + "Slider"]; 437 _css(_elements.elements, { 438 "cursor": "pointer" 439 }); 440 _css(bar, { 441 "cursor": "pointer" 442 }); 443 bar.onmousedown = function(evt) { 444 _scrubber = name; 445 }; 446 bar.onmouseup = function(evt) { 175 447 evt.stopPropagation(); 176 player.setFullscreen(!player.getFullscreen()); 177 _resizeHandler({ 178 id: player.id, 179 fullscreen: player.getFullscreen(), 180 width: player.getWidth(), 181 height: player.getHeight() 448 _sliderUp(evt.pageX); 449 }; 450 bar.onmousemove = function(evt) { 451 if (_scrubber == "time") { 452 _mousedown = true; 453 var xps = evt.pageX - bar.getBoundingClientRect().left - window.pageXOffset; 454 _css(_elements.timeSliderThumb, { 455 left: xps 456 }); 457 } 458 }; 459 } 460 461 462 /** The slider has been moved up. **/ 463 function _sliderUp(msx) { 464 _mousedown = false; 465 var railRect, xps; 466 if (_scrubber == "time") { 467 railRect = _elements.timeSliderRail.getBoundingClientRect(); 468 xps = msx - railRect.left + window.pageXOffset; 469 var pos = xps / railRect.width * _currentDuration; 470 if (pos < 0) { 471 pos = 0; 472 } else if (pos > _currentDuration) { 473 pos = _currentDuration - 3; 474 } 475 _api.jwSeek(pos); 476 if (_api.jwGetState() != jwplayer.api.events.state.PLAYING) { 477 _api.jwPlay(); 478 } 479 } else if (_scrubber == "volume") { 480 railRect = _elements.volumeSliderRail.getBoundingClientRect(); 481 xps = msx - railRect.left - window.pageXOffset; 482 var pct = Math.round(xps / railRect.width * 100); 483 if (pct < 0) { 484 pct = 0; 485 } else if (pct > 100) { 486 pct = 100; 487 } 488 if (_api.jwGetMute()) { 489 _api.jwSetMute(false); 490 } 491 _api.jwSetVolume(pct); 492 } 493 _scrubber = "none"; 494 } 495 496 497 /** Update the buffer percentage. **/ 498 function _bufferHandler(event) { 499 if (event.bufferPercent !== null) { 500 _currentBuffer = event.bufferPercent; 501 } 502 var wid = _elements.timeSliderRail.getBoundingClientRect().width; 503 var bufferWidth = isNaN(Math.round(wid * _currentBuffer / 100)) ? 0 : Math.round(wid * _currentBuffer / 100); 504 _css(_elements.timeSliderBuffer, { 505 width: bufferWidth 506 }); 507 } 508 509 510 /** Update the mute state. **/ 511 function _muteHandler(event) { 512 if (event.mute) { 513 _hide(_elements.muteButton); 514 _show(_elements.unmuteButton); 515 _hide(_elements.volumeSliderProgress); 516 } else { 517 _show(_elements.muteButton); 518 _hide(_elements.unmuteButton); 519 _show(_elements.volumeSliderProgress); 520 } 521 } 522 523 524 /** Update the playback state. **/ 525 function _stateHandler(event) { 526 // Handle the play / pause button 527 if (event.newstate == jwplayer.api.events.state.BUFFERING || event.newstate == jwplayer.api.events.state.PLAYING) { 528 _show(_elements.pauseButton); 529 _hide(_elements.playButton); 530 } else { 531 _hide(_elements.pauseButton); 532 _show(_elements.playButton); 533 } 534 535 // Show / hide progress bar 536 if (event.newstate == jwplayer.api.events.state.IDLE) { 537 if (!_settings.idlehide && _settings.position == jwplayer.html5.view.positions.OVER){ 538 _fadeIn(); 539 } 540 _hide(_elements.timeSliderBuffer); 541 _hide(_elements.timeSliderProgress); 542 _hide(_elements.timeSliderThumb); 543 } else { 544 _show(_elements.timeSliderBuffer); 545 if (event.newstate != jwplayer.api.events.state.BUFFERING) { 546 _show(_elements.timeSliderProgress); 547 _show(_elements.timeSliderThumb); 548 } 549 } 550 } 551 552 553 /** Handles event completion **/ 554 function _completeHandler(event) { 555 _timeHandler(jwplayer.utils.extend(event, { 556 position: 0, 557 duration: _currentDuration 558 })); 559 } 560 561 562 /** Update the playback time. **/ 563 function _timeHandler(event) { 564 if (event.position !== null) { 565 _currentPosition = event.position; 566 } 567 if (event.duration !== null) { 568 _currentDuration = event.duration; 569 } 570 var progress = (_currentPosition === _currentDuration === 0) ? 0 : _currentPosition / _currentDuration; 571 var railRect = _elements.timeSliderRail.getBoundingClientRect(); 572 var progressWidth = isNaN(Math.round(railRect.width * progress)) ? 0 : Math.round(railRect.width * progress); 573 var thumbPosition = progressWidth; 574 575 _elements.timeSliderProgress.style.width = progressWidth + "px"; 576 if (!_mousedown) { 577 if (_elements.timeSliderThumb) { 578 _elements.timeSliderThumb.style.left = thumbPosition + "px"; 579 } 580 } 581 if (_elements.durationText) { 582 _elements.durationText.innerHTML = _timeFormat(_currentDuration); 583 } 584 if (_elements.elapsedText) { 585 _elements.elapsedText.innerHTML = _timeFormat(_currentPosition); 586 } 587 } 588 589 590 /** Format the elapsed / remaining text. **/ 591 function _timeFormat(sec) { 592 str = "00:00"; 593 if (sec > 0) { 594 str = Math.floor(sec / 60) < 10 ? "0" + Math.floor(sec / 60) + ":" : Math.floor(sec / 60) + ":"; 595 str += Math.floor(sec % 60) < 10 ? "0" + Math.floor(sec % 60) : Math.floor(sec % 60); 596 } 597 return str; 598 } 599 600 601 /** Resize the jwplayerControlbar. **/ 602 function _resizeBar() { 603 var controlbarcss = { 604 width: _width 605 }; 606 var elementcss = {}; 607 if (_settings.position.toUpperCase() == jwplayer.html5.view.positions.OVER || _api.jwGetFullscreen()) { 608 controlbarcss.left = _settings.margin; 609 controlbarcss.width -= 2 * _settings.margin; 610 controlbarcss.top = _height - _api.skin.getSkinElement("controlbar", "background").height - _settings.margin; 611 controlbarcss.height = _api.skin.getSkinElement("controlbar", "background").height; 612 } else { 613 controlbarcss.left = 0; 614 } 615 616 elementcss.left = _api.skin.getSkinElement("controlbar", "capLeft").width; 617 elementcss.width = controlbarcss.width - _api.skin.getSkinElement("controlbar", "capLeft").width - _api.skin.getSkinElement("controlbar", "capRight").width; 618 619 var timeSliderLeft = _api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 620 _css(_elements.timeSliderRail, { 621 width: (elementcss.width - _marginleft - _marginright), 622 left: timeSliderLeft 623 }); 624 if (_elements.timeSliderCapRight !== null) { 625 _css(_elements.timeSliderCapRight, { 626 left: timeSliderLeft + (elementcss.width - _marginleft - _marginright) 182 627 }); 183 }); 184 } else { 185 $('#' + nam).mouseup(function(evt) { 186 evt.stopPropagation(); 187 if (!jwplayer.html5.utils.isNull(args)) { 188 player[handler](args); 189 } else { 190 player[handler](); 191 } 628 } 629 //_css(_wrapper, controlbarcss); 630 _css(_elements.elements, elementcss); 631 return controlbarcss; 632 } 633 634 635 /** Update the volume level. **/ 636 function _volumeHandler(event) { 637 if (_elements.volumeSliderRail !== null) { 638 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 639 var width = parseInt(_elements.volumeSliderRail.style.width.replace("px", ""), 10); 640 var progressWidth = isNaN(Math.round(width * progress)) ? 0 : Math.round(width * progress); 641 var offset = parseInt(_elements.volumeSliderRail.style.right.replace("px", ""), 10); 192 642 193 }); 194 } 195 } 196 197 198 /** Set the volume drag handler. **/ 199 function _addSliders(player) { 200 var bar = '#' + player.id + '_jwplayerControlbar'; 201 var trl = '#' + player.id + '_timeSliderRail'; 202 var vrl = '#' + player.id + '_volumeSliderRail'; 203 $(bar).css('cursor', 'pointer'); 204 $(trl).css('cursor', 'pointer'); 205 $(vrl).css('cursor', 'pointer'); 206 $(bar).mousedown(function(evt) { 207 if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 208 _controlbar.scrubber = 'time'; 209 } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 210 _controlbar.scrubber = 'volume'; 211 } 212 }); 213 $(bar).mouseup(function(evt) { 214 evt.stopPropagation(); 215 _sliderUp(evt.pageX, player); 216 }); 217 $(bar).mousemove(function(evt) { 218 if (_controlbar.scrubber == 'time') { 219 _controlbar.mousedown = true; 220 var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 221 $('#' + player.id + '_timeSliderThumb').css('left', xps); 222 } 223 }); 224 } 225 226 227 /** The slider has been moved up. **/ 228 function _sliderUp(msx, player) { 229 _controlbar.mousedown = false; 230 if (_controlbar.scrubber == 'time') { 231 var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 232 var wid = $('#' + player.id + '_timeSliderRail').width(); 233 var pos = xps / wid * _controlbar.currentDuration; 234 if (pos < 0) { 235 pos = 0; 236 } else if (pos > _controlbar.currentDuration) { 237 pos = _controlbar.currentDuration - 3; 238 } 239 player.seek(pos); 240 if (player.getState() != jwplayer.html5.states.PLAYING) { 241 player.play(); 242 } 243 } else if (_controlbar.scrubber == 'volume') { 244 var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 245 var wid = $('#' + player.id + '_volumeSliderRail').width(); 246 var pct = Math.round(xps / wid * 100); 247 if (pct < 0) { 248 pct = 0; 249 } else if (pct > 100) { 250 pct = 100; 251 } 252 if (player._model.mute) { 253 player.setMute(false); 254 } 255 player.setVolume(pct); 256 } 257 _controlbar.scrubber = 'none'; 258 } 259 260 261 /** Update the buffer percentage. **/ 262 function _bufferHandler(event) { 263 if (!jwplayer.html5.utils.isNull(event.bufferPercent)) { 264 _controlbar.currentBuffer = event.bufferPercent; 265 } 266 267 var wid = $('#' + event.id + '_timeSliderRail').width(); 268 var bufferWidth = isNaN(Math.round(wid * _controlbar.currentBuffer / 100)) ? 0 : Math.round(wid * _controlbar.currentBuffer / 100); 269 $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 270 } 271 272 273 /** Update the mute state. **/ 274 function _muteHandler(event) { 275 if (event.mute) { 276 $('#' + event.id + '_muteButton').css('display', 'none'); 277 $('#' + event.id + '_unmuteButton').css('display', 'block'); 278 $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 279 } else { 280 $('#' + event.id + '_muteButton').css('display', 'block'); 281 $('#' + event.id + '_unmuteButton').css('display', 'none'); 282 $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 283 } 284 } 285 286 287 /** Update the playback state. **/ 288 function _stateHandler(event) { 289 // Handle the play / pause button 290 if (event.newstate == jwplayer.html5.states.BUFFERING || event.newstate == jwplayer.html5.states.PLAYING) { 291 $('#' + event.id + '_pauseButton').css('display', 'block'); 292 $('#' + event.id + '_playButton').css('display', 'none'); 293 } else { 294 $('#' + event.id + '_pauseButton').css('display', 'none'); 295 $('#' + event.id + '_playButton').css('display', 'block'); 296 } 297 298 // Show / hide progress bar 299 if (event.newstate == jwplayer.html5.states.IDLE) { 300 $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 301 $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 302 $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 303 } else { 304 $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 305 if (event.newstate != jwplayer.html5.states.BUFFERING) { 306 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 307 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 308 } 309 } 310 } 311 312 313 /** Handles event completion **/ 314 function _completeHandler(event) { 315 _timeHandler($.extend(event, { 316 position: 0, 317 duration: _controlbar.currentDuration 318 })); 319 } 320 321 322 /** Update the playback time. **/ 323 function _timeHandler(event) { 324 if (!jwplayer.html5.utils.isNull(event.position)) { 325 _controlbar.currentPosition = event.position; 326 } 327 if (!jwplayer.html5.utils.isNull(event.duration)) { 328 _controlbar.currentDuration = event.duration; 329 } 330 var progress = (_controlbar.currentPosition === _controlbar.currentDuration === 0) ? 0 : _controlbar.currentPosition / _controlbar.currentDuration; 331 var railWidth = $('#' + event.id + '_timeSliderRail').width(); 332 var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 333 var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 334 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 335 var thumbPosition = railLeft + progressWidth; 336 337 $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 338 if (!_controlbar.mousedown) { 339 $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 340 } 341 342 $('#' + event.id + '_durationText').html(_timeFormat(_controlbar.currentDuration)); 343 $('#' + event.id + '_elapsedText').html(_timeFormat(_controlbar.currentPosition)); 344 } 345 346 347 /** Format the elapsed / remaining text. **/ 348 function _timeFormat(sec) { 349 str = '00:00'; 350 if (sec > 0) { 351 str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 352 str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 353 } 354 return str; 355 } 356 357 358 /** Flip the player size to/from full-browser-screen. **/ 359 function _resizeHandler(event) { 360 _controlbar.width = event.width; 361 _controlbar.fullscreen = event.fullscreen; 362 if (event.fullscreen) { 363 $('#' + event.id + '_normalscreenButton').css('display', 'block'); 364 $('#' + event.id + '_fullscreenButton').css('display', 'none'); 365 // TODO 366 if (false) { 367 $(window).resize(function() { 368 _resizeBar(player); 643 var volumeSliderLeft = _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 644 _css(_elements.volumeSliderProgress, { 645 width: progressWidth, 646 left: volumeSliderLeft 369 647 }); 370 } 371 } else { 372 $('#' + event.id + '_normalscreenButton').css('display', 'none'); 373 $('#' + event.id + '_fullscreenButton').css('display', 'block'); 374 // TODO 375 if (false) { 376 $(window).resize(null); 377 } 378 } 379 _resizeBar(event); 380 _timeHandler(event); 381 _bufferHandler(event); 382 } 383 384 385 /** Resize the jwplayerControlbar. **/ 386 function _resizeBar(event) { 387 var lft = _controlbar.left; 388 var top = _controlbar.top; 389 var wid = _controlbar.width; 390 var hei = $('#' + event.id + '_jwplayerControlbar').height(); 391 if (_controlbar.position == 'over') { 392 lft += 1 * _controlbar.margin; 393 top -= 1 * _controlbar.margin + hei; 394 wid -= 2 * _controlbar.margin; 395 } 396 if (_controlbar.fullscreen) { 397 lft = _controlbar.margin; 398 top = $(window).height() - _controlbar.margin - hei; 399 wid = $(window).width() - 2 * _controlbar.margin; 400 $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 401 } else { 402 $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 403 } 404 $('#' + event.id + '_jwplayerControlbar').css('left', lft); 405 $('#' + event.id + '_jwplayerControlbar').css('top', top); 406 $('#' + event.id + '_jwplayerControlbar').css('width', wid); 407 $('#' + event.id + '_timeSliderRail').css('width', (wid - _controlbar.leftmargin - _controlbar.rightmargin)); 408 } 409 410 411 /** Update the volume level. **/ 412 function _volumeHandler(event) { 413 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 414 var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 415 var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 416 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 417 418 $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 419 $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 420 } 421 648 649 if (_elements.volumeSliderCapLeft !== undefined) { 650 _css(_elements.volumeSliderCapLeft, { 651 left: 0 652 }); 653 } 654 } 655 } 656 657 function _setup() { 658 _buildBase(); 659 _buildElements(); 660 _addListeners(); 661 _init(); 662 _wrapper.style.opacity = _settings.idlehide ? 0 : 1; 663 } 664 665 _setup(); 666 return this; 667 }; 422 668 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.controller.js
r1277 r1278 7 7 (function(jwplayer) { 8 8 9 jwplayer.html5.controller = function(player) { 10 return { 11 play: _play(player), 12 pause: _pause(player), 13 seek: _seek(player), 14 stop: _stop(player), 15 prev: _prev(player), 16 next: _next(player), 17 item: _item(player), 18 volume: _volume(player), 19 mute: _mute(player), 20 resize: _resize(player), 21 fullscreen: _fullscreen(player), 22 load: _load(player), 23 mediaInfo: _mediaInfo(player), 24 addEventListener: _addEventListener(player), 25 removeEventListener: _removeEventListener(player), 26 sendEvent: _sendEvent(player) 27 }; 28 }; 9 var _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 29 10 30 _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 31 32 function _play(player) { 33 return function() { 34 try { 35 switch (player.getState()) { 36 case jwplayer.html5.states.IDLE: 37 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, player._media.play); 38 player._media.load(player._model.playlist[player._model.item]); 39 break; 40 case jwplayer.html5.states.PAUSED: 41 player._media.play(); 42 break; 43 } 44 45 return player; 46 } catch (err) { 47 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 48 } 49 return false; 50 }; 51 } 52 53 54 /** Switch the pause state of the player. **/ 55 function _pause(player) { 56 return function() { 57 try { 58 switch (player.getState()) { 59 case jwplayer.html5.states.PLAYING: 60 case jwplayer.html5.states.BUFFERING: 61 player._media.pause(); 62 break; 63 } 64 return player; 65 } catch (err) { 66 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 67 } 68 return false; 69 }; 70 } 71 72 73 /** Seek to a position in the video. **/ 74 function _seek(player) { 75 return function(position) { 76 try { 77 switch (player.getState()) { 78 case jwplayer.html5.states.PLAYING: 79 case jwplayer.html5.states.PAUSED: 80 case jwplayer.html5.states.BUFFERING: 81 player._media.seek(position); 82 break; 83 } 84 return player; 85 } catch (err) { 86 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 87 } 88 return false; 89 }; 90 } 91 92 93 /** Stop playback and loading of the video. **/ 94 function _stop(player) { 95 return function() { 96 try { 97 player._media.stop(); 98 return player; 99 } catch (err) { 100 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 101 } 102 return false; 103 }; 104 } 105 106 /** Stop playback and loading of the video. **/ 107 function _next(player) { 108 return function() { 109 try { 110 if (player._model.item + 1 == player._model.playlist.length){ 111 return player.playlistItem(0); 112 } else { 113 return player.playlistItem(player._model.item + 1); 114 } 115 } catch (err) { 116 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 117 } 118 return false; 119 }; 120 } 121 122 /** Stop playback and loading of the video. **/ 123 function _prev(player) { 124 return function() { 125 try { 126 if (player._model.item === 0){ 127 return player.playlistItem(player._model.playlist.length - 1); 128 } else { 129 return player.playlistItem(player._model.item - 1); 130 } 131 } catch (err) { 132 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 133 } 134 return false; 135 }; 136 } 137 138 /** Stop playback and loading of the video. **/ 139 function _item(player) { 140 return function(item) { 141 try { 142 var oldstate = player.getState(); 143 player.stop(); 144 player._model.item = item; 145 player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYLIST_ITEM, {"item":item}); 146 if (oldstate == jwplayer.html5.states.PLAYING || oldstate == jwplayer.html5.states.BUFFERING){ 147 player.play(); 148 } 149 return player; 150 } catch (err) { 151 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 152 } 153 return false; 154 }; 155 } 156 /** Get / set the video's volume level. **/ 157 function _volume(player) { 158 return function(arg) { 159 try { 160 switch (jwplayer.html5.utils.typeOf(arg)) { 161 case "function": 162 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, arg); 163 break; 11 jwplayer.html5.controller = function(api, container, model, view) { 12 var _api = api; 13 var _model = model; 14 var _view = view; 15 var _container = container; 16 var _itemUpdated = true; 17 18 var debug = (_model.config.debug !== undefined) && (_model.config.debug.toString().toLowerCase() == 'console'); 19 var _eventDispatcher = new jwplayer.html5.eventdispatcher(_container.id, debug); 20 jwplayer.utils.extend(this, _eventDispatcher); 21 22 function forward(evt) { 23 _eventDispatcher.sendEvent(evt.type, evt); 24 } 25 26 _model.addGlobalListener(forward); 27 28 function _play() { 29 try { 30 if (_model.playlist[0].levels[0].file.length > 0) { 31 switch (_model.state) { 32 case jwplayer.api.events.state.IDLE: 33 if (_itemUpdated) { 34 _model.setActiveMediaProvider(_model.playlist[_model.item]); 35 _model.addEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, _model.getMedia().play); 36 _model.getMedia().load(_model.playlist[_model.item]); 37 _itemUpdated = false; 38 } else { 39 _model.getMedia().play(); 40 } 41 break; 42 case jwplayer.api.events.state.PAUSED: 43 _model.getMedia().play(); 44 break; 45 } 46 } 47 return true; 48 } catch (err) { 49 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 50 } 51 return false; 52 } 53 54 55 /** Switch the pause state of the player. **/ 56 function _pause() { 57 try { 58 if (_model.playlist[0].levels[0].file.length > 0) { 59 switch (_model.state) { 60 case jwplayer.api.events.state.PLAYING: 61 case jwplayer.api.events.state.BUFFERING: 62 _model.getMedia().pause(); 63 break; 64 } 65 } 66 return true; 67 } catch (err) { 68 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 69 } 70 return false; 71 } 72 73 74 /** Seek to a position in the video. **/ 75 function _seek(position) { 76 try { 77 if (_model.playlist[0].levels[0].file.length > 0) { 78 switch (_model.state) { 79 case jwplayer.api.events.state.PLAYING: 80 case jwplayer.api.events.state.PAUSED: 81 case jwplayer.api.events.state.BUFFERING: 82 _model.getMedia().seek(position); 83 break; 84 } 85 } 86 return true; 87 } catch (err) { 88 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 89 } 90 return false; 91 } 92 93 94 /** Stop playback and loading of the video. **/ 95 function _stop() { 96 try { 97 if (_model.playlist[0].levels[0].file.length > 0) { 98 _model.getMedia().stop(); 99 } 100 return true; 101 } catch (err) { 102 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 103 } 104 return false; 105 } 106 107 /** Stop playback and loading of the video. **/ 108 function _next() { 109 try { 110 if (_model.playlist[0].levels[0].file.length > 0) { 111 if (_model.item + 1 == _model.playlist.length) { 112 return _item(0); 113 } else { 114 return _item(_model.item + 1); 115 } 116 } 117 return true; 118 } catch (err) { 119 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 120 } 121 return false; 122 } 123 124 /** Stop playback and loading of the video. **/ 125 function _prev() { 126 try { 127 if (_model.playlist[0].levels[0].file.length > 0) { 128 if (_model.item === 0) { 129 return _item(_model.playlist.length - 1); 130 } else { 131 return _item(_model.item - 1); 132 } 133 } 134 return true; 135 } catch (err) { 136 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 137 } 138 return false; 139 } 140 141 /** Stop playback and loading of the video. **/ 142 function _item(item) { 143 try { 144 if (_model.playlist[0].levels[0].file.length > 0) { 145 var oldstate = _model.state; 146 _stop(); 147 _model.item = item; 148 _itemUpdated = true; 149 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 150 "item": item 151 }); 152 if (oldstate == jwplayer.api.events.state.PLAYING || oldstate == jwplayer.api.events.state.BUFFERING) { 153 _play(); 154 } 155 } 156 return true; 157 } catch (err) { 158 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 159 } 160 return false; 161 } 162 163 /** Get / set the video's volume level. **/ 164 function _setVolume(volume) { 165 try { 166 switch (typeof(volume)) { 164 167 case "number": 165 player._media.volume(arg); 166 return true; 167 case "string": 168 player._media.volume(parseInt(arg, 10)); 169 return true; 170 default: 171 return player._model.volume; 172 } 173 return player; 174 } catch (err) { 175 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 176 } 177 return false; 178 }; 179 } 180 181 182 /** Get / set the mute state of the player. **/ 183 function _mute(player) { 184 return function(arg) { 185 try { 186 switch (jwplayer.html5.utils.typeOf(arg)) { 187 case "function": 188 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, arg); 189 break; 190 case "boolean": 191 player._media.mute(arg); 192 break; 193 default: 194 return player._model.mute; 195 } 196 return player; 197 } catch (err) { 198 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 199 } 200 return false; 201 }; 202 } 203 204 205 /** Resizes the video **/ 206 function _resize(player) { 207 return function(arg1, arg2) { 208 try { 209 switch (jwplayer.html5.utils.typeOf(arg1)) { 210 case "function": 211 player.addEventListener(jwplayer.html5.events.JWPLAYER_RESIZE, arg1); 212 break; 213 case "number": 214 player._media.resize(arg1, arg2); 168 _model.getMedia().volume(volume); 215 169 break; 216 170 case "string": 217 player._media.resize(arg1, arg2);171 _model.getMedia().volume(parseInt(volume, 10)); 218 172 break; 219 default: 220 break; 221 } 222 return player; 223 } catch (err) { 224 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 225 } 226 return false; 227 }; 228 } 229 230 231 /** Jumping the player to/from fullscreen. **/ 232 function _fullscreen(player) { 233 return function(arg) { 234 try { 235 switch (jwplayer.html5.utils.typeOf(arg)) { 236 case "function": 237 player.addEventListener(jwplayer.html5.events.JWPLAYER_FULLSCREEN, arg); 238 break; 239 case "boolean": 240 player._media.fullscreen(arg); 241 break; 242 default: 243 return player._model.fullscreen; 244 } 245 return player; 246 } catch (err) { 247 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 248 } 249 return false; 250 }; 251 } 252 253 254 /** Loads a new video **/ 255 function _load(player) { 256 return function(arg) { 257 try { 258 switch (jwplayer.html5.utils.typeOf(arg)) { 259 case "function": 260 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_LOADED, arg); 261 break; 262 default: 263 player._media.load(arg); 264 break; 265 } 266 return player; 267 } catch (err) { 268 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 269 } 270 return false; 271 }; 272 } 273 274 275 /** Returns the meta **/ 276 function _mediaInfo(player) { 277 return function() { 278 try { 279 var result = {}; 280 for (var index in _mediainfovariables) { 281 var mediavar = _mediainfovariables[index]; 282 result[mediavar] = player._model[mediavar]; 283 } 284 return result; 285 } catch (err) { 286 jwplayer.html5.utils.log("error", err); 287 } 288 return false; 289 }; 290 } 291 292 293 /** Add an event listener. **/ 294 function _addEventListener(player) { 295 return function(type, listener, count) { 296 try { 297 if (player._listeners[type] === undefined) { 298 player._listeners[type] = []; 299 } 300 player._listeners[type].push({ 301 listener: listener, 302 count: count 303 }); 304 } catch (err) { 305 jwplayer.html5.utils.log("error", err); 306 } 307 return false; 308 }; 309 } 310 311 312 /** Remove an event listener. **/ 313 function _removeEventListener(player) { 314 return function(type, listener) { 315 try { 316 for (var lisenterIndex in player._listeners[type]) { 317 if (player._listeners[type][lisenterIndex] == listener) { 318 player._listeners[type].slice(lisenterIndex, lisenterIndex + 1); 319 break; 320 } 321 } 322 } catch (err) { 323 jwplayer.html5.utils.log("error", err); 324 } 325 return false; 326 }; 327 } 328 329 330 /** Send an event **/ 331 function _sendEvent(player) { 332 return function(type, data) { 333 data = $.extend({ 334 id: player.id, 335 version: player.version 336 }, data); 337 if ((player._model.config.debug !== undefined) && (player._model.config.debug.toString().toLowerCase() == 'console')) { 338 jwplayer.html5.utils.log(type, data); 339 } 340 for (var listenerIndex in player._listeners[type]) { 341 try { 342 player._listeners[type][listenerIndex].listener(data); 343 } catch (err) { 344 jwplayer.html5.utils.log("There was an error while handling a listener", err); 345 } 346 if (player._listeners[type][listenerIndex].count === 1) { 347 delete player._listeners[type][listenerIndex]; 348 } else if (player._listeners[type][listenerIndex].count > 0) { 349 player._listeners[type][listenerIndex].count = player._listeners[type][listenerIndex].count - 1; 350 } 351 } 352 }; 353 } 354 173 } 174 return true; 175 } catch (err) { 176 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 177 } 178 return false; 179 } 180 181 182 /** Get / set the mute state of the player. **/ 183 function _setMute(state) { 184 try { 185 _model.getMedia().mute(state); 186 return true; 187 } catch (err) { 188 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 189 } 190 return false; 191 } 192 193 194 /** Resizes the video **/ 195 function _resize(width, height) { 196 try { 197 _model.width = width; 198 _model.height = height; 199 _view.resize(width, height); 200 return true; 201 } catch (err) { 202 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 203 } 204 return false; 205 } 206 207 208 /** Jumping the player to/from fullscreen. **/ 209 function _setFullscreen(state) { 210 try { 211 _model.fullscreen = state; 212 _view.fullscreen(state); 213 return true; 214 } catch (err) { 215 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 216 } 217 return false; 218 } 219 220 221 /** Loads a new video **/ 222 function _load(arg) { 223 try { 224 _model.loadPlaylist(arg); 225 _itemUpdated = true; 226 return true; 227 } catch (err) { 228 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 229 } 230 return false; 231 } 232 233 this.play = _play; 234 this.pause = _pause; 235 this.seek = _seek; 236 this.stop = _stop; 237 this.next = _next; 238 this.prev = _prev; 239 this.item = _item; 240 this.setVolume = _setVolume; 241 this.setMute = _setMute; 242 this.resize = _resize; 243 this.setFullscreen = _setFullscreen; 244 this.load = _load; 245 }; 355 246 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.defaultskin.js
r1277 r1278 6 6 */ 7 7 (function(jwplayer) { 8 9 jwplayer.html5.defaultSkin = '<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.0"><settings><setting name="backcolor" value="0xFFFFFF"/><setting name="frontcolor" value="0x000000"/><setting name="lightcolor" value="0x000000"/><setting name="screencolor" value="0x000000"/></settings><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/></settings><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFJJREFUeNrslLENwAAIwxLU/09j5AiOgD5hVQzNAVY8JK4qEfHMIKBnd2+BQlBINaiRtL/aV2rdzYBsM6CIONbI1NZENTr3RwdB2PlnJgJ6BRgA4hwu5Qg5iswAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhJREFUeNpiYqABYBo1dNRQ+hr6H4jvA3E8NS39j4SpZvh/LJig4YxEGEqy3kET+w+AOGFQRhTJhrEQkGcczfujhg4CQwECDADpTRWU/B3wHQAAAABJRU5ErkJggg=="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiYBgFo2DwA0YC8v/R1P4nRu+ooaOGUtnQUTAKhgIACDAAFCwQCfAJ4gwAAAAASUVORK5CYII="/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtJREFUeNpiYBgFo2Dog/9QDAPyQHweTYwiQ/2B+D0Wi8g2tB+JTdBQRiIMJVkvEy0iglhDF9Aq9uOpHVEwoE+NJDUKRsFgAAABBgDe2hqZcNNL0AAAAABJRU5ErkJggg=="/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUeNpiYBgFo2Dog/9AfB6I5dHE/lNqKAi/B2J/ahsKw/3EGMpIhKEk66WJoaR6fz61IyqemhEFSlL61ExSo2AUDAYAEGAAiG4hj+5t7M8AAAAASUVORK5CYII="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxJREFUeNpiYBgFo2AU0Bwwzluw+D8tLWARFhKiqQ9YuLg4aWsBGxs7bS1gZ6e5BWyjSX0UjIKhDgACDABlYQOGh5pYywAAAABJRU5ErkJggg=="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFo2AU0Bww1jc0/aelBSz8/Pw09QELOzs7bS1gY2OjrQWsrKy09gHraFIfBaNgqAOAAAMAvy0DChXHsZMAAAAASUVORK5CYII="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAClJREFUeNpiYBgFo2AU0BwwAvF/WlrARGsfjFow8BaMglEwCugAAAIMAOHfAQunR+XzAAAAAElFTkSuQmCC"/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAICAYAAAA870V8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABZJREFUeNpiZICA/yCCiQEJUJcDEGAAY0gBD1/m7Q0AAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiYBgFIw3MB+L/5Gj8j6yRiRTFyICJXHfTXyMLAXlGati4YDRFDj8AEGAABk8GSqqS4CoAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFgxz8p7bm+cQa+h8LHy7GhEcjIz4bmAjYykiun/8j0fakGPIfTfPgiSr6aB4FVAcAAQYAWdwR1G1Wd2gAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGpJREFUeNpi/P//PwM9ABMDncCoRYPfIqqDZcuW1UPp/6AUDcNM1DQYKtRAlaAj1mCSLSLXYIIWUctgDItoZfDA5aOoqKhGEANIM9LVR7SymGDQUctikuOIXkFNdhHEOFrDjlpEd4sAAgwAriRMub95fu8AAAAASUVORK5CYII="/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi/P//PwM9ABMDncCoRYPfIlqAeij9H5SiYZiqBqPTlFqE02BKLSLaYFItIttgQhZRzWB8FjENiuRJ7aAbsMQwYMl7wDIsWUUQ42gNO2oR3S0CCDAAKhKq6MLLn8oAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5JREFUeNpiYBgFo2DQA0YC8v/xqP1PjDlMRDrEgUgxkgHIlfZoriVGjmzLsLFHAW2D6D8eA/9Tw7L/BAwgJE90PvhPpNgoGAVDEQAEGAAMdhTyXcPKcAAAAABJRU5ErkJggg=="/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNpiYBgFo2DIg/9UUkOUAf8JiFFsyX88fJyAkcQgYMQjNkzBoAgiezyRbE+tFGSPxQJ7auYBmma0UTAKBhgABBgAJAEY6zON61sAAAAASUVORK5CYII="/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEpJREFUeNrszwENADAIA7DhX8ENoBMZ5KR10EryckCJiIiIiIiIiIiIiIiIiIiIiIh8GmkRERERERERERERERERERERERGRHSPAAPlXH1phYpYaAAAAAElFTkSuQmCC"/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNrs18ENgjAYhmFouDOCcQJGcARHgE10BDcgTOIosAGwQOuPwaQeuFRi2p/3Sb6EC5L3QCxZBgAAAOCorLW1zMn65TrlkH4NcV7QNcUQt7Gn7KIhxA+qNIR81spOGkL8oFJDyLJRdosqKDDkK+iX5+d7huzwM40xptMQMkjIOeRGo+VkEVvIPfTGIpKASfYIfT9iCHkHrBEzf4gcUQ56aEzuGK/mw0rHpy4AAACAf3kJMACBxjAQNRckhwAAAABJRU5ErkJggg=="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNrs1jEOgCAMBVAg7t5/8qaoIy4uoobyXsLCxA+0NCUAAADGUWvdQoQ41x4ixNBB2hBvBskdD3w5ZCkl3+33VqI0kjBBlh9rp+uTcyOP33TnolfsU85XX3yIRpQph8ZQY3wTZtU5AACASA4BBgDHoVuY1/fvOQAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWlJREFUeNrsl+1twjAQhsHq/7BBYQLYIBmBDcoGMAIjtBPQTcII2SDtBDBBwrU6pGsUO7YbO470PtKJkz9iH++d4ywWAAAAAABgljRNsyWr2bZzDuJG1rLdZhcMbTjrBCGDyUKsqQLFciJb9bSvuG/WagRVRUVUI6gqy5HVeKWfSgRyJruKIU//TrZTSn2nmlaXThrloi/v9F2STC1W4+Aw5cBzkquRc09bofFNc6YLxEON0VUZS5FPTftO49vMjRsIF3RhOGr7/D/pJw+FKU+q0vDyq8W42jCunDqI3LC5XxNj2wHLU1XjaRnb0Lhykhqhhd8MtSF5J9tbjCv4mXGvKJz/65FF/qJryyaaIvzP2QRxZTX2nTuXjvV/VPFSwyLnW7mpH99yTh1FEVro6JBSd40/pMrRdV8vPtcKl28T2pT8TnFZ4yNosct3Q0io6JfBiz1FlGdqVQH3VHnepAEAAAAAADDzEGAAcTwB10jWgxcAAAAASUVORK5CYII="/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAuhJREFUeNrsWr9rU1EUznuNGqvFQh1ULOhiBx0KDtIuioO4pJuik3FxFfUPaAV1FTdx0Q5d2g4FFxehTnEpZHFoBy20tCIWtGq0TZP4HfkeHB5N8m6Sl/sa74XDybvv3vvOd8/Pe4lXrVZT3dD8VJc0B8QBcUAcEAfESktHGeR5XtMfqFQq/f92zPe/NbtGlKTdCY30kuxrpMGO94BlQCXs+rbh3ONgA6BlzP1p20d80gEI5hmA2A92Qua1Q2PtAFISM+bvjMG8U+Q7oA3rQGASwrYCU6WpNdLGYbA+Pq5jjXIiwi8EEa2UDbQSaKOIuV+SlkcCrfjY8XTI9EpKGwP0C2kru2hLtHqa4zoXtZRWyvi4CLwv9Opr6Hkn6A9HKgEANsQ1iqC3Ub/vRUk2JgmRkatK36kVrnt0qObunwUdUUMXMWYpakJsO5Am8tAw2GBIgwWA+G2S2dMpiw0gDioQRQJoKhRb1QiDwlHZUABYbaXWsm5ae6loTE4ZDxN4CZar8foVzOJ2iyZ2kWF3t7YIevffaMT5yJ70kQb2fQ1sE5SHr2wazs2wgMxgbsEKEAgxAvZUJbQLBGTSBMgNrncJbA6AljtS/eKDJ0Ez+DmrQEzXS2h1Ck25kAg0IZcUOaydCy4sYnN2fOA+2AP16gNoHALlQ+fwH7XO4CxLenUpgj4xr6ugY2roPMbMx+Xs18m/E8CVEIhxsNeg83XWOAN6grG3lGbk8uE5fr4B/WH3cJw+co/l9nTYsSGYCJ/lY5/qv0thn6nrIWmjeJcPSnWOeY++AkF8tpJHIMAUs/MaBBpj3znZfQo5psY+ZrG4gv5HickjEOymKjEeRpgyST6IuZcTcWbnjcgdPi5ghxciRKsl1lDSsgwA1i8fssonJgzmTSqfGUkCENndNdAL7PS6QQ7ZYISTo+1qq0LEWjTWcvY4isa4z+yfQB+7ooyHVg5RI7/i1Ijn/vnggDggDogD4oC00P4KMACd/juEHOrS4AAAAABJRU5ErkJggg=="/></elements></component><component name="dock"><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFBJREFUeNrs0cEJACAQA8Eofu0fu/W6EM5ZSAFDRpKTBs00CQQEBAQEBAQEBAQEBAQEBATkK8iqbY+AgICAgICAgICAgICAgICAgIC86QowAG5PAQzEJ0lKAAAAAElFTkSuQmCC"/></elements></component><component name="playlist"><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNrs2NEJwCAMBcBYuv/CFuIE9VN47WWCR7iocXR3pdWdGPqqwIoMjYfQeAiNh9B4JHc6MHQVHnjggQceeOCBBx77TifyeOY0iHi8DqIdEY8dD5cL094eePzINB5CO/LwcOTptNB4CP25L4TIbZzpU7UEGAA5wz1uF5rF9AAAAABJRU5ErkJggg=="/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNrsy6ENACAMAMHClp2wYxZLAg5Fcu9e3OjuOKqqfTMzbs14CIZhGIZhGIZhGP4VLwEGAK/BBnVFpB0oAAAAAElFTkSuQmCC"/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNrsy7ENACAMBLE8++8caFFKKiRffU53112SGs3ttOohGIZhGIZhGIZh+Fe8BRgAiaUGde6NOSEAAAAASUVORK5CYII="/></elements></component></components></skin>'; 8 jwplayer.html5.defaultSkin = function() { 9 this.text = '<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.0"><settings><setting name="backcolor" value="0xFFFFFF"/><setting name="frontcolor" value="0x000000"/><setting name="lightcolor" value="0x000000"/><setting name="screencolor" value="0x000000"/></settings><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/></settings><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFJJREFUeNrslLENwAAIwxLU/09j5AiOgD5hVQzNAVY8JK4qEfHMIKBnd2+BQlBINaiRtL/aV2rdzYBsM6CIONbI1NZENTr3RwdB2PlnJgJ6BRgA4hwu5Qg5iswAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhJREFUeNpiYqABYBo1dNRQ+hr6H4jvA3E8NS39j4SpZvh/LJig4YxEGEqy3kET+w+AOGFQRhTJhrEQkGcczfujhg4CQwECDADpTRWU/B3wHQAAAABJRU5ErkJggg=="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiYBgFo2DwA0YC8v/R1P4nRu+ooaOGUtnQUTAKhgIACDAAFCwQCfAJ4gwAAAAASUVORK5CYII="/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtJREFUeNpiYBgFo2Dog/9QDAPyQHweTYwiQ/2B+D0Wi8g2tB+JTdBQRiIMJVkvEy0iglhDF9Aq9uOpHVEwoE+NJDUKRsFgAAABBgDe2hqZcNNL0AAAAABJRU5ErkJggg=="/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUeNpiYBgFo2Dog/9AfB6I5dHE/lNqKAi/B2J/ahsKw/3EGMpIhKEk66WJoaR6fz61IyqemhEFSlL61ExSo2AUDAYAEGAAiG4hj+5t7M8AAAAASUVORK5CYII="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxJREFUeNpiYBgFo2AU0Bwwzluw+D8tLWARFhKiqQ9YuLg4aWsBGxs7bS1gZ6e5BWyjSX0UjIKhDgACDABlYQOGh5pYywAAAABJRU5ErkJggg=="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFo2AU0Bww1jc0/aelBSz8/Pw09QELOzs7bS1gY2OjrQWsrKy09gHraFIfBaNgqAOAAAMAvy0DChXHsZMAAAAASUVORK5CYII="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAClJREFUeNpiYBgFo2AU0BwwAvF/WlrARGsfjFow8BaMglEwCugAAAIMAOHfAQunR+XzAAAAAElFTkSuQmCC"/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAICAYAAAA870V8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABZJREFUeNpiZICA/yCCiQEJUJcDEGAAY0gBD1/m7Q0AAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiYBgFIw3MB+L/5Gj8j6yRiRTFyICJXHfTXyMLAXlGati4YDRFDj8AEGAABk8GSqqS4CoAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFgxz8p7bm+cQa+h8LHy7GhEcjIz4bmAjYykiun/8j0fakGPIfTfPgiSr6aB4FVAcAAQYAWdwR1G1Wd2gAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGpJREFUeNpi/P//PwM9ABMDncCoRYPfIqqDZcuW1UPp/6AUDcNM1DQYKtRAlaAj1mCSLSLXYIIWUctgDItoZfDA5aOoqKhGEANIM9LVR7SymGDQUctikuOIXkFNdhHEOFrDjlpEd4sAAgwAriRMub95fu8AAAAASUVORK5CYII="/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi/P//PwM9ABMDncCoRYPfIlqAeij9H5SiYZiqBqPTlFqE02BKLSLaYFItIttgQhZRzWB8FjENiuRJ7aAbsMQwYMl7wDIsWUUQ42gNO2oR3S0CCDAAKhKq6MLLn8oAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5JREFUeNpiYBgFo2DQA0YC8v/xqP1PjDlMRDrEgUgxkgHIlfZoriVGjmzLsLFHAW2D6D8eA/9Tw7L/BAwgJE90PvhPpNgoGAVDEQAEGAAMdhTyXcPKcAAAAABJRU5ErkJggg=="/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNpiYBgFo2DIg/9UUkOUAf8JiFFsyX88fJyAkcQgYMQjNkzBoAgiezyRbE+tFGSPxQJ7auYBmma0UTAKBhgABBgAJAEY6zON61sAAAAASUVORK5CYII="/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEpJREFUeNrszwENADAIA7DhX8ENoBMZ5KR10EryckCJiIiIiIiIiIiIiIiIiIiIiIh8GmkRERERERERERERERERERERERGRHSPAAPlXH1phYpYaAAAAAElFTkSuQmCC"/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNrs18ENgjAYhmFouDOCcQJGcARHgE10BDcgTOIosAGwQOuPwaQeuFRi2p/3Sb6EC5L3QCxZBgAAAOCorLW1zMn65TrlkH4NcV7QNcUQt7Gn7KIhxA+qNIR81spOGkL8oFJDyLJRdosqKDDkK+iX5+d7huzwM40xptMQMkjIOeRGo+VkEVvIPfTGIpKASfYIfT9iCHkHrBEzf4gcUQ56aEzuGK/mw0rHpy4AAACAf3kJMACBxjAQNRckhwAAAABJRU5ErkJggg=="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNrs1jEOgCAMBVAg7t5/8qaoIy4uoobyXsLCxA+0NCUAAADGUWvdQoQ41x4ixNBB2hBvBskdD3w5ZCkl3+33VqI0kjBBlh9rp+uTcyOP33TnolfsU85XX3yIRpQph8ZQY3wTZtU5AACASA4BBgDHoVuY1/fvOQAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWlJREFUeNrsl+1twjAQhsHq/7BBYQLYIBmBDcoGMAIjtBPQTcII2SDtBDBBwrU6pGsUO7YbO470PtKJkz9iH++d4ywWAAAAAABgljRNsyWr2bZzDuJG1rLdZhcMbTjrBCGDyUKsqQLFciJb9bSvuG/WagRVRUVUI6gqy5HVeKWfSgRyJruKIU//TrZTSn2nmlaXThrloi/v9F2STC1W4+Aw5cBzkquRc09bofFNc6YLxEON0VUZS5FPTftO49vMjRsIF3RhOGr7/D/pJw+FKU+q0vDyq8W42jCunDqI3LC5XxNj2wHLU1XjaRnb0Lhykhqhhd8MtSF5J9tbjCv4mXGvKJz/65FF/qJryyaaIvzP2QRxZTX2nTuXjvV/VPFSwyLnW7mpH99yTh1FEVro6JBSd40/pMrRdV8vPtcKl28T2pT8TnFZ4yNosct3Q0io6JfBiz1FlGdqVQH3VHnepAEAAAAAADDzEGAAcTwB10jWgxcAAAAASUVORK5CYII="/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAuhJREFUeNrsWr9rU1EUznuNGqvFQh1ULOhiBx0KDtIuioO4pJuik3FxFfUPaAV1FTdx0Q5d2g4FFxehTnEpZHFoBy20tCIWtGq0TZP4HfkeHB5N8m6Sl/sa74XDybvv3vvOd8/Pe4lXrVZT3dD8VJc0B8QBcUAcEAfESktHGeR5XtMfqFQq/f92zPe/NbtGlKTdCY30kuxrpMGO94BlQCXs+rbh3ONgA6BlzP1p20d80gEI5hmA2A92Qua1Q2PtAFISM+bvjMG8U+Q7oA3rQGASwrYCU6WpNdLGYbA+Pq5jjXIiwi8EEa2UDbQSaKOIuV+SlkcCrfjY8XTI9EpKGwP0C2kru2hLtHqa4zoXtZRWyvi4CLwv9Opr6Hkn6A9HKgEANsQ1iqC3Ub/vRUk2JgmRkatK36kVrnt0qObunwUdUUMXMWYpakJsO5Am8tAw2GBIgwWA+G2S2dMpiw0gDioQRQJoKhRb1QiDwlHZUABYbaXWsm5ae6loTE4ZDxN4CZar8foVzOJ2iyZ2kWF3t7YIevffaMT5yJ70kQb2fQ1sE5SHr2wazs2wgMxgbsEKEAgxAvZUJbQLBGTSBMgNrncJbA6AljtS/eKDJ0Ez+DmrQEzXS2h1Ck25kAg0IZcUOaydCy4sYnN2fOA+2AP16gNoHALlQ+fwH7XO4CxLenUpgj4xr6ugY2roPMbMx+Xs18m/E8CVEIhxsNeg83XWOAN6grG3lGbk8uE5fr4B/WH3cJw+co/l9nTYsSGYCJ/lY5/qv0thn6nrIWmjeJcPSnWOeY++AkF8tpJHIMAUs/MaBBpj3znZfQo5psY+ZrG4gv5HickjEOymKjEeRpgyST6IuZcTcWbnjcgdPi5ghxciRKsl1lDSsgwA1i8fssonJgzmTSqfGUkCENndNdAL7PS6QQ7ZYISTo+1qq0LEWjTWcvY4isa4z+yfQB+7ooyHVg5RI7/i1Ijn/vnggDggDogD4oC00P4KMACd/juEHOrS4AAAAABJRU5ErkJggg=="/></elements></component><component name="dock"><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFBJREFUeNrs0cEJACAQA8Eofu0fu/W6EM5ZSAFDRpKTBs00CQQEBAQEBAQEBAQEBAQEBATkK8iqbY+AgICAgICAgICAgICAgICAgIC86QowAG5PAQzEJ0lKAAAAAElFTkSuQmCC"/></elements></component><component name="playlist"><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNrs2NEJwCAMBcBYuv/CFuIE9VN47WWCR7iocXR3pdWdGPqqwIoMjYfQeAiNh9B4JHc6MHQVHnjggQceeOCBBx77TifyeOY0iHi8DqIdEY8dD5cL094eePzINB5CO/LwcOTptNB4CP25L4TIbZzpU7UEGAA5wz1uF5rF9AAAAABJRU5ErkJggg=="/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNrsy6ENACAMAMHClp2wYxZLAg5Fcu9e3OjuOKqqfTMzbs14CIZhGIZhGIZhGP4VLwEGAK/BBnVFpB0oAAAAAElFTkSuQmCC"/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNrsy7ENACAMBLE8++8caFFKKiRffU53112SGs3ttOohGIZhGIZhGIZh+Fe8BRgAiaUGde6NOSEAAAAASUVORK5CYII="/></elements></component></components></skin>'; 10 this.xml = null; 11 12 //http://www.w3schools.com/Dom/dom_parser.asp 13 if (window.DOMParser) { 14 parser = new DOMParser(); 15 this.xml = parser.parseFromString(this.text, "text/xml"); 16 } else { 17 //IE 18 this.xml = new ActiveXObject("Microsoft.XMLDOM"); 19 this.xml.async = "false"; 20 this.xml.loadXML(this.text); 21 } 22 return this; 23 }; 10 24 11 25 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.display.js
r1277 r1278 1 1 /** 2 * JW Player viewcomponent2 * JW Player display component 3 3 * 4 4 * @author zach 5 5 * @version 1.0 6 6 */ 7 (function(jwplayer) { 8 9 var _logoDefaults = { 10 prefix: "http://l.longtailvideo.com/html5/0/", 11 file: "logo.png", 12 link: "http://www.longtailvideo.com/players/jw-flv-player/", 13 margin: 8, 14 out: 0.5, 15 over: 1, 16 timeout: 3, 17 hide: "true", 18 position: "bottom-left", 19 width: 93, 20 height: 30 7 (function(jwplayer) { 8 _css = jwplayer.html5.utils.css; 9 10 _hide = function(element) { 11 _css(element, { 12 display: "none" 13 }); 21 14 }; 22 15 23 var _display; 24 25 jwplayer.html5.display = function(player) { 26 if (_display === undefined) { 27 _display = {}; 28 _display.elements = _initializeDisplayElements(player); 29 _setupDisplay(player); 30 player.addEventListener(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, _stateHandler(player)); 31 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, _stateHandler(player)); 32 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_ERROR, function(obj) { 33 }); 34 } 16 _show = function(element) { 17 _css(element, { 18 display: "block" 19 }); 35 20 }; 36 21 37 function _setupDisplay(player) { 38 var html = []; 39 html.push("<div id='" + player.id + "_display'" + _getStyle(player, 'display') + ">"); 40 html.push("<div id='" + player.id + "_displayImage'" + _getStyle(player, 'displayImage') + "> </div>"); 41 html.push("<div id='" + player.id + "_displayIconBackground'" + _getStyle(player, 'displayIconBackground') + ">"); 42 html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + _getStyle(player, 'displayIcon') + "/>"); 43 html.push('</div>'); 44 html.push('<div id="' + player.id + '_logo" target="_blank"' + _getStyle(player, 'logo') + '> </div>'); 45 html.push('</div>'); 46 player._model.domelement.before(html.join('')); 47 _display.display = $("#"+player.id + "_display"); 48 _display.displayImage = $("#"+player.id + "_displayImage"); 49 _display.displayIcon = $("#"+player.id + "_displayIcon"); 50 _display.displayIconBackground = $("#"+player.id + "_displayIconBackground"); 51 _display.logo = $("#"+player.id + "_logo"); 52 _setupDisplayElements(player); 53 } 54 55 56 function _getStyle(player, element) { 57 var result = ''; 58 for (var style in _display.elements[element].style) { 59 result += style + ":" + _display.elements[element].style[style] + ";"; 60 } 61 if (result === '') { 62 return ' '; 63 } 64 return ' style="' + result + '" '; 65 } 66 67 68 function _setupDisplayElements(player) { 69 var displayElements = _initializeDisplayElements(player); 70 for (var element in displayElements) { 71 var elementId = ['#', player.id, '_', element]; 72 _display[element] = $(elementId.join('')); 73 if (displayElements[element].click !== undefined) { 74 _display[element].click(displayElements[element].click); 75 } 76 } 77 } 78 79 80 function _initializeDisplayElements(player) { 81 var elements = { 82 display: { 83 style: { 84 cursor: 'pointer', 85 width: player.getWidth() + "px", 86 height: player.getHeight() + "px", 87 position: 'relative', 88 'z-index': 50, 89 margin: 0, 90 padding: 0 22 jwplayer.html5.display = function(api, config) { 23 var _api = api; 24 var _display = {}; 25 var _width; 26 var _height; 27 var _degreesRotated; 28 var _rotationInterval; 29 var _bufferRotation = _api.skin.getComponentSettings("display").bufferrotation === undefined ? 15 : parseInt(_api.skin.getComponentSettings("display").bufferrotation, 10); 30 var _bufferInterval = _api.skin.getComponentSettings("display").bufferinterval === undefined ? 100 : parseInt(_api.skin.getComponentSettings("display").bufferinterval, 10); 31 var _elements = { 32 display: { 33 style: { 34 cursor: "pointer" 35 }, 36 click: _displayClickHandler 91 37 }, 92 click: _displayClickHandler(player) 93 }, 94 displayIcon: { 95 style: { 96 cursor: 'pointer', 97 position: 'absolute', 98 top: ((player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2) + "px", 99 left: ((player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2) + "px", 100 border: 0, 101 margin: 0, 102 padding: 0 38 display_icon: { 39 style: { 40 cursor: "pointer", 41 position: "absolute", 42 top: ((_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", "playIcon").height) / 2), 43 left: ((_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", "playIcon").width) / 2), 44 border: 0, 45 margin: 0, 46 padding: 0 47 } 48 }, 49 display_iconBackground: { 50 style: { 51 cursor: "pointer", 52 position: "absolute", 53 top: ((_height - _api.skin.getSkinElement("display", "background").height) / 2), 54 left: ((_width - _api.skin.getSkinElement("display", "background").width) / 2), 55 border: 0, 56 backgroundImage: (["url(", _api.skin.getSkinElement("display", "background").src, ")"]).join(""), 57 width: _api.skin.getSkinElement("display", "background").width, 58 height: _api.skin.getSkinElement("display", "background").height, 59 margin: 0, 60 padding: 0 61 } 62 }, 63 display_image: { 64 style: { 65 display: "block", 66 width: _width, 67 height: _height, 68 position: "absolute", 69 cursor: "pointer", 70 left: 0, 71 top: 0, 72 margin: 0, 73 padding: 0, 74 textDecoration: "none" 75 } 103 76 } 104 }, 105 displayIconBackground: { 106 style: { 107 cursor: 'pointer', 108 position: 'absolute', 109 top: ((player.getHeight() - player.skin.display.elements.background.height) / 2) + "px", 110 left: ((player.getWidth() - player.skin.display.elements.background.width) / 2) + "px", 111 border: 0, 112 'background-image': (['url(', player.skin.display.elements.background.src, ')']).join(''), 113 width: player.skin.display.elements.background.width + "px", 114 height: player.skin.display.elements.background.height + "px", 115 margin: 0, 116 padding: 0 77 }; 78 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 79 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _stateHandler); 80 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, _stateHandler); 81 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_ERROR, function(obj) { 82 }); 83 _setupDisplay(); 84 85 86 function _setupDisplay() { 87 _display.display = createElement("div", "display"); 88 _display.display_image = createElement("div", "display_image"); 89 _display.display_icon = createElement("div", "display_icon"); 90 _display.display_iconBackground = createElement("div", "display_iconBackground"); 91 _display.display.appendChild(_display.display_image); 92 _display.display_iconBackground.appendChild(_display.display_icon); 93 _display.display.appendChild(_display.display_iconBackground); 94 _setupDisplayElements(); 95 } 96 97 98 this.getDisplayElement = function() { 99 return _display.display; 100 }; 101 102 this.resize = function(width, height) { 103 _width = width; 104 _height = height; 105 _css(_display.display, { 106 width: width, 107 height: height 108 }); 109 _css(_display.display_image, { 110 width: width, 111 height: height 112 }); 113 _css(_display.display_iconBackground, { 114 top: ((_height - _api.skin.getSkinElement("display", "background").height) / 2), 115 left: ((_width - _api.skin.getSkinElement("display", "background").width) / 2) 116 }); 117 _stateHandler({}); 118 }; 119 120 function createElement(tag, element) { 121 var _element = document.createElement(tag); 122 _element.id = _api.id + "_jwplayer_" + element; 123 _css(_element, _elements[element].style); 124 return _element; 125 } 126 127 function _getStyle(element) { 128 var result = ''; 129 for (var style in _elements[element].style) { 130 result += style + ":" + _elements[element].style[style] + ";"; 131 } 132 if (result === '') { 133 return ' '; 134 } 135 return ' style="' + result + '" '; 136 } 137 138 139 function _setupDisplayElements() { 140 for (var element in _display) { 141 if (_elements[element].click !== undefined) { 142 _display[element].onclick = _elements[element].click; 117 143 } 118 }, 119 displayImage: { 120 style: { 121 display: 'block', 122 background: ([player._model.config.screencolor, ' url(', jwplayer.html5.utils.getAbsolutePath(player.getConfig().image), ') no-repeat center center']).join(''), 123 width: player.getWidth() + "px", 124 height: player.getHeight() + "px", 125 position: 'absolute', 126 cursor: 'pointer', 127 left: 0, 128 top: 0, 129 margin: 0, 130 padding: 0, 131 'text-decoration': 'none' 132 } 133 }, 134 logo: { 135 style: { 136 position: 'absolute', 137 width: _logoDefaults.width + "px", 138 height: _logoDefaults.height + "px", 139 'background-image': (['url(', _logoDefaults.prefix, _logoDefaults.file, ')']).join(''), 140 margin: 0, 141 padding: 0, 142 display: 'none', 143 'text-decoration': 'none' 144 }, 145 click: _logoClickHandler() 146 } 147 }; 148 var positions = _logoDefaults.position.split("-"); 149 for (var position in positions) { 150 elements.logo.style[positions[position]] = _logoDefaults.margin + "px"; 151 } 152 return elements; 153 } 154 155 156 function _displayClickHandler(player) { 157 return function(evt) { 158 if (player._media === undefined) { 159 document.location.href = jwplayer.html5.utils.getAbsolutePath(player.getPlaylist()[player.getConfig().item].sources[0]); 160 return; 161 } 162 if (typeof evt.preventDefault != 'undefined') { 144 } 145 } 146 147 148 function _displayClickHandler(evt) { 149 if (typeof evt.preventDefault != "undefined") { 163 150 evt.preventDefault(); // W3C 164 151 } else { 165 152 evt.returnValue = false; // IE 166 153 } 167 if ( player.getState() != jwplayer.html5.states.PLAYING) {168 player.play();154 if (_api.jwGetState() != jwplayer.api.events.state.PLAYING) { 155 _api.jwPlay(); 169 156 } else { 170 player.pause(); 171 } 172 }; 173 } 174 175 176 function _logoClickHandler() { 177 return function(evt) { 178 evt.stopPropagation(); 179 return; 180 }; 181 } 182 183 184 function _setIcon(player, path) { 185 $("#" + player.id + "_displayIcon")[0].src = path; 186 } 187 188 189 function _animate(element, state) { 190 var speed = 'slow'; 191 if (!_display.animate) { 192 return; 193 } 194 if (state) { 195 element.slideDown(speed, function() { 196 _animate(element); 197 }); 198 } else { 199 element.slideUp(speed, function() { 200 _animate(element, true); 201 }); 202 } 203 } 204 205 206 function _stateHandler(player) { 207 return function(obj) { 208 _display.animate = false; 209 switch (player.getState()) { 210 case jwplayer.html5.states.BUFFERING: 211 _display.logo.fadeIn(0, function() { 212 setTimeout(function() { 213 _display.logo.fadeOut(_logoDefaults.out * 1000); 214 }, _logoDefaults.timeout * 1000); 157 _api.jwPause(); 158 } 159 } 160 161 162 function _setDisplayIcon(newIcon) { 163 _show(_display.display_iconBackground); 164 _display.display_icon.style.backgroundImage = (["url(", _api.skin.getSkinElement("display", newIcon).src, ")"]).join(""); 165 _css(_display.display_icon, { 166 display: "block", 167 width: _api.skin.getSkinElement("display", newIcon).width, 168 height: _api.skin.getSkinElement("display", newIcon).height, 169 top: (_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", newIcon).height) / 2, 170 left: (_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", newIcon).width) / 2 171 }); 172 if (_api.skin.getSkinElement("display", newIcon + "Over") !== undefined) { 173 _display.display_icon.onmouseover = function(evt) { 174 evt.stopPropagation(); 175 _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon + "Over").src, ")"].join(""); 176 }; 177 _display.display_icon.onmouseout = function(evt) { 178 evt.stopPropagation(); 179 _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon).src, ")"].join(""); 180 }; 181 } else { 182 _display.display_icon.onmouseover = undefined; 183 _display.display_icon.onmouseout = undefined; 184 } 185 } 186 187 function _hideDisplayIcon() { 188 _hide(_display.display_icon); 189 _hide(_display.display_iconBackground); 190 } 191 192 function _stateHandler(obj) { 193 if (_rotationInterval !== undefined) { 194 clearInterval(_rotationInterval); 195 _rotationInterval = undefined; 196 jwplayer.html5.utils.animations.rotate(_display.display_icon, 0); 197 } 198 switch (_api.jwGetState()) { 199 case jwplayer.api.events.state.BUFFERING: 200 _setDisplayIcon("bufferIcon"); 201 _degreesRotated = 0; 202 _rotationInterval = setInterval(function() { 203 _degreesRotated += _bufferRotation; 204 jwplayer.html5.utils.animations.rotate(_display.display_icon, _degreesRotated % 360); 205 }, _bufferInterval); 206 _setDisplayIcon("bufferIcon"); 207 break; 208 case jwplayer.api.events.state.PAUSED: 209 _css(_display.display_image, { 210 background: "transparent no-repeat center center" 215 211 }); 216 _display.displayIcon[0].src = player.skin.display.elements.bufferIcon.src; 217 _display.displayIcon.css({ 218 "display": "block", 219 top: (player.skin.display.elements.background.height - player.skin.display.elements.bufferIcon.height) / 2 + "px", 220 left: (player.skin.display.elements.background.width - player.skin.display.elements.bufferIcon.width) / 2 + "px" 212 _show(_display.display_iconBackground); 213 _setDisplayIcon("playIcon"); 214 break; 215 case jwplayer.api.events.state.IDLE: 216 var background = _api.jwGetPlaylist()[_api.jwGetItem()].image === "" ? "" : " url(" + jwplayer.html5.utils.getAbsolutePath(_api.jwGetPlaylist()[_api.jwGetItem()].image) + ")"; 217 _css(_display.display_image, { 218 background: background + " no-repeat center center" 221 219 }); 222 _display.animate = true; 223 // TODO: Buffer Icon rotation 224 if (false) { 225 _animate(_display.displayIconBackground); 226 } 227 _display.displayIconBackground.css('display', 'none'); 228 break; 229 case jwplayer.html5.states.PAUSED: 230 _display.logo.fadeIn(0); 231 _display.displayImage.css("background", "transparent no-repeat center center"); 232 _display.displayIconBackground.css("display", "block"); 233 _display.displayIcon[0].src = player.skin.display.elements.playIcon.src; 234 _display.displayIcon.css({ 235 "display": "block", 236 top: (player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2 + "px", 237 left: (player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2 + "px" 238 }); 239 break; 240 case jwplayer.html5.states.IDLE: 241 _display.logo.fadeOut(0); 242 _display.displayImage.css("background", player._model.config.screencolor + " url('" + jwplayer.html5.utils.getAbsolutePath(player.getConfig().image) + "') no-repeat center center"); 243 _display.displayIconBackground.css("display", "block"); 244 _display.displayIcon[0].src = player.skin.display.elements.playIcon.src; 245 _display.displayIcon.css({ 246 "display": "block", 247 top: (player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2 + "px", 248 left: (player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2 + "px" 249 }); 220 _show(_display.display_iconBackground); 221 _setDisplayIcon("playIcon"); 250 222 break; 251 223 default: 252 if (player.getMute()) { 253 _display.displayImage.css("background", "transparent no-repeat center center"); 254 _display.displayIconBackground.css("display", "block"); 255 _display.displayIcon[0].src = player.skin.display.elements.muteIcon.src; 256 _display.displayIcon.css({ 257 "display": "block", 258 top: (player.skin.display.elements.muteIcon.height - player.skin.display.elements.muteIcon.height) / 2 + "px", 259 left: (player.skin.display.elements.background.width - player.skin.display.elements.muteIcon.width) / 2 + "px" 224 if (_api.jwGetMute()) { 225 _css(_display.display_image, { 226 background: "transparent no-repeat center center" 260 227 }); 228 _show(_display.display_iconBackground); 229 _setDisplayIcon("muteIcon"); 230 261 231 } else { 262 try { 263 _display.logo.clearQueue(); 264 } catch (err) { 265 266 } 267 _display.logo.fadeIn(0, function() { 268 setTimeout(function() { 269 _display.logo.fadeOut(_logoDefaults.out * 1000); 270 }, _logoDefaults.timeout * 1000); 232 _css(_display.display_image, { 233 background: "transparent no-repeat center center" 271 234 }); 272 _display.displayImage.css("background", "transparent no-repeat center center"); 273 _display.displayIconBackground.css("display", "none"); 274 _display.displayIcon.css("display", "none"); 275 } 276 break; 277 } 278 }; 279 } 280 281 })(jwplayer); 235 _hide(_display.display_iconBackground); 236 _hide(_display.display_icon); 237 } 238 break; 239 } 240 } 241 242 return this; 243 }; 244 245 246 247 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.js
r1277 r1278 6 6 */ 7 7 (function(jwplayer) { 8 var _player = { 9 id: undefined, 10 version: "1.0", 11 skin: undefined, 12 _model: undefined, 13 _view: undefined, 14 _controller: undefined, 15 _listeners: {}, 16 _media: undefined, 17 _domelement: undefined 8 jwplayer.html5 = function(container) { 9 var _container = container; 10 11 this.setup = function(options) { 12 jwplayer.utils.extend(this, new jwplayer.html5.api(_container, options)); 13 return this; 14 }; 15 16 return this; 18 17 }; 19 18 20 jwplayer.html5 = function(domelement) { 21 _player._domelement = domelement; 22 _player.id = domelement.id; 23 _player.setup = setup; 24 return _player; 25 }; 26 27 function setup (options) { 28 jwplayer.html5.utils.log("Starting setup", _player); 29 _setup(_player, 0, options); 30 return _player; 31 } 32 33 function _setup(player, step, options) { 34 //try { 35 switch (step) { 36 case 0: 37 player._model = new jwplayer.html5.model(options); 38 player._model.domelement = $('#'+_player.id); 39 _setup(player, step + 1); 40 break; 41 case 1: 42 player._controller = jwplayer.html5.controller(player); 43 _setup($.extend(player, jwplayer.html5._api(player)), step + 1); 44 break; 45 case 2: 46 jwplayer.html5.skinner(player, function() { 47 _setup(player, step + 1); 48 }); 49 break; 50 case 3: 51 jwplayer.html5.view(player); 52 _setup(player, step + 1); 53 break; 54 case 4: 55 jwplayer.html5.model.setActiveMediaProvider(player); 56 if ((player._media === undefined) || !player._media.hasChrome) { 57 _setup(player, step + 1); 58 } 59 break; 60 case 5: 61 jwplayer.html5.display(player, player._model.domelement); 62 if (player._media === undefined) { 63 player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 64 } else { 65 _setup(player, step + 1); 66 } 67 break; 68 case 6: 69 jwplayer.html5.controlbar(player, player._model.domelement); 70 _setup(player, step + 1); 71 break; 72 case 7: 73 player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 74 _setup(player, step + 1); 75 break; 76 default: 77 if (player.getConfig().autostart === true) { 78 player.play(); 79 } 80 break; 81 } 82 //} catch (err) { 83 // jwplayer.html5.utils.log("Setup failed at step " + step, err); 84 //} 85 } 19 jwplayer.html5.version = '1.0'; 86 20 })(jwplayer); 87 21 -
trunk/html5/src/html5/jwplayer.html5.mediavideo.js
r1277 r1278 8 8 9 9 var _states = { 10 "ended": jwplayer. html5.states.IDLE,11 "playing": jwplayer. html5.states.PLAYING,12 "pause": jwplayer. html5.states.PAUSED,13 "buffering": jwplayer. html5.states.BUFFERING10 "ended": jwplayer.api.events.state.IDLE, 11 "playing": jwplayer.api.events.state.PLAYING, 12 "pause": jwplayer.api.events.state.PAUSED, 13 "buffering": jwplayer.api.events.state.BUFFERING 14 14 }; 15 15 16 var _events = { 17 'abort': _generalHandler, 18 'canplay': _stateHandler, 19 'canplaythrough': _stateHandler, 20 'durationchange': _metaHandler, 21 'emptied': _generalHandler, 22 'ended': _stateHandler, 23 'error': _errorHandler, 24 'loadeddata': _metaHandler, 25 'loadedmetadata': _metaHandler, 26 'loadstart': _stateHandler, 27 'pause': _stateHandler, 28 'play': _positionHandler, 29 'playing': _stateHandler, 30 'progress': _progressHandler, 31 'ratechange': _generalHandler, 32 'seeked': _stateHandler, 33 'seeking': _stateHandler, 34 'stalled': _stateHandler, 35 'suspend': _stateHandler, 36 'timeupdate': _positionHandler, 37 'volumechange': _generalHandler, 38 'waiting': _stateHandler, 39 'canshowcurrentframe': _generalHandler, 40 'dataunavailable': _generalHandler, 41 'empty': _generalHandler, 42 'load': _generalHandler, 43 'loadedfirstframe': _generalHandler 44 }; 16 var _css = jwplayer.html5.utils.css; 45 17 46 var _domelement; 47 var _jdomelement; 48 var _bufferFull; 49 var _bufferingComplete; 50 var _state = jwplayer.html5.states.IDLE; 51 var _interval; 52 var _stopped; 53 54 jwplayer.html5.mediavideo = function(player) { 55 _domelement = player._domelement; 56 _jdomelement = $(_domelement); 57 _jdomelement.attr('loop', player._model.config.repeat); 58 var media = { 59 play: _play(player), 60 pause: _pause(player), 61 seek: _seek(player), 62 stop: _stop(player), 63 volume: _volume(player), 64 mute: _mute(player), 65 fullscreen: _fullscreen(player), 66 load: _load(player), 67 resize: _resize(player), 68 getState: _getState, 69 interval: null, 70 loadcount: 0, 71 hasChrome: false 72 }; 73 media.mute(player.getMute()); 74 media.volume(player.getVolume()); 75 return media; 76 }; 77 78 function _getState(){ 79 return _state; 80 } 81 82 function _generalHandler(event, player) { 83 } 84 85 function _stateHandler(event, player) { 86 if (_states[event.type]) { 87 _setState(player, _states[event.type]); 88 } 89 } 90 91 function _setState(player, newstate) { 92 if (_stopped) { 93 newstate = jwplayer.html5.states.IDLE; 94 } 95 if (_state != newstate) { 96 var oldstate = _state; 97 _state = newstate; 98 player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, { 99 oldstate: oldstate, 100 newstate: newstate 18 jwplayer.html5.mediavideo = function(model, container) { 19 var _events = { 20 'abort': _generalHandler, 21 'canplay': _stateHandler, 22 'canplaythrough': _stateHandler, 23 'durationchange': _metaHandler, 24 'emptied': _generalHandler, 25 'ended': _stateHandler, 26 'error': _errorHandler, 27 'loadeddata': _metaHandler, 28 'loadedmetadata': _metaHandler, 29 'loadstart': _stateHandler, 30 'pause': _stateHandler, 31 'play': _positionHandler, 32 'playing': _stateHandler, 33 'progress': _progressHandler, 34 'ratechange': _generalHandler, 35 'seeked': _stateHandler, 36 'seeking': _stateHandler, 37 'stalled': _stateHandler, 38 'suspend': _stateHandler, 39 'timeupdate': _positionHandler, 40 'volumechange': _generalHandler, 41 'waiting': _stateHandler, 42 'canshowcurrentframe': _generalHandler, 43 'dataunavailable': _generalHandler, 44 'empty': _generalHandler, 45 'load': _loadHandler, 46 'loadedfirstframe': _generalHandler 47 }; 48 var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 49 jwplayer.utils.extend(this, _eventDispatcher); 50 var _model = model; 51 var _container = container; 52 var _bufferFull; 53 var _bufferingComplete; 54 var _state = jwplayer.api.events.state.IDLE; 55 var _interval = null; 56 var _stopped; 57 var _loadcount = 0; 58 var _start = false; 59 var hasChrome = false; 60 61 function _getState() { 62 return _state; 63 } 64 65 function _loadHandler(evt) { 66 } 67 68 function _generalHandler(event) { 69 } 70 71 function _stateHandler(event) { 72 if (_states[event.type]) { 73 _setState(_states[event.type]); 74 } 75 } 76 77 function _setState(newstate) { 78 if (_stopped) { 79 newstate = jwplayer.api.events.state.IDLE; 80 } 81 if (_state != newstate) { 82 var oldstate = _state; 83 _model.state = newstate; 84 _state = newstate; 85 if (newstate == jwplayer.api.events.state.IDLE) { 86 _clearInterval(); 87 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE); 88 89 if (_container.style.display != 'none') { 90 _container.style.display = 'none'; 91 } 92 } 93 94 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, { 95 oldstate: oldstate, 96 newstate: newstate 97 }); 98 } 99 _stopped = false; 100 } 101 102 103 function _metaHandler(event) { 104 var meta = { 105 height: event.target.videoHeight, 106 width: event.target.videoWidth, 107 duration: event.target.duration 108 }; 109 if (_model.duration === 0) { 110 _model.duration = event.target.duration; 111 } 112 _model.playlist[_model.item] = jwplayer.utils.extend(_model.playlist[_model.item], meta); 113 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_META, { 114 metadata: meta 101 115 }); 102 116 } 103 if (newstate == jwplayer.html5.states.IDLE) { 117 118 119 function _positionHandler(event) { 120 if (_stopped) { 121 return; 122 } 123 124 if (event !== undefined && event.target !== undefined) { 125 if (_model.duration === 0) { 126 _model.duration = event.target.duration; 127 } 128 129 if (_state == jwplayer.api.events.state.PLAYING) { 130 if (!_start && _container.readyState > 0) { 131 _start = true; 132 _container.currentTime = _model.playlist[_model.item].start; 133 _container.volume = _model.volume / 100; 134 _container.muted = _model.mute; 135 } 136 _model.position = Math.round(event.target.currentTime * 10) / 10; 137 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_TIME, { 138 position: Math.round(event.target.currentTime * 10) / 10, 139 duration: Math.round(event.target.duration * 10) / 10 140 }); 141 } 142 } 143 _progressHandler(event); 144 } 145 146 147 function _progressHandler(event) { 148 var bufferPercent, bufferTime; 149 if (event !== undefined && event.lengthComputable && event.total) { 150 bufferPercent = event.loaded / event.total * 100; 151 bufferTime = bufferPercent / 100 * (_model.duration - _container.currentTime); 152 } else if ((_container.buffered !== undefined) && (_container.buffered.length > 0)) { 153 maxBufferIndex = 0; 154 if (maxBufferIndex >= 0) { 155 bufferPercent = _container.buffered.end(maxBufferIndex) / _container.duration * 100; 156 bufferTime = _container.buffered.end(maxBufferIndex) - _container.currentTime; 157 } 158 } 159 160 if (_bufferFull === false) { 161 _bufferFull = true; 162 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL); 163 } 164 165 if (!_bufferingComplete) { 166 if (bufferPercent == 100 && _bufferingComplete === false) { 167 _bufferingComplete = true; 168 } 169 170 if (bufferPercent !== null && (bufferPercent > _model.buffer)) { 171 _model.buffer = Math.round(bufferPercent); 172 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, { 173 bufferPercent: Math.round(bufferPercent) 174 }); 175 } 176 177 } 178 } 179 180 181 function _startInterval() { 182 if (_interval === null) { 183 _interval = setInterval(function() { 184 _positionHandler(); 185 }, 100); 186 } 187 } 188 189 function _clearInterval() { 104 190 clearInterval(_interval); 105 191 _interval = null; 106 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE); 107 if (player._model.config.repeat && !_stopped) { 108 player.play(); 109 } 110 if (_jdomelement.css('display') != 'none') { 111 _jdomelement.css('display', 'none'); 112 } 113 } 114 _stopped = false; 115 } 116 117 118 function _metaHandler(event, player) { 119 var meta = { 120 height: event.target.videoHeight, 121 width: event.target.videoWidth, 122 duration: event.target.duration 123 }; 124 if (player._model.duration === 0) { 125 player._model.duration = event.target.duration; 126 } 127 player._model.playlist[player._model.item] = $.extend(player._model.playlist[player._model.item], meta); 128 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_META, meta); 129 } 130 131 132 function _positionHandler(event, player) { 133 if (_stopped) { 134 return; 135 } 136 if (!jwplayer.html5.utils.isNull(event.target)) { 137 if (player._model.duration === 0) { 138 player._model.duration = event.target.duration; 139 } 140 141 if (_state == jwplayer.html5.states.PLAYING) { 142 player._model.position = Math.round(event.target.currentTime * 10) / 10; 143 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, { 144 position: Math.round(event.target.currentTime * 10) / 10, 145 duration: Math.round(event.target.duration * 10) / 10 192 } 193 194 function _errorHandler(event) { 195 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, event.target); 196 } 197 198 this.getDisplayElement = function() { 199 return _container; 200 }; 201 202 this.play = function() { 203 if (_state != jwplayer.api.events.state.PLAYING) { 204 if (_container.style.display != "block") { 205 _container.style.display = "block"; 206 } 207 _container.play(); 208 _setState(jwplayer.api.events.state.PLAYING); 209 _startInterval(); 210 } 211 }; 212 213 214 /** Switch the pause state of the player. **/ 215 this.pause = function() { 216 _container.pause(); 217 _setState(jwplayer.api.events.state.PAUSED); 218 }; 219 220 221 /** Seek to a position in the video. **/ 222 this.seek = function(position) { 223 _container.currentTime = position; 224 _container.play(); 225 }; 226 227 228 /** Stop playback and loading of the video. **/ 229 this.stop = function() { 230 _stopped = true; 231 _container.pause(); 232 _clearInterval(); 233 _model.position = 0; 234 _setState(jwplayer.api.events.state.IDLE); 235 }; 236 237 238 /** Change the video's volume level. **/ 239 this.volume = function(position) { 240 _container.volume = position / 100; 241 _model.volume = position; 242 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, { 243 volume: Math.round(position) 244 }); 245 }; 246 247 248 /** Switch the mute state of the player. **/ 249 this.mute = function(state) { 250 _container.muted = state; 251 _model.mute = state; 252 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, { 253 mute: state 254 }); 255 }; 256 257 258 /** Resize the player. **/ 259 this.resize = function(width, height) { 260 if (false) { 261 _css(_container, { 262 width: width, 263 height: height 146 264 }); 147 265 } 148 } 149 _progressHandler({}, player); 150 } 151 152 153 function _progressHandler(event, player) { 154 var bufferPercent, bufferTime, bufferFill; 155 if (!isNaN(event.loaded / event.total)) { 156 bufferPercent = event.loaded / event.total * 100; 157 bufferTime = bufferPercent / 100 * (player._model.duration - _domelement.currentTime); 158 } else if ((_domelement.buffered !== undefined) && (_domelement.buffered.length > 0)) { 159 maxBufferIndex = 0; 160 if (maxBufferIndex >= 0) { 161 bufferPercent = _domelement.buffered.end(maxBufferIndex) / _domelement.duration * 100; 162 bufferTime = _domelement.buffered.end(maxBufferIndex) - _domelement.currentTime; 163 } 164 } 165 166 bufferFill = bufferTime / player._model.config.bufferlength * 100; 167 168 // TODO: Buffer underrun 169 if (false) { 170 if (bufferFill < 25 && _state == jwplayer.html5.states.PLAYING) { 171 _setState(jwplayer.html5.states.BUFFERING); 172 _bufferFull = false; 173 if (!_domelement.seeking) { 174 _domelement.pause(); 175 } 176 } else if (bufferFill > 95 && _state == jwplayer.html5.states.BUFFERING && _bufferFull === false && bufferTime > 0) { 177 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 178 } 179 } 180 181 if (_bufferFull === false) { 182 _bufferFull = true; 183 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 184 } 185 186 if (!_bufferingComplete) { 187 if (bufferPercent == 100 && _bufferingComplete === false) { 188 _bufferingComplete = true; 189 } 190 191 if (!jwplayer.html5.utils.isNull(bufferPercent)) { 192 player._model.buffer = Math.round(bufferPercent); 193 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, { 194 bufferPercent: Math.round(bufferPercent) 195 //bufferingComplete: _bufferingComplete, 196 //bufferFull: _bufferFull, 197 //bufferFill: bufferFill, 198 //bufferTime: bufferTime 199 }); 200 } 201 202 } 203 } 204 205 206 function _startInterval(player) { 207 if (_interval === null) { 208 _interval = window.setInterval(function() { 209 _positionHandler({}, player); 210 }, 100); 211 } 212 } 213 214 215 function _errorHandler(event, player) { 216 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, {}); 217 } 218 219 220 function _play(player) { 221 return function() { 222 if (_state != jwplayer.html5.states.PLAYING) { 223 _setState(player, jwplayer.html5.states.PLAYING); 224 _domelement.play(); 225 } 226 }; 227 } 228 229 230 /** Switch the pause state of the player. **/ 231 function _pause(player) { 232 return function() { 233 _domelement.pause(); 234 }; 235 } 236 237 238 /** Seek to a position in the video. **/ 239 function _seek(player) { 240 return function(position) { 241 _domelement.currentTime = position; 242 _domelement.play(); 243 }; 244 } 245 246 247 /** Stop playback and loading of the video. **/ 248 function _stop(player) { 249 return function() { 250 _stopped = true; 251 _domelement.pause(); 252 clearInterval(_interval); 253 _interval = undefined; 254 player._model.position = 0; 255 _setState(player, jwplayer.html5.states.IDLE); 256 }; 257 } 258 259 260 /** Change the video's volume level. **/ 261 function _volume(player) { 262 return function(position) { 263 player._model.volume = position; 264 _domelement.volume = position / 100; 265 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, { 266 volume: Math.round(_domelement.volume * 100) 267 }); 268 }; 269 } 270 271 272 /** Switch the mute state of the player. **/ 273 function _mute(player) { 274 return function(state) { 275 player._model.mute = state; 276 _domelement.muted = state; 277 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, { 278 mute: _domelement.muted 279 }); 280 }; 281 } 282 283 284 /** Resize the player. **/ 285 function _resize(player) { 286 return function(width, height) { 287 // TODO: Fullscreen 288 if (false) { 289 $("#" + player.id + "_jwplayer").css("position", 'fixed'); 290 $("#" + player.id + "_jwplayer").css("top", '0'); 291 $("#" + player.id + "_jwplayer").css("left", '0'); 292 $("#" + player.id + "_jwplayer").css("width", width); 293 $("#" + player.id + "_jwplayer").css("height", height); 294 player._model.width = $("#" + player.id + "_jwplayer").width; 295 player._model.height = $("#" + player.id + "_jwplayer").height; 296 } 297 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_RESIZE, { 298 fullscreen: player._model.fullscreen, 266 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_RESIZE, { 267 fullscreen: _model.fullscreen, 299 268 width: width, 300 269 hieght: height 301 270 }); 302 271 }; 303 } 304 305 306 /** Switch the fullscreen state of the player. **/ 307 function _fullscreen(player) { 308 return function(state) { 309 player._model.fullscreen = state; 272 273 274 /** Switch the fullscreen state of the player. **/ 275 this.fullscreen = function(state) { 310 276 if (state === true) { 311 player.resize("100%", "100%");277 this.resize("100%", "100%"); 312 278 } else { 313 player.resize(player._model.config.width, player._model.config.height); 314 } 315 }; 316 } 317 318 319 /** Load a new video into the player. **/ 320 function _load(player) { 321 return function(playlistItem) { 322 _domelement = _insertVideoTag(player, playlistItem); 323 _jdomelement = $(_domelement); 324 $.each(_events, function(event, handler) { 325 _domelement.addEventListener(event, function(event) { 326 handler(event, player); 279 this.resize(_model.config.width, _model.config.height); 280 } 281 }; 282 283 284 /** Load a new video into the player. **/ 285 this.load = function(playlistItem) { 286 _embed(playlistItem); 287 288 _bufferFull = false; 289 _bufferingComplete = false; 290 _start = false; 291 setTimeout(function() { 292 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_LOADED); 293 _setState(jwplayer.api.events.state.BUFFERING); 294 _positionHandler(); 295 }, 25); 296 }; 297 298 _embed = function(playlistItem) { 299 var vid = document.createElement("video"); 300 vid.preload = "none"; 301 vid.loop = _model.config.repeat; 302 for (var sourceIndex in playlistItem.levels) { 303 var sourceModel = playlistItem.levels[sourceIndex]; 304 var source = _container.ownerDocument.createElement("source"); 305 source.src = jwplayer.html5.utils.getAbsolutePath(sourceModel.file); 306 if (sourceModel.type === undefined) { 307 var extension = jwplayer.html5.utils.extension(sourceModel.file); 308 if (jwplayer.html5.extensionmap[extension] !== undefined) { 309 source.type = jwplayer.html5.extensionmap[extension]; 310 } else { 311 source.type = 'video/' + extension + ';'; 312 } 313 } else { 314 source.type = sourceModel.type; 315 } 316 vid.appendChild(source); 317 } 318 vid.style.position = _container.style.position; 319 vid.style.top = _container.style.top; 320 vid.style.left = _container.style.left; 321 vid.style.width = _container.style.width; 322 vid.style.height = _container.style.height; 323 vid.style.zIndex = _container.style.zIndex; 324 vid.onload = _loadHandler; 325 vid.volume = 0; 326 _container.parentNode.replaceChild(vid, _container); 327 vid.id = _container.id; 328 _container = vid; 329 for (var event in _events) { 330 _container.addEventListener(event, function(evt) { 331 if (evt.target.parentNode !== null) { 332 _events[evt.type](evt); 333 } 327 334 }, true); 328 }); 329 if (_jdomelement.css('display') == 'none') { 330 _jdomelement.css('display', 'block'); 331 } 332 setTimeout(function() { 333 _bufferFull = false; 334 _bufferingComplete = false; 335 _setState(player, jwplayer.html5.states.BUFFERING); 336 _startInterval(player); 337 try { 338 _domelement.currentTime = 0; 339 } catch (err){ 340 341 } 342 }, 25); 343 }; 344 } 345 346 function _insertVideoTag(player, playlistItem) { 347 var div1 = document.getElementById(player.id); 348 var vid = div1.ownerDocument.createElement("video"); 349 //vid.controls = "none"; 350 if (vid.autobuffer){ 351 vid.autobuffer = player._model.config.autoplay; 352 } else if (vid.autoplay){ 353 vid.autoplay = player._model.config.autoplay; 354 } 355 for (var sourceIndex in playlistItem.sources){ 356 var sourceModel = playlistItem.sources[sourceIndex]; 357 var source = div1.ownerDocument.createElement("source"); 358 source.src = jwplayer.html5.utils.getAbsolutePath(sourceModel.file); 359 if (sourceModel.type === undefined) { 360 var extension = jwplayer.html5.utils.extension(sourceModel.file); 361 if (extension == "ogv") { 362 extension = "ogg"; 363 } 364 source.type = 'video/' + extension + ';'; 365 } else { 366 source.type = sourceModel.type; 367 } 368 vid.appendChild(source); 369 } 370 vid.width = player._model.config.width; 371 vid.height = player._model.config.height; 372 var styles = { 373 position: 'absolute', 374 width: player._model.config.width + 'px', 375 height: player._model.config.height + 'px', 376 top: 0, 377 left: 0, 378 'z-index': 0, 379 margin: 'auto', 380 display: 'block' 381 }; 382 for (var style in styles){ 383 vid.style[style] = styles[style]; 384 } 385 div1.parentNode.replaceChild(vid, div1); 386 vid.id = player.id; 387 return vid; 388 } 389 390 335 } 336 }; 337 338 this.embed = _embed; 339 340 return this; 341 }; 391 342 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.model.js
r1277 r1278 7 7 (function(jwplayer) { 8 8 9 var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen"]; 10 11 jwplayer.html5.model = function(options) { 12 $.extend(this.config, options); 13 if (this.config.playlist && this.config.playlist.length > 0){ 14 this.playlist = this.config.playlist; 15 delete this.config.playlist; 16 } else if (this.config.sources && this.config.sources.length > 0) { 17 this.playlist = [{"sources": this.config.sources}]; 18 delete this.config.sources; 9 var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen", "item", "plugins"]; 10 11 jwplayer.html5.model = function(api, container, options) { 12 var _api = api; 13 var _container = container; 14 var _model = { 15 id: _container.id, 16 media: undefined, 17 playlist: [], 18 state: jwplayer.api.events.state.IDLE, 19 position: 0, 20 buffer: 0, 21 config: { 22 width: 480, 23 height: 320, 24 item: 0, 25 skin: undefined, 26 file: undefined, 27 image: undefined, 28 start: 0, 29 duration: 0, 30 bufferlength: 5, 31 volume: 90, 32 mute: false, 33 fullscreen: false, 34 repeat: false, 35 autostart: false, 36 debug: undefined, 37 screencolor: undefined 38 } 39 }; 40 var _media; 41 var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 42 var _components = ["display", "logo", "controlbar"]; 43 44 jwplayer.utils.extend(_model, _eventDispatcher); 45 46 for (var option in options) { 47 if (typeof options[option] == "string") { 48 var type = /color$/.test(option) ? "color" : null; 49 options[option] = jwplayer.html5.utils.typechecker(options[option], type); 50 } 51 var config = _model.config; 52 var path = option.split("."); 53 for (var edge in path) { 54 if (edge == path.length - 1) { 55 config[path[edge]] = options[option]; 56 } else { 57 if (config[path[edge]] === undefined) { 58 config[path[edge]] = {}; 59 } 60 config = config[path[edge]]; 61 } 62 } 19 63 } 20 64 for (var index in _configurableStateVariables) { 21 65 var configurableStateVariable = _configurableStateVariables[index]; 22 this[configurableStateVariable] = this.config[configurableStateVariable];66 _model[configurableStateVariable] = _model.config[configurableStateVariable]; 23 67 } 24 return this; 68 69 var pluginorder = _components.concat([]); 70 71 if (_model.plugins !== undefined) { 72 var userplugins = _model.plugins.split(","); 73 for (var userplugin in userplugins){ 74 pluginorder.push(userplugin.replace(/^\s+|\s+$/g,"")); 75 } 76 } 77 78 _model.plugins = { 79 order: pluginorder, 80 config: { 81 display: { 82 position: jwplayer.html5.view.positions.OVER, 83 screencolor: _model.config.screencolor 84 }, 85 logo: { 86 position: "bottom-left" 87 }, 88 controlbar: { 89 position: jwplayer.html5.view.positions.BOTTOM 90 } 91 }, 92 object: {} 93 }; 94 95 for (var pluginIndex in _model.plugins.order) { 96 var pluginName = _model.plugins.order[pluginIndex]; 97 var pluginConfig = _model.config[pluginName] === undefined ? {} : _model.config[pluginName]; 98 _model.plugins.config[pluginName] = _model.plugins.config[pluginName] === undefined ? pluginConfig : jwplayer.utils.extend(_model.plugins.config[pluginName], pluginConfig); 99 if (_model.plugins.config[pluginName].position === undefined) { 100 _model.plugins.config[pluginName].position = jwplayer.html5.view.positions.OVER; 101 } 102 } 103 104 _model.loadPlaylist = function(playlist, ready) { 105 ready = ready === null ? true : false; 106 _model.playlist = new jwplayer.html5.playlist(playlist); 107 if (ready) { 108 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 109 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 110 "item": _model.config.item 111 }); 112 } 113 _model.setActiveMediaProvider(_model.playlist[_model.item]); 114 }; 115 116 function forward(evt) { 117 if (evt.type == jwplayer.api.events.JWPLAYER_MEDIA_LOADED) { 118 _container = _media.getDisplayElement(); 119 } 120 _eventDispatcher.sendEvent(evt.type, evt); 121 } 122 123 _model.setActiveMediaProvider = function(playlistItem) { 124 if (_media !== undefined) { 125 _media.resetEventListeners(); 126 } 127 _media = new jwplayer.html5.mediavideo(_model, _container); 128 _media.addGlobalListener(forward); 129 if (_model.config.chromeless) { 130 _media.embed(playlistItem); 131 } 132 return true; 133 }; 134 135 _model.getMedia = function() { 136 return _media; 137 }; 138 139 _model.setupPlugins = function() { 140 for (var plugin in _model.plugins.order) { 141 if (jwplayer.html5[_model.plugins.order[plugin]] !== undefined) { 142 _model.plugins.object[_model.plugins.order[plugin]] = new jwplayer.html5[_model.plugins.order[plugin]](_api, _model.plugins.config[_model.plugins.order[plugin]]); 143 } else { 144 _model.plugins.object[_model.plugins.order[plugin]] = new window[_model.plugins.order[plugin]](_api, _model.plugins.config[_model.plugins.order[plugin]]); 145 } 146 } 147 }; 148 149 return _model; 25 150 }; 26 151 27 jwplayer.html5.model.prototype = {28 components: {},29 playlist: [],30 state: jwplayer.html5.states.IDLE,31 item: 0,32 position: 0,33 buffer: 0,34 config: {35 width: 480,36 height: 320,37 skin: undefined,38 file: undefined,39 image: undefined,40 start: 0,41 duration: 0,42 bufferlength: 5,43 volume: 90,44 mute: false,45 fullscreen: false,46 repeat: false,47 autostart: false,48 debug: undefined,49 screencolor: ''50 }51 };52 152 53 jwplayer.html5.model.setActiveMediaProvider = function(player) {54 player._media = jwplayer.html5.mediavideo(player);55 return true;56 };57 153 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.utils.js
r1277 r1278 8 8 9 9 jwplayer.html5.utils = function() { 10 return this.each(function() {11 });12 10 }; 13 14 15 11 16 12 /** Returns the extension of a file name **/ 17 13 jwplayer.html5.utils.extension = function(path) { 18 return path.substr(path.lastIndexOf('.') + 1, path.length); 19 }; 20 21 jwplayer.html5.utils.isNull = function(obj) { 22 return ((obj === null) || (obj === undefined) || (obj === "")); 14 return path.substr(path.lastIndexOf('.') + 1, path.length).toLowerCase(); 23 15 }; 24 16 25 17 /** Gets an absolute file path based on a relative filepath **/ 26 18 jwplayer.html5.utils.getAbsolutePath = function(path) { 27 if ( jwplayer.html5.utils.isNull(path)) {28 return path;19 if (path === undefined) { 20 return undefined; 29 21 } 30 22 if (isAbsolutePath(path)) { … … 32 24 } 33 25 var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 34 var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 26 var basepath = document.location.href.split("?")[0]; 27 basepath = basepath.substring(protocol.length, (path.indexOf("/") === 0) ? basepath.indexOf('/', protocol.length) : basepath.lastIndexOf('/')); 35 28 var patharray = (basepath + "/" + path).split("/"); 36 29 var result = []; 37 30 for (var i = 0; i < patharray.length; i++) { 38 if ( jwplayer.html5.utils.isNull(patharray[i])|| patharray[i] == ".") {31 if (patharray[i] === undefined || patharray[i] == ".") { 39 32 continue; 40 33 } else if (patharray[i] == "..") { … … 48 41 49 42 function isAbsolutePath(path) { 50 if ( jwplayer.html5.utils.isNull(path)) {43 if (path === null) { 51 44 return; 52 45 } … … 72 65 }; 73 66 74 75 /** Dumps the content of an object to a string **/76 jwplayer.html5.utils.dump = function(object, depth) {77 if (object === null) {78 return 'null';79 } else if (jwplayer.html5.utils.typeOf(object) != 'object') {80 if (jwplayer.html5.utils.typeOf(object) == 'string') {81 return "\"" + object + "\"";82 }83 return object;84 }85 86 var type = jwplayer.html5.utils.typeOf(object);87 88 depth = (depth === undefined) ? 1 : depth + 1;89 var indent = "";90 for (var i = 0; i < depth; i++) {91 indent += "\t";92 }93 94 var result = (type == "array") ? "[" : "{";95 result += "\n" + indent;96 97 for (var i in object) {98 if (type == "object") {99 result += "\"" + i + "\": ";100 }101 result += jwplayer.html5.utils.dump(object[i], depth) + ",\n" + indent;102 }103 104 result = result.substring(0, result.length - 2 - depth) + "\n";105 106 result += indent.substring(0, indent.length - 1);107 result += (type == "array") ? "]" : "}";108 109 return result;110 };111 112 /** Returns the true type of an object **/113 jwplayer.html5.utils.typeOf = function(value) {114 var s = typeof value;115 if (s === 'object') {116 if (value) {117 if (value instanceof Array) {118 s = 'array';119 }120 } else {121 s = 'null';122 }123 }124 return s;125 };126 127 128 67 /** Logger **/ 129 68 jwplayer.html5.utils.log = function(msg, obj) { 130 try { 131 if (obj) { 132 console.log("%s: %o", msg, obj); 133 } else { 134 console.log(jwplayer.html5.utils.dump(msg)); 135 } 136 } catch (err) { 69 if (obj) { 70 obj.message = msg; 71 console.log(msg, obj); 72 } else { 73 console.log(msg); 137 74 } 138 75 return this; 139 76 }; 140 77 141 78 jwplayer.html5.utils.css = function(domelement, styles, debug) { 79 if (domelement !== undefined) { 80 for (var style in styles) { 81 try { 82 if (typeof styles[style] == "number" && !(style == "zIndex" || style == "opacity")) { 83 styles[style] = styles[style] + "px"; 84 } 85 domelement.style[style] = styles[style]; 86 } catch (err) { 87 } 88 } 89 } 90 }; 142 91 })(jwplayer); -
trunk/html5/src/html5/jwplayer.html5.view.js
r1277 r1278 6 6 */ 7 7 (function(jwplayer) { 8 9 jwplayer.html5.view = function(player) { 10 player._model.domelement.wrap("<div id='" + player.id + "_jwplayer' />"); 11 player._model.domelement.parent().css({ 12 position: 'relative', 13 height: player._model.config.height + 'px', 14 width: player._model.config.width + 'px', 15 margin: 'auto', 16 padding: 0, 17 'background-color': player._model.config.screencolor 18 }); 19 player._model.domelement.css({ 20 position: 'absolute', 21 width: player._model.config.width + 'px', 22 height: player._model.config.height + 'px', 23 top: 0, 24 left: 0, 25 'z-index': 0, 26 margin: 'auto', 27 display: 'block' 28 }); 8 9 var _css = jwplayer.html5.utils.css; 10 11 jwplayer.html5.view = function(api, container, model) { 12 var _api = api; 13 var _container = container; 14 var _model = model; 15 var _wrapper; 16 var _width; 17 var _height; 18 var _box; 19 20 function createWrapper() { 21 _wrapper = document.createElement("div"); 22 _wrapper.id = _container.id; 23 _container.id = _wrapper.id + "_video"; 24 25 _css(_wrapper, { 26 position: "relative", 27 height: _model.height, 28 width: _model.width, 29 margin: "auto", 30 padding: 0, 31 background: _api.skin.getComponentSettings("display").backgroundcolor === undefined ? "#000" : _api.skin.getComponentSettings("display").backgroundcolor.replace("0x", "#"), 32 zIndex: 0 33 }); 34 35 _css(_container, { 36 position: "absolute", 37 width: _model.width, 38 height: _model.height, 39 top: 0, 40 left: 0, 41 zIndex: 1, 42 margin: "auto", 43 display: "block" 44 }); 45 46 jwplayer.utils.wrap(_container, _wrapper); 47 } 48 49 function layoutComponents() { 50 if (_model.getMedia() !== undefined && !_model.getMedia().hasChrome && !_model.config.chromeless) { 51 for (var pluginIndex in _model.plugins.order) { 52 var pluginName = _model.plugins.order[pluginIndex]; 53 if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 54 _container.parentNode.appendChild(_model.plugins.object[pluginName].getDisplayElement()); 55 _model.plugins.object[pluginName].height = getNumber(_model.plugins.object[pluginName].getDisplayElement().style.height); 56 _model.plugins.object[pluginName].width = getNumber(_model.plugins.object[pluginName].getDisplayElement().style.width); 57 } 58 } 59 } else { 60 _model.getMedia().getDisplayElement().poster = _model.playlist[_model.item].image; 61 _model.getMedia().getDisplayElement().controls = "controls"; 62 } 63 } 64 65 function getNumber(style) { 66 if (style === "") { 67 return 0; 68 } 69 return parseInt(style.replace("px", ""), 10); 70 } 71 72 this.setup = function(container) { 73 _container = container; 74 createWrapper(); 75 layoutComponents(); 76 _resize(_model.width, _model.height); 77 var oldresize; 78 if (window.onresize !== null) { 79 oldresize = window.onresize; 80 } 81 window.onresize = function(evt) { 82 if (oldresize !== undefined) { 83 try { 84 oldresize(evt); 85 } catch (err) { 86 87 } 88 } 89 if (_api.jwGetFullscreen()) { 90 _model.width = document.documentElement.clientWidth; 91 _model.height = document.documentElement.clientHeight; 92 } 93 _resize(_model.width, _model.height); 94 }; 95 }; 96 97 function _resize(width, height) { 98 var plugins = [].concat(_model.plugins.order); 99 plugins.reverse(); 100 if (!_model.fullscreen) { 101 _width = width; 102 _height = height; 103 _box = { 104 top: 0, 105 right: 0, 106 bottom: 0, 107 left: 0 108 }; 109 var failed = _resizeComponents(_normalscreenComponentResizer, plugins); 110 if (failed.length > 0) { 111 _resizeComponents(_overlayComponentResizer, failed, true); 112 } 113 _resizeMedia(); 114 } else { 115 _resizeComponents(_fullscreenComponentResizer, plugins, true); 116 } 117 } 118 119 function _resizeComponents(componentResizer, plugins, looseStyle) { 120 var _zIndex = plugins.length; 121 var failed = []; 122 for (var pluginIndex in plugins) { 123 var pluginName = plugins[pluginIndex]; 124 if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 125 var style = componentResizer(pluginName, _zIndex--); 126 if (!style) { 127 failed.push(pluginName); 128 } else { 129 var suggestedStyle = _model.plugins.object[pluginName].resize(style.width, style.height); 130 if (looseStyle === true) { 131 jwplayer.utils.extend(style, suggestedStyle); 132 } 133 _css(_model.plugins.object[pluginName].getDisplayElement(), style); 134 } 135 } 136 } 137 return failed; 138 } 139 140 function _normalscreenComponentResizer(pluginName, zIndex) { 141 if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 142 if (_model.plugins.config[pluginName].position !== jwplayer.html5.view.positions.OVER) { 143 var style = _getComponentPosition(pluginName); 144 style.zIndex = zIndex; 145 return style; 146 } 147 } 148 return false; 149 } 150 151 function _overlayComponentResizer(pluginName, zIndex) { 152 return { 153 position: "absolute", 154 top: _box.top, 155 left: _box.left, 156 width: (_model.width - _box.left - _box.right), 157 height: (_model.height - _box.top - _box.bottom), 158 zIndex: zIndex 159 }; 160 } 161 162 function _fullscreenComponentResizer(pluginName, zIndex) { 163 return { 164 position: "fixed", 165 top: 0, 166 left: 0, 167 width: _model.width, 168 height: _model.height, 169 zIndex: zIndex 170 }; 171 } 172 173 function _resizeMedia() { 174 _css(_model.getMedia().getDisplayElement(), { 175 position: "absolute", 176 width: (_model.width - _box.left - _box.right), 177 height: (_model.height - _box.top - _box.bottom), 178 top: _box.top, 179 left: _box.left 180 }); 181 } 182 183 function _getComponentPosition(pluginName) { 184 var plugincss = { 185 position: "absolute", 186 margin: 0, 187 padding: 0, 188 top: null 189 }; 190 var position = _model.plugins.config[pluginName].position.toLowerCase(); 191 switch (position.toUpperCase()) { 192 case jwplayer.html5.view.positions.TOP: 193 plugincss.top = _box.top; 194 plugincss.left = _box.left; 195 plugincss.width = _width - _box.left - _box.right; 196 plugincss.height = _model.plugins.object[pluginName].height; 197 _box[position] += _model.plugins.object[pluginName].height; 198 break; 199 case jwplayer.html5.view.positions.RIGHT: 200 plugincss.top = _box.top; 201 plugincss.right = _box.right; 202 plugincss.width = plugincss.width = _model.plugins.object[pluginName].width; 203 plugincss.height = _height - _box.top - _box.bottom; 204 _box[position] = plugincss.width = _model.plugins.object[pluginName].width; 205 break; 206 case jwplayer.html5.view.positions.BOTTOM: 207 plugincss.bottom = _box.bottom; 208 plugincss.left = _box.left; 209 plugincss.width = _width - _box.left - _box.right; 210 plugincss.height = _model.plugins.object[pluginName].height; 211 _box[position] = _model.plugins.object[pluginName].height; 212 break; 213 case jwplayer.html5.view.positions.LEFT: 214 plugincss.top = _box.top; 215 plugincss.left = _box.left; 216 plugincss.width = _model.plugins.object[pluginName].width; 217 plugincss.height = _height - _box.top - _box.bottom; 218 _box[position] = plugincss.width = _model.plugins.object[pluginName].width; 219 break; 220 default: 221 break; 222 } 223 return plugincss; 224 } 225 226 227 this.resize = _resize; 228 229 this.fullscreen = function(state) { 230 if (_model.getMedia().getDisplayElement().webkitSupportsFullscreen) { 231 if (state) { 232 _model.height = screen.availHeight; 233 _model.width = screen.availWidth; 234 _model.getMedia().getDisplayElement().webkitEnterFullscreen(); 235 } else { 236 _model.height = _height; 237 _model.width = _width; 238 _model.getMedia().getDisplayElement().webkitExitFullscreen(); 239 } 240 } else { 241 if (state) { 242 _model.width = document.documentElement.clientWidth; 243 _model.height = document.documentElement.clientHeight; 244 var style = { 245 position: "fixed", 246 width: "100%", 247 height: "100%", 248 top: 0, 249 left: 0, 250 zIndex: 2147483000 251 }; 252 _css(_wrapper, style); 253 style.zIndex = 0; 254 _css(_model.getMedia().getDisplayElement(), style); 255 } else { 256 _model.width = _width; 257 _model.height = _height; 258 _css(_wrapper, { 259 position: "relative", 260 height: _model.height, 261 width: _model.width, 262 zIndex: 0 263 }); 264 } 265 _resize(_model.width, _model.height); 266 } 267 }; 268 269 }; 270 271 jwplayer.html5.view.positions = { 272 TOP: "TOP", 273 RIGHT: "RIGHT", 274 BOTTOM: "BOTTOM", 275 LEFT: "LEFT", 276 OVER: "OVER" 29 277 }; 30 278 })(jwplayer);
Note: See TracChangeset
for help on using the changeset viewer.
