Changeset 1200


Ignore:
Timestamp:
08/11/10 20:34:35 (3 years ago)
Author:
pablo
Message:

Wiring in low-level APIs

Location:
trunk/js
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/js/bin-debug/embed.html

    r1194 r1200  
    77                <script type="text/javascript"> 
    88                        var options = { 
    9                                 file:           '../../../testing/files/bunny.mp4', 
    109                                image:          '../../../testing/files/bunny.jpg', 
    11                         sources: [{ 
    12                             file:"http://content.bitsontherun.com/videos/nPripu9l-327.mp4", 
    13                             type: "video/mp4" 
    14                         }],                               
    1510                                plugins:        { 
    1611                                        'sharing-1': {}, 
    1712                                        'viral-2d': { 
    1813                                                link: 'http://www.longtailvideo.com', 
    19                                                 'viral.allowmenu': 'true' 
     14                                                'allowmenu': 'true' 
    2015                                        }, 
    2116                                        'fbit-1': {} 
    2217                                }, 
    2318                                players: [ 
     19                                        {type:'html5'}, 
    2420                                        {type:'flash', src: '../../../trunk/fl5/player.swf'}, 
    25                                         {type:'html5'}, 
    2621                                ] 
    2722                        };  
     
    3530                <h1>JWPlayer JS Embedder Testing Page</h1> 
    3631                <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" /> 
    3834                                This is &lt;div&gt; 1. 
    3935                        </video> 
  • trunk/js/bin-debug/jwplayer.js

    r1194 r1200  
    2525jwplayer.utils.extend = function() { 
    2626        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++){ 
    2929                        for (element in args[i]) { 
    30                                 args[i-1][element] = args[i][element]; 
     30                                args[0][element] = args[i][element]; 
    3131                        } 
    3232                } 
     
    4747jwplayer.utils.isIE = function() { 
    4848        return (!+"\v1"); 
    49 };jwplayer.utils.selectors = function(selector){ 
     49}; 
     50 
     51/** 
     52 * Detects whether or not the current player has flash capabilities 
     53 */ 
     54jwplayer.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); 
     180jwplayer.utils.selectors = function(selector){ 
    50181        selector = jwplayer.utils.strings.trim(selector); 
    51182        var selectType = selector.charAt(0); 
     
    69200}; 
    70201 
    71 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className){ 
     202jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className, parent) { 
    72203        elements = []; 
    73         var selected = document.getElementsByTagName(tagName); 
     204        if (parent === undefined) { 
     205                parent = document; 
     206        } 
     207        var selected = parent.getElementsByTagName(tagName); 
    74208        for (var i = 0; i < selected.length; i++){ 
    75209                if (selected[i].className !== undefined){ 
     
    124258         
    125259        jwplayer.api.PlayerAPI = function(container) { 
     260                this.container = container; 
     261                this.id = container.id; 
     262                 
    126263                var _listeners = {}; 
    127264                var _stateListeners = {}; 
    128265                var _player = undefined; 
    129266                 
    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                }; 
    132279                 
    133280                this.stateListener = function(state, callback) { 
    134281                        if (!_stateListeners[state]) {  
    135282                                _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)); 
    137284                        }  
    138285                        _stateListeners[state].push(callback); 
     
    140287                }; 
    141288                 
    142                 this.stateCallback = function(state) { 
     289                function stateCallback(state) { 
    143290                        return function(newstate, oldstate) { 
    144291                                if (newstate == state) { 
     
    155302                }; 
    156303                 
     304                this.addInternalListener = function(player, type) { 
     305                        player.addEventListener(type, 'function(dat) { jwplayer("'+this.id+'").dispatchEvent("'+type+'", dat); }'); 
     306                }; 
     307                 
    157308                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                        } 
    159315                        _listeners[type].push(callback); 
    160316                        return this; 
     
    165321                                for (var l in _listeners[type]) { 
    166322                                        if (typeof _listeners[type][l] == 'function') { 
    167                                                 _listeners[type][l].apply(this, slice(arguments, 1)); 
     323                                                _listeners[type][l].call(this, arguments[1]); 
    168324                                        } 
    169325                                } 
     
    171327                }; 
    172328                 
    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 
    177357                /** Using this function instead of array.slice since Arguments are not an array **/ 
    178358                function slice(list, from, to) { 
     
    185365                        return ret; 
    186366                } 
     367                 
    187368        }; 
    188369 
     
    194375                 
    195376                // Player Getters 
    196                 getBuffer: function() { return undefined; }, 
    197                 getFullscreen: function() { return undefined; }, 
    198                 getLockState: function() { return undefined; }, 
    199                 getMeta: function() { return undefined; }, 
    200                 getMute: function() { return undefined; }, 
    201                 getPlaylist: function() { return undefined; }, 
    202                 getPlaylistItem: function() { return undefined; }, 
    203                 getHeight: function() { return undefined; }, 
    204                 getWidth: function() { return undefined; }, 
    205                 getState: function() { return undefined; }, 
    206                 getPosition: function() { return undefined; }, 
    207                 getDuration: function() { return undefined; }, 
    208                 getVolume: 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; }, 
    209390                 
    210391                // 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; }, 
    213394                lock: function() { return this; }, 
    214395                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;  
    223403                        return this;  
    224404                }, 
    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                        } 
    227416                        return this;  
    228417                }, 
    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                        } 
    231429                        return this;  
    232430                }, 
    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; }, 
    235434                 
    236435                // Player Events 
     
    256455 
    257456                // Player plugin API 
    258                 initializePlugin: function(pluginName, pluginCode) { return this; }, 
     457                initializePlugin: function(pluginName, pluginCode) { return this; } 
    259458        }; 
    260459         
     
    273472                 
    274473                if (_container) {   
    275                         var foundPlayer = jwplayer.api.playerByContainer(_container); 
     474                        var foundPlayer = jwplayer.api.playerById(_container.id); 
    276475                        if (foundPlayer) { 
    277476                                return foundPlayer;  
     
    287486        }; 
    288487         
    289         jwplayer.api.playerByContainer = function(cont) { 
     488        jwplayer.api.playerById = function(id) { 
    290489                for(var p in _players) { 
    291                         if (_players[p].container == cont) { 
     490                        if (_players[p].container.id == id) { 
    292491                                return _players[p]; 
    293492                        } 
     
    312511        }; 
    313512         
    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 
     515var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 
     516 
     517playerReady = 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) { 
    329526 
    330527        jwplayer.embed = function() {}; 
     
    334531                        players = {}, 
    335532                        config = undefined, 
    336                         api = undefined; 
    337                  
     533                        api = undefined;                 
    338534                this.constructor(playerApi); 
    339535        }; 
     
    342538                constructor: function(playerApi) { 
    343539                        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)); 
    345542                }, 
    346543         
     
    350547                                switch (player.type) { 
    351548                                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                                        } 
    353559                                        break; 
    354560                                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}); 
    357564                                        break; 
    358565                                } 
    359566                        } 
    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                        }; 
    361580                }, 
    362581                 
     
    394613                var height = params.height;  
    395614                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']; 
    396623                 
    397624                if (jwplayer.utils.isIE()) { 
     
    421648                        return obj; 
    422649                } 
     650                 
    423651        }; 
    424652         
    425653        jwplayer.embed.embedHTML5 = function(container, player, options) { 
    426654                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)); 
    429658                } else { 
    430659                        return null; 
     
    467696        jwplayer.api.PlayerAPI.prototype.setup = function(options, player) { 
    468697                this.config = options; 
    469                 if(player) { this.player = player; } 
    470698                jwplayer.register(this); 
    471699                return (new jwplayer.embed.Embedder(this)).embedPlayer(); 
  • trunk/js/src/api/jwplayer.api.js

    r1194 r1200  
    3535         
    3636        jwplayer.api.PlayerAPI = function(container) { 
     37                this.container = container; 
     38                this.id = container.id; 
     39                 
    3740                var _listeners = {}; 
    3841                var _stateListeners = {}; 
    3942                var _player = undefined; 
    4043                 
    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                }; 
    4356                 
    4457                this.stateListener = function(state, callback) { 
    4558                        if (!_stateListeners[state]) {  
    4659                                _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)); 
    4861                        }  
    4962                        _stateListeners[state].push(callback); 
     
    5164                }; 
    5265                 
    53                 this.stateCallback = function(state) { 
     66                function stateCallback(state) { 
    5467                        return function(newstate, oldstate) { 
    5568                                if (newstate == state) { 
     
    6679                }; 
    6780                 
     81                this.addInternalListener = function(player, type) { 
     82                        player.addEventListener(type, 'function(dat) { jwplayer("'+this.id+'").dispatchEvent("'+type+'", dat); }'); 
     83                }; 
     84                 
    6885                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                        } 
    7092                        _listeners[type].push(callback); 
    7193                        return this; 
     
    7698                                for (var l in _listeners[type]) { 
    7799                                        if (typeof _listeners[type][l] == 'function') { 
    78                                                 _listeners[type][l].apply(this, slice(arguments, 1)); 
     100                                                _listeners[type][l].call(this, arguments[1]); 
    79101                                        } 
    80102                                } 
     
    82104                }; 
    83105                 
    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 
    88134                /** Using this function instead of array.slice since Arguments are not an array **/ 
    89135                function slice(list, from, to) { 
     
    96142                        return ret; 
    97143                } 
     144                 
    98145        }; 
    99146 
     
    105152                 
    106153                // Player Getters 
    107                 getBuffer: function() { return undefined; }, 
    108                 getFullscreen: function() { return undefined; }, 
    109                 getLockState: function() { return undefined; }, 
    110                 getMeta: function() { return undefined; }, 
    111                 getMute: function() { return undefined; }, 
    112                 getPlaylist: function() { return undefined; }, 
    113                 getPlaylistItem: function() { return undefined; }, 
    114                 getHeight: function() { return undefined; }, 
    115                 getWidth: function() { return undefined; }, 
    116                 getState: function() { return undefined; }, 
    117                 getPosition: function() { return undefined; }, 
    118                 getDuration: function() { return undefined; }, 
    119                 getVolume: 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; }, 
    120167                 
    121168                // 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; }, 
    124171                lock: function() { return this; }, 
    125172                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;  
    134180                        return this;  
    135181                }, 
    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                        } 
    138193                        return this;  
    139194                }, 
    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                        } 
    142206                        return this;  
    143207                }, 
    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; }, 
    146211                 
    147212                // Player Events 
     
    184249                 
    185250                if (_container) {   
    186                         var foundPlayer = jwplayer.api.playerByContainer(_container); 
     251                        var foundPlayer = jwplayer.api.playerById(_container.id); 
    187252                        if (foundPlayer) { 
    188253                                return foundPlayer;  
     
    198263        }; 
    199264         
    200         jwplayer.api.playerByContainer = function(cont) { 
     265        jwplayer.api.playerById = function(id) { 
    201266                for(var p in _players) { 
    202                         if (_players[p].container == cont) { 
     267                        if (_players[p].container.id == id) { 
    203268                                return _players[p]; 
    204269                        } 
     
    223288        }; 
    224289         
    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 callbacks 
    232                 // Todo: run any queued up commands  
    233                  
    234                 if (_userPlayerReady) { 
    235                         _userPlayerReady.call(this, obj); 
    236                 }                
    237         }; 
    238          
    239290})(jwplayer); 
     291 
     292var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 
     293 
     294playerReady = 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  
    77                        players = {}, 
    88                        config = undefined, 
    9                         api = undefined; 
    10                  
     9                        api = undefined;                 
    1110                this.constructor(playerApi); 
    1211        }; 
     
    1514                constructor: function(playerApi) { 
    1615                        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)); 
    1818                }, 
    1919         
     
    2323                                switch (player.type) { 
    2424                                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                                        } 
    2635                                        break; 
    2736                                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}); 
    3040                                        break; 
    3141                                } 
    3242                        } 
    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                        }; 
    3456                }, 
    3557                 
     
    6890                delete params['height']; 
    6991                 
     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                 
    70100                if (jwplayer.utils.isIE()) { 
    71101                        var html = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' +  
     
    94124                        return obj; 
    95125                } 
     126                 
    96127        }; 
    97128         
    98129        jwplayer.embed.embedHTML5 = function(container, player, options) { 
    99130                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)); 
    102134                } else { 
    103135                        return null; 
     
    140172        jwplayer.api.PlayerAPI.prototype.setup = function(options, player) { 
    141173                this.config = options; 
    142                 if(player) { this.player = player; } 
    143174                jwplayer.register(this); 
    144175                return (new jwplayer.embed.Embedder(this)).embedPlayer(); 
  • trunk/js/src/utils/jwplayer.utils.js

    r1179 r1200  
    2121jwplayer.utils.extend = function() { 
    2222        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++){ 
    2525                        for (element in args[i]) { 
    26                                 args[i-1][element] = args[i][element]; 
     26                                args[0][element] = args[i][element]; 
    2727                        } 
    2828                } 
     
    4444        return (!+"\v1"); 
    4545}; 
     46 
     47/** 
     48 * Detects whether or not the current player has flash capabilities 
     49 */ 
     50jwplayer.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  
    2121}; 
    2222 
    23 jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className){ 
     23jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className, parent) { 
    2424        elements = []; 
    25         var selected = document.getElementsByTagName(tagName); 
     25        if (parent === undefined) { 
     26                parent = document; 
     27        } 
     28        var selected = parent.getElementsByTagName(tagName); 
    2629        for (var i = 0; i < selected.length; i++){ 
    2730                if (selected[i].className !== undefined){ 
Note: See TracChangeset for help on using the changeset viewer.