Changeset 1190
- Timestamp:
- 07/28/10 15:02:06 (3 years ago)
- Location:
- trunk/html5
- Files:
-
- 5 added
- 2 deleted
- 11 edited
- 1 moved
-
build/build.xml (modified) (2 diffs)
-
jquery.jwplayer.js (deleted)
-
jwplayer.html5.xml (moved) (moved from trunk/html5/jquery.jwplayer.xml)
-
jwplayer.js (added)
-
jwplayer.min.js (added)
-
mediaplayer-html5-beta.zip (deleted)
-
src/html5/jwplayer.html5.api.js (added)
-
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) (5 diffs)
-
src/html5/jwplayer.html5.events.js (added)
-
src/html5/jwplayer.html5.js (modified) (1 diff)
-
src/html5/jwplayer.html5.mediavideo.js (modified) (1 diff)
-
src/html5/jwplayer.html5.model.js (modified) (1 diff)
-
src/html5/jwplayer.html5.skinner.js (modified) (1 diff)
-
src/html5/jwplayer.html5.states.js (added)
-
src/html5/jwplayer.html5.utils.js (modified) (1 diff)
-
src/html5/jwplayer.html5.view.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/html5/build/build.xml
r1030 r1190 3 3 4 4 <target name="clean"> 5 <delete file="${basedir}/j query.jwplayer.js" quiet="true"/>6 <delete file="${basedir}/j query.jwplayer.min.js" quiet="true"/>5 <delete file="${basedir}/jwplayer.js" quiet="true"/> 6 <delete file="${basedir}/jwplayer.min.js" quiet="true"/> 7 7 </target> 8 8 9 9 <target name="concat" depends="clean"> 10 <concat destfile="${basedir}/jquery.jwplayer.js"> 11 <fileset dir="${basedir}/src/" includes="*.js" /> 10 <concat destfile="${basedir}/jwplayer.js"> 11 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.js" /> 12 <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.states.js" /> 13 <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" /> 12 15 </concat> 13 16 </target> … … 19 22 <target name="build-release" depends="concat"> 20 23 <java jar="${basedir}/build/yuicompressor-2.4.2.jar" fork="true"> 21 <arg line="'${basedir}/j query.jwplayer.js'"/>22 <arg line="-o '${basedir}/j query.jwplayer.min.js'"/>24 <arg line="'${basedir}/jwplayer.js'"/> 25 <arg line="-o '${basedir}/jwplayer.min.js'"/> 23 26 </java> 24 27 </target> 25 28 26 29 <target name="build-zip" depends="concat"> 27 <zip destfile="${basedir}/mediaplayer-html5 -beta.zip">30 <zip destfile="${basedir}/mediaplayer-html5.zip"> 28 31 <fileset dir="." includes="license.txt"/> 29 32 <fileset dir="." includes="readme.txt"/> 30 <fileset dir="." includes="jquery.jwplayer.js"/> 31 <fileset dir="./lib" includes="jquery.js"/> 33 <fileset dir="." includes="jwplayer.js"/> 32 34 <fileset dir="./assets/" includes="**/*.*" excludes=".svn,*.zip"/> 33 35 </zip> -
trunk/html5/src/html5/jwplayer.html5.controlbar.js
r1189 r1190 7 7 * @lastmodifieddate 2010-04-11 8 8 */ 9 (function($) { 10 var controlbars = {}; 11 12 /** Hooking the jwplayerControlbar up to jQuery. **/ 13 $.fn.jwplayerControlbar = function(player, domelement) { 14 controlbars[player.id] = $.extend({}, $.fn.jwplayerControlbar.defaults, player.config.plugins.controlbar); 15 buildElements(player, domelement); 16 buildHandlers(player); 17 }; 18 19 $.fn.jwplayerControlbar.positions = { 20 BOTTOM: 'BOTTOM', 21 TOP: 'TOP', 22 OVER: 'OVER' 23 }; 24 25 26 /** Map with config for the jwplayerControlbar plugin. **/ 27 $.fn.jwplayerControlbar.defaults = { 28 fontsize: 10, 29 fontcolor: '000000', 30 position: $.fn.jwplayerControlbar.positions.BOTTOM, 31 leftmargin: 0, 32 rightmargin: 0, 33 scrubber: 'none' 34 }; 35 36 /** Draw the jwplayerControlbar elements. **/ 37 function buildElements(player, domelement) { 38 // Draw the background. 39 domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 40 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 41 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 42 switch (controlbars[player.id].position) { 43 case $.fn.jwplayerControlbar.positions.TOP: 44 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 45 break; 46 default: 47 $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 48 domelement.parents(":first").css('height', parseInt(domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 49 break; 50 } 51 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 52 // Draw all elements on top of the bar. 53 buildElement('capLeft', 'left', true, player); 54 buildElement('playButton', 'left', false, player); 55 buildElement('pauseButton', 'left', true, player); 56 buildElement('divider1', 'left', true, player); 57 buildElement('elapsedText', 'left', true, player); 58 buildElement('timeSliderRail', 'left', false, player); 59 buildElement('timeSliderBuffer', 'left', false, player); 60 buildElement('timeSliderProgress', 'left', false, player); 61 buildElement('timeSliderThumb', 'left', false, player); 62 buildElement('capRight', 'right', true, player); 9 /** Hooking the jwplayerControlbar up to jQuery. **/ 10 jwplayer.html5.controlbar = function(player) { 11 player._model.components.controlbar = $.extend({}, jwplayer.html5.controlbar.defaults, player.config.plugins.controlbar); 12 jwplayer.html5.controlbar.buildElements(player); 13 jwplayer.html5.controlbar.buildHandlers(player); 14 }; 15 16 jwplayer.html5.controlbar.positions = { 17 BOTTOM: 'BOTTOM', 18 TOP: 'TOP', 19 OVER: 'OVER' 20 }; 21 22 23 /** Map with config for the jwplayerControlbar plugin. **/ 24 jwplayer.html5.controlbar.defaults = { 25 fontsize: 10, 26 fontcolor: '000000', 27 position: jwplayer.html5.controlbar.positions.BOTTOM, 28 leftmargin: 0, 29 rightmargin: 0, 30 scrubber: 'none' 31 }; 32 33 /** Draw the jwplayerControlbar elements. **/ 34 jwplayer.html5.controlbar.buildElements = function(player) { 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 (player._model.components.controlbar.position) { 40 case jwplayer.html5.controlbar.positions.TOP: 41 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 42 break; 43 default: 44 $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 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 jwplayer.html5.controlbar.buildElement('capLeft', 'left', true, player); 51 jwplayer.html5.controlbar.buildElement('playButton', 'left', false, player); 52 jwplayer.html5.controlbar.buildElement('pauseButton', 'left', true, player); 53 jwplayer.html5.controlbar.buildElement('divider1', 'left', true, player); 54 jwplayer.html5.controlbar.buildElement('elapsedText', 'left', true, player); 55 jwplayer.html5.controlbar.buildElement('timeSliderRail', 'left', false, player); 56 jwplayer.html5.controlbar.buildElement('timeSliderBuffer', 'left', false, player); 57 jwplayer.html5.controlbar.buildElement('timeSliderProgress', 'left', false, player); 58 jwplayer.html5.controlbar.buildElement('timeSliderThumb', 'left', false, player); 59 jwplayer.html5.controlbar.buildElement('capRight', 'right', true, player); 60 // TODO 61 if (false) { 62 jwplayer.html5.controlbar.buildElement('fullscreenButton', 'right', false, player); 63 jwplayer.html5.controlbar.buildElement('normalscreenButton', 'right', true, player); 64 jwplayer.html5.controlbar.buildElement('divider2', 'right', true, player); 65 } 66 if (!jwplayer.html5.utils.isiPad()) { 67 jwplayer.html5.controlbar.buildElement('volumeSliderRail', 'right', false, player); 68 jwplayer.html5.controlbar.buildElement('volumeSliderProgress', 'right', true, player); 69 jwplayer.html5.controlbar.buildElement('muteButton', 'right', false, player); 70 jwplayer.html5.controlbar.buildElement('unmuteButton', 'right', true, player); 71 jwplayer.html5.controlbar.buildElement('divider3', 'right', true, player); 72 } 73 jwplayer.html5.controlbar.buildElement('durationText', 'right', true, player); 74 }; 75 76 77 /** Draw a single element into the jwplayerControlbar. **/ 78 jwplayer.html5.controlbar.buildElement = function(element, align, offset, player) { 79 var nam = player.id + '_' + element; 80 $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 81 $('#' + nam).css('position', 'absolute'); 82 $('#' + nam).css('top', '0px'); 83 if (element.indexOf('Text') > 0) { 84 $('#' + nam).html('00:00'); 85 $('#' + nam).css('font', player._model.components.controlbar.fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 86 $('#' + nam).css('text-align', 'center'); 87 $('#' + nam).css('font-weight', 'bold'); 88 $('#' + nam).css('cursor', 'default'); 89 var wid = 14 + 3 * player._model.components.controlbar.fontsize; 90 $('#' + nam).css('color', '#' + player._model.components.controlbar.fontcolor.substr(-6)); 91 } else if (element.indexOf('divider') === 0) { 92 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 93 var wid = player.skin.controlbar.elements.divider.width; 94 } else { 95 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 96 var wid = player.skin.controlbar.elements[element].width; 97 } 98 if (align == 'left') { 99 $('#' + nam).css(align, player._model.components.controlbar.leftmargin); 100 if (offset) { 101 player._model.components.controlbar.leftmargin += wid; 102 } 103 } else if (align == 'right') { 104 $('#' + nam).css(align, player._model.components.controlbar.rightmargin); 105 if (offset) { 106 player._model.components.controlbar.rightmargin += wid; 107 } 108 } 109 $('#' + nam).css('width', wid); 110 $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 111 }; 112 113 114 /** Add interactivity to the jwplayerControlbar elements. **/ 115 jwplayer.html5.controlbar.buildHandlers = function(player) { 116 // Register events with the buttons. 117 jwplayer.html5.controlbar.buildHandler('playButton', 'play', player); 118 jwplayer.html5.controlbar.buildHandler('pauseButton', 'pause', player); 119 jwplayer.html5.controlbar.buildHandler('muteButton', 'mute', player, true); 120 jwplayer.html5.controlbar.buildHandler('unmuteButton', 'mute', player, false); 121 jwplayer.html5.controlbar.buildHandler('fullscreenButton', 'fullscreen', player, true); 122 jwplayer.html5.controlbar.buildHandler('normalscreenButton', 'fullscreen', player, false); 123 124 jwplayer.html5.controlbar.addSliders(player); 125 126 // Register events with the player. 127 player.buffer(jwplayer.html5.controlbar.bufferHandler); 128 player.state(jwplayer.html5.controlbar.stateHandler); 129 player.time(jwplayer.html5.controlbar.timeHandler); 130 player.mute(jwplayer.html5.controlbar.muteHandler); 131 player.volume(jwplayer.html5.controlbar.volumeHandler); 132 player.complete(jwplayer.html5.controlbar.completeHandler); 133 134 // Trigger a few events so the bar looks good on startup. 135 jwplayer.html5.controlbar.resizeHandler({ 136 id: player.id, 137 fulscreen: player.fullscreen(), 138 width: player.width(), 139 height: player.height() 140 }); 141 jwplayer.html5.controlbar.timeHandler({ 142 id: player.id, 143 duration: player.duration(), 144 position: 0 145 }); 146 jwplayer.html5.controlbar.bufferHandler({ 147 id: player.id, 148 bufferProgress: 0 149 }); 150 jwplayer.html5.controlbar.muteHandler({ 151 id: player.id, 152 mute: player.mute() 153 }); 154 jwplayer.html5.controlbar.stateHandler({ 155 id: player.id, 156 newstate: jwplayer.html5.states.IDLE 157 }); 158 jwplayer.html5.controlbar.volumeHandler({ 159 id: player.id, 160 volume: player.volume() 161 }); 162 }; 163 164 165 /** Set a single button handler. **/ 166 jwplayer.html5.controlbar.buildHandler = function(element, handler, player, args) { 167 var nam = player.id + '_' + element; 168 $('#' + nam).css('cursor', 'pointer'); 169 if (handler == 'fullscreen') { 170 $('#' + nam).mouseup(function(evt) { 171 evt.stopPropagation(); 172 player.fullscreen(!player.fullscreen()); 173 jwplayer.html5.controlbar.resizeHandler({ 174 id: player.id, 175 fullscreen: player.fullscreen(), 176 width: player.width(), 177 height: player.height() 178 }); 179 }); 180 } else { 181 $('#' + nam).mouseup(function(evt) { 182 evt.stopPropagation(); 183 if (!jwplayer.html5.utils.isNull(args)) { 184 player[handler](args); 185 } else { 186 player[handler](); 187 } 188 189 }); 190 } 191 }; 192 193 194 /** Set the volume drag handler. **/ 195 jwplayer.html5.controlbar.addSliders = function(player) { 196 var bar = '#' + player.id + '_jwplayerControlbar'; 197 var trl = '#' + player.id + '_timeSliderRail'; 198 var vrl = '#' + player.id + '_volumeSliderRail'; 199 $(bar).css('cursor', 'pointer'); 200 $(trl).css('cursor', 'pointer'); 201 $(vrl).css('cursor', 'pointer'); 202 $(bar).mousedown(function(evt) { 203 if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 204 player._model.components.controlbar.scrubber = 'time'; 205 } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 206 player._model.components.controlbar.scrubber = 'volume'; 207 } 208 }); 209 $(bar).mouseup(function(evt) { 210 evt.stopPropagation(); 211 jwplayer.html5.controlbar.sliderUp(evt.pageX, player); 212 }); 213 $(bar).mousemove(function(evt) { 214 if (player._model.components.controlbar.scrubber == 'time') { 215 player._model.components.controlbar.mousedown = true; 216 var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 217 $('#' + player.id + '_timeSliderThumb').css('left', xps); 218 } 219 }); 220 }; 221 222 223 /** The slider has been moved up. **/ 224 jwplayer.html5.controlbar.sliderUp = function(msx, player) { 225 player._model.components.controlbar.mousedown = false; 226 if (player._model.components.controlbar.scrubber == 'time') { 227 var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 228 var wid = $('#' + player.id + '_timeSliderRail').width(); 229 var pos = xps / wid * player._model.components.controlbar.currentDuration; 230 if (pos < 0) { 231 pos = 0; 232 } else if (pos > player._model.components.controlbar.currentDuration) { 233 pos = player._model.components.controlbar.currentDuration - 3; 234 } 235 player.seek(pos); 236 if (player._model.state != jwplayer.html5.states.PLAYING) { 237 player.play(); 238 } 239 } else if (player._model.components.controlbar.scrubber == 'volume') { 240 var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 241 var wid = $('#' + player.id + '_volumeSliderRail').width(); 242 var pct = Math.round(xps / wid * 100); 243 if (pct < 0) { 244 pct = 0; 245 } else if (pct > 100) { 246 pct = 100; 247 } 248 if (player._model.mute) { 249 player.mute(false); 250 } 251 player.volume(pct); 252 } 253 player._model.components.controlbar.scrubber = 'none'; 254 }; 255 256 257 /** Update the buffer percentage. **/ 258 jwplayer.html5.controlbar.bufferHandler = function(event) { 259 if (!jwplayer.html5.utils.isNull(event.bufferPercent)) { 260 controlbars[event.id].currentBuffer = event.bufferPercent; 261 } 262 263 var wid = $('#' + event.id + '_timeSliderRail').width(); 264 var bufferWidth = isNaN(Math.round(wid * controlbars[event.id].currentBuffer / 100)) ? 0 : Math.round(wid * controlbars[event.id].currentBuffer / 100); 265 $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 266 }; 267 268 269 /** Update the mute state. **/ 270 jwplayer.html5.controlbar.muteHandler = function(event) { 271 if (event.mute) { 272 $('#' + event.id + '_muteButton').css('display', 'none'); 273 $('#' + event.id + '_unmuteButton').css('display', 'block'); 274 $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 275 } else { 276 $('#' + event.id + '_muteButton').css('display', 'block'); 277 $('#' + event.id + '_unmuteButton').css('display', 'none'); 278 $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 279 } 280 }; 281 282 283 /** Update the playback state. **/ 284 jwplayer.html5.controlbar.stateHandler = function(event) { 285 // Handle the play / pause button 286 if (event.newstate == jwplayer.html5.states.BUFFERING || event.newstate == jwplayer.html5.states.PLAYING) { 287 $('#' + event.id + '_pauseButton').css('display', 'block'); 288 $('#' + event.id + '_playButton').css('display', 'none'); 289 } else { 290 $('#' + event.id + '_pauseButton').css('display', 'none'); 291 $('#' + event.id + '_playButton').css('display', 'block'); 292 } 293 294 // Show / hide progress bar 295 if (event.newstate == jwplayer.html5.states.IDLE) { 296 $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 297 $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 298 $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 299 } else { 300 $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 301 if (event.newstate != jwplayer.html5.states.BUFFERING) { 302 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 303 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 304 } 305 } 306 }; 307 308 309 /** Handles event completion **/ 310 jwplayer.html5.controlbar.completeHandler = function(event) { 311 jwplayer.html5.controlbar.timeHandler($.extend(event, { 312 position: 0, 313 duration: controlbars[event.id].currentDuration 314 })); 315 }; 316 317 318 /** Update the playback time. **/ 319 jwplayer.html5.controlbar.timeHandler = function(event) { 320 if (!jwplayer.html5.utils.isNull(event.position)) { 321 controlbars[event.id].currentPosition = event.position; 322 } 323 if (!jwplayer.html5.utils.isNull(event.duration)) { 324 controlbars[event.id].currentDuration = event.duration; 325 } 326 var progress = (controlbars[event.id].currentPosition === controlbars[event.id].currentDuration === 0) ? 0 : controlbars[event.id].currentPosition / controlbars[event.id].currentDuration; 327 var railWidth = $('#' + event.id + '_timeSliderRail').width(); 328 var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 329 var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 330 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 331 var thumbPosition = railLeft + progressWidth; 332 333 $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 334 if (!controlbars[event.id].mousedown) { 335 $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 336 } 337 338 $('#' + event.id + '_durationText').html(jwplayer.html5.controlbar.timeFormat(controlbars[event.id].currentDuration)); 339 $('#' + event.id + '_elapsedText').html(jwplayer.html5.controlbar.timeFormat(controlbars[event.id].currentPosition)); 340 }; 341 342 343 /** Format the elapsed / remaining text. **/ 344 jwplayer.html5.controlbar.timeFormat = function(sec) { 345 str = '00:00'; 346 if (sec > 0) { 347 str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 348 str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 349 } 350 return str; 351 }; 352 353 354 /** Flip the player size to/from full-browser-screen. **/ 355 jwplayer.html5.controlbar.resizeHandler = function(event) { 356 controlbars[event.id].width = event.width; 357 controlbars[event.id].fullscreen = event.fullscreen; 358 if (event.fullscreen) { 359 $('#' + event.id + '_normalscreenButton').css('display', 'block'); 360 $('#' + event.id + '_fullscreenButton').css('display', 'none'); 63 361 // TODO 64 362 if (false) { 65 buildElement('fullscreenButton', 'right', false, player); 66 buildElement('normalscreenButton', 'right', true, player); 67 buildElement('divider2', 'right', true, player); 68 } 69 if (!$.fn.jwplayerUtils.isiPad()) { 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('divider3', 'right', true, player); 75 } 76 buildElement('durationText', 'right', true, player); 77 } 78 79 80 /** Draw a single element into the jwplayerControlbar. **/ 81 function buildElement(element, align, offset, player) { 82 var nam = player.id + '_' + element; 83 $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 84 $('#' + nam).css('position', 'absolute'); 85 $('#' + nam).css('top', '0px'); 86 if (element.indexOf('Text') > 0) { 87 $('#' + nam).html('00:00'); 88 $('#' + nam).css('font', controlbars[player.id].fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 89 $('#' + nam).css('text-align', 'center'); 90 $('#' + nam).css('font-weight', 'bold'); 91 $('#' + nam).css('cursor', 'default'); 92 var wid = 14 + 3 * controlbars[player.id].fontsize; 93 $('#' + nam).css('color', '#' + controlbars[player.id].fontcolor.substr(-6)); 94 } else if (element.indexOf('divider') === 0) { 95 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 96 var wid = player.skin.controlbar.elements.divider.width; 97 } else { 98 $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 99 var wid = player.skin.controlbar.elements[element].width; 100 } 101 if (align == 'left') { 102 $('#' + nam).css(align, controlbars[player.id].leftmargin); 103 if (offset) { 104 controlbars[player.id].leftmargin += wid; 105 } 106 } else if (align == 'right') { 107 $('#' + nam).css(align, controlbars[player.id].rightmargin); 108 if (offset) { 109 controlbars[player.id].rightmargin += wid; 110 } 111 } 112 $('#' + nam).css('width', wid); 113 $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 114 } 115 116 117 /** Add interactivity to the jwplayerControlbar elements. **/ 118 function buildHandlers(player) { 119 // Register events with the buttons. 120 buildHandler('playButton', 'play', player); 121 buildHandler('pauseButton', 'pause', player); 122 buildHandler('muteButton', 'mute', player, true); 123 buildHandler('unmuteButton', 'mute', player, false); 124 buildHandler('fullscreenButton', 'fullscreen', player, true); 125 buildHandler('normalscreenButton', 'fullscreen', player, false); 126 127 addSliders(player); 128 129 // Register events with the player. 130 player.buffer(bufferHandler); 131 player.state(stateHandler); 132 player.time(timeHandler); 133 player.mute(muteHandler); 134 player.volume(volumeHandler); 135 player.complete(completeHandler); 136 137 // Trigger a few events so the bar looks good on startup. 138 resizeHandler({ 139 id: player.id, 140 fulscreen: player.fullscreen(), 141 width: player.width(), 142 height: player.height() 143 }); 144 timeHandler({ 145 id: player.id, 146 duration: player.duration(), 147 position: 0 148 }); 149 bufferHandler({ 150 id: player.id, 151 bufferProgress: 0 152 }); 153 muteHandler({ 154 id: player.id, 155 mute: player.mute() 156 }); 157 stateHandler({ 158 id: player.id, 159 newstate: $.fn.jwplayer.states.IDLE 160 }); 161 volumeHandler({ 162 id: player.id, 163 volume: player.volume() 164 }); 165 } 166 167 168 /** Set a single button handler. **/ 169 function buildHandler(element, handler, player, args) { 170 var nam = player.id + '_' + element; 171 $('#' + nam).css('cursor', 'pointer'); 172 if (handler == 'fullscreen') { 173 $('#' + nam).mouseup(function(evt) { 174 evt.stopPropagation(); 175 player.fullscreen(!player.fullscreen()); 176 resizeHandler({ 177 id: player.id, 178 fullscreen: player.fullscreen(), 179 width: player.width(), 180 height: player.height() 181 }); 363 $(window).resize(function() { 364 jwplayer.html5.controlbar.resizeBar(player); 182 365 }); 183 } else { 184 $('#' + nam).mouseup(function(evt) { 185 evt.stopPropagation(); 186 if (!$.fn.jwplayerUtils.isNull(args)) { 187 player[handler](args); 188 } else { 189 player[handler](); 190 } 191 192 }); 193 } 194 } 195 196 197 /** Set the volume drag handler. **/ 198 function addSliders(player) { 199 var bar = '#' + player.id + '_jwplayerControlbar'; 200 var trl = '#' + player.id + '_timeSliderRail'; 201 var vrl = '#' + player.id + '_volumeSliderRail'; 202 $(bar).css('cursor', 'pointer'); 203 $(trl).css('cursor', 'pointer'); 204 $(vrl).css('cursor', 'pointer'); 205 $(bar).mousedown(function(evt) { 206 if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 207 controlbars[player.id].scrubber = 'time'; 208 } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 209 controlbars[player.id].scrubber = 'volume'; 210 } 211 }); 212 $(bar).mouseup(function(evt) { 213 evt.stopPropagation(); 214 sliderUp(evt.pageX, player); 215 }); 216 $(bar).mousemove(function(evt) { 217 if (controlbars[player.id].scrubber == 'time') { 218 controlbars[player.id].mousedown = true; 219 var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 220 $('#' + player.id + '_timeSliderThumb').css('left', xps); 221 } 222 }); 223 } 224 225 226 /** The slider has been moved up. **/ 227 function sliderUp(msx, player) { 228 controlbars[player.id].mousedown = false; 229 if (controlbars[player.id].scrubber == 'time') { 230 var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 231 var wid = $('#' + player.id + '_timeSliderRail').width(); 232 var pos = xps / wid * controlbars[player.id].currentDuration; 233 if (pos < 0) { 234 pos = 0; 235 } else if (pos > controlbars[player.id].currentDuration) { 236 pos = controlbars[player.id].currentDuration - 3; 237 } 238 player.seek(pos); 239 if (player.model.state != $.fn.jwplayer.states.PLAYING) { 240 player.play(); 241 } 242 } else if (controlbars[player.id].scrubber == 'volume') { 243 var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 244 var wid = $('#' + player.id + '_volumeSliderRail').width(); 245 var pct = Math.round(xps / wid * 100); 246 if (pct < 0) { 247 pct = 0; 248 } else if (pct > 100) { 249 pct = 100; 250 } 251 if (player.model.mute) { 252 player.mute(false); 253 } 254 player.volume(pct); 255 } 256 controlbars[player.id].scrubber = 'none'; 257 } 258 259 260 /** Update the buffer percentage. **/ 261 function bufferHandler(event) { 262 if (!$.fn.jwplayerUtils.isNull(event.bufferPercent)) { 263 controlbars[event.id].currentBuffer = event.bufferPercent; 264 } 265 266 var wid = $('#' + event.id + '_timeSliderRail').width(); 267 var bufferWidth = isNaN(Math.round(wid * controlbars[event.id].currentBuffer / 100)) ? 0 : Math.round(wid * controlbars[event.id].currentBuffer / 100); 268 $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 269 } 270 271 272 /** Update the mute state. **/ 273 function muteHandler(event) { 274 if (event.mute) { 275 $('#' + event.id + '_muteButton').css('display', 'none'); 276 $('#' + event.id + '_unmuteButton').css('display', 'block'); 277 $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 278 } else { 279 $('#' + event.id + '_muteButton').css('display', 'block'); 280 $('#' + event.id + '_unmuteButton').css('display', 'none'); 281 $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 282 } 283 } 284 285 286 /** Update the playback state. **/ 287 function stateHandler(event) { 288 // Handle the play / pause button 289 if (event.newstate == $.fn.jwplayer.states.BUFFERING || event.newstate == $.fn.jwplayer.states.PLAYING) { 290 $('#' + event.id + '_pauseButton').css('display', 'block'); 291 $('#' + event.id + '_playButton').css('display', 'none'); 292 } else { 293 $('#' + event.id + '_pauseButton').css('display', 'none'); 294 $('#' + event.id + '_playButton').css('display', 'block'); 295 } 296 297 // Show / hide progress bar 298 if (event.newstate == $.fn.jwplayer.states.IDLE) { 299 $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 300 $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 301 $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 302 } else { 303 $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 304 if (event.newstate != $.fn.jwplayer.states.BUFFERING) { 305 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 306 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 307 } 308 } 309 } 310 311 /** Handles event completion **/ 312 function completeHandler(event) { 313 timeHandler($.extend(event, { 314 position: 0, 315 duration: controlbars[event.id].currentDuration 316 })); 317 } 318 319 320 /** Update the playback time. **/ 321 function timeHandler(event) { 322 if (!$.fn.jwplayerUtils.isNull(event.position)) { 323 controlbars[event.id].currentPosition = event.position; 324 } 325 if (!$.fn.jwplayerUtils.isNull(event.duration)) { 326 controlbars[event.id].currentDuration = event.duration; 327 } 328 var progress = (controlbars[event.id].currentPosition === controlbars[event.id].currentDuration === 0) ? 0 : controlbars[event.id].currentPosition / controlbars[event.id].currentDuration; 329 var railWidth = $('#' + event.id + '_timeSliderRail').width(); 330 var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 331 var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 332 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 333 var thumbPosition = railLeft + progressWidth; 334 335 $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 336 if (!controlbars[event.id].mousedown) { 337 $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 338 } 339 340 $('#' + event.id + '_durationText').html(timeFormat(controlbars[event.id].currentDuration)); 341 $('#' + event.id + '_elapsedText').html(timeFormat(controlbars[event.id].currentPosition)); 342 } 343 344 345 /** Format the elapsed / remaining text. **/ 346 function timeFormat(sec) { 347 str = '00:00'; 348 if (sec > 0) { 349 str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 350 str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 351 } 352 return str; 353 } 354 355 356 /** Flip the player size to/from full-browser-screen. **/ 357 function resizeHandler(event) { 358 controlbars[event.id].width = event.width; 359 controlbars[event.id].fullscreen = event.fullscreen; 360 if (event.fullscreen) { 361 $('#' + event.id + '_normalscreenButton').css('display', 'block'); 362 $('#' + event.id + '_fullscreenButton').css('display', 'none'); 363 // TODO 364 if (false) { 365 $(window).resize(function() { 366 resizeBar(player); 367 }); 368 } 369 } else { 370 $('#' + event.id + '_normalscreenButton').css('display', 'none'); 371 $('#' + event.id + '_fullscreenButton').css('display', 'block'); 372 // TODO 373 if (false) { 374 $(window).resize(null); 375 } 376 } 377 resizeBar(event); 378 timeHandler(event); 379 bufferHandler(event); 380 } 381 382 383 /** Resize the jwplayerControlbar. **/ 384 function resizeBar(event) { 385 var lft = controlbars[event.id].left; 386 var top = controlbars[event.id].top; 387 var wid = controlbars[event.id].width; 388 var hei = $('#' + event.id + '_jwplayerControlbar').height(); 389 if (controlbars[event.id].position == 'over') { 390 lft += 1 * controlbars[event.id].margin; 391 top -= 1 * controlbars[event.id].margin + hei; 392 wid -= 2 * controlbars[event.id].margin; 393 } 394 if (controlbars[event.id].fullscreen) { 395 lft = controlbars[event.id].margin; 396 top = $(window).height() - controlbars[event.id].margin - hei; 397 wid = $(window).width() - 2 * controlbars[event.id].margin; 398 $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 399 } else { 400 $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 401 } 402 $('#' + event.id + '_jwplayerControlbar').css('left', lft); 403 $('#' + event.id + '_jwplayerControlbar').css('top', top); 404 $('#' + event.id + '_jwplayerControlbar').css('width', wid); 405 $('#' + event.id + '_timeSliderRail').css('width', (wid - controlbars[event.id].leftmargin - controlbars[event.id].rightmargin)); 406 } 407 408 409 /** Update the volume level. **/ 410 function volumeHandler(event) { 411 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 412 var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 413 var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 414 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 415 416 $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 417 $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 418 } 419 420 421 })(jQuery); 366 } 367 } else { 368 $('#' + event.id + '_normalscreenButton').css('display', 'none'); 369 $('#' + event.id + '_fullscreenButton').css('display', 'block'); 370 // TODO 371 if (false) { 372 $(window).resize(null); 373 } 374 } 375 jwplayer.html5.controlbar.resizeBar(event); 376 jwplayer.html5.controlbar.timeHandler(event); 377 jwplayer.html5.controlbar.bufferHandler(event); 378 }; 379 380 381 /** Resize the jwplayerControlbar. **/ 382 jwplayer.html5.controlbar.resizeBar = function(event) { 383 var lft = controlbars[event.id].left; 384 var top = controlbars[event.id].top; 385 var wid = controlbars[event.id].width; 386 var hei = $('#' + event.id + '_jwplayerControlbar').height(); 387 if (controlbars[event.id].position == 'over') { 388 lft += 1 * controlbars[event.id].margin; 389 top -= 1 * controlbars[event.id].margin + hei; 390 wid -= 2 * controlbars[event.id].margin; 391 } 392 if (controlbars[event.id].fullscreen) { 393 lft = controlbars[event.id].margin; 394 top = $(window).height() - controlbars[event.id].margin - hei; 395 wid = $(window).width() - 2 * controlbars[event.id].margin; 396 $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 397 } else { 398 $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 399 } 400 $('#' + event.id + '_jwplayerControlbar').css('left', lft); 401 $('#' + event.id + '_jwplayerControlbar').css('top', top); 402 $('#' + event.id + '_jwplayerControlbar').css('width', wid); 403 $('#' + event.id + '_timeSliderRail').css('width', (wid - controlbars[event.id].leftmargin - controlbars[event.id].rightmargin)); 404 }; 405 406 407 /** Update the volume level. **/ 408 jwplayer.html5.controlbar.volumeHandler = function(event) { 409 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 410 var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 411 var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 412 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 413 414 $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 415 $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 416 }; -
trunk/html5/src/html5/jwplayer.html5.controller.js
r1189 r1190 6 6 * @lastmodifieddate 2010-04-11 7 7 */ 8 (function($) { 9 10 var mediaParams = function() { 11 return { 12 volume: 100, 13 fullscreen: false, 14 mute: false, 15 width: 480, 16 height: 320, 17 duration: 0, 18 source: 0, 19 sources: [], 20 buffer: 0, 21 position: 0, 22 state: $.fn.jwplayer.states.IDLE 23 }; 24 }; 25 26 $.fn.jwplayerController = function(player) { 27 return { 28 play: play(player), 29 pause: pause(player), 30 seek: seek(player), 31 stop: stop(player), 32 volume: volume(player), 33 mute: mute(player), 34 resize: resize(player), 35 fullscreen: fullscreen(player), 36 load: load(player), 37 mediaInfo: mediaInfo(player), 38 addEventListener: addEventListener(player), 39 removeEventListener: removeEventListener(player), 40 sendEvent: sendEvent(player) 41 }; 42 }; 43 44 45 function play(player) { 46 return function() { 8 jwplayer.html5.controller = function(player) { 9 return { 10 play: jwplayer.html5.controller.play(player), 11 pause: jwplayer.html5.controller.pause(player), 12 seek: jwplayer.html5.controller.seek(player), 13 stop: jwplayer.html5.controller.stop(player), 14 volume: jwplayer.html5.controller.volume(player), 15 mute: jwplayer.html5.controller.mute(player), 16 resize: jwplayer.html5.controller.resize(player), 17 fullscreen: jwplayer.html5.controller.fullscreen(player), 18 load: jwplayer.html5.controller.load(player), 19 mediaInfo: jwplayer.html5.controller.mediaInfo(player), 20 addEventListener: jwplayer.html5.controller.addEventListener(player), 21 removeEventListener: jwplayer.html5.controller.removeEventListener(player), 22 sendEvent: jwplayer.html5.controller.sendEvent(player) 23 }; 24 }; 25 26 jwplayer.html5.controller._mediainfovariables = ["width","height","state","sources","source","position","buffer","duration","volume","mute","fullscreen"]; 27 28 jwplayer.html5.controller.play = function(player) { 29 return function() { 30 try { 31 switch (player._model.state) { 32 case jwplayer.html5.states.IDLE: 33 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, player._media.play); 34 player._media.load(player._model.sources[player._model.source].file); 35 break; 36 case jwplayer.html5.states.PAUSED: 37 player._media.play(); 38 break; 39 } 40 41 return player; 42 } catch (err) { 43 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 44 } 45 return false; 46 }; 47 }; 48 49 50 /** Switch the pause state of the player. **/ 51 jwplayer.html5.controller.pause = function(player) { 52 return function() { 53 try { 54 switch (player._model.state) { 55 case jwplayer.html5.states.PLAYING: 56 case jwplayer.html5.states.BUFFERING: 57 player._media.pause(); 58 break; 59 } 60 return player; 61 } catch (err) { 62 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 63 } 64 return false; 65 }; 66 }; 67 68 69 /** Seek to a position in the video. **/ 70 jwplayer.html5.controller.seek = function(player) { 71 return function(position) { 72 try { 73 switch (player._model.state) { 74 case jwplayer.html5.states.PLAYING: 75 case jwplayer.html5.states.PAUSED: 76 case jwplayer.html5.states.BUFFERING: 77 player._media.seek(position); 78 break; 79 } 80 return player; 81 } catch (err) { 82 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 83 } 84 return false; 85 }; 86 }; 87 88 89 /** Stop playback and loading of the video. **/ 90 jwplayer.html5.controller.stop = function(player) { 91 return function() { 92 try { 93 player._media.stop(); 94 return player; 95 } catch (err) { 96 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 97 } 98 return false; 99 }; 100 }; 101 102 103 /** Get / set the video's volume level. **/ 104 jwplayer.html5.controller.volume = function(player) { 105 return function(arg) { 106 try { 107 switch (jwplayer.html5.utils.typeOf(arg)) { 108 case "function": 109 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, arg); 110 break; 111 case "number": 112 player._media.volume(arg); 113 return true; 114 case "string": 115 player._media.volume(parseInt(arg, 10)); 116 return true; 117 default: 118 return player._model.volume; 119 } 120 return player; 121 } catch (err) { 122 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 123 } 124 return false; 125 }; 126 }; 127 128 129 /** Get / set the mute state of the player. **/ 130 jwplayer.html5.controller.mute = function(player) { 131 return function(arg) { 132 try { 133 switch (jwplayer.html5.utils.typeOf(arg)) { 134 case "function": 135 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, arg); 136 break; 137 case "boolean": 138 player._media.mute(arg); 139 break; 140 default: 141 return player._model.mute; 142 } 143 return player; 144 } catch (err) { 145 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 146 } 147 return false; 148 }; 149 }; 150 151 152 /** Resizes the video **/ 153 jwplayer.html5.controller.resize = function(player) { 154 return function(arg1, arg2) { 155 try { 156 switch (jwplayer.html5.utils.typeOf(arg1)) { 157 case "function": 158 player.addEventListener(jwplayer.html5.events.JWPLAYER_RESIZE, arg1); 159 break; 160 case "number": 161 player._media.resize(arg1, arg2); 162 break; 163 case "string": 164 player._media.resize(arg1, arg2); 165 break; 166 default: 167 break; 168 } 169 return player; 170 } catch (err) { 171 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 172 } 173 return false; 174 }; 175 }; 176 177 178 /** Jumping the player to/from fullscreen. **/ 179 jwplayer.html5.controller.fullscreen = function(player) { 180 return function(arg) { 181 try { 182 switch (jwplayer.html5.utils.typeOf(arg)) { 183 case "function": 184 player.addEventListener(jwplayer.html5.events.JWPLAYER_FULLSCREEN, arg); 185 break; 186 case "boolean": 187 player._media.fullscreen(arg); 188 break; 189 default: 190 return player._model.fullscreen; 191 } 192 return player; 193 } catch (err) { 194 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 195 } 196 return false; 197 }; 198 }; 199 200 201 /** Loads a new video **/ 202 jwplayer.html5.controller.load = function(player) { 203 return function(arg) { 204 try { 205 switch (jwplayer.html5.utils.typeOf(arg)) { 206 case "function": 207 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_LOADED, arg); 208 break; 209 default: 210 player._media.load(arg); 211 break; 212 } 213 return player; 214 } catch (err) { 215 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 216 } 217 return false; 218 }; 219 }; 220 221 222 /** Returns the meta **/ 223 jwplayer.html5.controller.mediaInfo = function(player) { 224 return function() { 225 try { 226 var result = {}; 227 for (var index in jwplayer.html5.controller._mediainfoparameters) { 228 var mediaparam = jwplayer.html5.controller._mediainfoparameters[index]; 229 result[mediaparam] = player._model[mediaparam]; 230 } 231 return result; 232 } catch (err) { 233 jwplayer.html5.utils.log("error", err); 234 } 235 return false; 236 }; 237 }; 238 239 240 /** Add an event listener. **/ 241 jwplayer.html5.controller.addEventListener = function(player) { 242 return function(type, listener, count) { 243 try { 244 if (player._listeners[type] === undefined) { 245 player._listeners[type] = []; 246 } 247 player._listeners[type].push({ 248 listener: listener, 249 count: count 250 }); 251 } catch (err) { 252 jwplayer.html5.utils.log("error", err); 253 } 254 return false; 255 }; 256 }; 257 258 259 /** Remove an event listener. **/ 260 jwplayer.html5.controller.removeEventListener = function(player) { 261 return function(type, listener) { 262 try { 263 for (var lisenterIndex in player._listeners[type]) { 264 if (player._listeners[type][lisenterIndex] == listener) { 265 player._listeners[type].slice(lisenterIndex, lisenterIndex + 1); 266 break; 267 } 268 } 269 } catch (err) { 270 jwplayer.html5.utils.log("error", err); 271 } 272 return false; 273 }; 274 }; 275 276 277 /** Send an event **/ 278 jwplayer.html5.controller.sendEvent = function(player) { 279 return function(type, data) { 280 data = $.extend({ 281 id: player.id, 282 version: player.version 283 }, data); 284 if ((player._model.config.debug !== undefined) && (player._model.config.debug.toString().toLowerCase() == 'console')) { 285 jwplayer.html5.utils.log(type, data); 286 } 287 for (var listenerIndex in player._listeners[type]) { 47 288 try { 48 switch (player.model.state) { 49 case $.fn.jwplayer.states.IDLE: 50 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, player.media.play); 51 player.media.load(player.model.sources[player.model.source].file); 52 break; 53 case $.fn.jwplayer.states.PAUSED: 54 player.media.play(); 55 break; 56 } 57 58 return $.jwplayer(player.id); 289 player._listeners[type][listenerIndex].listener(data); 59 290 } catch (err) { 60 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 61 } 62 return false; 63 }; 64 } 65 66 /** Switch the pause state of the player. **/ 67 function pause(player) { 68 return function() { 69 try { 70 switch (player.model.state) { 71 case $.fn.jwplayer.states.PLAYING: 72 case $.fn.jwplayer.states.BUFFERING: 73 player.media.pause(); 74 break; 75 } 76 return $.jwplayer(player.id); 77 } catch (err) { 78 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 79 } 80 return false; 81 }; 82 } 83 84 85 /** Seek to a position in the video. **/ 86 function seek(player) { 87 return function(position) { 88 try { 89 switch (player.model.state) { 90 case $.fn.jwplayer.states.PLAYING: 91 case $.fn.jwplayer.states.PAUSED: 92 case $.fn.jwplayer.states.BUFFERING: 93 player.media.seek(position); 94 break; 95 } 96 return $.jwplayer(player.id); 97 } catch (err) { 98 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 99 } 100 return false; 101 }; 102 } 103 104 105 /** Stop playback and loading of the video. **/ 106 function stop(player) { 107 return function() { 108 try { 109 player.media.stop(); 110 return $.jwplayer(player.id); 111 } catch (err) { 112 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 113 } 114 return false; 115 }; 116 } 117 118 119 /** Get / set the video's volume level. **/ 120 function volume(player) { 121 return function(arg) { 122 try { 123 switch ($.fn.jwplayerUtils.typeOf(arg)) { 124 case "function": 125 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 126 break; 127 case "number": 128 player.media.volume(arg); 129 return true; 130 case "string": 131 player.media.volume(parseInt(arg, 10)); 132 return true; 133 default: 134 return player.model.volume; 135 } 136 return $.jwplayer(player.id); 137 } catch (err) { 138 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 139 } 140 return false; 141 }; 142 } 143 144 /** Get / set the mute state of the player. **/ 145 function mute(player) { 146 return function(arg) { 147 try { 148 switch ($.fn.jwplayerUtils.typeOf(arg)) { 149 case "function": 150 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); 151 break; 152 case "boolean": 153 player.media.mute(arg); 154 break; 155 default: 156 return player.model.mute; 157 } 158 return $.jwplayer(player.id); 159 } catch (err) { 160 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 161 } 162 return false; 163 }; 164 } 165 166 167 /** Resizes the video **/ 168 function resize(player) { 169 return function(arg1, arg2) { 170 try { 171 switch ($.fn.jwplayerUtils.typeOf(arg1)) { 172 case "function": 173 player.addEventListener($.fn.jwplayer.events.JWPLAYER_RESIZE, arg1); 174 break; 175 case "number": 176 player.media.resize(arg1, arg2); 177 break; 178 case "string": 179 player.media.resize(arg1, arg2); 180 break; 181 default: 182 break; 183 } 184 return $.jwplayer(player.id); 185 } catch (err) { 186 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 187 } 188 return false; 189 }; 190 } 191 192 193 /** Jumping the player to/from fullscreen. **/ 194 function fullscreen(player) { 195 return function(arg) { 196 try { 197 switch ($.fn.jwplayerUtils.typeOf(arg)) { 198 case "function": 199 player.addEventListener($.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); 200 break; 201 case "boolean": 202 player.media.fullscreen(arg); 203 break; 204 default: 205 return player.model.fullscreen; 206 } 207 return $.jwplayer(player.id); 208 } catch (err) { 209 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 210 } 211 return false; 212 }; 213 } 214 215 /** Loads a new video **/ 216 function load(player) { 217 return function(arg) { 218 try { 219 switch ($.fn.jwplayerUtils.typeOf(arg)) { 220 case "function": 221 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); 222 break; 223 default: 224 player.media.load(arg); 225 break; 226 } 227 return $.jwplayer(player.id); 228 } catch (err) { 229 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 230 } 231 return false; 232 }; 233 } 234 235 236 /** Returns the meta **/ 237 function mediaInfo(player) { 238 return function() { 239 try { 240 var result = {}; 241 for (var mediaParam in mediaParams()) { 242 result[mediaParam] = player.model[mediaParam]; 243 } 244 return result; 245 } catch (err) { 246 $.fn.jwplayerUtils.log("error", err); 247 } 248 return false; 249 }; 250 } 251 252 253 /** Add an event listener. **/ 254 function addEventListener(player) { 255 return function(type, listener, count) { 256 try { 257 if (player.listeners[type] === undefined) { 258 player.listeners[type] = []; 259 } 260 player.listeners[type].push({ 261 listener: listener, 262 count: count 263 }); 264 } catch (err) { 265 $.fn.jwplayerUtils.log("error", err); 266 } 267 return false; 268 }; 269 } 270 271 272 /** Remove an event listener. **/ 273 function removeEventListener(player) { 274 return function(type, listener) { 275 try { 276 for (var lisenterIndex in player.listeners[type]) { 277 if (player.listeners[type][lisenterIndex] == listener) { 278 player.listeners[type].slice(lisenterIndex, lisenterIndex + 1); 279 break; 280 } 281 } 282 } catch (err) { 283 $.fn.jwplayerUtils.log("error", err); 284 } 285 return false; 286 }; 287 } 288 289 /** Send an event **/ 290 function sendEvent(player) { 291 return function(type, data) { 292 data = $.extend({ 293 id: player.id, 294 version: player.version 295 }, data); 296 if ((player.config.debug !== undefined) && (player.config.debug.toString().toLowerCase() == 'console')) { 297 $.fn.jwplayerUtils.log(type, data); 298 } 299 for (var listenerIndex in player.listeners[type]) { 300 try { 301 player.listeners[type][listenerIndex].listener(data); 302 } catch (err) { 303 $.fn.jwplayerUtils.log("There was an error while handling a listener", err); 304 } 305 if (player.listeners[type][listenerIndex].count === 1) { 306 delete player.listeners[type][listenerIndex]; 307 } else if (player.listeners[type][listenerIndex].count > 0) { 308 player.listeners[type][listenerIndex].count = player.listeners[type][listenerIndex].count - 1; 309 } 310 } 311 }; 312 } 313 314 })(jQuery); 291 jwplayer.html5.utils.log("There was an error while handling a listener", err); 292 } 293 if (player._listeners[type][listenerIndex].count === 1) { 294 delete player._listeners[type][listenerIndex]; 295 } else if (player._listeners[type][listenerIndex].count > 0) { 296 player._listeners[type][listenerIndex].count = player._listeners[type][listenerIndex].count - 1; 297 } 298 } 299 }; 300 }; 301 -
trunk/html5/src/html5/jwplayer.html5.defaultskin.js
r1189 r1190 7 7 * @lastmodifieddate 2010-04-11 8 8 */ 9 (function($) { 9 /** Constructor **/ 10 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>'; 10 11 11 /** Constructor **/12 $.fn.jwplayerDefaultSkin = '<?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>';13 14 })(jQuery); -
trunk/html5/src/html5/jwplayer.html5.display.js
r1189 r1190 6 6 * @lastmodifieddate 2010-04-11 7 7 */ 8 (function($) { 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 21 }; 22 23 var displays = {}; 24 25 $.fn.jwplayerDisplay = function(player, domelement) { 26 if (displays[player.id] === undefined) { 27 displays[player.id] = {}; 28 displays[player.id].domelement = domelement; 29 displays[player.id].elements = initializeDisplayElements(player); 30 if ($.fn.jwplayerUtils.isiPhone()) { 31 domelement.attr('poster', $.fn.jwplayerUtils.getAbsolutePath(player.config.image)); 32 } else { 33 setupDisplay(player); 34 player.state(stateHandler); 35 player.mute(stateHandler); 36 player.error(function(obj) { 37 38 }); 8 jwplayer.html5.display = function(player) { 9 if (player._model.components.display === undefined) { 10 player._model.components.display = {}; 11 player._model.components.display.elements = jwplayer.html5.display.initializeDisplayElements(player); 12 if (jwplayer.html5.utils.isiPhone()) { 13 domelement.attr('poster', jwplayer.html5.utils.getAbsolutePath(player.config.image)); 14 } else { 15 jwplayer.html5.display.setupDisplay(player); 16 player.state(jwplayer.html5.display.stateHandler(player)); 17 player.mute(jwplayer.html5.display.stateHandler(player)); 18 player.error(function(obj) { 19 }); 20 } 21 } 22 }; 23 24 jwplayer.html5.display.logoDefaults = { 25 prefix: "http://l.longtailvideo.com/html5/0/", 26 file: "logo.png", 27 link: "http://www.longtailvideo.com/players/jw-flv-player/", 28 margin: 8, 29 out: 0.5, 30 over: 1, 31 timeout: 3, 32 hide: "true", 33 position: "bottom-left", 34 width: 93, 35 height: 30 36 }; 37 38 jwplayer.html5.display.setupDisplay = function(player) { 39 var meta = player.meta(); 40 var html = []; 41 html.push("<div id='" + player.id + "_display'" + jwplayer.html5.display.getStyle(player, 'display') + ">"); 42 html.push("<div id='" + player.id + "_displayImage'" + jwplayer.html5.display.getStyle(player, 'displayImage') + "> </div>"); 43 html.push("<div id='" + player.id + "_displayIconBackground'" + jwplayer.html5.display.getStyle(player, 'displayIconBackground') + ">"); 44 html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + jwplayer.html5.display.getStyle(player, 'displayIcon') + "/>"); 45 html.push('</div>'); 46 html.push('<div id="' + player.id + '_logo" target="_blank"' + jwplayer.html5.display.getStyle(player, 'logo') + '> </div>'); 47 html.push('</div>'); 48 player._model.components.display.domelement.before(html.join('')); 49 jwplayer.html5.display.setupDisplayElements(player); 50 }; 51 52 53 jwplayer.html5.display.getStyle = function(player, element) { 54 var result = ''; 55 for (var style in player._model.components.display.elements[element].style) { 56 result += style + ":" + player._model.components.display.elements[element].style[style] + ";"; 57 } 58 if (result === '') { 59 return ' '; 60 } 61 return ' style="' + result + '" '; 62 }; 63 64 65 jwplayer.html5.display.setupDisplayElements = function(player) { 66 var displayElements = jwplayer.html5.display.initializeDisplayElements(player); 67 for (var element in displayElements) { 68 var elementId = ['#', player.id, '_', element]; 69 player._model.components.display[element] = $(elementId.join('')); 70 if (displayElements[element].click !== undefined) { 71 player._model.components.display[element].click(displayElements[element].click); 72 } 73 } 74 }; 75 76 77 jwplayer.html5.display.initializeDisplayElements = function(player) { 78 var meta = player.meta(); 79 var elements = { 80 display: { 81 style: { 82 cursor: 'pointer', 83 width: meta.width + "px", 84 height: meta.height + "px", 85 position: 'relative', 86 'z-index': 50, 87 margin: 0, 88 padding: 0 89 }, 90 click: jwplayer.html5.display.displayClickHandler(player) 91 }, 92 displayIcon: { 93 style: { 94 cursor: 'pointer', 95 position: 'absolute', 96 top: ((player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2) + "px", 97 left: ((player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2) + "px", 98 border: 0, 99 margin: 0, 100 padding: 0 39 101 } 40 } 41 }; 42 43 function setupDisplay(player) { 44 var meta = player.meta(); 45 var html = []; 46 html.push("<div id='" + player.id + "_display'" + getStyle(player, 'display') + ">"); 47 html.push("<div id='" + player.id + "_displayImage'" + getStyle(player, 'displayImage') + "> </div>"); 48 html.push("<div id='" + player.id + "_displayIconBackground'" + getStyle(player, 'displayIconBackground') + ">"); 49 html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + getStyle(player, 'displayIcon') + "/>"); 50 html.push('</div>'); 51 html.push('<div id="' + player.id + '_logo" target="_blank"' + getStyle(player, 'logo') + '> </div>'); 52 html.push('</div>'); 53 displays[player.id].domelement.before(html.join('')); 54 setupDisplayElements(player); 55 } 56 57 function getStyle(player, element) { 58 var result = ''; 59 for (var style in displays[player.id].elements[element].style) { 60 result += style + ":" + displays[player.id].elements[element].style[style] + ";"; 61 } 62 if (result === '') { 63 return ' '; 64 } 65 return ' style="' + result + '" '; 66 } 67 68 function setupDisplayElements(player) { 69 var displayElements = initializeDisplayElements(player); 70 for (var element in displayElements) { 71 var elementId = ['#', player.id, '_', element]; 72 displays[player.id][element] = $(elementId.join('')); 73 if (displayElements[element].click !== undefined) { 74 displays[player.id][element].click(displayElements[element].click); 102 }, 103 displayIconBackground: { 104 style: { 105 cursor: 'pointer', 106 position: 'absolute', 107 top: ((meta.height - player.skin.display.elements.background.height) / 2) + "px", 108 left: ((meta.width - player.skin.display.elements.background.width) / 2) + "px", 109 border: 0, 110 'background-image': (['url(', player.skin.display.elements.background.src, ')']).join(''), 111 width: player.skin.display.elements.background.width + "px", 112 height: player.skin.display.elements.background.height + "px", 113 margin: 0, 114 padding: 0 75 115 } 76 } 77 } 78 79 function initializeDisplayElements(player) { 80 var meta = player.meta(); 81 var elements = { 82 display: { 83 style: { 84 cursor: 'pointer', 85 width: meta.width + "px", 86 height: meta.height + "px", 87 position: 'relative', 88 'z-index': 50, 89 margin: 0, 90 padding: 0 91 }, 92 click: displayClickHandler(player) 116 }, 117 displayImage: { 118 style: { 119 display: 'block', 120 background: ([player.config.screencolor, ' url(', jwplayer.html5.utils.getAbsolutePath(player.config.image), ') no-repeat center center']).join(''), 121 width: meta.width + "px", 122 height: meta.height + "px", 123 position: 'absolute', 124 cursor: 'pointer', 125 left: 0, 126 top: 0, 127 margin: 0, 128 padding: 0, 129 'text-decoration': 'none' 130 } 131 }, 132 logo: { 133 style: { 134 position: 'absolute', 135 width: jwplayer.html5.display.logoDefaults.width + "px", 136 height: jwplayer.html5.display.logoDefaults.height + "px", 137 'background-image': (['url(', jwplayer.html5.display.logoDefaults.prefix, jwplayer.html5.display.logoDefaults.file, ')']).join(''), 138 margin: 0, 139 padding: 0, 140 display: 'none', 141 'text-decoration': 'none' 93 142 }, 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 103 } 104 }, 105 displayIconBackground: { 106 style: { 107 cursor: 'pointer', 108 position: 'absolute', 109 top: ((meta.height - player.skin.display.elements.background.height) / 2) + "px", 110 left: ((meta.width - 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 117 } 118 }, 119 displayImage: { 120 style: { 121 display: 'block', 122 background: ([player.config.screencolor, ' url(', $.fn.jwplayerUtils.getAbsolutePath(player.config.image), ') no-repeat center center']).join(''), 123 width: meta.width + "px", 124 height: meta.height + "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 function displayClickHandler(player) { 156 return function(evt) { 157 if (player.media === undefined) { 158 document.location.href = $.fn.jwplayerUtils.getAbsolutePath(player.meta().sources[player.meta().source].file); 159 return; 160 } 161 if (typeof evt.preventDefault != 'undefined') { 162 evt.preventDefault(); // W3C 163 } else { 164 evt.returnValue = false; // IE 165 } 166 if (player.model.state != $.fn.jwplayer.states.PLAYING) { 167 player.play(); 168 } else { 169 player.pause(); 170 } 171 }; 172 } 173 174 function logoClickHandler() { 175 return function(evt) { 176 evt.stopPropagation(); 143 click: jwplayer.html5.display.logoClickHandler() 144 } 145 }; 146 var positions = jwplayer.html5.display.logoDefaults.position.split("-"); 147 for (var position in positions) { 148 elements.logo.style[positions[position]] = jwplayer.html5.display.logoDefaults.margin + "px"; 149 } 150 return elements; 151 }; 152 153 154 jwplayer.html5.display.displayClickHandler = function(player) { 155 return function(evt) { 156 if (player._media === undefined) { 157 document.location.href = jwplayer.html5.utils.getAbsolutePath(player.meta().sources[player.meta().source].file); 177 158 return; 178 }; 179 } 180 181 function setIcon(player, path) { 182 $("#" + player.id + "_displayIcon")[0].src = path; 183 } 184 185 function animate(element, state) { 186 var speed = 'slow'; 187 if (!displays[player.id].animate) { 188 return; 189 } 190 if (state) { 191 element.slideDown(speed, function() { 192 animate(element); 193 }); 159 } 160 if (typeof evt.preventDefault != 'undefined') { 161 evt.preventDefault(); // W3C 194 162 } else { 195 element.slideUp(speed, function() { 196 animate(element, true); 197 }); 198 } 199 } 200 201 202 function stateHandler(obj) { 163 evt.returnValue = false; // IE 164 } 165 if (player._model.state != jwplayer.html5.states.PLAYING) { 166 player.play(); 167 } else { 168 player.pause(); 169 } 170 }; 171 }; 172 173 174 jwplayer.html5.display.logoClickHandler = function() { 175 return function(evt) { 176 evt.stopPropagation(); 177 return; 178 }; 179 }; 180 181 182 jwplayer.html5.display.setIcon = function(player, path) { 183 $("#" + player.id + "_displayIcon")[0].src = path; 184 }; 185 186 187 jwplayer.html5.display.animate = function(element, state) { 188 var speed = 'slow'; 189 if (!player._model.components.display.animate) { 190 return; 191 } 192 if (state) { 193 element.slideDown(speed, function() { 194 jwplayer.html5.display.animate(element); 195 }); 196 } else { 197 element.slideUp(speed, function() { 198 jwplayer.html5.display.animate(element, true); 199 }); 200 } 201 }; 202 203 204 jwplayer.html5.display.stateHandler = function(player) { 205 return function(obj) { 203 206 player = $.jwplayer(obj.id); 204 displays[player.id].animate = false;205 switch (player. model.state) {206 case $.fn.jwplayer.states.BUFFERING:207 player._model.components.display.animate = false; 208 switch (player._model.state) { 209 case jwplayer.html5.states.BUFFERING: 207 210 displays[obj.id].logo.fadeIn(0, function() { 208 211 setTimeout(function() { 209 displays[obj.id].logo.fadeOut( logoDefaults.out * 1000);210 }, logoDefaults.timeout * 1000);212 displays[obj.id].logo.fadeOut(jwplayer.html5.display.logoDefaults.out * 1000); 213 }, jwplayer.html5.display.logoDefaults.timeout * 1000); 211 214 }); 212 215 displays[obj.id].displayIcon[0].src = player.skin.display.elements.bufferIcon.src; … … 216 219 left: (player.skin.display.elements.background.width - player.skin.display.elements.bufferIcon.width) / 2 + "px" 217 220 }); 218 displays[player.id].animate = true;221 player._model.components.display.animate = true; 219 222 // TODO: Buffer Icon rotation 220 223 if (false) { 221 animate(displays[obj.id].displayIconBackground);224 jwplayer.html5.display.animate(displays[obj.id].displayIconBackground); 222 225 } 223 226 displays[obj.id].displayIconBackground.css('display', 'none'); 224 227 break; 225 case $.fn.jwplayer.states.PAUSED:228 case jwplayer.html5.states.PAUSED: 226 229 displays[obj.id].logo.fadeIn(0); 227 230 displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); … … 234 237 }); 235 238 break; 236 case $.fn.jwplayer.states.IDLE:239 case jwplayer.html5.states.IDLE: 237 240 displays[obj.id].logo.fadeOut(0); 238 displays[obj.id].displayImage.css("background", "#ffffff url('" + $.fn.jwplayerUtils.getAbsolutePath(player.config.image) + "') no-repeat center center");241 displays[obj.id].displayImage.css("background", "#ffffff url('" + jwplayer.html5.utils.getAbsolutePath(player.config.image) + "') no-repeat center center"); 239 242 displays[obj.id].displayIconBackground.css("display", "block"); 240 243 displays[obj.id].displayIcon[0].src = player.skin.display.elements.playIcon.src; … … 263 266 displays[obj.id].logo.fadeIn(0, function() { 264 267 setTimeout(function() { 265 displays[obj.id].logo.fadeOut( logoDefaults.out * 1000);266 }, logoDefaults.timeout * 1000);268 displays[obj.id].logo.fadeOut(jwplayer.html5.display.logoDefaults.out * 1000); 269 }, jwplayer.html5.display.logoDefaults.timeout * 1000); 267 270 }); 268 271 displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); … … 272 275 break; 273 276 } 274 } 275 276 })(jQuery); 277 }; 278 }; 279 -
trunk/html5/src/html5/jwplayer.html5.js
r1189 r1190 2 2 * Core component of the JW Player (initialization, API). 3 3 * 4 * @author jeroen 5 * @version 1.0alpha 6 * @lastmodifiedauthor zach 7 * @lastmodifieddate 2010-04-11 4 * @author zach 5 * @version 1.0 8 6 */ 9 (function($) { 10 /** Map with all players on the page. **/ 11 var players = {}; 12 13 /** Hooking the controlbar up to jQuery. **/ 14 $.fn.jwplayer = function(options) { 15 return this.each(function() { 16 $.fn.jwplayerUtils.log("Starting setup", this); 17 return setupJWPlayer($(this), 0, options); 18 }); 19 }; 20 21 function setupJWPlayer(player, step, options) { 22 try { 23 switch (step) { 24 case 0: 25 var model = $.fn.jwplayerModel(player, options); 26 var jwplayer = { 27 model: model, 28 listeners: {} 29 }; 30 return setupJWPlayer(jwplayer, step + 1); 31 case 1: 32 player.controller = $.fn.jwplayerController(player); 33 players[player.model.config.id] = player; 34 setupJWPlayer($.extend(player, api(player)), step + 1); 35 return player; 36 case 2: 37 $.fn.jwplayerSkinner(player, function() { 38 setupJWPlayer(player, step + 1); 39 }); 40 break; 41 case 3: 42 $.fn.jwplayerView(player); 43 setupJWPlayer(player, step + 1); 44 break; 45 case 4: 46 $.fn.jwplayerModel.setActiveMediaProvider(player); 47 if ((player.media === undefined) || !player.media.hasChrome) { 48 setupJWPlayer(player, step + 1); 49 } 50 break; 51 case 5: 52 $.fn.jwplayerDisplay($.jwplayer(player.id), player.model.domelement); 53 if (player.media === undefined) { 54 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 55 } else { 56 setupJWPlayer(player, step + 1); 57 } 58 break; 59 case 6: 60 if (!$.fn.jwplayerUtils.isiPhone()) { 61 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 62 } 63 setupJWPlayer(player, step + 1); 64 break; 65 case 7: 66 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 67 setupJWPlayer(player, step + 1); 68 break; 69 default: 70 if (player.config.autostart === true) { 71 player.play(); 72 } 73 break; 74 } 75 } catch (err) { 76 $.fn.jwplayerUtils.log("Setup failed at step " + step, err); 7 8 jwplayer = function(){}; 9 10 jwplayer.html5 = function(domelement) { 11 this._domelement = domelement; 12 this.id = domelement.id; 13 return this.html5; 14 }; 15 16 jwplayer.html5.prototype = { 17 id: undefined, 18 version: "1.0", 19 skin: undefined, 20 _model: undefined, 21 _view: undefined, 22 _controller: undefined, 23 _listeners: undefined, 24 _media: undefined, 25 _domelement: undefined 26 }; 27 28 jwplayer.html5.setup = function(options){ 29 jwplayer.html5.utils.log("Starting setup", this); 30 jwplayer.html5._setup(this, 0, options); 31 return this; 32 }; 33 34 jwplayer.html5._setup = function(player, step, options) { 35 try { 36 switch (step) { 37 case 0: 38 player._model = new jwplayer.html5.model(options); 39 player._model.domelement = $(player.domelement); 40 jwplayer.html5._setup(player, step + 1); 41 break; 42 case 1: 43 player._controller = jwplayer.html5.controller(player); 44 jwplayer.html5._setup($.extend(player, jwplayer.html5._api(player)), step + 1); 45 break; 46 case 2: 47 jwplayer.html5.skinner(player, function() { 48 jwplayer.html5._setup(player, step + 1); 49 }); 50 break; 51 case 3: 52 jwplayer.html5.view(player); 53 jwplayer.html5._setup(player, step + 1); 54 break; 55 case 4: 56 jwplayer.html5.model.setActiveMediaProvider(player); 57 if ((player._media === undefined) || !player._media.hasChrome) { 58 jwplayer.html5._setup(player, step + 1); 59 } 60 break; 61 case 5: 62 jwplayer.html5.display(player, player._model.domelement); 63 if (player._media === undefined) { 64 player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 65 } else { 66 jwplayer.html5._setup(player, step + 1); 67 } 68 break; 69 case 6: 70 if (!jwplayer.html5.utils.isiPhone()) { 71 jwplayer.html5.controlbar(player, player._model.domelement); 72 } 73 jwplayer.html5._setup(player, step + 1); 74 break; 75 case 7: 76 player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 77 jwplayer.html5._setup(player, step + 1); 78 break; 79 default: 80 if (player.config.autostart === true) { 81 player.play(); 82 } 83 break; 77 84 } 85 } catch (err) { 86 jwplayer.html5.utils.log("Setup failed at step " + step, err); 78 87 } 79 80 81 /** Map with config for the controlbar plugin. **/ 82 $.fn.jwplayer.defaults = { 83 autostart: false, 84 file: undefined, 85 height: 295, 86 image: undefined, 87 skin: undefined, 88 volume: 90, 89 width: 480, 90 mute: false, 91 bufferlength: 5, 92 start: 0, 93 position: 0, 94 debug: undefined, 95 flashplayer: undefined, 96 repeat: false 97 }; 98 99 100 /** A factory for API calls that either set listeners or return data **/ 101 function dataListenerFactory(player, dataType, eventType) { 102 return function(arg) { 103 switch ($.fn.jwplayerUtils.typeOf(arg)) { 104 case "function": 105 if (!$.fn.jwplayerUtils.isNull(eventType)) { 106 player.addEventListener(eventType, arg); 107 } 108 break; 109 default: 110 if (!$.fn.jwplayerUtils.isNull(dataType)) { 111 return player.controller.mediaInfo()[dataType]; 112 } 113 return player.controller.mediaInfo(); 114 } 115 return $.jwplayer(player.id); 116 }; 117 } 118 119 120 function api(player) { 121 if (!$.fn.jwplayerUtils.isNull(player.id)) { 122 return player; 123 } 124 return { 125 play: player.controller.play, 126 pause: player.controller.pause, 127 stop: player.controller.stop, 128 seek: player.controller.seek, 129 130 resize: player.controller.resize, 131 fullscreen: player.controller.fullscreen, 132 volume: player.controller.volume, 133 mute: player.controller.mute, 134 load: player.controller.load, 135 136 addEventListener: player.controller.addEventListener, 137 removeEventListener: player.controller.removeEventListener, 138 sendEvent: player.controller.sendEvent, 139 140 ready: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_READY), 141 error: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_ERROR), 142 complete: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE), 143 state: dataListenerFactory(player, 'state', $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE), 144 buffer: dataListenerFactory(player, 'buffer', $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER), 145 time: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME), 146 position: dataListenerFactory(player, 'position'), 147 duration: dataListenerFactory(player, 'duration'), 148 width: dataListenerFactory(player, 'width'), 149 height: dataListenerFactory(player, 'height'), 150 meta: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_META), 151 152 id: player.model.config.id, 153 config: player.model.config, 154 version: '0.1-alpha', 155 skin: player.skin 156 }; 157 } 158 159 function jwplayer(selector) { 160 if ($.fn.jwplayerUtils.isNull(selector)) { 161 for (var player in players) { 162 return api(players[player]); 163 } 164 } else { 165 if (selector.indexOf('#') === 0) { 166 selector = selector.substr(1, selector.length); 167 } 168 return api(players[selector]); 169 } 170 return null; 171 } 172 173 $.fn.jwplayer.states = { 174 IDLE: 'IDLE', 175 BUFFERING: 'BUFFERING', 176 PLAYING: 'PLAYING', 177 PAUSED: 'PAUSED' 178 }; 179 180 $.fn.jwplayer.events = { 181 JWPLAYER_READY: 'jwplayerReady', 182 JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', 183 JWPLAYER_RESIZE: 'jwplayerResize', 184 //JWPLAYER_LOCKED: 'jwplayerLocked', 185 //JWPLAYER_UNLOCKED: 'jwplayerLocked', 186 JWPLAYER_ERROR: 'jwplayerError', 187 JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', 188 JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', 189 JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', 190 JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', 191 JWPLAYER_MEDIA_COMPLETE: 'jwplayerMediaComplete', 192 JWPLAYER_MEDIA_TIME: 'jwplayerMediaTime', 193 JWPLAYER_MEDIA_VOLUME: 'jwplayerMediaVolume', 194 JWPLAYER_MEDIA_META: 'jwplayerMediaMeta', 195 JWPLAYER_MEDIA_MUTE: 'jwplayerMediaMute', 196 JWPLAYER_PLAYER_STATE: 'jwplayerPlayerState' 197 }; 198 199 /** Extending jQuery **/ 200 $.extend({ 201 'jwplayer': jwplayer 202 }); 203 204 /** Automatically initializes the player for all <video> tags with the JWPlayer class. **/ 205 $(document).ready(function() { 206 $("video.jwplayer").jwplayer(); 207 }); 208 209 })(jQuery); 88 }; -
trunk/html5/src/html5/jwplayer.html5.mediavideo.js
r1189 r1190 6 6 * @lastmodifieddate 2010-04-12 7 7 */ 8 (function($) { 9 var states = { 10 "ended": $.fn.jwplayer.states.IDLE, 11 "playing": $.fn.jwplayer.states.PLAYING, 12 "pause": $.fn.jwplayer.states.PAUSED, 13 "buffering": $.fn.jwplayer.states.BUFFERING 14 }; 8 jwplayer.html5.mediavideo = function(player) { 9 player._model.domelement.attr('loop', player._model.config.repeat); 10 var media = { 11 play: jwplayer.html5.mediavideo.play(player), 12 pause: jwplayer.html5.mediavideo.pause(player), 13 seek: jwplayer.html5.mediavideo.seek(player), 14 stop: jwplayer.html5.mediavideo.stop(player), 15 volume: jwplayer.html5.mediavideo.volume(player), 16 mute: jwplayer.html5.mediavideo.mute(player), 17 fullscreen: jwplayer.html5.mediavideo.fullscreen(player), 18 load: jwplayer.html5.mediavideo.load(player), 19 resize: jwplayer.html5.mediavideo.resize(player), 20 state: jwplayer.html5.states.IDLE, 21 interval: null, 22 loadcount: 0, 23 hasChrome: false 24 }; 25 player._media = media; 26 media.mute(player.mute()); 27 media.volume(player.volume()); 28 $.each(jwplayer.html5.mediavideo.events, function(event, handler) { 29 player.domelement.addEventListener(event, function(event) { 30 handler(event, player); 31 }, true); 32 }); 33 }; 34 35 jwplayer.html5.mediavideo.states = { 36 "ended": jwplayer.html5.states.IDLE, 37 "playing": jwplayer.html5.states.PLAYING, 38 "pause": jwplayer.html5.states.PAUSED, 39 "buffering": jwplayer.html5.states.BUFFERING 40 }; 41 42 jwplayer.html5.mediavideo.events = { 43 'abort': jwplayer.html5.mediavideo.generalHandler, 44 'canplay': jwplayer.html5.mediavideo.stateHandler, 45 'canplaythrough': jwplayer.html5.mediavideo.stateHandler, 46 'durationchange': jwplayer.html5.mediavideo.metaHandler, 47 'emptied': jwplayer.html5.mediavideo.generalHandler, 48 'ended': jwplayer.html5.mediavideo.stateHandler, 49 'error': jwplayer.html5.mediavideo.errorHandler, 50 'loadeddata': jwplayer.html5.mediavideo.metaHandler, 51 'loadedmetadata': jwplayer.html5.mediavideo.metaHandler, 52 'loadstart': jwplayer.html5.mediavideo.stateHandler, 53 'pause': jwplayer.html5.mediavideo.stateHandler, 54 'play': jwplayer.html5.mediavideo.positionHandler, 55 'playing': jwplayer.html5.mediavideo.stateHandler, 56 'progress': jwplayer.html5.mediavideo.progressHandler, 57 'ratechange': jwplayer.html5.mediavideo.generalHandler, 58 'seeked': jwplayer.html5.mediavideo.stateHandler, 59 'seeking': jwplayer.html5.mediavideo.stateHandler, 60 'stalled': jwplayer.html5.mediavideo.stateHandler, 61 'suspend': jwplayer.html5.mediavideo.stateHandler, 62 'timeupdate': jwplayer.html5.mediavideo.positionHandler, 63 'volumechange': jwplayer.html5.mediavideo.generalHandler, 64 'waiting': jwplayer.html5.mediavideo.stateHandler, 65 'canshowcurrentframe': jwplayer.html5.mediavideo.generalHandler, 66 'dataunavailable': jwplayer.html5.mediavideo.generalHandler, 67 'empty': jwplayer.html5.mediavideo.generalHandler, 68 'load': jwplayer.html5.mediavideo.generalHandler, 69 'loadedfirstframe': jwplayer.html5.mediavideo.generalHandler 70 }; 71 72 jwplayer.html5.mediavideo.stateHandler = function(event, player) { 73 if (jwplayer.html5.mediavideo.states[event.type]) { 74 jwplayer.html5.mediavideo.setState(player, jwplayer.html5.mediavideo.states[event.type]); 75 } 76 }; 77 78 79 jwplayer.html5.mediavideo.setState = function(player, newstate) { 80 if (player._media.stopped) { 81 newstate = jwplayer.html5.states.IDLE; 82 } 83 if (player._model.state != newstate) { 84 var oldstate = player._model.state; 85 player._media.state = newstate; 86 player._model.state = newstate; 87 player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, { 88 oldstate: oldstate, 89 newstate: newstate 90 }); 91 } 92 if (newstate == jwplayer.html5.states.IDLE) { 93 clearInterval(player._media.interval); 94 player._media.interval = null; 95 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE); 96 if (player._model.config.repeat && !player._media.stopped) { 97 player.play(); 98 } 99 if (player._model.domelement.css('display') != 'none') { 100 player._model.domelement.css('display', 'none'); 101 } 102 } 103 player._media.stopped = false; 104 }; 105 106 107 jwplayer.html5.mediavideo.metaHandler = function(event, player) { 108 var meta = { 109 height: event.target.videoHeight, 110 width: event.target.videoWidth, 111 duration: event.target.duration 112 }; 113 if (player._model.duration === 0) { 114 player._model.duration = event.target.duration; 115 } 116 player._model.sources[player._model.source] = $.extend(player._model.sources[player._model.source], meta); 117 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_META, meta); 118 }; 119 120 121 jwplayer.html5.mediavideo.positionHandler = function(event, player) { 122 if (player._media.stopped) { 123 return; 124 } 125 if (!jwplayer.html5.utils.isNull(event.target)) { 126 if (player._model.duration === 0) { 127 player._model.duration = event.target.duration; 128 } 129 130 if (player._media.state == jwplayer.html5.states.PLAYING) { 131 player._model.position = Math.round(event.target.currentTime * 10) / 10; 132 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, { 133 position: Math.round(event.target.currentTime * 10) / 10, 134 duration: Math.round(event.target.duration * 10) / 10 135 }); 136 } 137 } 138 jwplayer.html5.mediavideo.progressHandler({}, player); 139 }; 140 141 142 jwplayer.html5.mediavideo.progressHandler = function(event, player) { 143 var bufferPercent, bufferTime, bufferFill; 144 if (!isNaN(event.loaded / event.total)) { 145 bufferPercent = event.loaded / event.total * 100; 146 bufferTime = bufferPercent / 100 * (player._model.duration - player.domelement.currentTime); 147 } else if ((player.domelement.buffered !== undefined) && (player.domelement.buffered.length > 0)) { 148 maxBufferIndex = 0; 149 if (maxBufferIndex >= 0) { 150 bufferPercent = player.domelement.buffered.end(maxBufferIndex) / player.domelement.duration * 100; 151 bufferTime = player.domelement.buffered.end(maxBufferIndex) - player.domelement.currentTime; 152 } 153 } 15 154 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 }; 155 bufferFill = bufferTime / player._model.config.bufferlength * 100; 45 156 157 // TODO: Buffer underrun 158 if (false) { 159 if (bufferFill < 25 && player._media.state == jwplayer.html5.states.PLAYING) { 160 jwplayer.html5.mediavideo.setState(jwplayer.html5.states.BUFFERING); 161 player._media.bufferFull = false; 162 if (!player.domelement.seeking) { 163 player.domelement.pause(); 164 } 165 } else if (bufferFill > 95 && player._media.state == jwplayer.html5.states.BUFFERING && player._media.bufferFull === false && bufferTime > 0) { 166 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 167 } 168 } 46 169 47 $.fn.jwplayerMediaVideo = function(player) { 48 player.model.domelement.attr('loop', player.config.repeat); 49 var media = { 50 play: play(player), 51 pause: pause(player), 52 seek: seek(player), 53 stop: stop(player), 54 volume: volume(player), 55 mute: mute(player), 56 fullscreen: fullscreen(player), 57 load: load(player), 58 resize: resize(player), 59 state: $.fn.jwplayer.states.IDLE, 60 interval: null, 61 loadcount: 0, 62 hasChrome: false 63 }; 64 player.media = media; 65 media.mute(player.mute()); 66 media.volume(player.volume()); 67 $.each(events, function(event, handler) { 68 player.model.domelement[0].addEventListener(event, function(event) { 69 handler(event, player); 70 }, true); 170 if (player._media.bufferFull === false) { 171 player._media.bufferFull = true; 172 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 173 } 174 175 if (!player._media.bufferingComplete) { 176 if (bufferPercent == 100 && player._media.bufferingComplete === false) { 177 player._media.bufferingComplete = true; 178 } 179 180 if (!jwplayer.html5.utils.isNull(bufferPercent)) { 181 player._model.buffer = Math.round(bufferPercent); 182 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, { 183 bufferPercent: Math.round(bufferPercent) 184 //bufferingComplete: player._media.bufferingComplete, 185 //bufferFull: player._media.bufferFull, 186 //bufferFill: bufferFill, 187 //bufferTime: bufferTime 188 }); 189 } 190 191 } 192 }; 193 194 195 jwplayer.html5.mediavideo.startInterval = function(player) { 196 if (player._media.interval === null) { 197 player._media.interval = window.setInterval(function() { 198 jwplayer.html5.mediavideo.positionHandler({}, player); 199 }, 100); 200 } 201 }; 202 203 204 jwplayer.html5.mediavideo.errorHandler = function(event, player) { 205 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, {}); 206 }; 207 208 209 jwplayer.html5.mediavideo.play = function(player) { 210 return function() { 211 if (player._media.state != jwplayer.html5.states.PLAYING) { 212 jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.PLAYING); 213 player.domelement.play(); 214 } 215 }; 216 }; 217 218 219 /** Switch the pause state of the player. **/ 220 jwplayer.html5.mediavideo.pause = function(player) { 221 return function() { 222 player.domelement.pause(); 223 }; 224 }; 225 226 227 /** Seek to a position in the video. **/ 228 jwplayer.html5.mediavideo.seek = function(player) { 229 return function(position) { 230 player.domelement.currentTime = position; 231 player.domelement.play(); 232 }; 233 }; 234 235 236 /** Stop playback and loading of the video. **/ 237 jwplayer.html5.mediavideo.stop = function(player) { 238 return function() { 239 player._media.stopped = true; 240 player.domelement.pause(); 241 clearInterval(player._media.interval); 242 player._media.interval = undefined; 243 player._model.position = 0; 244 }; 245 }; 246 247 248 /** Change the video's volume level. **/ 249 jwplayer.html5.mediavideo.volume = function(player) { 250 return function(position) { 251 player._model.volume = position; 252 player.domelement.volume = position / 100; 253 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, { 254 volume: Math.round(player.domelement.volume * 100) 71 255 }); 72 256 }; 73 74 function generalHandler(event, player) { 75 } 76 77 function stateHandler(event, player) { 78 if (states[event.type]) { 79 setState(player, states[event.type]); 80 } 81 } 82 83 function setState(player, newstate) { 84 if (player.media.stopped) { 85 newstate = $.fn.jwplayer.states.IDLE; 86 } 87 if (player.model.state != newstate) { 88 var oldstate = player.model.state; 89 player.media.state = newstate; 90 player.model.state = newstate; 91 player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 92 oldstate: oldstate, 93 newstate: newstate 94 }); 95 } 96 if (newstate == $.fn.jwplayer.states.IDLE) { 97 clearInterval(player.media.interval); 98 player.media.interval = null; 99 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE); 100 if (player.config.repeat && !player.media.stopped) { 101 player.play(); 257 }; 258 259 260 /** Switch the mute state of the player. **/ 261 jwplayer.html5.mediavideo.mute = function(player) { 262 return function(state) { 263 player._model.mute = state; 264 player.domelement.muted = state; 265 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, { 266 mute: player.domelement.muted 267 }); 268 }; 269 }; 270 271 272 /** Resize the player. **/ 273 jwplayer.html5.mediavideo.resize = function(player) { 274 return function(width, height) { 275 // TODO: Fullscreen 276 if (false) { 277 $("#" + player.id + "_jwplayer").css("position", 'fixed'); 278 $("#" + player.id + "_jwplayer").css("top", '0'); 279 $("#" + player.id + "_jwplayer").css("left", '0'); 280 $("#" + player.id + "_jwplayer").css("width", width); 281 $("#" + player.id + "_jwplayer").css("height", height); 282 player._model.width = $("#" + player.id + "_jwplayer").width; 283 player._model.height = $("#" + player.id + "_jwplayer").height; 284 } 285 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_RESIZE, { 286 fullscreen: player._model.fullscreen, 287 width: width, 288 hieght: height 289 }); 290 }; 291 }; 292 293 294 /** Switch the fullscreen state of the player. **/ 295 jwplayer.html5.mediavideo.fullscreen = function(player) { 296 return function(state) { 297 player._model.fullscreen = state; 298 if (state === true) { 299 player.resize("100%", "100%"); 300 } else { 301 player.resize(player._model.config.width, player._model.config.height); 302 } 303 }; 304 }; 305 306 307 /** Load a new video into the player. **/ 308 jwplayer.html5.mediavideo.load = function(player) { 309 return function(path) { 310 if (player._model.domelement.css('display') == 'none') { 311 player._model.domelement.css('display', 'block'); 312 } 313 314 setTimeout(function() { 315 path = jwplayer.html5.utils.getAbsolutePath(path); 316 if (path == player.domelement.src && player._media.loadcount > 0) { 317 player._model.position = 0; 318 player.domelement.currentTime = 0; 319 jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.BUFFERING); 320 jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.PLAYING); 321 if (player.domelement.paused) { 322 player.domelement.play(); 323 } 324 return; 325 } else if (path != player.domelement.src) { 326 player._media.loadcount = 0; 102 327 } 103 if (player.model.domelement.css('display') != 'none') { 104 player.model.domelement.css('display', 'none'); 328 player._media.loadcount++; 329 player._media.bufferFull = false; 330 player._media.bufferingComplete = false; 331 jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.BUFFERING); 332 player.domelement.src = path; 333 player.domelement.load(); 334 jwplayer.html5.mediavideo.startInterval(player); 335 try { 336 player.domelement.currentTime = 0; 337 } catch (err) { 338 105 339 } 106 } 107 player.media.stopped = false; 108 } 109 110 function metaHandler(event, player) { 111 var meta = { 112 height: event.target.videoHeight, 113 width: event.target.videoWidth, 114 duration: event.target.duration 115 }; 116 if (player.model.duration === 0) { 117 player.model.duration = event.target.duration; 118 } 119 player.model.sources[player.model.source] = $.extend(player.model.sources[player.model.source], meta); 120 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_META, meta); 121 } 122 123 function positionHandler(event, player) { 124 if (player.media.stopped) { 125 return; 126 } 127 if (!$.fn.jwplayerUtils.isNull(event.target)) { 128 if (player.model.duration === 0) { 129 player.model.duration = event.target.duration; 130 } 131 132 if (player.media.state == $.fn.jwplayer.states.PLAYING) { 133 player.model.position = Math.round(event.target.currentTime * 10) / 10; 134 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 135 position: Math.round(event.target.currentTime * 10) / 10, 136 duration: Math.round(event.target.duration * 10) / 10 137 }); 138 } 139 } 140 progressHandler({}, player); 141 } 142 143 function progressHandler(event, player) { 144 var bufferPercent, bufferTime, bufferFill; 145 if (!isNaN(event.loaded / event.total)) { 146 bufferPercent = event.loaded / event.total * 100; 147 bufferTime = bufferPercent / 100 * (player.model.duration - player.model.domelement[0].currentTime); 148 } else if ((player.model.domelement[0].buffered !== undefined) && (player.model.domelement[0].buffered.length > 0)) { 149 maxBufferIndex = 0; 150 if (maxBufferIndex >= 0) { 151 bufferPercent = player.model.domelement[0].buffered.end(maxBufferIndex) / player.model.domelement[0].duration * 100; 152 bufferTime = player.model.domelement[0].buffered.end(maxBufferIndex) - player.model.domelement[0].currentTime; 153 } 154 } 155 156 bufferFill = bufferTime / player.model.config.bufferlength * 100; 157 158 // TODO: Buffer underrun 159 if (false) { 160 if (bufferFill < 25 && player.media.state == $.fn.jwplayer.states.PLAYING) { 161 setState($.fn.jwplayer.states.BUFFERING); 162 player.media.bufferFull = false; 163 if (!player.model.domelement[0].seeking) { 164 player.model.domelement[0].pause(); 165 } 166 } else if (bufferFill > 95 && player.media.state == $.fn.jwplayer.states.BUFFERING && player.media.bufferFull === false && bufferTime > 0) { 167 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 168 } 169 } 170 171 if (player.media.bufferFull === false) { 172 player.media.bufferFull = true; 173 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 174 } 175 176 if (!player.media.bufferingComplete) { 177 if (bufferPercent == 100 && player.media.bufferingComplete === false) { 178 player.media.bufferingComplete = true; 179 } 180 181 if (!$.fn.jwplayerUtils.isNull(bufferPercent)) { 182 player.model.buffer = Math.round(bufferPercent); 183 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 184 bufferPercent: Math.round(bufferPercent) 185 //bufferingComplete: player.media.bufferingComplete, 186 //bufferFull: player.media.bufferFull, 187 //bufferFill: bufferFill, 188 //bufferTime: bufferTime 189 }); 190 } 191 192 } 193 } 194 195 function startInterval(player) { 196 if (player.media.interval === null) { 197 player.media.interval = window.setInterval(function() { 198 positionHandler({}, player); 199 }, 100); 200 } 201 } 202 203 204 function errorHandler(event, player) { 205 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, {}); 206 } 207 208 function play(player) { 209 return function() { 210 if (player.media.state != $.fn.jwplayer.states.PLAYING) { 211 setState(player, $.fn.jwplayer.states.PLAYING); 212 player.model.domelement[0].play(); 213 } 214 }; 215 } 216 217 /** Switch the pause state of the player. **/ 218 function pause(player) { 219 return function() { 220 player.model.domelement[0].pause(); 221 }; 222 } 223 224 225 /** Seek to a position in the video. **/ 226 function seek(player) { 227 return function(position) { 228 player.model.domelement[0].currentTime = position; 229 player.model.domelement[0].play(); 230 }; 231 } 232 233 234 /** Stop playback and loading of the video. **/ 235 function stop(player) { 236 return function() { 237 player.media.stopped = true; 238 player.model.domelement[0].pause(); 239 clearInterval(player.media.interval); 240 player.media.interval = undefined; 241 player.model.position = 0; 242 }; 243 } 244 245 246 /** Change the video's volume level. **/ 247 function volume(player) { 248 return function(position) { 249 player.model.volume = position; 250 player.model.domelement[0].volume = position / 100; 251 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, { 252 volume: Math.round(player.model.domelement[0].volume * 100) 253 }); 254 }; 255 } 256 257 /** Switch the mute state of the player. **/ 258 function mute(player) { 259 return function(state) { 260 player.model.mute = state; 261 player.model.domelement[0].muted = state; 262 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, { 263 mute: player.model.domelement[0].muted 264 }); 265 }; 266 } 267 268 /** Resize the player. **/ 269 function resize(player) { 270 return function(width, height) { 271 // TODO: Fullscreen 272 if (false) { 273 $("#" + player.id + "_jwplayer").css("position", 'fixed'); 274 $("#" + player.id + "_jwplayer").css("top", '0'); 275 $("#" + player.id + "_jwplayer").css("left", '0'); 276 $("#" + player.id + "_jwplayer").css("width", width); 277 $("#" + player.id + "_jwplayer").css("height", height); 278 player.model.width = $("#" + player.id + "_jwplayer").width; 279 player.model.height = $("#" + player.id + "_jwplayer").height; 280 } 281 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_RESIZE, { 282 fullscreen: player.model.fullscreen, 283 width: width, 284 hieght: height 285 }); 286 }; 287 } 288 289 /** Switch the fullscreen state of the player. **/ 290 function fullscreen(player) { 291 return function(state) { 292 player.model.fullscreen = state; 293 if (state === true) { 294 player.resize("100%", "100%"); 295 } else { 296 player.resize(player.model.config.width, player.model.config.height); 297 } 298 }; 299 } 300 301 /** Load a new video into the player. **/ 302 function load(player) { 303 return function(path) { 304 if (player.model.domelement.css('display') == 'none') { 305 player.model.domelement.css('display', 'block'); 306 } 307 308 setTimeout(function() { 309 path = $.fn.jwplayerUtils.getAbsolutePath(path); 310 if (path == player.model.domelement[0].src && player.media.loadcount > 0) { 311 player.model.position = 0; 312 player.model.domelement[0].currentTime = 0; 313 setState(player, $.fn.jwplayer.states.BUFFERING); 314 setState(player, $.fn.jwplayer.states.PLAYING); 315 if (player.model.domelement[0].paused) { 316 player.model.domelement[0].play(); 317 } 318 return; 319 } else if (path != player.model.domelement[0].src) { 320 player.media.loadcount = 0; 321 } 322 player.media.loadcount++; 323 player.media.bufferFull = false; 324 player.media.bufferingComplete = false; 325 setState(player, $.fn.jwplayer.states.BUFFERING); 326 player.model.domelement[0].src = path; 327 player.model.domelement[0].load(); 328 startInterval(player); 329 try { 330 player.model.domelement[0].currentTime = 0; 331 } catch (err){ 332 333 } 334 }, 25); 335 }; 336 } 337 338 })(jQuery); 340 }, 25); 341 }; 342 }; -
trunk/html5/src/html5/jwplayer.html5.model.js
r1189 r1190 6 6 * @lastmodifieddate 2010-04-11 7 7 */ 8 (function($) { 9 var jwplayerid = 1; 10 11 var modelParams = { 12 volume: 100, 13 fullscreen: false, 14 mute: false, 15 start: 0, 8 jwplayer.html5.model = function(options) { 9 $.extend(this.config, options); 10 this.sources = this.config.sources; 11 delete this.config.sources; 12 for (var index in jwplayer.html5.model._configurableStateVariables) { 13 var configurableStateVariable = jwplayer.html5.model._configurableStateVariables[index]; 14 this[configurableStateVariable] = this.config[configurableStateVariable]; 15 } 16 return this; 17 }; 18 19 jwplayer.html5.model.prototype = { 20 components: {}, 21 sources: {}, 22 state: jwplayer.html5.states.IDLE, 23 source: 0, 24 position: 0, 25 buffer: 0, 26 config: { 16 27 width: 480, 17 28 height: 320, 18 duration: 0 19 }; 20 21 function createModel() { 22 return { 23 sources: {}, 24 state: $.fn.jwplayer.states.IDLE, 25 source: 0, 26 buffer: 0 27 }; 29 skin: undefined, 30 file: undefined, 31 image: undefined, 32 start: 0, 33 duration: 0, 34 bufferlength: 5, 35 volume: 90, 36 mute: false, 37 fullscreen: false, 38 repeat: false, 39 autostart: false, 40 debug: undefined 28 41 } 29 30 31 $.fn.jwplayerModel = function(domElement, options) { 32 var model = createModel(); 33 model.config = $.extend(true, {}, $.fn.jwplayer.defaults, $.fn.jwplayerParse(domElement[0]), options); 34 if ($.fn.jwplayerUtils.isNull(model.config.id)) { 35 model.config.id = "jwplayer_" + jwplayerid++; 42 }; 43 44 jwplayer.html5.model._configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen"]; 45 46 jwplayer.html5.model.setActiveMediaProvider = function(player) { 47 var source, sourceIndex; 48 for (sourceIndex in player._model.sources) { 49 source = player._model.sources[sourceIndex]; 50 if (source.type === undefined) { 51 var extension = jwplayer.html5.utils.extension(source.file); 52 if (extension == "ogv") { 53 extension = "ogg"; 54 } 55 source.type = 'video/' + extension + ';'; 36 56 } 37 model.sources = model.config.sources; 38 delete model.config.sources; 39 model.domelement = domElement; 40 for (var modelParam in modelParams) { 41 if (!$.fn.jwplayerUtils.isNull(model.config[modelParam])) { 42 model[modelParam] = model.config[modelParam]; 43 } else { 44 model[modelParam] = modelParams[modelParam]; 45 } 57 if (jwplayer.html5.utils.supportsType(source.type)) { 58 player._model.source = sourceIndex; 59 jwplayer.html5.mediaVideo(player); 60 return true; 46 61 } 47 //model = $.extend(true, {}, , model); 48 return model; 49 }; 50 51 $.fn.jwplayerModel.setActiveMediaProvider = function(player) { 52 var source, sourceIndex; 53 for (sourceIndex in player.model.sources) { 54 source = player.model.sources[sourceIndex]; 55 if (source.type === undefined) { 56 var extension = $.fn.jwplayerUtils.extension(source.file); 57 if (extension == "ogv") { 58 extension = "ogg"; 59 } 60 source.type = 'video/' + extension + ';'; 61 } 62 if ($.fn.jwplayerUtils.supportsType(source.type)) { 63 player.model.source = sourceIndex; 64 $.fn.jwplayerMediaVideo(player); 65 return true; 66 } 67 } 68 if ($.fn.jwplayerUtils.supportsFlash && player.state != $.fn.jwplayer.states.PLAYING) { 69 for (sourceIndex in player.model.sources) { 70 source = player.model.sources[sourceIndex]; 71 if ($.fn.jwplayerUtils.flashCanPlay(source.file)) { 72 player.model.source = sourceIndex; 73 $.fn.jwplayerMediaFlash(player); 74 return true; 75 } 76 } 77 } 78 return false; 79 }; 80 81 })(jQuery); 62 } 63 return false; 64 }; -
trunk/html5/src/html5/jwplayer.html5.skinner.js
r1189 r1190 7 7 * @lastmodifieddate 2010-04-11 8 8 */ 9 (function($) {10 9 11 var players = {}; 10 /** Constructor **/ 11 jwplayer.html5.skinner = function(player, completeHandler) { 12 player.skin = { 13 _completeHandler: completeHandler, 14 properties: {} 15 }; 16 jwplayer.html5.skinner.load(player); 17 }; 18 19 /** Load the skin **/ 20 jwplayer.html5.skinner.load = function(player) { 21 $.ajax({ 22 url: jwplayer.html5.utils.getAbsolutePath(player._model.config.skin), 23 complete: function(xmlrequest, textStatus) { 24 if (textStatus == "success") { 25 jwplayer.html5.skinner.loadSkin(player, xmlrequest.responseXML); 26 } else { 27 jwplayer.html5.skinner.loadSkin(player, jwplayer.html5.defaultSkin); 28 } 29 } 30 31 }); 32 }; 33 34 35 jwplayer.html5.skinner.loadSkin = function(player, xml) { 36 var components = $('component', xml); 37 if (components.length === 0) { 38 return; 39 } 40 for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 41 player.skin._loading = true; 42 43 var componentName = $(components[componentIndex]).attr('name'); 44 var component = { 45 settings: {}, 46 elements: {} 47 }; 48 player.skin[componentName] = component; 49 var elements = $(components[componentIndex]).find('element'); 50 for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 51 jwplayer.html5.skinner.loadImage(elements[elementIndex], componentName, player); 52 } 53 var settings = $(components[componentIndex]).find('setting'); 54 for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 55 player.skin[componentName].settings[$(settings[settingIndex]).attr("name")] = $(settings[settingIndex]).attr("value"); 56 } 57 58 player.skin._loading = false; 59 60 jwplayer.html5.skinner.resetCompleteIntervalTest(player); 61 } 62 }; 63 64 65 jwplayer.html5.skinner.resetCompleteIntervalTest = function (player) { 66 clearInterval(player.skin._completeInterval); 67 player.skin._completeInterval = setInterval(function() { 68 jwplayer.html5.skinner.checkComplete(player); 69 }, 100); 70 }; 71 72 73 /** Load the data for a single element. **/ 74 jwplayer.html5.skinner.loadImage = function(element, component, player) { 75 var img = new Image(); 76 var elementName = $(element).attr('name'); 77 var elementSource = $(element).attr('src'); 78 var skinUrl = jwplayer.html5.utils.getAbsolutePath(player._model.config.skin); 79 var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 80 var imgUrl = (elementSource.indexOf('data:image/png;base64,') === 0) ? elementSource : [skinRoot, component, elementSource].join('/'); 12 81 13 /** Constructor **/ 14 $.fn.jwplayerSkinner = function(player, completeHandler) { 15 players[player.id] = { 16 completeHandler: completeHandler 17 }; 18 load(player); 82 player.skin[component].elements[elementName] = { 83 height: 0, 84 width: 0, 85 src: '', 86 ready: false 19 87 }; 20 88 21 /** Load the skin **/ 22 function load(player) { 23 $.ajax({ 24 url: $.fn.jwplayerUtils.getAbsolutePath(player.model.config.skin), 25 complete: function(xmlrequest, textStatus) { 26 if (textStatus == "success") { 27 loadSkin(player, xmlrequest.responseXML); 28 } else { 29 loadSkin(player, $.fn.jwplayerDefaultSkin); 30 } 31 } 32 33 }); 34 } 89 $(img).load(jwplayer.html5.skinner.completeImageLoad(img, elementName, component, player)); 90 $(img).error(function() { 91 player.skin[component].elements[elementName].ready = true; 92 jwplayer.html5.skinner.resetCompleteIntervalTest(player); 93 }); 35 94 36 function loadSkin(player, xml) { 37 var skin = { 38 properties: {} 39 }; 40 player.skin = skin; 41 var components = $('component', xml); 42 if (components.length === 0) { 43 return; 44 } 45 for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 46 players[player.id].loading = true; 47 48 var componentName = $(components[componentIndex]).attr('name'); 49 var component = { 50 settings: {}, 51 elements: {} 52 }; 53 player.skin[componentName] = component; 54 var elements = $(components[componentIndex]).find('element'); 55 for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 56 loadImage(elements[elementIndex], componentName, player); 57 } 58 var settings = $(components[componentIndex]).find('setting'); 59 for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 60 player.skin[componentName].settings[$(settings[settingIndex]).attr("name")] = $(settings[settingIndex]).attr("value"); 61 } 62 63 players[player.id].loading = false; 64 65 resetCompleteIntervalTest(player); 66 } 67 } 68 69 function resetCompleteIntervalTest(player) { 70 clearInterval(players[player.id].completeInterval); 71 players[player.id].completeInterval = setInterval(function() { 72 checkComplete(player); 73 }, 100); 74 } 75 76 /** Load the data for a single element. **/ 77 function loadImage(element, component, player) { 78 var img = new Image(); 79 var elementName = $(element).attr('name'); 80 var elementSource = $(element).attr('src'); 81 var skinUrl = $.fn.jwplayerUtils.getAbsolutePath(player.model.config.skin); 82 var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 83 var imgUrl = (elementSource.indexOf('data:image/png;base64,') === 0) ? elementSource : [skinRoot, component, elementSource].join('/'); 84 85 player.skin[component].elements[elementName] = { 86 height: 0, 87 width: 0, 88 src: '', 89 ready: false 90 }; 95 img.src = imgUrl; 96 }; 91 97 92 $(img).load(completeImageLoad(img, elementName, component, player)); 93 $(img).error(function() { 94 player.skin[component].elements[elementName].ready = true; 95 resetCompleteIntervalTest(player); 96 }); 97 98 img.src = imgUrl; 99 } 100 101 function checkComplete(player) { 102 for (var component in player.skin) { 103 if (component != 'properties') { 104 for (var element in player.skin[component].elements) { 105 if (!player.skin[component].elements[element].ready) { 106 return; 107 } 98 99 jwplayer.html5.skinner.checkComplete = function(player) { 100 for (var component in player.skin) { 101 if (component != 'properties') { 102 for (var element in player.skin[component].elements) { 103 if (!player.skin[component].elements[element].ready) { 104 return; 108 105 } 109 106 } 110 107 } 111 if (players[player.id].loading === false) {112 clearInterval(players[player.id].completeInterval);113 players[player.id].completeHandler();114 }115 108 } 116 117 function completeImageLoad(img, element, component, player) { 118 return function() { 119 player.skin[component].elements[element].height = img.height; 120 player.skin[component].elements[element].width = img.width; 121 player.skin[component].elements[element].src = img.src; 122 player.skin[component].elements[element].ready = true; 123 resetCompleteIntervalTest(player); 124 }; 109 if (player.skin._loading === false) { 110 clearInterval(player.skin._completeInterval); 111 player.skin._completeHandler(); 125 112 } 126 127 $.fn.jwplayerSkinner.hasComponent = function(player, component) { 128 return (player.skin[component] !== null); 113 }; 114 115 116 jwplayer.html5.skinner.completeImageLoad = function(img, element, component, player) { 117 return function() { 118 player.skin[component].elements[element].height = img.height; 119 player.skin[component].elements[element].width = img.width; 120 player.skin[component].elements[element].src = img.src; 121 player.skin[component].elements[element].ready = true; 122 jwplayer.html5.skinner.resetCompleteIntervalTest(player); 129 123 }; 130 131 132 $.fn.jwplayerSkinner.getSkinElement = function(player, component, element) { 133 try { 134 return player.skin[component].elements[element]; 135 } catch (err) { 136 $.fn.jwplayerUtils.log("No such skin component / element: ", [player, component, element]); 137 } 138 return null; 139 }; 140 141 142 $.fn.jwplayerSkinner.addSkinElement = function(player, component, name, element) { 143 try { 144 player.skin[component][name] = element; 145 } catch (err) { 146 $.fn.jwplayerUtils.log("No such skin component ", [player, component]); 147 } 148 }; 149 150 $.fn.jwplayerSkinner.getSkinProperties = function(player) { 151 return player.skin.properties; 152 }; 153 154 })(jQuery); 124 }; 125 126 127 jwplayer.html5.skinner.hasComponent = function(player, component) { 128 return (player.skin[component] !== null); 129 }; 130 131 132 jwplayer.html5.skinner.getSkinElement = function(player, component, element) { 133 try { 134 return player.skin[component].elements[element]; 135 } catch (err) { 136 jwplayer.html5.utils.log("No such skin component / element: ", [player, component, element]); 137 } 138 return null; 139 }; 140 141 142 jwplayer.html5.skinner.addSkinElement = function(player, component, name, element) { 143 try { 144 player.skin[component][name] = element; 145 } catch (err) { 146 jwplayer.html5.utils.log("No such skin component ", [player, component]); 147 } 148 }; 149 150 jwplayer.html5.skinner.getSkinProperties = function(player) { 151 return player.skin.properties; 152 }; 153 -
trunk/html5/src/html5/jwplayer.html5.utils.js
r1189 r1190 7 7 * @lastmodifieddate 2010-04-11 8 8 */ 9 (function($) { 10 11 /** Constructor **/ 12 $.fn.jwplayerUtils = function() { 13 return this.each(function() { 14 }); 15 }; 16 17 //http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 18 $.fn.jwplayerUtils.isiPhone = function() { 19 var agent = navigator.userAgent.toLowerCase(); 20 return agent.match(/iPhone/i); 21 }; 22 23 $.fn.jwplayerUtils.isiPad = function() { 24 var agent = navigator.userAgent.toLowerCase(); 25 return agent.match(/iPad/i); 26 }; 27 28 /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 29 $.fn.jwplayerUtils.supportsFlash = function() { 30 var version = '0,0,0,0'; 9 /** Constructor **/ 10 jwplayer.html5.utils = function() { 11 return this.each(function() { 12 }); 13 }; 14 15 //http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 16 jwplayer.html5.utils.isiPhone = function() { 17 var agent = navigator.userAgent.toLowerCase(); 18 return agent.match(/iPhone/i); 19 }; 20 21 jwplayer.html5.utils.isiPad = function() { 22 var agent = navigator.userAgent.toLowerCase(); 23 return agent.match(/iPad/i); 24 }; 25 26 /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 27 jwplayer.html5.utils.supportsFlash = function() { 28 var version = '0,0,0,0'; 29 try { 31 30 try { 31 var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); 32 32 try { 33 var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); 34 try { 35 axo.AllowScriptAccess = 'always'; 36 } catch (e) { 37 version = '6,0,0'; 38 } 33 axo.AllowScriptAccess = 'always'; 39 34 } catch (e) { 35 version = '6,0,0'; 40 36 } 41 version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];42 37 } catch (e) { 43 try { 44 if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { 45 version = (navigator.plugins['Shockwave Flash 2.0'] || 46 navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]; 47 } 48 } catch (e) { 38 } 39 version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; 40 } catch (e) { 41 try { 42 if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { 43 version = (navigator.plugins['Shockwave Flash 2.0'] || 44 navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]; 49 45 } 50 } 51 var major = parseInt(version.split(',')[0], 10); 52 var minor = parseInt(version.split(',')[2], 10); 53 if (major > 9 || (major == 9 && minor > 97)) { 54 return true; 46 } catch (e) { 47 } 48 } 49 var major = parseInt(version.split(',')[0], 10); 50 var minor = parseInt(version.split(',')[2], 10); 51 if (major > 9 || (major == 9 && minor > 97)) { 52 return true; 53 } else { 54 return false; 55 } 56 }; 57 58 /** Filetypes supported by Flash **/ 59 var flashFileTypes = { 60 'aac': true, 61 'f4v': true, 62 'flv': true, 63 'm4a': true, 64 'm4v': true, 65 'mov': true, 66 'mp3': true, 67 'mp4': true 68 }; 69 70 71 /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 72 jwplayer.html5.utils.flashCanPlay = function(fileName) { 73 if (flashFileTypes[jwplayer.html5.utils.extension(fileName)]) { 74 return true; 75 } 76 return false; 77 }; 78 79 /** Check if this client supports playback for the specified type. **/ 80 jwplayer.html5.utils.supportsType = function(type) { 81 try { 82 return !!document.createElement('video').canPlayType(type); 83 } catch (e) { 84 return false; 85 } 86 }; 87 88 /** Check if this client supports HTML5 H.264 playback. **/ 89 jwplayer.html5.utils.supportsH264 = function() { 90 return jwplayer.html5.utils.supportsType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); 91 }; 92 93 94 /** Check if this client supports HTML5 OGG playback. **/ 95 jwplayer.html5.utils.supportsOgg = function() { 96 return jwplayer.html5.utils.supportsType('video/ogg; codecs="theora, vorbis"'); 97 }; 98 99 /** Returns the extension of a file name **/ 100 jwplayer.html5.utils.extension = function(path) { 101 return path.substr(path.lastIndexOf('.') + 1, path.length); 102 }; 103 104 /** Resets an element's CSS **/ 105 /*jwplayer.html5.cSS = function(options) { 106 return this.each(function() { 107 var defaults = { 108 'margin': 0, 109 'padding': 0, 110 'background': 'none', 111 'border': 'none', 112 'bottom': 'auto', 113 'clear': 'none', 114 'float': 'none', 115 'font-family': '"Arial", "Helvetica", sans-serif', 116 'font-size': 'medium', 117 'font-style': 'normal', 118 'font-weight': 'normal', 119 'height': 'auto', 120 'left': 'auto', 121 'letter-spacing': 'normal', 122 'line-height': 'normal', 123 'max-height': 'none', 124 'max-width': 'none', 125 'min-height': 0, 126 'min-width': 0, 127 'overflow': 'visible', 128 'position': 'static', 129 'right': 'auto', 130 'text-align': 'left', 131 'text-decoration': 'none', 132 'text-indent': 0, 133 'text-transform': 'none', 134 'top': 'auto', 135 'visibility': 'visible', 136 'white-space': 'normal', 137 'width': 'auto', 138 'z-index': 'auto' 139 }; 140 try { 141 $(this).css($.extend(defaults, options)); 142 } catch (err) { 143 //alert(jwplayer.html5.utils.dump(err)); 144 } 145 }); 146 };*/ 147 jwplayer.html5.utils.isNull = function(obj) { 148 return ((obj === null) || (obj === undefined) || (obj === "")); 149 }; 150 151 /** Gets an absolute file path based on a relative filepath **/ 152 jwplayer.html5.utils.getAbsolutePath = function(path) { 153 if (jwplayer.html5.utils.isNull(path)) { 154 return path; 155 } 156 if (isAbsolutePath(path)) { 157 return path; 158 } 159 var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 160 var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 161 var patharray = (basepath + "/" + path).split("/"); 162 var result = []; 163 for (var i = 0; i < patharray.length; i++) { 164 if (jwplayer.html5.utils.isNull(patharray[i]) || patharray[i] == ".") { 165 continue; 166 } else if (patharray[i] == "..") { 167 result.pop(); 55 168 } else { 56 return false; 57 } 58 }; 59 60 /** Filetypes supported by Flash **/ 61 var flashFileTypes = { 62 'aac': true, 63 'f4v': true, 64 'flv': true, 65 'm4a': true, 66 'm4v': true, 67 'mov': true, 68 'mp3': true, 69 'mp4': true 70 }; 71 72 73 /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 74 $.fn.jwplayerUtils.flashCanPlay = function(fileName) { 75 if (flashFileTypes[$.fn.jwplayerUtils.extension(fileName)]) { 76 return true; 77 } 169 result.push(patharray[i]); 170 } 171 } 172 return protocol + result.join("/"); 173 }; 174 175 function isAbsolutePath(path) { 176 if (jwplayer.html5.utils.isNull(path)) { 177 return; 178 } 179 var protocol = path.indexOf("://"); 180 var queryparams = path.indexOf("?"); 181 return (protocol > 0 && (queryparams < 0 || (queryparams > protocol))); 182 } 183 184 185 jwplayer.html5.utils.mapEmpty = function(map) { 186 for (var val in map) { 78 187 return false; 79 }; 80 81 /** Check if this client supports playback for the specified type. **/ 82 $.fn.jwplayerUtils.supportsType = function(type) { 83 try { 84 return !!document.createElement('video').canPlayType(type); 85 } catch (e) { 86 return false; 87 } 88 }; 89 90 /** Check if this client supports HTML5 H.264 playback. **/ 91 $.fn.jwplayerUtils.supportsH264 = function() { 92 return $.fn.jwplayerUtils.supportsType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); 93 }; 94 95 96 /** Check if this client supports HTML5 OGG playback. **/ 97 $.fn.jwplayerUtils.supportsOgg = function() { 98 return $.fn.jwplayerUtils.supportsType('video/ogg; codecs="theora, vorbis"'); 99 }; 100 101 /** Returns the extension of a file name **/ 102 $.fn.jwplayerUtils.extension = function(path) { 103 return path.substr(path.lastIndexOf('.') + 1, path.length); 104 }; 105 106 /** Resets an element's CSS **/ 107 /*$.fn.jwplayerCSS = function(options) { 108 return this.each(function() { 109 var defaults = { 110 'margin': 0, 111 'padding': 0, 112 'background': 'none', 113 'border': 'none', 114 'bottom': 'auto', 115 'clear': 'none', 116 'float': 'none', 117 'font-family': '"Arial", "Helvetica", sans-serif', 118 'font-size': 'medium', 119 'font-style': 'normal', 120 'font-weight': 'normal', 121 'height': 'auto', 122 'left': 'auto', 123 'letter-spacing': 'normal', 124 'line-height': 'normal', 125 'max-height': 'none', 126 'max-width': 'none', 127 'min-height': 0, 128 'min-width': 0, 129 'overflow': 'visible', 130 'position': 'static', 131 'right': 'auto', 132 'text-align': 'left', 133 'text-decoration': 'none', 134 'text-indent': 0, 135 'text-transform': 'none', 136 'top': 'auto', 137 'visibility': 'visible', 138 'white-space': 'normal', 139 'width': 'auto', 140 'z-index': 'auto' 141 }; 142 try { 143 $(this).css($.extend(defaults, options)); 144 } catch (err) { 145 //alert($.fn.jwplayerUtils.dump(err)); 188 } 189 return true; 190 }; 191 192 jwplayer.html5.utils.mapLength = function(map) { 193 var result = 0; 194 for (var val in map) { 195 result++; 196 } 197 return result; 198 }; 199 200 201 /** Dumps the content of an object to a string **/ 202 jwplayer.html5.utils.dump = function(object, depth) { 203 if (object === null) { 204 return 'null'; 205 } else if (jwplayer.html5.utils.typeOf(object) != 'object') { 206 if (jwplayer.html5.utils.typeOf(object) == 'string') { 207 return "\"" + object + "\""; 208 } 209 return object; 210 } 211 212 var type = jwplayer.html5.utils.typeOf(object); 213 214 depth = (depth === undefined) ? 1 : depth + 1; 215 var indent = ""; 216 for (var i = 0; i < depth; i++) { 217 indent += "\t"; 218 } 219 220 var result = (type == "array") ? "[" : "{"; 221 result += "\n" + indent; 222 223 for (var i in object) { 224 if (type == "object") { 225 result += "\"" + i + "\": "; 226 } 227 result += jwplayer.html5.utils.dump(object[i], depth) + ",\n" + indent; 228 } 229 230 result = result.substring(0, result.length - 2 - depth) + "\n"; 231 232 result += indent.substring(0, indent.length - 1); 233 result += (type == "array") ? "]" : "}"; 234 235 return result; 236 }; 237 238 /** Returns the true type of an object **/ 239 jwplayer.html5.utils.typeOf = function(value) { 240 var s = typeof value; 241 if (s === 'object') { 242 if (value) { 243 if (value instanceof Array) { 244 s = 'array'; 146 245 } 147 }); 148 };*/ 149 150 $.fn.jwplayerUtils.isNull = function(obj) { 151 return ((obj === null) || (obj === undefined) || (obj === "")); 152 }; 153 154 /** Gets an absolute file path based on a relative filepath **/ 155 $.fn.jwplayerUtils.getAbsolutePath = function(path) { 156 if ($.fn.jwplayerUtils.isNull(path)){ 157 return path; 158 } 159 if (isAbsolutePath(path)) { 160 return path; 161 } 162 var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 163 var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 164 var patharray = (basepath + "/" + path).split("/"); 165 var result = []; 166 for (var i = 0; i < patharray.length; i++) { 167 if ($.fn.jwplayerUtils.isNull(patharray[i]) || patharray[i] == ".") { 168 continue; 169 } else if (patharray[i] == "..") { 170 result.pop(); 171 } else { 172 result.push(patharray[i]); 173 } 174 } 175 return protocol + result.join("/"); 176 }; 177 178 function isAbsolutePath(path) { 179 if($.fn.jwplayerUtils.isNull(path)){ 180 return; 181 } 182 var protocol = path.indexOf("://"); 183 var queryparams = path.indexOf("?"); 184 return (protocol > 0 && (queryparams < 0 || (queryparams > protocol))); 185 } 186 187 $.fn.jwplayerUtils.mapEmpty = function (map){ 188 for (var val in map){ 189 return false; 190 } 191 return true; 192 }; 193 194 $.fn.jwplayerUtils.mapLength = function (map){ 195 var result = 0; 196 for (var val in map){ 197 result++; 198 } 199 return result; 200 }; 201 202 203 /** Dumps the content of an object to a string **/ 204 $.fn.jwplayerUtils.dump = function(object, depth) { 205 if (object === null) { 206 return 'null'; 207 } else if ($.fn.jwplayerUtils.typeOf(object) != 'object') { 208 if ($.fn.jwplayerUtils.typeOf(object) == 'string') { 209 return "\"" + object + "\""; 210 } 211 return object; 212 } 213 214 var type = $.fn.jwplayerUtils.typeOf(object); 215 216 depth = (depth === undefined) ? 1 : depth + 1; 217 var indent = ""; 218 for (var i = 0; i < depth; i++) { 219 indent += "\t"; 220 } 221 222 var result = (type == "array") ? "[" : "{"; 223 result += "\n" + indent; 224 225 for (var i in object) { 226 if (type == "object") { 227 result += "\"" + i + "\": "; 228 } 229 result += $.fn.jwplayerUtils.dump(object[i], depth) + ",\n" + indent; 230 } 231 232 result = result.substring(0, result.length - 2 - depth) + "\n"; 233 234 result += indent.substring(0, indent.length - 1); 235 result += (type == "array") ? "]" : "}"; 236 237 return result; 238 }; 239 240 /** Returns the true type of an object **/ 241 $.fn.jwplayerUtils.typeOf = function(value) { 242 var s = typeof value; 243 if (s === 'object') { 244 if (value) { 245 if (value instanceof Array) { 246 s = 'array'; 247 } 248 } else { 249 s = 'null'; 250 } 251 } 252 return s; 253 }; 254 255 256 /** Logger **/ 257 $.fn.jwplayerUtils.log = function(msg, obj) { 258 try { 259 if (obj) { 260 console.log("%s: %o", msg, obj); 261 } else { 262 console.log($.fn.jwplayerUtils.dump(msg)); 263 } 264 } catch (err) { 265 } 266 return this; 267 }; 268 269 270 })(jQuery); 246 } else { 247 s = 'null'; 248 } 249 } 250 return s; 251 }; 252 253 254 /** Logger **/ 255 jwplayer.html5.utils.log = function(msg, obj) { 256 try { 257 if (obj) { 258 console.log("%s: %o", msg, obj); 259 } else { 260 console.log(jwplayer.html5.utils.dump(msg)); 261 } 262 } catch (err) { 263 } 264 return this; 265 }; 266 267 -
trunk/html5/src/html5/jwplayer.html5.view.js
r1189 r1190 6 6 * @lastmodifieddate 2010-04-11 7 7 */ 8 (function($) {9 8 10 var styleString = "left:0px;top:0px;position:absolute;z-index:0;"; 11 var embedString = "<embed %elementvars% src='%flashplayer%' allowfullscreen='true' allowscriptaccess='always' flashvars='%flashvars%' %style% />"; 12 var objectString = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' %elementvars% %style% > <param name='movie' value='%flashplayer%'> <param name='allowfullscreen' value='true'> <param name='allowscriptaccess' value='always'> <param name='wmode' value='transparent'> <param name='flashvars' value='%flashvars%'> </object>"; 13 var elementvars = { 14 id: true, 15 name: true, 16 className: true 17 }; 18 19 $.fn.jwplayerView = function(player) { 20 player.model.domelement.wrap("<div id='" + player.model.config.id + "_jwplayer' />"); 21 player.model.domelement.parent().css({ 22 position: 'relative', 23 height: player.config.height+'px', 24 width: player.config.width+'px', 25 margin: 'auto', 26 padding: 0, 27 'background-color': player.config.screencolor 28 }); 29 var display = ($.fn.jwplayerUtils.isiPhone() || !(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length)) ? 'block' : 'none' ; 30 player.model.domelement.css({ 31 position: 'absolute', 32 width: player.model.config.width+'px', 33 height: player.model.config.height+'px', 34 top: 0, 35 left: 0, 36 'z-index': 0, 37 margin: 'auto', 38 display: display 39 }); 40 }; 41 42 $.fn.jwplayerView.switchMediaProvider = function() { 43 44 }; 45 46 /** Embeds a Flash Player at the specified location in the DOM. **/ 47 $.fn.jwplayerView.embedFlash = function(player, options) { 48 if (player.model.config.flashplayer) { 49 var htmlString, elementvarString = "", flashvarString = ""; 50 if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { 51 htmlString = embedString; 52 } else { 53 htmlString = objectString; 54 } 55 for (var elementvar in elementvars) { 56 if (!$.fn.jwplayerUtils.isNull(player.model.config[elementvar])) { 57 elementvarString += elementvar + "='" + player.model.config[elementvar] + "' "; 58 } 59 } 60 if (elementvarString.indexOf("name=") < 0) { 61 elementvarString += "name='" + player.id + "' "; 62 } 63 var config = $.extend(true, {}, player.model.config, options); 64 if (!$.fn.jwplayerUtils.isNull(player.model.sources[player.model.source])){ 65 flashvarString += 'file=' + $.fn.jwplayerUtils.getAbsolutePath(player.model.sources[player.model.source].file) + '&'; 66 } 67 if (!$.fn.jwplayerUtils.isNull(config.image)){ 68 flashvarString += 'image=' + $.fn.jwplayerUtils.getAbsolutePath(config.image) + '&'; 69 } 70 for (var flashvar in config) { 71 if ((flashvar == 'file') || (flashvar == 'image') || (flashvar == 'plugins')) { 72 continue; 73 } 74 if (!$.fn.jwplayerUtils.isNull(config[flashvar])) { 75 flashvarString += flashvar + '=' + config[flashvar] + '&'; 76 } 77 } 78 79 flashvarString += 'playerready=$.fn.jwplayerMediaFlash.playerReady'; 80 81 htmlString = htmlString.replace("%elementvars%", elementvarString); 82 htmlString = htmlString.replace("%flashvars%", flashvarString); 83 htmlString = htmlString.replace("%flashplayer%", $.fn.jwplayerUtils.getAbsolutePath(player.model.config.flashplayer)); 84 htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + player.model.config.height + "px;'"); 85 if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { 86 htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + player.model.config.height + "px;'"); 87 player.model.domelement.before(htmlString); 88 } else { 89 htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + (player.model.config.height + player.skin.controlbar.elements.background.height) + "px;'"); 90 player.model.domelement.before("<div />"); 91 player.model.domelement.prev().html(htmlString); 92 93 } 94 var oldDOMElement = player.model.domelement; 95 player.model.domelement = player.model.domelement.prev(); 96 oldDOMElement.remove(); 97 } 98 }; 99 100 101 })(jQuery); 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 var display = (jwplayer.html5.utils.isiPhone() || !(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length)) ? 'block' : 'none'; 20 player._model.domelement.css({ 21 position: 'absolute', 22 width: player._model.config.width + 'px', 23 height: player._model.config.height + 'px', 24 top: 0, 25 left: 0, 26 'z-index': 0, 27 margin: 'auto', 28 display: display 29 }); 30 };
Note: See TracChangeset
for help on using the changeset viewer.
