Changeset 1262
- Timestamp:
- 09/01/10 19:05:29 (3 years ago)
- Location:
- trunk/js
- Files:
-
- 5 edited
-
bin-debug/jwplayer.js (modified) (14 diffs)
-
src/api/jwplayer.api.js (modified) (9 diffs)
-
src/embed/jwplayer.embed.js (modified) (5 diffs)
-
test/embed.html (modified) (3 diffs)
-
test/jwplayer.html5.js (modified) (70 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/js/bin-debug/jwplayer.js
r1261 r1262 311 311 312 312 jwplayer.api.events = { 313 API_READY: 'jwplayerAPIReady', 313 314 JWPLAYER_READY: 'jwplayerReady', 314 315 JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', … … 342 343 var _listeners = {}; 343 344 var _stateListeners = {}; 345 var _readyListeners = []; 344 346 var _player = undefined; 345 347 var _playerReady = false; 346 348 var _queuedCalls = []; 349 350 var _originalHTML = container.outerHTML; 347 351 348 352 var _itemMeta = {}; … … 407 411 } 408 412 }; 409 413 410 414 function translateEventResponse(type, eventProperties) { 411 415 var translated = jwplayer.utils.extend({}, eventProperties); … … 455 459 }); 456 460 457 this.dispatchEvent .call(this, "jwplayerReady", obj);461 this.dispatchEvent(jwplayer.api.events.API_READY); 458 462 459 463 while (_queuedCalls.length > 0) { … … 467 471 }; 468 472 469 this. removeListeners= function() {473 this.destroy = function() { 470 474 _listeners = {}; 471 _queuedCalls = {}; 475 _queuedCalls = []; 476 jwplayer.api.destroyPlayer(this.id, _originalHTML); 472 477 }; 473 478 … … 563 568 onPlaylist: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, callback); }, 564 569 onPlaylistItem: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, callback); }, 565 onReady: function(callback) { return this.eventListener(jwplayer.api.events. JWPLAYER_READY, callback); },570 onReady: function(callback) { return this.eventListener(jwplayer.api.events.API_READY, callback); }, 566 571 onResize: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_RESIZE, callback); }, 567 572 onComplete: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, callback); }, … … 577 582 setup: function(options) { return this; }, 578 583 remove: function() { 579 this.removeListeners(); 580 jwplayer.api.destroyPlayer(this.id); 584 this.destroy(); 581 585 }, 582 586 … … 633 637 }; 634 638 635 jwplayer.api.destroyPlayer = function(playerId ) {639 jwplayer.api.destroyPlayer = function(playerId, replacementHTML) { 636 640 var index = -1; 637 641 for(var p in _players) { … … 643 647 if (index >= 0) { 644 648 var toDestroy = document.getElementById(_players[index].id); 645 var replacement = document.createElement('div'); 646 replacement.setAttribute('id', toDestroy.id); 647 toDestroy.parentNode.replaceChild(replacement, toDestroy); 649 if (toDestroy) { 650 if (replacementHTML) { 651 toDestroy.outerHTML = replacementHTML; 652 } else { 653 var replacement = document.createElement('div'); 654 replacement.setAttribute('id', toDestroy.id); 655 toDestroy.parentNode.replaceChild(replacement, toDestroy); 656 } 657 } 648 658 _players.splice(index, 1); 649 659 } … … 675 685 676 686 jwplayer.embed.Embedder = function(playerApi) { 677 var events = {},678 players = {},679 config = undefined,680 api = undefined;681 687 this.constructor(playerApi); 682 688 }; 683 689 684 690 jwplayer.embed.Embedder.prototype = { 691 config: undefined, 692 api: undefined, 693 events: {}, 694 players: [{type:'html5'}], 695 685 696 constructor : function(playerApi) { 686 697 this.api = playerApi; … … 748 759 } else if (loadParams.levels) { 749 760 var item = this.getPlaylistItem(0); 761 if (!item) { 762 item = { file: loadParams.levels[0].file }; 763 } 750 764 item.levels = loadParams.levels; 751 765 this.load(item); … … 796 810 // flashvars. 797 811 if (params.levels && params.levels.length && params.file === undefined) { 798 params.file = params.levels[0]['file'];812 // params.file = params.levels[0]['file']; 799 813 } 800 814 … … 843 857 if (jwplayer.html5) { 844 858 container.innerHTML = "<p>Embedded HTML5 player goes here</p>"; 845 var playerOptions = jwplayer.utils.extend( { }, jwplayer.embed.defaults, options);859 var playerOptions = jwplayer.utils.extend( {screencolor:'0x000000'}, jwplayer.embed.defaults, options); 846 860 jwplayer.embed.parseConfigBlock(playerOptions, 'components'); 847 861 // TODO: remove this requirement from the html5 player (sources … … 916 930 } 917 931 } 918 this.config = options; 919 return (new jwplayer.embed.Embedder(this)).embedPlayer(); 932 933 // Destroy original API on setup() to remove existing listeners 934 var newId = this.id; 935 this.remove(); 936 var newApi = jwplayer(newId); 937 newApi.config = options; 938 return (new jwplayer.embed.Embedder(newApi)).embedPlayer(); 920 939 }; 921 940 -
trunk/js/src/api/jwplayer.api.js
r1261 r1262 9 9 10 10 jwplayer.api.events = { 11 API_READY: 'jwplayerAPIReady', 11 12 JWPLAYER_READY: 'jwplayerReady', 12 13 JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', … … 40 41 var _listeners = {}; 41 42 var _stateListeners = {}; 43 var _readyListeners = []; 42 44 var _player = undefined; 43 45 var _playerReady = false; 44 46 var _queuedCalls = []; 47 48 var _originalHTML = container.outerHTML; 45 49 46 50 var _itemMeta = {}; … … 105 109 } 106 110 }; 107 111 108 112 function translateEventResponse(type, eventProperties) { 109 113 var translated = jwplayer.utils.extend({}, eventProperties); … … 153 157 }); 154 158 155 this.dispatchEvent .call(this, "jwplayerReady", obj);159 this.dispatchEvent(jwplayer.api.events.API_READY); 156 160 157 161 while (_queuedCalls.length > 0) { … … 165 169 }; 166 170 167 this. removeListeners= function() {171 this.destroy = function() { 168 172 _listeners = {}; 169 _queuedCalls = {}; 173 _queuedCalls = []; 174 jwplayer.api.destroyPlayer(this.id, _originalHTML); 170 175 }; 171 176 … … 261 266 onPlaylist: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, callback); }, 262 267 onPlaylistItem: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, callback); }, 263 onReady: function(callback) { return this.eventListener(jwplayer.api.events. JWPLAYER_READY, callback); },268 onReady: function(callback) { return this.eventListener(jwplayer.api.events.API_READY, callback); }, 264 269 onResize: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_RESIZE, callback); }, 265 270 onComplete: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, callback); }, … … 275 280 setup: function(options) { return this; }, 276 281 remove: function() { 277 this.removeListeners(); 278 jwplayer.api.destroyPlayer(this.id); 282 this.destroy(); 279 283 }, 280 284 … … 331 335 }; 332 336 333 jwplayer.api.destroyPlayer = function(playerId ) {337 jwplayer.api.destroyPlayer = function(playerId, replacementHTML) { 334 338 var index = -1; 335 339 for(var p in _players) { … … 341 345 if (index >= 0) { 342 346 var toDestroy = document.getElementById(_players[index].id); 343 var replacement = document.createElement('div'); 344 replacement.setAttribute('id', toDestroy.id); 345 toDestroy.parentNode.replaceChild(replacement, toDestroy); 347 if (toDestroy) { 348 if (replacementHTML) { 349 toDestroy.outerHTML = replacementHTML; 350 } else { 351 var replacement = document.createElement('div'); 352 replacement.setAttribute('id', toDestroy.id); 353 toDestroy.parentNode.replaceChild(replacement, toDestroy); 354 } 355 } 346 356 _players.splice(index, 1); 347 357 } -
trunk/js/src/embed/jwplayer.embed.js
r1261 r1262 5 5 6 6 jwplayer.embed.Embedder = function(playerApi) { 7 var events = {},8 players = {},9 config = undefined,10 api = undefined;11 7 this.constructor(playerApi); 12 8 }; 13 9 14 10 jwplayer.embed.Embedder.prototype = { 11 config: undefined, 12 api: undefined, 13 events: {}, 14 players: [{type:'html5'}], 15 15 16 constructor : function(playerApi) { 16 17 this.api = playerApi; … … 78 79 } else if (loadParams.levels) { 79 80 var item = this.getPlaylistItem(0); 81 if (!item) { 82 item = { file: loadParams.levels[0].file }; 83 } 80 84 item.levels = loadParams.levels; 81 85 this.load(item); … … 126 130 // flashvars. 127 131 if (params.levels && params.levels.length && params.file === undefined) { 128 params.file = params.levels[0]['file'];132 // params.file = params.levels[0]['file']; 129 133 } 130 134 … … 173 177 if (jwplayer.html5) { 174 178 container.innerHTML = "<p>Embedded HTML5 player goes here</p>"; 175 var playerOptions = jwplayer.utils.extend( { }, jwplayer.embed.defaults, options);179 var playerOptions = jwplayer.utils.extend( {screencolor:'0x000000'}, jwplayer.embed.defaults, options); 176 180 jwplayer.embed.parseConfigBlock(playerOptions, 'components'); 177 181 // TODO: remove this requirement from the html5 player (sources … … 246 250 } 247 251 } 248 this.config = options; 249 return (new jwplayer.embed.Embedder(this)).embedPlayer(); 252 253 // Destroy original API on setup() to remove existing listeners 254 var newId = this.id; 255 this.remove(); 256 var newApi = jwplayer(newId); 257 newApi.config = options; 258 return (new jwplayer.embed.Embedder(newApi)).embedPlayer(); 250 259 }; 251 260 -
trunk/js/test/embed.html
r1235 r1262 1 1 <html> 2 2 <head> 3 <script type="text/javascript" src="jquery.js"></script> 4 <script type="text/javascript" src="jwplayer.js"></script> 3 <script type="text/javascript" src="../bin-debug/jwplayer.js"></script> 5 4 <script type="text/javascript" src="jwplayer.html5.js"></script> 6 5 <script type="text/javascript"> 7 6 var options = { 8 7 image: '../../../testing/files/bunny.jpg', 9 players: [10 {type:'flash', src: '../../../trunk/fl5/player.swf'},11 {type:'html5'},12 ],13 8 skin: '', 14 9 levels: [ … … 17 12 }; 18 13 function embedPlayer(id) { 19 $jw(id).setup(options ).play().onPlay(function() {14 $jw(id).setup(options, '../../../trunk/fl5/player.swf').onPlay(function() { 20 15 alert("Playing!"); 21 }) ;16 }).play(); 22 17 } 23 18 </script> … … 34 29 </div> 35 30 </div> 36 <h3>Embed a player </h3>31 <h3>Embed a player on a div</h3> 37 32 <a href="#" onclick="embedPlayer('div1'); return false;">Click here to embed player</a><br /> 38 33 <h3>Embed a player on a video tag</h3> 34 <div> 35 <video id="a_video" src="/testing/files/bunny.mp4" width="320" height="240" poster="/testing/files/bunny.png"></video> 36 </div> 37 <a href="#" onclick="console.log($jw('a_video').setup().options); return false;">Click here to embed player</a><br /> 39 38 </body> 40 39 </html> -
trunk/js/test/jwplayer.html5.js
r1235 r1262 29 29 30 30 jwplayer.html5.utils = function() { 31 return this.each(function() { 32 }); 33 }; 34 35 31 }; 36 32 37 33 /** Returns the extension of a file name **/ 38 34 jwplayer.html5.utils.extension = function(path) { 39 return path.substr(path.lastIndexOf('.') + 1, path.length); 40 }; 41 42 jwplayer.html5.utils.isNull = function(obj) { 43 return ((obj === null) || (obj === undefined) || (obj === "")); 35 return path.substr(path.lastIndexOf('.') + 1, path.length).toLowerCase(); 44 36 }; 45 37 46 38 /** Gets an absolute file path based on a relative filepath **/ 47 39 jwplayer.html5.utils.getAbsolutePath = function(path) { 48 if ( jwplayer.html5.utils.isNull(path)) {49 return path;40 if (path === undefined) { 41 return undefined; 50 42 } 51 43 if (isAbsolutePath(path)) { … … 58 50 var result = []; 59 51 for (var i = 0; i < patharray.length; i++) { 60 if ( jwplayer.html5.utils.isNull(patharray[i])|| patharray[i] == ".") {52 if (patharray[i] === undefined || patharray[i] == ".") { 61 53 continue; 62 54 } else if (patharray[i] == "..") { … … 70 62 71 63 function isAbsolutePath(path) { 72 if ( jwplayer.html5.utils.isNull(path)) {64 if (path === null) { 73 65 return; 74 66 } … … 94 86 }; 95 87 96 97 /** Dumps the content of an object to a string **/98 jwplayer.html5.utils.dump = function(object, depth) {99 if (object === null) {100 return 'null';101 } else if (jwplayer.html5.utils.typeOf(object) != 'object') {102 if (jwplayer.html5.utils.typeOf(object) == 'string') {103 return "\"" + object + "\"";104 }105 return object;106 }107 108 var type = jwplayer.html5.utils.typeOf(object);109 110 depth = (depth === undefined) ? 1 : depth + 1;111 var indent = "";112 for (var indentCount = 0; indentCount < depth; indentCount++) {113 indent += "\t";114 }115 116 var result = (type == "array") ? "[" : "{";117 result += "\n" + indent;118 119 for (var key in object) {120 if (type == "object") {121 result += "\"" + key + "\": ";122 }123 result += jwplayer.html5.utils.dump(object[key], depth) + ",\n" + indent;124 }125 126 result = result.substring(0, result.length - 2 - depth) + "\n";127 128 result += indent.substring(0, indent.length - 1);129 result += (type == "array") ? "]" : "}";130 131 return result;132 };133 134 /** Returns the true type of an object **/135 jwplayer.html5.utils.typeOf = function(value) {136 var s = typeof value;137 if (s === 'object') {138 if (value) {139 if (value instanceof Array) {140 s = 'array';141 }142 } else {143 s = 'null';144 }145 }146 return s;147 };148 149 150 88 /** Logger **/ 151 89 jwplayer.html5.utils.log = function(msg, obj) { 152 //try {153 90 if (obj) { 154 console.log("%s: %o", msg, obj); 91 obj.message = msg; 92 console.log(obj); 155 93 } else { 156 console.log(jwplayer.html5.utils.dump(msg)); 157 } 158 //} catch (err) { 159 //} 94 console.log(msg); 95 } 160 96 return this; 161 97 }; 162 98 163 99 jwplayer.html5.utils.css = function(domelement, styles) { 164 if (domelement !== null) {100 if (domelement !== undefined) { 165 101 for (var style in styles) { 166 102 try { … … 171 107 } 172 108 } 109 }; 110 })(jwplayer); 111 /** 112 * JW Player view component 113 * 114 * @author zach 115 * @version 1.0 116 */ 117 (function(jwplayer) { 118 119 var _css = jwplayer.html5.utils.css; 120 121 jwplayer.html5.view = function(api, container, model) { 122 var _container; 123 var _wrapper; 124 var _zindex = 0; 125 var _box = { 126 top: 0, 127 right: 0, 128 bottom: 0, 129 left: 0 130 }; 131 132 function createWrapper() { 133 _wrapper = document.createElement("div"); 134 _wrapper.id = _container.id; 135 _container.id = _wrapper.id + "_video"; 136 137 _css(_wrapper, { 138 position: 'relative', 139 height: model.config.height + 'px', 140 width: model.config.width + 'px', 141 margin: 'auto', 142 padding: 0, 143 background_color: model.config.screencolor, 144 z_index: getNextZIndex() 145 }); 146 147 _css(_container, { 148 position: 'absolute', 149 width: model.config.width + 'px', 150 height: model.config.height + 'px', 151 top: 0, 152 left: 0, 153 z_index: 1, 154 margin: 'auto', 155 display: 'block' 156 }); 157 158 jwplayer.utils.wrap(_container, _wrapper); 159 } 160 161 function getNextZIndex() { 162 return _zindex++; 163 } 164 165 function layoutComponents() { 166 if (model.getMedia() !== undefined && !model.getMedia().hasChrome && !model.config.chromeless) { 167 for (var pluginIndex in model.plugins.order) { 168 var pluginName = model.plugins.order[pluginIndex]; 169 if (model.plugins.object[pluginName].getDisplayElement !== undefined) { 170 var plugincss = { 171 position: 'absolute', 172 z_index: getNextZIndex(), 173 margin: 0, 174 padding: 0 175 }; 176 var elementWidth, elementHeight; 177 switch (model.plugins.config[pluginName].position.toUpperCase()) { 178 case jwplayer.html5.view.positions.OVER: 179 break; 180 case jwplayer.html5.view.positions.TOP: 181 plugincss.top = 0; 182 elementHeight = getNumber(model.plugins.object[pluginName].getDisplayElement().style.height); 183 _box.top += elementHeight; 184 for (var childNode in _wrapper.childNodes) { 185 if (!isNaN(parseInt(childNode, 10))) { 186 _wrapper.childNodes[childNode].style.height = getNumber(_wrapper.childNodes[childNode].style.height) - elementHeight ; 187 _wrapper.childNodes[childNode].style.top = getNumber(_wrapper.childNodes[childNode].style.top) + elementHeight; 188 } 189 } 190 break; 191 case jwplayer.html5.view.positions.RIGHT: 192 elementWidth = getNumber(model.plugins.object[pluginName].getDisplayElement().style.width); 193 _box.right += elementWidth; 194 break; 195 case jwplayer.html5.view.positions.BOTTOM: 196 elementHeight = getNumber(model.plugins.object[pluginName].getDisplayElement().style.height); 197 plugincss.top = getNumber(_wrapper.style.height) - elementHeight - _box.bottom; 198 _box.bottom += elementHeight; 199 break; 200 case jwplayer.html5.view.positions.LEFT: 201 elementWidth = getNumber(model.plugins.object[pluginName].getDisplayElement().style.width); 202 _box.left += elementWidth; 203 break; 204 } 205 _container.parentNode.appendChild(model.plugins.object[pluginName].getDisplayElement()); 206 _css(model.plugins.object[pluginName].getDisplayElement(), plugincss); 207 } 208 } 209 } else { 210 model.getMedia().getDisplayElement().poster = model.playlist[model.item].image; 211 model.getMedia().getDisplayElement().controls = "controls"; 212 } 213 } 214 215 function getNumber(style) { 216 if (style === "") { 217 return 0; 218 } 219 return parseInt(style.replace("px", ""), 10); 220 } 221 222 this.setup = function(container) { 223 _container = container; 224 createWrapper(); 225 layoutComponents(); 226 this.resize(model.config.width, model.config.height); 227 }; 228 229 this.resize = function(width, height) { 230 for (var pluginIndex in model.plugins.order) { 231 var pluginName = model.plugins.order[pluginIndex]; 232 if (model.plugins.config[pluginName].position == jwplayer.html5.view.positions.OVER && !api.jwGetFullscreen()){ 233 model.plugins.object[pluginName].resize(model.width - _box.left - _box.right, model.height - _box.top - _box.bottom); 234 } else { 235 model.plugins.object[pluginName].resize(width, height); 236 } 237 } 238 _css(model.getMedia().getDisplayElement(), { 239 position: 'absolute', 240 width: (api.jwGetFullscreen() ? model.width : model.width - _box.left - _box.right), 241 height: (api.jwGetFullscreen() ? model.height : model.height - _box.top - _box.bottom), 242 top: _box.top, 243 left: _box.left 244 }); 245 }; 246 247 }; 248 249 jwplayer.html5.view.positions = { 250 TOP: "TOP", 251 RIGHT: "RIGHT", 252 BOTTOM: "BOTTOM", 253 LEFT: "LEFT", 254 OVER: "OVER" 173 255 }; 174 256 })(jwplayer); … … 180 262 */ 181 263 (function(jwplayer) { 182 var _positions = {183 BOTTOM: "BOTTOM",184 TOP: "TOP",185 OVER: "OVER"186 };187 188 189 264 /** Map with config for the jwplayerControlbar plugin. **/ 190 265 var _defaults = { … … 199 274 fontweight: "bold", 200 275 buttoncolor: "ffffff", 201 position: _positions.BOTTOM, 202 leftmargin: 0, 203 rightmargin: 0, 204 scrubber: "none" 276 position: jwplayer.html5.view.positions.BOTTOM, 277 layout: { 278 "left": { 279 "position": "left", 280 "elements": [{ 281 "name": "play", 282 "type": "button" 283 }, { 284 "name": "divider", 285 "type": "divider" 286 }, { 287 "name": "prev", 288 "type": "button" 289 }, { 290 "name": "divider", 291 "type": "divider" 292 }, { 293 "name": "next", 294 "type": "button" 295 }, { 296 "name": "divider", 297 "type": "divider" 298 }, { 299 "name": "elapsed", 300 "type": "text" 301 }] 302 }, 303 "center": { 304 "position": "center", 305 "elements": [{ 306 "name": "time", 307 "type": "slider" 308 }] 309 }, 310 "right": { 311 "position": "right", 312 "elements": [{ 313 "name": "duration", 314 "type": "text" 315 }, { 316 "name": "divider", 317 "type": "divider" 318 }, { 319 "name": "blank", 320 "type": "button" 321 }, { 322 "name": "fullscreen", 323 "type": "button" 324 }, { 325 "name": "divider", 326 "type": "divider" 327 }, { 328 "name": "mute", 329 "type": "button" 330 }, { 331 "name": "volume", 332 "type": "slider" 333 }] 334 } 335 } 205 336 }; 206 337 … … 219 350 }; 220 351 221 jwplayer.html5.controlbar = function(api, container) { 222 var _container = container; 223 var _api = api; 224 var _settings = jwplayer.utils.extend({}, _defaults, api.skin.getComponentSettings("controlbar")); 225 var _domelement; 352 jwplayer.html5.controlbar = function(api, config) { 353 var _settings = jwplayer.utils.extend({}, _defaults, api.skin.getComponentSettings("controlbar"), config); 354 if (jwplayer.html5.utils.mapLength(api.skin.getComponentLayout("controlbar")) > 0) { 355 _settings.layout = api.skin.getComponentLayout("controlbar"); 356 } 357 var _wrapper; 358 var _dividerid = 0; 359 var _marginleft = 0; 360 var _marginright = 0; 361 var _scrubber = "none"; 362 var _mousedown; 363 var _currentPosition; 364 var _currentDuration; 365 var _currentBuffer; 366 var _fullscreen; 367 var _width; 368 var _height; 369 var _prevElement; 370 var _elements = {}; 371 372 373 function _buildBase() { 374 var wrappercss = { 375 height: api.skin.getSkinElement("controlbar", "background").height, 376 background_color: "#" + _settings.backgroundcolor 377 }; 378 379 _wrapper = document.createElement("div"); 380 _wrapper.id = api.id + "_jwplayer_controlbar"; 381 _css(_wrapper, wrappercss); 382 383 _addElement("capLeft", "left", false, _wrapper); 384 var domelmentcss = { 385 position: "absolute", 386 height: api.skin.getSkinElement("controlbar", "background").height, 387 background: " url(" + api.skin.getSkinElement("controlbar", "background").src + ") repeat-x center left", 388 left: api.skin.getSkinElement("controlbar", "capLeft").width 389 }; 390 _appendNewElement("elements", _wrapper, domelmentcss); 391 _addElement("capRight", "right", false, _wrapper); 392 } 393 394 this.getDisplayElement = function() { 395 return _wrapper; 396 }; 397 398 this.resize = function(width, height) { 399 _width = width; 400 _height = height; 401 _fullscreen = api.jwGetFullscreen(); 402 if (_fullscreen) { 403 _show(_elements.normalscreenButton); 404 _hide(_elements.fullscreenButton); 405 // TODO 406 if (false) { 407 window.onresize(function() { 408 _resizeBar(); 409 }); 410 } 411 } else { 412 _hide(_elements.normalscreenButton); 413 _show(_elements.fullscreenButton); 414 // TODO 415 if (false) { 416 window.onresize(null); 417 } 418 } 419 _resizeBar(); 420 _timeHandler({}); 421 _bufferHandler({}); 422 }; 423 424 function _appendNewElement(id, parent, css) { 425 var element = document.createElement("div"); 426 _elements[id] = element; 427 element.id = _wrapper.id + "_" + id; 428 parent.appendChild(element); 429 if (css !== undefined) { 430 _css(element, css); 431 } 432 return element; 433 } 226 434 227 435 /** Draw the jwplayerControlbar elements. **/ 228 436 function _buildElements() { 229 // Draw the background. 230 _domelement = document.createElement("div"); 231 _domelement.id = _api.id + "_jwplayer_controlbar"; 232 _container.parentNode.appendChild(_domelement); 233 var controlbarcss = { 234 position: "absolute", 235 height: _api.skin.getSkinElement("controlbar", "background").height, 236 background: " url(" + _api.skin.getSkinElement("controlbar", "background").src + ") repeat-x center left", 237 background_color: "#"+_settings.backgroundcolor 238 }; 239 switch (_settings.position) { 240 case _positions.TOP: 241 controlbarcss.top = 0; 437 _buildGroup(_settings.layout.left); 438 _buildGroup(_settings.layout.right, -1); 439 _buildGroup(_settings.layout.center); 440 } 441 442 /** Layout a group of elements**/ 443 function _buildGroup(group, order) { 444 var alignment = group.position == "right" ? "right" : "left"; 445 var elements = jwplayer.utils.extend([], group.elements); 446 if (order !== undefined) { 447 elements.reverse(); 448 } 449 for (var i = 0; i < elements.length; i++) { 450 _buildElement(elements[i], alignment); 451 } 452 } 453 454 function getNewDivivderId() { 455 return _dividerid++; 456 } 457 458 /** Draw a single element into the jwplayerControlbar. **/ 459 function _buildElement(element, alignment) { 460 switch (element.name) { 461 case "play": 462 _addElement("playButton", alignment, false); 463 _addElement("pauseButton", alignment, true); 464 _buildHandler("playButton", "jwPlay"); 465 _buildHandler("pauseButton", "jwPause"); 242 466 break; 243 default: 244 controlbarcss.top = _api.jwGetHeight(); 245 _css(_domelement.parentNode, { 246 "height": parseInt(_domelement.parentNode.style.height.replace("px", ""), 10) + _api.skin.getSkinElement("controlbar", "background").height 247 }); 467 case "divider": 468 _addElement("divider" + getNewDivivderId(), alignment, true); 248 469 break; 249 } 250 251 _css(_domelement, controlbarcss); 252 253 254 // Draw all elements on top of the bar. 255 _buildElement("capLeft", "left", true); 256 _buildElement("playButton", "left", false); 257 _buildElement("pauseButton", "left", true); 258 _buildElement("divider1", "left", true); 259 _buildElement("prevButton", "left", true); 260 _buildElement("divider2", "left", true); 261 _buildElement("nextButton", "left", true); 262 _buildElement("divider3", "left", true); 263 _buildElement("elapsedText", "left", true); 264 _buildElement("timeSliderCapLeft", "left", true); 265 _buildElement("timeSliderRail", "left", false); 266 _buildElement("timeSliderBuffer", "left", false); 267 _buildElement("timeSliderProgress", "left", false); 268 _buildElement("timeSliderThumb", "left", false); 269 _buildElement("timeSliderCapRight", "left", true); 270 _buildElement("capRight", "right", true); 271 // TODO 272 if (false) { 273 _buildElement("fullscreenButton", "right", false); 274 _buildElement("normalscreenButton", "right", true); 275 _buildElement("divider4", "right", true); 276 } 277 _buildElement("volumeSliderCapLeft", "right", true); 278 _buildElement("volumeSliderRail", "right", false); 279 _buildElement("volumeSliderProgress", "right", true); 280 _buildElement("volumeSliderCapRight", "right", true); 281 _buildElement("muteButton", "right", false); 282 _buildElement("unmuteButton", "right", true); 283 _buildElement("divider5", "right", true); 284 _buildElement("durationText", "right", true); 285 } 286 287 288 /** Draw a single element into the jwplayerControlbar. **/ 289 function _buildElement(element, align, offset) { 290 if (_api.skin.getSkinElement("controlbar", element) !== undefined || element.indexOf("Text") > 0 || element.indexOf("divider") === 0) { 291 var _element = document.createElement("div"); 292 _element.id = _domelement.id + "_" + element; 293 _domelement.appendChild(_element); 470 case "prev": 471 if (api.jwGetPlaylist().length > 1) { 472 _addElement("prevButton", alignment, true); 473 _buildHandler("prevButton", "jwPlaylistPrev"); 474 } 475 break; 476 case "next": 477 if (api.jwGetPlaylist().length > 1) { 478 _addElement("nextButton", alignment, true); 479 _buildHandler("nextButton", "jwPlaylistNext"); 480 } 481 break; 482 case "elapsed": 483 _addElement("elapsedText", alignment, true); 484 break; 485 case "time": 486 var offsetLeft = api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 487 var offsetRight = api.skin.getSkinElement("controlbar", "timeSliderCapRight") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapRight").width; 488 var offset = alignment == "left" ? offsetLeft : offsetRight; 489 var width = api.skin.getSkinElement("controlbar", "timeSliderRail").width + offsetLeft + offsetRight; 490 var slidercss = { 491 height: api.skin.getSkinElement("controlbar", "background").height, 492 position: "absolute", 493 top: "0px", 494 width: width 495 }; 496 slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 497 var _timeslider = _appendNewElement("timeSlider", _elements.elements, slidercss); 498 _addElement("timeSliderCapLeft", alignment, true, _timeslider, alignment == "left" ? 0 : offset); 499 _addElement("timeSliderRail", alignment, false, _timeslider, offset); 500 _addElement("timeSliderBuffer", alignment, false, _timeslider, offset); 501 _addElement("timeSliderProgress", alignment, false, _timeslider, offset); 502 _addElement("timeSliderThumb", alignment, false, _timeslider, offset); 503 _addElement("timeSliderCapRight", alignment, true, _timeslider, alignment == "right" ? 0 : offset); 504 _addSliderListener("time"); 505 break; 506 case "fullscreen": 507 _addElement("fullscreenButton", alignment, false); 508 _addElement("normalscreenButton", alignment, true); 509 _buildHandler("fullscreenButton", "jwSetFullscreen", true); 510 _buildHandler("normalscreenButton", "jwSetFullscreen", false); 511 break; 512 case "volume": 513 var offsetLeft = api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 514 var offsetRight = api.skin.getSkinElement("controlbar", "volumeSliderCapRight") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapRight").width; 515 var offset = alignment == "left" ? offsetLeft : offsetRight; 516 var width = api.skin.getSkinElement("controlbar", "volumeSliderRail").width + offsetLeft + offsetRight; 517 var slidercss = { 518 height: api.skin.getSkinElement("controlbar", "background").height, 519 position: "absolute", 520 top: "0px", 521 width: width 522 }; 523 slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 524 var _volumeslider = _appendNewElement("volumeSlider", _elements.elements, slidercss); 525 _addElement("volumeSliderCapLeft", alignment, true, _volumeslider, alignment == "left" ? 0 : offset); 526 _addElement("volumeSliderRail", alignment, true, _volumeslider, offset); 527 _addElement("volumeSliderProgress", alignment, false, _volumeslider, offset); 528 _addElement("volumeSliderCapRight", alignment, true, _volumeslider, alignment == "right" ? 0 : offset); 529 _addSliderListener("volume"); 530 break; 531 case "mute": 532 _addElement("muteButton", alignment, false); 533 _addElement("unmuteButton", alignment, true); 534 _buildHandler("muteButton", "jwSetMute", true); 535 _buildHandler("unmuteButton", "jwSetMute", false); 536 537 break; 538 case "duration": 539 _addElement("durationText", alignment, true); 540 break; 541 } 542 } 543 544 function _addElement(element, alignment, offset, parent, position) { 545 if ((api.skin.getSkinElement("controlbar", element) !== undefined || element.indexOf("Text") > 0 || element.indexOf("divider") === 0) && !(element.indexOf("divider") === 0 && _prevElement.indexOf("divider") === 0)) { 546 _prevElement = element; 294 547 var css = { 548 height: api.skin.getSkinElement("controlbar", "background").height, 295 549 position: "absolute", 296 550 top: "0px" … … 298 552 var wid; 299 553 if (element.indexOf("Text") > 0) { 300 _element.innerhtml = "00:00";301 css.font = _settings.fontsize + "px/" + ( _api.skin.getSkinElement("controlbar", "background").height + 1) + "px " + _settings.font;554 element.innerhtml = "00:00"; 555 css.font = _settings.fontsize + "px/" + (api.skin.getSkinElement("controlbar", "background").height + 1) + "px " + _settings.font; 302 556 css.color = _settings.fontcolor; 303 557 css.text_align = "center"; … … 308 562 css.color = "#" + _settings.fontcolor.substr(-6); 309 563 } else if (element.indexOf("divider") === 0) { 310 css.background = "url(" + _api.skin.getSkinElement("controlbar", "divider").src + ") repeat-x center left";311 wid = _api.skin.getSkinElement("controlbar", "divider").width;564 css.background = "url(" + api.skin.getSkinElement("controlbar", "divider").src + ") repeat-x center left"; 565 wid = api.skin.getSkinElement("controlbar", "divider").width; 312 566 } else { 313 css.background = "url(" + _api.skin.getSkinElement("controlbar", element).src + ") repeat-x center left";314 wid = _api.skin.getSkinElement("controlbar", element).width;315 } 316 if (align == "left") {317 css.left = _settings.leftmargin;567 css.background = "url(" + api.skin.getSkinElement("controlbar", element).src + ") repeat-x center left"; 568 wid = api.skin.getSkinElement("controlbar", element).width; 569 } 570 if (alignment == "left") { 571 css.left = position === undefined ? _marginleft : position; 318 572 if (offset) { 319 _ settings.leftmargin+= wid;573 _marginleft += wid; 320 574 } 321 } else if (align == "right") {322 css.right = _settings.rightmargin;575 } else if (alignment == "right") { 576 css.right = position === undefined ? _marginright : position; 323 577 if (offset) { 324 _ settings.rightmargin+= wid;578 _marginright += wid; 325 579 } 326 580 } 581 582 if (parent === undefined) { 583 parent = _elements.elements; 584 } 585 327 586 css.width = wid; 328 css.height = _api.skin.getSkinElement("controlbar", "background").height; 329 _css(_element, css); 330 } 331 } 332 587 588 var newelement = _appendNewElement(element, parent, css); 589 if (api.skin.getSkinElement("controlbar", element + "Over") !== undefined) { 590 newelement.onmouseover = function(evt) { 591 evt.stopPropagation(); 592 newelement.style["background-image"] = ["url(", api.skin.getSkinElement("controlbar", element + "Over").src, ")"].join(""); 593 }; 594 newelement.onmouseout = function(evt) { 595 evt.stopPropagation(); 596 newelement.style["background-image"] = ["url(", api.skin.getSkinElement("controlbar", element).src, ")"].join(""); 597 }; 598 } 599 600 } 601 } 602 603 function _addListeners() { 604 // Register events with the player. 605 //api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, _playlistHandler); 606 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 607 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 608 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, _timeHandler); 609 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 610 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 611 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 612 } 333 613 334 614 /** Add interactivity to the jwplayerControlbar elements. **/ 335 function _buildHandlers() { 336 // Register events with the buttons. 337 _buildHandler("playButton", "jwPlay"); 338 _buildHandler("pauseButton", "jwPause"); 339 _buildHandler("prevButton", "jwPlaylistPrev"); 340 _buildHandler("nextButton", "jwPlaylistNext"); 341 _buildHandler("muteButton", "jwSetMute", true); 342 _buildHandler("unmuteButton", "jwSetMute", false); 343 _buildHandler("fullscreenButton", "jwSetFullscreen", true); 344 _buildHandler("normalscreenButton", "jwSetFullscreen", false); 345 346 _addSliders(); 347 348 // Register events with the player. 349 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 350 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 351 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, _timeHandler); 352 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 353 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 354 _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 355 615 function _init() { 356 616 // Trigger a few events so the bar looks good on startup. 357 _resizeHandler({358 id: _api.id,359 fulscreen: _api.jwGetFullscreen(),360 width: _api.jwGetWidth(),361 height: _api.jwGetHeight()362 });363 617 _timeHandler({ 364 id: _api.id,365 duration: _api.jwGetDuration(),618 id: api.id, 619 duration: api.jwGetDuration(), 366 620 position: 0 367 621 }); 368 622 _bufferHandler({ 369 id: _api.id,623 id: api.id, 370 624 bufferProgress: 0 371 625 }); 372 626 _muteHandler({ 373 id: _api.id,374 mute: _api.jwGetMute()627 id: api.id, 628 mute: api.jwGetMute() 375 629 }); 376 630 _stateHandler({ 377 id: _api.id,631 id: api.id, 378 632 newstate: jwplayer.api.events.state.IDLE 379 633 }); 380 634 _volumeHandler({ 381 id: _api.id,382 volume: _api.jwGetVolume()635 id: api.id, 636 volume: api.jwGetVolume() 383 637 }); 384 638 } … … 387 641 /** Set a single button handler. **/ 388 642 function _buildHandler(element, handler, args) { 389 if (_api.skin.getSkinElement("controlbar", element) !== undefined) { 390 var nam = _domelement.id + "_" + element; 391 var _element = document.getElementById(nam); 643 if (api.skin.getSkinElement("controlbar", element) !== undefined) { 644 var _element = _elements[element]; 392 645 if (_element !== null) { 393 646 _css(_element, { … … 397 650 _element.onmouseup = function(evt) { 398 651 evt.stopPropagation(); 399 _api.jwSetFullscreen(!_api.jwGetFullscreen()); 400 _resizeHandler({ 401 id: _api.id, 402 fullscreen: _api.jwGetFullscreen(), 403 width: _api.jwGetWidth(), 404 height: _api.jwGetHeight() 405 }); 652 api.jwSetFullscreen(!api.jwGetFullscreen()); 406 653 }; 407 654 } else { 408 655 _element.onmouseup = function(evt) { 409 656 evt.stopPropagation(); 410 if (! jwplayer.html5.utils.isNull(args)) {411 _api[handler](args);657 if (!(args === null)) { 658 api[handler](args); 412 659 } else { 413 _api[handler]();660 api[handler](); 414 661 } 415 662 … … 420 667 } 421 668 422 423 669 /** Set the volume drag handler. **/ 424 function _addSliders() { 425 var bar = _domelement; 426 var trl = document.getElementById(_domelement.id + "_timeSliderRail"); 427 var vrl = document.getElementById(_domelement.id + "_volumeSliderRail"); 428 _css(_domelement, { 670 function _addSliderListener(name) { 671 var bar = _elements[name + "Slider"]; 672 _css(_elements.elements, { 429 673 "cursor": "pointer" 430 674 }); 431 _css(trl, { 432 "cursor": "pointer" 433 }); 434 _css(vrl, { 675 _css(bar, { 435 676 "cursor": "pointer" 436 677 }); 437 678 bar.onmousedown = function(evt) { 438 var trlRect = trl.getBoundingClientRect(); 439 var vrlRect = vrl.getBoundingClientRect(); 440 if (evt.pageX >= trlRect.left - window.pageXOffset && evt.pageX <= trlRect.left - window.pageXOffset + trlRect.width) { 441 _settings.scrubber = "time"; 442 } else if (evt.pageX >= vrlRect.left - window.pageXOffset && evt.pageX <= vrlRect.left - window.pageXOffset + vrlRect.width) { 443 _settings.scrubber = "volume"; 444 } 679 _scrubber = name; 445 680 }; 446 681 bar.onmouseup = function(evt) { … … 449 684 }; 450 685 bar.onmousemove = function(evt) { 451 if (_s ettings.scrubber == "time") {452 _ settings.mousedown = true;686 if (_scrubber == "time") { 687 _mousedown = true; 453 688 var xps = evt.pageX - bar.getBoundingClientRect().left - window.pageXOffset; 454 _css( document.getElementById(_domelement.id + "_timeSliderThumb"), {689 _css(_elements.timeSliderThumb, { 455 690 left: xps 456 691 }); … … 462 697 /** The slider has been moved up. **/ 463 698 function _sliderUp(msx) { 464 _ settings.mousedown = false;699 _mousedown = false; 465 700 var railRect, xps; 466 if (_s ettings.scrubber == "time") {467 railRect = document.getElementById(_domelement.id + "_timeSliderRail").getBoundingClientRect();701 if (_scrubber == "time") { 702 railRect = _elements.timeSliderRail.getBoundingClientRect(); 468 703 xps = msx - railRect.left + window.pageXOffset; 469 var pos = xps / railRect.width * _ settings.currentDuration;704 var pos = xps / railRect.width * _currentDuration; 470 705 if (pos < 0) { 471 706 pos = 0; 472 } else if (pos > _ settings.currentDuration) {473 pos = _ settings.currentDuration - 3;474 } 475 _api.jwSeek(pos);476 if ( _api.jwGetState() != jwplayer.api.events.state.PLAYING) {477 _api.jwPlay();478 } 479 } else if (_s ettings.scrubber == "volume") {480 railRect = document.getElementById(_domelement.id + "_volumeSliderRail").getBoundingClientRect();707 } else if (pos > _currentDuration) { 708 pos = _currentDuration - 3; 709 } 710 api.jwSeek(pos); 711 if (api.jwGetState() != jwplayer.api.events.state.PLAYING) { 712 api.jwPlay(); 713 } 714 } else if (_scrubber == "volume") { 715 railRect = _elements.volumeSliderRail.getBoundingClientRect(); 481 716 xps = msx - railRect.left - window.pageXOffset; 482 717 var pct = Math.round(xps / railRect.width * 100); … … 486 721 pct = 100; 487 722 } 488 if ( _api.jwGetMute()) {489 _api.jwSetMute(false);490 } 491 _api.jwSetVolume(pct);492 } 493 _s ettings.scrubber = "none";723 if (api.jwGetMute()) { 724 api.jwSetMute(false); 725 } 726 api.jwSetVolume(pct); 727 } 728 _scrubber = "none"; 494 729 } 495 730 … … 497 732 /** Update the buffer percentage. **/ 498 733 function _bufferHandler(event) { 499 if (! jwplayer.html5.utils.isNull(event.bufferPercent)) {500 _ settings.currentBuffer = event.bufferPercent;734 if (!(event.bufferPercent === null)) { 735 _currentBuffer = event.bufferPercent; 501 736 } 502 737 503 var wid = document.getElementById(_domelement.id + "_timeSliderRail").getBoundingClientRect().width;504 var bufferWidth = isNaN(Math.round(wid * _ settings.currentBuffer / 100)) ? 0 : Math.round(wid * _settings.currentBuffer / 100);505 _css( document.getElementById(_domelement.id + "_timeSliderBuffer"), {738 var wid = _elements.timeSliderRail.getBoundingClientRect().width; 739 var bufferWidth = isNaN(Math.round(wid * _currentBuffer / 100)) ? 0 : Math.round(wid * _currentBuffer / 100); 740 _css(_elements.timeSliderBuffer, { 506 741 width: bufferWidth 507 742 }); … … 512 747 function _muteHandler(event) { 513 748 if (event.mute) { 514 _hide( document.getElementById(_domelement.id + "_muteButton"));515 _show( document.getElementById(_domelement.id + "_unmuteButton"));516 _hide( document.getElementById(_domelement.id + "_volumeSliderProgress"));749 _hide(_elements.muteButton); 750 _show(_elements.unmuteButton); 751 _hide(_elements.volumeSliderProgress); 517 752 } else { 518 _show( document.getElementById(_domelement.id + "_muteButton"));519 _hide( document.getElementById(_domelement.id + "_unmuteButton"));520 _show( document.getElementById(_domelement.id + "_volumeSliderProgress"));753 _show(_elements.muteButton); 754 _hide(_elements.unmuteButton); 755 _show(_elements.volumeSliderProgress); 521 756 } 522 757 } … … 527 762 // Handle the play / pause button 528 763 if (event.newstate == jwplayer.api.events.state.BUFFERING || event.newstate == jwplayer.api.events.state.PLAYING) { 529 _show( document.getElementById(_domelement.id + "_pauseButton"));530 _hide( document.getElementById(_domelement.id + "_playButton"));764 _show(_elements.pauseButton); 765 _hide(_elements.playButton); 531 766 } else { 532 _hide( document.getElementById(_domelement.id + "_pauseButton"));533 _show( document.getElementById(_domelement.id + "_playButton"));767 _hide(_elements.pauseButton); 768 _show(_elements.playButton); 534 769 } 535 770 536 771 // Show / hide progress bar 537 772 if (event.newstate == jwplayer.api.events.state.IDLE) { 538 _hide( document.getElementById(_domelement.id + "_timeSliderBuffer"));539 _hide( document.getElementById(_domelement.id + "_timeSliderProgress"));540 _hide( document.getElementById(_domelement.id + "_timeSliderThumb"));773 _hide(_elements.timeSliderBuffer); 774 _hide(_elements.timeSliderProgress); 775 _hide(_elements.timeSliderThumb); 541 776 } else { 542 _show( document.getElementById(_domelement.id + "_timeSliderBuffer"));777 _show(_elements.timeSliderBuffer); 543 778 if (event.newstate != jwplayer.api.events.state.BUFFERING) { 544 _show( document.getElementById(_domelement.id + "_timeSliderProgress"));545 _show( document.getElementById(_domelement.id + "_timeSliderThumb"));779 _show(_elements.timeSliderProgress); 780 _show(_elements.timeSliderThumb); 546 781 } 547 782 } … … 553 788 _timeHandler(jwplayer.utils.extend(event, { 554 789 position: 0, 555 duration: _ settings.currentDuration790 duration: _currentDuration 556 791 })); 557 792 } … … 560 795 /** Update the playback time. **/ 561 796 function _timeHandler(event) { 562 if (! jwplayer.html5.utils.isNull(event.position)) {563 _ settings.currentPosition = event.position;564 } 565 if (! jwplayer.html5.utils.isNull(event.duration)) {566 _ settings.currentDuration = event.duration;567 } 568 var progress = (_ settings.currentPosition === _settings.currentDuration === 0) ? 0 : _settings.currentPosition / _settings.currentDuration;569 var railRect = document.getElementById(_domelement.id + "_timeSliderRail").getBoundingClientRect();797 if (!(event.position === null)) { 798 _currentPosition = event.position; 799 } 800 if (!(event.duration === null)) { 801 _currentDuration = event.duration; 802 } 803 var progress = (_currentPosition === _currentDuration === 0) ? 0 : _currentPosition / _currentDuration; 804 var railRect = _elements.timeSliderRail.getBoundingClientRect(); 570 805 var progressWidth = isNaN(Math.round(railRect.width * progress)) ? 0 : Math.round(railRect.width * progress); 571 var thumbPosition = railRect.left + progressWidth - _domelement.getBoundingClientRect().left;806 var thumbPosition = progressWidth; 572 807 573 document.getElementById(_domelement.id + "_timeSliderProgress").style.width = progressWidth; 574 if (!_settings.mousedown) { 575 document.getElementById(_domelement.id + "_timeSliderThumb").style.left = thumbPosition; 576 } 577 document.getElementById(_domelement.id + "_durationText").innerHTML = _timeFormat(_settings.currentDuration); 578 document.getElementById(_domelement.id + "_elapsedText").innerHTML = _timeFormat(_settings.currentPosition); 808 _elements.timeSliderProgress.style.width = progressWidth; 809 if (!_mousedown) { 810 if (_elements.timeSliderThumb) { 811 _elements.timeSliderThumb.style.left = thumbPosition; 812 } 813 } 814 if (_elements.durationText) { 815 _elements.durationText.innerHTML = _timeFormat(_currentDuration); 816 } 817 if (_elements.elapsedText) { 818 _elements.elapsedText.innerHTML = _timeFormat(_currentPosition); 819 } 579 820 } 580 821 … … 591 832 592 833 593 /** Flip the player size to/from full-browser-screen. **/594 function _resizeHandler(event) {595 _settings.width = event.width;596 _settings.fullscreen = event.fullscreen;597 if (event.fullscreen) {598 _show(document.getElementById(_domelement.id + "_normalscreenButton"));599 _hide(document.getElementById(_domelement.id + "_fullscreenButton"));600 // TODO601 if (false) {602 window.onresize(function() {603 _resizeBar();604 });605 }606 } else {607 _hide(document.getElementById(_domelement.id + "_normalscreenButton"));608 _show(document.getElementById(_domelement.id + "_fullscreenButton"));609 // TODO610 if (false) {611 window.onresize(null);612 }613 }614 _resizeBar(event);615 _timeHandler(event);616 _bufferHandler(event);617 }618 619 620 834 /** Resize the jwplayerControlbar. **/ 621 function _resizeBar(event) { 622 var lft = _settings.left; 623 var top = _settings.top; 624 var wid = _settings.width; 625 var hei = _domelement.height; 626 var controlbarcss = {}; 627 if (_settings.position == "over") { 628 lft += 1 * _settings.margin; 629 top -= 1 * _settings.margin + hei; 630 wid -= 2 * _settings.margin; 631 } 632 if (_settings.fullscreen) { 633 lft = _settings.margin; 634 top = window.height - _settings.margin - hei; 635 wid = window.width - 2 * _settings.margin; 636 controlbarcss.z_index = 99; 637 } else { 638 controlbarcss.z_index = 97; 639 } 835 function _resizeBar() { 836 var controlbarcss = { 837 width: _width 838 }; 839 var elementcss = {}; 840 if (_settings.position.toUpperCase() == jwplayer.html5.view.positions.OVER || _fullscreen) { 841 controlbarcss.left = _settings.margin; 842 controlbarcss.width -= 2 * _settings.margin; 843 controlbarcss.top = _height - api.skin.getSkinElement("controlbar", "background").height - _settings.margin; 844 } 845 846 elementcss.left = api.skin.getSkinElement("controlbar", "capLeft").width; 847 elementcss.width = controlbarcss.width - api.skin.getSkinElement("controlbar", "capLeft").width - api.skin.getSkinElement("controlbar", "capRight").width; 640 848 849 var timeSliderLeft = api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 850 _css(_elements.timeSliderRail, { 851 width: (elementcss.width - _marginleft - _marginright), 852 left: timeSliderLeft 853 }); 854 if (_elements.timeSliderCapRight !== null) { 855 _css(_elements.timeSliderCapRight, { 856 left: timeSliderLeft + (elementcss.width - _marginleft - _marginright) 857 }); 858 } 859 _css(_wrapper, controlbarcss); 860 _css(_elements.elements, elementcss); 641 861 642 controlbarcss.left = lft;643 controlbarcss.top = top;644 controlbarcss.width = wid;645 _css(document.getElementById(_domelement.id + "_timeSliderRail"), {646 width: (wid - _settings.leftmargin - _settings.rightmargin)647 });648 _css(_domelement, controlbarcss);649 862 } 650 863 … … 652 865 /** Update the volume level. **/ 653 866 function _volumeHandler(event) { 654 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 655 var railRect = document.getElementById(_domelement.id + "_volumeSliderRail").getBoundingClientRect(); 656 var progressWidth = isNaN(Math.round(railRect.width * progress)) ? 0 : Math.round(railRect.width * progress); 657 var offset = parseInt(document.getElementById(_domelement.id + "_volumeSliderRail").style.right.replace("px", ""), 10); 658 659 _css(document.getElementById(_domelement.id + "_volumeSliderProgress"), { 660 width: progressWidth, 661 right: railRect.width - progressWidth + offset 662 }); 663 } 664 665 _buildElements(); 666 _buildHandlers(); 867 if (_elements.volumeSliderRail !== null) { 868 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 869 var width = parseInt(_elements.volumeSliderRail.style.width.replace("px", ""), 10); 870 var progressWidth = isNaN(Math.round(width * progress)) ? 0 : Math.round(width * progress); 871 var offset = parseInt(_elements.volumeSliderRail.style.right.replace("px", ""), 10); 872 873 var volumeSliderLeft = api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 874 _css(_elements.volumeSliderProgress, { 875 width: progressWidth, 876 left: volumeSliderLeft 877 }); 878 879 if (_elements.volumeSliderCapLeft !== undefined) { 880 _css(_elements.volumeSliderCapLeft, { 881 left: 0 882 }); 883 } 884 } 885 } 886 887 function _setup() { 888 _buildBase(); 889 _buildElements(); 890 _addListeners(); 891 _init(); 892 } 893 894 _setup(); 895 return this; 667 896 }; 668 897 })(jwplayer); … … 677 906 var _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 678 907 679 jwplayer.html5.controller = function( model, view, container) {908 jwplayer.html5.controller = function(api, container, model, view) { 680 909 var _model = model; 681 910 var _view = view; … … 697 926 case jwplayer.api.events.state.IDLE: 698 927 _model.setActiveMediaProvider(_model.playlist[_model.item]); 699 _eventDispatcher.addEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, _model.getMedia().play); 928 _model.addEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, function() { 929 _model.getMedia().play(); 930 }); 700 931 _model.getMedia().load(_model.playlist[_model.item]); 701 932 break; … … 821 1052 822 1053 /** Get / set the video's volume level. **/ 823 function _setVolume( arg) {1054 function _setVolume(volume) { 824 1055 try { 825 switch ( jwplayer.html5.utils.typeOf(arg)) {1056 switch (typeof(volume)) { 826 1057 case "number": 827 _model.getMedia().volume( arg);1058 _model.getMedia().volume(volume); 828 1059 break; 829 1060 case "string": 830 _model.getMedia().volume(parseInt( arg, 10));1061 _model.getMedia().volume(parseInt(volume, 10)); 831 1062 break; 832 1063 } … … 840 1071 841 1072 /** Get / set the mute state of the player. **/ 842 function _setMute( arg) {1073 function _setMute(state) { 843 1074 try { 844 _model.getMedia().mute( arg);1075 _model.getMedia().mute(state); 845 1076 return true; 846 1077 } catch (err) { … … 852 1083 853 1084 /** Resizes the video **/ 854 function _resize( arg1, arg2) {1085 function _resize(width, height) { 855 1086 try { 856 _model.getMedia().resize(arg1, arg2); 1087 _model.width = width; 1088 _model.height = height; 1089 _view.resize(width, height); 857 1090 return true; 858 1091 } catch (err) { … … 864 1097 865 1098 /** Jumping the player to/from fullscreen. **/ 866 function _setFullscreen( arg) {1099 function _setFullscreen(state) { 867 1100 try { 868 _model.getMedia().fullscreen( arg);1101 _model.getMedia().fullscreen(state); 869 1102 return true; 870 1103 } catch (err) { … … 962 1195 963 1196 964 jwplayer.html5.display = function(api, container, screencolor) { 965 var _container = container; 1197 jwplayer.html5.display = function(api, config) { 966 1198 var _display = {}; 967 screencolor = (api.skin.getComponentSettings("display").backgroundcolor === undefined) ? screencolor : api.skin.getComponentSettings("display").backgroundcolor; 1199 var _width; 1200 var _height; 1201 var _degreesRotated; 1202 var _rotationInterval; 1203 var _bufferRotation = api.skin.getComponentSettings("display").bufferrotation === undefined ? 15 : parseInt(api.skin.getComponentSettings("display").bufferrotation, 10); 1204 var _bufferInterval = api.skin.getComponentSettings("display").bufferinterval === undefined ? 100 : parseInt(api.skin.getComponentSettings("display").bufferinterval, 10); 1205 config.screencolor = (api.skin.getComponentSettings("display").backgroundcolor === undefined) ? config.screencolor : api.skin.getComponentSettings("display").backgroundcolor; 1206 config.screencolor = (config.screencolor === undefined) ? "" : config.screencolor.replace("0x", "#"); 968 1207 var _elements = _initializeDisplayElements(); 969 1208 api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); … … 978 1217 _display.display = createElement("div", "display"); 979 1218 _display.display_image = createElement("div", "display_image"); 980 _display.display_icon = createElement("img", "display_icon"); 981 _display.display_icon.src = api.skin.getSkinElement("display", "playIcon").src; 982 _display.display_icon.alt = "Click to play video"; 1219 _display.display_icon = createElement("div", "display_icon"); 983 1220 _display.display_iconBackground = createElement("div", "display_iconBackground"); 984 1221 _display.logo = createElement("div", "logo"); … … 987 1224 _display.display.appendChild(_display.display_iconBackground); 988 1225 _display.display.appendChild(_display.logo); 989 _container.parentNode.insertBefore(_display.display, _container);990 1226 _setupDisplayElements(); 991 1227 } 992 1228 1229 1230 this.getDisplayElement = function() { 1231 return _display.display; 1232 }; 1233 1234 this.resize = function(width, height) { 1235 _width = width; 1236 _height = height; 1237 _css(_display.display, { 1238 width: width, 1239 height: height 1240 }); 1241 _css(_display.display_image, { 1242 width: width, 1243 height: height 1244 }); 1245 _css(_display.display_iconBackground, { 1246 top: ((_height - api.skin.getSkinElement("display", "background").height) / 2) + "px", 1247 left: ((_width - api.skin.getSkinElement("display", "background").width) / 2) + "px" 1248 }); 1249 _stateHandler({}); 1250 }; 993 1251 994 1252 function createElement(tag, element) { … … 1024 1282 display: { 1025 1283 style: { 1026 cursor: 'pointer', 1027 width: api.jwGetWidth() + "px", 1028 height: api.jwGetHeight() + "px", 1029 position: 'relative', 1030 'z-index': 50, 1031 margin: 0, 1032 padding: 0 1284 cursor: 'pointer' 1033 1285 }, 1034 1286 click: _displayClickHandler … … 1049 1301 cursor: 'pointer', 1050 1302 position: 'absolute', 1051 top: (( api.jwGetHeight()- api.skin.getSkinElement("display", "background").height) / 2) + "px",1052 left: (( api.jwGetWidth()- api.skin.getSkinElement("display", "background").width) / 2) + "px",1303 top: ((_height - api.skin.getSkinElement("display", "background").height) / 2) + "px", 1304 left: ((_width - api.skin.getSkinElement("display", "background").width) / 2) + "px", 1053 1305 border: 0, 1054 1306 'background-image': (['url(', api.skin.getSkinElement("display", "background").src, ')']).join(''), … … 1062 1314 style: { 1063 1315 display: 'block', 1064 background: screencolor,1065 width: api.jwGetWidth()+ "px",1066 height: api.jwGetHeight()+ "px",1316 background: config.screencolor, 1317 width: _width + "px", 1318 height: _height + "px", 1067 1319 position: 'absolute', 1068 1320 cursor: 'pointer', … … 1097 1349 1098 1350 function _displayClickHandler(evt) { 1099 /*if (player._media === undefined) { 1100 document.location.href = jwplayer.html5.utils.getAbsolutePath(player.getPlaylist()[player.getConfig().item].levels[0]); 1101 return; 1102 }*/ 1103 if (typeof evt.preventDefault != 'undefined') { 1351 if (typeof evt.preventDefault != "undefined") { 1104 1352 evt.preventDefault(); // W3C 1105 1353 } else { … … 1120 1368 1121 1369 1122 function _setIcon(path) { 1123 _display.display_icon.src = path; 1124 } 1125 1126 1127 function _animate(element, state) { 1128 var speed = 'slow'; 1129 if (!_display.animate) { 1130 return; 1131 } 1132 if (state) { 1133 element.slideDown(speed, function() { 1134 _animate(element); 1135 }); 1370 function _setDisplayIcon(newIcon) { 1371 _show(_display.display_iconBackground); 1372 _display.display_icon.style["background-image"] = (['url(', api.skin.getSkinElement("display", newIcon).src, ')']).join(''); 1373 _css(_display.display_icon, { 1374 display: "block", 1375 width: api.skin.getSkinElement("display", newIcon).width, 1376 height: api.skin.getSkinElement("display", newIcon).height, 1377 top: (api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", newIcon).height) / 2, 1378 left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", newIcon).width) / 2 1379 }); 1380 if (api.skin.getSkinElement("display", newIcon + "Over") !== undefined) { 1381 _display.display_icon.onmouseover = function(evt) { 1382 evt.stopPropagation(); 1383 _display.display_icon.style["background-image"] = ["url(", api.skin.getSkinElement("display", newIcon + "Over").src, ")"].join(""); 1384 }; 1385 _display.display_icon.onmouseout = function(evt) { 1386 evt.stopPropagation(); 1387 _display.display_icon.style["background-image"] = ["url(", api.skin.getSkinElement("display", newIcon).src, ")"].join(""); 1388 }; 1136 1389 } else { 1137 element.slideUp(speed, function() { 1138 _animate(element, true); 1139 }); 1140 } 1141 } 1142 1390 _display.display_icon.onmouseover = undefined; 1391 _display.display_icon.onmouseout = undefined; 1392 } 1393 } 1394 1395 function _hideDisplayIcon() { 1396 _hide(_display.display_icon); 1397 _hide(_display.display_iconBackground); 1398 } 1143 1399 1144 1400 function _stateHandler(obj) { 1145 _display.animate = false; 1401 if (_rotationInterval !== undefined) { 1402 clearInterval(_rotationInterval); 1403 _rotationInterval = undefined; 1404 jwplayer.html5.utils.animations.rotate(_display.display_icon, 0); 1405 } 1146 1406 switch (api.jwGetState()) { 1147 1407 case jwplayer.api.events.state.BUFFERING: 1148 _show(_display.logo); 1149 setTimeout(function() { 1150 _hide(_display.logo); 1151 //.fadeOut(_logoDefaults.out * 1000); 1152 }, _logoDefaults.timeout * 1000); 1153 _display.display_icon.src = api.skin.getSkinElement("display", "bufferIcon").src; 1154 _css(_display.display_icon, { 1155 display: "block", 1156 top: (api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", "bufferIcon").height) / 2 + "px", 1157 left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", "bufferIcon").width) / 2 + "px" 1158 }); 1159 _display.animate = true; 1160 // TODO: Buffer Icon rotation 1161 if (false) { 1162 _animate(_display.display_iconBackground); 1163 } 1164 _hide(_display.display_iconBackground); 1408 jwplayer.html5.utils.fadeTo(_display.logo, 0, _logoDefaults.timeout, 1); 1409 _setDisplayIcon("bufferIcon"); 1410 _degreesRotated = 0; 1411 _rotationInterval = setInterval(function() { 1412 _degreesRotated += _bufferRotation; 1413 jwplayer.html5.utils.animations.rotate(_display.display_icon, _degreesRotated % 360); 1414 }, _bufferInterval); 1415 _setDisplayIcon("bufferIcon"); 1165 1416 break; 1166 1417 case jwplayer.api.events.state.PAUSED: 1167 _show(_display.logo);1418 jwplayer.html5.utils.fadeTo(_display.logo, 1, 0, 0); 1168 1419 _css(_display.display_image, { 1169 1420 background: "transparent no-repeat center center" 1170 1421 }); 1171 1422 _show(_display.display_iconBackground); 1172 _display.display_icon.src = api.skin.getSkinElement("display", "playIcon").src; 1173 _css(_display.display_icon, { 1174 display: "block", 1175 top: (api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", "playIcon").height) / 2 + "px", 1176 left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", "playIcon").width) / 2 + "px" 1177 }); 1423 _setDisplayIcon("playIcon"); 1178 1424 break; 1179 1425 case jwplayer.api.events.state.IDLE: 1180 _hide(_display.logo); 1426 _display.logo.style.display = "block"; 1427 var background = api.jwGetPlaylist()[api.jwGetItem()].image === "" ? config.screencolor : config.screencolor + " url('" + jwplayer.html5.utils.getAbsolutePath(api.jwGetPlaylist()[api.jwGetItem()].image) + "')"; 1181 1428 _css(_display.display_image, { 1182 background: screencolor + " url('" + jwplayer.html5.utils.getAbsolutePath(api.jwGetPlaylist()[api.jwGetItem()].image) + "')no-repeat center center"1429 background: background + " no-repeat center center" 1183 1430 }); 1184 1431 _show(_display.display_iconBackground); 1185 _display.display_icon.src = api.skin.getSkinElement("display", "playIcon").src; 1186 _css(_display.display_icon, { 1187 display: "block", 1188 top: (api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", "playIcon").height) / 2 + "px", 1189 left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", "playIcon").width) / 2 + "px" 1190 }); 1432 _setDisplayIcon("playIcon"); 1191 1433 break; 1192 1434 default: … … 1196 1438 }); 1197 1439 _show(_display.display_iconBackground); 1198 _display.display_icon.src = api.skin.getSkinElement("display", "muteIcon").src; 1199 _css(_display.display_icon, { 1200 display: "block", 1201 top: (api.skin.getSkinElement("display", "muteIcon").height - api.skin.getSkinElement("display", "muteIcon").height) / 2 + "px", 1202 left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", "muteIcon").width) / 2 + "px" 1203 }); 1440 _setDisplayIcon("muteIcon"); 1441 1204 1442 } else { 1205 1443 try { … … 1208 1446 1209 1447 } 1210 _show(_display.logo); 1211 setTimeout(function() { 1212 _hide(_display.logo); 1213 }, _logoDefaults.timeout * 1000); 1448 _display.logo.style.display = "block"; 1449 jwplayer.html5.utils.fadeTo(_display.logo, 0, _logoDefaults.timeout, 1); 1214 1450 _css(_display.display_image, { 1215 1451 background: "transparent no-repeat center center" … … 1222 1458 } 1223 1459 1460 return this; 1224 1461 }; 1225 1462 … … 1352 1589 } 1353 1590 }; 1591 }; 1592 })(jwplayer); 1593 /** 1594 * JW Player Video Media component 1595 * 1596 * @author zach 1597 * @version 1.0 1598 */ 1599 (function(jwplayer) { 1600 jwplayer.html5.extensionmap = { 1601 "3gp": "video/3gpp", 1602 "3gpp": "video/3gpp", 1603 "3g2": "video/3gpp2", 1604 "3gpp2": "video/3gpp2", 1605 "flv": "video/x-flv", 1606 "f4a": "audio/mp4", 1607 "f4b": "audio/mp4", 1608 "f4p": "video/mp4", 1609 "f4v": "video/mp4", 1610 "mov": "video/quicktime", 1611 "m4a": "audio/mp4", 1612 "m4b": "audio/mp4", 1613 "m4p": "audio/mp4", 1614 "m4v": "video/mp4", 1615 "mkv": "video/x-matroska", 1616 "mp4": "video/mp4", 1617 "sdp": "application/sdp", 1618 "vp6": "video/x-vp6", 1619 "aac": "audio/aac", 1620 "mp3": "audio/mp3", 1621 "ogg": "audio/ogg", 1622 "ogv": "video/ogg", 1623 "webm": "video/webm" 1354 1624 }; 1355 1625 })(jwplayer); … … 1411 1681 var _stopped; 1412 1682 var _loadcount = 0; 1683 var _start = false; 1413 1684 var hasChrome = false; 1414 1685 … … 1434 1705 _model.state = newstate; 1435 1706 _state = newstate; 1436 if (oldstate == jwplayer.api.events.state.IDLE && newstate == jwplayer.api.events.state.BUFFERING) {1437 _container.volume = _model.volume / 100;1438 _container.muted = _model.mute;1439 }1440 1707 if (newstate == jwplayer.api.events.state.IDLE) { 1441 clearInterval(_interval); 1442 _interval = null; 1708 _clearInterval(); 1443 1709 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE); 1444 1710 … … 1477 1743 return; 1478 1744 } 1479 if (! jwplayer.html5.utils.isNull(event.target)) {1745 if (!(event.target === undefined)) { 1480 1746 if (_model.duration === 0) { 1481 1747 _model.duration = event.target.duration; … … 1483 1749 1484 1750 if (_state == jwplayer.api.events.state.PLAYING) { 1751 if (!_start && _container.readyState > 0) { 1752 _start = true; 1753 _container.currentTime = _model.playlist[_model.item].start; 1754 _container.volume = _model.volume / 100; 1755 _container.muted = _model.mute; 1756 } 1485 1757 _model.position = Math.round(event.target.currentTime * 10) / 10; 1486 1758 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_TIME, { … … 1509 1781 bufferFill = bufferTime / _model.config.bufferlength * 100; 1510 1782 1511 // TODO: Buffer underrun1512 if (false) {1513 if (bufferFill < 25 && _state == jwplayer.api.events.state.PLAYING) {1514 _setState(jwplayer.api.events.state.BUFFERING);1515 _bufferFull = false;1516 if (!_container.seeking) {1517 _container.pause();1518 }1519 } else if (bufferFill > 95 && _state == jwplayer.api.events.state.BUFFERING && _bufferFull === false && bufferTime > 0) {1520 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, {});1521 }1522 }1523 1524 1783 if (_bufferFull === false) { 1525 1784 _bufferFull = true; 1526 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL , {});1785 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL); 1527 1786 } 1528 1787 … … 1532 1791 } 1533 1792 1534 if (! jwplayer.html5.utils.isNull(bufferPercent)) {1793 if (!(bufferPercent === null)) { 1535 1794 _model.buffer = Math.round(bufferPercent); 1536 1795 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, { 1537 1796 bufferPercent: Math.round(bufferPercent) 1538 //bufferingComplete: _bufferingComplete,1539 //bufferFull: _bufferFull,1540 //bufferFill: bufferFill,1541 //bufferTime: bufferTime1542 1797 }); 1543 1798 } … … 1549 1804 function _startInterval() { 1550 1805 if (_interval === null) { 1551 _interval = window.setInterval(function() {1806 _interval = setInterval(function() { 1552 1807 _positionHandler({}); 1553 1808 }, 100); … … 1555 1810 } 1556 1811 1812 function _clearInterval() { 1813 clearInterval(_interval); 1814 _interval = null; 1815 } 1557 1816 1558 1817 function _errorHandler(event) { … … 1560 1819 } 1561 1820 1562 this.get Container= function() {1821 this.getDisplayElement = function() { 1563 1822 return _container; 1564 1823 }; … … 1568 1827 _container.play(); 1569 1828 _setState(jwplayer.api.events.state.PLAYING); 1829 _startInterval(); 1570 1830 } 1571 1831 }; … … 1590 1850 _stopped = true; 1591 1851 _container.pause(); 1592 clearInterval(_interval); 1593 _interval = undefined; 1852 _clearInterval(); 1594 1853 _model.position = 0; 1595 1854 _setState(jwplayer.api.events.state.IDLE); … … 1647 1906 /** Load a new video into the player. **/ 1648 1907 this.load = function(playlistItem) { 1649 _ container = _insertVideoTag(playlistItem);1650 for (var event in _events) {1651 _container.addEventListener(event, function(evt) {1652 _events[evt.type](evt);1653 }, true);1654 } 1908 _embed(playlistItem); 1909 1910 _bufferFull = false; 1911 _bufferingComplete = false; 1912 _start = false; 1913 1655 1914 if (_container.style.display != 'none') { 1656 1915 _container.style.display = 'block'; 1657 1916 } 1658 1917 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_LOADED); 1659 setTimeout(function() { 1660 _bufferFull = false; 1661 _bufferingComplete = false; 1662 _setState(jwplayer.api.events.state.BUFFERING); 1663 _startInterval(); 1664 try { 1665 _container.currentTime = 0; 1666 } catch (err) { 1667 1668 } 1669 }, 25); 1670 }; 1671 1672 function _insertVideoTag(playlistItem) { 1673 //var _container = document.getElementById(player.id); 1918 _setState(jwplayer.api.events.state.BUFFERING); 1919 _positionHandler({}); 1920 }; 1921 1922 _embed = function(playlistItem) { 1674 1923 var vid = _container.ownerDocument.createElement("video"); 1675 //vid.controls = "none"; 1676 if (vid.autobuffer) { 1677 vid.autobuffer = _model.config.autoplay; 1678 } else if (vid.autoplay) { 1679 vid.autoplay = _model.config.autoplay; 1680 } 1924 vid.preload = "none"; 1681 1925 vid.loop = _model.config.repeat; 1682 1926 for (var sourceIndex in playlistItem.levels) { … … 1686 1930 if (sourceModel.type === undefined) { 1687 1931 var extension = jwplayer.html5.utils.extension(sourceModel.file); 1688 if (extension == "ogv") { 1689 extension = "ogg"; 1932 if (jwplayer.html5.extensionmap[extension] !== undefined) { 1933 source.type = jwplayer.html5.extensionmap[extension]; 1934 } else { 1935 source.type = 'video/' + extension + ';'; 1690 1936 } 1691 source.type = 'video/' + extension + ';';1692 1937 } else { 1693 1938 source.type = sourceModel.type; … … 1695 1940 vid.appendChild(source); 1696 1941 } 1697 vid.width = _model.config.width; 1698 vid.height = _model.config.height; 1699 var styles = { 1700 position: 'absolute', 1701 width: _model.config.width + 'px', 1702 height: _model.config.height + 'px', 1703 top: 0, 1704 left: 0, 1705 'z-index': 0, 1706 margin: 'auto', 1707 display: 'block' 1708 }; 1709 for (var style in styles) { 1710 vid.style[style] = styles[style]; 1711 } 1942 vid.style.position = _container.style.position; 1943 vid.style.top = _container.style.top; 1944 vid.style.left = _container.style.left; 1945 vid.style.width = _container.style.width; 1946 vid.style.height = _container.style.height; 1947 vid.volume = 0; 1712 1948 _container.parentNode.replaceChild(vid, _container); 1713 1949 vid.id = _container.id; 1714 return vid; 1715 } 1950 _container = vid; 1951 for (var event in _events) { 1952 _container.addEventListener(event, function(evt) { 1953 _events[evt.type](evt); 1954 }, true); 1955 } 1956 }; 1957 1958 this.embed = _embed; 1716 1959 1717 1960 return this; … … 1726 1969 (function(jwplayer) { 1727 1970 1728 var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen", "item"]; 1729 1730 jwplayer.html5.model = function(container, options) { 1971 var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen", "item", "plugins"]; 1972 1973 jwplayer.html5.model = function(api, container, options) { 1974 var _model = { 1975 media: undefined, 1976 playlist: [], 1977 state: jwplayer.api.events.state.IDLE, 1978 position: 0, 1979 buffer: 0, 1980 config: { 1981 width: 480, 1982 height: 320, 1983 item: 0, 1984 skin: undefined, 1985 file: undefined, 1986 image: undefined, 1987 start: 0, 1988 duration: 0, 1989 bufferlength: 5, 1990 volume: 90, 1991 mute: false, 1992 fullscreen: false, 1993 repeat: false, 1994 autostart: false, 1995 debug: undefined, 1996 screencolor: undefined 1997 } 1998 }; 1731 1999 var _media; 1732 2000 var _container = container; 1733 2001 var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 1734 jwplayer.utils.extend(this, _eventDispatcher); 1735 1736 jwplayer.utils.extend(this.config, options); 1737 1738 this.loadPlaylist = function(playlist, ready) { 2002 var _components = ["display", "controlbar"]; 2003 2004 jwplayer.utils.extend(_model, _eventDispatcher); 2005 2006 for (var option in options) { 2007 switch (options[option]) { 2008 case "": 2009 continue; 2010 case "true": 2011 _model.config[option] = true; 2012 break; 2013 case "false": 2014 _model.config[option] = false; 2015 break; 2016 default: 2017 var config = _model.config; 2018 var path = option.split("."); 2019 for (var edge in path) { 2020 if (edge == path.length - 1) { 2021 config[path[edge]] = options[option]; 2022 } else { 2023 config[path[edge]] = {}; 2024 config = config[path[edge]]; 2025 } 2026 } 2027 } 2028 } 2029 for (var index in _configurableStateVariables) { 2030 var configurableStateVariable = _configurableStateVariables[index]; 2031 _model[configurableStateVariable] = _model.config[configurableStateVariable]; 2032 } 2033 2034 var pluginorder = _model.plugins === undefined ? _components : _components.concat(_model.plugins); 2035 2036 _model.plugins = { 2037 order: pluginorder, 2038 config: { 2039 display: { 2040 position: jwplayer.html5.view.positions.OVER, 2041 screencolor: _model.config.screencolor 2042 }, 2043 controlbar: { 2044 position: jwplayer.html5.view.positions.BOTTOM 2045 } 2046 }, 2047 object: {} 2048 }; 2049 2050 for (var pluginIndex in _model.plugins.order) { 2051 var pluginName = _model.plugins.order[pluginIndex]; 2052 var pluginConfig = _model.config[pluginName] === undefined ? {} : _model.config[pluginName]; 2053 _model.plugins.config[pluginName] = _model.plugins.config[pluginName] === undefined ? pluginConfig : jwplayer.utils.extend(_model.plugins.config[pluginName], pluginConfig); 2054 if (_model.plugins.config[pluginName].position === undefined){ 2055 _model.plugins.config[pluginName].position = jwplayer.html5.view.positions.OVER; 2056 } 2057 } 2058 2059 _model.loadPlaylist = function(playlist, ready) { 1739 2060 ready = ready === null ? true : false; 1740 this.playlist = new jwplayer.html5.playlist(playlist);2061 _model.playlist = new jwplayer.html5.playlist(playlist); 1741 2062 if (ready) { 1742 2063 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 1743 2064 _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 1744 "item": this.config.item 1745 }); 1746 } 1747 this.setActiveMediaProvider(this.playlist[this.index]); 1748 }; 1749 1750 if (this.config.skin.length === 0) { 1751 this.config.skin = ""; 1752 } 1753 for (var index in _configurableStateVariables) { 1754 var configurableStateVariable = _configurableStateVariables[index]; 1755 this[configurableStateVariable] = this.config[configurableStateVariable]; 1756 } 2065 "item": _model.config.item 2066 }); 2067 } 2068 _model.setActiveMediaProvider(_model.playlist[_model.item]); 2069 }; 1757 2070 1758 2071 function forward(evt) { 1759 2072 if (evt.type == jwplayer.api.events.JWPLAYER_MEDIA_LOADED) { 1760 _container = _media.get Container();2073 _container = _media.getDisplayElement(); 1761 2074 } 1762 2075 _eventDispatcher.sendEvent(evt.type, evt); 1763 2076 } 1764 2077 1765 this.setActiveMediaProvider = function(playlistItem) {2078 _model.setActiveMediaProvider = function(playlistItem) { 1766 2079 if (_media === undefined) { 1767 _media = new jwplayer.html5.mediavideo( this, _container);2080 _media = new jwplayer.html5.mediavideo(_model, _container); 1768 2081 _media.addGlobalListener(forward); 2082 if (_model.config.chromeless) { 2083 _media.embed(playlistItem); 2084 } 1769 2085 } 1770 2086 return true; 1771 2087 }; 1772 2088 1773 this.getMedia = function() {2089 _model.getMedia = function() { 1774 2090 return _media; 1775 2091 }; 1776 2092 1777 return this; 1778 }; 1779 1780 jwplayer.html5.model.prototype = { 1781 media: undefined, 1782 components: {}, 1783 playlist: [], 1784 state: jwplayer.api.events.state.IDLE, 1785 position: 0, 1786 buffer: 0, 1787 config: { 1788 width: 480, 1789 height: 320, 1790 item: 0, 1791 skin: undefined, 1792 file: undefined, 1793 image: undefined, 1794 start: 0, 1795 duration: 0, 1796 bufferlength: 5, 1797 volume: 90, 1798 mute: false, 1799 fullscreen: false, 1800 repeat: false, 1801 autostart: false, 1802 debug: undefined, 1803 screencolor: '' 1804 } 1805 }; 2093 _model.setupPlugins = function() { 2094 for (var plugin in _model.plugins.order) { 2095 if (jwplayer.html5[_model.plugins.order[plugin]] !== undefined) { 2096 _model.plugins.object[_model.plugins.order[plugin]] = new jwplayer.html5[_model.plugins.order[plugin]](api, _model.plugins.config[_model.plugins.order[plugin]]); 2097 } else { 2098 _model.plugins.object[_model.plugins.order[plugin]] = new window[_model.plugins.order[plugin]](api, _model.plugins.config[_model.plugins.order[plugin]]); 2099 } 2100 } 2101 }; 2102 2103 return _model; 2104 }; 2105 2106 1806 2107 })(jwplayer); 1807 2108 /** … … 1813 2114 (function(jwplayer) { 1814 2115 jwplayer.html5.playlist = function(config) { 1815 _playlist = [];2116 var _playlist = []; 1816 2117 if (config.playlist && config.playlist.length > 0) { 1817 2118 _playlist = config.playlist; … … 1834 2135 (function(jwplayer) { 1835 2136 jwplayer.html5.playlistitem = function(config) { 1836 for (var property in this) { 2137 var _playlistitem = { 2138 author: "", 2139 date: "", 2140 description: "", 2141 image: "", 2142 link: "", 2143 mediaid: "", 2144 tags: "", 2145 title: "", 2146 provider: "", 2147 2148 file: "", 2149 streamer: "", 2150 duration: -1, 2151 start: 0, 2152 2153 currentLevel: -1, 2154 levels: [] 2155 }; 2156 2157 for (var property in _playlistitem) { 1837 2158 if (config[property] !== undefined) { 1838 this[property] = config[property]; 1839 } 1840 } 1841 if (this.levels.length === 0){ 1842 this.levels[0] = new jwplayer.html5.playlistitemlevel(this); 1843 } 1844 return this; 1845 }; 1846 1847 jwplayer.html5.playlistitem.prototype = { 1848 author: "", 1849 date: "", 1850 description: "", 1851 image: "", 1852 link: "", 1853 mediaid: "", 1854 tags: "", 1855 title: "", 1856 provider: "", 1857 1858 file: "", 1859 streamer: "", 1860 duration: -1, 1861 start: 0, 1862 1863 currentLevel: -1, 1864 levels: [] 1865 }; 2159 _playlistitem[property] = config[property]; 2160 } 2161 } 2162 if (_playlistitem.levels.length === 0) { 2163 _playlistitem.levels[0] = new jwplayer.html5.playlistitemlevel(_playlistitem); 2164 } 2165 return _playlistitem; 2166 }; 1866 2167 })(jwplayer); 1867 2168 /** … … 1873 2174 (function(jwplayer) { 1874 2175 jwplayer.html5.playlistitemlevel = function(config) { 1875 for (var property in this) { 2176 var _playlistitemlevel = { 2177 file: "", 2178 streamer: "", 2179 bitrate: 0, 2180 width: 0 2181 }; 2182 2183 for (var property in _playlistitemlevel) { 1876 2184 if (config[property] !== undefined) { 1877 this[property] = config[property]; 1878 } 1879 } 1880 return this; 1881 }; 1882 1883 jwplayer.html5.playlistitemlevel.prototype = { 1884 file: "", 1885 streamer: "", 1886 bitrate: 0, 1887 width: 0 1888 }; 2185 _playlistitemlevel[property] = config[property]; 2186 } 2187 } 2188 return _playlistitemlevel; 2189 }; 2190 1889 2191 })(jwplayer); 1890 2192 /** … … 1921 2223 if (_loaded) { 1922 2224 return _components[component].settings; 2225 } 2226 return null; 2227 }; 2228 2229 this.getComponentLayout = function(component) { 2230 if (_loaded) { 2231 return _components[component].layout; 1923 2232 } 1924 2233 return null; … … 1945 2254 /** Load the skin **/ 1946 2255 function _load() { 1947 if (skinPath === "") {2256 if (skinPath === undefined) { 1948 2257 _loadSkin(jwplayer.html5.defaultSkin().xml); 1949 2258 } else { … … 1967 2276 var component = { 1968 2277 settings: {}, 1969 elements: {} 2278 elements: {}, 2279 layout: {} 1970 2280 }; 1971 2281 _skin[componentName] = component; 1972 var elements = components[componentIndex].getElementsByTagName('element ');2282 var elements = components[componentIndex].getElementsByTagName('elements')[0].getElementsByTagName('element'); 1973 2283 for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 1974 2284 _loadImage(elements[elementIndex], componentName); 1975 2285 } 1976 var settings = components[componentIndex].getElementsByTagName('setting'); 1977 for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 1978 _skin[componentName].settings[settings[settingIndex].getAttribute("name")] = settings[settingIndex].getAttribute("value"); 2286 var settingsElement = components[componentIndex].getElementsByTagName('settings')[0]; 2287 if (settingsElement !== undefined && settingsElement.childNodes.length > 0) { 2288 var settings = settingsElement.getElementsByTagName('setting'); 2289 for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 2290 _skin[componentName].settings[settings[settingIndex].getAttribute("name")] = settings[settingIndex].getAttribute("value"); 2291 } 2292 } 2293 var layout = components[componentIndex].getElementsByTagName('layout')[0]; 2294 if (layout !== undefined && layout.childNodes.length > 0) { 2295 var groups = layout.getElementsByTagName('group'); 2296 for (var groupIndex = 0; groupIndex < groups.length; groupIndex++) { 2297 var group = groups[groupIndex]; 2298 _skin[componentName].layout[group.getAttribute("position")] = { 2299 elements: [] 2300 }; 2301 for (var attributeIndex = 0; attributeIndex < group.attributes.length; attributeIndex++) { 2302 var attribute = group.attributes[attributeIndex]; 2303 _skin[componentName].layout[group.getAttribute("position")][attribute.name] = attribute.value; 2304 } 2305 var groupElements = group.getElementsByTagName('*'); 2306 for (var groupElementIndex = 0; groupElementIndex < groupElements.length; groupElementIndex++) { 2307 var element = groupElements[groupElementIndex]; 2308 _skin[componentName].layout[group.getAttribute("position")].elements.push({type:element.tagName}); 2309 for (var attributeIndex = 0; attributeIndex < element.attributes.length; attributeIndex++) { 2310 var attribute = element.attributes[attributeIndex]; 2311 _skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex][attribute.name] = attribute.value; 2312 } 2313 if (_skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex].name === undefined){ 2314 _skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex].name = element.tagName; 2315 } 2316 } 2317 } 1979 2318 } 1980 2319 … … 2007 2346 imgUrl = [skinRoot, component, elementSource].join('/'); 2008 2347 } 2009 2348 2010 2349 _skin[component].elements[elementName] = { 2011 2350 height: 0, … … 2222 2561 })(jwplayer); 2223 2562 /** 2224 * JW Player view component2563 * Utility methods for the JW Player. 2225 2564 * 2226 2565 * @author zach … … 2228 2567 */ 2229 2568 (function(jwplayer) { 2230 2231 var _css = jwplayer.html5.utils.css;2232 2233 jwplayer.html5.view = function(api, model, container) {2234 var _api = api;2235 var _model = model;2236 var _wrapper;2237 var _components = {};2238 2239 function createWrapper() {2240 _wrapper = document.createElement("div");2241 _wrapper.id = container.id;2242 container.id = _wrapper.id + "_video";2243 2244 _css(_wrapper, {2245 position: 'relative',2246 height: _model.config.height + 'px',2247 width: _model.config.width + 'px',2248 margin: 'auto',2249 padding: 0,2250 'background-color': _model.config.screencolor2251 });2252 2253 _css(container,{2254 position: 'absolute',2255 width: _model.config.width + 'px',2256 height: _model.config.height + 'px',2257 top: 0,2258 left: 0,2259 'z-index': 0,2260 margin: 'auto',2261 display: 'block'2262 });2263 2264 jwplayer.utils.wrap(container, _wrapper);2265 } 2266 2267 function setupComponents() {2268 if ((_model.getMedia() === undefined) || !_model.getMedia().hasChrome || !_model.config.chromeless) {2269 _components.display = new jwplayer.html5.display(_api, container, _model.config.screencolor);2270 _components.controlbar = new jwplayer.html5.controlbar(_api, container);2271 }2272 }2273 2274 this.setup = function(){2275 createWrapper();2276 setupComponents();2277 };2278 2279 this.resize = function(width, height) {2280 2281 };2282 2283 2284 };2569 var _animations = {}; 2570 2571 jwplayer.html5.utils.animations = function() { 2572 }; 2573 2574 jwplayer.html5.utils.animations.transform = function(domelement, value) { 2575 domelement.style.webkitTransform = value; 2576 domelement.style.MozTransform = value; 2577 domelement.style.OTransform = value; 2578 }; 2579 2580 jwplayer.html5.utils.animations.transformOrigin = function(domelement, value) { 2581 domelement.style.webkitTransformOrigin = value; 2582 domelement.style.MozTransformOrigin = value; 2583 domelement.style.OTransformOrigin = value; 2584 }; 2585 2586 jwplayer.html5.utils.animations.rotate = function(domelement, deg) { 2587 jwplayer.html5.utils.animations.transform(domelement, ["rotate(", deg, "deg)"].join("")); 2588 }; 2589 2590 jwplayer.html5.utils.fadeTo = function(domelement, endAlpha, time, startAlpha, startTime) { 2591 // Interrupting 2592 if (_animations[domelement] != startTime && startTime !== undefined){ 2593 return; 2594 } 2595 var currentTime = new Date().getTime(); 2596 if (startAlpha === undefined) { 2597 startAlpha = domelement.style.opacity === "" ? 1 : domelement.style.opacity; 2598 } 2599 if (typeof startAlpha == "string"){ 2600 startAlpha = parseInt(startAlpha, 10); 2601 } 2602 if (domelement.style.opacity == endAlpha && domelement.style.opacity !== ""){ 2603 return; 2604 } 2605 if (startTime === undefined) { 2606 startTime = currentTime; 2607 _animations[domelement] = startTime; 2608 } 2609 var percentTime = (currentTime - startTime) / (time * 1000); 2610 percentTime = percentTime > 1 ? 1 : percentTime; 2611 var delta = endAlpha - startAlpha; 2612 var alpha = startAlpha + (percentTime * delta); 2613 if (alpha > 1){ 2614 alpha = 1; 2615 } else if (alpha < 0) { 2616 alpha = 0; 2617 } 2618 domelement.style.opacity = alpha; 2619 setTimeout(function() { 2620 jwplayer.html5.utils.fadeTo(domelement, endAlpha, time, startAlpha, startTime); 2621 }, 100); 2622 }; 2623 2285 2624 })(jwplayer); 2286 2625 /** … … 2293 2632 2294 2633 jwplayer.html5.api = function(container, options) { 2295 var _model = new jwplayer.html5.model(container, options); 2296 var _view = new jwplayer.html5.view(this, _model, container); 2297 var _controller = new jwplayer.html5.controller(_model, _view, container); 2634 var _container = document.createElement('div'); 2635 container.parentNode.replaceChild(_container, container); 2636 _container.id = container.id; 2637 2638 var _model = new jwplayer.html5.model(this, _container, options); 2639 var _view = new jwplayer.html5.view(this, _container, _model); 2640 var _controller = new jwplayer.html5.controller(this, _container, _model, _view); 2298 2641 2299 2642 this.version = "1.0"; 2300 this.id = container.id;2643 this.id = _container.id; 2301 2644 this.skin = new jwplayer.html5.skin(); 2302 2645 … … 2323 2666 this.jwGetWidth = _statevarFactory('width'); 2324 2667 this.jwGetHeight = _statevarFactory('height'); 2325 this.jwGetFullscreen = _statevarFactory(' buffer');2668 this.jwGetFullscreen = _statevarFactory('fullscreen'); 2326 2669 this.jwSetFullscreen = _controller.setFullscreen; 2327 2670 this.jwGetVolume = _statevarFactory('volume'); … … 2355 2698 2356 2699 this.skin.load(_model.config.skin, function() { 2357 _view.setup(); 2700 _model.loadPlaylist(_model.config, false); 2701 _model.setupPlugins(); 2702 _view.setup(_model.getMedia().getDisplayElement()); 2358 2703 var evt = { 2359 2704 id: this.id, 2360 2705 version: this.version 2361 2706 }; 2362 _model.loadPlaylist(_model.config, false);2363 2707 _controller.sendEvent(jwplayer.api.events.JWPLAYER_READY, evt); 2364 2708 if (playerReady !== undefined) { … … 2369 2713 window[_model.config.playerReady](evt); 2370 2714 } 2715 2371 2716 _model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 2372 2717 _model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { … … 2374 2719 }); 2375 2720 2376 if (_model.config.autostart === true ) {2721 if (_model.config.autostart === true && !_model.config.chromeless) { 2377 2722 _controller.play(); 2378 2723 }
Note: See TracChangeset
for help on using the changeset viewer.
