Changeset 1278


Ignore:
Timestamp:
09/16/10 03:02:08 (3 years ago)
Author:
zach
Message:

Merging in changes from branch

Location:
trunk/html5
Files:
4 deleted
12 edited
11 copied

Legend:

Unmodified
Added
Removed
  • trunk/html5/build/build.xml

    r1277 r1278  
    88 
    99        <target name="concat" depends="clean"> 
    10                 <concat destfile="${basedir}/jwplayer.html5.js"> 
     10                <concat destfile="${basedir}/bin-debug/jwplayer.html5.js"> 
    1111                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.js" /> 
     12                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.utils.js" /> 
    1213                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.states.js" /> 
    1314                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.events.js" /> 
    14                         <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.*.js" excludes="jwplayer.html5.js,jwplayer.html5.states.js,jwplayer.html5.events.js" /> 
     15                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.view.js" /> 
     16                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.*.js" excludes="jwplayer.html5.js,jwplayer.html5.states.js,jwplayer.html5.events.js,jwplayer.html5.utils.js,jwplayer.html5.api.js,jwplayer.html5.view.js" /> 
     17                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.api.js" /> 
    1518                </concat> 
    1619        </target> 
     
    2023        </target> 
    2124 
    22         <target name="build-release" depends="concat"> 
     25        <target name="build-release" depends="build-debug"> 
    2326                <java jar="${basedir}/build/yuicompressor-2.4.2.jar" fork="true"> 
    24                         <arg line="'${basedir}/jwplayer.html5.js'"/> 
     27                        <arg line="'${basedir}/bin-debug/jwplayer.html5.js'"/> 
    2528                        <arg line="-o '${basedir}/jwplayer.html5.min.js'"/> 
    2629                </java> 
    2730        </target> 
    2831         
    29         <target name="build-zip" depends="concat"> 
     32        <target name="build-zip" depends="build-release"> 
    3033                 <zip destfile="${basedir}/mediaplayer-html5.zip"> 
    3134                        <fileset dir="." includes="license.txt"/> 
  • trunk/html5/jwplayer.html5.xml

    r1277 r1278  
    2424                        <description>location of the poster image; shown before the video starts and after it has completed.</description> 
    2525                </flashvar> 
     26                <flashvar type="field">  
     27                        <name>start</name>  
     28                        <default>0</default>  
     29                        <description>position in seconds where playback has to start. Won't work for regular (progressive) videos, but only for streaming (HTTP/RTMP).</description>  
     30                </flashvar>  
    2631        </flashvars> 
    2732 
  • trunk/html5/src/html5/jwplayer.html5.api.js

    r1277 r1278  
    77(function(jwplayer) { 
    88 
    9         jwplayer.html5._api = function(player) { 
    10                 return { 
    11                         play: player._controller.play, 
    12                         pause: player._controller.pause, 
    13                         stop: player._controller.stop, 
    14                         seek: player._controller.seek, 
    15                          
    16                         resize: player._controller.resize, 
    17                         //fullscreen: player._controller.fullscreen, 
    18                         //volume: player._controller.volume, 
    19                         //mute: player._controller.mute, 
    20                         load: player._controller.load, 
    21                          
    22                         addEventListener: player._controller.addEventListener, 
    23                         removeEventListener: player._controller.removeEventListener, 
    24                         sendEvent: player._controller.sendEvent, 
    25                          
    26                         //ready: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_READY), 
    27                         //error: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_ERROR), 
    28                         //complete: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE), 
    29                         //state: _dataListenerFactory(player, 'state', jwplayer.html5.events.JWPLAYER_PLAYER_STATE), 
    30                         //buffer: _dataListenerFactory(player, 'buffer', jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER), 
    31                         //time: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_TIME), 
    32                         //meta: _dataListenerFactory(player, null, jwplayer.html5.events.JWPLAYER_MEDIA_META) 
    33                          
    34                         getPosition: _dataListenerFactory(player, 'position'), 
    35                         getDuration: _dataListenerFactory(player, 'duration'), 
    36                         getBuffer: _dataListenerFactory(player, 'buffer'), 
    37                         getWidth: _dataListenerFactory(player, 'width'), 
    38                         getHeight: _dataListenerFactory(player, 'height'), 
    39                         getFullscreen: _dataListenerFactory(player, 'buffer'), 
    40                         setFullscreen: player._controller.fullscreen, 
    41                         getVolume: _dataListenerFactory(player, 'volume'), 
    42                         setVolume: player._controller.volume, 
    43                         getMute: _dataListenerFactory(player, 'mute'), 
    44                         setMute: player._controller.mute, 
    45                          
    46                         getState: function(){ 
    47                                 return player._media.getState(); 
    48                         }, 
    49                          
    50                         getConfig: function(){ 
    51                                 return player._model.config; 
    52                         }, 
    53                         getVersion: function() { 
    54                                 return player.version; 
    55                         }, 
    56                         getPlaylist: function() { 
    57                                 return player._model.playlist; 
    58                         }, 
    59                         playlistItem: function(item) { 
    60                                 return player._controller.item(item); 
    61                         }, 
    62                         playlistNext: function() { 
    63                                 return player._controller.next(); 
    64                         }, 
    65                         playlistPrev: function() { 
    66                                 return player._controller.prev(); 
    67                         }, 
    68                          
    69                         //UNIMPLEMENTED 
    70                         getLevel: function() { 
    71                         }, 
    72                         getBandwidth: function() { 
    73                         }, 
    74                         getLockState: function() { 
    75                         }, 
    76                         lock: function() { 
    77                         }, 
    78                         unlock: function() { 
    79                         } 
    80                          
     9        jwplayer.html5.api = function(container, options) { 
     10                var _api = {}; 
     11                var _container = document.createElement('div'); 
     12                container.parentNode.replaceChild(_container, container); 
     13                _container.id = container.id; 
     14                 
     15                var _model = new jwplayer.html5.model(_api, _container, options); 
     16                var _view = new jwplayer.html5.view(_api, _container, _model); 
     17                var _controller = new jwplayer.html5.controller(_api, _container, _model, _view); 
     18                 
     19                _api.version = "1.0"; 
     20                _api.id = _container.id; 
     21                _api.skin = new jwplayer.html5.skin(); 
     22                 
     23                _api.jwPlay = _controller.play; 
     24                _api.jwPause = _controller.pause; 
     25                _api.jwStop = _controller.stop; 
     26                _api.jwSeek = _controller.seek; 
     27                _api.jwPlaylistItem = _controller.item; 
     28                _api.jwPlaylistNext = _controller.next; 
     29                _api.jwPlaylistPrev = _controller.prev; 
     30                _api.jwResize = _controller.resize; 
     31                _api.jwLoad = _controller.load; 
     32                 
     33                function _statevarFactory(statevar) { 
     34                        return function() { 
     35                                return _model[statevar]; 
     36                        }; 
     37                } 
     38                 
     39                _api.jwGetItem = _statevarFactory('item'); 
     40                _api.jwGetPosition = _statevarFactory('position'); 
     41                _api.jwGetDuration = _statevarFactory('duration'); 
     42                _api.jwGetBuffer = _statevarFactory('buffer'); 
     43                _api.jwGetWidth = _statevarFactory('width'); 
     44                _api.jwGetHeight = _statevarFactory('height'); 
     45                _api.jwGetFullscreen = _statevarFactory('fullscreen'); 
     46                _api.jwSetFullscreen = _controller.setFullscreen; 
     47                _api.jwGetVolume = _statevarFactory('volume'); 
     48                _api.jwSetVolume = _controller.setVolume; 
     49                _api.jwGetMute = _statevarFactory('mute'); 
     50                _api.jwSetMute = _controller.setMute; 
     51                 
     52                _api.jwGetState = _statevarFactory('state'); 
     53                _api.jwGetVersion = function() { 
     54                        return _api.version; 
    8155                }; 
     56                _api.jwGetPlaylist = function() { 
     57                        return _model.playlist; 
     58                }; 
     59                 
     60                _api.jwAddEventListener = _controller.addEventListener; 
     61                _api.jwRemoveEventListener = _controller.removeEventListener; 
     62                _api.jwSendEvent = _controller.sendEvent; 
     63                 
     64                //UNIMPLEMENTED 
     65                _api.jwGetLevel = function() { 
     66                }; 
     67                _api.jwGetBandwidth = function() { 
     68                }; 
     69                _api.jwGetLockState = function() { 
     70                }; 
     71                _api.jwLock = function() { 
     72                }; 
     73                _api.jwUnlock = function() { 
     74                }; 
     75                 
     76                function _finishLoad(model, view, controller) { 
     77                        return function() { 
     78                                model.loadPlaylist(model.config, false); 
     79                                model.setupPlugins(); 
     80                                view.setup(model.getMedia().getDisplayElement()); 
     81                                var evt = { 
     82                                        id: _api.id, 
     83                                        version: _api.version 
     84                                }; 
     85                                controller.sendEvent(jwplayer.api.events.JWPLAYER_READY, evt); 
     86                                if (playerReady !== undefined) { 
     87                                        playerReady(evt); 
     88                                } 
     89                                 
     90                                if (window[model.config.playerReady] !== undefined) { 
     91                                        window[model.config.playerReady](evt); 
     92                                } 
     93                                 
     94                                model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 
     95                                model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 
     96                                        "item": model.config.item 
     97                                }); 
     98                                 
     99                                if (model.config.autostart === true && !model.config.chromeless) { 
     100                                        controller.play(); 
     101                                } 
     102                        }; 
     103                } 
     104                 
     105                _api.skin.load(_model.config.skin, _finishLoad(_model, _view, _controller)); 
     106                 
     107                return _api; 
    82108        }; 
    83109         
    84         function _dataListenerFactory(player, dataType, eventType) { 
    85                 return function(arg) { 
    86                         switch (jwplayer.html5.utils.typeOf(arg)) { 
    87                                 case "function": 
    88                                         if (!jwplayer.html5.utils.isNull(eventType)) { 
    89                                                 player.addEventListener(eventType, arg); 
    90                                         } 
    91                                         break; 
    92                                 default: 
    93                                         if (!jwplayer.html5.utils.isNull(dataType)) { 
    94                                                 return player._controller.mediaInfo()[dataType]; 
    95                                         } 
    96                                         return player._controller.mediaInfo(); 
    97                         } 
    98                         return player; 
    99                 }; 
    100         } 
    101          
    102110})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.controlbar.js

    r1277 r1278  
    66 */ 
    77(function(jwplayer) { 
    8         var _positions = { 
    9                 BOTTOM: 'BOTTOM', 
    10                 TOP: 'TOP', 
    11                 OVER: 'OVER' 
     8        /** Map with config for the jwplayerControlbar plugin. **/ 
     9        var _defaults = { 
     10                backgroundcolor: "000000", 
     11                margin: 10, 
     12                //font: "_sans", 
     13                font: "Arial,sans-serif", 
     14                fontsize: 10, 
     15                fontcolor: "000000", 
     16                fontstyle: "normal", 
     17                //fontweight: "normal", 
     18                fontweight: "bold", 
     19                buttoncolor: "ffffff", 
     20                position: jwplayer.html5.view.positions.BOTTOM, 
     21                idlehide: false, 
     22                layout: { 
     23                        "left": { 
     24                                "position": "left", 
     25                                "elements": [{ 
     26                                        "name": "play", 
     27                                        "type": "button" 
     28                                }, { 
     29                                        "name": "divider", 
     30                                        "type": "divider" 
     31                                }, { 
     32                                        "name": "prev", 
     33                                        "type": "button" 
     34                                }, { 
     35                                        "name": "divider", 
     36                                        "type": "divider" 
     37                                }, { 
     38                                        "name": "next", 
     39                                        "type": "button" 
     40                                }, { 
     41                                        "name": "divider", 
     42                                        "type": "divider" 
     43                                }, { 
     44                                        "name": "elapsed", 
     45                                        "type": "text" 
     46                                }] 
     47                        }, 
     48                        "center": { 
     49                                "position": "center", 
     50                                "elements": [{ 
     51                                        "name": "time", 
     52                                        "type": "slider" 
     53                                }] 
     54                        }, 
     55                        "right": { 
     56                                "position": "right", 
     57                                "elements": [{ 
     58                                        "name": "duration", 
     59                                        "type": "text" 
     60                                }, { 
     61                                        "name": "divider", 
     62                                        "type": "divider" 
     63                                }, { 
     64                                        "name": "blank", 
     65                                        "type": "button" 
     66                                }, { 
     67                                        "name": "fullscreen", 
     68                                        "type": "button" 
     69                                }, { 
     70                                        "name": "divider", 
     71                                        "type": "divider" 
     72                                }, { 
     73                                        "name": "mute", 
     74                                        "type": "button" 
     75                                }, { 
     76                                        "name": "volume", 
     77                                        "type": "slider" 
     78                                }] 
     79                        } 
     80                } 
    1281        }; 
    1382         
     83        _css = jwplayer.html5.utils.css; 
    1484         
    15         /** Map with config for the jwplayerControlbar plugin. **/ 
    16         var _defaults = { 
    17                 fontsize: 10, 
    18                 fontcolor: '000000', 
    19                 position: _positions.BOTTOM, 
    20                 leftmargin: 0, 
    21                 rightmargin: 0, 
    22                 scrubber: 'none' 
     85        _hide = function(element) { 
     86                _css(element, { 
     87                        display: "none" 
     88                }); 
    2389        }; 
    2490         
    25         var _controlbar; 
    26          
    27         jwplayer.html5.controlbar = function(player) { 
    28                 _controlbar = $.extend({}, _defaults, player.skin.controlbar.settings); 
    29                 _buildElements(player); 
    30                 _buildHandlers(player); 
     91        _show = function(element) { 
     92                _css(element, { 
     93                        display: "block" 
     94                }); 
    3195        }; 
    3296         
    33         /** Draw the jwplayerControlbar elements. **/ 
    34         function _buildElements(player, domelement) { 
    35                 // Draw the background. 
    36                 player._model.domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 
    37                 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 
    38                 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 
    39                 switch (_controlbar.position) { 
    40                         case _positions.TOP: 
    41                                 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 
    42                                 break; 
    43                         default: 
    44                                 $("#" + player.id + '_jwplayerControlbar').css('top', player.getHeight()); 
    45                                 player._model.domelement.parents(":first").css('height', parseInt(player._model.domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 
    46                                 break; 
    47                 } 
    48                 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 
    49                 // Draw all elements on top of the bar. 
    50                 _buildElement('capLeft', 'left', true, player); 
    51                 _buildElement('playButton', 'left', false, player); 
    52                 _buildElement('pauseButton', 'left', true, player); 
    53                 _buildElement('divider1', 'left', true, player); 
    54                 _buildElement('prevButton', 'left', true, player); 
    55                 _buildElement('divider2', 'left', true, player); 
    56                 _buildElement('nextButton', 'left', true, player); 
    57                 _buildElement('divider3', 'left', true, player); 
    58                 _buildElement('elapsedText', 'left', true, player); 
    59                 _buildElement('timeSliderRail', 'left', false, player); 
    60                 _buildElement('timeSliderBuffer', 'left', false, player); 
    61                 _buildElement('timeSliderProgress', 'left', false, player); 
    62                 _buildElement('timeSliderThumb', 'left', false, player); 
    63                 _buildElement('capRight', 'right', true, player); 
    64                 // TODO 
    65                 if (false) { 
    66                         _buildElement('fullscreenButton', 'right', false, player); 
    67                         _buildElement('normalscreenButton', 'right', true, player); 
    68                         _buildElement('divider4', 'right', true, player); 
    69                 } 
    70                 _buildElement('volumeSliderRail', 'right', false, player); 
    71                 _buildElement('volumeSliderProgress', 'right', true, player); 
    72                 _buildElement('muteButton', 'right', false, player); 
    73                 _buildElement('unmuteButton', 'right', true, player); 
    74                 _buildElement('divider5', 'right', true, player); 
    75                 _buildElement('durationText', 'right', true, player); 
    76         } 
    77          
    78          
    79         /** Draw a single element into the jwplayerControlbar. **/ 
    80         function _buildElement(element, align, offset, player) { 
    81                 var nam = player.id + '_' + element; 
    82                 $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 
    83                 $('#' + nam).css('position', 'absolute'); 
    84                 $('#' + nam).css('top', '0px'); 
    85                 if (element.indexOf('Text') > 0) { 
    86                         $('#' + nam).html('00:00'); 
    87                         $('#' + nam).css('font', _controlbar.fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 
    88                         $('#' + nam).css('text-align', 'center'); 
    89                         $('#' + nam).css('font-weight', 'bold'); 
    90                         $('#' + nam).css('cursor', 'default'); 
    91                         var wid = 14 + 3 * _controlbar.fontsize; 
    92                         $('#' + nam).css('color', '#' + _controlbar.fontcolor.substr(-6)); 
    93                 } else if (element.indexOf('divider') === 0) { 
    94                         $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 
    95                         var wid = player.skin.controlbar.elements.divider.width; 
    96                 } else { 
    97                         $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 
    98                         var wid = player.skin.controlbar.elements[element].width; 
    99                 } 
    100                 if (align == 'left') { 
    101                         $('#' + nam).css(align, _controlbar.leftmargin); 
    102                         if (offset) { 
    103                                 _controlbar.leftmargin += wid; 
    104                         } 
    105                 } else if (align == 'right') { 
    106                         $('#' + nam).css(align, _controlbar.rightmargin); 
    107                         if (offset) { 
    108                                 _controlbar.rightmargin += wid; 
    109                         } 
    110                 } 
    111                 $('#' + nam).css('width', wid); 
    112                 $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 
    113         } 
    114          
    115          
    116         /** Add interactivity to the jwplayerControlbar elements. **/ 
    117         function _buildHandlers(player) { 
    118                 // Register events with the buttons. 
    119                 _buildHandler('playButton', 'play', player); 
    120                 _buildHandler('pauseButton', 'pause', player); 
    121                 _buildHandler('prevButton', 'playlistPrev', player); 
    122                 _buildHandler('nextButton', 'playlistNext', player); 
    123                 _buildHandler('muteButton', 'setMute', player, true); 
    124                 _buildHandler('unmuteButton', 'setMute', player, false); 
    125                 _buildHandler('fullscreenButton', 'setFullscreen', player, true); 
    126                 _buildHandler('normalscreenButton', 'setFullscreen', player, false); 
    127                  
    128                 _addSliders(player); 
    129                  
    130                 // Register events with the player. 
    131                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 
    132                 player.addEventListener(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, _stateHandler); 
    133                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, _timeHandler); 
    134                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 
    135                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 
    136                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 
    137                  
    138                 // Trigger a few events so the bar looks good on startup. 
    139                 _resizeHandler({ 
    140                         id: player.id, 
    141                         fulscreen: player.getFullscreen(), 
    142                         width: player.getWidth(), 
    143                         height: player.getHeight() 
    144                 }); 
    145                 _timeHandler({ 
    146                         id: player.id, 
    147                         duration: player.getDuration(), 
    148                         position: 0 
    149                 }); 
    150                 _bufferHandler({ 
    151                         id: player.id, 
    152                         bufferProgress: 0 
    153                 }); 
    154                 _muteHandler({ 
    155                         id: player.id, 
    156                         mute: player.getMute() 
    157                 }); 
    158                 _stateHandler({ 
    159                         id: player.id, 
    160                         newstate: jwplayer.html5.states.IDLE 
    161                 }); 
    162                 _volumeHandler({ 
    163                         id: player.id, 
    164                         volume: player.getVolume() 
    165                 }); 
    166         } 
    167          
    168          
    169         /** Set a single button handler. **/ 
    170         function _buildHandler(element, handler, player, args) { 
    171                 var nam = player.id + '_' + element; 
    172                 $('#' + nam).css('cursor', 'pointer'); 
    173                 if (handler == 'fullscreen') { 
    174                         $('#' + nam).mouseup(function(evt) { 
     97        jwplayer.html5.controlbar = function(api, config) { 
     98                var _api = api; 
     99                var _settings = jwplayer.utils.extend({}, _defaults, _api.skin.getComponentSettings("controlbar"), config); 
     100                if (jwplayer.html5.utils.mapLength(_api.skin.getComponentLayout("controlbar")) > 0) { 
     101                        _settings.layout = _api.skin.getComponentLayout("controlbar"); 
     102                } 
     103                var _wrapper; 
     104                var _dividerid = 0; 
     105                var _marginleft = 0; 
     106                var _marginright = 0; 
     107                var _scrubber = "none"; 
     108                var _mousedown; 
     109                var _currentPosition; 
     110                var _currentDuration; 
     111                var _currentBuffer; 
     112                var _width; 
     113                var _height; 
     114                var _prevElement; 
     115                var _elements = {}; 
     116                var _ready = false; 
     117                var _fadeOutTimeout; 
     118                 
     119                 
     120                function _buildBase() { 
     121                        var wrappercss = { 
     122                                height: _api.skin.getSkinElement("controlbar", "background").height, 
     123                                backgroundColor: "#" + _settings.backgroundcolor 
     124                        }; 
     125                         
     126                        _wrapper = document.createElement("div"); 
     127                        _wrapper.id = _api.id + "_jwplayer_controlbar"; 
     128                        _css(_wrapper, wrappercss); 
     129                         
     130                        _addElement("capLeft", "left", false, _wrapper); 
     131                        var domelmentcss = { 
     132                                position: "absolute", 
     133                                height: _api.skin.getSkinElement("controlbar", "background").height, 
     134                                background: " url(" + _api.skin.getSkinElement("controlbar", "background").src + ") repeat-x center left", 
     135                                left: _api.skin.getSkinElement("controlbar", "capLeft").width 
     136                        }; 
     137                        _appendNewElement("elements", _wrapper, domelmentcss); 
     138                        _addElement("capRight", "right", false, _wrapper); 
     139                } 
     140                 
     141                this.getDisplayElement = function() { 
     142                        return _wrapper; 
     143                }; 
     144                 
     145                this.resize = function(width, height) { 
     146                        if (!_ready && _wrapper.parentElement !== undefined) { 
     147                                _ready = true; 
     148                                if (_settings.position == jwplayer.html5.view.positions.OVER.toLowerCase()){ 
     149                                        document.getElementById(_api.id).onmousemove = _fadeOut; 
     150                                } 
     151                        } 
     152                        _width = width; 
     153                        _height = height; 
     154                        if (_api.jwGetFullscreen()) { 
     155                                _show(_elements.normalscreenButton); 
     156                                _hide(_elements.fullscreenButton); 
     157                        } else { 
     158                                _hide(_elements.normalscreenButton); 
     159                                _show(_elements.fullscreenButton); 
     160                        } 
     161                        var style = _resizeBar(); 
     162                        _timeHandler({ 
     163                                id: _api.id, 
     164                                duration: _currentDuration, 
     165                                position: _currentPosition 
     166                        }); 
     167                        _bufferHandler({ 
     168                                id: _api.id, 
     169                                bufferPercent: _currentBuffer 
     170                        }); 
     171                        return style; 
     172                }; 
     173                 
     174                function _fadeOut() { 
     175                        _wrapper.style.opacity = 1; 
     176                        if (_fadeOutTimeout !== undefined) { 
     177                                clearTimeout(_fadeOutTimeout); 
     178                        } 
     179                        _fadeOutTimeout = setTimeout(function() { 
     180                                jwplayer.html5.utils.fadeTo(_wrapper, 0, 0.1, 1); 
     181                                _fadeOutTimeout = undefined; 
     182                        }, 2000); 
     183                } 
     184                 
     185                function _fadeIn(){ 
     186                        _wrapper.style.opacity = 1; 
     187                } 
     188                 
     189                function _appendNewElement(id, parent, css) { 
     190                        var element = document.createElement("div"); 
     191                        _elements[id] = element; 
     192                        element.id = _wrapper.id + "_" + id; 
     193                        parent.appendChild(element); 
     194                        if (css !== undefined) { 
     195                                _css(element, css); 
     196                        } 
     197                        return element; 
     198                } 
     199                 
     200                /** Draw the jwplayerControlbar elements. **/ 
     201                function _buildElements() { 
     202                        _buildGroup(_settings.layout.left); 
     203                        _buildGroup(_settings.layout.right, -1); 
     204                        _buildGroup(_settings.layout.center); 
     205                } 
     206                 
     207                /** Layout a group of elements**/ 
     208                function _buildGroup(group, order) { 
     209                        var alignment = group.position == "right" ? "right" : "left"; 
     210                        var elements = jwplayer.utils.extend([], group.elements); 
     211                        if (order !== undefined) { 
     212                                elements.reverse(); 
     213                        } 
     214                        for (var i = 0; i < elements.length; i++) { 
     215                                _buildElement(elements[i], alignment); 
     216                        } 
     217                } 
     218                 
     219                function getNewDivivderId() { 
     220                        return _dividerid++; 
     221                } 
     222                 
     223                /** Draw a single element into the jwplayerControlbar. **/ 
     224                function _buildElement(element, alignment) { 
     225                        switch (element.name) { 
     226                                case "play": 
     227                                        _addElement("playButton", alignment, false); 
     228                                        _addElement("pauseButton", alignment, true); 
     229                                        _buildHandler("playButton", "jwPlay"); 
     230                                        _buildHandler("pauseButton", "jwPause"); 
     231                                        break; 
     232                                case "divider": 
     233                                        _addElement("divider" + getNewDivivderId(), alignment, true); 
     234                                        break; 
     235                                case "prev": 
     236                                        if (_api.jwGetPlaylist().length > 1) { 
     237                                                _addElement("prevButton", alignment, true); 
     238                                                _buildHandler("prevButton", "jwPlaylistPrev"); 
     239                                        } 
     240                                        break; 
     241                                case "next": 
     242                                        if (_api.jwGetPlaylist().length > 1) { 
     243                                                _addElement("nextButton", alignment, true); 
     244                                                _buildHandler("nextButton", "jwPlaylistNext"); 
     245                                        } 
     246                                        break; 
     247                                case "elapsed": 
     248                                        _addElement("elapsedText", alignment, true); 
     249                                        break; 
     250                                case "time": 
     251                                        var offsetLeft = _api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 
     252                                        var offsetRight = _api.skin.getSkinElement("controlbar", "timeSliderCapRight") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapRight").width; 
     253                                        var offset = alignment == "left" ? offsetLeft : offsetRight; 
     254                                        var width = _api.skin.getSkinElement("controlbar", "timeSliderRail").width + offsetLeft + offsetRight; 
     255                                        var slidercss = { 
     256                                                height: _api.skin.getSkinElement("controlbar", "background").height, 
     257                                                position: "absolute", 
     258                                                top: 0, 
     259                                                width: width 
     260                                        }; 
     261                                        slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 
     262                                        var _timeslider = _appendNewElement("timeSlider", _elements.elements, slidercss); 
     263                                        _addElement("timeSliderCapLeft", alignment, true, _timeslider, alignment == "left" ? 0 : offset); 
     264                                        _addElement("timeSliderRail", alignment, false, _timeslider, offset); 
     265                                        _addElement("timeSliderBuffer", alignment, false, _timeslider, offset); 
     266                                        _addElement("timeSliderProgress", alignment, false, _timeslider, offset); 
     267                                        _addElement("timeSliderThumb", alignment, false, _timeslider, offset); 
     268                                        _addElement("timeSliderCapRight", alignment, true, _timeslider, alignment == "right" ? 0 : offset); 
     269                                        _addSliderListener("time"); 
     270                                        break; 
     271                                case "fullscreen": 
     272                                        _addElement("fullscreenButton", alignment, false); 
     273                                        _addElement("normalscreenButton", alignment, true); 
     274                                        _buildHandler("fullscreenButton", "jwSetFullscreen", true); 
     275                                        _buildHandler("normalscreenButton", "jwSetFullscreen", false); 
     276                                        break; 
     277                                case "volume": 
     278                                        var offsetLeft = _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 
     279                                        var offsetRight = _api.skin.getSkinElement("controlbar", "volumeSliderCapRight") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapRight").width; 
     280                                        var offset = alignment == "left" ? offsetLeft : offsetRight; 
     281                                        var width = _api.skin.getSkinElement("controlbar", "volumeSliderRail").width + offsetLeft + offsetRight; 
     282                                        var slidercss = { 
     283                                                height: _api.skin.getSkinElement("controlbar", "background").height, 
     284                                                position: "absolute", 
     285                                                top: 0, 
     286                                                width: width 
     287                                        }; 
     288                                        slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 
     289                                        var _volumeslider = _appendNewElement("volumeSlider", _elements.elements, slidercss); 
     290                                        _addElement("volumeSliderCapLeft", alignment, true, _volumeslider, alignment == "left" ? 0 : offset); 
     291                                        _addElement("volumeSliderRail", alignment, true, _volumeslider, offset); 
     292                                        _addElement("volumeSliderProgress", alignment, false, _volumeslider, offset); 
     293                                        _addElement("volumeSliderCapRight", alignment, true, _volumeslider, alignment == "right" ? 0 : offset); 
     294                                        _addSliderListener("volume"); 
     295                                        break; 
     296                                case "mute": 
     297                                        _addElement("muteButton", alignment, false); 
     298                                        _addElement("unmuteButton", alignment, true); 
     299                                        _buildHandler("muteButton", "jwSetMute", true); 
     300                                        _buildHandler("unmuteButton", "jwSetMute", false); 
     301                                         
     302                                        break; 
     303                                case "duration": 
     304                                        _addElement("durationText", alignment, true); 
     305                                        break; 
     306                        } 
     307                } 
     308                 
     309                function _addElement(element, alignment, offset, parent, position) { 
     310                        if ((_api.skin.getSkinElement("controlbar", element) !== undefined || element.indexOf("Text") > 0 || element.indexOf("divider") === 0) && !(element.indexOf("divider") === 0 && _prevElement.indexOf("divider") === 0)) { 
     311                                _prevElement = element; 
     312                                var css = { 
     313                                        height: _api.skin.getSkinElement("controlbar", "background").height, 
     314                                        position: "absolute", 
     315                                        top: 0 
     316                                }; 
     317                                var wid; 
     318                                if (element.indexOf("Text") > 0) { 
     319                                        element.innerhtml = "00:00"; 
     320                                        css.font = _settings.fontsize + "px/" + (_api.skin.getSkinElement("controlbar", "background").height + 1) + "px " + _settings.font; 
     321                                        css.color = _settings.fontcolor; 
     322                                        css.textAlign = "center"; 
     323                                        css.fontWeight = _settings.fontweight; 
     324                                        css.fontStyle = _settings.fontstyle; 
     325                                        css.cursor = "default"; 
     326                                        wid = 14 + 3 * _settings.fontsize; 
     327                                        css.color = "#" + _settings.fontcolor.substr(-6); 
     328                                } else if (element.indexOf("divider") === 0) { 
     329                                        css.background = "url(" + _api.skin.getSkinElement("controlbar", "divider").src + ") repeat-x center left"; 
     330                                        wid = _api.skin.getSkinElement("controlbar", "divider").width; 
     331                                } else { 
     332                                        css.background = "url(" + _api.skin.getSkinElement("controlbar", element).src + ") repeat-x center left"; 
     333                                        wid = _api.skin.getSkinElement("controlbar", element).width; 
     334                                } 
     335                                if (alignment == "left") { 
     336                                        css.left = position === undefined ? _marginleft : position; 
     337                                        if (offset) { 
     338                                                _marginleft += wid; 
     339                                        } 
     340                                } else if (alignment == "right") { 
     341                                        css.right = position === undefined ? _marginright : position; 
     342                                        if (offset) { 
     343                                                _marginright += wid; 
     344                                        } 
     345                                } 
     346                                 
     347                                if (parent === undefined) { 
     348                                        parent = _elements.elements; 
     349                                } 
     350                                 
     351                                css.width = wid; 
     352                                 
     353                                var newelement = _appendNewElement(element, parent, css); 
     354                                if (_api.skin.getSkinElement("controlbar", element + "Over") !== undefined) { 
     355                                        newelement.onmouseover = function(evt) { 
     356                                                evt.stopPropagation(); 
     357                                                newelement.style["background-image"] = ["url(", _api.skin.getSkinElement("controlbar", element + "Over").src, ")"].join(""); 
     358                                        }; 
     359                                        newelement.onmouseout = function(evt) { 
     360                                                evt.stopPropagation(); 
     361                                                newelement.style["background-image"] = ["url(", _api.skin.getSkinElement("controlbar", element).src, ")"].join(""); 
     362                                        }; 
     363                                } 
     364                                 
     365                        } 
     366                } 
     367                 
     368                function _addListeners() { 
     369                        // Register events with the player. 
     370                        //_api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, _playlistHandler); 
     371                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 
     372                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 
     373                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, _timeHandler); 
     374                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 
     375                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 
     376                        _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 
     377                } 
     378                 
     379                /** Add interactivity to the jwplayerControlbar elements. **/ 
     380                function _init() { 
     381                        // Trigger a few events so the bar looks good on startup. 
     382                        _timeHandler({ 
     383                                id: _api.id, 
     384                                duration: _api.jwGetDuration(), 
     385                                position: 0 
     386                        }); 
     387                        _bufferHandler({ 
     388                                id: _api.id, 
     389                                bufferProgress: 0 
     390                        }); 
     391                        _muteHandler({ 
     392                                id: _api.id, 
     393                                mute: _api.jwGetMute() 
     394                        }); 
     395                        _stateHandler({ 
     396                                id: _api.id, 
     397                                newstate: jwplayer.api.events.state.IDLE 
     398                        }); 
     399                        _volumeHandler({ 
     400                                id: _api.id, 
     401                                volume: _api.jwGetVolume() 
     402                        }); 
     403                } 
     404                 
     405                 
     406                /** Set a single button handler. **/ 
     407                function _buildHandler(element, handler, args) { 
     408                        if (_api.skin.getSkinElement("controlbar", element) !== undefined) { 
     409                                var _element = _elements[element]; 
     410                                if (_element !== null) { 
     411                                        _css(_element, { 
     412                                                cursor: "pointer" 
     413                                        }); 
     414                                        if (handler == "fullscreen") { 
     415                                                _element.onmouseup = function(evt) { 
     416                                                        evt.stopPropagation(); 
     417                                                        _api.jwSetFullscreen(!_api.jwGetFullscreen()); 
     418                                                }; 
     419                                        } else { 
     420                                                _element.onmouseup = function(evt) { 
     421                                                        evt.stopPropagation(); 
     422                                                        if (args !== null) { 
     423                                                                _api[handler](args); 
     424                                                        } else { 
     425                                                                _api[handler](); 
     426                                                        } 
     427                                                         
     428                                                }; 
     429                                        } 
     430                                } 
     431                        } 
     432                } 
     433                 
     434                /** Set the volume drag handler. **/ 
     435                function _addSliderListener(name) { 
     436                        var bar = _elements[name + "Slider"]; 
     437                        _css(_elements.elements, { 
     438                                "cursor": "pointer" 
     439                        }); 
     440                        _css(bar, { 
     441                                "cursor": "pointer" 
     442                        }); 
     443                        bar.onmousedown = function(evt) { 
     444                                _scrubber = name; 
     445                        }; 
     446                        bar.onmouseup = function(evt) { 
    175447                                evt.stopPropagation(); 
    176                                 player.setFullscreen(!player.getFullscreen()); 
    177                                 _resizeHandler({ 
    178                                         id: player.id, 
    179                                         fullscreen: player.getFullscreen(), 
    180                                         width: player.getWidth(), 
    181                                         height: player.getHeight() 
     448                                _sliderUp(evt.pageX); 
     449                        }; 
     450                        bar.onmousemove = function(evt) { 
     451                                if (_scrubber == "time") { 
     452                                        _mousedown = true; 
     453                                        var xps = evt.pageX - bar.getBoundingClientRect().left - window.pageXOffset; 
     454                                        _css(_elements.timeSliderThumb, { 
     455                                                left: xps 
     456                                        }); 
     457                                } 
     458                        }; 
     459                } 
     460                 
     461                 
     462                /** The slider has been moved up. **/ 
     463                function _sliderUp(msx) { 
     464                        _mousedown = false; 
     465                        var railRect, xps; 
     466                        if (_scrubber == "time") { 
     467                                railRect = _elements.timeSliderRail.getBoundingClientRect(); 
     468                                xps = msx - railRect.left + window.pageXOffset; 
     469                                var pos = xps / railRect.width * _currentDuration; 
     470                                if (pos < 0) { 
     471                                        pos = 0; 
     472                                } else if (pos > _currentDuration) { 
     473                                        pos = _currentDuration - 3; 
     474                                } 
     475                                _api.jwSeek(pos); 
     476                                if (_api.jwGetState() != jwplayer.api.events.state.PLAYING) { 
     477                                        _api.jwPlay(); 
     478                                } 
     479                        } else if (_scrubber == "volume") { 
     480                                railRect = _elements.volumeSliderRail.getBoundingClientRect(); 
     481                                xps = msx - railRect.left - window.pageXOffset; 
     482                                var pct = Math.round(xps / railRect.width * 100); 
     483                                if (pct < 0) { 
     484                                        pct = 0; 
     485                                } else if (pct > 100) { 
     486                                        pct = 100; 
     487                                } 
     488                                if (_api.jwGetMute()) { 
     489                                        _api.jwSetMute(false); 
     490                                } 
     491                                _api.jwSetVolume(pct); 
     492                        } 
     493                        _scrubber = "none"; 
     494                } 
     495                 
     496                 
     497                /** Update the buffer percentage. **/ 
     498                function _bufferHandler(event) { 
     499                        if (event.bufferPercent !== null) { 
     500                                _currentBuffer = event.bufferPercent; 
     501                        } 
     502                        var wid = _elements.timeSliderRail.getBoundingClientRect().width; 
     503                        var bufferWidth = isNaN(Math.round(wid * _currentBuffer / 100)) ? 0 : Math.round(wid * _currentBuffer / 100); 
     504                        _css(_elements.timeSliderBuffer, { 
     505                                width: bufferWidth 
     506                        }); 
     507                } 
     508                 
     509                 
     510                /** Update the mute state. **/ 
     511                function _muteHandler(event) { 
     512                        if (event.mute) { 
     513                                _hide(_elements.muteButton); 
     514                                _show(_elements.unmuteButton); 
     515                                _hide(_elements.volumeSliderProgress); 
     516                        } else { 
     517                                _show(_elements.muteButton); 
     518                                _hide(_elements.unmuteButton); 
     519                                _show(_elements.volumeSliderProgress); 
     520                        } 
     521                } 
     522                 
     523                 
     524                /** Update the playback state. **/ 
     525                function _stateHandler(event) { 
     526                        // Handle the play / pause button 
     527                        if (event.newstate == jwplayer.api.events.state.BUFFERING || event.newstate == jwplayer.api.events.state.PLAYING) { 
     528                                _show(_elements.pauseButton); 
     529                                _hide(_elements.playButton); 
     530                        } else { 
     531                                _hide(_elements.pauseButton); 
     532                                _show(_elements.playButton); 
     533                        } 
     534                         
     535                        // Show / hide progress bar 
     536                        if (event.newstate == jwplayer.api.events.state.IDLE) { 
     537                                if (!_settings.idlehide && _settings.position == jwplayer.html5.view.positions.OVER){ 
     538                                        _fadeIn(); 
     539                                } 
     540                                _hide(_elements.timeSliderBuffer); 
     541                                _hide(_elements.timeSliderProgress); 
     542                                _hide(_elements.timeSliderThumb); 
     543                        } else { 
     544                                _show(_elements.timeSliderBuffer); 
     545                                if (event.newstate != jwplayer.api.events.state.BUFFERING) { 
     546                                        _show(_elements.timeSliderProgress); 
     547                                        _show(_elements.timeSliderThumb); 
     548                                } 
     549                        } 
     550                } 
     551                 
     552                 
     553                /** Handles event completion **/ 
     554                function _completeHandler(event) { 
     555                        _timeHandler(jwplayer.utils.extend(event, { 
     556                                position: 0, 
     557                                duration: _currentDuration 
     558                        })); 
     559                } 
     560                 
     561                 
     562                /** Update the playback time. **/ 
     563                function _timeHandler(event) { 
     564                        if (event.position !== null) { 
     565                                _currentPosition = event.position; 
     566                        } 
     567                        if (event.duration !== null) { 
     568                                _currentDuration = event.duration; 
     569                        } 
     570                        var progress = (_currentPosition === _currentDuration === 0) ? 0 : _currentPosition / _currentDuration; 
     571                        var railRect = _elements.timeSliderRail.getBoundingClientRect(); 
     572                        var progressWidth = isNaN(Math.round(railRect.width * progress)) ? 0 : Math.round(railRect.width * progress); 
     573                        var thumbPosition = progressWidth; 
     574                         
     575                        _elements.timeSliderProgress.style.width = progressWidth + "px"; 
     576                        if (!_mousedown) { 
     577                                if (_elements.timeSliderThumb) { 
     578                                        _elements.timeSliderThumb.style.left = thumbPosition + "px"; 
     579                                } 
     580                        } 
     581                        if (_elements.durationText) { 
     582                                _elements.durationText.innerHTML = _timeFormat(_currentDuration); 
     583                        } 
     584                        if (_elements.elapsedText) { 
     585                                _elements.elapsedText.innerHTML = _timeFormat(_currentPosition); 
     586                        } 
     587                } 
     588                 
     589                 
     590                /** Format the elapsed / remaining text. **/ 
     591                function _timeFormat(sec) { 
     592                        str = "00:00"; 
     593                        if (sec > 0) { 
     594                                str = Math.floor(sec / 60) < 10 ? "0" + Math.floor(sec / 60) + ":" : Math.floor(sec / 60) + ":"; 
     595                                str += Math.floor(sec % 60) < 10 ? "0" + Math.floor(sec % 60) : Math.floor(sec % 60); 
     596                        } 
     597                        return str; 
     598                } 
     599                 
     600                 
     601                /** Resize the jwplayerControlbar. **/ 
     602                function _resizeBar() { 
     603                        var controlbarcss = { 
     604                                width: _width 
     605                        }; 
     606                        var elementcss = {}; 
     607                        if (_settings.position.toUpperCase() == jwplayer.html5.view.positions.OVER || _api.jwGetFullscreen()) { 
     608                                controlbarcss.left = _settings.margin; 
     609                                controlbarcss.width -= 2 * _settings.margin; 
     610                                controlbarcss.top = _height - _api.skin.getSkinElement("controlbar", "background").height - _settings.margin; 
     611                                controlbarcss.height = _api.skin.getSkinElement("controlbar", "background").height; 
     612                        } else { 
     613                                controlbarcss.left = 0; 
     614                        } 
     615                         
     616                        elementcss.left = _api.skin.getSkinElement("controlbar", "capLeft").width; 
     617                        elementcss.width = controlbarcss.width - _api.skin.getSkinElement("controlbar", "capLeft").width - _api.skin.getSkinElement("controlbar", "capRight").width; 
     618                         
     619                        var timeSliderLeft = _api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 
     620                        _css(_elements.timeSliderRail, { 
     621                                width: (elementcss.width - _marginleft - _marginright), 
     622                                left: timeSliderLeft 
     623                        }); 
     624                        if (_elements.timeSliderCapRight !== null) { 
     625                                _css(_elements.timeSliderCapRight, { 
     626                                        left: timeSliderLeft + (elementcss.width - _marginleft - _marginright) 
    182627                                }); 
    183                         }); 
    184                 } else { 
    185                         $('#' + nam).mouseup(function(evt) { 
    186                                 evt.stopPropagation(); 
    187                                 if (!jwplayer.html5.utils.isNull(args)) { 
    188                                         player[handler](args); 
    189                                 } else { 
    190                                         player[handler](); 
    191                                 } 
     628                        } 
     629                        //_css(_wrapper, controlbarcss); 
     630                        _css(_elements.elements, elementcss); 
     631                        return controlbarcss; 
     632                } 
     633                 
     634                 
     635                /** Update the volume level. **/ 
     636                function _volumeHandler(event) { 
     637                        if (_elements.volumeSliderRail !== null) { 
     638                                var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 
     639                                var width = parseInt(_elements.volumeSliderRail.style.width.replace("px", ""), 10); 
     640                                var progressWidth = isNaN(Math.round(width * progress)) ? 0 : Math.round(width * progress); 
     641                                var offset = parseInt(_elements.volumeSliderRail.style.right.replace("px", ""), 10); 
    192642                                 
    193                         }); 
    194                 } 
    195         } 
    196          
    197          
    198         /** Set the volume drag handler. **/ 
    199         function _addSliders(player) { 
    200                 var bar = '#' + player.id + '_jwplayerControlbar'; 
    201                 var trl = '#' + player.id + '_timeSliderRail'; 
    202                 var vrl = '#' + player.id + '_volumeSliderRail'; 
    203                 $(bar).css('cursor', 'pointer'); 
    204                 $(trl).css('cursor', 'pointer'); 
    205                 $(vrl).css('cursor', 'pointer'); 
    206                 $(bar).mousedown(function(evt) { 
    207                         if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 
    208                                 _controlbar.scrubber = 'time'; 
    209                         } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 
    210                                 _controlbar.scrubber = 'volume'; 
    211                         } 
    212                 }); 
    213                 $(bar).mouseup(function(evt) { 
    214                         evt.stopPropagation(); 
    215                         _sliderUp(evt.pageX, player); 
    216                 }); 
    217                 $(bar).mousemove(function(evt) { 
    218                         if (_controlbar.scrubber == 'time') { 
    219                                 _controlbar.mousedown = true; 
    220                                 var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 
    221                                 $('#' + player.id + '_timeSliderThumb').css('left', xps); 
    222                         } 
    223                 }); 
    224         } 
    225          
    226          
    227         /** The slider has been moved up. **/ 
    228         function _sliderUp(msx, player) { 
    229                 _controlbar.mousedown = false; 
    230                 if (_controlbar.scrubber == 'time') { 
    231                         var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 
    232                         var wid = $('#' + player.id + '_timeSliderRail').width(); 
    233                         var pos = xps / wid * _controlbar.currentDuration; 
    234                         if (pos < 0) { 
    235                                 pos = 0; 
    236                         } else if (pos > _controlbar.currentDuration) { 
    237                                 pos = _controlbar.currentDuration - 3; 
    238                         } 
    239                         player.seek(pos); 
    240                         if (player.getState() != jwplayer.html5.states.PLAYING) { 
    241                                 player.play(); 
    242                         } 
    243                 } else if (_controlbar.scrubber == 'volume') { 
    244                         var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 
    245                         var wid = $('#' + player.id + '_volumeSliderRail').width(); 
    246                         var pct = Math.round(xps / wid * 100); 
    247                         if (pct < 0) { 
    248                                 pct = 0; 
    249                         } else if (pct > 100) { 
    250                                 pct = 100; 
    251                         } 
    252                         if (player._model.mute) { 
    253                                 player.setMute(false); 
    254                         } 
    255                         player.setVolume(pct); 
    256                 } 
    257                 _controlbar.scrubber = 'none'; 
    258         } 
    259          
    260          
    261         /** Update the buffer percentage. **/ 
    262         function _bufferHandler(event) { 
    263                 if (!jwplayer.html5.utils.isNull(event.bufferPercent)) { 
    264                         _controlbar.currentBuffer = event.bufferPercent; 
    265                 } 
    266                  
    267                 var wid = $('#' + event.id + '_timeSliderRail').width(); 
    268                 var bufferWidth = isNaN(Math.round(wid * _controlbar.currentBuffer / 100)) ? 0 : Math.round(wid * _controlbar.currentBuffer / 100); 
    269                 $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 
    270         } 
    271          
    272          
    273         /** Update the mute state. **/ 
    274         function _muteHandler(event) { 
    275                 if (event.mute) { 
    276                         $('#' + event.id + '_muteButton').css('display', 'none'); 
    277                         $('#' + event.id + '_unmuteButton').css('display', 'block'); 
    278                         $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 
    279                 } else { 
    280                         $('#' + event.id + '_muteButton').css('display', 'block'); 
    281                         $('#' + event.id + '_unmuteButton').css('display', 'none'); 
    282                         $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 
    283                 } 
    284         } 
    285          
    286          
    287         /** Update the playback state. **/ 
    288         function _stateHandler(event) { 
    289                 // Handle the play / pause button 
    290                 if (event.newstate == jwplayer.html5.states.BUFFERING || event.newstate == jwplayer.html5.states.PLAYING) { 
    291                         $('#' + event.id + '_pauseButton').css('display', 'block'); 
    292                         $('#' + event.id + '_playButton').css('display', 'none'); 
    293                 } else { 
    294                         $('#' + event.id + '_pauseButton').css('display', 'none'); 
    295                         $('#' + event.id + '_playButton').css('display', 'block'); 
    296                 } 
    297                  
    298                 // Show / hide progress bar 
    299                 if (event.newstate == jwplayer.html5.states.IDLE) { 
    300                         $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 
    301                         $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 
    302                         $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 
    303                 } else { 
    304                         $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 
    305                         if (event.newstate != jwplayer.html5.states.BUFFERING) { 
    306                                 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 
    307                                 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 
    308                         } 
    309                 } 
    310         } 
    311          
    312          
    313         /** Handles event completion **/ 
    314         function _completeHandler(event) { 
    315                 _timeHandler($.extend(event, { 
    316                         position: 0, 
    317                         duration: _controlbar.currentDuration 
    318                 })); 
    319         } 
    320          
    321          
    322         /** Update the playback time. **/ 
    323         function _timeHandler(event) { 
    324                 if (!jwplayer.html5.utils.isNull(event.position)) { 
    325                         _controlbar.currentPosition = event.position; 
    326                 } 
    327                 if (!jwplayer.html5.utils.isNull(event.duration)) { 
    328                         _controlbar.currentDuration = event.duration; 
    329                 } 
    330                 var progress = (_controlbar.currentPosition === _controlbar.currentDuration === 0) ? 0 : _controlbar.currentPosition / _controlbar.currentDuration; 
    331                 var railWidth = $('#' + event.id + '_timeSliderRail').width(); 
    332                 var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 
    333                 var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 
    334                 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
    335                 var thumbPosition = railLeft + progressWidth; 
    336                  
    337                 $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 
    338                 if (!_controlbar.mousedown) { 
    339                         $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 
    340                 } 
    341                  
    342                 $('#' + event.id + '_durationText').html(_timeFormat(_controlbar.currentDuration)); 
    343                 $('#' + event.id + '_elapsedText').html(_timeFormat(_controlbar.currentPosition)); 
    344         } 
    345          
    346          
    347         /** Format the elapsed / remaining text. **/ 
    348         function _timeFormat(sec) { 
    349                 str = '00:00'; 
    350                 if (sec > 0) { 
    351                         str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 
    352                         str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 
    353                 } 
    354                 return str; 
    355         } 
    356          
    357          
    358         /** Flip the player size to/from full-browser-screen. **/ 
    359         function _resizeHandler(event) { 
    360                 _controlbar.width = event.width; 
    361                 _controlbar.fullscreen = event.fullscreen; 
    362                 if (event.fullscreen) { 
    363                         $('#' + event.id + '_normalscreenButton').css('display', 'block'); 
    364                         $('#' + event.id + '_fullscreenButton').css('display', 'none'); 
    365                         // TODO 
    366                         if (false) { 
    367                                 $(window).resize(function() { 
    368                                         _resizeBar(player); 
     643                                var volumeSliderLeft = _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : _api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 
     644                                _css(_elements.volumeSliderProgress, { 
     645                                        width: progressWidth, 
     646                                        left: volumeSliderLeft 
    369647                                }); 
    370                         } 
    371                 } else { 
    372                         $('#' + event.id + '_normalscreenButton').css('display', 'none'); 
    373                         $('#' + event.id + '_fullscreenButton').css('display', 'block'); 
    374                         // TODO 
    375                         if (false) { 
    376                                 $(window).resize(null); 
    377                         } 
    378                 } 
    379                 _resizeBar(event); 
    380                 _timeHandler(event); 
    381                 _bufferHandler(event); 
    382         } 
    383          
    384          
    385         /** Resize the jwplayerControlbar. **/ 
    386         function _resizeBar(event) { 
    387                 var lft = _controlbar.left; 
    388                 var top = _controlbar.top; 
    389                 var wid = _controlbar.width; 
    390                 var hei = $('#' + event.id + '_jwplayerControlbar').height(); 
    391                 if (_controlbar.position == 'over') { 
    392                         lft += 1 * _controlbar.margin; 
    393                         top -= 1 * _controlbar.margin + hei; 
    394                         wid -= 2 * _controlbar.margin; 
    395                 } 
    396                 if (_controlbar.fullscreen) { 
    397                         lft = _controlbar.margin; 
    398                         top = $(window).height() - _controlbar.margin - hei; 
    399                         wid = $(window).width() - 2 * _controlbar.margin; 
    400                         $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 
    401                 } else { 
    402                         $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 
    403                 } 
    404                 $('#' + event.id + '_jwplayerControlbar').css('left', lft); 
    405                 $('#' + event.id + '_jwplayerControlbar').css('top', top); 
    406                 $('#' + event.id + '_jwplayerControlbar').css('width', wid); 
    407                 $('#' + event.id + '_timeSliderRail').css('width', (wid - _controlbar.leftmargin - _controlbar.rightmargin)); 
    408         } 
    409          
    410          
    411         /** Update the volume level. **/ 
    412         function _volumeHandler(event) { 
    413                 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 
    414                 var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 
    415                 var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 
    416                 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
    417                  
    418                 $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 
    419                 $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 
    420         } 
    421          
     648                                 
     649                                if (_elements.volumeSliderCapLeft !== undefined) { 
     650                                        _css(_elements.volumeSliderCapLeft, { 
     651                                                left: 0 
     652                                        }); 
     653                                } 
     654                        } 
     655                } 
     656                 
     657                function _setup() { 
     658                        _buildBase(); 
     659                        _buildElements(); 
     660                        _addListeners(); 
     661                        _init(); 
     662                        _wrapper.style.opacity = _settings.idlehide ? 0 : 1; 
     663                } 
     664                 
     665                _setup(); 
     666                return this; 
     667        }; 
    422668})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.controller.js

    r1277 r1278  
    77(function(jwplayer) { 
    88 
    9         jwplayer.html5.controller = function(player) { 
    10                 return { 
    11                         play: _play(player), 
    12                         pause: _pause(player), 
    13                         seek: _seek(player), 
    14                         stop: _stop(player), 
    15                         prev: _prev(player), 
    16                         next: _next(player), 
    17                         item: _item(player), 
    18                         volume: _volume(player), 
    19                         mute: _mute(player), 
    20                         resize: _resize(player), 
    21                         fullscreen: _fullscreen(player), 
    22                         load: _load(player), 
    23                         mediaInfo: _mediaInfo(player), 
    24                         addEventListener: _addEventListener(player), 
    25                         removeEventListener: _removeEventListener(player), 
    26                         sendEvent: _sendEvent(player) 
    27                 }; 
    28         }; 
     9        var _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 
    2910         
    30         _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 
    31          
    32         function _play(player) { 
    33                 return function() { 
    34                         try { 
    35                                 switch (player.getState()) { 
    36                                         case jwplayer.html5.states.IDLE: 
    37                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, player._media.play); 
    38                                                 player._media.load(player._model.playlist[player._model.item]); 
    39                                                 break; 
    40                                         case jwplayer.html5.states.PAUSED: 
    41                                                 player._media.play(); 
    42                                                 break; 
    43                                 } 
    44                                  
    45                                 return player; 
    46                         } catch (err) { 
    47                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    48                         } 
    49                         return false; 
    50                 }; 
    51         } 
    52          
    53          
    54         /** Switch the pause state of the player. **/ 
    55         function _pause(player) { 
    56                 return function() { 
    57                         try { 
    58                                 switch (player.getState()) { 
    59                                         case jwplayer.html5.states.PLAYING: 
    60                                         case jwplayer.html5.states.BUFFERING: 
    61                                                 player._media.pause(); 
    62                                                 break; 
    63                                 } 
    64                                 return player; 
    65                         } catch (err) { 
    66                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    67                         } 
    68                         return false; 
    69                 }; 
    70         } 
    71          
    72          
    73         /** Seek to a position in the video. **/ 
    74         function _seek(player) { 
    75                 return function(position) { 
    76                         try { 
    77                                 switch (player.getState()) { 
    78                                         case jwplayer.html5.states.PLAYING: 
    79                                         case jwplayer.html5.states.PAUSED: 
    80                                         case jwplayer.html5.states.BUFFERING: 
    81                                                 player._media.seek(position); 
    82                                                 break; 
    83                                 } 
    84                                 return player; 
    85                         } catch (err) { 
    86                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    87                         } 
    88                         return false; 
    89                 }; 
    90         } 
    91          
    92          
    93         /** Stop playback and loading of the video. **/ 
    94         function _stop(player) { 
    95                 return function() { 
    96                         try { 
    97                                 player._media.stop(); 
    98                                 return player; 
    99                         } catch (err) { 
    100                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    101                         } 
    102                         return false; 
    103                 }; 
    104         } 
    105          
    106         /** Stop playback and loading of the video. **/ 
    107         function _next(player) { 
    108                 return function() { 
    109                         try { 
    110                                 if (player._model.item + 1 == player._model.playlist.length){ 
    111                                         return player.playlistItem(0); 
    112                                 } else { 
    113                                         return player.playlistItem(player._model.item + 1); 
    114                                 } 
    115                         } catch (err) { 
    116                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    117                         } 
    118                         return false; 
    119                 }; 
    120         } 
    121          
    122                 /** Stop playback and loading of the video. **/ 
    123         function _prev(player) { 
    124                 return function() { 
    125                         try { 
    126                                 if (player._model.item === 0){ 
    127                                         return player.playlistItem(player._model.playlist.length - 1); 
    128                                 } else { 
    129                                         return player.playlistItem(player._model.item - 1); 
    130                                 } 
    131                         } catch (err) { 
    132                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    133                         } 
    134                         return false; 
    135                 }; 
    136         } 
    137          
    138         /** Stop playback and loading of the video. **/ 
    139         function _item(player) { 
    140                 return function(item) { 
    141                         try { 
    142                                 var oldstate = player.getState(); 
    143                                 player.stop(); 
    144                                 player._model.item = item; 
    145                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYLIST_ITEM, {"item":item}); 
    146                                 if (oldstate == jwplayer.html5.states.PLAYING || oldstate == jwplayer.html5.states.BUFFERING){ 
    147                                         player.play(); 
    148                                 } 
    149                                 return player; 
    150                         } catch (err) { 
    151                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    152                         } 
    153                         return false; 
    154                 }; 
    155         }        
    156         /** Get / set the video's volume level. **/ 
    157         function _volume(player) { 
    158                 return function(arg) { 
    159                         try { 
    160                                 switch (jwplayer.html5.utils.typeOf(arg)) { 
    161                                         case "function": 
    162                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, arg); 
    163                                                 break; 
     11        jwplayer.html5.controller = function(api, container, model, view) { 
     12                var _api = api; 
     13                var _model = model; 
     14                var _view = view; 
     15                var _container = container; 
     16                var _itemUpdated = true; 
     17                 
     18                var debug = (_model.config.debug !== undefined) && (_model.config.debug.toString().toLowerCase() == 'console'); 
     19                var _eventDispatcher = new jwplayer.html5.eventdispatcher(_container.id, debug); 
     20                jwplayer.utils.extend(this, _eventDispatcher); 
     21                 
     22                function forward(evt) { 
     23                        _eventDispatcher.sendEvent(evt.type, evt); 
     24                } 
     25                 
     26                _model.addGlobalListener(forward); 
     27                 
     28                function _play() { 
     29                        try { 
     30                                if (_model.playlist[0].levels[0].file.length > 0) { 
     31                                        switch (_model.state) { 
     32                                                case jwplayer.api.events.state.IDLE: 
     33                                                        if (_itemUpdated) { 
     34                                                                _model.setActiveMediaProvider(_model.playlist[_model.item]); 
     35                                                                _model.addEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, _model.getMedia().play); 
     36                                                                _model.getMedia().load(_model.playlist[_model.item]); 
     37                                                                _itemUpdated = false; 
     38                                                        } else { 
     39                                                                _model.getMedia().play(); 
     40                                                        } 
     41                                                        break; 
     42                                                case jwplayer.api.events.state.PAUSED: 
     43                                                        _model.getMedia().play(); 
     44                                                        break; 
     45                                        } 
     46                                } 
     47                                return true; 
     48                        } catch (err) { 
     49                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     50                        } 
     51                        return false; 
     52                } 
     53                 
     54                 
     55                /** Switch the pause state of the player. **/ 
     56                function _pause() { 
     57                        try { 
     58                                if (_model.playlist[0].levels[0].file.length > 0) { 
     59                                        switch (_model.state) { 
     60                                                case jwplayer.api.events.state.PLAYING: 
     61                                                case jwplayer.api.events.state.BUFFERING: 
     62                                                        _model.getMedia().pause(); 
     63                                                        break; 
     64                                        } 
     65                                } 
     66                                return true; 
     67                        } catch (err) { 
     68                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     69                        } 
     70                        return false; 
     71                } 
     72                 
     73                 
     74                /** Seek to a position in the video. **/ 
     75                function _seek(position) { 
     76                        try { 
     77                                if (_model.playlist[0].levels[0].file.length > 0) { 
     78                                        switch (_model.state) { 
     79                                                case jwplayer.api.events.state.PLAYING: 
     80                                                case jwplayer.api.events.state.PAUSED: 
     81                                                case jwplayer.api.events.state.BUFFERING: 
     82                                                        _model.getMedia().seek(position); 
     83                                                        break; 
     84                                        } 
     85                                } 
     86                                return true; 
     87                        } catch (err) { 
     88                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     89                        } 
     90                        return false; 
     91                } 
     92                 
     93                 
     94                /** Stop playback and loading of the video. **/ 
     95                function _stop() { 
     96                        try { 
     97                                if (_model.playlist[0].levels[0].file.length > 0) { 
     98                                        _model.getMedia().stop(); 
     99                                } 
     100                                return true; 
     101                        } catch (err) { 
     102                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     103                        } 
     104                        return false; 
     105                } 
     106                 
     107                /** Stop playback and loading of the video. **/ 
     108                function _next() { 
     109                        try { 
     110                                if (_model.playlist[0].levels[0].file.length > 0) { 
     111                                        if (_model.item + 1 == _model.playlist.length) { 
     112                                                return _item(0); 
     113                                        } else { 
     114                                                return _item(_model.item + 1); 
     115                                        } 
     116                                } 
     117                                return true; 
     118                        } catch (err) { 
     119                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     120                        } 
     121                        return false; 
     122                } 
     123                 
     124                /** Stop playback and loading of the video. **/ 
     125                function _prev() { 
     126                        try { 
     127                                if (_model.playlist[0].levels[0].file.length > 0) { 
     128                                        if (_model.item === 0) { 
     129                                                return _item(_model.playlist.length - 1); 
     130                                        } else { 
     131                                                return _item(_model.item - 1); 
     132                                        } 
     133                                } 
     134                                return true; 
     135                        } catch (err) { 
     136                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     137                        } 
     138                        return false; 
     139                } 
     140                 
     141                /** Stop playback and loading of the video. **/ 
     142                function _item(item) { 
     143                        try { 
     144                                if (_model.playlist[0].levels[0].file.length > 0) { 
     145                                        var oldstate = _model.state; 
     146                                        _stop(); 
     147                                        _model.item = item; 
     148                                        _itemUpdated = true; 
     149                                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 
     150                                                "item": item 
     151                                        }); 
     152                                        if (oldstate == jwplayer.api.events.state.PLAYING || oldstate == jwplayer.api.events.state.BUFFERING) { 
     153                                                _play(); 
     154                                        } 
     155                                } 
     156                                return true; 
     157                        } catch (err) { 
     158                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     159                        } 
     160                        return false; 
     161                } 
     162                 
     163                /** Get / set the video's volume level. **/ 
     164                function _setVolume(volume) { 
     165                        try { 
     166                                switch (typeof(volume)) { 
    164167                                        case "number": 
    165                                                 player._media.volume(arg); 
    166                                                 return true; 
    167                                         case "string": 
    168                                                 player._media.volume(parseInt(arg, 10)); 
    169                                                 return true; 
    170                                         default: 
    171                                                 return player._model.volume; 
    172                                 } 
    173                                 return player; 
    174                         } catch (err) { 
    175                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    176                         } 
    177                         return false; 
    178                 }; 
    179         } 
    180          
    181          
    182         /** Get / set the mute state of the player. **/ 
    183         function _mute(player) { 
    184                 return function(arg) { 
    185                         try { 
    186                                 switch (jwplayer.html5.utils.typeOf(arg)) { 
    187                                         case "function": 
    188                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, arg); 
    189                                                 break; 
    190                                         case "boolean": 
    191                                                 player._media.mute(arg); 
    192                                                 break; 
    193                                         default: 
    194                                                 return player._model.mute; 
    195                                 } 
    196                                 return player; 
    197                         } catch (err) { 
    198                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    199                         } 
    200                         return false; 
    201                 }; 
    202         } 
    203          
    204          
    205         /** Resizes the video **/ 
    206         function _resize(player) { 
    207                 return function(arg1, arg2) { 
    208                         try { 
    209                                 switch (jwplayer.html5.utils.typeOf(arg1)) { 
    210                                         case "function": 
    211                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_RESIZE, arg1); 
    212                                                 break; 
    213                                         case "number": 
    214                                                 player._media.resize(arg1, arg2); 
     168                                                _model.getMedia().volume(volume); 
    215169                                                break; 
    216170                                        case "string": 
    217                                                 player._media.resize(arg1, arg2); 
     171                                                _model.getMedia().volume(parseInt(volume, 10)); 
    218172                                                break; 
    219                                         default: 
    220                                                 break; 
    221                                 } 
    222                                 return player; 
    223                         } catch (err) { 
    224                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    225                         } 
    226                         return false; 
    227                 }; 
    228         } 
    229          
    230          
    231         /** Jumping the player to/from fullscreen. **/ 
    232         function _fullscreen(player) { 
    233                 return function(arg) { 
    234                         try { 
    235                                 switch (jwplayer.html5.utils.typeOf(arg)) { 
    236                                         case "function": 
    237                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_FULLSCREEN, arg); 
    238                                                 break; 
    239                                         case "boolean": 
    240                                                 player._media.fullscreen(arg); 
    241                                                 break; 
    242                                         default: 
    243                                                 return player._model.fullscreen; 
    244                                 } 
    245                                 return player; 
    246                         } catch (err) { 
    247                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    248                         } 
    249                         return false; 
    250                 }; 
    251         } 
    252          
    253          
    254         /** Loads a new video **/ 
    255         function _load(player) { 
    256                 return function(arg) { 
    257                         try { 
    258                                 switch (jwplayer.html5.utils.typeOf(arg)) { 
    259                                         case "function": 
    260                                                 player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_LOADED, arg); 
    261                                                 break; 
    262                                         default: 
    263                                                 player._media.load(arg); 
    264                                                 break; 
    265                                 } 
    266                                 return player; 
    267                         } catch (err) { 
    268                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
    269                         } 
    270                         return false; 
    271                 }; 
    272         } 
    273          
    274          
    275         /** Returns the meta **/ 
    276         function _mediaInfo(player) { 
    277                 return function() { 
    278                         try { 
    279                                 var result = {}; 
    280                                 for (var index in _mediainfovariables) { 
    281                                         var mediavar = _mediainfovariables[index]; 
    282                                         result[mediavar] = player._model[mediavar]; 
    283                                 } 
    284                                 return result; 
    285                         } catch (err) { 
    286                                 jwplayer.html5.utils.log("error", err); 
    287                         } 
    288                         return false; 
    289                 }; 
    290         } 
    291          
    292          
    293         /** Add an event listener. **/ 
    294         function _addEventListener(player) { 
    295                 return function(type, listener, count) { 
    296                         try { 
    297                                 if (player._listeners[type] === undefined) { 
    298                                         player._listeners[type] = []; 
    299                                 } 
    300                                 player._listeners[type].push({ 
    301                                         listener: listener, 
    302                                         count: count 
    303                                 }); 
    304                         } catch (err) { 
    305                                 jwplayer.html5.utils.log("error", err); 
    306                         } 
    307                         return false; 
    308                 }; 
    309         } 
    310          
    311          
    312         /** Remove an event listener. **/ 
    313         function _removeEventListener(player) { 
    314                 return function(type, listener) { 
    315                         try { 
    316                                 for (var lisenterIndex in player._listeners[type]) { 
    317                                         if (player._listeners[type][lisenterIndex] == listener) { 
    318                                                 player._listeners[type].slice(lisenterIndex, lisenterIndex + 1); 
    319                                                 break; 
    320                                         } 
    321                                 } 
    322                         } catch (err) { 
    323                                 jwplayer.html5.utils.log("error", err); 
    324                         } 
    325                         return false; 
    326                 }; 
    327         } 
    328          
    329          
    330         /** Send an event **/ 
    331         function _sendEvent(player) { 
    332                 return function(type, data) { 
    333                         data = $.extend({ 
    334                                 id: player.id, 
    335                                 version: player.version 
    336                         }, data); 
    337                         if ((player._model.config.debug !== undefined) && (player._model.config.debug.toString().toLowerCase() == 'console')) { 
    338                                 jwplayer.html5.utils.log(type, data); 
    339                         } 
    340                         for (var listenerIndex in player._listeners[type]) { 
    341                                 try { 
    342                                         player._listeners[type][listenerIndex].listener(data); 
    343                                 } catch (err) { 
    344                                         jwplayer.html5.utils.log("There was an error while handling a listener", err); 
    345                                 } 
    346                                 if (player._listeners[type][listenerIndex].count === 1) { 
    347                                         delete player._listeners[type][listenerIndex]; 
    348                                 } else if (player._listeners[type][listenerIndex].count > 0) { 
    349                                         player._listeners[type][listenerIndex].count = player._listeners[type][listenerIndex].count - 1; 
    350                                 } 
    351                         } 
    352                 }; 
    353         } 
    354          
     173                                } 
     174                                return true; 
     175                        } catch (err) { 
     176                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     177                        } 
     178                        return false; 
     179                } 
     180                 
     181                 
     182                /** Get / set the mute state of the player. **/ 
     183                function _setMute(state) { 
     184                        try { 
     185                                _model.getMedia().mute(state); 
     186                                return true; 
     187                        } catch (err) { 
     188                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     189                        } 
     190                        return false; 
     191                } 
     192                 
     193                 
     194                /** Resizes the video **/ 
     195                function _resize(width, height) { 
     196                        try { 
     197                                _model.width = width; 
     198                                _model.height = height; 
     199                                _view.resize(width, height); 
     200                                return true; 
     201                        } catch (err) { 
     202                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     203                        } 
     204                        return false; 
     205                } 
     206                 
     207                 
     208                /** Jumping the player to/from fullscreen. **/ 
     209                function _setFullscreen(state) { 
     210                        try { 
     211                                _model.fullscreen = state; 
     212                                _view.fullscreen(state); 
     213                                return true; 
     214                        } catch (err) { 
     215                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     216                        } 
     217                        return false; 
     218                } 
     219                 
     220                 
     221                /** Loads a new video **/ 
     222                function _load(arg) { 
     223                        try { 
     224                                _model.loadPlaylist(arg); 
     225                                _itemUpdated = true; 
     226                                return true; 
     227                        } catch (err) { 
     228                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 
     229                        } 
     230                        return false; 
     231                } 
     232                 
     233                this.play = _play; 
     234                this.pause = _pause; 
     235                this.seek = _seek; 
     236                this.stop = _stop; 
     237                this.next = _next; 
     238                this.prev = _prev; 
     239                this.item = _item; 
     240                this.setVolume = _setVolume; 
     241                this.setMute = _setMute; 
     242                this.resize = _resize; 
     243                this.setFullscreen = _setFullscreen; 
     244                this.load = _load; 
     245        }; 
    355246})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.defaultskin.js

    r1277 r1278  
    66 */ 
    77(function(jwplayer) { 
    8  
    9         jwplayer.html5.defaultSkin = '<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.0"><settings><setting name="backcolor" value="0xFFFFFF"/><setting name="frontcolor" value="0x000000"/><setting name="lightcolor" value="0x000000"/><setting name="screencolor" value="0x000000"/></settings><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/></settings><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFJJREFUeNrslLENwAAIwxLU/09j5AiOgD5hVQzNAVY8JK4qEfHMIKBnd2+BQlBINaiRtL/aV2rdzYBsM6CIONbI1NZENTr3RwdB2PlnJgJ6BRgA4hwu5Qg5iswAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhJREFUeNpiYqABYBo1dNRQ+hr6H4jvA3E8NS39j4SpZvh/LJig4YxEGEqy3kET+w+AOGFQRhTJhrEQkGcczfujhg4CQwECDADpTRWU/B3wHQAAAABJRU5ErkJggg=="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiYBgFo2DwA0YC8v/R1P4nRu+ooaOGUtnQUTAKhgIACDAAFCwQCfAJ4gwAAAAASUVORK5CYII="/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtJREFUeNpiYBgFo2Dog/9QDAPyQHweTYwiQ/2B+D0Wi8g2tB+JTdBQRiIMJVkvEy0iglhDF9Aq9uOpHVEwoE+NJDUKRsFgAAABBgDe2hqZcNNL0AAAAABJRU5ErkJggg=="/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUeNpiYBgFo2Dog/9AfB6I5dHE/lNqKAi/B2J/ahsKw/3EGMpIhKEk66WJoaR6fz61IyqemhEFSlL61ExSo2AUDAYAEGAAiG4hj+5t7M8AAAAASUVORK5CYII="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxJREFUeNpiYBgFo2AU0Bwwzluw+D8tLWARFhKiqQ9YuLg4aWsBGxs7bS1gZ6e5BWyjSX0UjIKhDgACDABlYQOGh5pYywAAAABJRU5ErkJggg=="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFo2AU0Bww1jc0/aelBSz8/Pw09QELOzs7bS1gY2OjrQWsrKy09gHraFIfBaNgqAOAAAMAvy0DChXHsZMAAAAASUVORK5CYII="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAClJREFUeNpiYBgFo2AU0BwwAvF/WlrARGsfjFow8BaMglEwCugAAAIMAOHfAQunR+XzAAAAAElFTkSuQmCC"/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAICAYAAAA870V8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABZJREFUeNpiZICA/yCCiQEJUJcDEGAAY0gBD1/m7Q0AAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiYBgFIw3MB+L/5Gj8j6yRiRTFyICJXHfTXyMLAXlGati4YDRFDj8AEGAABk8GSqqS4CoAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFgxz8p7bm+cQa+h8LHy7GhEcjIz4bmAjYykiun/8j0fakGPIfTfPgiSr6aB4FVAcAAQYAWdwR1G1Wd2gAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGpJREFUeNpi/P//PwM9ABMDncCoRYPfIqqDZcuW1UPp/6AUDcNM1DQYKtRAlaAj1mCSLSLXYIIWUctgDItoZfDA5aOoqKhGEANIM9LVR7SymGDQUctikuOIXkFNdhHEOFrDjlpEd4sAAgwAriRMub95fu8AAAAASUVORK5CYII="/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi/P//PwM9ABMDncCoRYPfIlqAeij9H5SiYZiqBqPTlFqE02BKLSLaYFItIttgQhZRzWB8FjENiuRJ7aAbsMQwYMl7wDIsWUUQ42gNO2oR3S0CCDAAKhKq6MLLn8oAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5JREFUeNpiYBgFo2DQA0YC8v/xqP1PjDlMRDrEgUgxkgHIlfZoriVGjmzLsLFHAW2D6D8eA/9Tw7L/BAwgJE90PvhPpNgoGAVDEQAEGAAMdhTyXcPKcAAAAABJRU5ErkJggg=="/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNpiYBgFo2DIg/9UUkOUAf8JiFFsyX88fJyAkcQgYMQjNkzBoAgiezyRbE+tFGSPxQJ7auYBmma0UTAKBhgABBgAJAEY6zON61sAAAAASUVORK5CYII="/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEpJREFUeNrszwENADAIA7DhX8ENoBMZ5KR10EryckCJiIiIiIiIiIiIiIiIiIiIiIh8GmkRERERERERERERERERERERERGRHSPAAPlXH1phYpYaAAAAAElFTkSuQmCC"/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNrs18ENgjAYhmFouDOCcQJGcARHgE10BDcgTOIosAGwQOuPwaQeuFRi2p/3Sb6EC5L3QCxZBgAAAOCorLW1zMn65TrlkH4NcV7QNcUQt7Gn7KIhxA+qNIR81spOGkL8oFJDyLJRdosqKDDkK+iX5+d7huzwM40xptMQMkjIOeRGo+VkEVvIPfTGIpKASfYIfT9iCHkHrBEzf4gcUQ56aEzuGK/mw0rHpy4AAACAf3kJMACBxjAQNRckhwAAAABJRU5ErkJggg=="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNrs1jEOgCAMBVAg7t5/8qaoIy4uoobyXsLCxA+0NCUAAADGUWvdQoQ41x4ixNBB2hBvBskdD3w5ZCkl3+33VqI0kjBBlh9rp+uTcyOP33TnolfsU85XX3yIRpQph8ZQY3wTZtU5AACASA4BBgDHoVuY1/fvOQAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWlJREFUeNrsl+1twjAQhsHq/7BBYQLYIBmBDcoGMAIjtBPQTcII2SDtBDBBwrU6pGsUO7YbO470PtKJkz9iH++d4ywWAAAAAABgljRNsyWr2bZzDuJG1rLdZhcMbTjrBCGDyUKsqQLFciJb9bSvuG/WagRVRUVUI6gqy5HVeKWfSgRyJruKIU//TrZTSn2nmlaXThrloi/v9F2STC1W4+Aw5cBzkquRc09bofFNc6YLxEON0VUZS5FPTftO49vMjRsIF3RhOGr7/D/pJw+FKU+q0vDyq8W42jCunDqI3LC5XxNj2wHLU1XjaRnb0Lhykhqhhd8MtSF5J9tbjCv4mXGvKJz/65FF/qJryyaaIvzP2QRxZTX2nTuXjvV/VPFSwyLnW7mpH99yTh1FEVro6JBSd40/pMrRdV8vPtcKl28T2pT8TnFZ4yNosct3Q0io6JfBiz1FlGdqVQH3VHnepAEAAAAAADDzEGAAcTwB10jWgxcAAAAASUVORK5CYII="/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAuhJREFUeNrsWr9rU1EUznuNGqvFQh1ULOhiBx0KDtIuioO4pJuik3FxFfUPaAV1FTdx0Q5d2g4FFxehTnEpZHFoBy20tCIWtGq0TZP4HfkeHB5N8m6Sl/sa74XDybvv3vvOd8/Pe4lXrVZT3dD8VJc0B8QBcUAcEAfESktHGeR5XtMfqFQq/f92zPe/NbtGlKTdCY30kuxrpMGO94BlQCXs+rbh3ONgA6BlzP1p20d80gEI5hmA2A92Qua1Q2PtAFISM+bvjMG8U+Q7oA3rQGASwrYCU6WpNdLGYbA+Pq5jjXIiwi8EEa2UDbQSaKOIuV+SlkcCrfjY8XTI9EpKGwP0C2kru2hLtHqa4zoXtZRWyvi4CLwv9Opr6Hkn6A9HKgEANsQ1iqC3Ub/vRUk2JgmRkatK36kVrnt0qObunwUdUUMXMWYpakJsO5Am8tAw2GBIgwWA+G2S2dMpiw0gDioQRQJoKhRb1QiDwlHZUABYbaXWsm5ae6loTE4ZDxN4CZar8foVzOJ2iyZ2kWF3t7YIevffaMT5yJ70kQb2fQ1sE5SHr2wazs2wgMxgbsEKEAgxAvZUJbQLBGTSBMgNrncJbA6AljtS/eKDJ0Ez+DmrQEzXS2h1Ck25kAg0IZcUOaydCy4sYnN2fOA+2AP16gNoHALlQ+fwH7XO4CxLenUpgj4xr6ugY2roPMbMx+Xs18m/E8CVEIhxsNeg83XWOAN6grG3lGbk8uE5fr4B/WH3cJw+co/l9nTYsSGYCJ/lY5/qv0thn6nrIWmjeJcPSnWOeY++AkF8tpJHIMAUs/MaBBpj3znZfQo5psY+ZrG4gv5HickjEOymKjEeRpgyST6IuZcTcWbnjcgdPi5ghxciRKsl1lDSsgwA1i8fssonJgzmTSqfGUkCENndNdAL7PS6QQ7ZYISTo+1qq0LEWjTWcvY4isa4z+yfQB+7ooyHVg5RI7/i1Ijn/vnggDggDogD4oC00P4KMACd/juEHOrS4AAAAABJRU5ErkJggg=="/></elements></component><component name="dock"><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFBJREFUeNrs0cEJACAQA8Eofu0fu/W6EM5ZSAFDRpKTBs00CQQEBAQEBAQEBAQEBAQEBATkK8iqbY+AgICAgICAgICAgICAgICAgIC86QowAG5PAQzEJ0lKAAAAAElFTkSuQmCC"/></elements></component><component name="playlist"><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNrs2NEJwCAMBcBYuv/CFuIE9VN47WWCR7iocXR3pdWdGPqqwIoMjYfQeAiNh9B4JHc6MHQVHnjggQceeOCBBx77TifyeOY0iHi8DqIdEY8dD5cL094eePzINB5CO/LwcOTptNB4CP25L4TIbZzpU7UEGAA5wz1uF5rF9AAAAABJRU5ErkJggg=="/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNrsy6ENACAMAMHClp2wYxZLAg5Fcu9e3OjuOKqqfTMzbs14CIZhGIZhGIZhGP4VLwEGAK/BBnVFpB0oAAAAAElFTkSuQmCC"/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNrsy7ENACAMBLE8++8caFFKKiRffU53112SGs3ttOohGIZhGIZhGIZh+Fe8BRgAiaUGde6NOSEAAAAASUVORK5CYII="/></elements></component></components></skin>'; 
     8        jwplayer.html5.defaultSkin = function() { 
     9                this.text = '<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.0"><settings><setting name="backcolor" value="0xFFFFFF"/><setting name="frontcolor" value="0x000000"/><setting name="lightcolor" value="0x000000"/><setting name="screencolor" value="0x000000"/></settings><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/></settings><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFJJREFUeNrslLENwAAIwxLU/09j5AiOgD5hVQzNAVY8JK4qEfHMIKBnd2+BQlBINaiRtL/aV2rdzYBsM6CIONbI1NZENTr3RwdB2PlnJgJ6BRgA4hwu5Qg5iswAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD5JREFUeNosi8ENACAMAgnuv14H0Z8asI19XEjhOiKCMmibVgJTUt7V6fe9KXOtSQCfctJHu2q3/ot79hNgANc2OTz9uTCCAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhJREFUeNpiYqABYBo1dNRQ+hr6H4jvA3E8NS39j4SpZvh/LJig4YxEGEqy3kET+w+AOGFQRhTJhrEQkGcczfujhg4CQwECDADpTRWU/B3wHQAAAABJRU5ErkJggg=="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiYBgFo2DwA0YC8v/R1P4nRu+ooaOGUtnQUTAKhgIACDAAFCwQCfAJ4gwAAAAASUVORK5CYII="/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtJREFUeNpiYBgFo2Dog/9QDAPyQHweTYwiQ/2B+D0Wi8g2tB+JTdBQRiIMJVkvEy0iglhDF9Aq9uOpHVEwoE+NJDUKRsFgAAABBgDe2hqZcNNL0AAAAABJRU5ErkJggg=="/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUeNpiYBgFo2Dog/9AfB6I5dHE/lNqKAi/B2J/ahsKw/3EGMpIhKEk66WJoaR6fz61IyqemhEFSlL61ExSo2AUDAYAEGAAiG4hj+5t7M8AAAAASUVORK5CYII="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxJREFUeNpiYBgFo2AU0Bwwzluw+D8tLWARFhKiqQ9YuLg4aWsBGxs7bS1gZ6e5BWyjSX0UjIKhDgACDABlYQOGh5pYywAAAABJRU5ErkJggg=="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFo2AU0Bww1jc0/aelBSz8/Pw09QELOzs7bS1gY2OjrQWsrKy09gHraFIfBaNgqAOAAAMAvy0DChXHsZMAAAAASUVORK5CYII="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAClJREFUeNpiYBgFo2AU0BwwAvF/WlrARGsfjFow8BaMglEwCugAAAIMAOHfAQunR+XzAAAAAElFTkSuQmCC"/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAICAYAAAA870V8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABZJREFUeNpiZICA/yCCiQEJUJcDEGAAY0gBD1/m7Q0AAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiYBgFIw3MB+L/5Gj8j6yRiRTFyICJXHfTXyMLAXlGati4YDRFDj8AEGAABk8GSqqS4CoAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD1JREFUeNpiYBgFgxz8p7bm+cQa+h8LHy7GhEcjIz4bmAjYykiun/8j0fakGPIfTfPgiSr6aB4FVAcAAQYAWdwR1G1Wd2gAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGpJREFUeNpi/P//PwM9ABMDncCoRYPfIqqDZcuW1UPp/6AUDcNM1DQYKtRAlaAj1mCSLSLXYIIWUctgDItoZfDA5aOoqKhGEANIM9LVR7SymGDQUctikuOIXkFNdhHEOFrDjlpEd4sAAgwAriRMub95fu8AAAAASUVORK5CYII="/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAYAAADkgu3FAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi/P//PwM9ABMDncCoRYPfIlqAeij9H5SiYZiqBqPTlFqE02BKLSLaYFItIttgQhZRzWB8FjENiuRJ7aAbsMQwYMl7wDIsWUUQ42gNO2oR3S0CCDAAKhKq6MLLn8oAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE5JREFUeNpiYBgFo2DQA0YC8v/xqP1PjDlMRDrEgUgxkgHIlfZoriVGjmzLsLFHAW2D6D8eA/9Tw7L/BAwgJE90PvhPpNgoGAVDEQAEGAAMdhTyXcPKcAAAAABJRU5ErkJggg=="/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNpiYBgFo2DIg/9UUkOUAf8JiFFsyX88fJyAkcQgYMQjNkzBoAgiezyRbE+tFGSPxQJ7auYBmma0UTAKBhgABBgAJAEY6zON61sAAAAASUVORK5CYII="/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEpJREFUeNrszwENADAIA7DhX8ENoBMZ5KR10EryckCJiIiIiIiIiIiIiIiIiIiIiIh8GmkRERERERERERERERERERERERGRHSPAAPlXH1phYpYaAAAAAElFTkSuQmCC"/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNrs18ENgjAYhmFouDOCcQJGcARHgE10BDcgTOIosAGwQOuPwaQeuFRi2p/3Sb6EC5L3QCxZBgAAAOCorLW1zMn65TrlkH4NcV7QNcUQt7Gn7KIhxA+qNIR81spOGkL8oFJDyLJRdosqKDDkK+iX5+d7huzwM40xptMQMkjIOeRGo+VkEVvIPfTGIpKASfYIfT9iCHkHrBEzf4gcUQ56aEzuGK/mw0rHpy4AAACAf3kJMACBxjAQNRckhwAAAABJRU5ErkJggg=="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNrs1jEOgCAMBVAg7t5/8qaoIy4uoobyXsLCxA+0NCUAAADGUWvdQoQ41x4ixNBB2hBvBskdD3w5ZCkl3+33VqI0kjBBlh9rp+uTcyOP33TnolfsU85XX3yIRpQph8ZQY3wTZtU5AACASA4BBgDHoVuY1/fvOQAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWlJREFUeNrsl+1twjAQhsHq/7BBYQLYIBmBDcoGMAIjtBPQTcII2SDtBDBBwrU6pGsUO7YbO470PtKJkz9iH++d4ywWAAAAAABgljRNsyWr2bZzDuJG1rLdZhcMbTjrBCGDyUKsqQLFciJb9bSvuG/WagRVRUVUI6gqy5HVeKWfSgRyJruKIU//TrZTSn2nmlaXThrloi/v9F2STC1W4+Aw5cBzkquRc09bofFNc6YLxEON0VUZS5FPTftO49vMjRsIF3RhOGr7/D/pJw+FKU+q0vDyq8W42jCunDqI3LC5XxNj2wHLU1XjaRnb0Lhykhqhhd8MtSF5J9tbjCv4mXGvKJz/65FF/qJryyaaIvzP2QRxZTX2nTuXjvV/VPFSwyLnW7mpH99yTh1FEVro6JBSd40/pMrRdV8vPtcKl28T2pT8TnFZ4yNosct3Q0io6JfBiz1FlGdqVQH3VHnepAEAAAAAADDzEGAAcTwB10jWgxcAAAAASUVORK5CYII="/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAuhJREFUeNrsWr9rU1EUznuNGqvFQh1ULOhiBx0KDtIuioO4pJuik3FxFfUPaAV1FTdx0Q5d2g4FFxehTnEpZHFoBy20tCIWtGq0TZP4HfkeHB5N8m6Sl/sa74XDybvv3vvOd8/Pe4lXrVZT3dD8VJc0B8QBcUAcEAfESktHGeR5XtMfqFQq/f92zPe/NbtGlKTdCY30kuxrpMGO94BlQCXs+rbh3ONgA6BlzP1p20d80gEI5hmA2A92Qua1Q2PtAFISM+bvjMG8U+Q7oA3rQGASwrYCU6WpNdLGYbA+Pq5jjXIiwi8EEa2UDbQSaKOIuV+SlkcCrfjY8XTI9EpKGwP0C2kru2hLtHqa4zoXtZRWyvi4CLwv9Opr6Hkn6A9HKgEANsQ1iqC3Ub/vRUk2JgmRkatK36kVrnt0qObunwUdUUMXMWYpakJsO5Am8tAw2GBIgwWA+G2S2dMpiw0gDioQRQJoKhRb1QiDwlHZUABYbaXWsm5ae6loTE4ZDxN4CZar8foVzOJ2iyZ2kWF3t7YIevffaMT5yJ70kQb2fQ1sE5SHr2wazs2wgMxgbsEKEAgxAvZUJbQLBGTSBMgNrncJbA6AljtS/eKDJ0Ez+DmrQEzXS2h1Ck25kAg0IZcUOaydCy4sYnN2fOA+2AP16gNoHALlQ+fwH7XO4CxLenUpgj4xr6ugY2roPMbMx+Xs18m/E8CVEIhxsNeg83XWOAN6grG3lGbk8uE5fr4B/WH3cJw+co/l9nTYsSGYCJ/lY5/qv0thn6nrIWmjeJcPSnWOeY++AkF8tpJHIMAUs/MaBBpj3znZfQo5psY+ZrG4gv5HickjEOymKjEeRpgyST6IuZcTcWbnjcgdPi5ghxciRKsl1lDSsgwA1i8fssonJgzmTSqfGUkCENndNdAL7PS6QQ7ZYISTo+1qq0LEWjTWcvY4isa4z+yfQB+7ooyHVg5RI7/i1Ijn/vnggDggDogD4oC00P4KMACd/juEHOrS4AAAAABJRU5ErkJggg=="/></elements></component><component name="dock"><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFBJREFUeNrs0cEJACAQA8Eofu0fu/W6EM5ZSAFDRpKTBs00CQQEBAQEBAQEBAQEBAQEBATkK8iqbY+AgICAgICAgICAgICAgICAgIC86QowAG5PAQzEJ0lKAAAAAElFTkSuQmCC"/></elements></component><component name="playlist"><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNrs2NEJwCAMBcBYuv/CFuIE9VN47WWCR7iocXR3pdWdGPqqwIoMjYfQeAiNh9B4JHc6MHQVHnjggQceeOCBBx77TifyeOY0iHi8DqIdEY8dD5cL094eePzINB5CO/LwcOTptNB4CP25L4TIbZzpU7UEGAA5wz1uF5rF9AAAAABJRU5ErkJggg=="/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNrsy6ENACAMAMHClp2wYxZLAg5Fcu9e3OjuOKqqfTMzbs14CIZhGIZhGIZhGP4VLwEGAK/BBnVFpB0oAAAAAElFTkSuQmCC"/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAIAAADpFA0BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNrsy7ENACAMBLE8++8caFFKKiRffU53112SGs3ttOohGIZhGIZhGIZh+Fe8BRgAiaUGde6NOSEAAAAASUVORK5CYII="/></elements></component></components></skin>'; 
     10                this.xml = null; 
     11                 
     12                //http://www.w3schools.com/Dom/dom_parser.asp  
     13                if (window.DOMParser) { 
     14                        parser = new DOMParser(); 
     15                        this.xml = parser.parseFromString(this.text, "text/xml"); 
     16                } else { 
     17                        //IE 
     18                        this.xml = new ActiveXObject("Microsoft.XMLDOM"); 
     19                        this.xml.async = "false"; 
     20                        this.xml.loadXML(this.text); 
     21                } 
     22                return this; 
     23        }; 
    1024         
    1125})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.display.js

    r1277 r1278  
    11/** 
    2  * JW Player view component 
     2 * JW Player display component 
    33 * 
    44 * @author zach 
    55 * @version 1.0 
    66 */ 
    7 (function(jwplayer) { 
    8  
    9         var _logoDefaults = { 
    10                 prefix: "http://l.longtailvideo.com/html5/0/", 
    11                 file: "logo.png", 
    12                 link: "http://www.longtailvideo.com/players/jw-flv-player/", 
    13                 margin: 8, 
    14                 out: 0.5, 
    15                 over: 1, 
    16                 timeout: 3, 
    17                 hide: "true", 
    18                 position: "bottom-left", 
    19                 width: 93, 
    20                 height: 30 
     7(function(jwplayer) {    
     8        _css = jwplayer.html5.utils.css; 
     9         
     10        _hide = function(element) { 
     11                _css(element, { 
     12                        display: "none" 
     13                }); 
    2114        }; 
    2215         
    23         var _display; 
    24          
    25         jwplayer.html5.display = function(player) { 
    26                 if (_display === undefined) { 
    27                         _display = {}; 
    28                         _display.elements = _initializeDisplayElements(player); 
    29                         _setupDisplay(player); 
    30                         player.addEventListener(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, _stateHandler(player)); 
    31                         player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, _stateHandler(player)); 
    32                         player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_ERROR, function(obj) { 
    33                         }); 
    34                 } 
     16        _show = function(element) { 
     17                _css(element, { 
     18                        display: "block" 
     19                }); 
    3520        }; 
    3621         
    37         function _setupDisplay(player) { 
    38                 var html = []; 
    39                 html.push("<div id='" + player.id + "_display'" + _getStyle(player, 'display') + ">"); 
    40                 html.push("<div id='" + player.id + "_displayImage'" + _getStyle(player, 'displayImage') + ">&nbsp;</div>"); 
    41                 html.push("<div id='" + player.id + "_displayIconBackground'" + _getStyle(player, 'displayIconBackground') + ">"); 
    42                 html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + _getStyle(player, 'displayIcon') + "/>"); 
    43                 html.push('</div>'); 
    44                 html.push('<div id="' + player.id + '_logo" target="_blank"' + _getStyle(player, 'logo') + '>&nbsp;</div>'); 
    45                 html.push('</div>'); 
    46                 player._model.domelement.before(html.join('')); 
    47                 _display.display = $("#"+player.id + "_display"); 
    48                 _display.displayImage = $("#"+player.id + "_displayImage"); 
    49                 _display.displayIcon = $("#"+player.id + "_displayIcon"); 
    50                 _display.displayIconBackground = $("#"+player.id + "_displayIconBackground"); 
    51                 _display.logo = $("#"+player.id + "_logo"); 
    52                 _setupDisplayElements(player); 
    53         } 
    54          
    55          
    56         function _getStyle(player, element) { 
    57                 var result = ''; 
    58                 for (var style in _display.elements[element].style) { 
    59                         result += style + ":" + _display.elements[element].style[style] + ";"; 
    60                 } 
    61                 if (result === '') { 
    62                         return ' '; 
    63                 } 
    64                 return ' style="' + result + '" '; 
    65         } 
    66          
    67          
    68         function _setupDisplayElements(player) { 
    69                 var displayElements = _initializeDisplayElements(player); 
    70                 for (var element in displayElements) { 
    71                         var elementId = ['#', player.id, '_', element]; 
    72                         _display[element] = $(elementId.join('')); 
    73                         if (displayElements[element].click !== undefined) { 
    74                                 _display[element].click(displayElements[element].click); 
    75                         } 
    76                 } 
    77         } 
    78          
    79          
    80         function _initializeDisplayElements(player) { 
    81                 var elements = { 
    82                         display: { 
    83                                 style: { 
    84                                         cursor: 'pointer', 
    85                                         width: player.getWidth() + "px", 
    86                                         height: player.getHeight() + "px", 
    87                                         position: 'relative', 
    88                                         'z-index': 50, 
    89                                         margin: 0, 
    90                                         padding: 0 
     22        jwplayer.html5.display = function(api, config) { 
     23                var _api = api; 
     24                var _display = {}; 
     25                var _width; 
     26                var _height; 
     27                var _degreesRotated; 
     28                var _rotationInterval; 
     29                var _bufferRotation = _api.skin.getComponentSettings("display").bufferrotation === undefined ? 15 : parseInt(_api.skin.getComponentSettings("display").bufferrotation, 10); 
     30                var _bufferInterval = _api.skin.getComponentSettings("display").bufferinterval === undefined ? 100 : parseInt(_api.skin.getComponentSettings("display").bufferinterval, 10); 
     31                var _elements = { 
     32                                display: { 
     33                                        style: { 
     34                                                cursor: "pointer" 
     35                                        }, 
     36                                        click: _displayClickHandler 
    9137                                }, 
    92                                 click: _displayClickHandler(player) 
    93                         }, 
    94                         displayIcon: { 
    95                                 style: { 
    96                                         cursor: 'pointer', 
    97                                         position: 'absolute', 
    98                                         top: ((player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2) + "px", 
    99                                         left: ((player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2) + "px", 
    100                                         border: 0, 
    101                                         margin: 0, 
    102                                         padding: 0 
     38                                display_icon: { 
     39                                        style: { 
     40                                                cursor: "pointer", 
     41                                                position: "absolute", 
     42                                                top: ((_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", "playIcon").height) / 2), 
     43                                                left: ((_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", "playIcon").width) / 2), 
     44                                                border: 0, 
     45                                                margin: 0, 
     46                                                padding: 0 
     47                                        } 
     48                                }, 
     49                                display_iconBackground: { 
     50                                        style: { 
     51                                                cursor: "pointer", 
     52                                                position: "absolute", 
     53                                                top: ((_height - _api.skin.getSkinElement("display", "background").height) / 2), 
     54                                                left: ((_width - _api.skin.getSkinElement("display", "background").width) / 2), 
     55                                                border: 0, 
     56                                                backgroundImage: (["url(", _api.skin.getSkinElement("display", "background").src, ")"]).join(""), 
     57                                                width: _api.skin.getSkinElement("display", "background").width, 
     58                                                height: _api.skin.getSkinElement("display", "background").height, 
     59                                                margin: 0, 
     60                                                padding: 0 
     61                                        } 
     62                                }, 
     63                                display_image: { 
     64                                        style: { 
     65                                                display: "block", 
     66                                                width: _width, 
     67                                                height: _height, 
     68                                                position: "absolute", 
     69                                                cursor: "pointer", 
     70                                                left: 0, 
     71                                                top: 0, 
     72                                                margin: 0, 
     73                                                padding: 0, 
     74                                                textDecoration: "none" 
     75                                        } 
    10376                                } 
    104                         }, 
    105                         displayIconBackground: { 
    106                                 style: { 
    107                                         cursor: 'pointer', 
    108                                         position: 'absolute', 
    109                                         top: ((player.getHeight() - player.skin.display.elements.background.height) / 2) + "px", 
    110                                         left: ((player.getWidth() - player.skin.display.elements.background.width) / 2) + "px", 
    111                                         border: 0, 
    112                                         'background-image': (['url(', player.skin.display.elements.background.src, ')']).join(''), 
    113                                         width: player.skin.display.elements.background.width + "px", 
    114                                         height: player.skin.display.elements.background.height + "px", 
    115                                         margin: 0, 
    116                                         padding: 0 
     77                        }; 
     78                _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 
     79                _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _stateHandler); 
     80                _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, _stateHandler); 
     81                _api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_ERROR, function(obj) { 
     82                }); 
     83                _setupDisplay(); 
     84                 
     85                 
     86                function _setupDisplay() { 
     87                        _display.display = createElement("div", "display"); 
     88                        _display.display_image = createElement("div", "display_image"); 
     89                        _display.display_icon = createElement("div", "display_icon"); 
     90                        _display.display_iconBackground = createElement("div", "display_iconBackground"); 
     91                        _display.display.appendChild(_display.display_image); 
     92                        _display.display_iconBackground.appendChild(_display.display_icon); 
     93                        _display.display.appendChild(_display.display_iconBackground); 
     94                        _setupDisplayElements(); 
     95                } 
     96                 
     97                 
     98                this.getDisplayElement = function() { 
     99                        return _display.display; 
     100                }; 
     101                 
     102                this.resize = function(width, height) { 
     103                        _width = width; 
     104                        _height = height; 
     105                        _css(_display.display, { 
     106                                width: width, 
     107                                height: height 
     108                        }); 
     109                        _css(_display.display_image, { 
     110                                width: width, 
     111                                height: height 
     112                        }); 
     113                        _css(_display.display_iconBackground, { 
     114                                top: ((_height - _api.skin.getSkinElement("display", "background").height) / 2), 
     115                                left: ((_width - _api.skin.getSkinElement("display", "background").width) / 2) 
     116                        }); 
     117                        _stateHandler({}); 
     118                }; 
     119                 
     120                function createElement(tag, element) { 
     121                        var _element = document.createElement(tag); 
     122                        _element.id = _api.id + "_jwplayer_" + element; 
     123                        _css(_element, _elements[element].style); 
     124                        return _element; 
     125                } 
     126                 
     127                function _getStyle(element) { 
     128                        var result = ''; 
     129                        for (var style in _elements[element].style) { 
     130                                result += style + ":" + _elements[element].style[style] + ";"; 
     131                        } 
     132                        if (result === '') { 
     133                                return ' '; 
     134                        } 
     135                        return ' style="' + result + '" '; 
     136                } 
     137                 
     138                 
     139                function _setupDisplayElements() { 
     140                        for (var element in _display) { 
     141                                if (_elements[element].click !== undefined) { 
     142                                        _display[element].onclick = _elements[element].click; 
    117143                                } 
    118                         }, 
    119                         displayImage: { 
    120                                 style: { 
    121                                         display: 'block', 
    122                                         background: ([player._model.config.screencolor, ' url(', jwplayer.html5.utils.getAbsolutePath(player.getConfig().image), ') no-repeat center center']).join(''), 
    123                                         width: player.getWidth() + "px", 
    124                                         height: player.getHeight() + "px", 
    125                                         position: 'absolute', 
    126                                         cursor: 'pointer', 
    127                                         left: 0, 
    128                                         top: 0, 
    129                                         margin: 0, 
    130                                         padding: 0, 
    131                                         'text-decoration': 'none' 
    132                                 } 
    133                         }, 
    134                         logo: { 
    135                                 style: { 
    136                                         position: 'absolute', 
    137                                         width: _logoDefaults.width + "px", 
    138                                         height: _logoDefaults.height + "px", 
    139                                         'background-image': (['url(', _logoDefaults.prefix, _logoDefaults.file, ')']).join(''), 
    140                                         margin: 0, 
    141                                         padding: 0, 
    142                                         display: 'none', 
    143                                         'text-decoration': 'none' 
    144                                 }, 
    145                                 click: _logoClickHandler() 
    146                         } 
    147                 }; 
    148                 var positions = _logoDefaults.position.split("-"); 
    149                 for (var position in positions) { 
    150                         elements.logo.style[positions[position]] = _logoDefaults.margin + "px"; 
    151                 } 
    152                 return elements; 
    153         } 
    154          
    155          
    156         function _displayClickHandler(player) { 
    157                 return function(evt) { 
    158                         if (player._media === undefined) { 
    159                                 document.location.href = jwplayer.html5.utils.getAbsolutePath(player.getPlaylist()[player.getConfig().item].sources[0]); 
    160                                 return; 
    161                         } 
    162                         if (typeof evt.preventDefault != 'undefined') { 
     144                        } 
     145                } 
     146                 
     147                 
     148                function _displayClickHandler(evt) { 
     149                        if (typeof evt.preventDefault != "undefined") { 
    163150                                evt.preventDefault(); // W3C 
    164151                        } else { 
    165152                                evt.returnValue = false; // IE 
    166153                        } 
    167                         if (player.getState() != jwplayer.html5.states.PLAYING) { 
    168                                 player.play(); 
     154                        if (_api.jwGetState() != jwplayer.api.events.state.PLAYING) { 
     155                                _api.jwPlay(); 
    169156                        } else { 
    170                                 player.pause(); 
    171                         } 
    172                 }; 
    173         } 
    174          
    175          
    176         function _logoClickHandler() { 
    177                 return function(evt) { 
    178                         evt.stopPropagation(); 
    179                         return; 
    180                 }; 
    181         } 
    182          
    183          
    184         function _setIcon(player, path) { 
    185                 $("#" + player.id + "_displayIcon")[0].src = path; 
    186         } 
    187          
    188          
    189         function _animate(element, state) { 
    190                 var speed = 'slow'; 
    191                 if (!_display.animate) { 
    192                         return; 
    193                 } 
    194                 if (state) { 
    195                         element.slideDown(speed, function() { 
    196                                 _animate(element); 
    197                         }); 
    198                 } else { 
    199                         element.slideUp(speed, function() { 
    200                                 _animate(element, true); 
    201                         }); 
    202                 } 
    203         } 
    204          
    205          
    206         function _stateHandler(player) { 
    207                 return function(obj) { 
    208                         _display.animate = false; 
    209                         switch (player.getState()) { 
    210                                 case jwplayer.html5.states.BUFFERING: 
    211                                         _display.logo.fadeIn(0, function() { 
    212                                                 setTimeout(function() { 
    213                                                         _display.logo.fadeOut(_logoDefaults.out * 1000); 
    214                                                 }, _logoDefaults.timeout * 1000); 
     157                                _api.jwPause(); 
     158                        } 
     159                } 
     160                 
     161                 
     162                function _setDisplayIcon(newIcon) { 
     163                        _show(_display.display_iconBackground); 
     164                        _display.display_icon.style.backgroundImage = (["url(", _api.skin.getSkinElement("display", newIcon).src, ")"]).join(""); 
     165                        _css(_display.display_icon, { 
     166                                display: "block", 
     167                                width: _api.skin.getSkinElement("display", newIcon).width, 
     168                                height: _api.skin.getSkinElement("display", newIcon).height, 
     169                                top: (_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", newIcon).height) / 2, 
     170                                left: (_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", newIcon).width) / 2 
     171                        }); 
     172                        if (_api.skin.getSkinElement("display", newIcon + "Over") !== undefined) { 
     173                                _display.display_icon.onmouseover = function(evt) { 
     174                                        evt.stopPropagation(); 
     175                                        _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon + "Over").src, ")"].join(""); 
     176                                }; 
     177                                _display.display_icon.onmouseout = function(evt) { 
     178                                        evt.stopPropagation(); 
     179                                        _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon).src, ")"].join(""); 
     180                                }; 
     181                        } else { 
     182                                _display.display_icon.onmouseover = undefined; 
     183                                _display.display_icon.onmouseout = undefined; 
     184                        } 
     185                } 
     186                 
     187                function _hideDisplayIcon() { 
     188                        _hide(_display.display_icon); 
     189                        _hide(_display.display_iconBackground); 
     190                } 
     191                 
     192                function _stateHandler(obj) { 
     193                        if (_rotationInterval !== undefined) { 
     194                                clearInterval(_rotationInterval); 
     195                                _rotationInterval = undefined; 
     196                                jwplayer.html5.utils.animations.rotate(_display.display_icon, 0); 
     197                        } 
     198                        switch (_api.jwGetState()) { 
     199                                case jwplayer.api.events.state.BUFFERING: 
     200                                        _setDisplayIcon("bufferIcon"); 
     201                                        _degreesRotated = 0; 
     202                                        _rotationInterval = setInterval(function() { 
     203                                                _degreesRotated += _bufferRotation; 
     204                                                jwplayer.html5.utils.animations.rotate(_display.display_icon, _degreesRotated % 360); 
     205                                        }, _bufferInterval); 
     206                                        _setDisplayIcon("bufferIcon"); 
     207                                        break; 
     208                                case jwplayer.api.events.state.PAUSED: 
     209                                        _css(_display.display_image, { 
     210                                                background: "transparent no-repeat center center" 
    215211                                        }); 
    216                                         _display.displayIcon[0].src = player.skin.display.elements.bufferIcon.src; 
    217                                         _display.displayIcon.css({ 
    218                                                 "display": "block", 
    219                                                 top: (player.skin.display.elements.background.height - player.skin.display.elements.bufferIcon.height) / 2 + "px", 
    220                                                 left: (player.skin.display.elements.background.width - player.skin.display.elements.bufferIcon.width) / 2 + "px" 
     212                                        _show(_display.display_iconBackground); 
     213                                        _setDisplayIcon("playIcon"); 
     214                                        break; 
     215                                case jwplayer.api.events.state.IDLE: 
     216                                        var background = _api.jwGetPlaylist()[_api.jwGetItem()].image === "" ? "" : " url(" + jwplayer.html5.utils.getAbsolutePath(_api.jwGetPlaylist()[_api.jwGetItem()].image) + ")"; 
     217                                        _css(_display.display_image, { 
     218                                                background: background + " no-repeat center center" 
    221219                                        }); 
    222                                         _display.animate = true; 
    223                                         // TODO: Buffer Icon rotation 
    224                                         if (false) { 
    225                                                 _animate(_display.displayIconBackground); 
    226                                         } 
    227                                         _display.displayIconBackground.css('display', 'none'); 
    228                                         break; 
    229                                 case jwplayer.html5.states.PAUSED: 
    230                                         _display.logo.fadeIn(0); 
    231                                         _display.displayImage.css("background", "transparent no-repeat center center"); 
    232                                         _display.displayIconBackground.css("display", "block"); 
    233                                         _display.displayIcon[0].src = player.skin.display.elements.playIcon.src; 
    234                                         _display.displayIcon.css({ 
    235                                                 "display": "block", 
    236                                                 top: (player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2 + "px", 
    237                                                 left: (player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2 + "px" 
    238                                         }); 
    239                                         break; 
    240                                 case jwplayer.html5.states.IDLE: 
    241                                         _display.logo.fadeOut(0); 
    242                                         _display.displayImage.css("background", player._model.config.screencolor + " url('" + jwplayer.html5.utils.getAbsolutePath(player.getConfig().image) + "') no-repeat center center"); 
    243                                         _display.displayIconBackground.css("display", "block"); 
    244                                         _display.displayIcon[0].src = player.skin.display.elements.playIcon.src; 
    245                                         _display.displayIcon.css({ 
    246                                                 "display": "block", 
    247                                                 top: (player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2 + "px", 
    248                                                 left: (player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2 + "px" 
    249                                         }); 
     220                                        _show(_display.display_iconBackground); 
     221                                        _setDisplayIcon("playIcon"); 
    250222                                        break; 
    251223                                default: 
    252                                         if (player.getMute()) { 
    253                                                 _display.displayImage.css("background", "transparent no-repeat center center"); 
    254                                                 _display.displayIconBackground.css("display", "block"); 
    255                                                 _display.displayIcon[0].src = player.skin.display.elements.muteIcon.src; 
    256                                                 _display.displayIcon.css({ 
    257                                                         "display": "block", 
    258                                                         top: (player.skin.display.elements.muteIcon.height - player.skin.display.elements.muteIcon.height) / 2 + "px", 
    259                                                         left: (player.skin.display.elements.background.width - player.skin.display.elements.muteIcon.width) / 2 + "px" 
     224                                        if (_api.jwGetMute()) { 
     225                                                _css(_display.display_image, { 
     226                                                        background: "transparent no-repeat center center" 
    260227                                                }); 
     228                                                _show(_display.display_iconBackground); 
     229                                                _setDisplayIcon("muteIcon"); 
     230                                                 
    261231                                        } else { 
    262                                                 try { 
    263                                                         _display.logo.clearQueue(); 
    264                                                 } catch (err) { 
    265                                                  
    266                                                 } 
    267                                                 _display.logo.fadeIn(0, function() { 
    268                                                         setTimeout(function() { 
    269                                                                 _display.logo.fadeOut(_logoDefaults.out * 1000); 
    270                                                         }, _logoDefaults.timeout * 1000); 
     232                                                _css(_display.display_image, { 
     233                                                        background: "transparent no-repeat center center" 
    271234                                                }); 
    272                                                 _display.displayImage.css("background", "transparent no-repeat center center"); 
    273                                                 _display.displayIconBackground.css("display", "none"); 
    274                                                 _display.displayIcon.css("display", "none"); 
    275                                         } 
    276                                         break; 
    277                         } 
    278                 }; 
    279         } 
    280          
    281         })(jwplayer); 
     235                                                _hide(_display.display_iconBackground); 
     236                                                _hide(_display.display_icon); 
     237                                        } 
     238                                        break; 
     239                        } 
     240                } 
     241                 
     242                return this; 
     243        }; 
     244         
     245         
     246         
     247})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.js

    r1277 r1278  
    66 */ 
    77(function(jwplayer) { 
    8         var _player = { 
    9                 id: undefined, 
    10                 version: "1.0", 
    11                 skin: undefined, 
    12                 _model: undefined, 
    13                 _view: undefined, 
    14                 _controller: undefined, 
    15                 _listeners: {}, 
    16                 _media: undefined, 
    17                 _domelement: undefined 
     8        jwplayer.html5 = function(container) { 
     9                var _container = container; 
     10                 
     11                this.setup = function(options) { 
     12                        jwplayer.utils.extend(this, new jwplayer.html5.api(_container, options)); 
     13                        return this; 
     14                }; 
     15                 
     16                return this; 
    1817        }; 
    1918         
    20         jwplayer.html5 = function(domelement) { 
    21                 _player._domelement = domelement; 
    22                 _player.id = domelement.id; 
    23                 _player.setup = setup; 
    24                 return _player; 
    25         }; 
    26                  
    27         function setup (options) { 
    28                 jwplayer.html5.utils.log("Starting setup", _player); 
    29                 _setup(_player, 0, options); 
    30                 return _player; 
    31         } 
    32          
    33         function _setup(player, step, options) { 
    34                 //try { 
    35                         switch (step) { 
    36                                 case 0: 
    37                                         player._model = new jwplayer.html5.model(options); 
    38                                         player._model.domelement = $('#'+_player.id); 
    39                                         _setup(player, step + 1); 
    40                                         break; 
    41                                 case 1: 
    42                                         player._controller = jwplayer.html5.controller(player); 
    43                                         _setup($.extend(player, jwplayer.html5._api(player)), step + 1); 
    44                                         break; 
    45                                 case 2: 
    46                                         jwplayer.html5.skinner(player, function() { 
    47                                                 _setup(player, step + 1); 
    48                                         }); 
    49                                         break; 
    50                                 case 3: 
    51                                         jwplayer.html5.view(player); 
    52                                         _setup(player, step + 1); 
    53                                         break; 
    54                                 case 4: 
    55                                         jwplayer.html5.model.setActiveMediaProvider(player); 
    56                                         if ((player._media === undefined) || !player._media.hasChrome) { 
    57                                                 _setup(player, step + 1); 
    58                                         } 
    59                                         break; 
    60                                 case 5: 
    61                                         jwplayer.html5.display(player, player._model.domelement); 
    62                                         if (player._media === undefined) { 
    63                                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 
    64                                         } else { 
    65                                                 _setup(player, step + 1); 
    66                                         } 
    67                                         break; 
    68                                 case 6: 
    69                                         jwplayer.html5.controlbar(player, player._model.domelement); 
    70                                         _setup(player, step + 1); 
    71                                         break; 
    72                                 case 7: 
    73                                         player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 
    74                                         _setup(player, step + 1); 
    75                                         break; 
    76                                 default: 
    77                                         if (player.getConfig().autostart === true) { 
    78                                                 player.play(); 
    79                                         } 
    80                                         break; 
    81                         } 
    82                 //} catch (err) { 
    83                 //      jwplayer.html5.utils.log("Setup failed at step " + step, err); 
    84                 //} 
    85         } 
     19        jwplayer.html5.version = '1.0'; 
    8620})(jwplayer); 
    8721 
  • trunk/html5/src/html5/jwplayer.html5.mediavideo.js

    r1277 r1278  
    88 
    99        var _states = { 
    10                 "ended": jwplayer.html5.states.IDLE, 
    11                 "playing": jwplayer.html5.states.PLAYING, 
    12                 "pause": jwplayer.html5.states.PAUSED, 
    13                 "buffering": jwplayer.html5.states.BUFFERING 
     10                "ended": jwplayer.api.events.state.IDLE, 
     11                "playing": jwplayer.api.events.state.PLAYING, 
     12                "pause": jwplayer.api.events.state.PAUSED, 
     13                "buffering": jwplayer.api.events.state.BUFFERING 
    1414        }; 
    1515         
    16         var _events = { 
    17                 'abort': _generalHandler, 
    18                 'canplay': _stateHandler, 
    19                 'canplaythrough': _stateHandler, 
    20                 'durationchange': _metaHandler, 
    21                 'emptied': _generalHandler, 
    22                 'ended': _stateHandler, 
    23                 'error': _errorHandler, 
    24                 'loadeddata': _metaHandler, 
    25                 'loadedmetadata': _metaHandler, 
    26                 'loadstart': _stateHandler, 
    27                 'pause': _stateHandler, 
    28                 'play': _positionHandler, 
    29                 'playing': _stateHandler, 
    30                 'progress': _progressHandler, 
    31                 'ratechange': _generalHandler, 
    32                 'seeked': _stateHandler, 
    33                 'seeking': _stateHandler, 
    34                 'stalled': _stateHandler, 
    35                 'suspend': _stateHandler, 
    36                 'timeupdate': _positionHandler, 
    37                 'volumechange': _generalHandler, 
    38                 'waiting': _stateHandler, 
    39                 'canshowcurrentframe': _generalHandler, 
    40                 'dataunavailable': _generalHandler, 
    41                 'empty': _generalHandler, 
    42                 'load': _generalHandler, 
    43                 'loadedfirstframe': _generalHandler 
    44         }; 
     16        var _css = jwplayer.html5.utils.css; 
    4517         
    46         var _domelement; 
    47         var _jdomelement; 
    48         var _bufferFull; 
    49         var _bufferingComplete; 
    50         var _state = jwplayer.html5.states.IDLE; 
    51         var _interval; 
    52         var _stopped; 
    53          
    54         jwplayer.html5.mediavideo = function(player) { 
    55                 _domelement = player._domelement; 
    56                 _jdomelement = $(_domelement); 
    57                 _jdomelement.attr('loop', player._model.config.repeat); 
    58                 var media = { 
    59                         play: _play(player), 
    60                         pause: _pause(player), 
    61                         seek: _seek(player), 
    62                         stop: _stop(player), 
    63                         volume: _volume(player), 
    64                         mute: _mute(player), 
    65                         fullscreen: _fullscreen(player), 
    66                         load: _load(player), 
    67                         resize: _resize(player), 
    68                         getState: _getState, 
    69                         interval: null, 
    70                         loadcount: 0, 
    71                         hasChrome: false 
    72                 }; 
    73                 media.mute(player.getMute()); 
    74                 media.volume(player.getVolume()); 
    75                 return media; 
    76         }; 
    77  
    78         function _getState(){ 
    79                 return _state; 
    80         } 
    81          
    82         function _generalHandler(event, player) { 
    83         } 
    84          
    85         function _stateHandler(event, player) { 
    86                 if (_states[event.type]) { 
    87                         _setState(player, _states[event.type]); 
    88                 } 
    89         } 
    90                  
    91         function _setState(player, newstate) { 
    92                 if (_stopped) { 
    93                         newstate = jwplayer.html5.states.IDLE; 
    94                 } 
    95                 if (_state != newstate) { 
    96                         var oldstate = _state; 
    97                         _state = newstate; 
    98                         player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, { 
    99                                 oldstate: oldstate, 
    100                                 newstate: newstate 
     18        jwplayer.html5.mediavideo = function(model, container) { 
     19                var _events = { 
     20                        'abort': _generalHandler, 
     21                        'canplay': _stateHandler, 
     22                        'canplaythrough': _stateHandler, 
     23                        'durationchange': _metaHandler, 
     24                        'emptied': _generalHandler, 
     25                        'ended': _stateHandler, 
     26                        'error': _errorHandler, 
     27                        'loadeddata': _metaHandler, 
     28                        'loadedmetadata': _metaHandler, 
     29                        'loadstart': _stateHandler, 
     30                        'pause': _stateHandler, 
     31                        'play': _positionHandler, 
     32                        'playing': _stateHandler, 
     33                        'progress': _progressHandler, 
     34                        'ratechange': _generalHandler, 
     35                        'seeked': _stateHandler, 
     36                        'seeking': _stateHandler, 
     37                        'stalled': _stateHandler, 
     38                        'suspend': _stateHandler, 
     39                        'timeupdate': _positionHandler, 
     40                        'volumechange': _generalHandler, 
     41                        'waiting': _stateHandler, 
     42                        'canshowcurrentframe': _generalHandler, 
     43                        'dataunavailable': _generalHandler, 
     44                        'empty': _generalHandler, 
     45                        'load': _loadHandler, 
     46                        'loadedfirstframe': _generalHandler 
     47                }; 
     48                var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 
     49                jwplayer.utils.extend(this, _eventDispatcher); 
     50                var _model = model; 
     51                var _container = container; 
     52                var _bufferFull; 
     53                var _bufferingComplete; 
     54                var _state = jwplayer.api.events.state.IDLE; 
     55                var _interval = null; 
     56                var _stopped; 
     57                var _loadcount = 0; 
     58                var _start = false; 
     59                var hasChrome = false; 
     60                 
     61                function _getState() { 
     62                        return _state; 
     63                } 
     64                 
     65                function _loadHandler(evt) { 
     66                } 
     67                 
     68                function _generalHandler(event) { 
     69                } 
     70                 
     71                function _stateHandler(event) { 
     72                        if (_states[event.type]) { 
     73                                _setState(_states[event.type]); 
     74                        } 
     75                } 
     76                 
     77                function _setState(newstate) { 
     78                        if (_stopped) { 
     79                                newstate = jwplayer.api.events.state.IDLE; 
     80                        } 
     81                        if (_state != newstate) { 
     82                                var oldstate = _state; 
     83                                _model.state = newstate; 
     84                                _state = newstate; 
     85                                if (newstate == jwplayer.api.events.state.IDLE) { 
     86                                        _clearInterval(); 
     87                                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE); 
     88                                         
     89                                        if (_container.style.display != 'none') { 
     90                                                _container.style.display = 'none'; 
     91                                        } 
     92                                } 
     93                                 
     94                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, { 
     95                                        oldstate: oldstate, 
     96                                        newstate: newstate 
     97                                }); 
     98                        } 
     99                        _stopped = false; 
     100                } 
     101                 
     102                 
     103                function _metaHandler(event) { 
     104                        var meta = { 
     105                                height: event.target.videoHeight, 
     106                                width: event.target.videoWidth, 
     107                                duration: event.target.duration 
     108                        }; 
     109                        if (_model.duration === 0) { 
     110                                _model.duration = event.target.duration; 
     111                        } 
     112                        _model.playlist[_model.item] = jwplayer.utils.extend(_model.playlist[_model.item], meta); 
     113                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_META, { 
     114                                metadata: meta 
    101115                        }); 
    102116                } 
    103                 if (newstate == jwplayer.html5.states.IDLE) { 
     117                 
     118                 
     119                function _positionHandler(event) { 
     120                        if (_stopped) { 
     121                                return; 
     122                        } 
     123                         
     124                        if (event !== undefined && event.target !== undefined) { 
     125                                if (_model.duration === 0) { 
     126                                        _model.duration = event.target.duration; 
     127                                } 
     128                                 
     129                                if (_state == jwplayer.api.events.state.PLAYING) { 
     130                                        if (!_start && _container.readyState > 0) { 
     131                                                _start = true; 
     132                                                _container.currentTime = _model.playlist[_model.item].start; 
     133                                                _container.volume = _model.volume / 100; 
     134                                                _container.muted = _model.mute; 
     135                                        } 
     136                                        _model.position = Math.round(event.target.currentTime * 10) / 10; 
     137                                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_TIME, { 
     138                                                position: Math.round(event.target.currentTime * 10) / 10, 
     139                                                duration: Math.round(event.target.duration * 10) / 10 
     140                                        }); 
     141                                } 
     142                        } 
     143                        _progressHandler(event); 
     144                } 
     145                 
     146                 
     147                function _progressHandler(event) { 
     148                        var bufferPercent, bufferTime; 
     149                        if (event !== undefined && event.lengthComputable && event.total) { 
     150                                bufferPercent = event.loaded / event.total * 100; 
     151                                bufferTime = bufferPercent / 100 * (_model.duration - _container.currentTime); 
     152                        } else if ((_container.buffered !== undefined) && (_container.buffered.length > 0)) { 
     153                                maxBufferIndex = 0; 
     154                                if (maxBufferIndex >= 0) { 
     155                                        bufferPercent = _container.buffered.end(maxBufferIndex) / _container.duration * 100; 
     156                                        bufferTime = _container.buffered.end(maxBufferIndex) - _container.currentTime; 
     157                                } 
     158                        } 
     159                         
     160                        if (_bufferFull === false) { 
     161                                _bufferFull = true; 
     162                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL); 
     163                        } 
     164                         
     165                        if (!_bufferingComplete) { 
     166                                if (bufferPercent == 100 && _bufferingComplete === false) { 
     167                                        _bufferingComplete = true; 
     168                                } 
     169                                 
     170                                if (bufferPercent !== null && (bufferPercent > _model.buffer)) { 
     171                                        _model.buffer = Math.round(bufferPercent); 
     172                                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, { 
     173                                                bufferPercent: Math.round(bufferPercent) 
     174                                        }); 
     175                                } 
     176                                 
     177                        } 
     178                } 
     179                 
     180                 
     181                function _startInterval() { 
     182                        if (_interval === null) { 
     183                                _interval = setInterval(function() { 
     184                                        _positionHandler(); 
     185                                }, 100); 
     186                        } 
     187                } 
     188                 
     189                function _clearInterval() { 
    104190                        clearInterval(_interval); 
    105191                        _interval = null; 
    106                         player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE); 
    107                         if (player._model.config.repeat && !_stopped) { 
    108                                 player.play(); 
    109                         } 
    110                         if (_jdomelement.css('display') != 'none') { 
    111                                 _jdomelement.css('display', 'none'); 
    112                         } 
    113                 } 
    114                 _stopped = false; 
    115         } 
    116          
    117          
    118         function _metaHandler(event, player) { 
    119                 var meta = { 
    120                         height: event.target.videoHeight, 
    121                         width: event.target.videoWidth, 
    122                         duration: event.target.duration 
    123                 }; 
    124                 if (player._model.duration === 0) { 
    125                         player._model.duration = event.target.duration; 
    126                 } 
    127                 player._model.playlist[player._model.item] = $.extend(player._model.playlist[player._model.item], meta); 
    128                 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_META, meta); 
    129         } 
    130          
    131          
    132         function _positionHandler(event, player) { 
    133                 if (_stopped) { 
    134                         return; 
    135                 } 
    136                 if (!jwplayer.html5.utils.isNull(event.target)) { 
    137                         if (player._model.duration === 0) { 
    138                                 player._model.duration = event.target.duration; 
    139                         } 
    140                          
    141                         if (_state == jwplayer.html5.states.PLAYING) { 
    142                                 player._model.position = Math.round(event.target.currentTime * 10) / 10; 
    143                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, { 
    144                                         position: Math.round(event.target.currentTime * 10) / 10, 
    145                                         duration: Math.round(event.target.duration * 10) / 10 
     192                } 
     193                 
     194                function _errorHandler(event) { 
     195                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, event.target); 
     196                } 
     197                 
     198                this.getDisplayElement = function() { 
     199                        return _container; 
     200                }; 
     201                 
     202                this.play = function() { 
     203                        if (_state != jwplayer.api.events.state.PLAYING) { 
     204                                if (_container.style.display != "block") { 
     205                                        _container.style.display = "block"; 
     206                                } 
     207                                _container.play(); 
     208                                _setState(jwplayer.api.events.state.PLAYING); 
     209                                _startInterval(); 
     210                        } 
     211                }; 
     212                 
     213                 
     214                /** Switch the pause state of the player. **/ 
     215                this.pause = function() { 
     216                        _container.pause(); 
     217                        _setState(jwplayer.api.events.state.PAUSED); 
     218                }; 
     219                 
     220                 
     221                /** Seek to a position in the video. **/ 
     222                this.seek = function(position) { 
     223                        _container.currentTime = position; 
     224                        _container.play(); 
     225                }; 
     226                 
     227                 
     228                /** Stop playback and loading of the video. **/ 
     229                this.stop = function() { 
     230                        _stopped = true; 
     231                        _container.pause(); 
     232                        _clearInterval(); 
     233                        _model.position = 0; 
     234                        _setState(jwplayer.api.events.state.IDLE); 
     235                }; 
     236                 
     237                 
     238                /** Change the video's volume level. **/ 
     239                this.volume = function(position) { 
     240                        _container.volume = position / 100; 
     241                        _model.volume = position; 
     242                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, { 
     243                                volume: Math.round(position) 
     244                        }); 
     245                }; 
     246                 
     247                 
     248                /** Switch the mute state of the player. **/ 
     249                this.mute = function(state) { 
     250                        _container.muted = state; 
     251                        _model.mute = state; 
     252                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, { 
     253                                mute: state 
     254                        }); 
     255                }; 
     256                 
     257                 
     258                /** Resize the player. **/ 
     259                this.resize = function(width, height) { 
     260                        if (false) { 
     261                                _css(_container, { 
     262                                        width: width, 
     263                                        height: height 
    146264                                }); 
    147265                        } 
    148                 } 
    149                 _progressHandler({}, player); 
    150         } 
    151          
    152          
    153         function _progressHandler(event, player) { 
    154                 var bufferPercent, bufferTime, bufferFill; 
    155                 if (!isNaN(event.loaded / event.total)) { 
    156                         bufferPercent = event.loaded / event.total * 100; 
    157                         bufferTime = bufferPercent / 100 * (player._model.duration - _domelement.currentTime); 
    158                 } else if ((_domelement.buffered !== undefined) && (_domelement.buffered.length > 0)) { 
    159                         maxBufferIndex = 0; 
    160                         if (maxBufferIndex >= 0) { 
    161                                 bufferPercent = _domelement.buffered.end(maxBufferIndex) / _domelement.duration * 100; 
    162                                 bufferTime = _domelement.buffered.end(maxBufferIndex) - _domelement.currentTime; 
    163                         } 
    164                 } 
    165                  
    166                 bufferFill = bufferTime / player._model.config.bufferlength * 100; 
    167                  
    168                 // TODO: Buffer underrun 
    169                 if (false) { 
    170                         if (bufferFill < 25 && _state == jwplayer.html5.states.PLAYING) { 
    171                                 _setState(jwplayer.html5.states.BUFFERING); 
    172                                 _bufferFull = false; 
    173                                 if (!_domelement.seeking) { 
    174                                         _domelement.pause(); 
    175                                 } 
    176                         } else if (bufferFill > 95 && _state == jwplayer.html5.states.BUFFERING && _bufferFull === false && bufferTime > 0) { 
    177                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
    178                         } 
    179                 } 
    180                  
    181                 if (_bufferFull === false) { 
    182                         _bufferFull = true; 
    183                         player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
    184                 } 
    185                  
    186                 if (!_bufferingComplete) { 
    187                         if (bufferPercent == 100 && _bufferingComplete === false) { 
    188                                 _bufferingComplete = true; 
    189                         } 
    190                          
    191                         if (!jwplayer.html5.utils.isNull(bufferPercent)) { 
    192                                 player._model.buffer = Math.round(bufferPercent); 
    193                                 player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, { 
    194                                         bufferPercent: Math.round(bufferPercent) 
    195                                         //bufferingComplete: _bufferingComplete, 
    196                                         //bufferFull: _bufferFull, 
    197                                         //bufferFill: bufferFill, 
    198                                         //bufferTime: bufferTime 
    199                                 }); 
    200                         } 
    201                          
    202                 } 
    203         } 
    204          
    205          
    206         function _startInterval(player) { 
    207                 if (_interval === null) { 
    208                         _interval = window.setInterval(function() { 
    209                                 _positionHandler({}, player); 
    210                         }, 100); 
    211                 } 
    212         } 
    213          
    214          
    215         function _errorHandler(event, player) { 
    216                 player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, {}); 
    217         } 
    218          
    219          
    220         function _play(player) { 
    221                 return function() { 
    222                         if (_state != jwplayer.html5.states.PLAYING) { 
    223                                 _setState(player, jwplayer.html5.states.PLAYING); 
    224                                 _domelement.play(); 
    225                         } 
    226                 }; 
    227         } 
    228          
    229          
    230         /** Switch the pause state of the player. **/ 
    231         function _pause(player) { 
    232                 return function() { 
    233                         _domelement.pause(); 
    234                 }; 
    235         } 
    236          
    237          
    238         /** Seek to a position in the video. **/ 
    239         function _seek(player) { 
    240                 return function(position) { 
    241                         _domelement.currentTime = position; 
    242                         _domelement.play(); 
    243                 }; 
    244         } 
    245          
    246          
    247         /** Stop playback and loading of the video. **/ 
    248         function _stop(player) { 
    249                 return function() { 
    250                         _stopped = true; 
    251                         _domelement.pause(); 
    252                         clearInterval(_interval); 
    253                         _interval = undefined; 
    254                         player._model.position = 0; 
    255                         _setState(player, jwplayer.html5.states.IDLE); 
    256                 }; 
    257         } 
    258          
    259          
    260         /** Change the video's volume level. **/ 
    261         function _volume(player) { 
    262                 return function(position) { 
    263                         player._model.volume = position; 
    264                         _domelement.volume = position / 100; 
    265                         player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, { 
    266                                 volume: Math.round(_domelement.volume * 100) 
    267                         }); 
    268                 }; 
    269         } 
    270          
    271          
    272         /** Switch the mute state of the player. **/ 
    273         function _mute(player) { 
    274                 return function(state) { 
    275                         player._model.mute = state; 
    276                         _domelement.muted = state; 
    277                         player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, { 
    278                                 mute: _domelement.muted 
    279                         }); 
    280                 }; 
    281         } 
    282          
    283          
    284         /** Resize the player. **/ 
    285         function _resize(player) { 
    286                 return function(width, height) { 
    287                         // TODO: Fullscreen 
    288                         if (false) { 
    289                                 $("#" + player.id + "_jwplayer").css("position", 'fixed'); 
    290                                 $("#" + player.id + "_jwplayer").css("top", '0'); 
    291                                 $("#" + player.id + "_jwplayer").css("left", '0'); 
    292                                 $("#" + player.id + "_jwplayer").css("width", width); 
    293                                 $("#" + player.id + "_jwplayer").css("height", height); 
    294                                 player._model.width = $("#" + player.id + "_jwplayer").width; 
    295                                 player._model.height = $("#" + player.id + "_jwplayer").height; 
    296                         } 
    297                         player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_RESIZE, { 
    298                                 fullscreen: player._model.fullscreen, 
     266                        _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_RESIZE, { 
     267                                fullscreen: _model.fullscreen, 
    299268                                width: width, 
    300269                                hieght: height 
    301270                        }); 
    302271                }; 
    303         } 
    304          
    305          
    306         /** Switch the fullscreen state of the player. **/ 
    307         function _fullscreen(player) { 
    308                 return function(state) { 
    309                         player._model.fullscreen = state; 
     272                 
     273                 
     274                /** Switch the fullscreen state of the player. **/ 
     275                this.fullscreen = function(state) { 
    310276                        if (state === true) { 
    311                                 player.resize("100%", "100%"); 
     277                                this.resize("100%", "100%"); 
    312278                        } else { 
    313                                 player.resize(player._model.config.width, player._model.config.height); 
    314                         } 
    315                 }; 
    316         } 
    317          
    318          
    319         /** Load a new video into the player. **/ 
    320         function _load(player) { 
    321                 return function(playlistItem) { 
    322                         _domelement = _insertVideoTag(player, playlistItem); 
    323                         _jdomelement = $(_domelement); 
    324                         $.each(_events, function(event, handler) { 
    325                                 _domelement.addEventListener(event, function(event) { 
    326                                         handler(event, player); 
     279                                this.resize(_model.config.width, _model.config.height); 
     280                        } 
     281                }; 
     282                 
     283                 
     284                /** Load a new video into the player. **/ 
     285                this.load = function(playlistItem) { 
     286                        _embed(playlistItem); 
     287                         
     288                        _bufferFull = false; 
     289                        _bufferingComplete = false; 
     290                        _start = false; 
     291                        setTimeout(function() { 
     292                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_LOADED); 
     293                                _setState(jwplayer.api.events.state.BUFFERING); 
     294                                _positionHandler(); 
     295                        }, 25); 
     296                }; 
     297                 
     298                _embed = function(playlistItem) { 
     299                        var vid = document.createElement("video"); 
     300                        vid.preload = "none"; 
     301                        vid.loop = _model.config.repeat; 
     302                        for (var sourceIndex in playlistItem.levels) { 
     303                                var sourceModel = playlistItem.levels[sourceIndex]; 
     304                                var source = _container.ownerDocument.createElement("source"); 
     305                                source.src = jwplayer.html5.utils.getAbsolutePath(sourceModel.file); 
     306                                if (sourceModel.type === undefined) { 
     307                                        var extension = jwplayer.html5.utils.extension(sourceModel.file); 
     308                                        if (jwplayer.html5.extensionmap[extension] !== undefined) { 
     309                                                source.type = jwplayer.html5.extensionmap[extension]; 
     310                                        } else { 
     311                                                source.type = 'video/' + extension + ';'; 
     312                                        } 
     313                                } else { 
     314                                        source.type = sourceModel.type; 
     315                                } 
     316                                vid.appendChild(source); 
     317                        } 
     318                        vid.style.position = _container.style.position; 
     319                        vid.style.top = _container.style.top; 
     320                        vid.style.left = _container.style.left; 
     321                        vid.style.width = _container.style.width; 
     322                        vid.style.height = _container.style.height; 
     323                        vid.style.zIndex = _container.style.zIndex; 
     324                        vid.onload = _loadHandler; 
     325                        vid.volume = 0; 
     326                        _container.parentNode.replaceChild(vid, _container); 
     327                        vid.id = _container.id; 
     328                        _container = vid; 
     329                        for (var event in _events) { 
     330                                _container.addEventListener(event, function(evt) { 
     331                                        if (evt.target.parentNode !== null) { 
     332                                                _events[evt.type](evt); 
     333                                        } 
    327334                                }, true); 
    328                         }); 
    329                         if (_jdomelement.css('display') == 'none') { 
    330                                 _jdomelement.css('display', 'block'); 
    331                         } 
    332                         setTimeout(function() { 
    333                                 _bufferFull = false; 
    334                                 _bufferingComplete = false; 
    335                                 _setState(player, jwplayer.html5.states.BUFFERING); 
    336                                 _startInterval(player); 
    337                                 try { 
    338                                         _domelement.currentTime = 0;                                     
    339                                 } catch (err){ 
    340                                          
    341                                 } 
    342                         }, 25); 
    343                 }; 
    344         } 
    345          
    346         function _insertVideoTag(player, playlistItem) { 
    347                 var div1 = document.getElementById(player.id); 
    348                 var vid = div1.ownerDocument.createElement("video"); 
    349                 //vid.controls = "none"; 
    350                 if (vid.autobuffer){ 
    351                         vid.autobuffer = player._model.config.autoplay; 
    352                 } else if (vid.autoplay){ 
    353                         vid.autoplay = player._model.config.autoplay; 
    354                 } 
    355                 for (var sourceIndex in playlistItem.sources){ 
    356                         var sourceModel = playlistItem.sources[sourceIndex]; 
    357                         var source = div1.ownerDocument.createElement("source"); 
    358                         source.src = jwplayer.html5.utils.getAbsolutePath(sourceModel.file); 
    359                         if (sourceModel.type === undefined) { 
    360                                 var extension = jwplayer.html5.utils.extension(sourceModel.file); 
    361                                 if (extension == "ogv") { 
    362                                         extension = "ogg"; 
    363                                 } 
    364                                 source.type = 'video/' + extension + ';'; 
    365                         } else { 
    366                                 source.type = sourceModel.type; 
    367                         } 
    368                         vid.appendChild(source); 
    369                 } 
    370                 vid.width = player._model.config.width; 
    371                 vid.height = player._model.config.height; 
    372                 var styles = { 
    373                         position: 'absolute', 
    374                         width: player._model.config.width + 'px', 
    375                         height: player._model.config.height + 'px', 
    376                         top: 0, 
    377                         left: 0, 
    378                         'z-index': 0, 
    379                         margin: 'auto', 
    380                         display: 'block' 
    381                 }; 
    382                 for (var style in styles){ 
    383                         vid.style[style] = styles[style]; 
    384                 } 
    385                 div1.parentNode.replaceChild(vid, div1); 
    386                 vid.id = player.id; 
    387                 return vid; 
    388         } 
    389          
    390          
     335                        } 
     336                }; 
     337                 
     338                this.embed = _embed; 
     339                 
     340                return this; 
     341        }; 
    391342})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.model.js

    r1277 r1278  
    77(function(jwplayer) { 
    88 
    9         var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen"]; 
    10  
    11         jwplayer.html5.model = function(options) { 
    12                 $.extend(this.config, options); 
    13                 if (this.config.playlist && this.config.playlist.length > 0){ 
    14                         this.playlist = this.config.playlist; 
    15                         delete this.config.playlist; 
    16                 } else if (this.config.sources && this.config.sources.length > 0) { 
    17                         this.playlist = [{"sources": this.config.sources}]; 
    18                         delete this.config.sources; 
     9        var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen", "item", "plugins"]; 
     10         
     11        jwplayer.html5.model = function(api, container, options) { 
     12                var _api = api; 
     13                var _container = container; 
     14                var _model = { 
     15                        id: _container.id, 
     16                        media: undefined, 
     17                        playlist: [], 
     18                        state: jwplayer.api.events.state.IDLE, 
     19                        position: 0, 
     20                        buffer: 0, 
     21                        config: { 
     22                                width: 480, 
     23                                height: 320, 
     24                                item: 0, 
     25                                skin: undefined, 
     26                                file: undefined, 
     27                                image: undefined, 
     28                                start: 0, 
     29                                duration: 0, 
     30                                bufferlength: 5, 
     31                                volume: 90, 
     32                                mute: false, 
     33                                fullscreen: false, 
     34                                repeat: false, 
     35                                autostart: false, 
     36                                debug: undefined, 
     37                                screencolor: undefined 
     38                        } 
     39                }; 
     40                var _media; 
     41                var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 
     42                var _components = ["display", "logo", "controlbar"]; 
     43                 
     44                jwplayer.utils.extend(_model, _eventDispatcher); 
     45                 
     46                for (var option in options) { 
     47                        if (typeof options[option] == "string") { 
     48                                var type = /color$/.test(option) ? "color" : null; 
     49                                options[option] = jwplayer.html5.utils.typechecker(options[option], type); 
     50                        } 
     51                        var config = _model.config; 
     52                        var path = option.split("."); 
     53                        for (var edge in path) { 
     54                                if (edge == path.length - 1) { 
     55                                        config[path[edge]] = options[option]; 
     56                                } else { 
     57                                        if (config[path[edge]] === undefined) { 
     58                                                config[path[edge]] = {}; 
     59                                        } 
     60                                        config = config[path[edge]]; 
     61                                } 
     62                        } 
    1963                } 
    2064                for (var index in _configurableStateVariables) { 
    2165                        var configurableStateVariable = _configurableStateVariables[index]; 
    22                         this[configurableStateVariable] = this.config[configurableStateVariable]; 
     66                        _model[configurableStateVariable] = _model.config[configurableStateVariable]; 
    2367                } 
    24                 return this; 
     68                 
     69                var pluginorder = _components.concat([]); 
     70                 
     71                if (_model.plugins !== undefined) { 
     72                        var userplugins = _model.plugins.split(","); 
     73                        for (var userplugin in userplugins){ 
     74                                pluginorder.push(userplugin.replace(/^\s+|\s+$/g,"")); 
     75                        } 
     76                }                
     77                                 
     78                _model.plugins = { 
     79                        order: pluginorder, 
     80                        config: { 
     81                                display: { 
     82                                        position: jwplayer.html5.view.positions.OVER, 
     83                                        screencolor: _model.config.screencolor 
     84                                }, 
     85                                logo: { 
     86                                        position: "bottom-left" 
     87                                }, 
     88                                controlbar: { 
     89                                        position: jwplayer.html5.view.positions.BOTTOM 
     90                                } 
     91                        }, 
     92                        object: {} 
     93                }; 
     94                 
     95                for (var pluginIndex in _model.plugins.order) { 
     96                        var pluginName = _model.plugins.order[pluginIndex]; 
     97                        var pluginConfig = _model.config[pluginName] === undefined ? {} : _model.config[pluginName]; 
     98                        _model.plugins.config[pluginName] = _model.plugins.config[pluginName] === undefined ? pluginConfig : jwplayer.utils.extend(_model.plugins.config[pluginName], pluginConfig); 
     99                        if (_model.plugins.config[pluginName].position === undefined) { 
     100                                _model.plugins.config[pluginName].position = jwplayer.html5.view.positions.OVER; 
     101                        } 
     102                } 
     103                 
     104                _model.loadPlaylist = function(playlist, ready) { 
     105                        ready = ready === null ? true : false; 
     106                        _model.playlist = new jwplayer.html5.playlist(playlist); 
     107                        if (ready) { 
     108                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 
     109                                _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 
     110                                        "item": _model.config.item 
     111                                }); 
     112                        } 
     113                        _model.setActiveMediaProvider(_model.playlist[_model.item]); 
     114                }; 
     115                 
     116                function forward(evt) { 
     117                        if (evt.type == jwplayer.api.events.JWPLAYER_MEDIA_LOADED) { 
     118                                _container = _media.getDisplayElement(); 
     119                        } 
     120                        _eventDispatcher.sendEvent(evt.type, evt); 
     121                } 
     122                 
     123                _model.setActiveMediaProvider = function(playlistItem) { 
     124                        if (_media !== undefined) { 
     125                                _media.resetEventListeners(); 
     126                        } 
     127                        _media = new jwplayer.html5.mediavideo(_model, _container); 
     128                        _media.addGlobalListener(forward); 
     129                        if (_model.config.chromeless) { 
     130                                _media.embed(playlistItem); 
     131                        } 
     132                        return true; 
     133                }; 
     134                 
     135                _model.getMedia = function() { 
     136                        return _media; 
     137                }; 
     138                 
     139                _model.setupPlugins = function() { 
     140                        for (var plugin in _model.plugins.order) { 
     141                                if (jwplayer.html5[_model.plugins.order[plugin]] !== undefined) { 
     142                                        _model.plugins.object[_model.plugins.order[plugin]] = new jwplayer.html5[_model.plugins.order[plugin]](_api, _model.plugins.config[_model.plugins.order[plugin]]); 
     143                                } else { 
     144                                        _model.plugins.object[_model.plugins.order[plugin]] = new window[_model.plugins.order[plugin]](_api, _model.plugins.config[_model.plugins.order[plugin]]); 
     145                                } 
     146                        } 
     147                }; 
     148                 
     149                return _model; 
    25150        }; 
    26151         
    27         jwplayer.html5.model.prototype = { 
    28                 components: {}, 
    29                 playlist: [], 
    30                 state: jwplayer.html5.states.IDLE, 
    31                 item: 0, 
    32                 position: 0, 
    33                 buffer: 0, 
    34                 config: { 
    35                         width: 480, 
    36                         height: 320, 
    37                         skin: undefined, 
    38                         file: undefined, 
    39                         image: undefined, 
    40                         start: 0, 
    41                         duration: 0, 
    42                         bufferlength: 5, 
    43                         volume: 90, 
    44                         mute: false, 
    45                         fullscreen: false, 
    46                         repeat: false, 
    47                         autostart: false, 
    48                         debug: undefined, 
    49                         screencolor: '' 
    50                 } 
    51         }; 
    52152         
    53         jwplayer.html5.model.setActiveMediaProvider = function(player) { 
    54                 player._media = jwplayer.html5.mediavideo(player);       
    55                 return true; 
    56         };       
    57153})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.utils.js

    r1277 r1278  
    88 
    99        jwplayer.html5.utils = function() { 
    10                 return this.each(function() { 
    11                 }); 
    1210        }; 
    13          
    14  
    1511         
    1612        /** Returns the extension of a file name **/ 
    1713        jwplayer.html5.utils.extension = function(path) { 
    18                 return path.substr(path.lastIndexOf('.') + 1, path.length); 
    19         }; 
    20          
    21         jwplayer.html5.utils.isNull = function(obj) { 
    22                 return ((obj === null) || (obj === undefined) || (obj === "")); 
     14                return path.substr(path.lastIndexOf('.') + 1, path.length).toLowerCase(); 
    2315        }; 
    2416         
    2517        /** Gets an absolute file path based on a relative filepath **/ 
    2618        jwplayer.html5.utils.getAbsolutePath = function(path) { 
    27                 if (jwplayer.html5.utils.isNull(path)) { 
    28                         return path; 
     19                if (path === undefined) { 
     20                        return undefined; 
    2921                } 
    3022                if (isAbsolutePath(path)) { 
     
    3224                } 
    3325                var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 
    34                 var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 
     26                var basepath = document.location.href.split("?")[0]; 
     27                basepath = basepath.substring(protocol.length, (path.indexOf("/") === 0) ? basepath.indexOf('/', protocol.length) : basepath.lastIndexOf('/')); 
    3528                var patharray = (basepath + "/" + path).split("/"); 
    3629                var result = []; 
    3730                for (var i = 0; i < patharray.length; i++) { 
    38                         if (jwplayer.html5.utils.isNull(patharray[i]) || patharray[i] == ".") { 
     31                        if (patharray[i] === undefined || patharray[i] == ".") { 
    3932                                continue; 
    4033                        } else if (patharray[i] == "..") { 
     
    4841         
    4942        function isAbsolutePath(path) { 
    50                 if (jwplayer.html5.utils.isNull(path)) { 
     43                if (path === null) { 
    5144                        return; 
    5245                } 
     
    7265        }; 
    7366         
    74          
    75         /** Dumps the content of an object to a string **/ 
    76         jwplayer.html5.utils.dump = function(object, depth) { 
    77                 if (object === null) { 
    78                         return 'null'; 
    79                 } else if (jwplayer.html5.utils.typeOf(object) != 'object') { 
    80                         if (jwplayer.html5.utils.typeOf(object) == 'string') { 
    81                                 return "\"" + object + "\""; 
    82                         } 
    83                         return object; 
    84                 } 
    85                  
    86                 var type = jwplayer.html5.utils.typeOf(object); 
    87                  
    88                 depth = (depth === undefined) ? 1 : depth + 1; 
    89                 var indent = ""; 
    90                 for (var i = 0; i < depth; i++) { 
    91                         indent += "\t"; 
    92                 } 
    93                  
    94                 var result = (type == "array") ? "[" : "{"; 
    95                 result += "\n" + indent; 
    96                  
    97                 for (var i in object) { 
    98                         if (type == "object") { 
    99                                 result += "\"" + i + "\": "; 
    100                         } 
    101                         result += jwplayer.html5.utils.dump(object[i], depth) + ",\n" + indent; 
    102                 } 
    103                  
    104                 result = result.substring(0, result.length - 2 - depth) + "\n"; 
    105                  
    106                 result += indent.substring(0, indent.length - 1); 
    107                 result += (type == "array") ? "]" : "}"; 
    108                  
    109                 return result; 
    110         }; 
    111          
    112         /** Returns the true type of an object **/ 
    113         jwplayer.html5.utils.typeOf = function(value) { 
    114                 var s = typeof value; 
    115                 if (s === 'object') { 
    116                         if (value) { 
    117                                 if (value instanceof Array) { 
    118                                         s = 'array'; 
    119                                 } 
    120                         } else { 
    121                                 s = 'null'; 
    122                         } 
    123                 } 
    124                 return s; 
    125         }; 
    126          
    127          
    12867        /** Logger **/ 
    12968        jwplayer.html5.utils.log = function(msg, obj) { 
    130                 try { 
    131                         if (obj) { 
    132                                 console.log("%s: %o", msg, obj); 
    133                         } else { 
    134                                 console.log(jwplayer.html5.utils.dump(msg)); 
    135                         } 
    136                 } catch (err) { 
     69                if (obj) { 
     70                        obj.message = msg; 
     71                        console.log(msg, obj); 
     72                } else { 
     73                        console.log(msg); 
    13774                } 
    13875                return this; 
    13976        }; 
    14077         
    141          
     78        jwplayer.html5.utils.css = function(domelement, styles, debug) { 
     79                if (domelement !== undefined) { 
     80                        for (var style in styles) { 
     81                                try { 
     82                                        if (typeof styles[style] == "number" && !(style == "zIndex" || style == "opacity")) { 
     83                                                styles[style] = styles[style] + "px"; 
     84                                        } 
     85                                        domelement.style[style] = styles[style]; 
     86                                } catch (err) { 
     87                                } 
     88                        } 
     89                } 
     90        }; 
    14291})(jwplayer); 
  • trunk/html5/src/html5/jwplayer.html5.view.js

    r1277 r1278  
    66 */ 
    77(function(jwplayer) { 
    8  
    9         jwplayer.html5.view = function(player) { 
    10                 player._model.domelement.wrap("<div id='" + player.id + "_jwplayer' />"); 
    11                 player._model.domelement.parent().css({ 
    12                         position: 'relative', 
    13                         height: player._model.config.height + 'px', 
    14                         width: player._model.config.width + 'px', 
    15                         margin: 'auto', 
    16                         padding: 0, 
    17                         'background-color': player._model.config.screencolor 
    18                 }); 
    19                 player._model.domelement.css({ 
    20                         position: 'absolute', 
    21                         width: player._model.config.width + 'px', 
    22                         height: player._model.config.height + 'px', 
    23                         top: 0, 
    24                         left: 0, 
    25                         'z-index': 0, 
    26                         margin: 'auto', 
    27                         display: 'block' 
    28                 }); 
     8         
     9        var _css = jwplayer.html5.utils.css; 
     10         
     11        jwplayer.html5.view = function(api, container, model) { 
     12                var _api = api; 
     13                var _container = container; 
     14                var _model = model; 
     15                var _wrapper; 
     16                var _width; 
     17                var _height; 
     18                var _box; 
     19                 
     20                function createWrapper() { 
     21                        _wrapper = document.createElement("div"); 
     22                        _wrapper.id = _container.id; 
     23                        _container.id = _wrapper.id + "_video"; 
     24                         
     25                        _css(_wrapper, { 
     26                                position: "relative", 
     27                                height: _model.height, 
     28                                width: _model.width, 
     29                                margin: "auto", 
     30                                padding: 0, 
     31                                background: _api.skin.getComponentSettings("display").backgroundcolor === undefined ? "#000" : _api.skin.getComponentSettings("display").backgroundcolor.replace("0x", "#"), 
     32                                zIndex: 0 
     33                        }); 
     34                         
     35                        _css(_container, { 
     36                                position: "absolute", 
     37                                width: _model.width, 
     38                                height: _model.height, 
     39                                top: 0, 
     40                                left: 0, 
     41                                zIndex: 1, 
     42                                margin: "auto", 
     43                                display: "block" 
     44                        }); 
     45                         
     46                        jwplayer.utils.wrap(_container, _wrapper); 
     47                } 
     48                 
     49                function layoutComponents() { 
     50                        if (_model.getMedia() !== undefined && !_model.getMedia().hasChrome && !_model.config.chromeless) { 
     51                                for (var pluginIndex in _model.plugins.order) { 
     52                                        var pluginName = _model.plugins.order[pluginIndex]; 
     53                                        if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 
     54                                                _container.parentNode.appendChild(_model.plugins.object[pluginName].getDisplayElement()); 
     55                                                _model.plugins.object[pluginName].height = getNumber(_model.plugins.object[pluginName].getDisplayElement().style.height); 
     56                                                _model.plugins.object[pluginName].width = getNumber(_model.plugins.object[pluginName].getDisplayElement().style.width); 
     57                                        } 
     58                                } 
     59                        } else { 
     60                                _model.getMedia().getDisplayElement().poster = _model.playlist[_model.item].image; 
     61                                _model.getMedia().getDisplayElement().controls = "controls"; 
     62                        } 
     63                } 
     64                 
     65                function getNumber(style) { 
     66                        if (style === "") { 
     67                                return 0; 
     68                        } 
     69                        return parseInt(style.replace("px", ""), 10); 
     70                } 
     71                 
     72                this.setup = function(container) { 
     73                        _container = container; 
     74                        createWrapper(); 
     75                        layoutComponents(); 
     76                        _resize(_model.width, _model.height); 
     77                        var oldresize; 
     78                        if (window.onresize !== null) { 
     79                                oldresize = window.onresize; 
     80                        } 
     81                        window.onresize = function(evt) { 
     82                                if (oldresize !== undefined) { 
     83                                        try { 
     84                                                oldresize(evt); 
     85                                        } catch (err) { 
     86                                         
     87                                        } 
     88                                } 
     89                                if (_api.jwGetFullscreen()) { 
     90                                        _model.width = document.documentElement.clientWidth; 
     91                                        _model.height = document.documentElement.clientHeight; 
     92                                } 
     93                                _resize(_model.width, _model.height); 
     94                        }; 
     95                }; 
     96                 
     97                function _resize(width, height) { 
     98                        var plugins = [].concat(_model.plugins.order); 
     99                        plugins.reverse(); 
     100                        if (!_model.fullscreen) { 
     101                                _width = width; 
     102                                _height = height; 
     103                                _box = { 
     104                                        top: 0, 
     105                                        right: 0, 
     106                                        bottom: 0, 
     107                                        left: 0 
     108                                }; 
     109                                var failed = _resizeComponents(_normalscreenComponentResizer, plugins); 
     110                                if (failed.length > 0) { 
     111                                        _resizeComponents(_overlayComponentResizer, failed, true); 
     112                                } 
     113                                _resizeMedia(); 
     114                        } else { 
     115                                _resizeComponents(_fullscreenComponentResizer, plugins, true); 
     116                        } 
     117                } 
     118                 
     119                function _resizeComponents(componentResizer, plugins, looseStyle) { 
     120                        var _zIndex = plugins.length; 
     121                        var failed = []; 
     122                        for (var pluginIndex in plugins) { 
     123                                var pluginName = plugins[pluginIndex]; 
     124                                if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 
     125                                        var style = componentResizer(pluginName, _zIndex--); 
     126                                        if (!style) { 
     127                                                failed.push(pluginName); 
     128                                        } else { 
     129                                                var suggestedStyle = _model.plugins.object[pluginName].resize(style.width, style.height); 
     130                                                if (looseStyle === true) { 
     131                                                        jwplayer.utils.extend(style, suggestedStyle); 
     132                                                } 
     133                                                _css(_model.plugins.object[pluginName].getDisplayElement(), style); 
     134                                        } 
     135                                } 
     136                        } 
     137                        return failed; 
     138                } 
     139                 
     140                function _normalscreenComponentResizer(pluginName, zIndex) { 
     141                        if (_model.plugins.object[pluginName].getDisplayElement !== undefined) { 
     142                                if (_model.plugins.config[pluginName].position !== jwplayer.html5.view.positions.OVER) { 
     143                                        var style = _getComponentPosition(pluginName); 
     144                                        style.zIndex = zIndex; 
     145                                        return style; 
     146                                } 
     147                        } 
     148                        return false; 
     149                } 
     150                 
     151                function _overlayComponentResizer(pluginName, zIndex) { 
     152                        return { 
     153                                position: "absolute", 
     154                                top: _box.top, 
     155                                left: _box.left, 
     156                                width: (_model.width - _box.left - _box.right), 
     157                                height: (_model.height - _box.top - _box.bottom), 
     158                                zIndex: zIndex 
     159                        }; 
     160                } 
     161                 
     162                function _fullscreenComponentResizer(pluginName, zIndex) { 
     163                        return { 
     164                                position: "fixed", 
     165                                top: 0, 
     166                                left: 0, 
     167                                width: _model.width, 
     168                                height: _model.height, 
     169                                zIndex: zIndex 
     170                        }; 
     171                } 
     172                 
     173                function _resizeMedia() { 
     174                        _css(_model.getMedia().getDisplayElement(), { 
     175                                position: "absolute", 
     176                                width: (_model.width - _box.left - _box.right), 
     177                                height: (_model.height - _box.top - _box.bottom), 
     178                                top: _box.top, 
     179                                left: _box.left 
     180                        }); 
     181                } 
     182                 
     183                function _getComponentPosition(pluginName) { 
     184                        var plugincss = { 
     185                                position: "absolute", 
     186                                margin: 0, 
     187                                padding: 0, 
     188                                top: null 
     189                        }; 
     190                        var position = _model.plugins.config[pluginName].position.toLowerCase(); 
     191                        switch (position.toUpperCase()) { 
     192                                case jwplayer.html5.view.positions.TOP: 
     193                                        plugincss.top = _box.top; 
     194                                        plugincss.left = _box.left; 
     195                                        plugincss.width = _width - _box.left - _box.right; 
     196                                        plugincss.height = _model.plugins.object[pluginName].height; 
     197                                        _box[position] += _model.plugins.object[pluginName].height; 
     198                                        break; 
     199                                case jwplayer.html5.view.positions.RIGHT: 
     200                                        plugincss.top = _box.top; 
     201                                        plugincss.right = _box.right; 
     202                                        plugincss.width = plugincss.width = _model.plugins.object[pluginName].width; 
     203                                        plugincss.height = _height - _box.top - _box.bottom; 
     204                                        _box[position] = plugincss.width = _model.plugins.object[pluginName].width; 
     205                                        break; 
     206                                case jwplayer.html5.view.positions.BOTTOM: 
     207                                        plugincss.bottom = _box.bottom; 
     208                                        plugincss.left = _box.left; 
     209                                        plugincss.width = _width - _box.left - _box.right; 
     210                                        plugincss.height = _model.plugins.object[pluginName].height; 
     211                                        _box[position] = _model.plugins.object[pluginName].height; 
     212                                        break; 
     213                                case jwplayer.html5.view.positions.LEFT: 
     214                                        plugincss.top = _box.top; 
     215                                        plugincss.left = _box.left; 
     216                                        plugincss.width = _model.plugins.object[pluginName].width; 
     217                                        plugincss.height = _height - _box.top - _box.bottom; 
     218                                        _box[position] = plugincss.width = _model.plugins.object[pluginName].width; 
     219                                        break; 
     220                                default: 
     221                                        break; 
     222                        } 
     223                        return plugincss; 
     224                } 
     225                 
     226                 
     227                this.resize = _resize; 
     228                 
     229                this.fullscreen = function(state) { 
     230                        if (_model.getMedia().getDisplayElement().webkitSupportsFullscreen) { 
     231                                if (state) { 
     232                                        _model.height = screen.availHeight; 
     233                                        _model.width = screen.availWidth; 
     234                                        _model.getMedia().getDisplayElement().webkitEnterFullscreen(); 
     235                                } else { 
     236                                        _model.height = _height; 
     237                                        _model.width = _width; 
     238                                        _model.getMedia().getDisplayElement().webkitExitFullscreen(); 
     239                                } 
     240                        } else { 
     241                                if (state) { 
     242                                        _model.width = document.documentElement.clientWidth; 
     243                                        _model.height = document.documentElement.clientHeight; 
     244                                        var style = { 
     245                                                position: "fixed", 
     246                                                width: "100%", 
     247                                                height: "100%", 
     248                                                top: 0, 
     249                                                left: 0, 
     250                                                zIndex: 2147483000 
     251                                        }; 
     252                                        _css(_wrapper, style); 
     253                                        style.zIndex = 0; 
     254                                        _css(_model.getMedia().getDisplayElement(), style); 
     255                                } else { 
     256                                        _model.width = _width; 
     257                                        _model.height = _height; 
     258                                        _css(_wrapper, { 
     259                                                position: "relative", 
     260                                                height: _model.height, 
     261                                                width: _model.width, 
     262                                                zIndex: 0 
     263                                        }); 
     264                                } 
     265                                _resize(_model.width, _model.height); 
     266                        } 
     267                }; 
     268                 
     269        }; 
     270         
     271        jwplayer.html5.view.positions = { 
     272                TOP: "TOP", 
     273                RIGHT: "RIGHT", 
     274                BOTTOM: "BOTTOM", 
     275                LEFT: "LEFT", 
     276                OVER: "OVER" 
    29277        }; 
    30278})(jwplayer); 
Note: See TracChangeset for help on using the changeset viewer.