Changeset 1190


Ignore:
Timestamp:
07/28/10 15:02:06 (3 years ago)
Author:
zach
Message:

Updating with new structure

Location:
trunk/html5
Files:
5 added
2 deleted
11 edited
1 moved

Legend:

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

    r1030 r1190  
    33 
    44        <target name="clean"> 
    5                 <delete file="${basedir}/jquery.jwplayer.js" quiet="true"/> 
    6                 <delete file="${basedir}/jquery.jwplayer.min.js" quiet="true"/> 
     5                <delete file="${basedir}/jwplayer.js" quiet="true"/> 
     6                <delete file="${basedir}/jwplayer.min.js" quiet="true"/> 
    77        </target> 
    88 
    99        <target name="concat" depends="clean"> 
    10                 <concat destfile="${basedir}/jquery.jwplayer.js"> 
    11                         <fileset dir="${basedir}/src/" includes="*.js" /> 
     10                <concat destfile="${basedir}/jwplayer.js"> 
     11                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.js" /> 
     12                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.states.js" /> 
     13                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.events.js" /> 
     14                        <fileset dir="${basedir}/src/html5" includes="jwplayer.html5.*.js" excludes="jwplayer.html5.js,jwplayer.html5.states.js,jwplayer.html5.events.js" /> 
    1215                </concat> 
    1316        </target> 
     
    1922        <target name="build-release" depends="concat"> 
    2023                <java jar="${basedir}/build/yuicompressor-2.4.2.jar" fork="true"> 
    21                         <arg line="'${basedir}/jquery.jwplayer.js'"/> 
    22                         <arg line="-o '${basedir}/jquery.jwplayer.min.js'"/> 
     24                        <arg line="'${basedir}/jwplayer.js'"/> 
     25                        <arg line="-o '${basedir}/jwplayer.min.js'"/> 
    2326                </java> 
    2427        </target> 
    2528         
    2629        <target name="build-zip" depends="concat"> 
    27                  <zip destfile="${basedir}/mediaplayer-html5-beta.zip"> 
     30                 <zip destfile="${basedir}/mediaplayer-html5.zip"> 
    2831                        <fileset dir="." includes="license.txt"/> 
    2932                        <fileset dir="." includes="readme.txt"/> 
    30                         <fileset dir="." includes="jquery.jwplayer.js"/> 
    31                         <fileset dir="./lib" includes="jquery.js"/> 
     33                        <fileset dir="." includes="jwplayer.js"/> 
    3234                        <fileset dir="./assets/" includes="**/*.*" excludes=".svn,*.zip"/> 
    3335                 </zip> 
  • trunk/html5/src/html5/jwplayer.html5.controlbar.js

    r1189 r1190  
    77 * @lastmodifieddate 2010-04-11 
    88 */ 
    9 (function($) { 
    10         var controlbars = {}; 
    11          
    12         /** Hooking the jwplayerControlbar up to jQuery. **/ 
    13         $.fn.jwplayerControlbar = function(player, domelement) { 
    14                 controlbars[player.id] = $.extend({}, $.fn.jwplayerControlbar.defaults, player.config.plugins.controlbar); 
    15                 buildElements(player, domelement); 
    16                 buildHandlers(player); 
    17         }; 
    18          
    19         $.fn.jwplayerControlbar.positions = { 
    20                 BOTTOM: 'BOTTOM', 
    21                 TOP: 'TOP', 
    22                 OVER: 'OVER' 
    23         }; 
    24          
    25          
    26         /** Map with config for the jwplayerControlbar plugin. **/ 
    27         $.fn.jwplayerControlbar.defaults = { 
    28                 fontsize: 10, 
    29                 fontcolor: '000000', 
    30                 position: $.fn.jwplayerControlbar.positions.BOTTOM, 
    31                 leftmargin: 0, 
    32                 rightmargin: 0, 
    33                 scrubber: 'none' 
    34         }; 
    35          
    36         /** Draw the jwplayerControlbar elements. **/ 
    37         function buildElements(player, domelement) { 
    38                 // Draw the background. 
    39                 domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 
    40                 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 
    41                 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 
    42                 switch (controlbars[player.id].position) { 
    43                         case $.fn.jwplayerControlbar.positions.TOP: 
    44                                 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 
    45                                 break; 
    46                         default: 
    47                                 $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 
    48                                 domelement.parents(":first").css('height', parseInt(domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 
    49                                 break; 
    50                 } 
    51                 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 
    52                 // Draw all elements on top of the bar. 
    53                 buildElement('capLeft', 'left', true, player); 
    54                 buildElement('playButton', 'left', false, player); 
    55                 buildElement('pauseButton', 'left', true, player); 
    56                 buildElement('divider1', 'left', true, player); 
    57                 buildElement('elapsedText', 'left', true, player); 
    58                 buildElement('timeSliderRail', 'left', false, player); 
    59                 buildElement('timeSliderBuffer', 'left', false, player); 
    60                 buildElement('timeSliderProgress', 'left', false, player); 
    61                 buildElement('timeSliderThumb', 'left', false, player); 
    62                 buildElement('capRight', 'right', true, player); 
     9/** Hooking the jwplayerControlbar up to jQuery. **/ 
     10jwplayer.html5.controlbar = function(player) { 
     11        player._model.components.controlbar = $.extend({}, jwplayer.html5.controlbar.defaults, player.config.plugins.controlbar); 
     12        jwplayer.html5.controlbar.buildElements(player); 
     13        jwplayer.html5.controlbar.buildHandlers(player); 
     14}; 
     15 
     16jwplayer.html5.controlbar.positions = { 
     17        BOTTOM: 'BOTTOM', 
     18        TOP: 'TOP', 
     19        OVER: 'OVER' 
     20}; 
     21 
     22 
     23/** Map with config for the jwplayerControlbar plugin. **/ 
     24jwplayer.html5.controlbar.defaults = { 
     25        fontsize: 10, 
     26        fontcolor: '000000', 
     27        position: jwplayer.html5.controlbar.positions.BOTTOM, 
     28        leftmargin: 0, 
     29        rightmargin: 0, 
     30        scrubber: 'none' 
     31}; 
     32 
     33/** Draw the jwplayerControlbar elements. **/ 
     34jwplayer.html5.controlbar.buildElements = function(player) { 
     35        // Draw the background. 
     36        player._model.domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 
     37        $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 
     38        $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 
     39        switch (player._model.components.controlbar.position) { 
     40                case jwplayer.html5.controlbar.positions.TOP: 
     41                        $("#" + player.id + '_jwplayerControlbar').css('top', 0); 
     42                        break; 
     43                default: 
     44                        $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 
     45                        player._model.domelement.parents(":first").css('height', parseInt(player._model.domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 
     46                        break; 
     47        } 
     48        $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 
     49        // Draw all elements on top of the bar. 
     50        jwplayer.html5.controlbar.buildElement('capLeft', 'left', true, player); 
     51        jwplayer.html5.controlbar.buildElement('playButton', 'left', false, player); 
     52        jwplayer.html5.controlbar.buildElement('pauseButton', 'left', true, player); 
     53        jwplayer.html5.controlbar.buildElement('divider1', 'left', true, player); 
     54        jwplayer.html5.controlbar.buildElement('elapsedText', 'left', true, player); 
     55        jwplayer.html5.controlbar.buildElement('timeSliderRail', 'left', false, player); 
     56        jwplayer.html5.controlbar.buildElement('timeSliderBuffer', 'left', false, player); 
     57        jwplayer.html5.controlbar.buildElement('timeSliderProgress', 'left', false, player); 
     58        jwplayer.html5.controlbar.buildElement('timeSliderThumb', 'left', false, player); 
     59        jwplayer.html5.controlbar.buildElement('capRight', 'right', true, player); 
     60        // TODO 
     61        if (false) { 
     62                jwplayer.html5.controlbar.buildElement('fullscreenButton', 'right', false, player); 
     63                jwplayer.html5.controlbar.buildElement('normalscreenButton', 'right', true, player); 
     64                jwplayer.html5.controlbar.buildElement('divider2', 'right', true, player); 
     65        } 
     66        if (!jwplayer.html5.utils.isiPad()) { 
     67                jwplayer.html5.controlbar.buildElement('volumeSliderRail', 'right', false, player); 
     68                jwplayer.html5.controlbar.buildElement('volumeSliderProgress', 'right', true, player); 
     69                jwplayer.html5.controlbar.buildElement('muteButton', 'right', false, player); 
     70                jwplayer.html5.controlbar.buildElement('unmuteButton', 'right', true, player); 
     71                jwplayer.html5.controlbar.buildElement('divider3', 'right', true, player); 
     72        } 
     73        jwplayer.html5.controlbar.buildElement('durationText', 'right', true, player); 
     74}; 
     75 
     76 
     77/** Draw a single element into the jwplayerControlbar. **/ 
     78jwplayer.html5.controlbar.buildElement = function(element, align, offset, player) { 
     79        var nam = player.id + '_' + element; 
     80        $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 
     81        $('#' + nam).css('position', 'absolute'); 
     82        $('#' + nam).css('top', '0px'); 
     83        if (element.indexOf('Text') > 0) { 
     84                $('#' + nam).html('00:00'); 
     85                $('#' + nam).css('font', player._model.components.controlbar.fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 
     86                $('#' + nam).css('text-align', 'center'); 
     87                $('#' + nam).css('font-weight', 'bold'); 
     88                $('#' + nam).css('cursor', 'default'); 
     89                var wid = 14 + 3 * player._model.components.controlbar.fontsize; 
     90                $('#' + nam).css('color', '#' + player._model.components.controlbar.fontcolor.substr(-6)); 
     91        } else if (element.indexOf('divider') === 0) { 
     92                $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 
     93                var wid = player.skin.controlbar.elements.divider.width; 
     94        } else { 
     95                $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 
     96                var wid = player.skin.controlbar.elements[element].width; 
     97        } 
     98        if (align == 'left') { 
     99                $('#' + nam).css(align, player._model.components.controlbar.leftmargin); 
     100                if (offset) { 
     101                        player._model.components.controlbar.leftmargin += wid; 
     102                } 
     103        } else if (align == 'right') { 
     104                $('#' + nam).css(align, player._model.components.controlbar.rightmargin); 
     105                if (offset) { 
     106                        player._model.components.controlbar.rightmargin += wid; 
     107                } 
     108        } 
     109        $('#' + nam).css('width', wid); 
     110        $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 
     111}; 
     112 
     113 
     114/** Add interactivity to the jwplayerControlbar elements. **/ 
     115jwplayer.html5.controlbar.buildHandlers = function(player) { 
     116        // Register events with the buttons. 
     117        jwplayer.html5.controlbar.buildHandler('playButton', 'play', player); 
     118        jwplayer.html5.controlbar.buildHandler('pauseButton', 'pause', player); 
     119        jwplayer.html5.controlbar.buildHandler('muteButton', 'mute', player, true); 
     120        jwplayer.html5.controlbar.buildHandler('unmuteButton', 'mute', player, false); 
     121        jwplayer.html5.controlbar.buildHandler('fullscreenButton', 'fullscreen', player, true); 
     122        jwplayer.html5.controlbar.buildHandler('normalscreenButton', 'fullscreen', player, false); 
     123         
     124        jwplayer.html5.controlbar.addSliders(player); 
     125         
     126        // Register events with the player. 
     127        player.buffer(jwplayer.html5.controlbar.bufferHandler); 
     128        player.state(jwplayer.html5.controlbar.stateHandler); 
     129        player.time(jwplayer.html5.controlbar.timeHandler); 
     130        player.mute(jwplayer.html5.controlbar.muteHandler); 
     131        player.volume(jwplayer.html5.controlbar.volumeHandler); 
     132        player.complete(jwplayer.html5.controlbar.completeHandler); 
     133         
     134        // Trigger a few events so the bar looks good on startup. 
     135        jwplayer.html5.controlbar.resizeHandler({ 
     136                id: player.id, 
     137                fulscreen: player.fullscreen(), 
     138                width: player.width(), 
     139                height: player.height() 
     140        }); 
     141        jwplayer.html5.controlbar.timeHandler({ 
     142                id: player.id, 
     143                duration: player.duration(), 
     144                position: 0 
     145        }); 
     146        jwplayer.html5.controlbar.bufferHandler({ 
     147                id: player.id, 
     148                bufferProgress: 0 
     149        }); 
     150        jwplayer.html5.controlbar.muteHandler({ 
     151                id: player.id, 
     152                mute: player.mute() 
     153        }); 
     154        jwplayer.html5.controlbar.stateHandler({ 
     155                id: player.id, 
     156                newstate: jwplayer.html5.states.IDLE 
     157        }); 
     158        jwplayer.html5.controlbar.volumeHandler({ 
     159                id: player.id, 
     160                volume: player.volume() 
     161        }); 
     162}; 
     163 
     164 
     165/** Set a single button handler. **/ 
     166jwplayer.html5.controlbar.buildHandler = function(element, handler, player, args) { 
     167        var nam = player.id + '_' + element; 
     168        $('#' + nam).css('cursor', 'pointer'); 
     169        if (handler == 'fullscreen') { 
     170                $('#' + nam).mouseup(function(evt) { 
     171                        evt.stopPropagation(); 
     172                        player.fullscreen(!player.fullscreen()); 
     173                        jwplayer.html5.controlbar.resizeHandler({ 
     174                                id: player.id, 
     175                                fullscreen: player.fullscreen(), 
     176                                width: player.width(), 
     177                                height: player.height() 
     178                        }); 
     179                }); 
     180        } else { 
     181                $('#' + nam).mouseup(function(evt) { 
     182                        evt.stopPropagation(); 
     183                        if (!jwplayer.html5.utils.isNull(args)) { 
     184                                player[handler](args); 
     185                        } else { 
     186                                player[handler](); 
     187                        } 
     188                         
     189                }); 
     190        } 
     191}; 
     192 
     193 
     194/** Set the volume drag handler. **/ 
     195jwplayer.html5.controlbar.addSliders = function(player) { 
     196        var bar = '#' + player.id + '_jwplayerControlbar'; 
     197        var trl = '#' + player.id + '_timeSliderRail'; 
     198        var vrl = '#' + player.id + '_volumeSliderRail'; 
     199        $(bar).css('cursor', 'pointer'); 
     200        $(trl).css('cursor', 'pointer'); 
     201        $(vrl).css('cursor', 'pointer'); 
     202        $(bar).mousedown(function(evt) { 
     203                if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 
     204                        player._model.components.controlbar.scrubber = 'time'; 
     205                } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 
     206                        player._model.components.controlbar.scrubber = 'volume'; 
     207                } 
     208        }); 
     209        $(bar).mouseup(function(evt) { 
     210                evt.stopPropagation(); 
     211                jwplayer.html5.controlbar.sliderUp(evt.pageX, player); 
     212        }); 
     213        $(bar).mousemove(function(evt) { 
     214                if (player._model.components.controlbar.scrubber == 'time') { 
     215                        player._model.components.controlbar.mousedown = true; 
     216                        var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 
     217                        $('#' + player.id + '_timeSliderThumb').css('left', xps); 
     218                } 
     219        }); 
     220}; 
     221 
     222 
     223/** The slider has been moved up. **/ 
     224jwplayer.html5.controlbar.sliderUp = function(msx, player) { 
     225        player._model.components.controlbar.mousedown = false; 
     226        if (player._model.components.controlbar.scrubber == 'time') { 
     227                var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 
     228                var wid = $('#' + player.id + '_timeSliderRail').width(); 
     229                var pos = xps / wid * player._model.components.controlbar.currentDuration; 
     230                if (pos < 0) { 
     231                        pos = 0; 
     232                } else if (pos > player._model.components.controlbar.currentDuration) { 
     233                        pos = player._model.components.controlbar.currentDuration - 3; 
     234                } 
     235                player.seek(pos); 
     236                if (player._model.state != jwplayer.html5.states.PLAYING) { 
     237                        player.play(); 
     238                } 
     239        } else if (player._model.components.controlbar.scrubber == 'volume') { 
     240                var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 
     241                var wid = $('#' + player.id + '_volumeSliderRail').width(); 
     242                var pct = Math.round(xps / wid * 100); 
     243                if (pct < 0) { 
     244                        pct = 0; 
     245                } else if (pct > 100) { 
     246                        pct = 100; 
     247                } 
     248                if (player._model.mute) { 
     249                        player.mute(false); 
     250                } 
     251                player.volume(pct); 
     252        } 
     253        player._model.components.controlbar.scrubber = 'none'; 
     254}; 
     255 
     256 
     257/** Update the buffer percentage. **/ 
     258jwplayer.html5.controlbar.bufferHandler = function(event) { 
     259        if (!jwplayer.html5.utils.isNull(event.bufferPercent)) { 
     260                controlbars[event.id].currentBuffer = event.bufferPercent; 
     261        } 
     262         
     263        var wid = $('#' + event.id + '_timeSliderRail').width(); 
     264        var bufferWidth = isNaN(Math.round(wid * controlbars[event.id].currentBuffer / 100)) ? 0 : Math.round(wid * controlbars[event.id].currentBuffer / 100); 
     265        $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 
     266}; 
     267 
     268 
     269/** Update the mute state. **/ 
     270jwplayer.html5.controlbar.muteHandler = function(event) { 
     271        if (event.mute) { 
     272                $('#' + event.id + '_muteButton').css('display', 'none'); 
     273                $('#' + event.id + '_unmuteButton').css('display', 'block'); 
     274                $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 
     275        } else { 
     276                $('#' + event.id + '_muteButton').css('display', 'block'); 
     277                $('#' + event.id + '_unmuteButton').css('display', 'none'); 
     278                $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 
     279        } 
     280}; 
     281 
     282 
     283/** Update the playback state. **/ 
     284jwplayer.html5.controlbar.stateHandler = function(event) { 
     285        // Handle the play / pause button 
     286        if (event.newstate == jwplayer.html5.states.BUFFERING || event.newstate == jwplayer.html5.states.PLAYING) { 
     287                $('#' + event.id + '_pauseButton').css('display', 'block'); 
     288                $('#' + event.id + '_playButton').css('display', 'none'); 
     289        } else { 
     290                $('#' + event.id + '_pauseButton').css('display', 'none'); 
     291                $('#' + event.id + '_playButton').css('display', 'block'); 
     292        } 
     293         
     294        // Show / hide progress bar 
     295        if (event.newstate == jwplayer.html5.states.IDLE) { 
     296                $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 
     297                $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 
     298                $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 
     299        } else { 
     300                $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 
     301                if (event.newstate != jwplayer.html5.states.BUFFERING) { 
     302                        $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 
     303                        $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 
     304                } 
     305        } 
     306}; 
     307 
     308 
     309/** Handles event completion **/ 
     310jwplayer.html5.controlbar.completeHandler = function(event) { 
     311        jwplayer.html5.controlbar.timeHandler($.extend(event, { 
     312                position: 0, 
     313                duration: controlbars[event.id].currentDuration 
     314        })); 
     315}; 
     316 
     317 
     318/** Update the playback time. **/ 
     319jwplayer.html5.controlbar.timeHandler = function(event) { 
     320        if (!jwplayer.html5.utils.isNull(event.position)) { 
     321                controlbars[event.id].currentPosition = event.position; 
     322        } 
     323        if (!jwplayer.html5.utils.isNull(event.duration)) { 
     324                controlbars[event.id].currentDuration = event.duration; 
     325        } 
     326        var progress = (controlbars[event.id].currentPosition === controlbars[event.id].currentDuration === 0) ? 0 : controlbars[event.id].currentPosition / controlbars[event.id].currentDuration; 
     327        var railWidth = $('#' + event.id + '_timeSliderRail').width(); 
     328        var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 
     329        var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 
     330        var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
     331        var thumbPosition = railLeft + progressWidth; 
     332         
     333        $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 
     334        if (!controlbars[event.id].mousedown) { 
     335                $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 
     336        } 
     337         
     338        $('#' + event.id + '_durationText').html(jwplayer.html5.controlbar.timeFormat(controlbars[event.id].currentDuration)); 
     339        $('#' + event.id + '_elapsedText').html(jwplayer.html5.controlbar.timeFormat(controlbars[event.id].currentPosition)); 
     340}; 
     341 
     342 
     343/** Format the elapsed / remaining text. **/ 
     344jwplayer.html5.controlbar.timeFormat = function(sec) { 
     345        str = '00:00'; 
     346        if (sec > 0) { 
     347                str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 
     348                str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 
     349        } 
     350        return str; 
     351}; 
     352 
     353 
     354/** Flip the player size to/from full-browser-screen. **/ 
     355jwplayer.html5.controlbar.resizeHandler = function(event) { 
     356        controlbars[event.id].width = event.width; 
     357        controlbars[event.id].fullscreen = event.fullscreen; 
     358        if (event.fullscreen) { 
     359                $('#' + event.id + '_normalscreenButton').css('display', 'block'); 
     360                $('#' + event.id + '_fullscreenButton').css('display', 'none'); 
    63361                // TODO 
    64362                if (false) { 
    65                         buildElement('fullscreenButton', 'right', false, player); 
    66                         buildElement('normalscreenButton', 'right', true, player); 
    67                         buildElement('divider2', 'right', true, player); 
    68                 } 
    69                 if (!$.fn.jwplayerUtils.isiPad()) { 
    70                         buildElement('volumeSliderRail', 'right', false, player); 
    71                         buildElement('volumeSliderProgress', 'right', true, player); 
    72                         buildElement('muteButton', 'right', false, player); 
    73                         buildElement('unmuteButton', 'right', true, player); 
    74                         buildElement('divider3', 'right', true, player); 
    75                 } 
    76                 buildElement('durationText', 'right', true, player); 
    77         } 
    78          
    79          
    80         /** Draw a single element into the jwplayerControlbar. **/ 
    81         function buildElement(element, align, offset, player) { 
    82                 var nam = player.id + '_' + element; 
    83                 $('#' + player.id + '_jwplayerControlbar').append('<div id="' + nam + '"></div>'); 
    84                 $('#' + nam).css('position', 'absolute'); 
    85                 $('#' + nam).css('top', '0px'); 
    86                 if (element.indexOf('Text') > 0) { 
    87                         $('#' + nam).html('00:00'); 
    88                         $('#' + nam).css('font', controlbars[player.id].fontsize + 'px/' + (player.skin.controlbar.elements.background.height + 1) + 'px Arial,sans-serif'); 
    89                         $('#' + nam).css('text-align', 'center'); 
    90                         $('#' + nam).css('font-weight', 'bold'); 
    91                         $('#' + nam).css('cursor', 'default'); 
    92                         var wid = 14 + 3 * controlbars[player.id].fontsize; 
    93                         $('#' + nam).css('color', '#' + controlbars[player.id].fontcolor.substr(-6)); 
    94                 } else if (element.indexOf('divider') === 0) { 
    95                         $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements.divider.src + ') repeat-x center left'); 
    96                         var wid = player.skin.controlbar.elements.divider.width; 
    97                 } else { 
    98                         $('#' + nam).css('background', 'url(' + player.skin.controlbar.elements[element].src + ') repeat-x center left'); 
    99                         var wid = player.skin.controlbar.elements[element].width; 
    100                 } 
    101                 if (align == 'left') { 
    102                         $('#' + nam).css(align, controlbars[player.id].leftmargin); 
    103                         if (offset) { 
    104                                 controlbars[player.id].leftmargin += wid; 
    105                         } 
    106                 } else if (align == 'right') { 
    107                         $('#' + nam).css(align, controlbars[player.id].rightmargin); 
    108                         if (offset) { 
    109                                 controlbars[player.id].rightmargin += wid; 
    110                         } 
    111                 } 
    112                 $('#' + nam).css('width', wid); 
    113                 $('#' + nam).css('height', player.skin.controlbar.elements.background.height); 
    114         } 
    115          
    116          
    117         /** Add interactivity to the jwplayerControlbar elements. **/ 
    118         function buildHandlers(player) { 
    119                 // Register events with the buttons. 
    120                 buildHandler('playButton', 'play', player); 
    121                 buildHandler('pauseButton', 'pause', player); 
    122                 buildHandler('muteButton', 'mute', player, true); 
    123                 buildHandler('unmuteButton', 'mute', player, false); 
    124                 buildHandler('fullscreenButton', 'fullscreen', player, true); 
    125                 buildHandler('normalscreenButton', 'fullscreen', player, false); 
    126                  
    127                 addSliders(player); 
    128                  
    129                 // Register events with the player. 
    130                 player.buffer(bufferHandler); 
    131                 player.state(stateHandler); 
    132                 player.time(timeHandler); 
    133                 player.mute(muteHandler); 
    134                 player.volume(volumeHandler); 
    135                 player.complete(completeHandler); 
    136                  
    137                 // Trigger a few events so the bar looks good on startup. 
    138                 resizeHandler({ 
    139                         id: player.id, 
    140                         fulscreen: player.fullscreen(), 
    141                         width: player.width(), 
    142                         height: player.height() 
    143                 }); 
    144                 timeHandler({ 
    145                         id: player.id, 
    146                         duration: player.duration(), 
    147                         position: 0 
    148                 }); 
    149                 bufferHandler({ 
    150                         id: player.id, 
    151                         bufferProgress: 0 
    152                 }); 
    153                 muteHandler({ 
    154                         id: player.id, 
    155                         mute: player.mute() 
    156                 }); 
    157                 stateHandler({ 
    158                         id: player.id, 
    159                         newstate: $.fn.jwplayer.states.IDLE 
    160                 }); 
    161                 volumeHandler({ 
    162                         id: player.id, 
    163                         volume: player.volume() 
    164                 }); 
    165         } 
    166          
    167          
    168         /** Set a single button handler. **/ 
    169         function buildHandler(element, handler, player, args) { 
    170                 var nam = player.id + '_' + element; 
    171                 $('#' + nam).css('cursor', 'pointer'); 
    172                 if (handler == 'fullscreen') { 
    173                         $('#' + nam).mouseup(function(evt) { 
    174                                 evt.stopPropagation(); 
    175                                 player.fullscreen(!player.fullscreen()); 
    176                                 resizeHandler({ 
    177                                         id: player.id, 
    178                                         fullscreen: player.fullscreen(), 
    179                                         width: player.width(), 
    180                                         height: player.height() 
    181                                 }); 
     363                        $(window).resize(function() { 
     364                                jwplayer.html5.controlbar.resizeBar(player); 
    182365                        }); 
    183                 } else { 
    184                         $('#' + nam).mouseup(function(evt) { 
    185                                 evt.stopPropagation(); 
    186                                 if (!$.fn.jwplayerUtils.isNull(args)) { 
    187                                         player[handler](args); 
    188                                 } else { 
    189                                         player[handler](); 
    190                                 } 
    191                                  
    192                         }); 
    193                 } 
    194         } 
    195          
    196          
    197         /** Set the volume drag handler. **/ 
    198         function addSliders(player) { 
    199                 var bar = '#' + player.id + '_jwplayerControlbar'; 
    200                 var trl = '#' + player.id + '_timeSliderRail'; 
    201                 var vrl = '#' + player.id + '_volumeSliderRail'; 
    202                 $(bar).css('cursor', 'pointer'); 
    203                 $(trl).css('cursor', 'pointer'); 
    204                 $(vrl).css('cursor', 'pointer'); 
    205                 $(bar).mousedown(function(evt) { 
    206                         if (evt.pageX >= $(trl).offset().left - window.pageXOffset && evt.pageX <= $(trl).offset().left - window.pageXOffset + $(trl).width()) { 
    207                                 controlbars[player.id].scrubber = 'time'; 
    208                         } else if (evt.pageX >= $(vrl).offset().left - window.pageXOffset && evt.pageX <= $(vrl).offset().left - window.pageXOffset + $(trl).width()) { 
    209                                 controlbars[player.id].scrubber = 'volume'; 
    210                         } 
    211                 }); 
    212                 $(bar).mouseup(function(evt) { 
    213                         evt.stopPropagation(); 
    214                         sliderUp(evt.pageX, player); 
    215                 }); 
    216                 $(bar).mousemove(function(evt) { 
    217                         if (controlbars[player.id].scrubber == 'time') { 
    218                                 controlbars[player.id].mousedown = true; 
    219                                 var xps = evt.pageX - $(bar).offset().left - window.pageXOffset; 
    220                                 $('#' + player.id + '_timeSliderThumb').css('left', xps); 
    221                         } 
    222                 }); 
    223         } 
    224          
    225          
    226         /** The slider has been moved up. **/ 
    227         function sliderUp(msx, player) { 
    228                 controlbars[player.id].mousedown = false; 
    229                 if (controlbars[player.id].scrubber == 'time') { 
    230                         var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left + window.pageXOffset; 
    231                         var wid = $('#' + player.id + '_timeSliderRail').width(); 
    232                         var pos = xps / wid * controlbars[player.id].currentDuration; 
    233                         if (pos < 0) { 
    234                                 pos = 0; 
    235                         } else if (pos > controlbars[player.id].currentDuration) { 
    236                                 pos = controlbars[player.id].currentDuration - 3; 
    237                         } 
    238                         player.seek(pos); 
    239                         if (player.model.state != $.fn.jwplayer.states.PLAYING) { 
    240                                 player.play(); 
    241                         } 
    242                 } else if (controlbars[player.id].scrubber == 'volume') { 
    243                         var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left - window.pageXOffset; 
    244                         var wid = $('#' + player.id + '_volumeSliderRail').width(); 
    245                         var pct = Math.round(xps / wid * 100); 
    246                         if (pct < 0) { 
    247                                 pct = 0; 
    248                         } else if (pct > 100) { 
    249                                 pct = 100; 
    250                         } 
    251                         if (player.model.mute) { 
    252                                 player.mute(false); 
    253                         } 
    254                         player.volume(pct); 
    255                 } 
    256                 controlbars[player.id].scrubber = 'none'; 
    257         } 
    258          
    259          
    260         /** Update the buffer percentage. **/ 
    261         function bufferHandler(event) { 
    262                 if (!$.fn.jwplayerUtils.isNull(event.bufferPercent)) { 
    263                         controlbars[event.id].currentBuffer = event.bufferPercent; 
    264                 } 
    265                  
    266                 var wid = $('#' + event.id + '_timeSliderRail').width(); 
    267                 var bufferWidth = isNaN(Math.round(wid * controlbars[event.id].currentBuffer / 100)) ? 0 : Math.round(wid * controlbars[event.id].currentBuffer / 100); 
    268                 $('#' + event.id + '_timeSliderBuffer').css('width', bufferWidth); 
    269         } 
    270          
    271          
    272         /** Update the mute state. **/ 
    273         function muteHandler(event) { 
    274                 if (event.mute) { 
    275                         $('#' + event.id + '_muteButton').css('display', 'none'); 
    276                         $('#' + event.id + '_unmuteButton').css('display', 'block'); 
    277                         $('#' + event.id + '_volumeSliderProgress').css('display', 'none'); 
    278                 } else { 
    279                         $('#' + event.id + '_muteButton').css('display', 'block'); 
    280                         $('#' + event.id + '_unmuteButton').css('display', 'none'); 
    281                         $('#' + event.id + '_volumeSliderProgress').css('display', 'block'); 
    282                 } 
    283         } 
    284          
    285          
    286         /** Update the playback state. **/ 
    287         function stateHandler(event) { 
    288                 // Handle the play / pause button 
    289                 if (event.newstate == $.fn.jwplayer.states.BUFFERING || event.newstate == $.fn.jwplayer.states.PLAYING) { 
    290                         $('#' + event.id + '_pauseButton').css('display', 'block'); 
    291                         $('#' + event.id + '_playButton').css('display', 'none'); 
    292                 } else { 
    293                         $('#' + event.id + '_pauseButton').css('display', 'none'); 
    294                         $('#' + event.id + '_playButton').css('display', 'block'); 
    295                 } 
    296                  
    297                 // Show / hide progress bar 
    298                 if (event.newstate == $.fn.jwplayer.states.IDLE) { 
    299                         $('#' + event.id + '_timeSliderBuffer').css('display', 'none'); 
    300                         $('#' + event.id + '_timeSliderProgress').css('display', 'none'); 
    301                         $('#' + event.id + '_timeSliderThumb').css('display', 'none'); 
    302                 } else { 
    303                         $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 
    304                         if (event.newstate != $.fn.jwplayer.states.BUFFERING) { 
    305                                 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 
    306                                 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 
    307                         } 
    308                 } 
    309         } 
    310          
    311         /** Handles event completion **/ 
    312         function completeHandler(event) { 
    313                 timeHandler($.extend(event, { 
    314                         position: 0, 
    315                         duration: controlbars[event.id].currentDuration 
    316                 })); 
    317         } 
    318          
    319          
    320         /** Update the playback time. **/ 
    321         function timeHandler(event) { 
    322                 if (!$.fn.jwplayerUtils.isNull(event.position)) { 
    323                         controlbars[event.id].currentPosition = event.position; 
    324                 } 
    325                 if (!$.fn.jwplayerUtils.isNull(event.duration)) { 
    326                         controlbars[event.id].currentDuration = event.duration; 
    327                 } 
    328                 var progress = (controlbars[event.id].currentPosition === controlbars[event.id].currentDuration === 0) ? 0 : controlbars[event.id].currentPosition / controlbars[event.id].currentDuration; 
    329                 var railWidth = $('#' + event.id + '_timeSliderRail').width(); 
    330                 var thumbWidth = $('#' + event.id + '_timeSliderThumb').width(); 
    331                 var railLeft = $('#' + event.id + '_timeSliderRail').position().left; 
    332                 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
    333                 var thumbPosition = railLeft + progressWidth; 
    334                  
    335                 $('#' + event.id + '_timeSliderProgress').css('width', progressWidth); 
    336                 if (!controlbars[event.id].mousedown) { 
    337                         $('#' + event.id + '_timeSliderThumb').css('left', thumbPosition); 
    338                 } 
    339                  
    340                 $('#' + event.id + '_durationText').html(timeFormat(controlbars[event.id].currentDuration)); 
    341                 $('#' + event.id + '_elapsedText').html(timeFormat(controlbars[event.id].currentPosition)); 
    342         } 
    343          
    344          
    345         /** Format the elapsed / remaining text. **/ 
    346         function timeFormat(sec) { 
    347                 str = '00:00'; 
    348                 if (sec > 0) { 
    349                         str = Math.floor(sec / 60) < 10 ? '0' + Math.floor(sec / 60) + ':' : Math.floor(sec / 60) + ':'; 
    350                         str += Math.floor(sec % 60) < 10 ? '0' + Math.floor(sec % 60) : Math.floor(sec % 60); 
    351                 } 
    352                 return str; 
    353         } 
    354          
    355          
    356         /** Flip the player size to/from full-browser-screen. **/ 
    357         function resizeHandler(event) { 
    358                 controlbars[event.id].width = event.width; 
    359                 controlbars[event.id].fullscreen = event.fullscreen; 
    360                 if (event.fullscreen) { 
    361                         $('#' + event.id + '_normalscreenButton').css('display', 'block'); 
    362                         $('#' + event.id + '_fullscreenButton').css('display', 'none'); 
    363                         // TODO 
    364                         if (false) { 
    365                                 $(window).resize(function() { 
    366                                         resizeBar(player); 
    367                                 }); 
    368                         } 
    369                 } else { 
    370                         $('#' + event.id + '_normalscreenButton').css('display', 'none'); 
    371                         $('#' + event.id + '_fullscreenButton').css('display', 'block'); 
    372                         // TODO 
    373                         if (false) { 
    374                                 $(window).resize(null); 
    375                         } 
    376                 } 
    377                 resizeBar(event); 
    378                 timeHandler(event); 
    379                 bufferHandler(event); 
    380         } 
    381          
    382          
    383         /** Resize the jwplayerControlbar. **/ 
    384         function resizeBar(event) { 
    385                 var lft = controlbars[event.id].left; 
    386                 var top = controlbars[event.id].top; 
    387                 var wid = controlbars[event.id].width; 
    388                 var hei = $('#' + event.id + '_jwplayerControlbar').height(); 
    389                 if (controlbars[event.id].position == 'over') { 
    390                         lft += 1 * controlbars[event.id].margin; 
    391                         top -= 1 * controlbars[event.id].margin + hei; 
    392                         wid -= 2 * controlbars[event.id].margin; 
    393                 } 
    394                 if (controlbars[event.id].fullscreen) { 
    395                         lft = controlbars[event.id].margin; 
    396                         top = $(window).height() - controlbars[event.id].margin - hei; 
    397                         wid = $(window).width() - 2 * controlbars[event.id].margin; 
    398                         $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 
    399                 } else { 
    400                         $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 
    401                 } 
    402                 $('#' + event.id + '_jwplayerControlbar').css('left', lft); 
    403                 $('#' + event.id + '_jwplayerControlbar').css('top', top); 
    404                 $('#' + event.id + '_jwplayerControlbar').css('width', wid); 
    405                 $('#' + event.id + '_timeSliderRail').css('width', (wid - controlbars[event.id].leftmargin - controlbars[event.id].rightmargin)); 
    406         } 
    407          
    408          
    409         /** Update the volume level. **/ 
    410         function volumeHandler(event) { 
    411                 var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 
    412                 var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 
    413                 var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 
    414                 var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
    415                  
    416                 $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 
    417                 $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 
    418         } 
    419          
    420          
    421 })(jQuery); 
     366                } 
     367        } else { 
     368                $('#' + event.id + '_normalscreenButton').css('display', 'none'); 
     369                $('#' + event.id + '_fullscreenButton').css('display', 'block'); 
     370                // TODO 
     371                if (false) { 
     372                        $(window).resize(null); 
     373                } 
     374        } 
     375        jwplayer.html5.controlbar.resizeBar(event); 
     376        jwplayer.html5.controlbar.timeHandler(event); 
     377        jwplayer.html5.controlbar.bufferHandler(event); 
     378}; 
     379 
     380 
     381/** Resize the jwplayerControlbar. **/ 
     382jwplayer.html5.controlbar.resizeBar = function(event) { 
     383        var lft = controlbars[event.id].left; 
     384        var top = controlbars[event.id].top; 
     385        var wid = controlbars[event.id].width; 
     386        var hei = $('#' + event.id + '_jwplayerControlbar').height(); 
     387        if (controlbars[event.id].position == 'over') { 
     388                lft += 1 * controlbars[event.id].margin; 
     389                top -= 1 * controlbars[event.id].margin + hei; 
     390                wid -= 2 * controlbars[event.id].margin; 
     391        } 
     392        if (controlbars[event.id].fullscreen) { 
     393                lft = controlbars[event.id].margin; 
     394                top = $(window).height() - controlbars[event.id].margin - hei; 
     395                wid = $(window).width() - 2 * controlbars[event.id].margin; 
     396                $('#' + event.id + '_jwplayerControlbar').css('z-index', 99); 
     397        } else { 
     398                $('#' + event.id + '_jwplayerControlbar').css('z-index', 97); 
     399        } 
     400        $('#' + event.id + '_jwplayerControlbar').css('left', lft); 
     401        $('#' + event.id + '_jwplayerControlbar').css('top', top); 
     402        $('#' + event.id + '_jwplayerControlbar').css('width', wid); 
     403        $('#' + event.id + '_timeSliderRail').css('width', (wid - controlbars[event.id].leftmargin - controlbars[event.id].rightmargin)); 
     404}; 
     405 
     406 
     407/** Update the volume level. **/ 
     408jwplayer.html5.controlbar.volumeHandler = function(event) { 
     409        var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 
     410        var railWidth = $('#' + event.id + '_volumeSliderRail').width(); 
     411        var railRight = parseInt($('#' + event.id + '_volumeSliderRail').css('right').toString().replace('px', ''), 10); 
     412        var progressWidth = isNaN(Math.round(railWidth * progress)) ? 0 : Math.round(railWidth * progress); 
     413         
     414        $('#' + event.id + '_volumeSliderProgress').css('width', progressWidth); 
     415        $('#' + event.id + '_volumeSliderProgress').css('right', (railWidth + railRight - progressWidth)); 
     416}; 
  • trunk/html5/src/html5/jwplayer.html5.controller.js

    r1189 r1190  
    66 * @lastmodifieddate 2010-04-11 
    77 */ 
    8 (function($) { 
    9  
    10         var mediaParams = function() { 
    11                 return { 
    12                         volume: 100, 
    13                         fullscreen: false, 
    14                         mute: false, 
    15                         width: 480, 
    16                         height: 320, 
    17                         duration: 0, 
    18                         source: 0, 
    19                         sources: [], 
    20                         buffer: 0, 
    21                         position: 0, 
    22                         state: $.fn.jwplayer.states.IDLE 
    23                 }; 
    24         }; 
    25          
    26         $.fn.jwplayerController = function(player) { 
    27                 return { 
    28                         play: play(player), 
    29                         pause: pause(player), 
    30                         seek: seek(player), 
    31                         stop: stop(player), 
    32                         volume: volume(player), 
    33                         mute: mute(player), 
    34                         resize: resize(player), 
    35                         fullscreen: fullscreen(player), 
    36                         load: load(player), 
    37                         mediaInfo: mediaInfo(player), 
    38                         addEventListener: addEventListener(player), 
    39                         removeEventListener: removeEventListener(player), 
    40                         sendEvent: sendEvent(player) 
    41                 }; 
    42         }; 
    43          
    44          
    45         function play(player) { 
    46                 return function() { 
     8jwplayer.html5.controller = function(player) { 
     9        return { 
     10                play: jwplayer.html5.controller.play(player), 
     11                pause: jwplayer.html5.controller.pause(player), 
     12                seek: jwplayer.html5.controller.seek(player), 
     13                stop: jwplayer.html5.controller.stop(player), 
     14                volume: jwplayer.html5.controller.volume(player), 
     15                mute: jwplayer.html5.controller.mute(player), 
     16                resize: jwplayer.html5.controller.resize(player), 
     17                fullscreen: jwplayer.html5.controller.fullscreen(player), 
     18                load: jwplayer.html5.controller.load(player), 
     19                mediaInfo: jwplayer.html5.controller.mediaInfo(player), 
     20                addEventListener: jwplayer.html5.controller.addEventListener(player), 
     21                removeEventListener: jwplayer.html5.controller.removeEventListener(player), 
     22                sendEvent: jwplayer.html5.controller.sendEvent(player) 
     23        }; 
     24}; 
     25 
     26jwplayer.html5.controller._mediainfovariables = ["width","height","state","sources","source","position","buffer","duration","volume","mute","fullscreen"]; 
     27 
     28jwplayer.html5.controller.play = function(player) { 
     29        return function() { 
     30                try { 
     31                        switch (player._model.state) { 
     32                                case jwplayer.html5.states.IDLE: 
     33                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, player._media.play); 
     34                                        player._media.load(player._model.sources[player._model.source].file); 
     35                                        break; 
     36                                case jwplayer.html5.states.PAUSED: 
     37                                        player._media.play(); 
     38                                        break; 
     39                        } 
     40                         
     41                        return player; 
     42                } catch (err) { 
     43                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     44                } 
     45                return false; 
     46        }; 
     47}; 
     48 
     49 
     50/** Switch the pause state of the player. **/ 
     51jwplayer.html5.controller.pause = function(player) { 
     52        return function() { 
     53                try { 
     54                        switch (player._model.state) { 
     55                                case jwplayer.html5.states.PLAYING: 
     56                                case jwplayer.html5.states.BUFFERING: 
     57                                        player._media.pause(); 
     58                                        break; 
     59                        } 
     60                        return player; 
     61                } catch (err) { 
     62                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     63                } 
     64                return false; 
     65        }; 
     66}; 
     67 
     68 
     69/** Seek to a position in the video. **/ 
     70jwplayer.html5.controller.seek = function(player) { 
     71        return function(position) { 
     72                try { 
     73                        switch (player._model.state) { 
     74                                case jwplayer.html5.states.PLAYING: 
     75                                case jwplayer.html5.states.PAUSED: 
     76                                case jwplayer.html5.states.BUFFERING: 
     77                                        player._media.seek(position); 
     78                                        break; 
     79                        } 
     80                        return player; 
     81                } catch (err) { 
     82                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     83                } 
     84                return false; 
     85        }; 
     86}; 
     87 
     88 
     89/** Stop playback and loading of the video. **/ 
     90jwplayer.html5.controller.stop = function(player) { 
     91        return function() { 
     92                try { 
     93                        player._media.stop(); 
     94                        return player; 
     95                } catch (err) { 
     96                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     97                } 
     98                return false; 
     99        }; 
     100}; 
     101 
     102 
     103/** Get / set the video's volume level. **/ 
     104jwplayer.html5.controller.volume = function(player) { 
     105        return function(arg) { 
     106                try { 
     107                        switch (jwplayer.html5.utils.typeOf(arg)) { 
     108                                case "function": 
     109                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, arg); 
     110                                        break; 
     111                                case "number": 
     112                                        player._media.volume(arg); 
     113                                        return true; 
     114                                case "string": 
     115                                        player._media.volume(parseInt(arg, 10)); 
     116                                        return true; 
     117                                default: 
     118                                        return player._model.volume; 
     119                        } 
     120                        return player; 
     121                } catch (err) { 
     122                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     123                } 
     124                return false; 
     125        }; 
     126}; 
     127 
     128 
     129/** Get / set the mute state of the player. **/ 
     130jwplayer.html5.controller.mute = function(player) { 
     131        return function(arg) { 
     132                try { 
     133                        switch (jwplayer.html5.utils.typeOf(arg)) { 
     134                                case "function": 
     135                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, arg); 
     136                                        break; 
     137                                case "boolean": 
     138                                        player._media.mute(arg); 
     139                                        break; 
     140                                default: 
     141                                        return player._model.mute; 
     142                        } 
     143                        return player; 
     144                } catch (err) { 
     145                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     146                } 
     147                return false; 
     148        }; 
     149}; 
     150 
     151 
     152/** Resizes the video **/ 
     153jwplayer.html5.controller.resize = function(player) { 
     154        return function(arg1, arg2) { 
     155                try { 
     156                        switch (jwplayer.html5.utils.typeOf(arg1)) { 
     157                                case "function": 
     158                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_RESIZE, arg1); 
     159                                        break; 
     160                                case "number": 
     161                                        player._media.resize(arg1, arg2); 
     162                                        break; 
     163                                case "string": 
     164                                        player._media.resize(arg1, arg2); 
     165                                        break; 
     166                                default: 
     167                                        break; 
     168                        } 
     169                        return player; 
     170                } catch (err) { 
     171                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     172                } 
     173                return false; 
     174        }; 
     175}; 
     176 
     177 
     178/** Jumping the player to/from fullscreen. **/ 
     179jwplayer.html5.controller.fullscreen = function(player) { 
     180        return function(arg) { 
     181                try { 
     182                        switch (jwplayer.html5.utils.typeOf(arg)) { 
     183                                case "function": 
     184                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_FULLSCREEN, arg); 
     185                                        break; 
     186                                case "boolean": 
     187                                        player._media.fullscreen(arg); 
     188                                        break; 
     189                                default: 
     190                                        return player._model.fullscreen; 
     191                        } 
     192                        return player; 
     193                } catch (err) { 
     194                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     195                } 
     196                return false; 
     197        }; 
     198}; 
     199 
     200 
     201/** Loads a new video **/ 
     202jwplayer.html5.controller.load = function(player) { 
     203        return function(arg) { 
     204                try { 
     205                        switch (jwplayer.html5.utils.typeOf(arg)) { 
     206                                case "function": 
     207                                        player.addEventListener(jwplayer.html5.events.JWPLAYER_MEDIA_LOADED, arg); 
     208                                        break; 
     209                                default: 
     210                                        player._media.load(arg); 
     211                                        break; 
     212                        } 
     213                        return player; 
     214                } catch (err) { 
     215                        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, err); 
     216                } 
     217                return false; 
     218        }; 
     219}; 
     220 
     221 
     222/** Returns the meta **/ 
     223jwplayer.html5.controller.mediaInfo = function(player) { 
     224        return function() { 
     225                try { 
     226                        var result = {}; 
     227                        for (var index in jwplayer.html5.controller._mediainfoparameters) { 
     228                                var mediaparam = jwplayer.html5.controller._mediainfoparameters[index]; 
     229                                result[mediaparam] = player._model[mediaparam]; 
     230                        } 
     231                        return result; 
     232                } catch (err) { 
     233                        jwplayer.html5.utils.log("error", err); 
     234                } 
     235                return false; 
     236        }; 
     237}; 
     238 
     239 
     240/** Add an event listener. **/ 
     241jwplayer.html5.controller.addEventListener = function(player) { 
     242        return function(type, listener, count) { 
     243                try { 
     244                        if (player._listeners[type] === undefined) { 
     245                                player._listeners[type] = []; 
     246                        } 
     247                        player._listeners[type].push({ 
     248                                listener: listener, 
     249                                count: count 
     250                        }); 
     251                } catch (err) { 
     252                        jwplayer.html5.utils.log("error", err); 
     253                } 
     254                return false; 
     255        }; 
     256}; 
     257 
     258 
     259/** Remove an event listener. **/ 
     260jwplayer.html5.controller.removeEventListener = function(player) { 
     261        return function(type, listener) { 
     262                try { 
     263                        for (var lisenterIndex in player._listeners[type]) { 
     264                                if (player._listeners[type][lisenterIndex] == listener) { 
     265                                        player._listeners[type].slice(lisenterIndex, lisenterIndex + 1); 
     266                                        break; 
     267                                } 
     268                        } 
     269                } catch (err) { 
     270                        jwplayer.html5.utils.log("error", err); 
     271                } 
     272                return false; 
     273        }; 
     274}; 
     275 
     276 
     277/** Send an event **/ 
     278jwplayer.html5.controller.sendEvent = function(player) { 
     279        return function(type, data) { 
     280                data = $.extend({ 
     281                        id: player.id, 
     282                        version: player.version 
     283                }, data); 
     284                if ((player._model.config.debug !== undefined) && (player._model.config.debug.toString().toLowerCase() == 'console')) { 
     285                        jwplayer.html5.utils.log(type, data); 
     286                } 
     287                for (var listenerIndex in player._listeners[type]) { 
    47288                        try { 
    48                                 switch (player.model.state) { 
    49                                         case $.fn.jwplayer.states.IDLE: 
    50                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, player.media.play); 
    51                                                 player.media.load(player.model.sources[player.model.source].file); 
    52                                                 break; 
    53                                         case $.fn.jwplayer.states.PAUSED: 
    54                                                 player.media.play(); 
    55                                                 break; 
    56                                 } 
    57                                  
    58                                 return $.jwplayer(player.id); 
     289                                player._listeners[type][listenerIndex].listener(data); 
    59290                        } catch (err) { 
    60                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    61                         } 
    62                         return false; 
    63                 }; 
    64         } 
    65          
    66         /** Switch the pause state of the player. **/ 
    67         function pause(player) { 
    68                 return function() { 
    69                         try { 
    70                                 switch (player.model.state) { 
    71                                         case $.fn.jwplayer.states.PLAYING: 
    72                                         case $.fn.jwplayer.states.BUFFERING: 
    73                                                 player.media.pause(); 
    74                                                 break; 
    75                                 } 
    76                                 return $.jwplayer(player.id); 
    77                         } catch (err) { 
    78                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    79                         } 
    80                         return false; 
    81                 }; 
    82         } 
    83          
    84          
    85         /** Seek to a position in the video. **/ 
    86         function seek(player) { 
    87                 return function(position) { 
    88                         try { 
    89                                 switch (player.model.state) { 
    90                                         case $.fn.jwplayer.states.PLAYING: 
    91                                         case $.fn.jwplayer.states.PAUSED: 
    92                                         case $.fn.jwplayer.states.BUFFERING: 
    93                                                 player.media.seek(position); 
    94                                                 break; 
    95                                 } 
    96                                 return $.jwplayer(player.id); 
    97                         } catch (err) { 
    98                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    99                         } 
    100                         return false; 
    101                 }; 
    102         } 
    103          
    104          
    105         /** Stop playback and loading of the video. **/ 
    106         function stop(player) { 
    107                 return function() { 
    108                         try { 
    109                                 player.media.stop(); 
    110                                 return $.jwplayer(player.id); 
    111                         } catch (err) { 
    112                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    113                         } 
    114                         return false; 
    115                 }; 
    116         } 
    117          
    118          
    119         /** Get / set the video's volume level. **/ 
    120         function volume(player) { 
    121                 return function(arg) { 
    122                         try { 
    123                                 switch ($.fn.jwplayerUtils.typeOf(arg)) { 
    124                                         case "function": 
    125                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 
    126                                                 break; 
    127                                         case "number": 
    128                                                 player.media.volume(arg); 
    129                                                 return true; 
    130                                         case "string": 
    131                                                 player.media.volume(parseInt(arg, 10)); 
    132                                                 return true; 
    133                                         default: 
    134                                                 return player.model.volume; 
    135                                 } 
    136                                 return $.jwplayer(player.id); 
    137                         } catch (err) { 
    138                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    139                         } 
    140                         return false; 
    141                 }; 
    142         } 
    143          
    144         /** Get / set the mute state of the player. **/ 
    145         function mute(player) { 
    146                 return function(arg) { 
    147                         try { 
    148                                 switch ($.fn.jwplayerUtils.typeOf(arg)) { 
    149                                         case "function": 
    150                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); 
    151                                                 break; 
    152                                         case "boolean": 
    153                                                 player.media.mute(arg); 
    154                                                 break; 
    155                                         default: 
    156                                                 return player.model.mute; 
    157                                 } 
    158                                 return $.jwplayer(player.id); 
    159                         } catch (err) { 
    160                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    161                         } 
    162                         return false; 
    163                 }; 
    164         } 
    165          
    166          
    167         /** Resizes the video **/ 
    168         function resize(player) { 
    169                 return function(arg1, arg2) { 
    170                         try { 
    171                                 switch ($.fn.jwplayerUtils.typeOf(arg1)) { 
    172                                         case "function": 
    173                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_RESIZE, arg1); 
    174                                                 break; 
    175                                         case "number": 
    176                                                 player.media.resize(arg1, arg2); 
    177                                                 break; 
    178                                         case "string": 
    179                                                 player.media.resize(arg1, arg2); 
    180                                                 break; 
    181                                         default: 
    182                                                 break; 
    183                                 } 
    184                                 return $.jwplayer(player.id); 
    185                         } catch (err) { 
    186                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    187                         } 
    188                         return false; 
    189                 }; 
    190         } 
    191          
    192          
    193         /** Jumping the player to/from fullscreen. **/ 
    194         function fullscreen(player) { 
    195                 return function(arg) { 
    196                         try { 
    197                                 switch ($.fn.jwplayerUtils.typeOf(arg)) { 
    198                                         case "function": 
    199                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); 
    200                                                 break; 
    201                                         case "boolean": 
    202                                                 player.media.fullscreen(arg); 
    203                                                 break; 
    204                                         default: 
    205                                                 return player.model.fullscreen; 
    206                                 } 
    207                                 return $.jwplayer(player.id); 
    208                         } catch (err) { 
    209                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    210                         } 
    211                         return false; 
    212                 }; 
    213         } 
    214          
    215         /** Loads a new video **/ 
    216         function load(player) { 
    217                 return function(arg) { 
    218                         try { 
    219                                 switch ($.fn.jwplayerUtils.typeOf(arg)) { 
    220                                         case "function": 
    221                                                 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); 
    222                                                 break; 
    223                                         default: 
    224                                                 player.media.load(arg); 
    225                                                 break; 
    226                                 } 
    227                                 return $.jwplayer(player.id); 
    228                         } catch (err) { 
    229                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 
    230                         } 
    231                         return false; 
    232                 }; 
    233         } 
    234          
    235          
    236         /** Returns the meta **/ 
    237         function mediaInfo(player) { 
    238                 return function() { 
    239                         try { 
    240                                 var result = {}; 
    241                                 for (var mediaParam in mediaParams()) { 
    242                                         result[mediaParam] = player.model[mediaParam]; 
    243                                 } 
    244                                 return result; 
    245                         } catch (err) { 
    246                                 $.fn.jwplayerUtils.log("error", err); 
    247                         } 
    248                         return false; 
    249                 }; 
    250         } 
    251          
    252          
    253         /** Add an event listener. **/ 
    254         function addEventListener(player) { 
    255                 return function(type, listener, count) { 
    256                         try { 
    257                                 if (player.listeners[type] === undefined) { 
    258                                         player.listeners[type] = []; 
    259                                 } 
    260                                 player.listeners[type].push({ 
    261                                         listener: listener, 
    262                                         count: count 
    263                                 }); 
    264                         } catch (err) { 
    265                                 $.fn.jwplayerUtils.log("error", err); 
    266                         } 
    267                         return false; 
    268                 }; 
    269         } 
    270          
    271          
    272         /** Remove an event listener. **/ 
    273         function removeEventListener(player) { 
    274                 return function(type, listener) { 
    275                         try { 
    276                                 for (var lisenterIndex in player.listeners[type]) { 
    277                                         if (player.listeners[type][lisenterIndex] == listener) { 
    278                                                 player.listeners[type].slice(lisenterIndex, lisenterIndex + 1); 
    279                                                 break; 
    280                                         } 
    281                                 } 
    282                         } catch (err) { 
    283                                 $.fn.jwplayerUtils.log("error", err); 
    284                         } 
    285                         return false; 
    286                 }; 
    287         } 
    288          
    289         /** Send an event **/ 
    290         function sendEvent(player) { 
    291                 return function(type, data) { 
    292                         data = $.extend({ 
    293                                 id: player.id, 
    294                                 version: player.version 
    295                         }, data); 
    296                         if ((player.config.debug !== undefined) && (player.config.debug.toString().toLowerCase() == 'console')) { 
    297                                 $.fn.jwplayerUtils.log(type, data); 
    298                         } 
    299                         for (var listenerIndex in player.listeners[type]) { 
    300                                 try { 
    301                                         player.listeners[type][listenerIndex].listener(data); 
    302                                 } catch (err) { 
    303                                         $.fn.jwplayerUtils.log("There was an error while handling a listener", err); 
    304                                 } 
    305                                 if (player.listeners[type][listenerIndex].count === 1) { 
    306                                         delete player.listeners[type][listenerIndex]; 
    307                                 } else if (player.listeners[type][listenerIndex].count > 0) { 
    308                                         player.listeners[type][listenerIndex].count = player.listeners[type][listenerIndex].count - 1; 
    309                                 } 
    310                         } 
    311                 }; 
    312         } 
    313          
    314 })(jQuery); 
     291                                jwplayer.html5.utils.log("There was an error while handling a listener", err); 
     292                        } 
     293                        if (player._listeners[type][listenerIndex].count === 1) { 
     294                                delete player._listeners[type][listenerIndex]; 
     295                        } else if (player._listeners[type][listenerIndex].count > 0) { 
     296                                player._listeners[type][listenerIndex].count = player._listeners[type][listenerIndex].count - 1; 
     297                        } 
     298                } 
     299        }; 
     300}; 
     301 
  • trunk/html5/src/html5/jwplayer.html5.defaultskin.js

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

    r1189 r1190  
    66 * @lastmodifieddate 2010-04-11 
    77 */ 
    8 (function($) { 
    9         var logoDefaults = { 
    10                 prefix: "http://l.longtailvideo.com/html5/0/", 
    11                 file: "logo.png", 
    12                 link: "http://www.longtailvideo.com/players/jw-flv-player/", 
    13                 margin: 8, 
    14                 out: 0.5, 
    15                 over: 1, 
    16                 timeout: 3, 
    17                 hide: "true", 
    18                 position: "bottom-left", 
    19                 width: 93, 
    20                 height: 30 
    21         }; 
    22          
    23         var displays = {}; 
    24          
    25         $.fn.jwplayerDisplay = function(player, domelement) { 
    26                 if (displays[player.id] === undefined) { 
    27                         displays[player.id] = {}; 
    28                         displays[player.id].domelement = domelement; 
    29                         displays[player.id].elements = initializeDisplayElements(player); 
    30                         if ($.fn.jwplayerUtils.isiPhone()) { 
    31                                 domelement.attr('poster', $.fn.jwplayerUtils.getAbsolutePath(player.config.image)); 
    32                         } else { 
    33                                 setupDisplay(player); 
    34                                 player.state(stateHandler); 
    35                                 player.mute(stateHandler); 
    36                                 player.error(function(obj) { 
    37                                  
    38                                 }); 
     8jwplayer.html5.display = function(player) { 
     9        if (player._model.components.display === undefined) { 
     10                player._model.components.display = {}; 
     11                player._model.components.display.elements = jwplayer.html5.display.initializeDisplayElements(player); 
     12                if (jwplayer.html5.utils.isiPhone()) { 
     13                        domelement.attr('poster', jwplayer.html5.utils.getAbsolutePath(player.config.image)); 
     14                } else { 
     15                        jwplayer.html5.display.setupDisplay(player); 
     16                        player.state(jwplayer.html5.display.stateHandler(player)); 
     17                        player.mute(jwplayer.html5.display.stateHandler(player)); 
     18                        player.error(function(obj) { 
     19                        }); 
     20                } 
     21        } 
     22}; 
     23 
     24jwplayer.html5.display.logoDefaults = { 
     25        prefix: "http://l.longtailvideo.com/html5/0/", 
     26        file: "logo.png", 
     27        link: "http://www.longtailvideo.com/players/jw-flv-player/", 
     28        margin: 8, 
     29        out: 0.5, 
     30        over: 1, 
     31        timeout: 3, 
     32        hide: "true", 
     33        position: "bottom-left", 
     34        width: 93, 
     35        height: 30 
     36}; 
     37 
     38jwplayer.html5.display.setupDisplay = function(player) { 
     39        var meta = player.meta(); 
     40        var html = []; 
     41        html.push("<div id='" + player.id + "_display'" + jwplayer.html5.display.getStyle(player, 'display') + ">"); 
     42        html.push("<div id='" + player.id + "_displayImage'" + jwplayer.html5.display.getStyle(player, 'displayImage') + ">&nbsp;</div>"); 
     43        html.push("<div id='" + player.id + "_displayIconBackground'" + jwplayer.html5.display.getStyle(player, 'displayIconBackground') + ">"); 
     44        html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + jwplayer.html5.display.getStyle(player, 'displayIcon') + "/>"); 
     45        html.push('</div>'); 
     46        html.push('<div id="' + player.id + '_logo" target="_blank"' + jwplayer.html5.display.getStyle(player, 'logo') + '>&nbsp;</div>'); 
     47        html.push('</div>'); 
     48        player._model.components.display.domelement.before(html.join('')); 
     49        jwplayer.html5.display.setupDisplayElements(player); 
     50}; 
     51 
     52 
     53jwplayer.html5.display.getStyle = function(player, element) { 
     54        var result = ''; 
     55        for (var style in player._model.components.display.elements[element].style) { 
     56                result += style + ":" + player._model.components.display.elements[element].style[style] + ";"; 
     57        } 
     58        if (result === '') { 
     59                return ' '; 
     60        } 
     61        return ' style="' + result + '" '; 
     62}; 
     63 
     64 
     65jwplayer.html5.display.setupDisplayElements = function(player) { 
     66        var displayElements = jwplayer.html5.display.initializeDisplayElements(player); 
     67        for (var element in displayElements) { 
     68                var elementId = ['#', player.id, '_', element]; 
     69                player._model.components.display[element] = $(elementId.join('')); 
     70                if (displayElements[element].click !== undefined) { 
     71                        player._model.components.display[element].click(displayElements[element].click); 
     72                } 
     73        } 
     74}; 
     75 
     76 
     77jwplayer.html5.display.initializeDisplayElements = function(player) { 
     78        var meta = player.meta(); 
     79        var elements = { 
     80                display: { 
     81                        style: { 
     82                                cursor: 'pointer', 
     83                                width: meta.width + "px", 
     84                                height: meta.height + "px", 
     85                                position: 'relative', 
     86                                'z-index': 50, 
     87                                margin: 0, 
     88                                padding: 0 
     89                        }, 
     90                        click: jwplayer.html5.display.displayClickHandler(player) 
     91                }, 
     92                displayIcon: { 
     93                        style: { 
     94                                cursor: 'pointer', 
     95                                position: 'absolute', 
     96                                top: ((player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2) + "px", 
     97                                left: ((player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2) + "px", 
     98                                border: 0, 
     99                                margin: 0, 
     100                                padding: 0 
    39101                        } 
    40                 } 
    41         }; 
    42          
    43         function setupDisplay(player) { 
    44                 var meta = player.meta(); 
    45                 var html = []; 
    46                 html.push("<div id='" + player.id + "_display'" + getStyle(player, 'display') + ">"); 
    47                 html.push("<div id='" + player.id + "_displayImage'" + getStyle(player, 'displayImage') + ">&nbsp;</div>"); 
    48                 html.push("<div id='" + player.id + "_displayIconBackground'" + getStyle(player, 'displayIconBackground') + ">"); 
    49                 html.push("<img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video'" + getStyle(player, 'displayIcon') + "/>"); 
    50                 html.push('</div>'); 
    51                 html.push('<div id="' + player.id + '_logo" target="_blank"' + getStyle(player, 'logo') + '>&nbsp;</div>'); 
    52                 html.push('</div>'); 
    53                 displays[player.id].domelement.before(html.join('')); 
    54                 setupDisplayElements(player); 
    55         } 
    56          
    57         function getStyle(player, element) { 
    58                 var result = ''; 
    59                 for (var style in displays[player.id].elements[element].style) { 
    60                         result += style + ":" + displays[player.id].elements[element].style[style] + ";"; 
    61                 } 
    62                 if (result === '') { 
    63                         return ' '; 
    64                 } 
    65                 return ' style="' + result + '" '; 
    66         } 
    67          
    68         function setupDisplayElements(player) { 
    69                 var displayElements = initializeDisplayElements(player); 
    70                 for (var element in displayElements) { 
    71                         var elementId = ['#', player.id, '_', element]; 
    72                         displays[player.id][element] = $(elementId.join('')); 
    73                         if (displayElements[element].click !== undefined) { 
    74                                 displays[player.id][element].click(displayElements[element].click); 
     102                }, 
     103                displayIconBackground: { 
     104                        style: { 
     105                                cursor: 'pointer', 
     106                                position: 'absolute', 
     107                                top: ((meta.height - player.skin.display.elements.background.height) / 2) + "px", 
     108                                left: ((meta.width - player.skin.display.elements.background.width) / 2) + "px", 
     109                                border: 0, 
     110                                'background-image': (['url(', player.skin.display.elements.background.src, ')']).join(''), 
     111                                width: player.skin.display.elements.background.width + "px", 
     112                                height: player.skin.display.elements.background.height + "px", 
     113                                margin: 0, 
     114                                padding: 0 
    75115                        } 
    76                 } 
    77         } 
    78          
    79         function initializeDisplayElements(player) { 
    80                 var meta = player.meta(); 
    81                 var elements = { 
    82                         display: { 
    83                                 style: { 
    84                                         cursor: 'pointer', 
    85                                         width: meta.width + "px", 
    86                                         height: meta.height + "px", 
    87                                         position: 'relative', 
    88                                         'z-index': 50, 
    89                                         margin: 0, 
    90                                         padding: 0 
    91                                 }, 
    92                                 click: displayClickHandler(player) 
     116                }, 
     117                displayImage: { 
     118                        style: { 
     119                                display: 'block', 
     120                                background: ([player.config.screencolor, ' url(', jwplayer.html5.utils.getAbsolutePath(player.config.image), ') no-repeat center center']).join(''), 
     121                                width: meta.width + "px", 
     122                                height: meta.height + "px", 
     123                                position: 'absolute', 
     124                                cursor: 'pointer', 
     125                                left: 0, 
     126                                top: 0, 
     127                                margin: 0, 
     128                                padding: 0, 
     129                                'text-decoration': 'none' 
     130                        } 
     131                }, 
     132                logo: { 
     133                        style: { 
     134                                position: 'absolute', 
     135                                width: jwplayer.html5.display.logoDefaults.width + "px", 
     136                                height: jwplayer.html5.display.logoDefaults.height + "px", 
     137                                'background-image': (['url(', jwplayer.html5.display.logoDefaults.prefix, jwplayer.html5.display.logoDefaults.file, ')']).join(''), 
     138                                margin: 0, 
     139                                padding: 0, 
     140                                display: 'none', 
     141                                'text-decoration': 'none' 
    93142                        }, 
    94                         displayIcon: { 
    95                                 style: { 
    96                                         cursor: 'pointer', 
    97                                         position: 'absolute', 
    98                                         top: ((player.skin.display.elements.background.height - player.skin.display.elements.playIcon.height) / 2) + "px", 
    99                                         left: ((player.skin.display.elements.background.width - player.skin.display.elements.playIcon.width) / 2) + "px", 
    100                                         border: 0, 
    101                                         margin: 0, 
    102                                         padding: 0 
    103                                 } 
    104                         }, 
    105                         displayIconBackground: { 
    106                                 style: { 
    107                                         cursor: 'pointer', 
    108                                         position: 'absolute', 
    109                                         top: ((meta.height - player.skin.display.elements.background.height) / 2) + "px", 
    110                                         left: ((meta.width - player.skin.display.elements.background.width) / 2) + "px", 
    111                                         border: 0, 
    112                                         'background-image': (['url(', player.skin.display.elements.background.src, ')']).join(''), 
    113                                         width: player.skin.display.elements.background.width + "px", 
    114                                         height: player.skin.display.elements.background.height + "px", 
    115                                         margin: 0, 
    116                                         padding: 0 
    117                                 } 
    118                         }, 
    119                         displayImage: { 
    120                                 style: { 
    121                                         display: 'block', 
    122                                         background: ([player.config.screencolor, ' url(', $.fn.jwplayerUtils.getAbsolutePath(player.config.image), ') no-repeat center center']).join(''), 
    123                                         width: meta.width + "px", 
    124                                         height: meta.height + "px", 
    125                                         position: 'absolute', 
    126                                         cursor: 'pointer', 
    127                                         left: 0, 
    128                                         top: 0, 
    129                                         margin: 0, 
    130                                         padding: 0, 
    131                                         'text-decoration': 'none' 
    132                                 } 
    133                         }, 
    134                         logo: { 
    135                                 style: { 
    136                                         position: 'absolute', 
    137                                         width: logoDefaults.width + "px", 
    138                                         height: logoDefaults.height + "px", 
    139                                         'background-image': (['url(', logoDefaults.prefix, logoDefaults.file, ')']).join(''), 
    140                                         margin: 0, 
    141                                         padding: 0, 
    142                                         display: 'none', 
    143                                         'text-decoration': 'none' 
    144                                 }, 
    145                                 click: logoClickHandler() 
    146                         } 
    147                 }; 
    148                 var positions = logoDefaults.position.split("-"); 
    149                 for (var position in positions) { 
    150                         elements.logo.style[positions[position]] = logoDefaults.margin + "px"; 
    151                 } 
    152                 return elements; 
    153         } 
    154          
    155         function displayClickHandler(player) { 
    156                 return function(evt) { 
    157                         if (player.media === undefined) { 
    158                                 document.location.href = $.fn.jwplayerUtils.getAbsolutePath(player.meta().sources[player.meta().source].file); 
    159                                 return; 
    160                         } 
    161                         if (typeof evt.preventDefault != 'undefined') { 
    162                                 evt.preventDefault(); // W3C 
    163                         } else { 
    164                                 evt.returnValue = false; // IE 
    165                         } 
    166                         if (player.model.state != $.fn.jwplayer.states.PLAYING) { 
    167                                 player.play(); 
    168                         } else { 
    169                                 player.pause(); 
    170                         } 
    171                 }; 
    172         } 
    173          
    174         function logoClickHandler() { 
    175                 return function(evt) { 
    176                         evt.stopPropagation(); 
     143                        click: jwplayer.html5.display.logoClickHandler() 
     144                } 
     145        }; 
     146        var positions = jwplayer.html5.display.logoDefaults.position.split("-"); 
     147        for (var position in positions) { 
     148                elements.logo.style[positions[position]] = jwplayer.html5.display.logoDefaults.margin + "px"; 
     149        } 
     150        return elements; 
     151}; 
     152 
     153 
     154jwplayer.html5.display.displayClickHandler = function(player) { 
     155        return function(evt) { 
     156                if (player._media === undefined) { 
     157                        document.location.href = jwplayer.html5.utils.getAbsolutePath(player.meta().sources[player.meta().source].file); 
    177158                        return; 
    178                 }; 
    179         } 
    180          
    181         function setIcon(player, path) { 
    182                 $("#" + player.id + "_displayIcon")[0].src = path; 
    183         } 
    184          
    185         function animate(element, state) { 
    186                 var speed = 'slow'; 
    187                 if (!displays[player.id].animate) { 
    188                         return; 
    189                 } 
    190                 if (state) { 
    191                         element.slideDown(speed, function() { 
    192                                 animate(element); 
    193                         }); 
     159                } 
     160                if (typeof evt.preventDefault != 'undefined') { 
     161                        evt.preventDefault(); // W3C 
    194162                } else { 
    195                         element.slideUp(speed, function() { 
    196                                 animate(element, true); 
    197                         }); 
    198                 } 
    199         } 
    200          
    201          
    202         function stateHandler(obj) { 
     163                        evt.returnValue = false; // IE 
     164                } 
     165                if (player._model.state != jwplayer.html5.states.PLAYING) { 
     166                        player.play(); 
     167                } else { 
     168                        player.pause(); 
     169                } 
     170        }; 
     171}; 
     172 
     173 
     174jwplayer.html5.display.logoClickHandler = function() { 
     175        return function(evt) { 
     176                evt.stopPropagation(); 
     177                return; 
     178        }; 
     179}; 
     180 
     181 
     182jwplayer.html5.display.setIcon = function(player, path) { 
     183        $("#" + player.id + "_displayIcon")[0].src = path; 
     184}; 
     185 
     186 
     187jwplayer.html5.display.animate = function(element, state) { 
     188        var speed = 'slow'; 
     189        if (!player._model.components.display.animate) { 
     190                return; 
     191        } 
     192        if (state) { 
     193                element.slideDown(speed, function() { 
     194                        jwplayer.html5.display.animate(element); 
     195                }); 
     196        } else { 
     197                element.slideUp(speed, function() { 
     198                        jwplayer.html5.display.animate(element, true); 
     199                }); 
     200        } 
     201}; 
     202 
     203 
     204jwplayer.html5.display.stateHandler = function(player) { 
     205        return function(obj) { 
    203206                player = $.jwplayer(obj.id); 
    204                 displays[player.id].animate = false; 
    205                 switch (player.model.state) { 
    206                         case $.fn.jwplayer.states.BUFFERING: 
     207                player._model.components.display.animate = false; 
     208                switch (player._model.state) { 
     209                        case jwplayer.html5.states.BUFFERING: 
    207210                                displays[obj.id].logo.fadeIn(0, function() { 
    208211                                        setTimeout(function() { 
    209                                                 displays[obj.id].logo.fadeOut(logoDefaults.out * 1000); 
    210                                         }, logoDefaults.timeout * 1000); 
     212                                                displays[obj.id].logo.fadeOut(jwplayer.html5.display.logoDefaults.out * 1000); 
     213                                        }, jwplayer.html5.display.logoDefaults.timeout * 1000); 
    211214                                }); 
    212215                                displays[obj.id].displayIcon[0].src = player.skin.display.elements.bufferIcon.src; 
     
    216219                                        left: (player.skin.display.elements.background.width - player.skin.display.elements.bufferIcon.width) / 2 + "px" 
    217220                                }); 
    218                                 displays[player.id].animate = true; 
     221                                player._model.components.display.animate = true; 
    219222                                // TODO: Buffer Icon rotation 
    220223                                if (false) { 
    221                                         animate(displays[obj.id].displayIconBackground); 
     224                                        jwplayer.html5.display.animate(displays[obj.id].displayIconBackground); 
    222225                                } 
    223226                                displays[obj.id].displayIconBackground.css('display', 'none'); 
    224227                                break; 
    225                         case $.fn.jwplayer.states.PAUSED: 
     228                        case jwplayer.html5.states.PAUSED: 
    226229                                displays[obj.id].logo.fadeIn(0); 
    227230                                displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); 
     
    234237                                }); 
    235238                                break; 
    236                         case $.fn.jwplayer.states.IDLE: 
     239                        case jwplayer.html5.states.IDLE: 
    237240                                displays[obj.id].logo.fadeOut(0); 
    238                                 displays[obj.id].displayImage.css("background", "#ffffff url('" + $.fn.jwplayerUtils.getAbsolutePath(player.config.image) + "') no-repeat center center"); 
     241                                displays[obj.id].displayImage.css("background", "#ffffff url('" + jwplayer.html5.utils.getAbsolutePath(player.config.image) + "') no-repeat center center"); 
    239242                                displays[obj.id].displayIconBackground.css("display", "block"); 
    240243                                displays[obj.id].displayIcon[0].src = player.skin.display.elements.playIcon.src; 
     
    263266                                        displays[obj.id].logo.fadeIn(0, function() { 
    264267                                                setTimeout(function() { 
    265                                                         displays[obj.id].logo.fadeOut(logoDefaults.out * 1000); 
    266                                                 }, logoDefaults.timeout * 1000); 
     268                                                        displays[obj.id].logo.fadeOut(jwplayer.html5.display.logoDefaults.out * 1000); 
     269                                                }, jwplayer.html5.display.logoDefaults.timeout * 1000); 
    267270                                        }); 
    268271                                        displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); 
     
    272275                                break; 
    273276                } 
    274         } 
    275          
    276 })(jQuery); 
     277        }; 
     278}; 
     279 
  • trunk/html5/src/html5/jwplayer.html5.js

    r1189 r1190  
    22 * Core component of the JW Player (initialization, API). 
    33 * 
    4  * @author jeroen 
    5  * @version 1.0alpha 
    6  * @lastmodifiedauthor zach 
    7  * @lastmodifieddate 2010-04-11 
     4 * @author zach 
     5 * @version 1.0 
    86 */ 
    9 (function($) { 
    10         /** Map with all players on the page. **/ 
    11         var players = {}; 
    12          
    13         /** Hooking the controlbar up to jQuery. **/ 
    14         $.fn.jwplayer = function(options) { 
    15                 return this.each(function() { 
    16                         $.fn.jwplayerUtils.log("Starting setup", this); 
    17                         return setupJWPlayer($(this), 0, options); 
    18                 }); 
    19         }; 
    20          
    21         function setupJWPlayer(player, step, options) { 
    22                 try { 
    23                         switch (step) { 
    24                                 case 0: 
    25                                         var model = $.fn.jwplayerModel(player, options); 
    26                                         var jwplayer = { 
    27                                                 model: model, 
    28                                                 listeners: {} 
    29                                         }; 
    30                                         return setupJWPlayer(jwplayer, step + 1); 
    31                                 case 1: 
    32                                         player.controller = $.fn.jwplayerController(player); 
    33                                         players[player.model.config.id] = player; 
    34                                         setupJWPlayer($.extend(player, api(player)), step + 1); 
    35                                         return player; 
    36                                 case 2: 
    37                                         $.fn.jwplayerSkinner(player, function() { 
    38                                                 setupJWPlayer(player, step + 1); 
    39                                         }); 
    40                                         break; 
    41                                 case 3: 
    42                                         $.fn.jwplayerView(player); 
    43                                         setupJWPlayer(player, step + 1); 
    44                                         break; 
    45                                 case 4: 
    46                                         $.fn.jwplayerModel.setActiveMediaProvider(player); 
    47                                         if ((player.media === undefined) || !player.media.hasChrome) { 
    48                                                 setupJWPlayer(player, step + 1); 
    49                                         } 
    50                                         break; 
    51                                 case 5: 
    52                                         $.fn.jwplayerDisplay($.jwplayer(player.id), player.model.domelement); 
    53                                         if (player.media === undefined) { 
    54                                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 
    55                                         } else { 
    56                                                 setupJWPlayer(player, step + 1); 
    57                                         } 
    58                                         break; 
    59                                 case 6: 
    60                                         if (!$.fn.jwplayerUtils.isiPhone()) { 
    61                                                 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 
    62                                         } 
    63                                         setupJWPlayer(player, step + 1); 
    64                                         break; 
    65                                 case 7: 
    66                                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 
    67                                         setupJWPlayer(player, step + 1); 
    68                                         break; 
    69                                 default: 
    70                                         if (player.config.autostart === true) { 
    71                                                 player.play(); 
    72                                         } 
    73                                         break; 
    74                         } 
    75                 } catch (err) { 
    76                         $.fn.jwplayerUtils.log("Setup failed at step " + step, err); 
     7 
     8jwplayer = function(){}; 
     9 
     10jwplayer.html5 = function(domelement) { 
     11        this._domelement = domelement; 
     12        this.id = domelement.id; 
     13        return this.html5; 
     14}; 
     15 
     16jwplayer.html5.prototype = { 
     17        id: undefined, 
     18        version: "1.0", 
     19        skin: undefined, 
     20        _model: undefined, 
     21        _view: undefined, 
     22        _controller: undefined, 
     23        _listeners: undefined, 
     24        _media: undefined, 
     25        _domelement: undefined 
     26}; 
     27 
     28jwplayer.html5.setup = function(options){ 
     29        jwplayer.html5.utils.log("Starting setup", this); 
     30        jwplayer.html5._setup(this, 0, options); 
     31        return this; 
     32}; 
     33 
     34jwplayer.html5._setup = function(player, step, options) { 
     35        try { 
     36                switch (step) { 
     37                        case 0: 
     38                                player._model = new jwplayer.html5.model(options); 
     39                                player._model.domelement = $(player.domelement); 
     40                                jwplayer.html5._setup(player, step + 1); 
     41                                break; 
     42                        case 1: 
     43                                player._controller = jwplayer.html5.controller(player); 
     44                                jwplayer.html5._setup($.extend(player, jwplayer.html5._api(player)), step + 1); 
     45                                break; 
     46                        case 2: 
     47                                jwplayer.html5.skinner(player, function() { 
     48                                        jwplayer.html5._setup(player, step + 1); 
     49                                }); 
     50                                break; 
     51                        case 3: 
     52                                jwplayer.html5.view(player); 
     53                                jwplayer.html5._setup(player, step + 1); 
     54                                break; 
     55                        case 4: 
     56                                jwplayer.html5.model.setActiveMediaProvider(player); 
     57                                if ((player._media === undefined) || !player._media.hasChrome) { 
     58                                        jwplayer.html5._setup(player, step + 1); 
     59                                } 
     60                                break; 
     61                        case 5: 
     62                                jwplayer.html5.display(player, player._model.domelement); 
     63                                if (player._media === undefined) { 
     64                                        player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 
     65                                } else { 
     66                                        jwplayer.html5._setup(player, step + 1); 
     67                                } 
     68                                break; 
     69                        case 6: 
     70                                if (!jwplayer.html5.utils.isiPhone()) { 
     71                                        jwplayer.html5.controlbar(player, player._model.domelement); 
     72                                } 
     73                                jwplayer.html5._setup(player, step + 1); 
     74                                break; 
     75                        case 7: 
     76                                player.sendEvent(jwplayer.html5.events.JWPLAYER_READY); 
     77                                jwplayer.html5._setup(player, step + 1); 
     78                                break; 
     79                        default: 
     80                                if (player.config.autostart === true) { 
     81                                        player.play(); 
     82                                } 
     83                                break; 
    7784                } 
     85        } catch (err) { 
     86                jwplayer.html5.utils.log("Setup failed at step " + step, err); 
    7887        } 
    79          
    80          
    81         /** Map with config for the controlbar plugin. **/ 
    82         $.fn.jwplayer.defaults = { 
    83                 autostart: false, 
    84                 file: undefined, 
    85                 height: 295, 
    86                 image: undefined, 
    87                 skin: undefined, 
    88                 volume: 90, 
    89                 width: 480, 
    90                 mute: false, 
    91                 bufferlength: 5, 
    92                 start: 0, 
    93                 position: 0, 
    94                 debug: undefined, 
    95                 flashplayer: undefined, 
    96                 repeat: false 
    97         }; 
    98          
    99          
    100         /** A factory for API calls that either set listeners or return data **/ 
    101         function dataListenerFactory(player, dataType, eventType) { 
    102                 return function(arg) { 
    103                         switch ($.fn.jwplayerUtils.typeOf(arg)) { 
    104                                 case "function": 
    105                                         if (!$.fn.jwplayerUtils.isNull(eventType)) { 
    106                                                 player.addEventListener(eventType, arg); 
    107                                         } 
    108                                         break; 
    109                                 default: 
    110                                         if (!$.fn.jwplayerUtils.isNull(dataType)) { 
    111                                                 return player.controller.mediaInfo()[dataType]; 
    112                                         } 
    113                                         return player.controller.mediaInfo(); 
    114                         } 
    115                         return $.jwplayer(player.id); 
    116                 }; 
    117         } 
    118          
    119          
    120         function api(player) { 
    121                 if (!$.fn.jwplayerUtils.isNull(player.id)) { 
    122                         return player; 
    123                 } 
    124                 return { 
    125                         play: player.controller.play, 
    126                         pause: player.controller.pause, 
    127                         stop: player.controller.stop, 
    128                         seek: player.controller.seek, 
    129                          
    130                         resize: player.controller.resize, 
    131                         fullscreen: player.controller.fullscreen, 
    132                         volume: player.controller.volume, 
    133                         mute: player.controller.mute, 
    134                         load: player.controller.load, 
    135                          
    136                         addEventListener: player.controller.addEventListener, 
    137                         removeEventListener: player.controller.removeEventListener, 
    138                         sendEvent: player.controller.sendEvent, 
    139                          
    140                         ready: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_READY), 
    141                         error: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_ERROR), 
    142                         complete: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE), 
    143                         state: dataListenerFactory(player, 'state', $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE), 
    144                         buffer: dataListenerFactory(player, 'buffer', $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER), 
    145                         time: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME), 
    146                         position: dataListenerFactory(player, 'position'), 
    147                         duration: dataListenerFactory(player, 'duration'), 
    148                         width: dataListenerFactory(player, 'width'), 
    149                         height: dataListenerFactory(player, 'height'), 
    150                         meta: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_META), 
    151                          
    152                         id: player.model.config.id, 
    153                         config: player.model.config, 
    154                         version: '0.1-alpha', 
    155                         skin: player.skin 
    156                 }; 
    157         } 
    158          
    159         function jwplayer(selector) { 
    160                 if ($.fn.jwplayerUtils.isNull(selector)) { 
    161                         for (var player in players) { 
    162                                 return api(players[player]); 
    163                         } 
    164                 } else { 
    165                         if (selector.indexOf('#') === 0) { 
    166                                 selector = selector.substr(1, selector.length); 
    167                         } 
    168                         return api(players[selector]); 
    169                 } 
    170                 return null; 
    171         } 
    172          
    173         $.fn.jwplayer.states = { 
    174                 IDLE: 'IDLE', 
    175                 BUFFERING: 'BUFFERING', 
    176                 PLAYING: 'PLAYING', 
    177                 PAUSED: 'PAUSED' 
    178         }; 
    179          
    180         $.fn.jwplayer.events = { 
    181                 JWPLAYER_READY: 'jwplayerReady', 
    182                 JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', 
    183                 JWPLAYER_RESIZE: 'jwplayerResize', 
    184                 //JWPLAYER_LOCKED: 'jwplayerLocked', 
    185                 //JWPLAYER_UNLOCKED: 'jwplayerLocked', 
    186                 JWPLAYER_ERROR: 'jwplayerError', 
    187                 JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', 
    188                 JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', 
    189                 JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', 
    190                 JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', 
    191                 JWPLAYER_MEDIA_COMPLETE: 'jwplayerMediaComplete', 
    192                 JWPLAYER_MEDIA_TIME: 'jwplayerMediaTime', 
    193                 JWPLAYER_MEDIA_VOLUME: 'jwplayerMediaVolume', 
    194                 JWPLAYER_MEDIA_META: 'jwplayerMediaMeta', 
    195                 JWPLAYER_MEDIA_MUTE: 'jwplayerMediaMute', 
    196                 JWPLAYER_PLAYER_STATE: 'jwplayerPlayerState' 
    197         }; 
    198          
    199         /** Extending jQuery **/ 
    200         $.extend({ 
    201                 'jwplayer': jwplayer 
    202         }); 
    203          
    204         /** Automatically initializes the player for all <video> tags with the JWPlayer class. **/ 
    205         $(document).ready(function() { 
    206                 $("video.jwplayer").jwplayer(); 
    207         }); 
    208          
    209 })(jQuery); 
     88}; 
  • trunk/html5/src/html5/jwplayer.html5.mediavideo.js

    r1189 r1190  
    66 * @lastmodifieddate 2010-04-12 
    77 */ 
    8 (function($) { 
    9         var states = { 
    10                 "ended": $.fn.jwplayer.states.IDLE, 
    11                 "playing": $.fn.jwplayer.states.PLAYING, 
    12                 "pause": $.fn.jwplayer.states.PAUSED, 
    13                 "buffering": $.fn.jwplayer.states.BUFFERING 
    14         }; 
     8jwplayer.html5.mediavideo = function(player) { 
     9        player._model.domelement.attr('loop', player._model.config.repeat); 
     10        var media = { 
     11                play: jwplayer.html5.mediavideo.play(player), 
     12                pause: jwplayer.html5.mediavideo.pause(player), 
     13                seek: jwplayer.html5.mediavideo.seek(player), 
     14                stop: jwplayer.html5.mediavideo.stop(player), 
     15                volume: jwplayer.html5.mediavideo.volume(player), 
     16                mute: jwplayer.html5.mediavideo.mute(player), 
     17                fullscreen: jwplayer.html5.mediavideo.fullscreen(player), 
     18                load: jwplayer.html5.mediavideo.load(player), 
     19                resize: jwplayer.html5.mediavideo.resize(player), 
     20                state: jwplayer.html5.states.IDLE, 
     21                interval: null, 
     22                loadcount: 0, 
     23                hasChrome: false 
     24        }; 
     25        player._media = media; 
     26        media.mute(player.mute()); 
     27        media.volume(player.volume()); 
     28        $.each(jwplayer.html5.mediavideo.events, function(event, handler) { 
     29                player.domelement.addEventListener(event, function(event) { 
     30                        handler(event, player); 
     31                }, true); 
     32        }); 
     33}; 
     34 
     35jwplayer.html5.mediavideo.states = { 
     36        "ended": jwplayer.html5.states.IDLE, 
     37        "playing": jwplayer.html5.states.PLAYING, 
     38        "pause": jwplayer.html5.states.PAUSED, 
     39        "buffering": jwplayer.html5.states.BUFFERING 
     40}; 
     41 
     42jwplayer.html5.mediavideo.events = { 
     43        'abort': jwplayer.html5.mediavideo.generalHandler, 
     44        'canplay': jwplayer.html5.mediavideo.stateHandler, 
     45        'canplaythrough': jwplayer.html5.mediavideo.stateHandler, 
     46        'durationchange': jwplayer.html5.mediavideo.metaHandler, 
     47        'emptied': jwplayer.html5.mediavideo.generalHandler, 
     48        'ended': jwplayer.html5.mediavideo.stateHandler, 
     49        'error': jwplayer.html5.mediavideo.errorHandler, 
     50        'loadeddata': jwplayer.html5.mediavideo.metaHandler, 
     51        'loadedmetadata': jwplayer.html5.mediavideo.metaHandler, 
     52        'loadstart': jwplayer.html5.mediavideo.stateHandler, 
     53        'pause': jwplayer.html5.mediavideo.stateHandler, 
     54        'play': jwplayer.html5.mediavideo.positionHandler, 
     55        'playing': jwplayer.html5.mediavideo.stateHandler, 
     56        'progress': jwplayer.html5.mediavideo.progressHandler, 
     57        'ratechange': jwplayer.html5.mediavideo.generalHandler, 
     58        'seeked': jwplayer.html5.mediavideo.stateHandler, 
     59        'seeking': jwplayer.html5.mediavideo.stateHandler, 
     60        'stalled': jwplayer.html5.mediavideo.stateHandler, 
     61        'suspend': jwplayer.html5.mediavideo.stateHandler, 
     62        'timeupdate': jwplayer.html5.mediavideo.positionHandler, 
     63        'volumechange': jwplayer.html5.mediavideo.generalHandler, 
     64        'waiting': jwplayer.html5.mediavideo.stateHandler, 
     65        'canshowcurrentframe': jwplayer.html5.mediavideo.generalHandler, 
     66        'dataunavailable': jwplayer.html5.mediavideo.generalHandler, 
     67        'empty': jwplayer.html5.mediavideo.generalHandler, 
     68        'load': jwplayer.html5.mediavideo.generalHandler, 
     69        'loadedfirstframe': jwplayer.html5.mediavideo.generalHandler 
     70}; 
     71 
     72jwplayer.html5.mediavideo.stateHandler = function(event, player) { 
     73        if (jwplayer.html5.mediavideo.states[event.type]) { 
     74                jwplayer.html5.mediavideo.setState(player, jwplayer.html5.mediavideo.states[event.type]); 
     75        } 
     76}; 
     77 
     78 
     79jwplayer.html5.mediavideo.setState = function(player, newstate) { 
     80        if (player._media.stopped) { 
     81                newstate = jwplayer.html5.states.IDLE; 
     82        } 
     83        if (player._model.state != newstate) { 
     84                var oldstate = player._model.state; 
     85                player._media.state = newstate; 
     86                player._model.state = newstate; 
     87                player.sendEvent(jwplayer.html5.events.JWPLAYER_PLAYER_STATE, { 
     88                        oldstate: oldstate, 
     89                        newstate: newstate 
     90                }); 
     91        } 
     92        if (newstate == jwplayer.html5.states.IDLE) { 
     93                clearInterval(player._media.interval); 
     94                player._media.interval = null; 
     95                player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_COMPLETE); 
     96                if (player._model.config.repeat && !player._media.stopped) { 
     97                        player.play(); 
     98                } 
     99                if (player._model.domelement.css('display') != 'none') { 
     100                        player._model.domelement.css('display', 'none'); 
     101                } 
     102        } 
     103        player._media.stopped = false; 
     104}; 
     105 
     106 
     107jwplayer.html5.mediavideo.metaHandler = function(event, player) { 
     108        var meta = { 
     109                height: event.target.videoHeight, 
     110                width: event.target.videoWidth, 
     111                duration: event.target.duration 
     112        }; 
     113        if (player._model.duration === 0) { 
     114                player._model.duration = event.target.duration; 
     115        } 
     116        player._model.sources[player._model.source] = $.extend(player._model.sources[player._model.source], meta); 
     117        player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_META, meta); 
     118}; 
     119 
     120 
     121jwplayer.html5.mediavideo.positionHandler = function(event, player) { 
     122        if (player._media.stopped) { 
     123                return; 
     124        } 
     125        if (!jwplayer.html5.utils.isNull(event.target)) { 
     126                if (player._model.duration === 0) { 
     127                        player._model.duration = event.target.duration; 
     128                } 
     129                 
     130                if (player._media.state == jwplayer.html5.states.PLAYING) { 
     131                        player._model.position = Math.round(event.target.currentTime * 10) / 10; 
     132                        player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_TIME, { 
     133                                position: Math.round(event.target.currentTime * 10) / 10, 
     134                                duration: Math.round(event.target.duration * 10) / 10 
     135                        }); 
     136                } 
     137        } 
     138        jwplayer.html5.mediavideo.progressHandler({}, player); 
     139}; 
     140 
     141 
     142jwplayer.html5.mediavideo.progressHandler = function(event, player) { 
     143        var bufferPercent, bufferTime, bufferFill; 
     144        if (!isNaN(event.loaded / event.total)) { 
     145                bufferPercent = event.loaded / event.total * 100; 
     146                bufferTime = bufferPercent / 100 * (player._model.duration - player.domelement.currentTime); 
     147        } else if ((player.domelement.buffered !== undefined) && (player.domelement.buffered.length > 0)) { 
     148                maxBufferIndex = 0; 
     149                if (maxBufferIndex >= 0) { 
     150                        bufferPercent = player.domelement.buffered.end(maxBufferIndex) / player.domelement.duration * 100; 
     151                        bufferTime = player.domelement.buffered.end(maxBufferIndex) - player.domelement.currentTime; 
     152                } 
     153        } 
    15154         
    16         var events = { 
    17                 'abort': generalHandler, 
    18                 'canplay': stateHandler, 
    19                 'canplaythrough': stateHandler, 
    20                 'durationchange': metaHandler, 
    21                 'emptied': generalHandler, 
    22                 'ended': stateHandler, 
    23                 'error': errorHandler, 
    24                 'loadeddata': metaHandler, 
    25                 'loadedmetadata': metaHandler, 
    26                 'loadstart': stateHandler, 
    27                 'pause': stateHandler, 
    28                 'play': positionHandler, 
    29                 'playing': stateHandler, 
    30                 'progress': progressHandler, 
    31                 'ratechange': generalHandler, 
    32                 'seeked': stateHandler, 
    33                 'seeking': stateHandler, 
    34                 'stalled': stateHandler, 
    35                 'suspend': stateHandler, 
    36                 'timeupdate': positionHandler, 
    37                 'volumechange': generalHandler, 
    38                 'waiting': stateHandler, 
    39                 'canshowcurrentframe': generalHandler, 
    40                 'dataunavailable': generalHandler, 
    41                 'empty': generalHandler, 
    42                 'load': generalHandler, 
    43                 'loadedfirstframe': generalHandler 
    44         }; 
     155        bufferFill = bufferTime / player._model.config.bufferlength * 100; 
    45156         
     157        // TODO: Buffer underrun 
     158        if (false) { 
     159                if (bufferFill < 25 && player._media.state == jwplayer.html5.states.PLAYING) { 
     160                        jwplayer.html5.mediavideo.setState(jwplayer.html5.states.BUFFERING); 
     161                        player._media.bufferFull = false; 
     162                        if (!player.domelement.seeking) { 
     163                                player.domelement.pause(); 
     164                        } 
     165                } else if (bufferFill > 95 && player._media.state == jwplayer.html5.states.BUFFERING && player._media.bufferFull === false && bufferTime > 0) { 
     166                        player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
     167                } 
     168        } 
    46169         
    47         $.fn.jwplayerMediaVideo = function(player) { 
    48                 player.model.domelement.attr('loop', player.config.repeat); 
    49                 var media = { 
    50                         play: play(player), 
    51                         pause: pause(player), 
    52                         seek: seek(player), 
    53                         stop: stop(player), 
    54                         volume: volume(player), 
    55                         mute: mute(player), 
    56                         fullscreen: fullscreen(player), 
    57                         load: load(player), 
    58                         resize: resize(player), 
    59                         state: $.fn.jwplayer.states.IDLE, 
    60                         interval: null, 
    61                         loadcount: 0, 
    62                         hasChrome: false 
    63                 }; 
    64                 player.media = media; 
    65                 media.mute(player.mute()); 
    66                 media.volume(player.volume()); 
    67                 $.each(events, function(event, handler) { 
    68                         player.model.domelement[0].addEventListener(event, function(event) { 
    69                                 handler(event, player); 
    70                         }, true); 
     170        if (player._media.bufferFull === false) { 
     171                player._media.bufferFull = true; 
     172                player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
     173        } 
     174         
     175        if (!player._media.bufferingComplete) { 
     176                if (bufferPercent == 100 && player._media.bufferingComplete === false) { 
     177                        player._media.bufferingComplete = true; 
     178                } 
     179                 
     180                if (!jwplayer.html5.utils.isNull(bufferPercent)) { 
     181                        player._model.buffer = Math.round(bufferPercent); 
     182                        player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_BUFFER, { 
     183                                bufferPercent: Math.round(bufferPercent) 
     184                                //bufferingComplete: player._media.bufferingComplete, 
     185                                //bufferFull: player._media.bufferFull, 
     186                                //bufferFill: bufferFill, 
     187                                //bufferTime: bufferTime 
     188                        }); 
     189                } 
     190                 
     191        } 
     192}; 
     193 
     194 
     195jwplayer.html5.mediavideo.startInterval = function(player) { 
     196        if (player._media.interval === null) { 
     197                player._media.interval = window.setInterval(function() { 
     198                        jwplayer.html5.mediavideo.positionHandler({}, player); 
     199                }, 100); 
     200        } 
     201}; 
     202 
     203 
     204jwplayer.html5.mediavideo.errorHandler = function(event, player) { 
     205        player.sendEvent(jwplayer.html5.events.JWPLAYER_ERROR, {}); 
     206}; 
     207 
     208 
     209jwplayer.html5.mediavideo.play = function(player) { 
     210        return function() { 
     211                if (player._media.state != jwplayer.html5.states.PLAYING) { 
     212                        jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.PLAYING); 
     213                        player.domelement.play(); 
     214                } 
     215        }; 
     216}; 
     217 
     218 
     219/** Switch the pause state of the player. **/ 
     220jwplayer.html5.mediavideo.pause = function(player) { 
     221        return function() { 
     222                player.domelement.pause(); 
     223        }; 
     224}; 
     225 
     226 
     227/** Seek to a position in the video. **/ 
     228jwplayer.html5.mediavideo.seek = function(player) { 
     229        return function(position) { 
     230                player.domelement.currentTime = position; 
     231                player.domelement.play(); 
     232        }; 
     233}; 
     234 
     235 
     236/** Stop playback and loading of the video. **/ 
     237jwplayer.html5.mediavideo.stop = function(player) { 
     238        return function() { 
     239                player._media.stopped = true; 
     240                player.domelement.pause(); 
     241                clearInterval(player._media.interval); 
     242                player._media.interval = undefined; 
     243                player._model.position = 0; 
     244        }; 
     245}; 
     246 
     247 
     248/** Change the video's volume level. **/ 
     249jwplayer.html5.mediavideo.volume = function(player) { 
     250        return function(position) { 
     251                player._model.volume = position; 
     252                player.domelement.volume = position / 100; 
     253                player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_VOLUME, { 
     254                        volume: Math.round(player.domelement.volume * 100) 
    71255                }); 
    72256        }; 
    73          
    74         function generalHandler(event, player) { 
    75         } 
    76          
    77         function stateHandler(event, player) { 
    78                 if (states[event.type]) { 
    79                         setState(player, states[event.type]); 
    80                 } 
    81         } 
    82          
    83         function setState(player, newstate) { 
    84                 if (player.media.stopped) { 
    85                         newstate = $.fn.jwplayer.states.IDLE; 
    86                 } 
    87                 if (player.model.state != newstate) { 
    88                         var oldstate = player.model.state; 
    89                         player.media.state = newstate; 
    90                         player.model.state = newstate; 
    91                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 
    92                                 oldstate: oldstate, 
    93                                 newstate: newstate 
    94                         }); 
    95                 } 
    96                 if (newstate == $.fn.jwplayer.states.IDLE) { 
    97                         clearInterval(player.media.interval); 
    98                         player.media.interval = null; 
    99                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE); 
    100                         if (player.config.repeat && !player.media.stopped) { 
    101                                 player.play(); 
     257}; 
     258 
     259 
     260/** Switch the mute state of the player. **/ 
     261jwplayer.html5.mediavideo.mute = function(player) { 
     262        return function(state) { 
     263                player._model.mute = state; 
     264                player.domelement.muted = state; 
     265                player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_MUTE, { 
     266                        mute: player.domelement.muted 
     267                }); 
     268        }; 
     269}; 
     270 
     271 
     272/** Resize the player. **/ 
     273jwplayer.html5.mediavideo.resize = function(player) { 
     274        return function(width, height) { 
     275                // TODO: Fullscreen 
     276                if (false) { 
     277                        $("#" + player.id + "_jwplayer").css("position", 'fixed'); 
     278                        $("#" + player.id + "_jwplayer").css("top", '0'); 
     279                        $("#" + player.id + "_jwplayer").css("left", '0'); 
     280                        $("#" + player.id + "_jwplayer").css("width", width); 
     281                        $("#" + player.id + "_jwplayer").css("height", height); 
     282                        player._model.width = $("#" + player.id + "_jwplayer").width; 
     283                        player._model.height = $("#" + player.id + "_jwplayer").height; 
     284                } 
     285                player.sendEvent(jwplayer.html5.events.JWPLAYER_MEDIA_RESIZE, { 
     286                        fullscreen: player._model.fullscreen, 
     287                        width: width, 
     288                        hieght: height 
     289                }); 
     290        }; 
     291}; 
     292 
     293 
     294/** Switch the fullscreen state of the player. **/ 
     295jwplayer.html5.mediavideo.fullscreen = function(player) { 
     296        return function(state) { 
     297                player._model.fullscreen = state; 
     298                if (state === true) { 
     299                        player.resize("100%", "100%"); 
     300                } else { 
     301                        player.resize(player._model.config.width, player._model.config.height); 
     302                } 
     303        }; 
     304}; 
     305 
     306 
     307/** Load a new video into the player. **/ 
     308jwplayer.html5.mediavideo.load = function(player) { 
     309        return function(path) { 
     310                if (player._model.domelement.css('display') == 'none') { 
     311                        player._model.domelement.css('display', 'block'); 
     312                } 
     313                 
     314                setTimeout(function() { 
     315                        path = jwplayer.html5.utils.getAbsolutePath(path); 
     316                        if (path == player.domelement.src && player._media.loadcount > 0) { 
     317                                player._model.position = 0; 
     318                                player.domelement.currentTime = 0; 
     319                                jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.BUFFERING); 
     320                                jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.PLAYING); 
     321                                if (player.domelement.paused) { 
     322                                        player.domelement.play(); 
     323                                } 
     324                                return; 
     325                        } else if (path != player.domelement.src) { 
     326                                player._media.loadcount = 0; 
    102327                        } 
    103                         if (player.model.domelement.css('display') != 'none') { 
    104                                 player.model.domelement.css('display', 'none'); 
     328                        player._media.loadcount++; 
     329                        player._media.bufferFull = false; 
     330                        player._media.bufferingComplete = false; 
     331                        jwplayer.html5.mediavideo.setState(player, jwplayer.html5.states.BUFFERING); 
     332                        player.domelement.src = path; 
     333                        player.domelement.load(); 
     334                        jwplayer.html5.mediavideo.startInterval(player); 
     335                        try { 
     336                                player.domelement.currentTime = 0; 
     337                        } catch (err) { 
     338                         
    105339                        } 
    106                 } 
    107                 player.media.stopped = false; 
    108         } 
    109          
    110         function metaHandler(event, player) { 
    111                 var meta = { 
    112                         height: event.target.videoHeight, 
    113                         width: event.target.videoWidth, 
    114                         duration: event.target.duration 
    115                 }; 
    116                 if (player.model.duration === 0) { 
    117                         player.model.duration = event.target.duration; 
    118                 } 
    119                 player.model.sources[player.model.source] = $.extend(player.model.sources[player.model.source], meta); 
    120                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_META, meta); 
    121         } 
    122          
    123         function positionHandler(event, player) { 
    124                 if (player.media.stopped) { 
    125                         return; 
    126                 } 
    127                 if (!$.fn.jwplayerUtils.isNull(event.target)) { 
    128                         if (player.model.duration === 0) { 
    129                                 player.model.duration = event.target.duration; 
    130                         } 
    131                          
    132                         if (player.media.state == $.fn.jwplayer.states.PLAYING) { 
    133                                 player.model.position = Math.round(event.target.currentTime * 10) / 10; 
    134                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 
    135                                         position: Math.round(event.target.currentTime * 10) / 10, 
    136                                         duration: Math.round(event.target.duration * 10) / 10 
    137                                 }); 
    138                         } 
    139                 } 
    140                 progressHandler({}, player); 
    141         } 
    142          
    143         function progressHandler(event, player) { 
    144                 var bufferPercent, bufferTime, bufferFill; 
    145                 if (!isNaN(event.loaded / event.total)) { 
    146                         bufferPercent = event.loaded / event.total * 100; 
    147                         bufferTime = bufferPercent / 100 * (player.model.duration - player.model.domelement[0].currentTime); 
    148                 } else if ((player.model.domelement[0].buffered !== undefined) && (player.model.domelement[0].buffered.length > 0)) { 
    149                         maxBufferIndex = 0; 
    150                         if (maxBufferIndex >= 0) { 
    151                                 bufferPercent = player.model.domelement[0].buffered.end(maxBufferIndex) / player.model.domelement[0].duration * 100; 
    152                                 bufferTime = player.model.domelement[0].buffered.end(maxBufferIndex) - player.model.domelement[0].currentTime; 
    153                         } 
    154                 } 
    155                  
    156                 bufferFill = bufferTime / player.model.config.bufferlength * 100; 
    157                  
    158                 // TODO: Buffer underrun 
    159                 if (false) { 
    160                         if (bufferFill < 25 && player.media.state == $.fn.jwplayer.states.PLAYING) { 
    161                                 setState($.fn.jwplayer.states.BUFFERING); 
    162                                 player.media.bufferFull = false; 
    163                                 if (!player.model.domelement[0].seeking) { 
    164                                         player.model.domelement[0].pause(); 
    165                                 } 
    166                         } else if (bufferFill > 95 && player.media.state == $.fn.jwplayer.states.BUFFERING && player.media.bufferFull === false && bufferTime > 0) { 
    167                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
    168                         } 
    169                 } 
    170                  
    171                 if (player.media.bufferFull === false) { 
    172                         player.media.bufferFull = true; 
    173                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 
    174                 } 
    175                  
    176                 if (!player.media.bufferingComplete) { 
    177                         if (bufferPercent == 100 && player.media.bufferingComplete === false) { 
    178                                 player.media.bufferingComplete = true; 
    179                         } 
    180                          
    181                         if (!$.fn.jwplayerUtils.isNull(bufferPercent)) { 
    182                                 player.model.buffer = Math.round(bufferPercent); 
    183                                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 
    184                                         bufferPercent: Math.round(bufferPercent) 
    185                                         //bufferingComplete: player.media.bufferingComplete, 
    186                                         //bufferFull: player.media.bufferFull, 
    187                                         //bufferFill: bufferFill, 
    188                                         //bufferTime: bufferTime 
    189                                 }); 
    190                         } 
    191                          
    192                 } 
    193         } 
    194          
    195         function startInterval(player) { 
    196                 if (player.media.interval === null) { 
    197                         player.media.interval = window.setInterval(function() { 
    198                                 positionHandler({}, player); 
    199                         }, 100); 
    200                 } 
    201         } 
    202          
    203          
    204         function errorHandler(event, player) { 
    205                 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, {}); 
    206         } 
    207          
    208         function play(player) { 
    209                 return function() { 
    210                         if (player.media.state != $.fn.jwplayer.states.PLAYING) { 
    211                                 setState(player, $.fn.jwplayer.states.PLAYING); 
    212                                 player.model.domelement[0].play(); 
    213                         } 
    214                 }; 
    215         } 
    216          
    217         /** Switch the pause state of the player. **/ 
    218         function pause(player) { 
    219                 return function() { 
    220                         player.model.domelement[0].pause(); 
    221                 }; 
    222         } 
    223          
    224          
    225         /** Seek to a position in the video. **/ 
    226         function seek(player) { 
    227                 return function(position) { 
    228                         player.model.domelement[0].currentTime = position; 
    229                         player.model.domelement[0].play(); 
    230                 }; 
    231         } 
    232          
    233          
    234         /** Stop playback and loading of the video. **/ 
    235         function stop(player) { 
    236                 return function() { 
    237                         player.media.stopped = true; 
    238                         player.model.domelement[0].pause(); 
    239                         clearInterval(player.media.interval); 
    240                         player.media.interval = undefined; 
    241                         player.model.position = 0; 
    242                 }; 
    243         } 
    244          
    245          
    246         /** Change the video's volume level. **/ 
    247         function volume(player) { 
    248                 return function(position) { 
    249                         player.model.volume = position; 
    250                         player.model.domelement[0].volume = position / 100; 
    251                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, { 
    252                                 volume: Math.round(player.model.domelement[0].volume * 100) 
    253                         }); 
    254                 }; 
    255         } 
    256          
    257         /** Switch the mute state of the player. **/ 
    258         function mute(player) { 
    259                 return function(state) { 
    260                         player.model.mute = state; 
    261                         player.model.domelement[0].muted = state; 
    262                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, { 
    263                                 mute: player.model.domelement[0].muted 
    264                         }); 
    265                 }; 
    266         } 
    267          
    268         /** Resize the player. **/ 
    269         function resize(player) { 
    270                 return function(width, height) { 
    271                         // TODO: Fullscreen 
    272                         if (false) { 
    273                                 $("#" + player.id + "_jwplayer").css("position", 'fixed'); 
    274                                 $("#" + player.id + "_jwplayer").css("top", '0'); 
    275                                 $("#" + player.id + "_jwplayer").css("left", '0'); 
    276                                 $("#" + player.id + "_jwplayer").css("width", width); 
    277                                 $("#" + player.id + "_jwplayer").css("height", height); 
    278                                 player.model.width = $("#" + player.id + "_jwplayer").width; 
    279                                 player.model.height = $("#" + player.id + "_jwplayer").height; 
    280                         } 
    281                         player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_RESIZE, { 
    282                                 fullscreen: player.model.fullscreen, 
    283                                 width: width, 
    284                                 hieght: height 
    285                         }); 
    286                 }; 
    287         } 
    288          
    289         /** Switch the fullscreen state of the player. **/ 
    290         function fullscreen(player) { 
    291                 return function(state) { 
    292                         player.model.fullscreen = state; 
    293                         if (state === true) { 
    294                                 player.resize("100%", "100%"); 
    295                         } else { 
    296                                 player.resize(player.model.config.width, player.model.config.height); 
    297                         } 
    298                 }; 
    299         } 
    300          
    301         /** Load a new video into the player. **/ 
    302         function load(player) { 
    303                 return function(path) { 
    304                         if (player.model.domelement.css('display') == 'none') { 
    305                                 player.model.domelement.css('display', 'block'); 
    306                         } 
    307                          
    308                         setTimeout(function() { 
    309                                 path = $.fn.jwplayerUtils.getAbsolutePath(path); 
    310                                 if (path == player.model.domelement[0].src && player.media.loadcount > 0) { 
    311                                         player.model.position = 0; 
    312                                         player.model.domelement[0].currentTime = 0; 
    313                                         setState(player, $.fn.jwplayer.states.BUFFERING); 
    314                                         setState(player, $.fn.jwplayer.states.PLAYING); 
    315                                         if (player.model.domelement[0].paused) { 
    316                                                 player.model.domelement[0].play(); 
    317                                         } 
    318                                         return; 
    319                                 } else if (path != player.model.domelement[0].src) { 
    320                                         player.media.loadcount = 0; 
    321                                 } 
    322                                 player.media.loadcount++; 
    323                                 player.media.bufferFull = false; 
    324                                 player.media.bufferingComplete = false; 
    325                                 setState(player, $.fn.jwplayer.states.BUFFERING); 
    326                                 player.model.domelement[0].src = path; 
    327                                 player.model.domelement[0].load(); 
    328                                 startInterval(player); 
    329                                 try { 
    330                                         player.model.domelement[0].currentTime = 0;                                      
    331                                 } catch (err){ 
    332                                          
    333                                 } 
    334                         }, 25); 
    335                 }; 
    336         } 
    337          
    338 })(jQuery); 
     340                }, 25); 
     341        }; 
     342}; 
  • trunk/html5/src/html5/jwplayer.html5.model.js

    r1189 r1190  
    66 * @lastmodifieddate 2010-04-11 
    77 */ 
    8 (function($) { 
    9         var jwplayerid = 1; 
    10          
    11         var modelParams = { 
    12                 volume: 100, 
    13                 fullscreen: false, 
    14                 mute: false, 
    15                 start: 0, 
     8jwplayer.html5.model = function(options) { 
     9        $.extend(this.config, options); 
     10        this.sources = this.config.sources; 
     11        delete this.config.sources; 
     12        for (var index in jwplayer.html5.model._configurableStateVariables) { 
     13                var configurableStateVariable = jwplayer.html5.model._configurableStateVariables[index]; 
     14                this[configurableStateVariable] = this.config[configurableStateVariable]; 
     15        } 
     16        return this; 
     17}; 
     18 
     19jwplayer.html5.model.prototype = { 
     20        components: {}, 
     21        sources: {}, 
     22        state: jwplayer.html5.states.IDLE, 
     23        source: 0, 
     24        position: 0, 
     25        buffer: 0, 
     26        config: { 
    1627                width: 480, 
    1728                height: 320, 
    18                 duration: 0 
    19         }; 
    20          
    21         function createModel() { 
    22                 return { 
    23                         sources: {}, 
    24                         state: $.fn.jwplayer.states.IDLE, 
    25                         source: 0, 
    26                         buffer: 0 
    27                 }; 
     29                skin: undefined, 
     30                file: undefined, 
     31                image: undefined, 
     32                start: 0, 
     33                duration: 0, 
     34                bufferlength: 5, 
     35                volume: 90, 
     36                mute: false, 
     37                fullscreen: false, 
     38                repeat: false, 
     39                autostart: false, 
     40                debug: undefined 
    2841        } 
    29          
    30          
    31         $.fn.jwplayerModel = function(domElement, options) { 
    32                 var model = createModel(); 
    33                 model.config = $.extend(true, {}, $.fn.jwplayer.defaults, $.fn.jwplayerParse(domElement[0]), options); 
    34                 if ($.fn.jwplayerUtils.isNull(model.config.id)) { 
    35                         model.config.id = "jwplayer_" + jwplayerid++; 
     42}; 
     43 
     44jwplayer.html5.model._configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen"]; 
     45 
     46jwplayer.html5.model.setActiveMediaProvider = function(player) { 
     47        var source, sourceIndex; 
     48        for (sourceIndex in player._model.sources) { 
     49                source = player._model.sources[sourceIndex]; 
     50                if (source.type === undefined) { 
     51                        var extension = jwplayer.html5.utils.extension(source.file); 
     52                        if (extension == "ogv") { 
     53                                extension = "ogg"; 
     54                        } 
     55                        source.type = 'video/' + extension + ';'; 
    3656                } 
    37                 model.sources = model.config.sources; 
    38                 delete model.config.sources; 
    39                 model.domelement = domElement; 
    40                 for (var modelParam in modelParams) { 
    41                         if (!$.fn.jwplayerUtils.isNull(model.config[modelParam])) { 
    42                                 model[modelParam] = model.config[modelParam]; 
    43                         } else { 
    44                                 model[modelParam] = modelParams[modelParam]; 
    45                         } 
     57                if (jwplayer.html5.utils.supportsType(source.type)) { 
     58                        player._model.source = sourceIndex; 
     59                        jwplayer.html5.mediaVideo(player); 
     60                        return true; 
    4661                } 
    47                 //model = $.extend(true, {}, , model); 
    48                 return model; 
    49         }; 
    50          
    51         $.fn.jwplayerModel.setActiveMediaProvider = function(player) { 
    52                 var source, sourceIndex; 
    53                 for (sourceIndex in player.model.sources) { 
    54                         source = player.model.sources[sourceIndex]; 
    55                         if (source.type === undefined) { 
    56                                 var extension = $.fn.jwplayerUtils.extension(source.file); 
    57                                 if (extension == "ogv") { 
    58                                         extension = "ogg"; 
    59                                 } 
    60                                 source.type = 'video/' + extension + ';'; 
    61                         } 
    62                         if ($.fn.jwplayerUtils.supportsType(source.type)) { 
    63                                 player.model.source = sourceIndex; 
    64                                 $.fn.jwplayerMediaVideo(player); 
    65                                 return true; 
    66                         } 
    67                 } 
    68                 if ($.fn.jwplayerUtils.supportsFlash && player.state != $.fn.jwplayer.states.PLAYING) { 
    69                         for (sourceIndex in player.model.sources) { 
    70                                 source = player.model.sources[sourceIndex]; 
    71                                 if ($.fn.jwplayerUtils.flashCanPlay(source.file)) { 
    72                                         player.model.source = sourceIndex; 
    73                                         $.fn.jwplayerMediaFlash(player); 
    74                                         return true; 
    75                                 } 
    76                         } 
    77                 } 
    78                 return false; 
    79         }; 
    80          
    81 })(jQuery); 
     62        } 
     63        return false; 
     64}; 
  • trunk/html5/src/html5/jwplayer.html5.skinner.js

    r1189 r1190  
    77 * @lastmodifieddate 2010-04-11 
    88 */ 
    9 (function($) { 
    109 
    11         var players = {}; 
     10/** Constructor **/ 
     11jwplayer.html5.skinner = function(player, completeHandler) { 
     12        player.skin = { 
     13                _completeHandler: completeHandler, 
     14                properties: {} 
     15        }; 
     16        jwplayer.html5.skinner.load(player); 
     17}; 
     18 
     19/** Load the skin **/ 
     20jwplayer.html5.skinner.load = function(player) { 
     21        $.ajax({ 
     22                url: jwplayer.html5.utils.getAbsolutePath(player._model.config.skin), 
     23                complete: function(xmlrequest, textStatus) { 
     24                        if (textStatus == "success") { 
     25                                jwplayer.html5.skinner.loadSkin(player, xmlrequest.responseXML); 
     26                        } else { 
     27                                jwplayer.html5.skinner.loadSkin(player, jwplayer.html5.defaultSkin); 
     28                        } 
     29                } 
     30                 
     31        }); 
     32}; 
     33 
     34 
     35jwplayer.html5.skinner.loadSkin = function(player, xml) { 
     36        var components = $('component', xml); 
     37        if (components.length === 0) { 
     38                return; 
     39        } 
     40        for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 
     41                player.skin._loading = true; 
     42                 
     43                var componentName = $(components[componentIndex]).attr('name'); 
     44                var component = { 
     45                        settings: {}, 
     46                        elements: {} 
     47                }; 
     48                player.skin[componentName] = component; 
     49                var elements = $(components[componentIndex]).find('element'); 
     50                for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 
     51                        jwplayer.html5.skinner.loadImage(elements[elementIndex], componentName, player); 
     52                } 
     53                var settings = $(components[componentIndex]).find('setting'); 
     54                for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 
     55                        player.skin[componentName].settings[$(settings[settingIndex]).attr("name")] = $(settings[settingIndex]).attr("value"); 
     56                } 
     57                 
     58                player.skin._loading = false; 
     59                 
     60                jwplayer.html5.skinner.resetCompleteIntervalTest(player); 
     61        } 
     62}; 
     63 
     64 
     65jwplayer.html5.skinner.resetCompleteIntervalTest = function (player) { 
     66        clearInterval(player.skin._completeInterval); 
     67        player.skin._completeInterval = setInterval(function() { 
     68                jwplayer.html5.skinner.checkComplete(player); 
     69        }, 100); 
     70}; 
     71 
     72 
     73/** Load the data for a single element. **/ 
     74jwplayer.html5.skinner.loadImage = function(element, component, player) { 
     75        var img = new Image(); 
     76        var elementName = $(element).attr('name'); 
     77        var elementSource = $(element).attr('src'); 
     78        var skinUrl = jwplayer.html5.utils.getAbsolutePath(player._model.config.skin); 
     79        var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 
     80        var imgUrl = (elementSource.indexOf('data:image/png;base64,') === 0) ? elementSource : [skinRoot, component, elementSource].join('/'); 
    1281         
    13         /** Constructor **/ 
    14         $.fn.jwplayerSkinner = function(player, completeHandler) { 
    15                 players[player.id] = { 
    16                         completeHandler: completeHandler 
    17                 }; 
    18                 load(player); 
     82        player.skin[component].elements[elementName] = { 
     83                height: 0, 
     84                width: 0, 
     85                src: '', 
     86                ready: false 
    1987        }; 
    2088         
    21         /** Load the skin **/ 
    22         function load(player) { 
    23                 $.ajax({ 
    24                         url: $.fn.jwplayerUtils.getAbsolutePath(player.model.config.skin), 
    25                         complete: function(xmlrequest, textStatus) { 
    26                                 if (textStatus == "success") { 
    27                                         loadSkin(player, xmlrequest.responseXML); 
    28                                 } else { 
    29                                         loadSkin(player, $.fn.jwplayerDefaultSkin); 
    30                                 } 
    31                         } 
    32                          
    33                 }); 
    34         } 
     89        $(img).load(jwplayer.html5.skinner.completeImageLoad(img, elementName, component, player)); 
     90        $(img).error(function() { 
     91                player.skin[component].elements[elementName].ready = true; 
     92                jwplayer.html5.skinner.resetCompleteIntervalTest(player); 
     93        }); 
    3594         
    36         function loadSkin(player, xml) { 
    37                 var skin = { 
    38                         properties: {} 
    39                 }; 
    40                 player.skin = skin; 
    41                 var components = $('component', xml); 
    42                 if (components.length === 0) { 
    43                         return; 
    44                 } 
    45                 for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 
    46                         players[player.id].loading = true; 
    47                          
    48                         var componentName = $(components[componentIndex]).attr('name'); 
    49                         var component = { 
    50                                 settings: {}, 
    51                                 elements: {} 
    52                         }; 
    53                         player.skin[componentName] = component; 
    54                         var elements = $(components[componentIndex]).find('element'); 
    55                         for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 
    56                                 loadImage(elements[elementIndex], componentName, player); 
    57                         } 
    58                         var settings = $(components[componentIndex]).find('setting'); 
    59                         for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 
    60                                 player.skin[componentName].settings[$(settings[settingIndex]).attr("name")] = $(settings[settingIndex]).attr("value"); 
    61                         } 
    62                          
    63                         players[player.id].loading = false; 
    64                          
    65                         resetCompleteIntervalTest(player); 
    66                 } 
    67         } 
    68          
    69         function resetCompleteIntervalTest(player) { 
    70                 clearInterval(players[player.id].completeInterval); 
    71                 players[player.id].completeInterval = setInterval(function() { 
    72                         checkComplete(player); 
    73                 }, 100); 
    74         } 
    75          
    76         /** Load the data for a single element. **/ 
    77         function loadImage(element, component, player) { 
    78                 var img = new Image(); 
    79                 var elementName = $(element).attr('name'); 
    80                 var elementSource = $(element).attr('src'); 
    81                 var skinUrl = $.fn.jwplayerUtils.getAbsolutePath(player.model.config.skin); 
    82                 var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 
    83                 var imgUrl = (elementSource.indexOf('data:image/png;base64,') === 0) ? elementSource : [skinRoot, component, elementSource].join('/'); 
    84                  
    85                 player.skin[component].elements[elementName] = { 
    86                         height: 0, 
    87                         width: 0, 
    88                         src: '', 
    89                         ready: false 
    90                 }; 
     95        img.src = imgUrl; 
     96}; 
    9197 
    92                 $(img).load(completeImageLoad(img, elementName, component, player));             
    93                 $(img).error(function() { 
    94                         player.skin[component].elements[elementName].ready = true; 
    95                         resetCompleteIntervalTest(player); 
    96                 }); 
    97                  
    98                 img.src = imgUrl; 
    99         } 
    100          
    101         function checkComplete(player) { 
    102                 for (var component in player.skin) { 
    103                         if (component != 'properties') { 
    104                                 for (var element in player.skin[component].elements) { 
    105                                         if (!player.skin[component].elements[element].ready) { 
    106                                                 return; 
    107                                         } 
     98 
     99jwplayer.html5.skinner.checkComplete = function(player) { 
     100        for (var component in player.skin) { 
     101                if (component != 'properties') { 
     102                        for (var element in player.skin[component].elements) { 
     103                                if (!player.skin[component].elements[element].ready) { 
     104                                        return; 
    108105                                } 
    109106                        } 
    110107                } 
    111                 if (players[player.id].loading === false) { 
    112                         clearInterval(players[player.id].completeInterval); 
    113                         players[player.id].completeHandler(); 
    114                 } 
    115108        } 
    116          
    117         function completeImageLoad(img, element, component, player) { 
    118                 return function() { 
    119                         player.skin[component].elements[element].height = img.height; 
    120                         player.skin[component].elements[element].width = img.width; 
    121                         player.skin[component].elements[element].src = img.src; 
    122                         player.skin[component].elements[element].ready = true; 
    123                         resetCompleteIntervalTest(player); 
    124                 }; 
     109        if (player.skin._loading === false) { 
     110                clearInterval(player.skin._completeInterval); 
     111                player.skin._completeHandler(); 
    125112        } 
    126          
    127         $.fn.jwplayerSkinner.hasComponent = function(player, component) { 
    128                 return (player.skin[component] !== null); 
     113}; 
     114 
     115 
     116jwplayer.html5.skinner.completeImageLoad = function(img, element, component, player) { 
     117        return function() { 
     118                player.skin[component].elements[element].height = img.height; 
     119                player.skin[component].elements[element].width = img.width; 
     120                player.skin[component].elements[element].src = img.src; 
     121                player.skin[component].elements[element].ready = true; 
     122                jwplayer.html5.skinner.resetCompleteIntervalTest(player); 
    129123        }; 
    130          
    131          
    132         $.fn.jwplayerSkinner.getSkinElement = function(player, component, element) { 
    133                 try { 
    134                         return player.skin[component].elements[element]; 
    135                 } catch (err) { 
    136                         $.fn.jwplayerUtils.log("No such skin component / element: ", [player, component, element]); 
    137                 } 
    138                 return null; 
    139         }; 
    140          
    141          
    142         $.fn.jwplayerSkinner.addSkinElement = function(player, component, name, element) { 
    143                 try { 
    144                         player.skin[component][name] = element; 
    145                 } catch (err) { 
    146                         $.fn.jwplayerUtils.log("No such skin component ", [player, component]); 
    147                 } 
    148         }; 
    149          
    150         $.fn.jwplayerSkinner.getSkinProperties = function(player) { 
    151                 return player.skin.properties; 
    152         }; 
    153          
    154 })(jQuery); 
     124}; 
     125 
     126 
     127jwplayer.html5.skinner.hasComponent = function(player, component) { 
     128        return (player.skin[component] !== null); 
     129}; 
     130 
     131 
     132jwplayer.html5.skinner.getSkinElement = function(player, component, element) { 
     133        try { 
     134                return player.skin[component].elements[element]; 
     135        } catch (err) { 
     136                jwplayer.html5.utils.log("No such skin component / element: ", [player, component, element]); 
     137        } 
     138        return null; 
     139}; 
     140 
     141 
     142jwplayer.html5.skinner.addSkinElement = function(player, component, name, element) { 
     143        try { 
     144                player.skin[component][name] = element; 
     145        } catch (err) { 
     146                jwplayer.html5.utils.log("No such skin component ", [player, component]); 
     147        } 
     148}; 
     149 
     150jwplayer.html5.skinner.getSkinProperties = function(player) { 
     151        return player.skin.properties; 
     152}; 
     153 
  • trunk/html5/src/html5/jwplayer.html5.utils.js

    r1189 r1190  
    77 * @lastmodifieddate 2010-04-11 
    88 */ 
    9 (function($) { 
    10  
    11         /** Constructor **/ 
    12         $.fn.jwplayerUtils = function() { 
    13                 return this.each(function() { 
    14                 }); 
    15         }; 
    16          
    17         //http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 
    18         $.fn.jwplayerUtils.isiPhone = function() { 
    19                 var agent = navigator.userAgent.toLowerCase(); 
    20                 return agent.match(/iPhone/i); 
    21         }; 
    22          
    23         $.fn.jwplayerUtils.isiPad = function() { 
    24                 var agent = navigator.userAgent.toLowerCase(); 
    25                 return agent.match(/iPad/i); 
    26         }; 
    27          
    28         /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 
    29         $.fn.jwplayerUtils.supportsFlash = function() { 
    30                 var version = '0,0,0,0'; 
     9/** Constructor **/ 
     10jwplayer.html5.utils = function() { 
     11        return this.each(function() { 
     12        }); 
     13}; 
     14 
     15//http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 
     16jwplayer.html5.utils.isiPhone = function() { 
     17        var agent = navigator.userAgent.toLowerCase(); 
     18        return agent.match(/iPhone/i); 
     19}; 
     20 
     21jwplayer.html5.utils.isiPad = function() { 
     22        var agent = navigator.userAgent.toLowerCase(); 
     23        return agent.match(/iPad/i); 
     24}; 
     25 
     26/** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 
     27jwplayer.html5.utils.supportsFlash = function() { 
     28        var version = '0,0,0,0'; 
     29        try { 
    3130                try { 
     31                        var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); 
    3232                        try { 
    33                                 var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); 
    34                                 try { 
    35                                         axo.AllowScriptAccess = 'always'; 
    36                                 } catch (e) { 
    37                                         version = '6,0,0'; 
    38                                 } 
     33                                axo.AllowScriptAccess = 'always'; 
    3934                        } catch (e) { 
     35                                version = '6,0,0'; 
    4036                        } 
    41                         version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; 
    4237                } catch (e) { 
    43                         try { 
    44                                 if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { 
    45                                         version = (navigator.plugins['Shockwave Flash 2.0'] || 
    46                                         navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]; 
    47                                 } 
    48                         } catch (e) { 
     38                } 
     39                version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; 
     40        } catch (e) { 
     41                try { 
     42                        if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { 
     43                                version = (navigator.plugins['Shockwave Flash 2.0'] || 
     44                                navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]; 
    4945                        } 
    50                 } 
    51                 var major = parseInt(version.split(',')[0], 10); 
    52                 var minor = parseInt(version.split(',')[2], 10); 
    53                 if (major > 9 || (major == 9 && minor > 97)) { 
    54                         return true; 
     46                } catch (e) { 
     47                } 
     48        } 
     49        var major = parseInt(version.split(',')[0], 10); 
     50        var minor = parseInt(version.split(',')[2], 10); 
     51        if (major > 9 || (major == 9 && minor > 97)) { 
     52                return true; 
     53        } else { 
     54                return false; 
     55        } 
     56}; 
     57 
     58/** Filetypes supported by Flash **/ 
     59var flashFileTypes = { 
     60        'aac': true, 
     61        'f4v': true, 
     62        'flv': true, 
     63        'm4a': true, 
     64        'm4v': true, 
     65        'mov': true, 
     66        'mp3': true, 
     67        'mp4': true 
     68}; 
     69 
     70 
     71/** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 
     72jwplayer.html5.utils.flashCanPlay = function(fileName) { 
     73        if (flashFileTypes[jwplayer.html5.utils.extension(fileName)]) { 
     74                return true; 
     75        } 
     76        return false; 
     77}; 
     78 
     79/** Check if this client supports playback for the specified type. **/ 
     80jwplayer.html5.utils.supportsType = function(type) { 
     81        try { 
     82                return !!document.createElement('video').canPlayType(type); 
     83        } catch (e) { 
     84                return false; 
     85        } 
     86}; 
     87 
     88/** Check if this client supports HTML5 H.264 playback. **/ 
     89jwplayer.html5.utils.supportsH264 = function() { 
     90        return jwplayer.html5.utils.supportsType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); 
     91}; 
     92 
     93 
     94/** Check if this client supports HTML5 OGG playback. **/ 
     95jwplayer.html5.utils.supportsOgg = function() { 
     96        return jwplayer.html5.utils.supportsType('video/ogg; codecs="theora, vorbis"'); 
     97}; 
     98 
     99/** Returns the extension of a file name **/ 
     100jwplayer.html5.utils.extension = function(path) { 
     101        return path.substr(path.lastIndexOf('.') + 1, path.length); 
     102}; 
     103 
     104/** Resets an element's CSS **/ 
     105/*jwplayer.html5.cSS = function(options) { 
     106 return this.each(function() { 
     107 var defaults = { 
     108 'margin': 0, 
     109 'padding': 0, 
     110 'background': 'none', 
     111 'border': 'none', 
     112 'bottom': 'auto', 
     113 'clear': 'none', 
     114 'float': 'none', 
     115 'font-family': '"Arial", "Helvetica", sans-serif', 
     116 'font-size': 'medium', 
     117 'font-style': 'normal', 
     118 'font-weight': 'normal', 
     119 'height': 'auto', 
     120 'left': 'auto', 
     121 'letter-spacing': 'normal', 
     122 'line-height': 'normal', 
     123 'max-height': 'none', 
     124 'max-width': 'none', 
     125 'min-height': 0, 
     126 'min-width': 0, 
     127 'overflow': 'visible', 
     128 'position': 'static', 
     129 'right': 'auto', 
     130 'text-align': 'left', 
     131 'text-decoration': 'none', 
     132 'text-indent': 0, 
     133 'text-transform': 'none', 
     134 'top': 'auto', 
     135 'visibility': 'visible', 
     136 'white-space': 'normal', 
     137 'width': 'auto', 
     138 'z-index': 'auto' 
     139 }; 
     140 try { 
     141 $(this).css($.extend(defaults, options)); 
     142 } catch (err) { 
     143 //alert(jwplayer.html5.utils.dump(err)); 
     144 } 
     145 }); 
     146 };*/ 
     147jwplayer.html5.utils.isNull = function(obj) { 
     148        return ((obj === null) || (obj === undefined) || (obj === "")); 
     149}; 
     150 
     151/** Gets an absolute file path based on a relative filepath **/ 
     152jwplayer.html5.utils.getAbsolutePath = function(path) { 
     153        if (jwplayer.html5.utils.isNull(path)) { 
     154                return path; 
     155        } 
     156        if (isAbsolutePath(path)) { 
     157                return path; 
     158        } 
     159        var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 
     160        var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 
     161        var patharray = (basepath + "/" + path).split("/"); 
     162        var result = []; 
     163        for (var i = 0; i < patharray.length; i++) { 
     164                if (jwplayer.html5.utils.isNull(patharray[i]) || patharray[i] == ".") { 
     165                        continue; 
     166                } else if (patharray[i] == "..") { 
     167                        result.pop(); 
    55168                } else { 
    56                         return false; 
    57                 } 
    58         }; 
    59          
    60         /** Filetypes supported by Flash **/ 
    61         var flashFileTypes = { 
    62                 'aac': true, 
    63                 'f4v': true, 
    64                 'flv': true, 
    65                 'm4a': true, 
    66                 'm4v': true, 
    67                 'mov': true, 
    68                 'mp3': true, 
    69                 'mp4': true 
    70         }; 
    71          
    72          
    73         /** Check if this client supports Flash player 9.0.115+ (FLV/H264). **/ 
    74         $.fn.jwplayerUtils.flashCanPlay = function(fileName) { 
    75                 if (flashFileTypes[$.fn.jwplayerUtils.extension(fileName)]) { 
    76                         return true; 
    77                 } 
     169                        result.push(patharray[i]); 
     170                } 
     171        } 
     172        return protocol + result.join("/"); 
     173}; 
     174 
     175function isAbsolutePath(path) { 
     176        if (jwplayer.html5.utils.isNull(path)) { 
     177                return; 
     178        } 
     179        var protocol = path.indexOf("://"); 
     180        var queryparams = path.indexOf("?"); 
     181        return (protocol > 0 && (queryparams < 0 || (queryparams > protocol))); 
     182} 
     183 
     184 
     185jwplayer.html5.utils.mapEmpty = function(map) { 
     186        for (var val in map) { 
    78187                return false; 
    79         }; 
    80          
    81         /** Check if this client supports playback for the specified type. **/ 
    82         $.fn.jwplayerUtils.supportsType = function(type) { 
    83                 try { 
    84                         return !!document.createElement('video').canPlayType(type); 
    85                 } catch (e) { 
    86                         return false; 
    87                 } 
    88         }; 
    89          
    90         /** Check if this client supports HTML5 H.264 playback. **/ 
    91         $.fn.jwplayerUtils.supportsH264 = function() { 
    92                 return $.fn.jwplayerUtils.supportsType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); 
    93         }; 
    94          
    95          
    96         /** Check if this client supports HTML5 OGG playback. **/ 
    97         $.fn.jwplayerUtils.supportsOgg = function() { 
    98                 return $.fn.jwplayerUtils.supportsType('video/ogg; codecs="theora, vorbis"'); 
    99         }; 
    100          
    101         /** Returns the extension of a file name **/ 
    102         $.fn.jwplayerUtils.extension = function(path) { 
    103                 return path.substr(path.lastIndexOf('.') + 1, path.length); 
    104         }; 
    105          
    106         /** Resets an element's CSS **/ 
    107         /*$.fn.jwplayerCSS = function(options) { 
    108                 return this.each(function() { 
    109                         var defaults = { 
    110                                 'margin': 0, 
    111                                 'padding': 0, 
    112                                 'background': 'none', 
    113                                 'border': 'none', 
    114                                 'bottom': 'auto', 
    115                                 'clear': 'none', 
    116                                 'float': 'none', 
    117                                 'font-family': '"Arial", "Helvetica", sans-serif', 
    118                                 'font-size': 'medium', 
    119                                 'font-style': 'normal', 
    120                                 'font-weight': 'normal', 
    121                                 'height': 'auto', 
    122                                 'left': 'auto', 
    123                                 'letter-spacing': 'normal', 
    124                                 'line-height': 'normal', 
    125                                 'max-height': 'none', 
    126                                 'max-width': 'none', 
    127                                 'min-height': 0, 
    128                                 'min-width': 0, 
    129                                 'overflow': 'visible', 
    130                                 'position': 'static', 
    131                                 'right': 'auto', 
    132                                 'text-align': 'left', 
    133                                 'text-decoration': 'none', 
    134                                 'text-indent': 0, 
    135                                 'text-transform': 'none', 
    136                                 'top': 'auto', 
    137                                 'visibility': 'visible', 
    138                                 'white-space': 'normal', 
    139                                 'width': 'auto', 
    140                                 'z-index': 'auto' 
    141                         }; 
    142                         try { 
    143                                 $(this).css($.extend(defaults, options)); 
    144                         } catch (err) { 
    145                                 //alert($.fn.jwplayerUtils.dump(err)); 
     188        } 
     189        return true; 
     190}; 
     191 
     192jwplayer.html5.utils.mapLength = function(map) { 
     193        var result = 0; 
     194        for (var val in map) { 
     195                result++; 
     196        } 
     197        return result; 
     198}; 
     199 
     200 
     201/** Dumps the content of an object to a string **/ 
     202jwplayer.html5.utils.dump = function(object, depth) { 
     203        if (object === null) { 
     204                return 'null'; 
     205        } else if (jwplayer.html5.utils.typeOf(object) != 'object') { 
     206                if (jwplayer.html5.utils.typeOf(object) == 'string') { 
     207                        return "\"" + object + "\""; 
     208                } 
     209                return object; 
     210        } 
     211         
     212        var type = jwplayer.html5.utils.typeOf(object); 
     213         
     214        depth = (depth === undefined) ? 1 : depth + 1; 
     215        var indent = ""; 
     216        for (var i = 0; i < depth; i++) { 
     217                indent += "\t"; 
     218        } 
     219         
     220        var result = (type == "array") ? "[" : "{"; 
     221        result += "\n" + indent; 
     222         
     223        for (var i in object) { 
     224                if (type == "object") { 
     225                        result += "\"" + i + "\": "; 
     226                } 
     227                result += jwplayer.html5.utils.dump(object[i], depth) + ",\n" + indent; 
     228        } 
     229         
     230        result = result.substring(0, result.length - 2 - depth) + "\n"; 
     231         
     232        result += indent.substring(0, indent.length - 1); 
     233        result += (type == "array") ? "]" : "}"; 
     234         
     235        return result; 
     236}; 
     237 
     238/** Returns the true type of an object **/ 
     239jwplayer.html5.utils.typeOf = function(value) { 
     240        var s = typeof value; 
     241        if (s === 'object') { 
     242                if (value) { 
     243                        if (value instanceof Array) { 
     244                                s = 'array'; 
    146245                        } 
    147                 }); 
    148         };*/ 
    149          
    150         $.fn.jwplayerUtils.isNull = function(obj) { 
    151                 return ((obj === null) || (obj === undefined) || (obj === "")); 
    152         }; 
    153          
    154         /** Gets an absolute file path based on a relative filepath **/ 
    155         $.fn.jwplayerUtils.getAbsolutePath = function(path) { 
    156                 if ($.fn.jwplayerUtils.isNull(path)){ 
    157                         return path; 
    158                 } 
    159                 if (isAbsolutePath(path)) { 
    160                         return path; 
    161                 } 
    162                 var protocol = document.location.href.substr(0, document.location.href.indexOf("://") + 3); 
    163                 var basepath = document.location.href.substring(protocol.length, (path.indexOf("/") === 0) ? document.location.href.indexOf('/', protocol.length) : document.location.href.lastIndexOf('/')); 
    164                 var patharray = (basepath + "/" + path).split("/"); 
    165                 var result = []; 
    166                 for (var i = 0; i < patharray.length; i++) { 
    167                         if ($.fn.jwplayerUtils.isNull(patharray[i]) || patharray[i] == ".") { 
    168                                 continue; 
    169                         } else if (patharray[i] == "..") { 
    170                                 result.pop(); 
    171                         } else { 
    172                                 result.push(patharray[i]); 
    173                         } 
    174                 } 
    175                 return protocol + result.join("/"); 
    176         }; 
    177          
    178         function isAbsolutePath(path) { 
    179                 if($.fn.jwplayerUtils.isNull(path)){ 
    180                         return; 
    181                 } 
    182                 var protocol = path.indexOf("://"); 
    183                 var queryparams = path.indexOf("?"); 
    184                 return (protocol > 0 && (queryparams < 0 || (queryparams > protocol))); 
    185         } 
    186          
    187         $.fn.jwplayerUtils.mapEmpty = function (map){ 
    188                 for (var val in map){ 
    189                         return false;    
    190                 } 
    191                 return true; 
    192         }; 
    193          
    194         $.fn.jwplayerUtils.mapLength = function (map){ 
    195                 var result = 0; 
    196                 for (var val in map){ 
    197                         result++;        
    198                 } 
    199                 return result; 
    200         }; 
    201  
    202          
    203         /** Dumps the content of an object to a string **/ 
    204         $.fn.jwplayerUtils.dump = function(object, depth) { 
    205                 if (object === null) { 
    206                         return 'null'; 
    207                 } else if ($.fn.jwplayerUtils.typeOf(object) != 'object') { 
    208                         if ($.fn.jwplayerUtils.typeOf(object) == 'string') { 
    209                                 return "\"" + object + "\""; 
    210                         } 
    211                         return object; 
    212                 } 
    213                  
    214                 var type = $.fn.jwplayerUtils.typeOf(object); 
    215                  
    216                 depth = (depth === undefined) ? 1 : depth + 1; 
    217                 var indent = ""; 
    218                 for (var i = 0; i < depth; i++) { 
    219                         indent += "\t"; 
    220                 } 
    221                  
    222                 var result = (type == "array") ? "[" : "{"; 
    223                 result += "\n" + indent; 
    224                  
    225                 for (var i in object) { 
    226                         if (type == "object") { 
    227                                 result += "\"" + i + "\": "; 
    228                         } 
    229                         result += $.fn.jwplayerUtils.dump(object[i], depth) + ",\n" + indent; 
    230                 } 
    231                  
    232                 result = result.substring(0, result.length - 2 - depth) + "\n"; 
    233                  
    234                 result += indent.substring(0, indent.length - 1); 
    235                 result += (type == "array") ? "]" : "}"; 
    236                  
    237                 return result; 
    238         }; 
    239          
    240         /** Returns the true type of an object **/ 
    241         $.fn.jwplayerUtils.typeOf = function(value) { 
    242                 var s = typeof value; 
    243                 if (s === 'object') { 
    244                         if (value) { 
    245                                 if (value instanceof Array) { 
    246                                         s = 'array'; 
    247                                 } 
    248                         } else { 
    249                                 s = 'null'; 
    250                         } 
    251                 } 
    252                 return s; 
    253         }; 
    254          
    255          
    256         /** Logger **/ 
    257         $.fn.jwplayerUtils.log = function(msg, obj) { 
    258                 try { 
    259                         if (obj) { 
    260                                 console.log("%s: %o", msg, obj); 
    261                         } else { 
    262                                 console.log($.fn.jwplayerUtils.dump(msg)); 
    263                         } 
    264                 } catch (err) { 
    265                 } 
    266                 return this; 
    267         }; 
    268          
    269          
    270 })(jQuery); 
     246                } else { 
     247                        s = 'null'; 
     248                } 
     249        } 
     250        return s; 
     251}; 
     252 
     253 
     254/** Logger **/ 
     255jwplayer.html5.utils.log = function(msg, obj) { 
     256        try { 
     257                if (obj) { 
     258                        console.log("%s: %o", msg, obj); 
     259                } else { 
     260                        console.log(jwplayer.html5.utils.dump(msg)); 
     261                } 
     262        } catch (err) { 
     263        } 
     264        return this; 
     265}; 
     266 
     267 
  • trunk/html5/src/html5/jwplayer.html5.view.js

    r1189 r1190  
    66 * @lastmodifieddate 2010-04-11 
    77 */ 
    8 (function($) { 
    98 
    10         var styleString = "left:0px;top:0px;position:absolute;z-index:0;"; 
    11         var embedString = "<embed %elementvars% src='%flashplayer%' allowfullscreen='true' allowscriptaccess='always' flashvars='%flashvars%' %style% />"; 
    12         var objectString = "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' %elementvars% %style% > <param name='movie' value='%flashplayer%'> <param name='allowfullscreen' value='true'> <param name='allowscriptaccess' value='always'> <param name='wmode' value='transparent'> <param name='flashvars' value='%flashvars%'> </object>"; 
    13         var elementvars = { 
    14                 id: true, 
    15                 name: true, 
    16                 className: true 
    17         }; 
    18          
    19         $.fn.jwplayerView = function(player) { 
    20                 player.model.domelement.wrap("<div id='" + player.model.config.id + "_jwplayer' />"); 
    21                 player.model.domelement.parent().css({ 
    22                         position: 'relative', 
    23                         height: player.config.height+'px', 
    24                         width: player.config.width+'px', 
    25                         margin: 'auto', 
    26                         padding: 0, 
    27                         'background-color': player.config.screencolor 
    28                 }); 
    29                 var display = ($.fn.jwplayerUtils.isiPhone() || !(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length)) ? 'block' : 'none' ; 
    30                 player.model.domelement.css({ 
    31                         position: 'absolute', 
    32                         width: player.model.config.width+'px', 
    33                         height: player.model.config.height+'px', 
    34                         top: 0, 
    35                         left: 0, 
    36                         'z-index': 0, 
    37                         margin: 'auto', 
    38                         display: display 
    39                 }); 
    40         }; 
    41          
    42         $.fn.jwplayerView.switchMediaProvider = function() { 
    43          
    44         }; 
    45          
    46         /** Embeds a Flash Player at the specified location in the DOM. **/ 
    47         $.fn.jwplayerView.embedFlash = function(player, options) { 
    48                 if (player.model.config.flashplayer) { 
    49                         var htmlString, elementvarString = "", flashvarString = ""; 
    50                         if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { 
    51                                 htmlString = embedString; 
    52                         } else { 
    53                                 htmlString = objectString; 
    54                         } 
    55                         for (var elementvar in elementvars) { 
    56                                 if (!$.fn.jwplayerUtils.isNull(player.model.config[elementvar])) { 
    57                                         elementvarString += elementvar + "='" + player.model.config[elementvar] + "' "; 
    58                                 } 
    59                         } 
    60                         if (elementvarString.indexOf("name=") < 0) { 
    61                                 elementvarString += "name='" + player.id + "' "; 
    62                         } 
    63                         var config = $.extend(true, {}, player.model.config, options); 
    64                         if (!$.fn.jwplayerUtils.isNull(player.model.sources[player.model.source])){ 
    65                                 flashvarString += 'file=' + $.fn.jwplayerUtils.getAbsolutePath(player.model.sources[player.model.source].file) + '&'; 
    66                         } 
    67                         if (!$.fn.jwplayerUtils.isNull(config.image)){ 
    68                                 flashvarString += 'image=' + $.fn.jwplayerUtils.getAbsolutePath(config.image) + '&'; 
    69                         } 
    70                         for (var flashvar in config) { 
    71                                 if ((flashvar == 'file') || (flashvar == 'image') || (flashvar == 'plugins')) { 
    72                                         continue; 
    73                                 } 
    74                                 if (!$.fn.jwplayerUtils.isNull(config[flashvar])) { 
    75                                         flashvarString += flashvar + '=' + config[flashvar] + '&'; 
    76                                 } 
    77                         } 
    78                          
    79                         flashvarString += 'playerready=$.fn.jwplayerMediaFlash.playerReady'; 
    80                          
    81                         htmlString = htmlString.replace("%elementvars%", elementvarString); 
    82                         htmlString = htmlString.replace("%flashvars%", flashvarString); 
    83                         htmlString = htmlString.replace("%flashplayer%", $.fn.jwplayerUtils.getAbsolutePath(player.model.config.flashplayer)); 
    84                         htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + player.model.config.height + "px;'"); 
    85                         if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { 
    86                                 htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + player.model.config.height + "px;'"); 
    87                                 player.model.domelement.before(htmlString); 
    88                         } else { 
    89                                 htmlString = htmlString.replace("%style%", "style='" + styleString + "width:" + player.model.config.width + "px;height:" + (player.model.config.height + player.skin.controlbar.elements.background.height) + "px;'"); 
    90                                 player.model.domelement.before("<div />"); 
    91                                 player.model.domelement.prev().html(htmlString); 
    92                                  
    93                         } 
    94                         var oldDOMElement = player.model.domelement; 
    95                         player.model.domelement = player.model.domelement.prev(); 
    96                         oldDOMElement.remove(); 
    97                 } 
    98         }; 
    99          
    100          
    101 })(jQuery); 
     9jwplayer.html5.view = function(player) { 
     10        player._model.domelement.wrap("<div id='" + player.id + "_jwplayer' />"); 
     11        player._model.domelement.parent().css({ 
     12                position: 'relative', 
     13                height: player._model.config.height + 'px', 
     14                width: player._model.config.width + 'px', 
     15                margin: 'auto', 
     16                padding: 0, 
     17                'background-color': player._model.config.screencolor 
     18        }); 
     19        var display = (jwplayer.html5.utils.isiPhone() || !(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length)) ? 'block' : 'none'; 
     20        player._model.domelement.css({ 
     21                position: 'absolute', 
     22                width: player._model.config.width + 'px', 
     23                height: player._model.config.height + 'px', 
     24                top: 0, 
     25                left: 0, 
     26                'z-index': 0, 
     27                margin: 'auto', 
     28                display: display 
     29        }); 
     30}; 
Note: See TracChangeset for help on using the changeset viewer.