Changeset 1200
- Timestamp:
- 08/11/10 20:34:35 (3 years ago)
- Location:
- trunk/js
- Files:
-
- 6 edited
-
bin-debug/embed.html (modified) (2 diffs)
-
bin-debug/jwplayer.js (modified) (20 diffs)
-
src/api/jwplayer.api.js (modified) (10 diffs)
-
src/embed/jwplayer.embed.js (modified) (6 diffs)
-
src/utils/jwplayer.utils.js (modified) (2 diffs)
-
src/utils/jwplayer.utils.selectors.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/js/bin-debug/embed.html
r1194 r1200 7 7 <script type="text/javascript"> 8 8 var options = { 9 file: '../../../testing/files/bunny.mp4',10 9 image: '../../../testing/files/bunny.jpg', 11 Â Â Â Â Â Â Â sources: [{12 Â Â Â Â Â Â Â Â Â Â file:"http://content.bitsontherun.com/videos/nPripu9l-327.mp4",13 Â Â Â Â Â Â Â Â Â Â type: "video/mp4"14 Â Â Â Â Â Â Â }],15 10 plugins: { 16 11 'sharing-1': {}, 17 12 'viral-2d': { 18 13 link: 'http://www.longtailvideo.com', 19 ' viral.allowmenu': 'true'14 'allowmenu': 'true' 20 15 }, 21 16 'fbit-1': {} 22 17 }, 23 18 players: [ 19 {type:'html5'}, 24 20 {type:'flash', src: '../../../trunk/fl5/player.swf'}, 25 {type:'html5'},26 21 ] 27 22 }; … … 35 30 <h1>JWPlayer JS Embedder Testing Page</h1> 36 31 <div id="something"> 37 <video id="div1" src="../test/files/bunny.ogv"> 32 <video id="div1" width=500 height=300> 33 <source src="../../../testing/files/bunny.mp4" /> 38 34 This is <div> 1. 39 35 </video> -
trunk/js/bin-debug/jwplayer.js
r1194 r1200 25 25 jwplayer.utils.extend = function() { 26 26 var args = jwplayer.utils.extend['arguments']; 27 if (args.length > 0) {28 for (var i = args.length - 1; i > 0; i--){27 if (args.length > 1) { 28 for (var i=1; i < args.length; i++){ 29 29 for (element in args[i]) { 30 args[ i-1][element] = args[i][element];30 args[0][element] = args[i][element]; 31 31 } 32 32 } … … 47 47 jwplayer.utils.isIE = function() { 48 48 return (!+"\v1"); 49 };jwplayer.utils.selectors = function(selector){ 49 }; 50 51 /** 52 * Detects whether or not the current player has flash capabilities 53 */ 54 jwplayer.utils.hasFlash = function() { 55 var nav = navigator; 56 return (typeof nav.plugins != "undefined" && typeof nav.plugins['Shockwave Flash'] != "undefined"); 57 };/** 58 * Parser for the JW Player. 59 * 60 * @author zach 61 * @version 1.0 62 * @lastmodifieddate 2010-08-09 63 */ 64 (function(jwplayer) { 65 66 jwplayer.utils.mediaparser = function() {}; 67 68 var elementAttributes = { 69 element: { 70 width: 'width', 71 height: 'height', 72 id: 'id', 73 'class': 'className', 74 name: 'name' 75 }, 76 media: { 77 src: 'file', 78 preload: 'preload', 79 autoplay: 'autostart', 80 loop: 'repeat', 81 controls: 'controls' 82 }, 83 source: { 84 src: 'file', 85 type: 'type', 86 media: 'media' 87 }, 88 video: { 89 poster: 'image' 90 } 91 }; 92 93 var parsers = {}; 94 95 jwplayer.utils.mediaparser.parseMedia = function(element) { 96 return parseElement(element); 97 }; 98 99 function getAttributeList(elementType, attributes) { 100 if (attributes === undefined) { 101 attributes = elementAttributes[elementType]; 102 } else { 103 jwplayer.utils.extend(attributes, elementAttributes[elementType]); 104 } 105 return attributes; 106 } 107 108 function parseElement(domElement, attributes) { 109 if (parsers[domElement.tagName.toLowerCase()] && (attributes === undefined)) { 110 return parsers[domElement.tagName.toLowerCase()](domElement); 111 } else { 112 attributes = getAttributeList('element', attributes); 113 var configuration = {}; 114 for (var attribute in attributes) { 115 if (attribute != "length") { 116 var value = domElement.getAttribute(attribute); 117 if (!(value === "" || value === undefined || value === null)) { 118 configuration[attributes[attribute]] = domElement.getAttribute(attribute); 119 } 120 } 121 } 122 //configuration.screencolor = 123 var bgColor = domElement.style['#background-color']; 124 if (bgColor && !(bgColor == "transparent" || bgColor == "rgba(0, 0, 0, 0)")) { 125 configuration.screencolor = bgColor; 126 } 127 return configuration; 128 } 129 } 130 131 function parseMediaElement(domElement, attributes) { 132 attributes = getAttributeList('media', attributes); 133 var sources = []; 134 if (!(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length)){ 135 // IE6/7/8 case 136 var currentElement = domElement.nextSibling; 137 if (currentElement[0] !== undefined){ 138 while(currentElement[0].tagName.toLowerCase() == "source") { 139 sources.push(parseSourceElement(currentElement[0])); 140 currentElement = currentElement.nextSibling; 141 } 142 } 143 } else { 144 var sourceTags = jwplayer.utils.selectors.getElementsByTagAndClass("source", "", domElement); 145 for (var i in sourceTags) { 146 sources.push(parseSourceElement(sourceTags[i])); 147 } 148 } 149 var configuration = parseElement(domElement, attributes); 150 if (configuration.file !== undefined) { 151 sources[0] = { 152 'file': configuration.file 153 }; 154 } 155 configuration.levels = sources; 156 return configuration; 157 } 158 159 function parseSourceElement(domElement, attributes) { 160 attributes = getAttributeList('source', attributes); 161 var result = parseElement(domElement, attributes); 162 result.width = 0; 163 result.bitrate = 0; 164 return result; 165 } 166 167 function parseVideoElement(domElement, attributes) { 168 attributes = getAttributeList('video', attributes); 169 var result = parseMediaElement(domElement, attributes); 170 return result; 171 } 172 173 parsers.media = parseMediaElement; 174 parsers.audio = parseMediaElement; 175 parsers.source = parseSourceElement; 176 parsers.video = parseVideoElement; 177 178 179 })(jwplayer); 180 jwplayer.utils.selectors = function(selector){ 50 181 selector = jwplayer.utils.strings.trim(selector); 51 182 var selectType = selector.charAt(0); … … 69 200 }; 70 201 71 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className ){202 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className, parent) { 72 203 elements = []; 73 var selected = document.getElementsByTagName(tagName); 204 if (parent === undefined) { 205 parent = document; 206 } 207 var selected = parent.getElementsByTagName(tagName); 74 208 for (var i = 0; i < selected.length; i++){ 75 209 if (selected[i].className !== undefined){ … … 124 258 125 259 jwplayer.api.PlayerAPI = function(container) { 260 this.container = container; 261 this.id = container.id; 262 126 263 var _listeners = {}; 127 264 var _stateListeners = {}; 128 265 var _player = undefined; 129 266 130 this.container = container; 131 this.id = container.id; 267 var _itemMeta = {}; 268 269 /** Use this function to set the internal low-level player. This is a javascript object which contains the low-level API calls. **/ 270 this.setPlayer = function(player) { 271 if (_player) { 272 //remove all former _player event listeners 273 } 274 _player = player; 275 for (var eventType in _listeners) { 276 this.addInternalListener(_player, eventType); 277 } 278 }; 132 279 133 280 this.stateListener = function(state, callback) { 134 281 if (!_stateListeners[state]) { 135 282 _stateListeners[state] = []; 136 this.eventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, this.stateCallback(state));283 this.eventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, stateCallback(state)); 137 284 } 138 285 _stateListeners[state].push(callback); … … 140 287 }; 141 288 142 this.stateCallback = function(state) {289 function stateCallback(state) { 143 290 return function(newstate, oldstate) { 144 291 if (newstate == state) { … … 155 302 }; 156 303 304 this.addInternalListener = function(player, type) { 305 player.addEventListener(type, 'function(dat) { jwplayer("'+this.id+'").dispatchEvent("'+type+'", dat); }'); 306 }; 307 157 308 this.eventListener = function(type, callback) { 158 if (!_listeners[type]) { _listeners[type] = []; } 309 if (!_listeners[type]) { 310 _listeners[type] = []; 311 if (_player) { 312 this.addInternalListener(_player, type); 313 } 314 } 159 315 _listeners[type].push(callback); 160 316 return this; … … 165 321 for (var l in _listeners[type]) { 166 322 if (typeof _listeners[type][l] == 'function') { 167 _listeners[type][l]. apply(this, slice(arguments, 1));323 _listeners[type][l].call(this, arguments[1]); 168 324 } 169 325 } … … 171 327 }; 172 328 173 this.playerReady = function() { 174 _player = this.container; 175 }; 176 329 this.playerReady = function(obj) { 330 this.eventListener('jwplayerMediaMeta', function(data) { 331 jwplayer.utils.extend(_itemMeta, data.metadata); 332 }); 333 334 this.dispatchEvent.call(this, "jwplayerReady", obj); 335 336 // Todo: setup event callbacks 337 // Todo: run any queued up commands 338 339 }; 340 341 this.callInternal = function(funcName, args) { 342 if (_player && typeof _player[funcName] == "function") { 343 if (args !== undefined) { 344 return (_player[funcName])(args); 345 } else { 346 return (_player[funcName])(); 347 } 348 } 349 return null; 350 }; 351 352 this.getItemMeta = function() { 353 return _itemMeta; 354 }; 355 356 177 357 /** Using this function instead of array.slice since Arguments are not an array **/ 178 358 function slice(list, from, to) { … … 185 365 return ret; 186 366 } 367 187 368 }; 188 369 … … 194 375 195 376 // Player Getters 196 getBuffer: function() { return undefined; },197 get Fullscreen: function() { return undefined; },198 get LockState: function() { return undefined; },199 get Meta: function() { return undefined; },200 get Mute: function() { return undefined; },201 get Playlist: function() { return undefined; },202 get PlaylistItem: function() { return undefined; },203 get Height: function() { return undefined; },204 get Width: function() { return undefined; },205 get State: function() { return undefined; },206 get Position: function() { return undefined; },207 get Duration: function() { return undefined; },208 get Volume: function() { return undefined; },377 getBuffer: function() { return this.callInternal('getBuffer'); }, 378 getDuration: function() { return this.callInternal('getDuration'); }, 379 getFullscreen: function() { return this.callInternal('getFullscreen'); }, 380 getHeight: function() { return this.container.height; }, 381 getLockState: function() { return this.callInternal('getLockState'); }, 382 getMeta: function() { return this.getItemMeta(); }, 383 getMute: function() { return this.callInternal('getMute'); }, 384 getPlaylist: function() { return this.callInternal('getPlaylist'); }, 385 getPlaylistItem: function(item) { return this.callInternal('getPlaylist')[item]; }, 386 getPosition: function() { return this.callInternal('getPosition'); }, 387 getState: function() { return this.callInternal('getState'); }, 388 getVolume: function() { return this.callInternal('getVolume'); }, 389 getWidth: function() { return this.container.width; }, 209 390 210 391 // Player Public Methods 211 setFullscreen: function( ) { return this;},212 setMute: function( ) {return this; },392 setFullscreen: function(fullscreen) { this.callInternal("setFullscreen", fullscreen); return this;}, 393 setMute: function(mute) { this.callInternal("mute", mute); return this; }, 213 394 lock: function() { return this; }, 214 395 unlock: function() { return this; }, 215 load: function() { return this; }, 216 playlistItem: function() { return this; }, 217 playlistPrev: function() { return this; }, 218 playlistNext: function() { return this; }, 219 resize: function() { return this; }, 220 play: function() { 221 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'BUFFERING', 'IDLE'); 222 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'PLAYING', 'BUFFERING'); 396 load: function(toLoad) { this.callInternal("load", toLoad); return this; }, 397 playlistItem: function(item) { this.callInternal("playlistItem", item); return this; }, 398 playlistPrev: function() { this.callInternal("playlistPrev"); return this; }, 399 playlistNext: function() { this.callInternal("playlistNext"); return this; }, 400 resize: function(width, height) { 401 this.container.width = width; 402 this.container.height = height; 223 403 return this; 224 404 }, 225 pause: function() { 226 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'PAUSED', 'PLAYING'); 405 play: function(state) { 406 if (typeof state === "undefined") { 407 var state = this.getState(); 408 if (state == jwplayer.api.events.state.PLAYING || state == jwplayer.api.events.state.BUFFERING) { 409 this.callInternal("pause"); 410 } else { 411 this.callInternal("play"); 412 } 413 } else { 414 this.callInternal("play", state); 415 } 227 416 return this; 228 417 }, 229 stop: function() { 230 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'IDLE', 'PLAYING'); 418 pause: function(state) { 419 if (typeof state === "undefined") { 420 var state = this.getState(); 421 if (state == jwplayer.api.events.state.PAUSED) { 422 this.callInternal("play"); 423 } else { 424 this.callInternal("pause"); 425 } 426 } else { 427 this.callInternal("pause", state); 428 } 231 429 return this; 232 430 }, 233 seek: function() { return this; }, 234 setVolume: function() { return this; }, 431 stop: function() { this.callInternal("stop"); return this; }, 432 seek: function(position) { this.callInternal("seek", position); return this; }, 433 setVolume: function(volume) { this.callInternal("volume", volume); return this; }, 235 434 236 435 // Player Events … … 256 455 257 456 // Player plugin API 258 initializePlugin: function(pluginName, pluginCode) { return this; } ,457 initializePlugin: function(pluginName, pluginCode) { return this; } 259 458 }; 260 459 … … 273 472 274 473 if (_container) { 275 var foundPlayer = jwplayer.api.playerBy Container(_container);474 var foundPlayer = jwplayer.api.playerById(_container.id); 276 475 if (foundPlayer) { 277 476 return foundPlayer; … … 287 486 }; 288 487 289 jwplayer.api.playerBy Container = function(cont) {488 jwplayer.api.playerById = function(id) { 290 489 for(var p in _players) { 291 if (_players[p].container == cont) {490 if (_players[p].container.id == id) { 292 491 return _players[p]; 293 492 } … … 312 511 }; 313 512 314 var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 315 316 playerReady = function(obj) { 317 var api = jwplayer(obj['id']); 318 api.playerReady(); 319 320 // Todo: setup event callbacks 321 // Todo: run any queued up commands 322 323 if (_userPlayerReady) { 324 _userPlayerReady.call(this, obj); 325 } 326 }; 327 328 })(jwplayer);(function(jwplayer) { 513 })(jwplayer); 514 515 var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 516 517 playerReady = function(obj) { 518 var api = jwplayer(obj['id']); 519 api.playerReady(obj); 520 521 if (_userPlayerReady) { 522 _userPlayerReady.call(this, obj); 523 } 524 }; 525 (function(jwplayer) { 329 526 330 527 jwplayer.embed = function() {}; … … 334 531 players = {}, 335 532 config = undefined, 336 api = undefined; 337 533 api = undefined; 338 534 this.constructor(playerApi); 339 535 }; … … 342 538 constructor: function(playerApi) { 343 539 this.api = playerApi; 344 this.config = this.parseConfig(this.api.config); 540 var mediaConfig = jwplayer.utils.mediaparser.parseMedia(this.api.container); 541 this.config = this.parseConfig(jwplayer.utils.extend({}, mediaConfig, this.api.config)); 345 542 }, 346 543 … … 350 547 switch (player.type) { 351 548 case 'flash': 352 this.api.container = jwplayer.embed.embedFlash(this.api.container, player, this.config); 549 if (jwplayer.utils.hasFlash()) { 550 if (this.config.levels || this.config.playlist) { 551 this.api.onReady(this.loadAfterReady(this.config)); 552 } 553 var flashPlayer = jwplayer.embed.embedFlash(this.api.container, player, this.config); 554 this.api.setPlayer(flashPlayer); 555 } else { 556 this.players.splice(0, 1); 557 embedPlayer(); 558 } 353 559 break; 354 560 case 'html5': 355 this.api.player = jwplayer.embed.embedHTML5(this.api.container, player, this.config); 356 playerReady({id:this.api.container.id}); 561 var html5player = jwplayer.embed.embedHTML5(this.api.container, player, this.config); 562 this.api.setPlayer(html5player); 563 this.api.playerReady({id:this.api.container.id}); 357 564 break; 358 565 } 359 566 } 360 return jwplayer.register(this.api); 567 return this.api; 568 }, 569 570 loadAfterReady: function(loadParams) { 571 return function(obj) { 572 if (loadParams.playlist) { 573 this.load(loadParams.playlist); 574 } else if (loadParams.levels) { 575 var item = this.getPlaylistItem(0); 576 item.levels = loadParams.levels; 577 this.load(item); 578 } 579 }; 361 580 }, 362 581 … … 394 613 var height = params.height; 395 614 delete params['height']; 615 616 // These properties are loaded after playerready; not sent in as flashvars. 617 if (params.levels && params.levels.length && params.file === undefined) { 618 params.file = params.levels[0]['file']; 619 } 620 621 delete params['levels']; 622 delete params['playlist']; 396 623 397 624 if (jwplayer.utils.isIE()) { … … 421 648 return obj; 422 649 } 650 423 651 }; 424 652 425 653 jwplayer.embed.embedHTML5 = function(container, player, options) { 426 654 if (jwplayer.html5) { 427 var player = new (jwplayer.html5(container)).setup(jwplayer.utils.extend({}, jwplayer.embed.defaults, options)); 428 return player; 655 container.innerHTML = "<p>Embedded HTML5 player goes here</p>"; 656 // TODO: remove this requirement from the html5 player (sources instead of levels) 657 return new (jwplayer.html5(container)).setup(jwplayer.utils.extend({sources:options.levels, playerready:'playerReady'}, jwplayer.embed.defaults, options)); 429 658 } else { 430 659 return null; … … 467 696 jwplayer.api.PlayerAPI.prototype.setup = function(options, player) { 468 697 this.config = options; 469 if(player) { this.player = player; }470 698 jwplayer.register(this); 471 699 return (new jwplayer.embed.Embedder(this)).embedPlayer(); -
trunk/js/src/api/jwplayer.api.js
r1194 r1200 35 35 36 36 jwplayer.api.PlayerAPI = function(container) { 37 this.container = container; 38 this.id = container.id; 39 37 40 var _listeners = {}; 38 41 var _stateListeners = {}; 39 42 var _player = undefined; 40 43 41 this.container = container; 42 this.id = container.id; 44 var _itemMeta = {}; 45 46 /** Use this function to set the internal low-level player. This is a javascript object which contains the low-level API calls. **/ 47 this.setPlayer = function(player) { 48 if (_player) { 49 //remove all former _player event listeners 50 } 51 _player = player; 52 for (var eventType in _listeners) { 53 this.addInternalListener(_player, eventType); 54 } 55 }; 43 56 44 57 this.stateListener = function(state, callback) { 45 58 if (!_stateListeners[state]) { 46 59 _stateListeners[state] = []; 47 this.eventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, this.stateCallback(state));60 this.eventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, stateCallback(state)); 48 61 } 49 62 _stateListeners[state].push(callback); … … 51 64 }; 52 65 53 this.stateCallback = function(state) {66 function stateCallback(state) { 54 67 return function(newstate, oldstate) { 55 68 if (newstate == state) { … … 66 79 }; 67 80 81 this.addInternalListener = function(player, type) { 82 player.addEventListener(type, 'function(dat) { jwplayer("'+this.id+'").dispatchEvent("'+type+'", dat); }'); 83 }; 84 68 85 this.eventListener = function(type, callback) { 69 if (!_listeners[type]) { _listeners[type] = []; } 86 if (!_listeners[type]) { 87 _listeners[type] = []; 88 if (_player) { 89 this.addInternalListener(_player, type); 90 } 91 } 70 92 _listeners[type].push(callback); 71 93 return this; … … 76 98 for (var l in _listeners[type]) { 77 99 if (typeof _listeners[type][l] == 'function') { 78 _listeners[type][l]. apply(this, slice(arguments, 1));100 _listeners[type][l].call(this, arguments[1]); 79 101 } 80 102 } … … 82 104 }; 83 105 84 this.playerReady = function() { 85 _player = this.container; 86 }; 87 106 this.playerReady = function(obj) { 107 this.eventListener('jwplayerMediaMeta', function(data) { 108 jwplayer.utils.extend(_itemMeta, data.metadata); 109 }); 110 111 this.dispatchEvent.call(this, "jwplayerReady", obj); 112 113 // Todo: setup event callbacks 114 // Todo: run any queued up commands 115 116 }; 117 118 this.callInternal = function(funcName, args) { 119 if (_player && typeof _player[funcName] == "function") { 120 if (args !== undefined) { 121 return (_player[funcName])(args); 122 } else { 123 return (_player[funcName])(); 124 } 125 } 126 return null; 127 }; 128 129 this.getItemMeta = function() { 130 return _itemMeta; 131 }; 132 133 88 134 /** Using this function instead of array.slice since Arguments are not an array **/ 89 135 function slice(list, from, to) { … … 96 142 return ret; 97 143 } 144 98 145 }; 99 146 … … 105 152 106 153 // Player Getters 107 getBuffer: function() { return undefined; },108 get Fullscreen: function() { return undefined; },109 get LockState: function() { return undefined; },110 get Meta: function() { return undefined; },111 get Mute: function() { return undefined; },112 get Playlist: function() { return undefined; },113 get PlaylistItem: function() { return undefined; },114 get Height: function() { return undefined; },115 get Width: function() { return undefined; },116 get State: function() { return undefined; },117 get Position: function() { return undefined; },118 get Duration: function() { return undefined; },119 get Volume: function() { return undefined; },154 getBuffer: function() { return this.callInternal('getBuffer'); }, 155 getDuration: function() { return this.callInternal('getDuration'); }, 156 getFullscreen: function() { return this.callInternal('getFullscreen'); }, 157 getHeight: function() { return this.container.height; }, 158 getLockState: function() { return this.callInternal('getLockState'); }, 159 getMeta: function() { return this.getItemMeta(); }, 160 getMute: function() { return this.callInternal('getMute'); }, 161 getPlaylist: function() { return this.callInternal('getPlaylist'); }, 162 getPlaylistItem: function(item) { return this.callInternal('getPlaylist')[item]; }, 163 getPosition: function() { return this.callInternal('getPosition'); }, 164 getState: function() { return this.callInternal('getState'); }, 165 getVolume: function() { return this.callInternal('getVolume'); }, 166 getWidth: function() { return this.container.width; }, 120 167 121 168 // Player Public Methods 122 setFullscreen: function( ) { return this;},123 setMute: function( ) {return this; },169 setFullscreen: function(fullscreen) { this.callInternal("setFullscreen", fullscreen); return this;}, 170 setMute: function(mute) { this.callInternal("mute", mute); return this; }, 124 171 lock: function() { return this; }, 125 172 unlock: function() { return this; }, 126 load: function() { return this; }, 127 playlistItem: function() { return this; }, 128 playlistPrev: function() { return this; }, 129 playlistNext: function() { return this; }, 130 resize: function() { return this; }, 131 play: function() { 132 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'BUFFERING', 'IDLE'); 133 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'PLAYING', 'BUFFERING'); 173 load: function(toLoad) { this.callInternal("load", toLoad); return this; }, 174 playlistItem: function(item) { this.callInternal("playlistItem", item); return this; }, 175 playlistPrev: function() { this.callInternal("playlistPrev"); return this; }, 176 playlistNext: function() { this.callInternal("playlistNext"); return this; }, 177 resize: function(width, height) { 178 this.container.width = width; 179 this.container.height = height; 134 180 return this; 135 181 }, 136 pause: function() { 137 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'PAUSED', 'PLAYING'); 182 play: function(state) { 183 if (typeof state === "undefined") { 184 var state = this.getState(); 185 if (state == jwplayer.api.events.state.PLAYING || state == jwplayer.api.events.state.BUFFERING) { 186 this.callInternal("pause"); 187 } else { 188 this.callInternal("play"); 189 } 190 } else { 191 this.callInternal("play", state); 192 } 138 193 return this; 139 194 }, 140 stop: function() { 141 this.dispatchEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, 'IDLE', 'PLAYING'); 195 pause: function(state) { 196 if (typeof state === "undefined") { 197 var state = this.getState(); 198 if (state == jwplayer.api.events.state.PAUSED) { 199 this.callInternal("play"); 200 } else { 201 this.callInternal("pause"); 202 } 203 } else { 204 this.callInternal("pause", state); 205 } 142 206 return this; 143 207 }, 144 seek: function() { return this; }, 145 setVolume: function() { return this; }, 208 stop: function() { this.callInternal("stop"); return this; }, 209 seek: function(position) { this.callInternal("seek", position); return this; }, 210 setVolume: function(volume) { this.callInternal("volume", volume); return this; }, 146 211 147 212 // Player Events … … 184 249 185 250 if (_container) { 186 var foundPlayer = jwplayer.api.playerBy Container(_container);251 var foundPlayer = jwplayer.api.playerById(_container.id); 187 252 if (foundPlayer) { 188 253 return foundPlayer; … … 198 263 }; 199 264 200 jwplayer.api.playerBy Container = function(cont) {265 jwplayer.api.playerById = function(id) { 201 266 for(var p in _players) { 202 if (_players[p].container == cont) {267 if (_players[p].container.id == id) { 203 268 return _players[p]; 204 269 } … … 223 288 }; 224 289 225 var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined;226 227 playerReady = function(obj) {228 var api = jwplayer(obj['id']);229 api.playerReady();230 231 // Todo: setup event callbacks232 // Todo: run any queued up commands233 234 if (_userPlayerReady) {235 _userPlayerReady.call(this, obj);236 }237 };238 239 290 })(jwplayer); 291 292 var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 293 294 playerReady = function(obj) { 295 var api = jwplayer(obj['id']); 296 api.playerReady(obj); 297 298 if (_userPlayerReady) { 299 _userPlayerReady.call(this, obj); 300 } 301 }; -
trunk/js/src/embed/jwplayer.embed.js
r1194 r1200 7 7 players = {}, 8 8 config = undefined, 9 api = undefined; 10 9 api = undefined; 11 10 this.constructor(playerApi); 12 11 }; … … 15 14 constructor: function(playerApi) { 16 15 this.api = playerApi; 17 this.config = this.parseConfig(this.api.config); 16 var mediaConfig = jwplayer.utils.mediaparser.parseMedia(this.api.container); 17 this.config = this.parseConfig(jwplayer.utils.extend({}, mediaConfig, this.api.config)); 18 18 }, 19 19 … … 23 23 switch (player.type) { 24 24 case 'flash': 25 this.api.container = jwplayer.embed.embedFlash(this.api.container, player, this.config); 25 if (jwplayer.utils.hasFlash()) { 26 if (this.config.levels || this.config.playlist) { 27 this.api.onReady(this.loadAfterReady(this.config)); 28 } 29 var flashPlayer = jwplayer.embed.embedFlash(this.api.container, player, this.config); 30 this.api.setPlayer(flashPlayer); 31 } else { 32 this.players.splice(0, 1); 33 embedPlayer(); 34 } 26 35 break; 27 36 case 'html5': 28 this.api.player = jwplayer.embed.embedHTML5(this.api.container, player, this.config); 29 playerReady({id:this.api.container.id}); 37 var html5player = jwplayer.embed.embedHTML5(this.api.container, player, this.config); 38 this.api.setPlayer(html5player); 39 this.api.playerReady({id:this.api.container.id}); 30 40 break; 31 41 } 32 42 } 33 return jwplayer.register(this.api); 43 return this.api; 44 }, 45 46 loadAfterReady: function(loadParams) { 47 return function(obj) { 48 if (loadParams.playlist) { 49 this.load(loadParams.playlist); 50 } else if (loadParams.levels) { 51 var item = this.getPlaylistItem(0); 52 item.levels = loadParams.levels; 53 this.load(item); 54 } 55 }; 34 56 }, 35 57 … … 68 90 delete params['height']; 69 91 92 // These properties are loaded after playerready; not sent in as flashvars. 93 if (params.levels && params.levels.length && params.file === undefined) { 94 params.file = params.levels[0]['file']; 95 } 96 97 delete params['levels']; 98 delete params['playlist']; 99 70 100 if (jwplayer.utils.isIE()) { 71 101 var html = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' + … … 94 124 return obj; 95 125 } 126 96 127 }; 97 128 98 129 jwplayer.embed.embedHTML5 = function(container, player, options) { 99 130 if (jwplayer.html5) { 100 var player = new (jwplayer.html5(container)).setup(jwplayer.utils.extend({}, jwplayer.embed.defaults, options)); 101 return player; 131 container.innerHTML = "<p>Embedded HTML5 player goes here</p>"; 132 // TODO: remove this requirement from the html5 player (sources instead of levels) 133 return new (jwplayer.html5(container)).setup(jwplayer.utils.extend({sources:options.levels, playerready:'playerReady'}, jwplayer.embed.defaults, options)); 102 134 } else { 103 135 return null; … … 140 172 jwplayer.api.PlayerAPI.prototype.setup = function(options, player) { 141 173 this.config = options; 142 if(player) { this.player = player; }143 174 jwplayer.register(this); 144 175 return (new jwplayer.embed.Embedder(this)).embedPlayer(); -
trunk/js/src/utils/jwplayer.utils.js
r1179 r1200 21 21 jwplayer.utils.extend = function() { 22 22 var args = jwplayer.utils.extend['arguments']; 23 if (args.length > 0) {24 for (var i = args.length - 1; i > 0; i--){23 if (args.length > 1) { 24 for (var i=1; i < args.length; i++){ 25 25 for (element in args[i]) { 26 args[ i-1][element] = args[i][element];26 args[0][element] = args[i][element]; 27 27 } 28 28 } … … 44 44 return (!+"\v1"); 45 45 }; 46 47 /** 48 * Detects whether or not the current player has flash capabilities 49 */ 50 jwplayer.utils.hasFlash = function() { 51 var nav = navigator; 52 return (typeof nav.plugins != "undefined" && typeof nav.plugins['Shockwave Flash'] != "undefined"); 53 }; -
trunk/js/src/utils/jwplayer.utils.selectors.js
r1171 r1200 21 21 }; 22 22 23 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className ){23 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className, parent) { 24 24 elements = []; 25 var selected = document.getElementsByTagName(tagName); 25 if (parent === undefined) { 26 parent = document; 27 } 28 var selected = parent.getElementsByTagName(tagName); 26 29 for (var i = 0; i < selected.length; i++){ 27 30 if (selected[i].className !== undefined){
Note: See TracChangeset
for help on using the changeset viewer.
