Changeset 2177


Ignore:
Timestamp:
04/26/12 13:12:50 (13 months ago)
Author:
pablo
Message:
  • Adds external playlist loading
  • Adds skin loading
  • Adds player setup queue w/ error handling
Location:
branches/jw6
Files:
13 added
1 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • branches/jw6/bin-debug/jwplayer.js

    r2175 r2177  
    3131 */ 
    3232(function(jwplayer) { 
     33        var DOCUMENT = document; 
     34         
    3335        //Declare namespace 
    3436        var utils = jwplayer.utils = function() { 
     
    8890        utils.appendStylesheet = function(selector, styles) { 
    8991                if (!_styleSheet) { 
    90                         _styleSheet = document.createElement("style"); 
     92                        _styleSheet = DOCUMENT.createElement("style"); 
    9193                        _styleSheet.type = "text/css"; 
    92                         document.getElementsByTagName('head')[0].appendChild(_styleSheet); 
     94                        DOCUMENT.getElementsByTagName('head')[0].appendChild(_styleSheet); 
    9395                } 
    9496 
     
    167169        utils.getAbsolutePath = function(path, base) { 
    168170                if (!utils.exists(base)) { 
    169                         base = document.location.href; 
     171                        base = DOCUMENT.location.href; 
    170172                } 
    171173                if (!utils.exists(path)) { 
     
    265267                } else { 
    266268                        return {  
    267                                 left: element.offsetLeft + document.body.scrollLeft,  
    268                                 top: element.offsetTop + document.body.scrollTop,  
     269                                left: element.offsetLeft + DOCUMENT.body.scrollLeft,  
     270                                top: element.offsetTop + DOCUMENT.body.scrollTop,  
    269271                                width: element.offsetWidth,  
    270272                                height: element.offsetHeight 
     
    281283        utils.isMobile = function() { 
    282284                return utils.userAgentMatch(/(iP(hone|ad|od))|android/i); 
    283         }        
    284          
    285 })(jwplayer); 
    286 /** 
    287  * AJAX File loading capabilities 
    288  * 
    289  * @author pablo 
    290  * @version 6.0 
    291  */ 
    292 (function(utils) { 
    293  
     285        } 
     286 
     287        /** Save a setting **/ 
     288        utils.saveCookie = function(name, value) { 
     289                DOCUMENT.cookie = "jwplayer." + name + "=" + value + "; path=/"; 
     290        } 
     291 
     292        /** Retrieve saved  player settings **/ 
     293        utils.getCookies = function() { 
     294                var jwCookies = {}; 
     295                var cookies = DOCUMENT.cookie.split('; '); 
     296                for (var i=0; i<cookies.length; i++) { 
     297                        var split = cookies[i].split('='); 
     298                        if (split[0].indexOf("jwplayer.") == 0) { 
     299                                jwCookies[split[0].substring(9, split[0].length)] = split[1]; 
     300                        } 
     301                } 
     302                return jwCookies; 
     303        } 
     304         
     305         
     306         
    294307        /** Loads an XML file into a DOM object * */ 
    295308        utils.ajax = function(xmldocpath, completecallback, errorcallback) { 
    296309                var xmlhttp; 
    297                 if (window.XMLHttpRequest) { 
    298                         // IE>7, Firefox, Chrome, Opera, Safari 
     310                if (utils.exists(window.XDomainRequest)) { 
     311                        // IE9 
     312                        xmlhttp = new XDomainRequest() 
     313                } else if (window.XMLHttpRequest) { 
     314                        // Firefox, Chrome, Opera, Safari 
    299315                        xmlhttp = new XMLHttpRequest(); 
    300316                } else { 
    301                         // IE6 
    302                         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     317                        errorcallback(); 
    303318                } 
    304319                xmlhttp.onreadystatechange = function() { 
     
    307322                                        if (completecallback) { 
    308323                                                // Handle the case where an XML document was returned with an incorrect MIME type. 
    309                                                 if (!utils.exists(xmlhttp.responseXML)) { 
     324                                                if (!jwplayer.utils.exists(xmlhttp.responseXML)) { 
    310325                                                        try { 
    311326                                                                if (window.DOMParser) { 
    312327                                                                        var parsedXML = (new DOMParser()).parseFromString(xmlhttp.responseText,"text/xml"); 
    313328                                                                        if (parsedXML) { 
    314                                                                                 xmlhttp = utils.extend({}, xmlhttp, {responseXML:parsedXML}); 
     329                                                                                xmlhttp = jwplayer.utils.extend({}, xmlhttp, {responseXML:parsedXML}); 
    315330                                                                        } 
    316331                                                                } else {  
     
    319334                                                                        parsedXML.async="false"; 
    320335                                                                        parsedXML.loadXML(xmlhttp.responseText); 
    321                                                                         xmlhttp = utils.extend({}, xmlhttp, {responseXML:parsedXML});                                                                    
     336                                                                        xmlhttp = jwplayer.utils.extend({}, xmlhttp, {responseXML:parsedXML});                                                                   
    322337                                                                } 
    323338                                                        } catch(e) { 
     
    347362        }; 
    348363         
    349 })(jwplayer.utils); 
     364         
     365        /** Returns the true type of an object * */ 
     366        utils.typeOf = function(value) { 
     367                var typeofString = typeof value; 
     368                if (typeofString === 'object') { 
     369                        if (!value) return "null"; 
     370                        return (value instanceof Array) ? 'array' : typeofString; 
     371                } else { 
     372                        return typeofString; 
     373                } 
     374        }; 
     375 
     376         
     377})(jwplayer); 
    350378/** 
    351379 * String utilities for the JW Player. 
     
    931959                        _api = api; 
    932960 
    933                         config = _utils.extend({}, config); 
    934961                        _id = _api.id + "_controlbar"; 
    935962                        _duration = 0; 
     
    945972                        _skin = _api.skin; 
    946973                         
    947                         _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, _api.settings.controlbar); 
     974                        _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, config); 
    948975                        _layout = (_skin.controlbar.layout.left || _skin.controlbar.layout.right || _skin.controlbar.layout.center) ? _skin.controlbar.layout : _defaults.layout; 
    949976                        _createStyles(); 
     
    9791006                function _stateHandler(evt) { 
    9801007                        switch (evt.newstate) { 
     1008                        case jwplayer.events.state.BUFFERING: 
    9811009                        case jwplayer.events.state.PLAYING: 
    982                         case jwplayer.events.state.BUFFERING: 
    9831010                                if (_elements['timeSliderThumb']) { 
    9841011                                        _elements['timeSliderThumb'].style.opacity = 1; 
    985                                 } 
    986                                 if (_elements["timeRail"]) { 
    987                                         _elements["timeRail"].className = "jwrail jwsmooth"; 
    9881012                                } 
    9891013                                _toggleButton("play", true); 
     
    10001024                                        _elements['timeSliderThumb'].style.opacity = 0; 
    10011025                                } 
     1026                                if (_elements["timeRail"]) { 
     1027                                        _elements["timeRail"].className = "jwrail"; 
     1028                                        setTimeout(function() { 
     1029                                                // Temporarily disable the buffer animation 
     1030                                                _elements["timeRail"].className += " jwsmooth"; 
     1031                                        }, 100); 
     1032                                } 
    10021033                                _setBuffer(0); 
    10031034                                _timeUpdated({ position: 0, duration: 0}); 
    1004                                 if (_elements["timeRail"]) { 
    1005                                         _elements["timeRail"].className = "jwrail"; 
    1006                                 } 
    10071035                                break; 
    10081036                        } 
     
    11021130                function _buildImage(name, style, stretch, nocenter) { 
    11031131                        var element = _createSpan(); 
    1104                         //element.id = _createElementId(name); 
    11051132                        element.className = 'jw'+name; 
    11061133                         
     
    11371164                         
    11381165                        var element = document.createElement("button"); 
    1139                         //element.id = _createElementId(name); 
    11401166                        element.className = 'jw'+name; 
    11411167                        element.addEventListener("click", _buttonClickHandler(name), false); 
     
    12271253                        } 
    12281254                        if (_elements[name]) { 
    1229                                 _elements[name].className = 'jw' + name + (state ? " jwtoggle" : ""); 
     1255                                _elements[name].className = 'jw' + name + (state ? " jwtoggle jwtoggling" : " jwtoggling"); 
     1256                                // Use the jwtoggling class to temporarily disable the animation; 
     1257                                setTimeout(function() { 
     1258                                        _elements[name].className = _elements[name].className.replace(" jwtoggling", "");  
     1259                                }, 100); 
    12301260                        } 
    12311261                        _toggleStates[name] = state; 
     
    15011531        } 
    15021532 
    1503         /** 
    1504          * General JW Player controlbar styles -- should only be executed once 
    1505          **/ 
    1506         function _generalStyles() { 
    1507                 _style(CB_CLASS, { 
    1508                         position: JW_CSS_ABSOLUTE, 
    1509                         overflow: 'hidden', 
    1510                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    1511                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    1512                 '-o-transition': JW_CSS_SMOOTH_EASE 
    1513                 }) 
    1514                 _style(CB_CLASS+' span',{ 
    1515                         height: JW_CSS_100PCT, 
    1516                         '-webkit-user-select': JW_CSS_NONE, 
    1517                         '-webkit-user-drag': JW_CSS_NONE, 
    1518                         'user-select': JW_CSS_NONE, 
    1519                         'user-drag': JW_CSS_NONE 
    1520                 }); 
    1521             _style(CB_CLASS+' .jwgroup', { 
    1522                 display: JW_CSS_INLINE 
    1523             }); 
    1524             _style(CB_CLASS+' span, '+CB_CLASS+' .jwgroup button,'+CB_CLASS+' .jwleft', { 
    1525                 position: JW_CSS_RELATIVE, 
    1526                         'float': JW_CSS_LEFT 
    1527             }); 
    1528                 _style(CB_CLASS+' .jwright', { 
    1529                         position: JW_CSS_ABSOLUTE 
    1530                 }); 
    1531             _style(CB_CLASS+' .jwcenter', { 
    1532                 position: JW_CSS_ABSOLUTE 
    1533             }); 
    1534             _style(CB_CLASS+' button', { 
    1535                 display: JW_CSS_INLINE_BLOCK, 
    1536                 height: JW_CSS_100PCT, 
    1537                 border: JW_CSS_NONE, 
    1538                 cursor: 'pointer', 
    1539                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    1540                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    1541                 '-o-transition': JW_CSS_SMOOTH_EASE 
    1542             }); 
    1543             _style(CB_CLASS+' .jwcapRight', {  
    1544                         right: 0, 
    1545                         position: JW_CSS_ABSOLUTE 
    1546                 }); 
    1547             _style(CB_CLASS+' .jwtime,' + CB_CLASS + ' .jwgroup span.jwstretch', { 
    1548                 position: JW_CSS_ABSOLUTE, 
    1549                 height: JW_CSS_100PCT, 
    1550                 width: JW_CSS_100PCT, 
    1551                 left: 0 
    1552             }); 
    1553             _style(CB_CLASS+' .jwrail,' + CB_CLASS + ' .jwthumb', { 
    1554                 position: JW_CSS_ABSOLUTE, 
    1555                 height: JW_CSS_100PCT, 
    1556                 cursor: 'pointer' 
    1557             }); 
    1558             _style(CB_CLASS + ' .jwtime .jwsmooth span', { 
    1559                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    1560                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    1561                 '-o-transition': JW_CSS_SMOOTH_EASE 
    1562             }); 
    1563             _style(CB_CLASS + ' .jwdivider+.jwdivider', { 
    1564                 display: JW_CSS_NONE 
    1565             }); 
    1566             _style(CB_CLASS + ' .jwtext', { 
    1567                         padding: '0 5px', 
    1568                         'text-align': 'center' 
    1569                 }); 
    1570  
    1571         } 
    1572          
    1573         _generalStyles(); 
     1533        /************************************************************* 
     1534         * Player stylesheets - done once on script initialization;  * 
     1535         * These CSS rules are used for all JW Player instances      * 
     1536         *************************************************************/ 
     1537 
     1538        _style(CB_CLASS, { 
     1539                position: JW_CSS_ABSOLUTE, 
     1540                overflow: 'hidden', 
     1541        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     1542        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     1543        '-o-transition': JW_CSS_SMOOTH_EASE 
     1544        }) 
     1545         
     1546        _style(CB_CLASS+' span',{ 
     1547                height: JW_CSS_100PCT, 
     1548                '-webkit-user-select': JW_CSS_NONE, 
     1549                '-webkit-user-drag': JW_CSS_NONE, 
     1550                'user-select': JW_CSS_NONE, 
     1551                'user-drag': JW_CSS_NONE 
     1552        }); 
     1553         
     1554    _style(CB_CLASS+' .jwgroup', { 
     1555        display: JW_CSS_INLINE 
     1556    }); 
     1557     
     1558    _style(CB_CLASS+' span, '+CB_CLASS+' .jwgroup button,'+CB_CLASS+' .jwleft', { 
     1559        position: JW_CSS_RELATIVE, 
     1560                'float': JW_CSS_LEFT 
     1561    }); 
     1562     
     1563        _style(CB_CLASS+' .jwright', { 
     1564                position: JW_CSS_ABSOLUTE 
     1565        }); 
     1566         
     1567    _style(CB_CLASS+' .jwcenter', { 
     1568        position: JW_CSS_ABSOLUTE 
     1569    }); 
     1570     
     1571    _style(CB_CLASS+' button', { 
     1572        display: JW_CSS_INLINE_BLOCK, 
     1573        height: JW_CSS_100PCT, 
     1574        border: JW_CSS_NONE, 
     1575        cursor: 'pointer', 
     1576        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     1577        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     1578        '-o-transition': JW_CSS_SMOOTH_EASE 
     1579    }); 
     1580     
     1581    _style(CB_CLASS+' .jwcapRight', {  
     1582                right: 0, 
     1583                position: JW_CSS_ABSOLUTE 
     1584        }); 
     1585     
     1586    _style(CB_CLASS+' .jwtime,' + CB_CLASS + ' .jwgroup span.jwstretch', { 
     1587        position: JW_CSS_ABSOLUTE, 
     1588        height: JW_CSS_100PCT, 
     1589        width: JW_CSS_100PCT, 
     1590        left: 0 
     1591    }); 
     1592     
     1593    
     1594     
     1595    _style(CB_CLASS+' .jwrail,' + CB_CLASS + ' .jwthumb', { 
     1596        position: JW_CSS_ABSOLUTE, 
     1597        height: JW_CSS_100PCT, 
     1598        cursor: 'pointer' 
     1599    }); 
     1600     
     1601    _style(CB_CLASS + ' .jwtime .jwsmooth span', { 
     1602        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     1603        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     1604        '-o-transition': JW_CSS_SMOOTH_EASE 
     1605    }); 
     1606     
     1607    _style(CB_CLASS + ' .jwdivider+.jwdivider', { 
     1608        display: JW_CSS_NONE 
     1609    }); 
     1610     
     1611    _style(CB_CLASS + ' .jwtext', { 
     1612                padding: '0 5px', 
     1613                'text-align': 'center' 
     1614        }); 
     1615     
     1616    _style(CB_CLASS + ' .jwtoggling', { 
     1617        '-webkit-transition': JW_CSS_NONE, 
     1618        '-moz-transition': JW_CSS_NONE, 
     1619        '-o-transition': JW_CSS_NONE 
     1620    }); 
    15741621         
    15751622})(jwplayer);/** 
     
    15851632                _states = _events.state; 
    15861633         
    1587         html5.controller = function(model) { 
    1588                 var _model = model,  
     1634        html5.controller = function(model, view) { 
     1635                var _model = model, 
     1636                        _view = view, 
    15891637                        _video = model.getVideo(), 
    1590 //                      _debug = 'console', 
    1591                         _eventDispatcher = new _events.eventdispatcher(_model.id); 
     1638                        _eventDispatcher = new _events.eventdispatcher(_model.id, _model.config.debug); 
    15921639                 
    15931640                _utils.extend(this, _eventDispatcher); 
     
    16081655                var file; 
    16091656                 
    1610                 this.load = function(item) { 
    1611                         if (_video.getTag().canPlayType("video/mp4")) { 
    1612                                 file = "http://playertest.longtailvideo.com/bunny.mp4";          
    1613                         } else if (_video.getTag().canPlayType("video/webm")) { 
    1614                                 file = "http://playertest.longtailvideo.com/bunny.webm";                 
    1615                         } else { 
    1616                                 file = "http://playertest.longtailvideo.com/bunny.ogv";          
    1617                         } 
    1618                         if (_utils.isMobile()) { 
    1619                                 _video.load(file); 
    1620                         } 
    1621                 } 
    1622                  
    1623                 this.play = function() { 
     1657                function _load(item) { 
     1658                        if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 
     1659                                _video.stop(); 
     1660                        } 
     1661                         
     1662                        switch (_utils.typeOf(item)) { 
     1663                        case "string": 
     1664                                file = item; 
     1665                                break; 
     1666                        case "object": 
     1667                                file = item.file; 
     1668                                break; 
     1669                        case "number": 
     1670                                file = _model.playlist[item].file; 
     1671                                break; 
     1672                        default: 
     1673                                file = _model.playlist[_model.item].file; 
     1674                        } 
     1675                                 
     1676//                      if (_video.getTag().canPlayType("video/mp4")) { 
     1677//                              file = "http://playertest.longtailvideo.com/bunny.mp4";          
     1678//                      } else if (_video.getTag().canPlayType("video/webm")) { 
     1679//                              file = "http://playertest.longtailvideo.com/bunny.webm";                 
     1680//                      } else { 
     1681//                              file = "http://playertest.longtailvideo.com/bunny.ogv";          
     1682//                      } 
     1683//                      if (_utils.isMobile()) { 
     1684//                              _video.load(file); 
     1685//                      } 
     1686                } 
     1687                 
     1688                function _play() { 
    16241689                        if (_model.state == _states.IDLE) { 
    16251690                                _video.load(file); 
     
    16291694                } 
    16301695 
    1631                 this.stop = function() { 
     1696                function _stop() { 
    16321697                        _video.stop(); 
    16331698                } 
    16341699 
    1635                 this.pause = function() { 
     1700                function _pause() { 
    16361701                        if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 
    16371702                                _video.pause(); 
     
    16391704                } 
    16401705 
    1641                 this.seek = function(pos) { 
     1706                function _seek(pos) { 
    16421707                        _video.seek(pos); 
    16431708                } 
    16441709                 
    1645                 this.volume = function(vol) { 
     1710                function _setVolume(vol) { 
    16461711                        _video.volume(vol); 
    16471712                } 
    16481713                 
    1649                 this.mute = function(state) { 
     1714                function _setMute(state) { 
    16501715                        if (!_utils.exists(state)) state = !_model.mute; 
    16511716                        _video.mute(state); 
    16521717                } 
    1653  
    1654                 this.prev = function() { 
    1655                 } 
    1656  
    1657                 this.next = function() { 
    1658                 } 
    1659                  
    1660                 this.item = function(item) {} 
     1718                 
     1719                function _setFullscreen(state) { 
     1720                        _view.fullscreen(state); 
     1721                } 
     1722 
     1723                 
     1724                function _item(item) { 
     1725                        _stop(); 
     1726                        _model.setItem(item); 
     1727                        _load(_model.item); 
     1728                        _play(); 
     1729                } 
     1730                 
     1731                function _prev() { 
     1732                        _item(_model.item - 1); 
     1733                } 
     1734                 
     1735                function _next() { 
     1736                        _item(_model.item + 1); 
     1737                } 
     1738                 
     1739                 
     1740                // TODO: implement waitForReady; either in Controller or in API 
     1741                function _waitForReady(func) { 
     1742                        return function() { 
     1743                                func.apply(this, arguments); 
     1744                        } 
     1745                } 
     1746                 
     1747                this.play = _waitForReady(_play); 
     1748                this.pause = _waitForReady(_pause); 
     1749                this.seek = _waitForReady(_seek); 
     1750                this.stop = _waitForReady(_stop); 
     1751                this.load = _waitForReady(_load); 
     1752                this.next = _waitForReady(_next); 
     1753                this.prev = _waitForReady(_prev); 
     1754                this.item = _waitForReady(_item); 
     1755                this.setVolume = _waitForReady(_setVolume); 
     1756                this.setMute = _waitForReady(_setMute); 
     1757                this.setFullscreen = _waitForReady(_setFullscreen); 
     1758                 
     1759/*              this.playerReady = _playerReady; 
     1760                this.detachMedia = _detachMedia;  
     1761                this.attachMedia = _attachMedia; 
     1762                this.beforePlay = function() {  
     1763                        return _preplay;  
     1764                } 
     1765*/               
    16611766                 
    16621767                _init(); 
     
    16901795})(jwplayer); 
    16911796/** 
     1797 * JW Player display component 
     1798 * 
     1799 * @author zach 
     1800 * @version 5.8 
     1801 */ 
     1802(function(html5) { 
     1803        var _utils = jwplayer.utils, 
     1804                _css = _utils.css, 
     1805                _events = jwplayer.events, 
     1806                _states = _events.state; 
     1807         
     1808        function _hide(element) { 
     1809                _css(element, { 
     1810                        display: "none" 
     1811                }); 
     1812        }; 
     1813         
     1814        function _show(element) { 
     1815                _css(element, { 
     1816                        display: "block" 
     1817                }); 
     1818        }; 
     1819         
     1820        html5.display = function(api, config) { 
     1821                var _defaults = { 
     1822                        icons: true, 
     1823                        showmute: false 
     1824                } 
     1825                var _config = _utils.extend({}, _defaults, config); 
     1826                var _api = api; 
     1827                var _display = {}; 
     1828                var _width; 
     1829                var _height; 
     1830                var _imageWidth; 
     1831                var _imageHeight; 
     1832                var _degreesRotated; 
     1833                var _rotationInterval; 
     1834                var _error; 
     1835                var _bufferRotation = !_utils.exists(_api.skin.getComponentSettings("display").bufferrotation) ? 15 : parseInt(_api.skin.getComponentSettings("display").bufferrotation, 10); 
     1836                var _bufferInterval = !_utils.exists(_api.skin.getComponentSettings("display").bufferinterval) ? 100 : parseInt(_api.skin.getComponentSettings("display").bufferinterval, 10); 
     1837                var _updateTimeout = -1; 
     1838                var _lastState = _states.IDLE; 
     1839                var _showing = true; 
     1840                var _lastSent; 
     1841                var _imageLoading = false, _imageShowing = true; 
     1842                var _currentImage = ""; 
     1843                var _hiding = false; 
     1844                var _ready = false; 
     1845                var _alternateClickHandler; 
     1846                var _normalscreenWidth, _normalscreenHeight; 
     1847                 
     1848                var _eventDispatcher = new _events.eventdispatcher(); 
     1849                _utils.extend(this, _eventDispatcher); 
     1850                 
     1851                var _elements = { 
     1852                        display: { 
     1853                                style: { 
     1854                                        cursor: "pointer", 
     1855                                        top: 0, 
     1856                                        left: 0, 
     1857                                        overflow: "hidden" 
     1858                                }, 
     1859                                click: _displayClickHandler 
     1860                        }, 
     1861                        display_icon: { 
     1862                                style: { 
     1863                                        cursor: "pointer", 
     1864                                        position: "absolute", 
     1865                                        top: ((_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", "playIcon").height) / 2), 
     1866                                        left: ((_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", "playIcon").width) / 2), 
     1867                                        border: 0, 
     1868                                        margin: 0, 
     1869                                        padding: 0, 
     1870                                        zIndex: 3, 
     1871                                        display: "none" 
     1872                                } 
     1873                        }, 
     1874                        display_iconBackground: { 
     1875                                style: { 
     1876                                        cursor: "pointer", 
     1877                                        position: "absolute", 
     1878                                        top: ((_height - _api.skin.getSkinElement("display", "background").height) / 2), 
     1879                                        left: ((_width - _api.skin.getSkinElement("display", "background").width) / 2), 
     1880                                        border: 0, 
     1881                                        backgroundImage: (["url(", _api.skin.getSkinElement("display", "background").src, ")"]).join(""), 
     1882                                        width: _api.skin.getSkinElement("display", "background").width, 
     1883                                        height: _api.skin.getSkinElement("display", "background").height, 
     1884                                        margin: 0, 
     1885                                        padding: 0, 
     1886                                        zIndex: 2, 
     1887                                        display: "none" 
     1888                                } 
     1889                        }, 
     1890                        display_image: { 
     1891                                style: { 
     1892                                        display: "none", 
     1893                                        width: _width, 
     1894                                        height: _height, 
     1895                                        position: "absolute", 
     1896                                        cursor: "pointer", 
     1897                                        left: 0, 
     1898                                        top: 0, 
     1899                                        margin: 0, 
     1900                                        padding: 0, 
     1901                                        textDecoration: "none", 
     1902                                        zIndex: 1 
     1903                                } 
     1904                        }, 
     1905                        display_text: { 
     1906                                style: { 
     1907                                        zIndex: 4, 
     1908                                        position: "relative", 
     1909                                        opacity: 0.8, 
     1910                                        backgroundColor: parseInt("000000", 16), 
     1911                                        color: parseInt("ffffff", 16), 
     1912                                        textAlign: "center", 
     1913                                        fontFamily: "Arial,sans-serif", 
     1914                                        padding: "0 5px", 
     1915                                        fontSize: 14 
     1916                                } 
     1917                        } 
     1918                }; 
     1919                _api.jwAddEventListener(_events.JWPLAYER_PLAYER_STATE, _stateHandler); 
     1920                _api.jwAddEventListener(_events.JWPLAYER_MEDIA_MUTE, _stateHandler); 
     1921                _api.jwAddEventListener(_events.JWPLAYER_PLAYLIST_LOADED, _playlistLoadHandler); 
     1922                _api.jwAddEventListener(_events.JWPLAYER_PLAYLIST_ITEM, _stateHandler); 
     1923                _api.jwAddEventListener(_events.JWPLAYER_ERROR, _errorHandler); 
     1924                _setupDisplay(); 
     1925                 
     1926                function _setupDisplay() { 
     1927                        _display.display = createElement("div", "display"); 
     1928                        _display.display_text = createElement("div", "display_text"); 
     1929                        _display.display.appendChild(_display.display_text); 
     1930                        _display.display_image = createElement("img", "display_image"); 
     1931                        _display.display_image.onerror = function(evt) { 
     1932                                _hide(_display.display_image); 
     1933                        }; 
     1934                        _display.display_image.onload = _onImageLoad; 
     1935                        _display.display_icon = createElement("div", "display_icon"); 
     1936                        _display.display_iconBackground = createElement("div", "display_iconBackground"); 
     1937                        _display.display.appendChild(_display.display_image); 
     1938                        _display.display_iconBackground.appendChild(_display.display_icon); 
     1939                        _display.display.appendChild(_display.display_iconBackground); 
     1940                        _setupDisplayElements(); 
     1941                         
     1942                        setTimeout((function() { 
     1943                                _ready = true; 
     1944                                if (_config.icons.toString() == "true") { 
     1945                                        _sendShow(); 
     1946                                } 
     1947                        }), 1); 
     1948                } 
     1949                 
     1950                 
     1951                this.getDisplayElement = function() { 
     1952                        return _display.display; 
     1953                }; 
     1954                 
     1955                this.resize = function(width, height) { 
     1956                        if (_api.jwGetFullscreen() && _utils.isMobile()) { 
     1957                                //No need to resize components; handled by the device 
     1958                                return; 
     1959                        } 
     1960                         
     1961                        _css(_display.display, { 
     1962                                width: width, 
     1963                                height: height 
     1964                        }); 
     1965                        _css(_display.display_text, { 
     1966                                width: (width - 10), 
     1967                                top: ((height - _utils.getBoundingClientRect(_display.display_text).height) / 2) 
     1968                        }); 
     1969                        _css(_display.display_iconBackground, { 
     1970                                top: ((height - _api.skin.getSkinElement("display", "background").height) / 2), 
     1971                                left: ((width - _api.skin.getSkinElement("display", "background").width) / 2) 
     1972                        }); 
     1973                        if (_width != width || _height != height) { 
     1974                                _width = width; 
     1975                                _height = height; 
     1976                                _lastSent = undefined; 
     1977                                _sendShow(); 
     1978                        } 
     1979                        if (!_api.jwGetFullscreen()) { 
     1980                                _normalscreenWidth = width; 
     1981                                _normalscreenHeight = height; 
     1982                        } 
     1983                        _stretch(); 
     1984                        _stateHandler({}); 
     1985                }; 
     1986                 
     1987                this.show = function() { 
     1988                        if (_hiding) { 
     1989                                _hiding = false; 
     1990                                _updateDisplay(_api.jwGetState()); 
     1991                        } 
     1992                } 
     1993 
     1994                this.hide = function() { 
     1995                        if (!_hiding) { 
     1996                                _hideDisplayIcon(); 
     1997                                _hiding = true; 
     1998                        } 
     1999                } 
     2000 
     2001                function _onImageLoad(evt) { 
     2002                        _imageWidth = _display.display_image.naturalWidth; 
     2003                        _imageHeight = _display.display_image.naturalHeight; 
     2004                        _stretch(); 
     2005                        if (_api.jwGetState() == _states.IDLE) { 
     2006                                _css(_display.display_image, { 
     2007                                        display: "block", 
     2008                                        opacity: 0 
     2009                                }); 
     2010                                _utils.fadeTo(_display.display_image, 1, 0.1); 
     2011                        } 
     2012                        _imageLoading = false; 
     2013                } 
     2014                 
     2015                function _stretch() { 
     2016                        if (_api.jwGetFullscreen() && _api.jwGetStretching() == _utils.stretching.EXACTFIT) { 
     2017                                var tmp = document.createElement("div"); 
     2018                                _utils.stretch(_utils.stretching.UNIFORM, tmp, _width, _height, _normalscreenWidth, _normalscreenHeight); 
     2019                                 
     2020                                _utils.stretch(_utils.stretching.EXACTFIT, _display.display_image,  
     2021                                                _utils.parseDimension(tmp.style.width), _utils.parseDimension(tmp.style.height), 
     2022                                                _imageWidth, _imageHeight); 
     2023                                 
     2024                                _css(_display.display_image, { 
     2025                                        left: tmp.style.left, 
     2026                                        top: tmp.style.top 
     2027                                }); 
     2028                        } else { 
     2029                                _utils.stretch(_api.jwGetStretching(), _display.display_image, _width, _height, _imageWidth, _imageHeight); 
     2030                        } 
     2031                }; 
     2032                 
     2033                function createElement(tag, element) { 
     2034                        var _element = document.createElement(tag); 
     2035                        _element.id = _api.id + "_jwplayer_" + element; 
     2036                        _css(_element, _elements[element].style); 
     2037                        return _element; 
     2038                } 
     2039                 
     2040                 
     2041                function _setupDisplayElements() { 
     2042                        for (var element in _display) { 
     2043                                if (_utils.exists(_elements[element].click)) { 
     2044                                        _display[element].onclick = _elements[element].click; 
     2045                                } 
     2046                        } 
     2047                } 
     2048                 
     2049                 
     2050                function _displayClickHandler(evt) { 
     2051                        if (typeof evt.preventDefault != "undefined") { 
     2052                                evt.preventDefault(); // W3C 
     2053                        } else { 
     2054                                evt.returnValue = false; // IE 
     2055                        } 
     2056                        if (typeof _alternateClickHandler == "function") { 
     2057                                _alternateClickHandler(evt); 
     2058                                return; 
     2059                        } else { 
     2060                                if (_api.jwGetState() != _states.PLAYING) { 
     2061                                        _api.jwPlay(); 
     2062                                } else { 
     2063                                        _api.jwPause(); 
     2064                                } 
     2065                        } 
     2066                } 
     2067                 
     2068                 
     2069                function _setDisplayIcon(newIcon) { 
     2070                        if (_error) { 
     2071                                _hideDisplayIcon(); 
     2072                                return; 
     2073                        } 
     2074                        _display.display_icon.style.backgroundImage = (["url(", _api.skin.getSkinElement("display", newIcon).src, ")"]).join(""); 
     2075                        _css(_display.display_icon, { 
     2076                                width: _api.skin.getSkinElement("display", newIcon).width, 
     2077                                height: _api.skin.getSkinElement("display", newIcon).height, 
     2078                                top: (_api.skin.getSkinElement("display", "background").height - _api.skin.getSkinElement("display", newIcon).height) / 2, 
     2079                                left: (_api.skin.getSkinElement("display", "background").width - _api.skin.getSkinElement("display", newIcon).width) / 2 
     2080                        }); 
     2081                        _showDisplayIcon(); 
     2082                        if (_utils.exists(_api.skin.getSkinElement("display", newIcon + "Over"))) { 
     2083                                _display.display_icon.onmouseover = function(evt) { 
     2084                                        _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon + "Over").src, ")"].join(""); 
     2085                                }; 
     2086                                _display.display_icon.onmouseout = function(evt) { 
     2087                                        _display.display_icon.style.backgroundImage = ["url(", _api.skin.getSkinElement("display", newIcon).src, ")"].join(""); 
     2088                                }; 
     2089                        } else { 
     2090                                _display.display_icon.onmouseover = null; 
     2091                                _display.display_icon.onmouseout = null; 
     2092                        } 
     2093                } 
     2094                 
     2095                function _hideDisplayIcon() { 
     2096                        if (_config.icons.toString() == "true") { 
     2097                                _hide(_display.display_icon); 
     2098                                _hide(_display.display_iconBackground); 
     2099                                _sendHide(); 
     2100                        } 
     2101                } 
     2102 
     2103                function _showDisplayIcon() { 
     2104                        if (!_hiding && _config.icons.toString() == "true") { 
     2105                                _show(_display.display_icon); 
     2106                                _show(_display.display_iconBackground); 
     2107                                _sendShow(); 
     2108                        } 
     2109                } 
     2110 
     2111                function _errorHandler(evt) { 
     2112                        _error = true; 
     2113                        _hideDisplayIcon(); 
     2114                        _display.display_text.innerHTML = evt.message; 
     2115                        _show(_display.display_text); 
     2116                        _display.display_text.style.top = ((_height - _utils.getBoundingClientRect(_display.display_text).height) / 2) + "px"; 
     2117                } 
     2118                 
     2119                function _resetPoster() { 
     2120                        _imageShowing = false; 
     2121                        _display.display_image.style.display = "none"; 
     2122                } 
     2123                 
     2124                function _playlistLoadHandler() { 
     2125                        // We're going to force a refresh once we get the playlist item event. 
     2126                        _lastState = ""; 
     2127                } 
     2128                 
     2129                function _stateHandler(evt) { 
     2130                        if ((evt.type == _events.JWPLAYER_PLAYER_STATE || 
     2131                                        evt.type == _events.JWPLAYER_PLAYLIST_ITEM) && 
     2132                                        _error) { 
     2133                                _error = false; 
     2134                                _hide(_display.display_text); 
     2135                        } 
     2136                         
     2137                        var state = _api.jwGetState(); 
     2138                        if (state == _lastState) { 
     2139                                return; 
     2140                        } 
     2141 
     2142                        _lastState = state; 
     2143 
     2144                        if (_updateTimeout >= 0) { 
     2145                                clearTimeout(_updateTimeout); 
     2146                        } 
     2147 
     2148                        if (_showing || _api.jwGetState() == _states.PLAYING || _api.jwGetState() == _states.PAUSED) { 
     2149                                _updateDisplay(_api.jwGetState()); 
     2150                        } else { 
     2151                                _updateTimeout = setTimeout(_stateCallback(_api.jwGetState()), 500); 
     2152                        } 
     2153                } 
     2154                 
     2155                function _stateCallback(state) { 
     2156                        return (function() { 
     2157                                _updateDisplay(state); 
     2158                        }); 
     2159                } 
     2160                 
     2161                 
     2162                function _updateDisplay(state) { 
     2163                        if (_utils.exists(_rotationInterval)) { 
     2164                                clearInterval(_rotationInterval); 
     2165                                _rotationInterval = null; 
     2166                                _utils.animations.rotate(_display.display_icon, 0); 
     2167                        } 
     2168                        switch (state) { 
     2169                                case _states.BUFFERING: 
     2170                                        if (_utils.isIPod()) { 
     2171                                                _resetPoster(); 
     2172                                                _hideDisplayIcon(); 
     2173                                        } else { 
     2174                                                if (_api.jwGetPlaylist()[_api.jwGetPlaylistIndex()].provider == "sound") { 
     2175                                                        _showImage(); 
     2176                                                } 
     2177                                                _degreesRotated = 0; 
     2178                                                _rotationInterval = setInterval(function() { 
     2179                                                        _degreesRotated += _bufferRotation; 
     2180                                                        _utils.animations.rotate(_display.display_icon, _degreesRotated % 360); 
     2181                                                }, _bufferInterval); 
     2182                                                _setDisplayIcon("bufferIcon"); 
     2183                                                _showing = true; 
     2184                                        } 
     2185                                        break; 
     2186                                case _states.PAUSED: 
     2187                                        if (!_utils.isIPod()) { 
     2188                                                if (_api.jwGetPlaylist()[_api.jwGetPlaylistIndex()].provider != "sound") { 
     2189                                                        _css(_display.display_image, { 
     2190                                                                background: "transparent no-repeat center center" 
     2191                                                        }); 
     2192                                                } 
     2193                                                _setDisplayIcon("playIcon"); 
     2194                                                _showing = true; 
     2195                                        } 
     2196                                        break; 
     2197                                case _states.IDLE: 
     2198                                        if (_api.jwGetPlaylist()[_api.jwGetPlaylistIndex()] && _api.jwGetPlaylist()[_api.jwGetPlaylistIndex()].image) { 
     2199                                                _showImage(); 
     2200                                        } else { 
     2201                                                _resetPoster(); 
     2202                                        } 
     2203                                        _setDisplayIcon("playIcon"); 
     2204                                        _showing = true; 
     2205                                        break; 
     2206                                default: 
     2207                                        if (_api.jwGetPlaylist()[_api.jwGetPlaylistIndex()] && _api.jwGetPlaylist()[_api.jwGetPlaylistIndex()].provider == "sound") { 
     2208                                                if (_utils.isIPod()) { 
     2209                                                        _resetPoster(); 
     2210                                                        _showing = false; 
     2211                                                } else { 
     2212                                                        _showImage(); 
     2213                                                } 
     2214                                        } else { 
     2215                                                _resetPoster(); 
     2216                                                _showing = false; 
     2217                                        } 
     2218                                        if (_api.jwGetMute() && _config.showmute) { 
     2219                                                _setDisplayIcon("muteIcon"); 
     2220                                        } else { 
     2221                                                _hideDisplayIcon(); 
     2222                                        } 
     2223                                        break; 
     2224                        } 
     2225                        _updateTimeout = -1; 
     2226                } 
     2227                 
     2228                function _showImage() { 
     2229                        if (_api.jwGetPlaylist()[_api.jwGetPlaylistIndex()]) { 
     2230                                var newsrc = _api.jwGetPlaylist()[_api.jwGetPlaylistIndex()].image; 
     2231                                if (newsrc) { 
     2232                                        if (newsrc != _currentImage) { 
     2233                                                _currentImage = newsrc; 
     2234                                                _imageLoading = true; 
     2235                                                _display.display_image.src = _utils.getAbsolutePath(newsrc); 
     2236                                        } else if (!(_imageLoading || _imageShowing)) { 
     2237                                                _imageShowing = true; 
     2238                                                _display.display_image.style.opacity = 0; 
     2239                                                _display.display_image.style.display = "block"; 
     2240                                                _utils.fadeTo(_display.display_image, 1, 0.1); 
     2241                                        } 
     2242                                         
     2243                                } 
     2244                        } 
     2245                } 
     2246                 
     2247                 
     2248                function _sendVisibilityEvent(eventType) { 
     2249                        return function() { 
     2250                                if (!_ready) return; 
     2251                                         
     2252                                if (!_hiding && _lastSent != eventType) { 
     2253                                        _lastSent = eventType; 
     2254                                        _eventDispatcher.sendEvent(eventType, { 
     2255                                                component: "display", 
     2256                                                boundingRect: _utils.getDimensions(_display.display_iconBackground) 
     2257                                        }); 
     2258                                } 
     2259                        } 
     2260                } 
     2261 
     2262                var _sendShow = _sendVisibilityEvent(_events.JWPLAYER_COMPONENT_SHOW); 
     2263                var _sendHide = _sendVisibilityEvent(_events.JWPLAYER_COMPONENT_HIDE); 
     2264 
     2265                /** NOT SUPPORTED : Using this for now to hack around instream API **/ 
     2266                this.setAlternateClickHandler = function(handler) { 
     2267                        _alternateClickHandler = handler; 
     2268                } 
     2269                this.revertAlternateClickHandler = function() { 
     2270                        _alternateClickHandler = undefined; 
     2271                } 
     2272                 
     2273                return this; 
     2274        }; 
     2275         
     2276         
     2277         
     2278})(jwplayer.html5); 
     2279/** 
    16922280 * jwplayer.html5 model 
    16932281 *  
     
    16962284 */ 
    16972285(function(html5) { 
    1698         var _utils = jwplayer.utils; 
     2286        var _utils = jwplayer.utils, 
     2287                _events = jwplayer.events; 
    16992288 
    17002289        html5.model = function(config) { 
     
    17032292                        _video,  
    17042293                        // HTML5 <video> tag 
    1705                         _videoTag; 
    1706  
    1707                 _utils.extend(_model, new jwplayer.events.eventdispatcher()); 
     2294                        _videoTag, 
     2295                        // Saved settings 
     2296                        _cookies = _utils.getCookies(), 
     2297                        // Defaults 
     2298                        _defaults = { 
     2299                                width: 480, 
     2300                                height: 320, 
     2301                                item: 0, 
     2302                                playlist: undefined, 
     2303                                skin: undefined, 
     2304                                volume: 90, 
     2305                                mute: false, 
     2306        //                      repeat: "", 
     2307        //                      stretching: jwplayer.utils.stretching.UNIFORM, 
     2308                                autostart: false, 
     2309                                debug: undefined 
     2310                        }; 
    17082311 
    17092312                function _parseConfig(config) { 
     
    17122315 
    17132316                function _init() { 
     2317                        _utils.extend(_model, new _events.eventdispatcher()); 
    17142318                        _utils.extend(_model, { 
    1715                                 id : config.id, 
    1716                                 settings : _parseConfig(config), 
    1717                                 volume : 0, 
    1718                                 state : jwplayer.events.state.IDLE, 
    1719                                 mute : false 
     2319                                id: config.id, 
     2320                                state : _events.state.IDLE, 
     2321                                position: 0, 
     2322                                buffer: 0, 
     2323                                playlist: [], 
     2324                                config: _utils.extend({}, _defaults, _cookies, _parseConfig(config))  
    17202325                        }); 
    1721  
     2326                        _model.setItem(_model.config.item); 
     2327                         
    17222328                        _videoTag = document.createElement("video"); 
    17232329                        _video = new html5.video(_videoTag); 
     
    17252331                } 
    17262332 
     2333                var _eventMap = {}; 
     2334                _eventMap[_events.JWPLAYER_MEDIA_MUTE] = "mute"; 
     2335                _eventMap[_events.JWPLAYER_MEDIA_VOLUME] = "volume"; 
     2336                _eventMap[_events.JWPLAYER_PLAYER_STATE] = "newstate->state"; 
     2337                _eventMap[_events.JWPLAYER_MEDIA_BUFFER] = "bufferPercent->buffer"; 
     2338                _eventMap[_events.JWPLAYER_MEDIA_TIME] = "position"; 
     2339                         
    17272340                function _videoEventHandler(evt) { 
    1728                         switch (evt.type) { 
    1729                         case jwplayer.events.JWPLAYER_MEDIA_MUTE: 
    1730                                 if (_model.mute == evt.mute) 
    1731                                         return; 
    1732                                 _model.mute = evt.mute; 
    1733                                 break; 
    1734                         case jwplayer.events.JWPLAYER_MEDIA_VOLUME: 
    1735                                 if (_model.volume == evt.volume) 
    1736                                         return; 
    1737                                 _model.volume = evt.volume; 
    1738                                 break; 
    1739                         case jwplayer.events.JWPLAYER_PLAYER_STATE: 
    1740                                 if (_model.state == evt.newstate) 
    1741                                         return; 
    1742                                 _model.state = evt.newstate; 
    1743                         } 
    1744                         _model.sendEvent(evt.type, evt); 
     2341                        var mapping = _eventMap[evt.type]; 
     2342                        if (mapping) { 
     2343                                var split = mapping.split("->"), 
     2344                                        eventProp = split[0], 
     2345                                        stateProp = split[1] ? split[1] : eventProp; 
     2346                                if (_model[stateProp] != evt[eventProp]) { 
     2347                                        _model[stateProp] = evt[eventProp]; 
     2348                                        _model.sendEvent(evt.type, evt); 
     2349                                } 
     2350                        } else { 
     2351                                _model.sendEvent(evt.type, evt); 
     2352                        } 
    17452353                } 
    17462354                 
     
    17522360                        if (state != _model.fullscreen) { 
    17532361                                _model.fullscreen = state; 
    1754                                 _model.sendEvent(jwplayer.events.JWPLAYER_FULLSCREEN, { fullscreen: state } ); 
     2362                                _model.sendEvent(_events.JWPLAYER_FULLSCREEN, { fullscreen: state } ); 
     2363                        } 
     2364                } 
     2365                 
     2366                this.setItem = function(index) { 
     2367                        var newItem; 
     2368                        if (index == _model.playlist.length || index < -1) 
     2369                                newItem = 0; 
     2370                        else if (index == -1 || index > _model.playlist.length) 
     2371                                newItem = _model.playlist.length - 1; 
     2372                        else 
     2373                                newItem = index; 
     2374                         
     2375                        if (newItem != _model.item) { 
     2376                                _model.item = newItem; 
     2377                                _model.sendEvent(_events.JWPLAYER_PLAYLIST_ITEM, { 
     2378                                        "index": _model.item 
     2379                                }); 
    17552380                        } 
    17562381                } 
     
    17602385})(jwplayer.html5); 
    17612386/** 
    1762  * Main HTMl5 player class 
     2387 * Main HTML5 player class 
    17632388 * 
    17642389 * @author pablo 
     
    17672392(function(html5) { 
    17682393        html5.player = function(config) { 
    1769                 var _model, _view, _controller, 
    1770                         _api = this; 
    1771                  
     2394                var _api = this, 
     2395                        _model = new html5.model(config),  
     2396                        _view = new html5.view(this, _model),  
     2397                        _controller = new html5.controller(_model, _view); 
     2398 
    17722399                function _init() { 
    1773                         _model = new html5.model(config); 
    1774                          
    17752400                        _api.id = _model.id; 
    1776                         _api.settings = _model.settings; 
    1777                                                  
    1778                         _controller = new html5.controller(_model); 
    1779                         _controller.load(); 
    1780                          
     2401                         
     2402//                      _controller.load(); 
     2403/*                       
    17812404                        (new html5.skinloader(config.skin, function(skin) { 
    17822405                                _api.skin = skin; 
    1783                                 _view = new html5.view(_api, _model); 
     2406                                _view.setup(); 
    17842407                        }, function(err) { _utils.log(err); })); 
    1785                          
    1786                 } 
    1787                  
    1788                 this.jwPlay = function(){ _controller.play() }; 
    1789                 this.jwPause = function(){ _controller.pause() }; 
    1790                 this.jwStop = function(){ _controller.stop() }; 
    1791                 this.jwSeek = function(pos){ _controller.seek(pos) }; 
    1792                 this.jwSetVolume = function(vol){ _controller.volume(vol) }; 
    1793                 this.jwSetMute = function(state){ _controller.mute(state) }; 
    1794                 this.jwLoad = function(item) { _controller.load(item); } 
    1795                 this.jwPlaylistNext = function() { _controller.next(); } 
    1796                 this.jwPlaylistPrev = function() { _controller.prev(); } 
    1797                 this.jwPlaylistItem = function(item) { _controller.item(item); } 
    1798                 this.jwSetFullscreen = function(state) { _view.fullscreen(state); } 
    1799                  
    1800                 this.jwGetState = function(){ return _model.state }; 
    1801                 this.jwGetVolume = function(){ return _model.volume }; 
    1802                 this.jwGetMute = function(){ return _model.mute }; 
    1803                 this.jwGetFullscreen = function(){ return _model.fullscreen }; 
    1804  
    1805                 this.jwAddEventListener = function(type, handler) { _controller.addEventListener(type, handler); }; 
    1806                 this.jwRemoveEventListener = function(type, handler) { _controller.removeEventListener(type, handler); }; 
     2408*/ 
     2409                        var setup = new html5.setup(_model, _view, _controller); 
     2410                        setup.addEventListener(jwplayer.events.JWPLAYER_READY, _readyHandler); 
     2411                        setup.addEventListener(jwplayer.events.JWPLAYER_ERROR, _errorHandler); 
     2412                        setup.start(); 
     2413                } 
     2414                 
     2415                function _readyHandler(evt) { 
     2416                        _controller.sendEvent(evt.type, evt); 
     2417                        _controller.load(); 
     2418                } 
     2419 
     2420                function _errorHandler(evt) { 
     2421                        console.log(evt); 
     2422                        alert("Can't set up: " + evt.message); 
     2423                } 
     2424 
     2425                 
     2426                /** Methods **/ 
     2427                 
     2428                this.jwPlay = _controller.play; 
     2429                this.jwPause = _controller.pause; 
     2430                this.jwStop = _controller.stop; 
     2431                this.jwSeek = _controller.seek; 
     2432                this.jwSetVolume = _controller.setVolume; 
     2433                this.jwSetMute = _controller.setMute; 
     2434                this.jwLoad = _controller.load; 
     2435                this.jwPlaylistNext = _controller.next; 
     2436                this.jwPlaylistPrev = _controller.prev; 
     2437                this.jwPlaylistItem = _controller.item; 
     2438                this.jwSetFullscreen = _controller.setFullscreen; 
     2439                 
     2440 
     2441                /** Getters **/ 
     2442                 
     2443                function _statevarFactory(statevar) { 
     2444                        return function() { 
     2445                                return _model[statevar]; 
     2446                        }; 
     2447                } 
     2448                 
     2449                this.jwGetPlaylistIndex = _statevarFactory('item'); 
     2450                this.jwGetPosition = _statevarFactory('position'); 
     2451                this.jwGetDuration = _statevarFactory('duration'); 
     2452                this.jwGetBuffer = _statevarFactory('buffer'); 
     2453                this.jwGetWidth = _statevarFactory('width'); 
     2454                this.jwGetHeight = _statevarFactory('height'); 
     2455                this.jwGetFullscreen = _statevarFactory('fullscreen'); 
     2456                this.jwGetVolume = _statevarFactory('volume'); 
     2457                this.jwGetMute = _statevarFactory('mute'); 
     2458                this.jwGetState = _statevarFactory('state'); 
     2459                this.jwGetStretching = _statevarFactory('stretching'); 
     2460                this.jwGetPlaylist = _statevarFactory('playlist'); 
     2461 
     2462                 
     2463                this.jwAddEventListener = _controller.addEventListener; 
     2464                this.jwRemoveEventListener = _controller.removeEventListener; 
    18072465                 
    18082466                _init(); 
     2467        } 
     2468})(jwplayer.html5); 
     2469 
     2470/** 
     2471 * JW Player playlist model 
     2472 * 
     2473 * @author zach 
     2474 * @modified pablo 
     2475 * @version 6.0 
     2476 */ 
     2477(function(html5) { 
     2478        var _utils = jwplayer.utils; 
     2479        html5.playlist = function(playlist) { 
     2480                var _playlist = []; 
     2481                if (playlist && playlist instanceof Array && playlist.length > 0) { 
     2482                        for (var playlistItem in playlist) { 
     2483                                if (!isNaN(parseInt(playlistItem))){ 
     2484                                        _playlist.push(new html5.playlistitem(playlist[playlistItem])); 
     2485                                } 
     2486                        } 
     2487                } else { 
     2488                        _playlist.push(new html5.playlistitem(playlist)); 
     2489                } 
     2490                return _playlist; 
     2491        }; 
     2492         
     2493})(jwplayer.html5); 
     2494/** 
     2495 * JW Player playlist item model 
     2496 * 
     2497 * @author zach 
     2498 * @modified pablo 
     2499 * @version 6.0 
     2500 */ 
     2501(function(html5) { 
     2502        html5.playlistitem = function(config) { 
     2503                var _defaults = { 
     2504                        description: "", 
     2505                        image: "", 
     2506                        link: "", 
     2507                        mediaid: "", 
     2508                        title: "", 
     2509                        provider: "", 
     2510                         
     2511                        file: "", 
     2512                        duration: -1, 
     2513                        start: 0, 
     2514                         
     2515                        currentLevel: -1, 
     2516                        levels: [] 
     2517                }; 
     2518                 
     2519                 
     2520                var _playlistitem = jwplayer.utils.extend({}, _defaults, config); 
     2521                 
     2522/* 
     2523                if (_playlistitem.type) { 
     2524                        _playlistitem.provider = _playlistitem.type; 
     2525                        delete _playlistitem.type; 
     2526                } 
     2527*/               
     2528                if (_playlistitem.levels.length === 0) { 
     2529                        _playlistitem.levels[0] = new html5.playlistitemlevel(_playlistitem); 
     2530                } 
     2531/*               
     2532                if (!_playlistitem.provider) { 
     2533                        _playlistitem.provider = _getProvider(_playlistitem.levels[0]); 
     2534                } else { 
     2535                        _playlistitem.provider = _playlistitem.provider.toLowerCase(); 
     2536                } 
     2537*/ 
     2538                 
     2539                return _playlistitem; 
     2540        }; 
     2541})(jwplayer.html5);/** 
     2542 * JW Player playlist item level model 
     2543 * 
     2544 * @author zach 
     2545 * @version 5.4 
     2546 */ 
     2547(function(jwplayer) { 
     2548        jwplayer.html5.playlistitemlevel = function(config) { 
     2549                var _playlistitemlevel = { 
     2550                        file: "", 
     2551                        streamer: "", 
     2552                        bitrate: 0, 
     2553                        width: 0 
     2554                }; 
     2555                 
     2556                for (var property in _playlistitemlevel) { 
     2557                        if (jwplayer.utils.exists(config[property])) { 
     2558                                _playlistitemlevel[property] = config[property]; 
     2559                        } 
     2560                } 
     2561                return _playlistitemlevel; 
     2562        }; 
     2563         
     2564})(jwplayer); 
     2565/** 
     2566 * JW Player playlist loader 
     2567 * 
     2568 * @author pablo 
     2569 * @version 6.0 
     2570 */ 
     2571(function(html5) { 
     2572        var _jw = jwplayer, _utils = _jw.utils, _events = _jw.events; 
     2573 
     2574        html5.playlistloader = function() { 
     2575                var _eventDispatcher = new _events.eventdispatcher(); 
     2576                _utils.extend(this, _eventDispatcher); 
     2577                 
     2578                this.load = function(playlistfile) { 
     2579                        _utils.ajax(playlistfile, _playlistLoaded, _playlistError) 
     2580                } 
     2581                 
     2582                function _playlistLoaded(loadedEvent) { 
     2583                        try { 
     2584                                var playlistObj = html5.parsers.rssparser.parse(loadedEvent.responseXML.firstChild); 
     2585                                _eventDispatcher.sendEvent(_events.JWPLAYER_PLAYLIST_LOADED, { 
     2586                                        "playlist": new html5.playlist(playlistObj) 
     2587                                }); 
     2588                        } catch (e) { 
     2589                                _playlistError('Could not load the playlist.'); 
     2590                        } 
     2591                } 
     2592                 
     2593                function _playlistError(msg) { 
     2594                        _eventDispatcher.sendEvent(_events.JWPLAYER_ERROR, { 
     2595                                message: msg ? msg : 'Could not load playlist an unknown reason.' 
     2596                        }); 
     2597                } 
     2598        } 
     2599})(jwplayer.html5);/** 
     2600 * This class is responsible for setting up the player and triggering the PLAYER_READY event, or an JWPLAYER_ERROR event 
     2601 *  
     2602 * The order of the player setup is as follows: 
     2603 *  
     2604 * 1. parse config 
     2605 * 2. load skin (async) 
     2606 * 3. load external playlist (async) 
     2607 * 4. load preview image (requires 3) 
     2608 * 5. initialize components (requires 2) 
     2609 * 6. initialize plugins (requires 5) 
     2610 * 7. ready 
     2611 * 
     2612 * @author pablo 
     2613 * @version 6.0 
     2614 */ 
     2615(function(html5) { 
     2616        var _jw = jwplayer, _utils = _jw.utils, _events = _jw.events, 
     2617         
     2618                PARSE_CONFIG = "config", 
     2619                LOAD_SKIN = "skin", 
     2620                LOAD_PLAYLIST = "playlist", 
     2621                LOAD_PREVIEW = "preview", 
     2622                SETUP_COMPONENTS = "components", 
     2623                INIT_PLUGINS = "plugins", 
     2624                SEND_READY = "ready"; 
     2625 
     2626        html5.setup = function(model, view, controller) { 
     2627                var _model = model,  
     2628                        _view = view, 
     2629                        _controller = controller, 
     2630                        _completed = {}, 
     2631                        _depends = {}, 
     2632                        _skin, 
     2633                        _eventDispatcher = new _events.eventdispatcher(), 
     2634                        _errorState = false, 
     2635                        _queue = []; 
     2636                         
     2637                function _initQueue() { 
     2638                        _addTask(PARSE_CONFIG, _parseConfig); 
     2639                        _addTask(LOAD_SKIN, _loadSkin, PARSE_CONFIG); 
     2640                        _addTask(LOAD_PLAYLIST, _loadPlaylist, PARSE_CONFIG); 
     2641                        _addTask(LOAD_PREVIEW, _loadPreview, LOAD_PLAYLIST); 
     2642                        _addTask(SETUP_COMPONENTS, _setupComponents, LOAD_SKIN); 
     2643                        _addTask(INIT_PLUGINS, _initPlugins, SETUP_COMPONENTS); 
     2644                        _addTask(SEND_READY, _sendReady, INIT_PLUGINS); 
     2645                } 
     2646                 
     2647                function _addTask(name, method, depends) { 
     2648                        _queue.push({name:name, method:method, depends:depends}); 
     2649                } 
     2650 
     2651                function _nextTask() { 
     2652                        for (var i=0; i < _queue.length; i++) { 
     2653                                var task = _queue[i]; 
     2654                                if (!task.depends || _completed[task.depends]) { 
     2655                                        _queue.splice(i, 1); 
     2656                                        try { 
     2657                                                task.method(); 
     2658                                                _nextTask(); 
     2659                                        } catch(error) { 
     2660                                                _error(error.message); 
     2661                                        } 
     2662                                        return; 
     2663                                } 
     2664                        } 
     2665                        if (_queue.length > 0 && !_errorState) { 
     2666                                // Still waiting for a dependency to come through; wait a little while. 
     2667                                setTimeout(_nextTask, 500); 
     2668                        } 
     2669                } 
     2670 
     2671                function _taskComplete(name) { 
     2672                        _completed[name] = true; 
     2673                } 
     2674                 
     2675                function _parseConfig() { 
     2676                        _taskComplete(PARSE_CONFIG); 
     2677                } 
     2678                 
     2679                function _loadSkin() { 
     2680                        new html5.skinloader(_model.config.skin, _skinLoaded, _skinError); 
     2681                } 
     2682                 
     2683                function _skinLoaded(skin) { 
     2684                        _skin = skin; 
     2685                        _taskComplete(LOAD_SKIN); 
     2686                } 
     2687                 
     2688                function _skinError(evt) { 
     2689                        _error(evt.message); 
     2690                } 
     2691 
     2692                function _loadPlaylist() { 
     2693                        switch(_utils.typeOf(_model.config.playlist)) { 
     2694                        case "string": 
     2695                                var loader = new html5.playlistloader(); 
     2696                                loader.addEventListener(_events.JWPLAYER_PLAYLIST_LOADED, _playlistLoaded); 
     2697                                loader.addEventListener(_events.JWPLAYER_ERROR, _playlistError); 
     2698                                loader.load(_model.config.playlist); 
     2699                                break; 
     2700                        case "array": 
     2701                                _model.playlist = new html5.playlist(_model.config.playlist); 
     2702                                _taskComplete(LOAD_PLAYLIST); 
     2703                        } 
     2704                } 
     2705                 
     2706                function _playlistLoaded(evt) { 
     2707                        _model.playlist = evt.playlist; 
     2708                        _taskComplete(LOAD_PLAYLIST); 
     2709                } 
     2710 
     2711                function _playlistError(evt) { 
     2712                        _error(evt.message); 
     2713                } 
     2714                 
     2715                function _loadPreview() { 
     2716                        var preview = _model.playlist[_model.item].image;  
     2717                        if (preview) { 
     2718                                var img = new Image(); 
     2719                                img.addEventListener('load', _previewLoaded, false); 
     2720                                // If there was an error, continue anyway 
     2721                                img.addEventListener('error', _previewLoaded, false); 
     2722                                img.src = preview;  
     2723                        } 
     2724                } 
     2725                 
     2726                function _previewLoaded(evt) { 
     2727                        _taskComplete(LOAD_PREVIEW); 
     2728                } 
     2729 
     2730                function _setupComponents() { 
     2731                        _view.setup(_skin); 
     2732                        _taskComplete(SETUP_COMPONENTS); 
     2733                } 
     2734 
     2735                function _initPlugins() { 
     2736                        _taskComplete(INIT_PLUGINS); 
     2737                } 
     2738 
     2739                function _sendReady() { 
     2740                        _eventDispatcher.sendEvent(_events.JWPLAYER_READY); 
     2741                        _taskComplete(SEND_READY); 
     2742                } 
     2743                 
     2744                function _error(message) { 
     2745                        _errorState = true; 
     2746                        _eventDispatcher.sendEvent(_events.JWPLAYER_ERROR, {message: message});          
     2747                } 
     2748                 
     2749                _utils.extend(this, _eventDispatcher); 
     2750                 
     2751                this.start = _nextTask; 
     2752                 
     2753                _initQueue(); 
    18092754        } 
    18102755})(jwplayer.html5); 
     
    18722817 * @version 6.0 
    18732818 */ 
    1874 (function(jwplayerhtml5) { 
     2819(function(html5) { 
    18752820        var _utils = jwplayer.utils; 
    18762821         
    18772822        /** Constructor **/ 
    1878         jwplayerhtml5.skinloader = function(skinPath, completeHandler, errorHandler) { 
     2823        html5.skinloader = function(skinPath, completeHandler, errorHandler) { 
    18792824                var _skin = {}; 
    18802825                var _completeHandler = completeHandler; 
     
    18882833                function _load() { 
    18892834                        if (typeof _skinPath != "string" || _skinPath === "") { 
    1890                                 _loadSkin(jwplayerhtml5.defaultskin().xml); 
     2835                                _loadSkin(html5.defaultskin().xml); 
    18912836                        } else { 
    18922837                                _utils.ajax(_utils.getAbsolutePath(_skinPath), function(xmlrequest) { 
     
    18992844                                                _clearSkin(); 
    19002845                                        } 
    1901                                         _loadSkin(jwplayer.html5.defaultskin().xml); 
     2846                                        _loadSkin(html5.defaultskin().xml); 
    19022847                                }, function(path) { 
    1903                                         _loadSkin(jwplayer.html5.defaultskin().xml); 
     2848                                        _loadSkin(html5.defaultskin().xml); 
    19042849                                }); 
    19052850                        } 
     
    21983143                function _errorHandler(evt) { 
    21993144                        _utils.log("Error: %o", _video.error); 
    2200                         _generalHandler(evt); 
     3145                        _setState(_states.IDLE); 
    22013146                } 
    22023147 
     
    23403285 
    23413286        DOCUMENT = document,  
    2342         VIEW_CONTAINER_CLASS = "jwcontainer",  
     3287        VIEW_CONTAINER_CLASS = "jwplayer",  
    23433288        VIEW_VIDEO_CONTAINER_CLASS = "jwvideocontainer",  
    23443289        VIEW_CONTROLS_CONTAINER_CLASS = "jwcontrolscontainer"; 
     
    23513296                        _videoLayer; 
    23523297 
    2353                  
    2354                 function _init() { 
     3298                this.setup = function(skin) { 
     3299                        _api.skin = skin; 
     3300                         
    23553301                        _container = DOCUMENT.getElementById(_api.id); 
    23563302                        _container.className = VIEW_CONTAINER_CLASS; 
     
    23753321                } 
    23763322 
     3323                /**  
     3324                 * Switch to fullscreen mode.  If a native fullscreen method is available in the browser, use that.   
     3325                 * Otherwise, use the false fullscreen method using CSS.  
     3326                 **/ 
    23773327                var _fullscreen = this.fullscreen = function(state) { 
    23783328                        if (!_utils.exists(state)) { 
     
    23823332                        if (state) { 
    23833333                                if (!_model.fullscreen) { 
     3334                                        _fakeFullscreen(true); 
     3335                                         
    23843336                                        if (_container.requestFullScreen) { 
    23853337                                                _container.requestFullScreen(); 
     
    23903342                                        } else if (_container.webkitRequestFullScreen) { 
    23913343                                                _container.webkitRequestFullScreen(); 
    2392                                         } else { 
    2393                                                 _fakeFullscreen(true); 
    23943344                                        } 
    23953345                                } 
    23963346                                _model.setFullscreen(true); 
    23973347                        } else { 
     3348                        _fakeFullscreen(false); 
    23983349                            if (DOCUMENT.cancelFullScreen) {   
    23993350                                DOCUMENT.cancelFullScreen();   
     
    24023353                            } else if (DOCUMENT.webkitCancelFullScreen) {   
    24033354                                DOCUMENT.webkitCancelFullScreen();   
    2404                             } else { 
    2405                                 _fakeFullscreen(false); 
    24063355                            } 
    2407                                  
    24083356                                _model.setFullscreen(false); 
    24093357                        } 
    24103358                } 
    24113359 
     3360                /** 
     3361                 * Resize the player 
     3362                 */ 
     3363                this.resize = function(width, height) { 
     3364                        // TODO: implement 
     3365                        return; 
     3366                } 
     3367                 
     3368                 
     3369                /** 
     3370                 * Listen for keystrokes.  Currently only ESC is recognized, to switch out of fullscreen mode. 
     3371                 **/ 
    24123372                function _keyHandler(evt) { 
    24133373                        switch (evt.keyCode) { 
    2414                         // ESC key 
     3374                        // ESC 
    24153375                        case 27: 
    24163376                                if (_model.fullscreen) { 
     
    24183378                                } 
    24193379                                break; 
    2420                         } 
    2421                 } 
    2422                  
     3380                        // SPACE 
     3381                        case 32: 
     3382                                _api.jwPlay() 
     3383                                break; 
     3384                        } 
     3385                } 
     3386                 
     3387                /** 
     3388                 * False fullscreen mode. This is used for browsers without full support for HTML5 fullscreen. 
     3389                 * This method sets the CSS of the container element to a fixed position with 100% width and height. 
     3390                 */ 
    24233391                function _fakeFullscreen(state) { 
    24243392                        if (state) { 
     
    24283396                        } 
    24293397                } 
    2430                  
     3398 
     3399                /** 
     3400                 * Return whether or not we're in native fullscreen 
     3401                 */ 
     3402                function _isNativeFullscreen() { 
     3403                        return (DOCUMENT.mozFullScreenElement == _container ||  
     3404                                        DOCUMENT.webkitCurrentFullScreenElement == _container); 
     3405                } 
     3406                 
     3407                /** 
     3408                 * If the browser enters or exits fullscreen mode (without the view's knowing about it) update the model. 
     3409                 **/ 
    24313410                function _fullscreenChangeHandler(evt) { 
    2432                         _model.setFullscreen(DOCUMENT.mozFullScreenElement == _container ||  
    2433                                         DOCUMENT.webkitCurrentFullScreenElement == _container); 
    2434                 } 
    2435  
    2436                 _init(); 
     3411                        _model.setFullscreen(_isNativeFullscreen()); 
     3412                        _fullscreen(_model.fullscreen); 
     3413                } 
     3414 
    24373415        } 
    24383416 
    2439         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-webkit-full-screen', { 
    2440                 width: "100% !important", 
    2441                 height: "100% !important" 
    2442         }); 
    2443         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-moz-full-screen', { 
    2444                 width: "100% !important", 
    2445                 height: "100% !important" 
    2446         }); 
    2447         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+'.jwfullscreen', { 
    2448                 left: 0, 
    2449                 right: 0, 
    2450                 top: 0, 
    2451                 bottom: 0, 
    2452                 position: "fixed !important" 
    2453         }); 
    2454          
    2455          
     3417        /************************************************************* 
     3418         * Player stylesheets - done once on script initialization;  * 
     3419         * These CSS rules are used for all JW Player instances      * 
     3420         *************************************************************/ 
     3421 
     3422        // Container styles 
     3423 
    24563424        _utils.appendStylesheet('.' + VIEW_VIDEO_CONTAINER_CLASS + ' ,.'+ VIEW_CONTROLS_CONTAINER_CLASS, { 
    24573425                width : "100%", 
     
    24693437        }); 
    24703438 
     3439 
     3440         
     3441        // Fullscreen styles 
     3442         
     3443        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-webkit-full-screen', { 
     3444                width: "100% !important", 
     3445                height: "100% !important" 
     3446        }); 
     3447         
     3448        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-moz-full-screen', { 
     3449                width: "100% !important", 
     3450                height: "100% !important" 
     3451        }); 
     3452         
     3453        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+'.jwfullscreen', { 
     3454                left: 0, 
     3455                right: 0, 
     3456                top: 0, 
     3457                bottom: 0, 
     3458                'z-index': 1000, 
     3459                position: "fixed !important" 
     3460        }); 
     3461         
    24713462})(jwplayer.html5);/** 
     3463 * Parsers namespace declaration 
     3464 *  
     3465 * @author pablo 
     3466 * @version 6.0 
     3467 */ 
     3468(function(html5) { 
     3469        html5.parsers = { 
     3470                localName : function(node) { 
     3471                        if (!node) { 
     3472                                return ""; 
     3473                        } else if (node.localName) { 
     3474                                return node.localName; 
     3475                        } else if (node.baseName) { 
     3476                                return node.baseName; 
     3477                        } else { 
     3478                                return ""; 
     3479                        } 
     3480                }, 
     3481                textContent : function(node) { 
     3482                        if (!node) { 
     3483                                return ""; 
     3484                        } else if (node.textContent) { 
     3485                                return node.textContent; 
     3486                        } else if (node.text) { 
     3487                                return node.text; 
     3488                        } else { 
     3489                                return ""; 
     3490                        } 
     3491                }, 
     3492                getChildNode : function(parent, index) { 
     3493                        return parent.childNodes[index]; 
     3494                }, 
     3495                numChildren : function(parent) { 
     3496                        if (parent.childNodes) { 
     3497                                return parent.childNodes.length; 
     3498                        } else { 
     3499                                return 0; 
     3500                        } 
     3501                } 
     3502 
     3503        }; 
     3504})(jwplayer.html5); 
     3505/** 
     3506 * Parse a feed item for JWPlayer content. 
     3507 *  
     3508 * @author zach 
     3509 * @modified pablo 
     3510 * @version 6.0 
     3511 */ 
     3512(function(jwplayer) { 
     3513        var _parsers = jwplayer.html5.parsers; 
     3514         
     3515        var jwparser = _parsers.jwparser = function() { 
     3516        }; 
     3517 
     3518        var PREFIX = 'jwplayer'; 
     3519 
     3520        /** 
     3521         * Parse a feed entry for JWPlayer content. 
     3522         *  
     3523         * @param {XML} 
     3524         *            obj The XML object to parse. 
     3525         * @param {Object} 
     3526         *            itm The playlistentry to amend the object to. 
     3527         * @return {Object} The playlistentry, amended with the JWPlayer info. 
     3528         */ 
     3529        jwparser.parseEntry = function(obj, itm) { 
     3530                for ( var i = 0; i < obj.childNodes.length; i++) { 
     3531                        var node = obj.childNodes[i]; 
     3532                        if (node.prefix == PREFIX) { 
     3533                                var _localName = _parsers.localName(node); 
     3534                                itm[_localName] = jwplayer.utils.strings.serialize(_parsers.textContent(node)); 
     3535                                if (_localName == "file" && itm.levels) { 
     3536                                        // jwplayer namespace file should override existing level 
     3537                                        // (probably set in MediaParser) 
     3538                                        delete itm.levels; 
     3539                                } 
     3540                        } 
     3541                        if (!itm['file']) { 
     3542                                itm['file'] = itm['link']; 
     3543                        } 
     3544                } 
     3545                return itm; 
     3546        } 
     3547})(jwplayer);/** 
     3548 * Parse a MRSS group into a playlistitem (used in RSS and ATOM). 
     3549 * 
     3550 * author zach 
     3551 * modified pablo 
     3552 * version 6.0 
     3553 */ 
     3554(function(parsers) { 
     3555        var _strings = jwplayer.utils.strings, 
     3556                _xmlAttribute = _strings.xmlAttribute, 
     3557                _localName = parsers.localName, 
     3558                _textContent = parsers.textContent, 
     3559                _numChildren = parsers.numChildren; 
     3560         
     3561         
     3562        var mediaparser = parsers.mediaparser = function() {}; 
     3563         
     3564        /** Prefix for the MRSS namespace. **/ 
     3565        var PREFIX = 'media'; 
     3566         
     3567        /** 
     3568         * Parse a feeditem for Yahoo MediaRSS extensions. 
     3569         * The 'content' and 'group' elements can nest other MediaRSS elements. 
     3570         * @param       {XML}           obj             The entire MRSS XML object. 
     3571         * @param       {Object}        itm             The playlistentry to amend the object to. 
     3572         * @return      {Object}                        The playlistentry, amended with the MRSS info. 
     3573         **/ 
     3574        mediaparser.parseGroup = function(obj, itm) { 
     3575                for (var i = 0; i < _numChildren(obj); i++) { 
     3576                        var node = obj.childNodes[i]; 
     3577                        if (node.prefix == PREFIX) { 
     3578                                if (!_localName(node)){ 
     3579                                        continue; 
     3580                                } 
     3581                                switch (_localName(node).toLowerCase()) { 
     3582                                        case 'content': 
     3583                                                itm['file'] = _xmlAttribute(node, 'url'); 
     3584                                                if (_xmlAttribute(node, 'duration')) { 
     3585                                                        itm['duration'] = _strings.seconds(_xmlAttribute(node, 'duration')); 
     3586                                                } 
     3587                                                if (_xmlAttribute(node, 'start')) { 
     3588                                                        itm['start'] = _strings.seconds(_xmlAttribute(node, 'start')); 
     3589                                                } 
     3590                                                if (_numChildren(node) > 0) { 
     3591                                                        itm = mediaparser.parseGroup(node, itm); 
     3592                                                } 
     3593                                                if (_xmlAttribute(node, 'width') 
     3594                                                                || _xmlAttribute(node, 'bitrate') 
     3595                                                                || _xmlAttribute(node, 'url')) { 
     3596                                                        if (!itm.levels) { 
     3597                                                                itm.levels = []; 
     3598                                                        } 
     3599                                                        itm.levels.push({ 
     3600                                                                width: _xmlAttribute(node, 'width'), 
     3601                                                                bitrate: _xmlAttribute(node, 'bitrate'), 
     3602                                                                file: _xmlAttribute(node, 'url') 
     3603                                                        }); 
     3604                                                } 
     3605                                                break; 
     3606                                        case 'title': 
     3607                                                itm['title'] = _textContent(node); 
     3608                                                break; 
     3609                                        case 'description': 
     3610                                                itm['description'] = _textContent(node); 
     3611                                                break; 
     3612                                        case 'keywords': 
     3613                                                itm['tags'] = _textContent(node); 
     3614                                                break; 
     3615                                        case 'thumbnail': 
     3616                                                itm['image'] = _xmlAttribute(node, 'url'); 
     3617                                                break; 
     3618                                        case 'credit': 
     3619                                                itm['author'] = _textContent(node); 
     3620                                                break; 
     3621                                        case 'player': 
     3622                                                var url = node.url; 
     3623                                                break; 
     3624                                        case 'group': 
     3625                                                mediaparser.parseGroup(node, itm); 
     3626                                                break; 
     3627                                } 
     3628                        } 
     3629                } 
     3630                return itm; 
     3631        } 
     3632         
     3633})(jwplayer.html5.parsers); 
     3634/** 
     3635 * Parse an RSS feed and translate it to a playlist. 
     3636 * 
     3637 * @author zach 
     3638 * @modified pablo 
     3639 * @version 6.0 
     3640 */ 
     3641(function(parsers) { 
     3642        var _utils = jwplayer.utils, 
     3643                _textContent = parsers.textContent, 
     3644                _getChildNode = parsers.getChildNode, 
     3645                _numChildren = parsers.numChildren, 
     3646                _localName = parsers.localName; 
     3647         
     3648        parsers.rssparser = {}; 
     3649         
     3650         
     3651        /** 
     3652         * Parse an RSS playlist for feed items. 
     3653         * 
     3654         * @param {XML} dat 
     3655         * @reuturn {Array} playlistarray 
     3656         */ 
     3657        parsers.rssparser.parse = function(dat) { 
     3658                var arr = []; 
     3659                for (var i = 0; i < _numChildren(dat); i++) { 
     3660                        var node = _getChildNode(dat, i), 
     3661                                localName = _localName(node).toLowerCase(); 
     3662                        if (localName == 'channel') { 
     3663                                for (var j = 0; j < _numChildren(node); j++) { 
     3664                                        var subNode = _getChildNode(node, j); 
     3665                                        if (_localName(subNode).toLowerCase() == 'item') { 
     3666                                                arr.push(_parseItem(subNode)); 
     3667                                        } 
     3668                                } 
     3669                        } 
     3670                } 
     3671                return arr; 
     3672        }; 
     3673                 
     3674                 
     3675        /**  
     3676         * Translate RSS item to playlist item. 
     3677         * 
     3678         * @param {XML} obj 
     3679         * @return {PlaylistItem} PlaylistItem 
     3680         */ 
     3681        function _parseItem(obj) { 
     3682                var itm = {}; 
     3683                for (var i = 0; i < obj.childNodes.length; i++) { 
     3684                        var node = obj.childNodes[i]; 
     3685                        var localName = _localName(node); 
     3686                        if (!localName){ 
     3687                                continue; 
     3688                        } 
     3689                        switch (localName.toLowerCase()) { 
     3690                                case 'enclosure': 
     3691                                        itm['file'] = _utils.strings.xmlAttribute(node, 'url'); 
     3692                                        break; 
     3693                                case 'title': 
     3694                                        itm['title'] = _textContent(node); 
     3695                                        break; 
     3696                                case 'pubdate': 
     3697                                        itm['date'] = _textContent(node); 
     3698                                        break; 
     3699                                case 'description': 
     3700                                        itm['description'] = _textContent(node); 
     3701                                        break; 
     3702                                case 'link': 
     3703                                        itm['link'] = _textContent(node); 
     3704                                        break; 
     3705                                case 'category': 
     3706                                        if (itm['tags']) { 
     3707                                                itm['tags'] += _textContent(node); 
     3708                                        } else { 
     3709                                                itm['tags'] = _textContent(node); 
     3710                                        } 
     3711                                        break; 
     3712                        } 
     3713                } 
     3714                itm = parsers.mediaparser.parseGroup(obj, itm); 
     3715                itm = parsers.jwparser.parseEntry(obj, itm); 
     3716 
     3717                return new jwplayer.html5.playlistitem(itm); 
     3718        } 
     3719 
     3720 
     3721         
     3722         
     3723})(jwplayer.html5.parsers); 
     3724/** 
    24723725 * JW Player Source Endcap 
    24733726 *  
  • branches/jw6/build/build.xml

    r2173 r2177  
    1414                        <fileset dir="${basedir}/src/js/html5" includes="jwplayer.html5.js" /> 
    1515                        <fileset dir="${basedir}/src/js/html5" includes="jwplayer.html5*.js" excludes="jwplayer.html5.js" /> 
    16                         <fileset dir="${basedir}/src/js/html5/utils" includes="jwplayer.html5.utils.js" /> 
    17                         <fileset dir="${basedir}/src/js/html5/utils" includes="jwplayer.html5.utils.*.js" excludes="" /> 
     16                        <fileset dir="${basedir}/src/js/html5/parsers" includes="jwplayer.html5.parsers.js" /> 
     17                        <fileset dir="${basedir}/src/js/html5/parsers" includes="jwplayer.html5.parsers*.js" excludes="jwplayer.html5.parsers.js" /> 
    1818                        <fileset dir="${basedir}/src/js" includes="jwplayer.sourceend.js" /> 
    1919                </concat> 
  • branches/jw6/jwplayer.min.js

    r2175 r2177  
    1 if(typeof jwplayer=="undefined"){jwplayer=function(a){if(jwplayer.api){return jwplayer.api.selectPlayer(a)}};var $jw=jwplayer;jwplayer.version="6.0";jwplayer.vid=document.createElement("video");jwplayer.audio=document.createElement("audio");jwplayer.source=document.createElement("source");(function(c){var b=c.utils=function(){};b.exists=function(h){switch(typeof(h)){case"string":return(h.length>0);break;case"object":return(h!==null);case"undefined":return false}return true};var e;var d={};b.css=function(h,k){if(b.exists(h)){for(var i in k){try{if(typeof k[i]==="undefined"){continue}else{if(typeof k[i]=="number"&&!(i=="zIndex"||i=="opacity")){if(isNaN(k[i])){continue}if(i.match(/color/i)){k[i]="#"+b.strings.pad(k[i].toString(16),6)}else{k[i]=Math.ceil(k[i])+"px"}}}if(k[i]){h.style[i]=k[i]}}catch(j){}}}};b.appendStylesheet=function(h,j){if(!e){e=document.createElement("style");e.type="text/css";document.getElementsByTagName("head")[0].appendChild(e)}if(!d[h]){d[h]={}}for(var i in j){var k=g(i,j[i]);if(b.exists(d[h][i])&&!b.exists(k)){delete d[h][i]}else{d[h][i]=k}}f()};function g(h,i){if(typeof i==="undefined"){return undefined}if(typeof i=="number"){if(isNaN(i)){return undefined}switch(h){case"z-index":case"opacity":return i;break;default:if(h.match(/color/i)){return"#"+b.strings.pad(i.toString(16),6)}else{return Math.ceil(i)+"px"}break}}else{return i}}function f(){if(e){var h="";for(var k in d){var j=d[k];h+=k+"{\n";for(var i in j){h+="  "+i+": "+j[i]+";\n"}h+="}\n"}e.innerHTML=h}}b.clearCss=function(h){for(var i in d){if(i.indexOf(h)>=0){delete d[i]}}f()};b.getAbsolutePath=function(o,n){if(!b.exists(n)){n=document.location.href}if(!b.exists(o)){return undefined}if(a(o)){return o}var p=n.substring(0,n.indexOf("://")+3);var m=n.substring(p.length,n.indexOf("/",p.length+1));var j;if(o.indexOf("/")===0){j=o.split("/")}else{var k=n.split("?")[0];k=k.substring(p.length+m.length+1,k.lastIndexOf("/"));j=k.split("/").concat(o.split("/"))}var h=[];for(var l=0;l<j.length;l++){if(!j[l]||!b.exists(j[l])||j[l]=="."){continue}else{if(j[l]==".."){h.pop()}else{h.push(j[l])}}}return p+m+"/"+h.join("/")};function a(i){if(!b.exists(i)){return}var j=i.indexOf("://");var h=i.indexOf("?");return(j>0&&(h<0||(h>j)))}b.extend=function(){var h=b.extend["arguments"];if(h.length>1){for(var k=1;k<h.length;k++){for(var j in h[k]){h[0][j]=h[k][j]}}return h[0]}return null};b.parseDimension=function(h){if(typeof h=="string"){if(h===""){return 0}else{if(h.lastIndexOf("%")>-1){return h}else{return parseInt(h.replace("px",""),10)}}}return h};b.timeFormat=function(h){if(h>0){str=Math.floor(h/60)<10?"0"+Math.floor(h/60)+":":Math.floor(h/60)+":";str+=Math.floor(h%60)<10?"0"+Math.floor(h%60):Math.floor(h%60);return str}else{return"00:00"}};b.log=function(i,h){if(typeof console!="undefined"&&typeof console.log!="undefined"){if(h){console.log(i,h)}else{console.log(i)}}};b.getBoundingClientRect=function(h){if(typeof h.getBoundingClientRect=="function"){return h.getBoundingClientRect()}else{return{left:h.offsetLeft+document.body.scrollLeft,top:h.offsetTop+document.body.scrollTop,width:h.offsetWidth,height:h.offsetHeight}}};b.userAgentMatch=function(i){var h=navigator.userAgent.toLowerCase();return(h.match(i)!==null)};b.isMobile=function(){return b.userAgentMatch(/(iP(hone|ad|od))|android/i)}})(jwplayer);(function(a){a.ajax=function(f,e,b){var d;if(window.XMLHttpRequest){d=new XMLHttpRequest()}else{d=new ActiveXObject("Microsoft.XMLHTTP")}d.onreadystatechange=function(){if(d.readyState===4){if(d.status===200){if(e){if(!a.exists(d.responseXML)){try{if(window.DOMParser){var g=(new DOMParser()).parseFromString(d.responseText,"text/xml");if(g){d=a.extend({},d,{responseXML:g})}}else{g=new ActiveXObject("Microsoft.XMLDOM");g.async="false";g.loadXML(d.responseText);d=a.extend({},d,{responseXML:g})}}catch(h){if(b){b(f)}}}e(d)}}else{if(b){b(f)}}}};try{d.open("GET",f,true);d.send(null)}catch(c){if(b){b(f)}}return d}})(jwplayer.utils);(function(b){var a=b.strings=function(){};a.trim=function(c){return c.replace(/^\s*/,"").replace(/\s*$/,"")};a.pad=function(d,e,c){if(!c){c="0"}while(d.length<e){d=c+d}return d};a.serialize=function(c){if(c==null){return null}else{if(c=="true"){return true}else{if(c=="false"){return false}else{if(isNaN(Number(c))||c.length>5||c.length==0){return c}else{return Number(c)}}}}};a.seconds=function(e){e=e.replace(",",".");var c=e.split(":");var d=0;if(e.substr(-1)=="s"){d=Number(e.substr(0,e.length-1))}else{if(e.substr(-1)=="m"){d=Number(e.substr(0,e.length-1))*60}else{if(e.substr(-1)=="h"){d=Number(e.substr(0,e.length-1))*3600}else{if(c.length>1){d=Number(c[c.length-1]);d+=Number(c[c.length-2])*60;if(c.length==3){d+=Number(c[c.length-3])*3600}}else{d=Number(e)}}}}return d};a.xmlAttribute=function(c,d){for(var e=0;e<c.attributes.length;e++){if(c.attributes[e].name&&c.attributes[e].name.toLowerCase()==d.toLowerCase()){return c.attributes[e].value.toString()}}return""};a.jsonToString=function(g){var i=i||{};if(i&&i.stringify){return i.stringify(g)}var d=typeof(g);if(d!="object"||g===null){if(d=="string"){g='"'+g.replace(/"/g,'\\"')+'"'}else{return String(g)}}else{var h=[],c=(g&&g.constructor==Array);for(var e in g){var f=g[e];switch(typeof(f)){case"string":f='"'+f.replace(/"/g,'\\"')+'"';break;case"object":if(b.exists(f)){f=a.jsonToString(f)}break}if(c){if(typeof(f)!="function"){h.push(String(f))}}else{if(typeof(f)!="function"){h.push('"'+e+'":'+String(f))}}}if(c){return"["+String(h)+"]"}else{return"{"+String(h)+"}"}}}})(jwplayer.utils);(function(b){var d=new RegExp(/^(#|0x)[0-9a-fA-F]{3,6}/);b.typechecker=function(g,f){f=!b.exists(f)?c(g):f;return e(g,f)};function c(f){var g=["true","false","t","f"];if(g.toString().indexOf(f.toLowerCase().replace(" ",""))>=0){return"boolean"}else{if(d.test(f)){return"color"}else{if(!isNaN(parseInt(f,10))&&parseInt(f,10).toString().length==f.length){return"integer"}else{if(!isNaN(parseFloat(f))&&parseFloat(f).toString().length==f.length){return"float"}}}}return"string"}function e(g,f){if(!b.exists(f)){return g}switch(f){case"color":if(g.length>0){return a(g)}return null;case"integer":return parseInt(g,10);case"float":return parseFloat(g);case"boolean":if(g.toLowerCase()=="true"){return true}else{if(g=="1"){return true}}return false}return g}function a(f){f=f.replace(/(#|0x)?([0-9A-F]{3,6})$/gi,"$2");if(f.length==3){f=f.charAt(0)+f.charAt(0)+f.charAt(1)+f.charAt(1)+f.charAt(2)+f.charAt(2)}return parseInt(f,16)}})(jwplayer.utils);(function(a){a.events={COMPLETE:"COMPLETE",ERROR:"ERROR",API_READY:"jwplayerAPIReady",JWPLAYER_READY:"jwplayerReady",JWPLAYER_FULLSCREEN:"jwplayerFullscreen",JWPLAYER_RESIZE:"jwplayerResize",JWPLAYER_ERROR:"jwplayerError",JWPLAYER_MEDIA_BEFOREPLAY:"jwplayerMediaBeforePlay",JWPLAYER_MEDIA_BEFORECOMPLETE:"jwplayerMediaBeforeComplete",JWPLAYER_COMPONENT_SHOW:"jwplayerComponentShow",JWPLAYER_COMPONENT_HIDE:"jwplayerComponentHide",JWPLAYER_MEDIA_BUFFER:"jwplayerMediaBuffer",JWPLAYER_MEDIA_BUFFER_FULL:"jwplayerMediaBufferFull",JWPLAYER_MEDIA_ERROR:"jwplayerMediaError",JWPLAYER_MEDIA_LOADED:"jwplayerMediaLoaded",JWPLAYER_MEDIA_COMPLETE:"jwplayerMediaComplete",JWPLAYER_MEDIA_SEEK:"jwplayerMediaSeek",JWPLAYER_MEDIA_TIME:"jwplayerMediaTime",JWPLAYER_MEDIA_VOLUME:"jwplayerMediaVolume",JWPLAYER_MEDIA_META:"jwplayerMediaMeta",JWPLAYER_MEDIA_MUTE:"jwplayerMediaMute",JWPLAYER_PLAYER_STATE:"jwplayerPlayerState",state:{BUFFERING:"BUFFERING",IDLE:"IDLE",PAUSED:"PAUSED",PLAYING:"PLAYING",COMPLETED:"COMPLETED"},JWPLAYER_PLAYLIST_LOADED:"jwplayerPlaylistLoaded",JWPLAYER_PLAYLIST_ITEM:"jwplayerPlaylistItem",JWPLAYER_INSTREAM_CLICK:"jwplayerInstreamClicked",JWPLAYER_INSTREAM_DESTROYED:"jwplayerInstreamDestroyed"}})(jwplayer);(function(events){var _utils=jwplayer.utils;events.eventdispatcher=function(id,debug){var _id=id,_debug=debug,_listeners,_globallisteners;this.resetEventListeners=function(){_listeners={};_globallisteners=[]};this.resetEventListeners();this.addEventListener=function(type,listener,count){try{if(!_utils.exists(_listeners[type])){_listeners[type]=[]}if(typeof(listener)=="string"){eval("listener = "+listener)}_listeners[type].push({listener:listener,count:count})}catch(err){_utils.log("error",err)}return false};this.removeEventListener=function(type,listener){if(!_listeners[type]){return}try{for(var listenerIndex=0;listenerIndex<_listeners[type].length;listenerIndex++){if(_listeners[type][listenerIndex].listener.toString()==listener.toString()){_listeners[type].splice(listenerIndex,1);break}}}catch(err){_utils.log("error",err)}return false};this.addGlobalListener=function(listener,count){try{if(typeof(listener)=="string"){eval("listener = "+listener)}_globallisteners.push({listener:listener,count:count})}catch(err){_utils.log("error",err)}return false};this.removeGlobalListener=function(listener){if(!listener){return}try{for(var globalListenerIndex=0;globalListenerIndex<_globallisteners.length;globalListenerIndex++){if(_globallisteners[globalListenerIndex].listener.toString()==listener.toString()){_globallisteners.splice(globalListenerIndex,1);break}}}catch(err){_utils.log("error",err)}return false};this.sendEvent=function(type,data){if(!_utils.exists(data)){data={}}_utils.extend(data,{id:_id,version:jwplayer.version,type:type});if(_debug){_utils.log(type,data)}if(typeof _listeners[type]!="undefined"){for(var listenerIndex=0;listenerIndex<_listeners[type].length;listenerIndex++){try{_listeners[type][listenerIndex].listener(data)}catch(err){_utils.log("There was an error while handling a listener: "+err.toString(),_listeners[type][listenerIndex].listener)}if(_listeners[type][listenerIndex]){if(_listeners[type][listenerIndex].count===1){delete _listeners[type][listenerIndex]}else{if(_listeners[type][listenerIndex].count>0){_listeners[type][listenerIndex].count=_listeners[type][listenerIndex].count-1}}}}}var globalListenerIndex;for(globalListenerIndex=0;globalListenerIndex<_globallisteners.length;globalListenerIndex++){try{_globallisteners[globalListenerIndex].listener(data)}catch(err){_utils.log("There was an error while handling a listener: "+err.toString(),_globallisteners[globalListenerIndex].listener)}if(_globallisteners[globalListenerIndex]){if(_globallisteners[globalListenerIndex].count===1){delete _globallisteners[globalListenerIndex]}else{if(_globallisteners[globalListenerIndex].count>0){_globallisteners[globalListenerIndex].count=_globallisteners[globalListenerIndex].count-1}}}}}}})(jwplayer.events);(function(a){a.html5={}})(jwplayer);(function(l){var t=l.html5,h=l.utils,i=l.events,o=l.events.state,g=h.appendStylesheet,b="button",n="text",d="divider",p="slider",e="relative",f="absolute",a="none",m="block",r="inline",k="inline-block",c="left",u="right",j="100%",q="width .25s linear, left .25s linear, opacity .25s, background .25s";CB_CLASS=".jwcontrolbar";t.controlbar=function(B,an){var z,Q,A={backgroundcolor:"",margin:10,font:"Arial,sans-serif",fontsize:10,fontcolor:parseInt("000000",16),fontstyle:"normal",fontweight:"bold",buttoncolor:parseInt("ffffff",16),position:"OVER",idlehide:false,hideplaylistcontrols:false,forcenextprev:false,layout:{left:{position:"left",elements:[{name:"play",type:b},{name:"divider",type:d},{name:"prev",type:b},{name:"divider",type:d},{name:"next",type:b},{name:"divider",type:d},{name:"elapsed",type:n}]},center:{position:"center",elements:[{name:"time",type:p}]},right:{position:"right",elements:[{name:"duration",type:n},{name:"blank",type:b},{name:"divider",type:d},{name:"mute",type:b},{name:"volume",type:p},{name:"divider",type:d},{name:"fullscreen",type:b}]}}},P,aw,ah,au,ak,aE,J,U={play:"pause",mute:"unmute",fullscreen:"normalscreen"},av={play:false,mute:false,fullscreen:false},y={play:Z,mute:K,fullscreen:W,next:x,prev:ac},C={time:T,volume:az};function ay(){ah={};z=B;an=h.extend({},an);ak=z.id+"_controlbar";aE=0;au=L();au.id=ak;au.className="jwcontrolbar";window.addEventListener("mousemove",aD,false);window.addEventListener("mouseup",aD,false);Q=z.skin;P=h.extend({},A,Q.controlbar.settings,z.settings.controlbar);aw=(Q.controlbar.layout.left||Q.controlbar.layout.right||Q.controlbar.layout.center)?Q.controlbar.layout:A.layout;S();ap();v()}function v(){z.jwAddEventListener(l.events.JWPLAYER_MEDIA_TIME,aF);z.jwAddEventListener(l.events.JWPLAYER_PLAYER_STATE,F);z.jwAddEventListener(l.events.JWPLAYER_MEDIA_MUTE,aA);z.jwAddEventListener(l.events.JWPLAYER_MEDIA_VOLUME,D);z.jwAddEventListener(l.events.JWPLAYER_MEDIA_BUFFER,H);z.jwAddEventListener(l.events.JWPLAYER_FULLSCREEN,E)}function aF(aG){aE=aG.duration;if(ah.elapsed){ah.elapsed.innerHTML=h.timeFormat(aG.position)}if(ah.duration){ah.duration.innerHTML=h.timeFormat(aG.duration)}if(aG.duration>0){at(aG.position/aG.duration)}else{at(0)}}function F(aG){switch(aG.newstate){case l.events.state.PLAYING:case l.events.state.BUFFERING:if(ah.timeSliderThumb){ah.timeSliderThumb.style.opacity=1}if(ah.timeRail){ah.timeRail.className="jwrail jwsmooth"}O("play",true);break;case l.events.state.PAUSED:if(!ae){O("play",false)}break;case l.events.state.IDLE:case l.events.state.COMPLETED:O("play",false);if(ah.timeSliderThumb){ah.timeSliderThumb.style.opacity=0}ax(0);aF({position:0,duration:0});if(ah.timeRail){ah.timeRail.className="jwrail"}break}}function aA(aG){O("mute",aG.mute);w(aG.mute?0:J)}function D(aG){J=aG.volume/100;w(J)}function H(aG){ax(aG.bufferPercent/100)}function E(aG){O("fullscreen",aG.fullscreen)}function S(){h.clearCss("#"+ak);g("#"+ak,{height:Y("background").height,bottom:P.position=="OVER"?P.margin:0,left:P.position=="OVER"?P.margin:0,right:P.position=="OVER"?P.margin:0});g(ao(".jwtext"),{font:P.fontsize+"px/"+Y("background").height+"px "+P.font,color:P.fontcolor,"font-weight":P.fontweight,"font-style":P.fontstyle,"text-align":"center",padding:"0 5px"})}function ao(aG){return"#"+ak+" "+aG}function L(){return document.createElement("span")}function ap(){var aI=ai("capLeft");var aH=ai("capRight");var aG=ai("background",{position:f,left:Y("capLeft").width,right:Y("capRight").width,"background-repeat":"repeat-x"},true);au.style.opacity=0;if(aG){au.appendChild(aG)}if(aI){au.appendChild(aI)}aq();if(aH){au.appendChild(aH)}setTimeout(function(){ad();au.style.opacity=1},1000)}function M(aG){switch(aG.type){case d:return ab(aG);break;case n:return aj(aG.name);break;case b:if(aG.name!="blank"){return aa(aG.name)}break;case p:return N(aG.name);break}}function ai(aI,aL,aH,aN){var aK=L();aK.className="jw"+aI;var aG=aN?" left center":" center";var aJ=Y(aI);aK.innerHTML="&nbsp;";if(!aJ||aJ.src==""){return}var aM;if(aH){aM={background:"url('"+aJ.src+"') repeat-x "+aG}}else{aM={background:"url('"+aJ.src+"') no-repeat"+aG,width:aJ.width}}g(ao(".jw"+aI),h.extend(aM,aL));ah[aI]=aK;return aK}function aa(aI){if(!Y(aI+"Button").src){return null}var aJ=document.createElement("button");aJ.className="jw"+aI;aJ.addEventListener("click",af(aI),false);var aK=Y(aI+"Button");var aH=Y(aI+"ButtonOver");aJ.innerHTML="&nbsp;";R(ao(".jw"+aI),aK,aH);var aG=U[aI];if(aG){R(ao(".jw"+aI+".jwtoggle"),Y(aG+"Button"),Y(aG+"ButtonOver"))}ah[aI]=aJ;return aJ}function R(aG,aH,aI){if(!aH.src){return}g(aG,{width:aH.width,background:"url("+aH.src+") center no-repeat"});if(aI.src){g(aG+":hover",{background:"url("+aI.src+") center no-repeat"})}}function af(aG){return function(){if(y[aG]){y[aG]()}}}function Z(){if(av.play){z.jwPause()}else{z.jwPlay()}}function K(){z.jwSetMute();aA({mute:av.mute})}function az(aG){if(aG<0.1){aG=0}if(aG>0.9){aG=1}z.jwSetVolume(aG*100);w(aG)}function T(aG){if(!ae){z.jwPlay()}z.jwSeek(aG*aE)}function W(){z.jwSetFullscreen()}function x(){z.jwPlaylistNext()}function ac(){z.jwPlaylistNext()}function O(aG,aH){if(!h.exists(aH)){aH=!av[aG]}if(ah[aG]){ah[aG].className="jw"+aG+(aH?" jwtoggle":"")}av[aG]=aH}function I(aG){return ak+"_"+aG}function aj(aG,aK){var aI=L();aI.id=I(aG);aI.className="jwtext jw"+aG;var aH={};var aJ=Y(aG+"Background");if(aJ.src){aH.background="url("+aJ.src+") no-repeat center";aH["background-size"]="100% "+Y("background").height+"px"}g(ao(".jw"+aG),aH);aI.innerHTML="00:00";ah[aG]=aI;return aI}function ab(aH){if(aH.width){var aG=L();aG.className="jwblankDivider";g(aG,{width:parseInt(aH.width)});return aG}else{if(aH.element){return ai(aH.element)}else{return ai(aH.name)}}}function N(aG){var aJ=L();aJ.className="jwslider jw"+aG;var aI=ai(aG+"SliderCapLeft");var aH=ai(aG+"SliderCapRight");if(aH){aH.className+=" jwcapRight"}var aK=al(aG);if(aI){aJ.appendChild(aI)}aJ.appendChild(aK);if(aI){aJ.appendChild(aH)}g(ao(".jw"+aG+" .jwrail"),{left:Y(aG+"SliderCapLeft").width,right:Y(aG+"SliderCapRight").width,});ah[aG]=aJ;if(aG=="time"){aC(aJ);at(0);ax(0)}else{if(aG=="volume"){ar(aJ)}}return aJ}function al(aI){var aL=L();aL.className="jwrail jwsmooth";var aG=["Rail","Buffer","Progress"];for(var aK=0;aK<aG.length;aK++){var aJ=ai(aI+"Slider"+aG[aK],null,true,(aI=="volume"));if(aJ){aJ.className+=" jwstretch";aL.appendChild(aJ)}}var aH=ai(aI+"SliderThumb");if(aH){aH.className+=" jwthumb";aH.style.opacity=0;aL.appendChild(aH)}aL.addEventListener("mousedown",G(aI),false);ah[aI+"Rail"]=aL;return aL}var ae;function G(aG){return(function(aH){if(aH.button!=0){return}ah[aG+"Rail"].className="jwrail";if(aG=="time"){if(z.jwGetState()!=l.events.state.IDLE){ae=aG}}else{ae=aG}})}var am=0;function aD(aG){if(!ae||aG.button!=0){return}var aK=ah[ae].getElementsByClassName("jwrail")[0],aL=h.getBoundingClientRect(aK),aJ=(aG.clientX-aL.left)/aL.width;if(aG.type=="mouseup"){var aH=ae;ah[aH+"Rail"].className="jwrail jwsmooth";ae=null;C[aH](aJ)}else{if(ae=="time"){at(aJ)}else{w(aJ)}var aI=(new Date()).getTime();if(aI-am>500){z.jwPause();am=aI;C[ae](aJ)}}}function aC(aG){if(ah.timeSliderThumb){g(ao(".jwtimeSliderThumb"),{"margin-left":(Y("timeSliderThumb").width/-2)})}ax(0);at(0)}function ar(aI){var aH=Y("volumeSliderCapLeft").width,aG=Y("volumeSliderCapRight").width,aJ=Y("volumeSliderRail").width;g(ao(".jwvolume"),{width:(aH+aJ+aG)})}var V={};function aq(){aB("left");aB("center");aB("right");au.appendChild(V.left);au.appendChild(V.center);au.appendChild(V.right);g(ao(".jwright"),{right:Y("capRight").width})}function aB(aH){var aG=L();aG.className="jwgroup jw"+aH;V[aH]=aG;if(aw[aH]){X(aw[aH],V[aH])}}function X(aJ,aG){if(aJ&&aJ.elements.length>0){for(var aI=0;aI<aJ.elements.length;aI++){var aH=M(aJ.elements[aI]);if(aH){aG.appendChild(aH)}}}}var ad=this.resize=function(aH,aG){g(ao(".jwgroup.jwcenter"),{left:Math.round(h.parseDimension(V.left.offsetWidth)+Y("capLeft").width),right:Math.round(h.parseDimension(V.right.offsetWidth)+Y("capRight").width)})};this.getDisplayElement=function(){return au};function ax(aG){aG=Math.min(Math.max(0,aG),1);ah.timeSliderBuffer.style.width=aG*100+"%"}function ag(aI,aK,aL){if(!ah[aI]){return}aK=Math.min(Math.max(0,aK),1);var aH=ah[aI+"SliderProgress"];var aG=ah[aI+"SliderThumb"];var aJ=100*aK+"%";if(aH){aH.style.width=aJ}if(aG){aG.style.left=aJ}}function w(aG){ag("volume",aG,true)}function at(aG){ag("time",aG)}function Y(aG){if(Q.controlbar.elements[aG]){return Q.controlbar.elements[aG]}else{return{width:0,height:0,src:"",image:undefined,ready:false}}}ay()};function s(){g(CB_CLASS,{position:f,overflow:"hidden","-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" span",{height:j,"-webkit-user-select":a,"-webkit-user-drag":a,"user-select":a,"user-drag":a});g(CB_CLASS+" .jwgroup",{display:r});g(CB_CLASS+" span, "+CB_CLASS+" .jwgroup button,"+CB_CLASS+" .jwleft",{position:e,"float":c});g(CB_CLASS+" .jwright",{position:f});g(CB_CLASS+" .jwcenter",{position:f});g(CB_CLASS+" button",{display:k,height:j,border:a,cursor:"pointer","-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" .jwcapRight",{right:0,position:f});g(CB_CLASS+" .jwtime,"+CB_CLASS+" .jwgroup span.jwstretch",{position:f,height:j,width:j,left:0});g(CB_CLASS+" .jwrail,"+CB_CLASS+" .jwthumb",{position:f,height:j,cursor:"pointer"});g(CB_CLASS+" .jwtime .jwsmooth span",{"-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" .jwdivider+.jwdivider",{display:a});g(CB_CLASS+" .jwtext",{padding:"0 5px","text-align":"center"})}s()})(jwplayer);(function(a){var e=jwplayer,c=e.utils,d=e.events,b=d.state;a.controller=function(i){var m=i,g=i.getVideo(),h=new d.eventdispatcher(m.id);c.extend(this,h);function l(){m.addGlobalListener(f);m.addEventListener(d.JWPLAYER_MEDIA_BUFFER_FULL,k)}function f(n){h.sendEvent(n.type,n)}function k(n){g.play()}var j;this.load=function(n){if(g.getTag().canPlayType("video/mp4")){j="http://playertest.longtailvideo.com/bunny.mp4"}else{if(g.getTag().canPlayType("video/webm")){j="http://playertest.longtailvideo.com/bunny.webm"}else{j="http://playertest.longtailvideo.com/bunny.ogv"}}if(c.isMobile()){g.load(j)}};this.play=function(){if(m.state==b.IDLE){g.load(j)}else{if(m.state==b.PAUSED){g.play()}}};this.stop=function(){g.stop()};this.pause=function(){if(m.state==b.PLAYING||m.state==b.BUFFERING){g.pause()}};this.seek=function(n){g.seek(n)};this.volume=function(n){g.volume(n)};this.mute=function(n){if(!c.exists(n)){n=!m.mute}g.mute(n)};this.prev=function(){};this.next=function(){};this.item=function(n){};l()}})(jwplayer.html5);(function(a){a.html5.defaultskin=function(){this.text='<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.1"><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/><setting name="fontcolor" value="0x000000"/></settings><layout><group position="left"><button name="play"/><divider name="divider"/><button name="prev"/><divider name="divider"/><button name="next"/><divider name="divider"/><text name="elapsed"/></group><group position="center"><slider name="time"/></group><group position="right"><text name="duration"/><divider name="divider"/><button name="blank"/><divider name="divider"/><button name="mute"/><slider name="volume"/><divider name="divider"/><button name="fullscreen"/></group></layout><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUOI3t1LERACAMQlFgGvcfxNIhHMK4gsUvUviOmgtNsiAZkBSEKxKEnCYkkQrJn/YwbUNiSDDYRZaQRDaShv+oX9GBZEIuK+8hXVLs+/YAAAAASUVORK5CYII="/><element name="blankButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAYCAYAAAAyJzegAAAAFElEQVQYV2P8//8/AzpgHBUc7oIAGZdH0RjKN8EAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAYAAAA7zJfaAAAAQElEQVQIWz3LsRGAMADDQJ0XB5bMINABZ9GENGrszxhjT2WLSqxEJG2JQrTMdV2q5LpOAvyRaVmsi7WdeZ/7+AAaOTq7BVrfOQAAAABJRU5ErkJggg=="/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAYAAAA7zJfaAAAAQElEQVQIWz3LsRGAMADDQJ0XB5bMINABZ9GENGrszxhjT2WLSqxEJG2JQrTMdV2q5LpOAvyRaVmsi7WdeZ/7+AAaOTq7BVrfOQAAAABJRU5ErkJggg=="/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUCB0FwcENgEAAw7Aq+893g8APUILNOQcbFRktVGqUVFRkWNz3xTa2sUaLNUosKlRUvvf5AdbWOTtzmzyWAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAANUlEQVR42u2RsQkAAAjD/NTTPaW6dXLrINJA1kBpGPMAjDWmOgp1HFQXx+b1KOefO4oxY57R73YnVYCQUCQAAAAASUVORK5CYII="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAIUlEQVQ4jWNgGAWjYOiD/0gYG3/U0FFDB4Oho2AUDAYAAEwiL9HrpdMVAAAAAElFTkSuQmCC"/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAQklEQVQ4y2NgGAWjYOiD/1AMA/JAfB5NjCJD/YH4PRaLyDa0H4lNNUP/DxlD59PCUBCIp3ZEwYA+NZLUKBgFgwEAAN+HLX9sB8u8AAAAAElFTkSuQmCC"/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAQElEQVQ4y2NgGAWjYOiD/0B8Hojl0cT+U2ooCL8HYn9qGwrD/bQw9P+QMXQ+tSMqnpoRBUpS+tRMUqNgFAwGAADxZy1/mHvFnAAAAABJRU5ErkJggg=="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAOElEQVRIDe3BwQkAIRADwAhhw/nU/kWwUK+KPITMABFh19Y+F0acY8CJvX9wYpXgRElwolSIiMf9ZWEDhtwurFsAAAAASUVORK5CYII="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAN0lEQVRIDe3BwQkAMQwDMBcc55mRe9zi7RR+FCwBEWG39vcfGHFm4MTuhhMlwYlVBSdKhYh43AW/LQMKm1spzwAAAABJRU5ErkJggg=="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAIElEQVRIiWNgGAWjYBTQBfynMR61YCRYMApGwSigMQAAiVWPcbq6UkIAAAAASUVORK5CYII="/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAYCAYAAAA/OUfnAAAAO0lEQVQYlWP4//8/Awwz0JgDBP/BeN6Cxf/hnI2btiI4u/fsQ3AOHjqK4Jw4eQbBOX/hEoKDYjSd/AMA4cS4mfLsorgAAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAJklEQVQ4y2NgGAUjDcwH4v/kaPxPikZkxcNVI9mBQ5XoGAWDFwAAsKAXKQQmfbUAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAMklEQVQ4y2NgGAWDHPyntub5xBr6Hwv/Pzk2/yfVG/8psRFE25Oq8T+tQnsIaB4FVAcAi2YVysVY52AAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAACVBMVEUAAACmpqampqbBXAu8AAAAAnRSTlMAgJsrThgAAAArSURBVAhbY2AgErBAyA4I2QEhOyBkB4TsYOhAoaCCUCUwDTDtMMNgRuMHAFB5FoGH5T0UAAAAAElFTkSuQmCC"/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAACVBMVEUAAAAAAAAAAACDY+nAAAAAAnRSTlMAgJsrThgAAAArSURBVAhbY2AgErBAyA4I2QEhOyBkB4TsYOhAoaCCUCUwDTDtMMNgRuMHAFB5FoGH5T0UAAAAAElFTkSuQmCC"/><element name="volumeSliderCapRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAYCAYAAAAyJzegAAAAFElEQVQYV2P8//8/AzpgHBUc7oIAGZdH0RjKN8EAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQklEQVRIiWNgGAWjYMiD/0iYFDmSLbDHImdPLQtgBpEiR7Zl2NijAA5oEkT/0Whi5UiyAJ8BVMsHNMtoo2AUDAIAAGdcIN3IDNXoAAAAAElFTkSuQmCC"/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAP0lEQVRIx2NgGAWjYMiD/1RSQ5QB/wmIUWzJfzx8qhj+n4DYCAY0DyJ7PBbYU8sHMEvwiZFtODXUjIJRMJgBACpWIN2ZxdPTAAAAAElFTkSuQmCC"/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAQMAAAAk8RryAAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlOZpuml+rYAAAASSURBVBhXY2AYJuA/GBwY6jQAyDyoK8QcL4QAAAAASUVORK5CYII="/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAiUlEQVR42u3XSw2AMBREURwgAQlIQAISKgUpSEFKJeCg5b0E0kWBTVcD9ySTsL0Jn9IBAAAA+K2UUrBlW/Rr5ZDoIeeuoFkxJD9ss03aIXXQqB9SttoG7ZA6qNcOKdttiwcJh9RB+iFl4SshkRBuLR72+9cvH0SOKI2HRo7x/Fi1/uoCAAAAwLsD8ki99IlO2dQAAAAASUVORK5CYII="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAVUlEQVR42u3WMQrAIAxAUW/g/SdvGmvpoOBeSHgPsjj5QTANAACARCJilIhYM0tEvJM+Ik3Id9E957kQIb+F3OdCPC0hPkQriqWx9hp/x/QGAABQyAPLB22VGrpLDgAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAA/0lEQVR42u2U0QmEMBAF7cASLMESUoIlpARLSCkpwRJSgiWkhOvAXD4WsgRkyaG5DbyB+Yvg8KITAAAAAAAYk+u61mwk15EjPtlEfihmqIiZR1Qx80ghjgdUuiHXGHSVsoag0x6x8DUoyjD5KovmEJ9NTDMRPIT0mtdIUkjlonuNohO+Ha99DTmkuGgKCTcvebAzx82ZoCWC3/3aIMWSRucaxcjORSFY4xpFdjYJGp1rFGcyCYZ/RVh6AUnfcNZ2zih3/mGj1jVCdiNDwyrq1rA/xMdeEXvDVdnYc1vDc3uPkDObXrlaxbNHSOohQhr/WOeLEWfWTgAAAAAAADzNF9sHJ7PJ57MlAAAAAElFTkSuQmCC"/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACBklEQVR42u3Zv0sCYRzH8USTzOsHHEWGkC1HgaDgkktGDjUYtDQ01RDSljQ1BLU02+rk1NTm2NLq4Nx/0L/h9fnCd3j4cnZe1/U8xiO8h3uurufF0/3COd/3/0UWYiEWYiEWYiGJQ+J8xuPxKhXjEMZANinjIZhkGuVRNioE4wVURo4JkHm0xKWmhRAc1bh1EyCUw5BcBIjHiApKa4CErko6DEJwuRo6IRKzyJD8FJAyI3Zp2zRImiBcRhlfo5RtlxCcE3CcDNpGrhYIT2IhAJKilO0VRmzJ32fAMTpBTS0QMfGwlcuKMRftE0DJ0wCJdcOsCkBdXP3Mh9CEFUBTPS9mDZJBG6io4aqVzMdCokCw9H3kT6j/C/9iDdSeUMNC7DkyyxAs/Rk6Qss8FPWRZgdVtUH4DjxEn1zxh+/zj1wHlf4MQhNGrwqA6sY40U8JonRJwEQh+AO3AvCG6gHv4U7IY4krxkroWoAOkoQMGfCBrgIm+YBGqPENpIJ66CJg3x66Y0gnSUidAEEnNr9jjLiWMn5DiWP0OC/oAsCgkq43xBdGDMQr7YASP/vEkHvdl1+JOCcEV5sC4hGEOzTlPuKgd0b0xD4JkRcOgnRRTjdErkYhAsQVq6IdUuPJtmk7BCL3t/h88cx91pKQkI/pkDx6pmYTIjEoxiHsN1YWYiEWYiEWknhflZ5IErA5nr8AAAAASUVORK5CYII="/></elements></component><component name="dock"><settings><setting name="fontcolor" value="0xffffff"/></settings><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAQMAAAAk8RryAAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlOZpuml+rYAAAASSURBVBhXY2AYJuA/GBwY6jQAyDyoK8QcL4QAAAAASUVORK5CYII="/></elements></component><component name="playlist"><settings><setting name="backgroundcolor" value="0xe8e8e8"/></settings><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUaN7t2MENwCAMBEEe9N8wSKYC/D8YV7CyJoRkVtVImxkZPQInMxoP0XiIxkM0HsGbjjSNBx544IEHHnjggUe/6UQeey0PIh7XTftGxKPj4eXCtLsHHh+ZxkO0Iw8PR55Ni8ZD9Hu/EAoP0dc5RRg9qeRjVF8AAAAASUVORK5CYII="/><element name="sliderCapTop" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAHCAYAAADnCQYGAAAAFUlEQVQokWP8//8/A7UB46ihI9hQAKt6FPPXhVGHAAAAAElFTkSuQmCC"/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAKElEQVQ4y2P4//8/Az68bNmy/+iYkB6GUUNHDR01dNTQUUNHDaXcUABUDOKhcxnsSwAAAABJRU5ErkJggg=="/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAJUlEQVQ4T2P4//8/Ay4MBP9xYbz6Rg0dNXTU0FFDRw0dNZRyQwHH4NBa7GJsXAAAAABJRU5ErkJggg=="/><element name="sliderCapBottom" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAHCAYAAADnCQYGAAAAFUlEQVQokWP8//8/A7UB46ihI9hQAKt6FPPXhVGHAAAAAElFTkSuQmCC"/></elements></component></components></skin>';this.xml=null;if(window.DOMParser){parser=new DOMParser();this.xml=parser.parseFromString(this.text,"text/xml")}else{this.xml=new ActiveXObject("Microsoft.XMLDOM");this.xml.async="false";this.xml.loadXML(this.text)}return this}})(jwplayer);(function(a){var b=jwplayer.utils;a.model=function(d){var i=this,c,e;b.extend(i,new jwplayer.events.eventdispatcher());function g(j){return j}function f(){b.extend(i,{id:d.id,settings:g(d),volume:0,state:jwplayer.events.state.IDLE,mute:false});e=document.createElement("video");c=new a.video(e);c.addGlobalListener(h)}function h(j){switch(j.type){case jwplayer.events.JWPLAYER_MEDIA_MUTE:if(i.mute==j.mute){return}i.mute=j.mute;break;case jwplayer.events.JWPLAYER_MEDIA_VOLUME:if(i.volume==j.volume){return}i.volume=j.volume;break;case jwplayer.events.JWPLAYER_PLAYER_STATE:if(i.state==j.newstate){return}i.state=j.newstate}i.sendEvent(j.type,j)}this.getVideo=function(){return c};this.setFullscreen=function(j){if(j!=i.fullscreen){i.fullscreen=j;i.sendEvent(jwplayer.events.JWPLAYER_FULLSCREEN,{fullscreen:j})}};f()}})(jwplayer.html5);(function(a){a.player=function(b){var f,g,e,c=this;function d(){f=new a.model(b);c.id=f.id;c.settings=f.settings;e=new a.controller(f);e.load();(new a.skinloader(b.skin,function(h){c.skin=h;g=new a.view(c,f)},function(h){_utils.log(h)}))}this.jwPlay=function(){e.play()};this.jwPause=function(){e.pause()};this.jwStop=function(){e.stop()};this.jwSeek=function(h){e.seek(h)};this.jwSetVolume=function(h){e.volume(h)};this.jwSetMute=function(h){e.mute(h)};this.jwLoad=function(h){e.load(h)};this.jwPlaylistNext=function(){e.next()};this.jwPlaylistPrev=function(){e.prev()};this.jwPlaylistItem=function(h){e.item(h)};this.jwSetFullscreen=function(h){g.fullscreen(h)};this.jwGetState=function(){return f.state};this.jwGetVolume=function(){return f.volume};this.jwGetMute=function(){return f.mute};this.jwGetFullscreen=function(){return f.fullscreen};this.jwAddEventListener=function(i,h){e.addEventListener(i,h)};this.jwRemoveEventListener=function(i,h){e.removeEventListener(i,h)};d()}})(jwplayer.html5);(function(a){a.skin=function(){var b={};var c=false;this.load=function(d,e){new a.skinloader(d,function(f){c=true;b=f;e()},function(){new a.skinloader("",function(f){c=true;b=f;e()})})};this.getSkinElement=function(d,e){if(c){try{return b[d].elements[e]}catch(f){jwplayer.utils.log("No such skin component / element: ",[d,e])}}return null};this.getComponentSettings=function(d){if(c&&b&&b[d]){return b[d].settings}return null};this.getComponentLayout=function(d){if(c){var e=b[d].layout;if(e&&(e.left||e.right||e.center)){return b[d].layout}}return null}}})(jwplayer.html5);(function(a){var b=jwplayer.utils;a.skinloader=function(g,p,k){var o={};var d=p;var l=k;var f=true;var j;var n=g;var s=false;function m(){if(typeof n!="string"||n===""){e(a.defaultskin().xml)}else{b.ajax(b.getAbsolutePath(n),function(t){try{if(b.exists(t.responseXML)){e(t.responseXML);return}}catch(u){i()}e(jwplayer.html5.defaultskin().xml)},function(t){e(jwplayer.html5.defaultskin().xml)})}}function e(y){var E=y.getElementsByTagName("component");if(E.length===0){return}for(var H=0;H<E.length;H++){var C=E[H].getAttribute("name");var B={settings:{},elements:{},layout:{}};o[C]=B;var G=E[H].getElementsByTagName("elements")[0].getElementsByTagName("element");for(var F=0;F<G.length;F++){c(G[F],C)}var z=E[H].getElementsByTagName("settings")[0];if(z&&z.childNodes.length>0){var K=z.getElementsByTagName("setting");for(var P=0;P<K.length;P++){var Q=K[P].getAttribute("name");var I=K[P].getAttribute("value");var x=/color$/.test(Q)?"color":null;o[C].settings[Q]=b.typechecker(I,x)}}var L=E[H].getElementsByTagName("layout")[0];if(L&&L.childNodes.length>0){var M=L.getElementsByTagName("group");for(var w=0;w<M.length;w++){var A=M[w];o[C].layout[A.getAttribute("position")]={elements:[]};for(var O=0;O<A.attributes.length;O++){var D=A.attributes[O];o[C].layout[A.getAttribute("position")][D.name]=D.value}var N=A.getElementsByTagName("*");for(var v=0;v<N.length;v++){var t=N[v];o[C].layout[A.getAttribute("position")].elements.push({type:t.tagName});for(var u=0;u<t.attributes.length;u++){var J=t.attributes[u];o[C].layout[A.getAttribute("position")].elements[v][J.name]=J.value}if(!b.exists(o[C].layout[A.getAttribute("position")].elements[v].name)){o[C].layout[A.getAttribute("position")].elements[v].name=t.tagName}}}}f=false;r()}}function r(){clearInterval(j);if(!s){j=setInterval(function(){q()},100)}}function c(y,x){var w=new Image();var t=y.getAttribute("name");var v=y.getAttribute("src");var A;if(v.indexOf("data:image/png;base64,")===0){A=v}else{var u=b.getAbsolutePath(n);var z=u.substr(0,u.lastIndexOf("/"));A=[z,x,v].join("/")}o[x].elements[t]={height:0,width:0,src:"",ready:false,image:w};w.onload=function(B){h(w,t,x)};w.onerror=function(B){s=true;r();l()};w.src=A}function i(){for(var u in o){var w=o[u];for(var t in w.elements){var x=w.elements[t];var v=x.image;v.onload=null;v.onerror=null;delete x.image;delete w.elements[t]}delete o[u]}}function q(){for(var t in o){if(t!="properties"){for(var u in o[t].elements){if(!o[t].elements[u].ready){return}}}}if(f===false){clearInterval(j);d(o)}}function h(t,v,u){if(o[u]&&o[u].elements[v]){o[u].elements[v].height=t.height;o[u].elements[v].width=t.width;o[u].elements[v].src=t.src;o[u].elements[v].ready=true;r()}else{b.log("Loaded an image for a missing element: "+u+"."+v)}}m()}})(jwplayer.html5);(function(a){var f=jwplayer,d=f.utils,e=f.events,c=e.state,b=d.isMobile();a.video=function(D){var w={abort:t,canplay:J,canplaythrough:t,durationchange:h,emptied:t,ended:t,error:A,loadeddata:t,loadedmetadata:J,loadstart:t,pause:o,play:o,playing:o,progress:t,ratechange:t,readystatechange:t,seeked:t,seeking:t,stalled:t,suspend:t,timeupdate:k,volumechange:G,waiting:x},s,m,l,E,y,v,H=c.IDLE,r=0,n=-1,z=-1,p=new e.eventdispatcher();d.extend(this,p);function u(L){s=L;K();s.controls=true;s.controls=false}function K(){for(var L in w){s.addEventListener(L,w[L],false)}}function C(L,M){p.sendEvent(L,M)}function t(L){}function h(L){m=s.duration;k()}function k(L){if(H==c.PLAYING){l=s.currentTime;C(e.JWPLAYER_MEDIA_TIME,{position:l,duration:m});if(l>=m&&m>0){F()}}}function J(L){if(!y){y=true;C(e.JWPLAYER_MEDIA_BUFFER_FULL);if(v>0){B(v)}}}function o(L){if(s.paused){I(c.PAUSED)}else{I(c.PLAYING)}}function x(L){I(c.BUFFERING)}function A(L){d.log("Error: %o",s.error);t(L)}this.load=function(L){y=false;v=0;m=0;l=0;I(c.BUFFERING);s.src=L;s.load();n=setInterval(i,100);if(b){s.controls=true;s.style.opacity=1}};var q=this.stop=function(){s.removeAttribute("src");s.load();s.style.opacity=0;clearInterval(n);I(c.IDLE)};this.play=function(){s.style.opacity=1;s.play()};this.pause=function(){s.pause()};var B=this.seek=function(L){if(y){v=0;C(e.JWPLAYER_MEDIA_SEEK,{position:l,offset:L});s.currentTime=L}else{v=L}};var j=this.volume=function(L){if(s.muted){s.muted=false}s.volume=L/100};function G(L){C(e.JWPLAYER_MEDIA_VOLUME,{volume:Math.round(s.volume*100)});C(e.JWPLAYER_MEDIA_MUTE,{mute:s.muted})}this.mute=function(L){if(!d.exists(L)){L=!s.mute}if(L){r=s.volume*100;j(0);s.muted=true}else{j(r)}};function I(L){if(L==c.PAUSED&&H==c.IDLE){return}if(H!=L){var M=H;H=L;C(e.JWPLAYER_PLAYER_STATE,{oldstate:M,newstate:L})}}function i(){var L=g();if(L!=z){z=L;C(e.JWPLAYER_MEDIA_BUFFER,{bufferPercent:Math.round(z*100)})}if(L>=1){clearInterval(n)}}function g(){if(s.buffered.length==0||s.duration==0){return 0}else{return s.buffered.end(s.buffered.length-1)/s.duration}}function F(){q();C(e.JWPLAYER_MEDIA_COMPLETE)}this.getTag=function(){return D};u(D)}})(jwplayer.html5);(function(a){var g=jwplayer,e=g.utils,d=document,c="jwcontainer",b="jwvideocontainer",f="jwcontrolscontainer";a.view=function(l,k){var p=l,m=k,s={},j,h;function n(){j=d.getElementById(p.id);j.className=c;h=d.createElement("span");h.className=b;h.appendChild(m.getVideo().getTag());_controlsLayer=d.createElement("span");_controlsLayer.className=f;if(!e.isMobile()){s.controlbar=new a.controlbar(p);_controlsLayer.appendChild(s.controlbar.getDisplayElement())}j.appendChild(h);j.appendChild(_controlsLayer);d.addEventListener("webkitfullscreenchange",r,false);d.addEventListener("mozfullscreenchange",r,false);d.addEventListener("keydown",o,false)}var q=this.fullscreen=function(t){if(!e.exists(t)){t=!m.fullscreen}if(t){if(!m.fullscreen){if(j.requestFullScreen){j.requestFullScreen()}else{if(j.mozRequestFullScreen){j.mozRequestFullScreen()}else{if(j.webkitRequestFullScreenWithKeys){j.webkitRequestFullScreenWithKeys()}else{if(j.webkitRequestFullScreen){j.webkitRequestFullScreen()}else{i(true)}}}}}m.setFullscreen(true)}else{if(d.cancelFullScreen){d.cancelFullScreen()}else{if(d.mozCancelFullScreen){d.mozCancelFullScreen()}else{if(d.webkitCancelFullScreen){d.webkitCancelFullScreen()}else{i(false)}}}m.setFullscreen(false)}};function o(t){switch(t.keyCode){case 27:if(m.fullscreen){q(false)}break}}function i(t){if(t){j.className+=" jwfullscreen"}else{j.className=j.className.replace(/\s+jwfullscreen/,"")}}function r(t){m.setFullscreen(d.mozFullScreenElement==j||d.webkitCurrentFullScreenElement==j)}n()};e.appendStylesheet("."+c+":-webkit-full-screen",{width:"100% !important",height:"100% !important"});e.appendStylesheet("."+c+":-moz-full-screen",{width:"100% !important",height:"100% !important"});e.appendStylesheet("."+c+".jwfullscreen",{left:0,right:0,top:0,bottom:0,position:"fixed !important"});e.appendStylesheet("."+b+" ,."+f,{width:"100%",height:"100%",display:"inline-block",position:"absolute"});e.appendStylesheet("."+b+" video",{width:"100%",height:"100%",background:"#000",opacity:0,"-webkit-transition":"opacity .15s ease"})})(jwplayer.html5)}; 
     1if(typeof jwplayer=="undefined"){jwplayer=function(a){if(jwplayer.api){return jwplayer.api.selectPlayer(a)}};var $jw=jwplayer;jwplayer.version="6.0";jwplayer.vid=document.createElement("video");jwplayer.audio=document.createElement("audio");jwplayer.source=document.createElement("source");(function(c){var g=document;var b=c.utils=function(){};b.exists=function(i){switch(typeof(i)){case"string":return(i.length>0);break;case"object":return(i!==null);case"undefined":return false}return true};var e;var d={};b.css=function(i,l){if(b.exists(i)){for(var j in l){try{if(typeof l[j]==="undefined"){continue}else{if(typeof l[j]=="number"&&!(j=="zIndex"||j=="opacity")){if(isNaN(l[j])){continue}if(j.match(/color/i)){l[j]="#"+b.strings.pad(l[j].toString(16),6)}else{l[j]=Math.ceil(l[j])+"px"}}}if(l[j]){i.style[j]=l[j]}}catch(k){}}}};b.appendStylesheet=function(i,k){if(!e){e=g.createElement("style");e.type="text/css";g.getElementsByTagName("head")[0].appendChild(e)}if(!d[i]){d[i]={}}for(var j in k){var l=h(j,k[j]);if(b.exists(d[i][j])&&!b.exists(l)){delete d[i][j]}else{d[i][j]=l}}f()};function h(i,j){if(typeof j==="undefined"){return undefined}if(typeof j=="number"){if(isNaN(j)){return undefined}switch(i){case"z-index":case"opacity":return j;break;default:if(i.match(/color/i)){return"#"+b.strings.pad(j.toString(16),6)}else{return Math.ceil(j)+"px"}break}}else{return j}}function f(){if(e){var i="";for(var l in d){var k=d[l];i+=l+"{\n";for(var j in k){i+="  "+j+": "+k[j]+";\n"}i+="}\n"}e.innerHTML=i}}b.clearCss=function(i){for(var j in d){if(j.indexOf(i)>=0){delete d[j]}}f()};b.getAbsolutePath=function(p,o){if(!b.exists(o)){o=g.location.href}if(!b.exists(p)){return undefined}if(a(p)){return p}var q=o.substring(0,o.indexOf("://")+3);var n=o.substring(q.length,o.indexOf("/",q.length+1));var k;if(p.indexOf("/")===0){k=p.split("/")}else{var l=o.split("?")[0];l=l.substring(q.length+n.length+1,l.lastIndexOf("/"));k=l.split("/").concat(p.split("/"))}var j=[];for(var m=0;m<k.length;m++){if(!k[m]||!b.exists(k[m])||k[m]=="."){continue}else{if(k[m]==".."){j.pop()}else{j.push(k[m])}}}return q+n+"/"+j.join("/")};function a(j){if(!b.exists(j)){return}var k=j.indexOf("://");var i=j.indexOf("?");return(k>0&&(i<0||(i>k)))}b.extend=function(){var j=b.extend["arguments"];if(j.length>1){for(var l=1;l<j.length;l++){for(var k in j[l]){j[0][k]=j[l][k]}}return j[0]}return null};b.parseDimension=function(i){if(typeof i=="string"){if(i===""){return 0}else{if(i.lastIndexOf("%")>-1){return i}else{return parseInt(i.replace("px",""),10)}}}return i};b.timeFormat=function(i){if(i>0){str=Math.floor(i/60)<10?"0"+Math.floor(i/60)+":":Math.floor(i/60)+":";str+=Math.floor(i%60)<10?"0"+Math.floor(i%60):Math.floor(i%60);return str}else{return"00:00"}};b.log=function(j,i){if(typeof console!="undefined"&&typeof console.log!="undefined"){if(i){console.log(j,i)}else{console.log(j)}}};b.getBoundingClientRect=function(i){if(typeof i.getBoundingClientRect=="function"){return i.getBoundingClientRect()}else{return{left:i.offsetLeft+g.body.scrollLeft,top:i.offsetTop+g.body.scrollTop,width:i.offsetWidth,height:i.offsetHeight}}};b.userAgentMatch=function(j){var i=navigator.userAgent.toLowerCase();return(i.match(j)!==null)};b.isMobile=function(){return b.userAgentMatch(/(iP(hone|ad|od))|android/i)};b.saveCookie=function(i,j){g.cookie="jwplayer."+i+"="+j+"; path=/"};b.getCookies=function(){var m={};var l=g.cookie.split("; ");for(var k=0;k<l.length;k++){var j=l[k].split("=");if(j[0].indexOf("jwplayer.")==0){m[j[0].substring(9,j[0].length)]=j[1]}}return m};b.ajax=function(m,l,i){var k;if(b.exists(window.XDomainRequest)){k=new XDomainRequest()}else{if(window.XMLHttpRequest){k=new XMLHttpRequest()}else{i()}}k.onreadystatechange=function(){if(k.readyState===4){if(k.status===200){if(l){if(!c.utils.exists(k.responseXML)){try{if(window.DOMParser){var n=(new DOMParser()).parseFromString(k.responseText,"text/xml");if(n){k=c.utils.extend({},k,{responseXML:n})}}else{n=new ActiveXObject("Microsoft.XMLDOM");n.async="false";n.loadXML(k.responseText);k=c.utils.extend({},k,{responseXML:n})}}catch(o){if(i){i(m)}}}l(k)}}else{if(i){i(m)}}}};try{k.open("GET",m,true);k.send(null)}catch(j){if(i){i(m)}}return k};b.typeOf=function(j){var i=typeof j;if(i==="object"){if(!j){return"null"}return(j instanceof Array)?"array":i}else{return i}}})(jwplayer);(function(b){var a=b.strings=function(){};a.trim=function(c){return c.replace(/^\s*/,"").replace(/\s*$/,"")};a.pad=function(d,e,c){if(!c){c="0"}while(d.length<e){d=c+d}return d};a.serialize=function(c){if(c==null){return null}else{if(c=="true"){return true}else{if(c=="false"){return false}else{if(isNaN(Number(c))||c.length>5||c.length==0){return c}else{return Number(c)}}}}};a.seconds=function(e){e=e.replace(",",".");var c=e.split(":");var d=0;if(e.substr(-1)=="s"){d=Number(e.substr(0,e.length-1))}else{if(e.substr(-1)=="m"){d=Number(e.substr(0,e.length-1))*60}else{if(e.substr(-1)=="h"){d=Number(e.substr(0,e.length-1))*3600}else{if(c.length>1){d=Number(c[c.length-1]);d+=Number(c[c.length-2])*60;if(c.length==3){d+=Number(c[c.length-3])*3600}}else{d=Number(e)}}}}return d};a.xmlAttribute=function(c,d){for(var e=0;e<c.attributes.length;e++){if(c.attributes[e].name&&c.attributes[e].name.toLowerCase()==d.toLowerCase()){return c.attributes[e].value.toString()}}return""};a.jsonToString=function(g){var i=i||{};if(i&&i.stringify){return i.stringify(g)}var d=typeof(g);if(d!="object"||g===null){if(d=="string"){g='"'+g.replace(/"/g,'\\"')+'"'}else{return String(g)}}else{var h=[],c=(g&&g.constructor==Array);for(var e in g){var f=g[e];switch(typeof(f)){case"string":f='"'+f.replace(/"/g,'\\"')+'"';break;case"object":if(b.exists(f)){f=a.jsonToString(f)}break}if(c){if(typeof(f)!="function"){h.push(String(f))}}else{if(typeof(f)!="function"){h.push('"'+e+'":'+String(f))}}}if(c){return"["+String(h)+"]"}else{return"{"+String(h)+"}"}}}})(jwplayer.utils);(function(b){var d=new RegExp(/^(#|0x)[0-9a-fA-F]{3,6}/);b.typechecker=function(g,f){f=!b.exists(f)?c(g):f;return e(g,f)};function c(f){var g=["true","false","t","f"];if(g.toString().indexOf(f.toLowerCase().replace(" ",""))>=0){return"boolean"}else{if(d.test(f)){return"color"}else{if(!isNaN(parseInt(f,10))&&parseInt(f,10).toString().length==f.length){return"integer"}else{if(!isNaN(parseFloat(f))&&parseFloat(f).toString().length==f.length){return"float"}}}}return"string"}function e(g,f){if(!b.exists(f)){return g}switch(f){case"color":if(g.length>0){return a(g)}return null;case"integer":return parseInt(g,10);case"float":return parseFloat(g);case"boolean":if(g.toLowerCase()=="true"){return true}else{if(g=="1"){return true}}return false}return g}function a(f){f=f.replace(/(#|0x)?([0-9A-F]{3,6})$/gi,"$2");if(f.length==3){f=f.charAt(0)+f.charAt(0)+f.charAt(1)+f.charAt(1)+f.charAt(2)+f.charAt(2)}return parseInt(f,16)}})(jwplayer.utils);(function(a){a.events={COMPLETE:"COMPLETE",ERROR:"ERROR",API_READY:"jwplayerAPIReady",JWPLAYER_READY:"jwplayerReady",JWPLAYER_FULLSCREEN:"jwplayerFullscreen",JWPLAYER_RESIZE:"jwplayerResize",JWPLAYER_ERROR:"jwplayerError",JWPLAYER_MEDIA_BEFOREPLAY:"jwplayerMediaBeforePlay",JWPLAYER_MEDIA_BEFORECOMPLETE:"jwplayerMediaBeforeComplete",JWPLAYER_COMPONENT_SHOW:"jwplayerComponentShow",JWPLAYER_COMPONENT_HIDE:"jwplayerComponentHide",JWPLAYER_MEDIA_BUFFER:"jwplayerMediaBuffer",JWPLAYER_MEDIA_BUFFER_FULL:"jwplayerMediaBufferFull",JWPLAYER_MEDIA_ERROR:"jwplayerMediaError",JWPLAYER_MEDIA_LOADED:"jwplayerMediaLoaded",JWPLAYER_MEDIA_COMPLETE:"jwplayerMediaComplete",JWPLAYER_MEDIA_SEEK:"jwplayerMediaSeek",JWPLAYER_MEDIA_TIME:"jwplayerMediaTime",JWPLAYER_MEDIA_VOLUME:"jwplayerMediaVolume",JWPLAYER_MEDIA_META:"jwplayerMediaMeta",JWPLAYER_MEDIA_MUTE:"jwplayerMediaMute",JWPLAYER_PLAYER_STATE:"jwplayerPlayerState",state:{BUFFERING:"BUFFERING",IDLE:"IDLE",PAUSED:"PAUSED",PLAYING:"PLAYING",COMPLETED:"COMPLETED"},JWPLAYER_PLAYLIST_LOADED:"jwplayerPlaylistLoaded",JWPLAYER_PLAYLIST_ITEM:"jwplayerPlaylistItem",JWPLAYER_INSTREAM_CLICK:"jwplayerInstreamClicked",JWPLAYER_INSTREAM_DESTROYED:"jwplayerInstreamDestroyed"}})(jwplayer);(function(events){var _utils=jwplayer.utils;events.eventdispatcher=function(id,debug){var _id=id,_debug=debug,_listeners,_globallisteners;this.resetEventListeners=function(){_listeners={};_globallisteners=[]};this.resetEventListeners();this.addEventListener=function(type,listener,count){try{if(!_utils.exists(_listeners[type])){_listeners[type]=[]}if(typeof(listener)=="string"){eval("listener = "+listener)}_listeners[type].push({listener:listener,count:count})}catch(err){_utils.log("error",err)}return false};this.removeEventListener=function(type,listener){if(!_listeners[type]){return}try{for(var listenerIndex=0;listenerIndex<_listeners[type].length;listenerIndex++){if(_listeners[type][listenerIndex].listener.toString()==listener.toString()){_listeners[type].splice(listenerIndex,1);break}}}catch(err){_utils.log("error",err)}return false};this.addGlobalListener=function(listener,count){try{if(typeof(listener)=="string"){eval("listener = "+listener)}_globallisteners.push({listener:listener,count:count})}catch(err){_utils.log("error",err)}return false};this.removeGlobalListener=function(listener){if(!listener){return}try{for(var globalListenerIndex=0;globalListenerIndex<_globallisteners.length;globalListenerIndex++){if(_globallisteners[globalListenerIndex].listener.toString()==listener.toString()){_globallisteners.splice(globalListenerIndex,1);break}}}catch(err){_utils.log("error",err)}return false};this.sendEvent=function(type,data){if(!_utils.exists(data)){data={}}_utils.extend(data,{id:_id,version:jwplayer.version,type:type});if(_debug){_utils.log(type,data)}if(typeof _listeners[type]!="undefined"){for(var listenerIndex=0;listenerIndex<_listeners[type].length;listenerIndex++){try{_listeners[type][listenerIndex].listener(data)}catch(err){_utils.log("There was an error while handling a listener: "+err.toString(),_listeners[type][listenerIndex].listener)}if(_listeners[type][listenerIndex]){if(_listeners[type][listenerIndex].count===1){delete _listeners[type][listenerIndex]}else{if(_listeners[type][listenerIndex].count>0){_listeners[type][listenerIndex].count=_listeners[type][listenerIndex].count-1}}}}}var globalListenerIndex;for(globalListenerIndex=0;globalListenerIndex<_globallisteners.length;globalListenerIndex++){try{_globallisteners[globalListenerIndex].listener(data)}catch(err){_utils.log("There was an error while handling a listener: "+err.toString(),_globallisteners[globalListenerIndex].listener)}if(_globallisteners[globalListenerIndex]){if(_globallisteners[globalListenerIndex].count===1){delete _globallisteners[globalListenerIndex]}else{if(_globallisteners[globalListenerIndex].count>0){_globallisteners[globalListenerIndex].count=_globallisteners[globalListenerIndex].count-1}}}}}}})(jwplayer.events);(function(a){a.html5={}})(jwplayer);(function(l){var s=l.html5,h=l.utils,i=l.events,o=l.events.state,g=h.appendStylesheet,b="button",n="text",d="divider",p="slider",e="relative",f="absolute",a="none",m="block",r="inline",k="inline-block",c="left",t="right",j="100%",q="width .25s linear, left .25s linear, opacity .25s, background .25s";CB_CLASS=".jwcontrolbar";s.controlbar=function(A,am){var y,P,z={backgroundcolor:"",margin:10,font:"Arial,sans-serif",fontsize:10,fontcolor:parseInt("000000",16),fontstyle:"normal",fontweight:"bold",buttoncolor:parseInt("ffffff",16),position:"OVER",idlehide:false,hideplaylistcontrols:false,forcenextprev:false,layout:{left:{position:"left",elements:[{name:"play",type:b},{name:"divider",type:d},{name:"prev",type:b},{name:"divider",type:d},{name:"next",type:b},{name:"divider",type:d},{name:"elapsed",type:n}]},center:{position:"center",elements:[{name:"time",type:p}]},right:{position:"right",elements:[{name:"duration",type:n},{name:"blank",type:b},{name:"divider",type:d},{name:"mute",type:b},{name:"volume",type:p},{name:"divider",type:d},{name:"fullscreen",type:b}]}}},O,av,ag,at,aj,aD,I,T={play:"pause",mute:"unmute",fullscreen:"normalscreen"},au={play:false,mute:false,fullscreen:false},x={play:Y,mute:J,fullscreen:V,next:w,prev:ab},B={time:S,volume:ay};function ax(){ag={};y=A;aj=y.id+"_controlbar";aD=0;at=K();at.id=aj;at.className="jwcontrolbar";window.addEventListener("mousemove",aC,false);window.addEventListener("mouseup",aC,false);P=y.skin;O=h.extend({},z,P.controlbar.settings,am);av=(P.controlbar.layout.left||P.controlbar.layout.right||P.controlbar.layout.center)?P.controlbar.layout:z.layout;R();ao();u()}function u(){y.jwAddEventListener(l.events.JWPLAYER_MEDIA_TIME,aE);y.jwAddEventListener(l.events.JWPLAYER_PLAYER_STATE,E);y.jwAddEventListener(l.events.JWPLAYER_MEDIA_MUTE,az);y.jwAddEventListener(l.events.JWPLAYER_MEDIA_VOLUME,C);y.jwAddEventListener(l.events.JWPLAYER_MEDIA_BUFFER,G);y.jwAddEventListener(l.events.JWPLAYER_FULLSCREEN,D)}function aE(aF){aD=aF.duration;if(ag.elapsed){ag.elapsed.innerHTML=h.timeFormat(aF.position)}if(ag.duration){ag.duration.innerHTML=h.timeFormat(aF.duration)}if(aF.duration>0){ar(aF.position/aF.duration)}else{ar(0)}}function E(aF){switch(aF.newstate){case l.events.state.BUFFERING:case l.events.state.PLAYING:if(ag.timeSliderThumb){ag.timeSliderThumb.style.opacity=1}N("play",true);break;case l.events.state.PAUSED:if(!ad){N("play",false)}break;case l.events.state.IDLE:case l.events.state.COMPLETED:N("play",false);if(ag.timeSliderThumb){ag.timeSliderThumb.style.opacity=0}if(ag.timeRail){ag.timeRail.className="jwrail";setTimeout(function(){ag.timeRail.className+=" jwsmooth"},100)}aw(0);aE({position:0,duration:0});break}}function az(aF){N("mute",aF.mute);v(aF.mute?0:I)}function C(aF){I=aF.volume/100;v(I)}function G(aF){aw(aF.bufferPercent/100)}function D(aF){N("fullscreen",aF.fullscreen)}function R(){h.clearCss("#"+aj);g("#"+aj,{height:X("background").height,bottom:O.position=="OVER"?O.margin:0,left:O.position=="OVER"?O.margin:0,right:O.position=="OVER"?O.margin:0});g(an(".jwtext"),{font:O.fontsize+"px/"+X("background").height+"px "+O.font,color:O.fontcolor,"font-weight":O.fontweight,"font-style":O.fontstyle,"text-align":"center",padding:"0 5px"})}function an(aF){return"#"+aj+" "+aF}function K(){return document.createElement("span")}function ao(){var aH=ah("capLeft");var aG=ah("capRight");var aF=ah("background",{position:f,left:X("capLeft").width,right:X("capRight").width,"background-repeat":"repeat-x"},true);at.style.opacity=0;if(aF){at.appendChild(aF)}if(aH){at.appendChild(aH)}ap();if(aG){at.appendChild(aG)}setTimeout(function(){ac();at.style.opacity=1},1000)}function L(aF){switch(aF.type){case d:return aa(aF);break;case n:return ai(aF.name);break;case b:if(aF.name!="blank"){return Z(aF.name)}break;case p:return M(aF.name);break}}function ah(aH,aK,aG,aM){var aJ=K();aJ.className="jw"+aH;var aF=aM?" left center":" center";var aI=X(aH);aJ.innerHTML="&nbsp;";if(!aI||aI.src==""){return}var aL;if(aG){aL={background:"url('"+aI.src+"') repeat-x "+aF}}else{aL={background:"url('"+aI.src+"') no-repeat"+aF,width:aI.width}}g(an(".jw"+aH),h.extend(aL,aK));ag[aH]=aJ;return aJ}function Z(aH){if(!X(aH+"Button").src){return null}var aI=document.createElement("button");aI.className="jw"+aH;aI.addEventListener("click",ae(aH),false);var aJ=X(aH+"Button");var aG=X(aH+"ButtonOver");aI.innerHTML="&nbsp;";Q(an(".jw"+aH),aJ,aG);var aF=T[aH];if(aF){Q(an(".jw"+aH+".jwtoggle"),X(aF+"Button"),X(aF+"ButtonOver"))}ag[aH]=aI;return aI}function Q(aF,aG,aH){if(!aG.src){return}g(aF,{width:aG.width,background:"url("+aG.src+") center no-repeat"});if(aH.src){g(aF+":hover",{background:"url("+aH.src+") center no-repeat"})}}function ae(aF){return function(){if(x[aF]){x[aF]()}}}function Y(){if(au.play){y.jwPause()}else{y.jwPlay()}}function J(){y.jwSetMute();az({mute:au.mute})}function ay(aF){if(aF<0.1){aF=0}if(aF>0.9){aF=1}y.jwSetVolume(aF*100);v(aF)}function S(aF){if(!ad){y.jwPlay()}y.jwSeek(aF*aD)}function V(){y.jwSetFullscreen()}function w(){y.jwPlaylistNext()}function ab(){y.jwPlaylistNext()}function N(aF,aG){if(!h.exists(aG)){aG=!au[aF]}if(ag[aF]){ag[aF].className="jw"+aF+(aG?" jwtoggle jwtoggling":" jwtoggling");setTimeout(function(){ag[aF].className=ag[aF].className.replace(" jwtoggling","")},100)}au[aF]=aG}function H(aF){return aj+"_"+aF}function ai(aF,aJ){var aH=K();aH.id=H(aF);aH.className="jwtext jw"+aF;var aG={};var aI=X(aF+"Background");if(aI.src){aG.background="url("+aI.src+") no-repeat center";aG["background-size"]="100% "+X("background").height+"px"}g(an(".jw"+aF),aG);aH.innerHTML="00:00";ag[aF]=aH;return aH}function aa(aG){if(aG.width){var aF=K();aF.className="jwblankDivider";g(aF,{width:parseInt(aG.width)});return aF}else{if(aG.element){return ah(aG.element)}else{return ah(aG.name)}}}function M(aF){var aI=K();aI.className="jwslider jw"+aF;var aH=ah(aF+"SliderCapLeft");var aG=ah(aF+"SliderCapRight");if(aG){aG.className+=" jwcapRight"}var aJ=ak(aF);if(aH){aI.appendChild(aH)}aI.appendChild(aJ);if(aH){aI.appendChild(aG)}g(an(".jw"+aF+" .jwrail"),{left:X(aF+"SliderCapLeft").width,right:X(aF+"SliderCapRight").width,});ag[aF]=aI;if(aF=="time"){aB(aI);ar(0);aw(0)}else{if(aF=="volume"){aq(aI)}}return aI}function ak(aH){var aK=K();aK.className="jwrail jwsmooth";var aF=["Rail","Buffer","Progress"];for(var aJ=0;aJ<aF.length;aJ++){var aI=ah(aH+"Slider"+aF[aJ],null,true,(aH=="volume"));if(aI){aI.className+=" jwstretch";aK.appendChild(aI)}}var aG=ah(aH+"SliderThumb");if(aG){aG.className+=" jwthumb";aG.style.opacity=0;aK.appendChild(aG)}aK.addEventListener("mousedown",F(aH),false);ag[aH+"Rail"]=aK;return aK}var ad;function F(aF){return(function(aG){if(aG.button!=0){return}ag[aF+"Rail"].className="jwrail";if(aF=="time"){if(y.jwGetState()!=l.events.state.IDLE){ad=aF}}else{ad=aF}})}var al=0;function aC(aF){if(!ad||aF.button!=0){return}var aJ=ag[ad].getElementsByClassName("jwrail")[0],aK=h.getBoundingClientRect(aJ),aI=(aF.clientX-aK.left)/aK.width;if(aF.type=="mouseup"){var aG=ad;ag[aG+"Rail"].className="jwrail jwsmooth";ad=null;B[aG](aI)}else{if(ad=="time"){ar(aI)}else{v(aI)}var aH=(new Date()).getTime();if(aH-al>500){y.jwPause();al=aH;B[ad](aI)}}}function aB(aF){if(ag.timeSliderThumb){g(an(".jwtimeSliderThumb"),{"margin-left":(X("timeSliderThumb").width/-2)})}aw(0);ar(0)}function aq(aH){var aG=X("volumeSliderCapLeft").width,aF=X("volumeSliderCapRight").width,aI=X("volumeSliderRail").width;g(an(".jwvolume"),{width:(aG+aI+aF)})}var U={};function ap(){aA("left");aA("center");aA("right");at.appendChild(U.left);at.appendChild(U.center);at.appendChild(U.right);g(an(".jwright"),{right:X("capRight").width})}function aA(aG){var aF=K();aF.className="jwgroup jw"+aG;U[aG]=aF;if(av[aG]){W(av[aG],U[aG])}}function W(aI,aF){if(aI&&aI.elements.length>0){for(var aH=0;aH<aI.elements.length;aH++){var aG=L(aI.elements[aH]);if(aG){aF.appendChild(aG)}}}}var ac=this.resize=function(aG,aF){g(an(".jwgroup.jwcenter"),{left:Math.round(h.parseDimension(U.left.offsetWidth)+X("capLeft").width),right:Math.round(h.parseDimension(U.right.offsetWidth)+X("capRight").width)})};this.getDisplayElement=function(){return at};function aw(aF){aF=Math.min(Math.max(0,aF),1);ag.timeSliderBuffer.style.width=aF*100+"%"}function af(aH,aJ,aK){if(!ag[aH]){return}aJ=Math.min(Math.max(0,aJ),1);var aG=ag[aH+"SliderProgress"];var aF=ag[aH+"SliderThumb"];var aI=100*aJ+"%";if(aG){aG.style.width=aI}if(aF){aF.style.left=aI}}function v(aF){af("volume",aF,true)}function ar(aF){af("time",aF)}function X(aF){if(P.controlbar.elements[aF]){return P.controlbar.elements[aF]}else{return{width:0,height:0,src:"",image:undefined,ready:false}}}ax()};g(CB_CLASS,{position:f,overflow:"hidden","-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" span",{height:j,"-webkit-user-select":a,"-webkit-user-drag":a,"user-select":a,"user-drag":a});g(CB_CLASS+" .jwgroup",{display:r});g(CB_CLASS+" span, "+CB_CLASS+" .jwgroup button,"+CB_CLASS+" .jwleft",{position:e,"float":c});g(CB_CLASS+" .jwright",{position:f});g(CB_CLASS+" .jwcenter",{position:f});g(CB_CLASS+" button",{display:k,height:j,border:a,cursor:"pointer","-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" .jwcapRight",{right:0,position:f});g(CB_CLASS+" .jwtime,"+CB_CLASS+" .jwgroup span.jwstretch",{position:f,height:j,width:j,left:0});g(CB_CLASS+" .jwrail,"+CB_CLASS+" .jwthumb",{position:f,height:j,cursor:"pointer"});g(CB_CLASS+" .jwtime .jwsmooth span",{"-webkit-transition":q,"-moz-transition":q,"-o-transition":q});g(CB_CLASS+" .jwdivider+.jwdivider",{display:a});g(CB_CLASS+" .jwtext",{padding:"0 5px","text-align":"center"});g(CB_CLASS+" .jwtoggling",{"-webkit-transition":a,"-moz-transition":a,"-o-transition":a})})(jwplayer);(function(a){var e=jwplayer,c=e.utils,d=e.events,b=d.state;a.controller=function(g,q){var v=g,f=q,l=g.getVideo(),j=new d.eventdispatcher(v.id,v.config.debug);c.extend(this,j);function m(){v.addGlobalListener(y);v.addEventListener(d.JWPLAYER_MEDIA_BUFFER_FULL,s)}function y(B){j.sendEvent(B.type,B)}function s(B){l.play()}var z;function A(B){if(v.state==b.PLAYING||v.state==b.BUFFERING){l.stop()}switch(c.typeOf(B)){case"string":z=B;break;case"object":z=B.file;break;case"number":z=v.playlist[B].file;break;default:z=v.playlist[v.item].file}}function p(){if(v.state==b.IDLE){l.load(z)}else{if(v.state==b.PAUSED){l.play()}}}function k(){l.stop()}function x(){if(v.state==b.PLAYING||v.state==b.BUFFERING){l.pause()}}function t(B){l.seek(B)}function w(B){l.volume(B)}function n(B){if(!c.exists(B)){B=!v.mute}l.mute(B)}function r(B){f.fullscreen(B)}function o(B){k();v.setItem(B);A(v.item);p()}function h(){o(v.item-1)}function i(){o(v.item+1)}function u(B){return function(){B.apply(this,arguments)}}this.play=u(p);this.pause=u(x);this.seek=u(t);this.stop=u(k);this.load=u(A);this.next=u(i);this.prev=u(h);this.item=u(o);this.setVolume=u(w);this.setMute=u(n);this.setFullscreen=u(r);m()}})(jwplayer.html5);(function(a){a.html5.defaultskin=function(){this.text='<?xml version="1.0" ?><skin author="LongTail Video" name="Five" version="1.1"><components><component name="controlbar"><settings><setting name="margin" value="20"/><setting name="fontsize" value="11"/><setting name="fontcolor" value="0x000000"/></settings><layout><group position="left"><button name="play"/><divider name="divider"/><button name="prev"/><divider name="divider"/><button name="next"/><divider name="divider"/><text name="elapsed"/></group><group position="center"><slider name="time"/></group><group position="right"><text name="duration"/><divider name="divider"/><button name="blank"/><divider name="divider"/><button name="mute"/><slider name="volume"/><divider name="divider"/><button name="fullscreen"/></group></layout><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUOI3t1LERACAMQlFgGvcfxNIhHMK4gsUvUviOmgtNsiAZkBSEKxKEnCYkkQrJn/YwbUNiSDDYRZaQRDaShv+oX9GBZEIuK+8hXVLs+/YAAAAASUVORK5CYII="/><element name="blankButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAYCAYAAAAyJzegAAAAFElEQVQYV2P8//8/AzpgHBUc7oIAGZdH0RjKN8EAAAAASUVORK5CYII="/><element name="capLeft" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAYAAAA7zJfaAAAAQElEQVQIWz3LsRGAMADDQJ0XB5bMINABZ9GENGrszxhjT2WLSqxEJG2JQrTMdV2q5LpOAvyRaVmsi7WdeZ/7+AAaOTq7BVrfOQAAAABJRU5ErkJggg=="/><element name="capRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAYAAAA7zJfaAAAAQElEQVQIWz3LsRGAMADDQJ0XB5bMINABZ9GENGrszxhjT2WLSqxEJG2JQrTMdV2q5LpOAvyRaVmsi7WdeZ/7+AAaOTq7BVrfOQAAAABJRU5ErkJggg=="/><element name="divider" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAYCAIAAAC0rgCNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUCB0FwcENgEAAw7Aq+893g8APUILNOQcbFRktVGqUVFRkWNz3xTa2sUaLNUosKlRUvvf5AdbWOTtzmzyWAAAAAElFTkSuQmCC"/><element name="playButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAANUlEQVR42u2RsQkAAAjD/NTTPaW6dXLrINJA1kBpGPMAjDWmOgp1HFQXx+b1KOefO4oxY57R73YnVYCQUCQAAAAASUVORK5CYII="/><element name="pauseButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAIUlEQVQ4jWNgGAWjYOiD/0gYG3/U0FFDB4Oho2AUDAYAAEwiL9HrpdMVAAAAAElFTkSuQmCC"/><element name="prevButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAQklEQVQ4y2NgGAWjYOiD/1AMA/JAfB5NjCJD/YH4PRaLyDa0H4lNNUP/DxlD59PCUBCIp3ZEwYA+NZLUKBgFgwEAAN+HLX9sB8u8AAAAAElFTkSuQmCC"/><element name="nextButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAYCAYAAAAVibZIAAAAQElEQVQ4y2NgGAWjYOiD/0B8Hojl0cT+U2ooCL8HYn9qGwrD/bQw9P+QMXQ+tSMqnpoRBUpS+tRMUqNgFAwGAADxZy1/mHvFnAAAAABJRU5ErkJggg=="/><element name="timeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAOElEQVRIDe3BwQkAIRADwAhhw/nU/kWwUK+KPITMABFh19Y+F0acY8CJvX9wYpXgRElwolSIiMf9ZWEDhtwurFsAAAAASUVORK5CYII="/><element name="timeSliderBuffer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAN0lEQVRIDe3BwQkAMQwDMBcc55mRe9zi7RR+FCwBEWG39vcfGHFm4MTuhhMlwYlVBSdKhYh43AW/LQMKm1spzwAAAABJRU5ErkJggg=="/><element name="timeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAIElEQVRIiWNgGAWjYBTQBfynMR61YCRYMApGwSigMQAAiVWPcbq6UkIAAAAASUVORK5CYII="/><element name="timeSliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAYCAYAAAA/OUfnAAAAO0lEQVQYlWP4//8/Awwz0JgDBP/BeN6Cxf/hnI2btiI4u/fsQ3AOHjqK4Jw4eQbBOX/hEoKDYjSd/AMA4cS4mfLsorgAAAAASUVORK5CYII="/><element name="muteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAJklEQVQ4y2NgGAUjDcwH4v/kaPxPikZkxcNVI9mBQ5XoGAWDFwAAsKAXKQQmfbUAAAAASUVORK5CYII="/><element name="unmuteButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAAMklEQVQ4y2NgGAWDHPyntub5xBr6Hwv/Pzk2/yfVG/8psRFE25Oq8T+tQnsIaB4FVAcAi2YVysVY52AAAAAASUVORK5CYII="/><element name="volumeSliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAACVBMVEUAAACmpqampqbBXAu8AAAAAnRSTlMAgJsrThgAAAArSURBVAhbY2AgErBAyA4I2QEhOyBkB4TsYOhAoaCCUCUwDTDtMMNgRuMHAFB5FoGH5T0UAAAAAElFTkSuQmCC"/><element name="volumeSliderProgress" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAACVBMVEUAAAAAAAAAAACDY+nAAAAAAnRSTlMAgJsrThgAAAArSURBVAhbY2AgErBAyA4I2QEhOyBkB4TsYOhAoaCCUCUwDTDtMMNgRuMHAFB5FoGH5T0UAAAAAElFTkSuQmCC"/><element name="volumeSliderCapRight" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAYCAYAAAAyJzegAAAAFElEQVQYV2P8//8/AzpgHBUc7oIAGZdH0RjKN8EAAAAASUVORK5CYII="/><element name="fullscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQklEQVRIiWNgGAWjYMiD/0iYFDmSLbDHImdPLQtgBpEiR7Zl2NijAA5oEkT/0Whi5UiyAJ8BVMsHNMtoo2AUDAIAAGdcIN3IDNXoAAAAAElFTkSuQmCC"/><element name="normalscreenButton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAP0lEQVRIx2NgGAWjYMiD/1RSQ5QB/wmIUWzJfzx8qhj+n4DYCAY0DyJ7PBbYU8sHMEvwiZFtODXUjIJRMJgBACpWIN2ZxdPTAAAAAElFTkSuQmCC"/></elements></component><component name="display"><elements><element name="background" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAQMAAAAk8RryAAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlOZpuml+rYAAAASSURBVBhXY2AYJuA/GBwY6jQAyDyoK8QcL4QAAAAASUVORK5CYII="/><element name="playIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAiUlEQVR42u3XSw2AMBREURwgAQlIQAISKgUpSEFKJeCg5b0E0kWBTVcD9ySTsL0Jn9IBAAAA+K2UUrBlW/Rr5ZDoIeeuoFkxJD9ss03aIXXQqB9SttoG7ZA6qNcOKdttiwcJh9RB+iFl4SshkRBuLR72+9cvH0SOKI2HRo7x/Fi1/uoCAAAAwLsD8ki99IlO2dQAAAAASUVORK5CYII="/><element name="muteIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAVUlEQVR42u3WMQrAIAxAUW/g/SdvGmvpoOBeSHgPsjj5QTANAACARCJilIhYM0tEvJM+Ik3Id9E957kQIb+F3OdCPC0hPkQriqWx9hp/x/QGAABQyAPLB22VGrpLDgAAAABJRU5ErkJggg=="/><element name="errorIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAA/0lEQVR42u2U0QmEMBAF7cASLMESUoIlpARLSCkpwRJSgiWkhOvAXD4WsgRkyaG5DbyB+Yvg8KITAAAAAAAYk+u61mwk15EjPtlEfihmqIiZR1Qx80ghjgdUuiHXGHSVsoag0x6x8DUoyjD5KovmEJ9NTDMRPIT0mtdIUkjlonuNohO+Ha99DTmkuGgKCTcvebAzx82ZoCWC3/3aIMWSRucaxcjORSFY4xpFdjYJGp1rFGcyCYZ/RVh6AUnfcNZ2zih3/mGj1jVCdiNDwyrq1rA/xMdeEXvDVdnYc1vDc3uPkDObXrlaxbNHSOohQhr/WOeLEWfWTgAAAAAAADzNF9sHJ7PJ57MlAAAAAElFTkSuQmCC"/><element name="bufferIcon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACBklEQVR42u3Zv0sCYRzH8USTzOsHHEWGkC1HgaDgkktGDjUYtDQ01RDSljQ1BLU02+rk1NTm2NLq4Nx/0L/h9fnCd3j4cnZe1/U8xiO8h3uurufF0/3COd/3/0UWYiEWYiEWYiGJQ+J8xuPxKhXjEMZANinjIZhkGuVRNioE4wVURo4JkHm0xKWmhRAc1bh1EyCUw5BcBIjHiApKa4CErko6DEJwuRo6IRKzyJD8FJAyI3Zp2zRImiBcRhlfo5RtlxCcE3CcDNpGrhYIT2IhAJKilO0VRmzJ32fAMTpBTS0QMfGwlcuKMRftE0DJ0wCJdcOsCkBdXP3Mh9CEFUBTPS9mDZJBG6io4aqVzMdCokCw9H3kT6j/C/9iDdSeUMNC7DkyyxAs/Rk6Qss8FPWRZgdVtUH4DjxEn1zxh+/zj1wHlf4MQhNGrwqA6sY40U8JonRJwEQh+AO3AvCG6gHv4U7IY4krxkroWoAOkoQMGfCBrgIm+YBGqPENpIJ66CJg3x66Y0gnSUidAEEnNr9jjLiWMn5DiWP0OC/oAsCgkq43xBdGDMQr7YASP/vEkHvdl1+JOCcEV5sC4hGEOzTlPuKgd0b0xD4JkRcOgnRRTjdErkYhAsQVq6IdUuPJtmk7BCL3t/h88cx91pKQkI/pkDx6pmYTIjEoxiHsN1YWYiEWYiEWknhflZ5IErA5nr8AAAAASUVORK5CYII="/></elements></component><component name="dock"><settings><setting name="fontcolor" value="0xffffff"/></settings><elements><element name="button" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAQMAAAAk8RryAAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlOZpuml+rYAAAASSURBVBhXY2AYJuA/GBwY6jQAyDyoK8QcL4QAAAAASUVORK5CYII="/></elements></component><component name="playlist"><settings><setting name="backgroundcolor" value="0xe8e8e8"/></settings><elements><element name="item" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAIAAAC1nk4lAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUaN7t2MENwCAMBEEe9N8wSKYC/D8YV7CyJoRkVtVImxkZPQInMxoP0XiIxkM0HsGbjjSNBx544IEHHnjggUe/6UQeey0PIh7XTftGxKPj4eXCtLsHHh+ZxkO0Iw8PR55Ni8ZD9Hu/EAoP0dc5RRg9qeRjVF8AAAAASUVORK5CYII="/><element name="sliderCapTop" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAHCAYAAADnCQYGAAAAFUlEQVQokWP8//8/A7UB46ihI9hQAKt6FPPXhVGHAAAAAElFTkSuQmCC"/><element name="sliderRail" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAKElEQVQ4y2P4//8/Az68bNmy/+iYkB6GUUNHDR01dNTQUUNHDaXcUABUDOKhcxnsSwAAAABJRU5ErkJggg=="/><element name="sliderThumb" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAJUlEQVQ4T2P4//8/Ay4MBP9xYbz6Rg0dNXTU0FFDRw0dNZRyQwHH4NBa7GJsXAAAAABJRU5ErkJggg=="/><element name="sliderCapBottom" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAHCAYAAADnCQYGAAAAFUlEQVQokWP8//8/A7UB46ihI9hQAKt6FPPXhVGHAAAAAElFTkSuQmCC"/></elements></component></components></skin>';this.xml=null;if(window.DOMParser){parser=new DOMParser();this.xml=parser.parseFromString(this.text,"text/xml")}else{this.xml=new ActiveXObject("Microsoft.XMLDOM");this.xml.async="false";this.xml.loadXML(this.text)}return this}})(jwplayer);(function(b){var e=jwplayer.utils,c=e.css,f=jwplayer.events,d=f.state;function a(h){c(h,{display:"none"})}function g(h){c(h,{display:"block"})}b.display=function(p,P){var o={icons:true,showmute:false};var ac=e.extend({},o,P);var n=p;var ab={};var k;var B;var E;var Y;var z;var R;var J;var S=!e.exists(n.skin.getComponentSettings("display").bufferrotation)?15:parseInt(n.skin.getComponentSettings("display").bufferrotation,10);var x=!e.exists(n.skin.getComponentSettings("display").bufferinterval)?100:parseInt(n.skin.getComponentSettings("display").bufferinterval,10);var I=-1;var A=d.IDLE;var T=true;var j;var H=false,aa=true;var u="";var m=false;var t=false;var r;var D,W;var Q=new f.eventdispatcher();e.extend(this,Q);var M={display:{style:{cursor:"pointer",top:0,left:0,overflow:"hidden"},click:s},display_icon:{style:{cursor:"pointer",position:"absolute",top:((n.skin.getSkinElement("display","background").height-n.skin.getSkinElement("display","playIcon").height)/2),left:((n.skin.getSkinElement("display","background").width-n.skin.getSkinElement("display","playIcon").width)/2),border:0,margin:0,padding:0,zIndex:3,display:"none"}},display_iconBackground:{style:{cursor:"pointer",position:"absolute",top:((B-n.skin.getSkinElement("display","background").height)/2),left:((k-n.skin.getSkinElement("display","background").width)/2),border:0,backgroundImage:(["url(",n.skin.getSkinElement("display","background").src,")"]).join(""),width:n.skin.getSkinElement("display","background").width,height:n.skin.getSkinElement("display","background").height,margin:0,padding:0,zIndex:2,display:"none"}},display_image:{style:{display:"none",width:k,height:B,position:"absolute",cursor:"pointer",left:0,top:0,margin:0,padding:0,textDecoration:"none",zIndex:1}},display_text:{style:{zIndex:4,position:"relative",opacity:0.8,backgroundColor:parseInt("000000",16),color:parseInt("ffffff",16),textAlign:"center",fontFamily:"Arial,sans-serif",padding:"0 5px",fontSize:14}}};n.jwAddEventListener(f.JWPLAYER_PLAYER_STATE,v);n.jwAddEventListener(f.JWPLAYER_MEDIA_MUTE,v);n.jwAddEventListener(f.JWPLAYER_PLAYLIST_LOADED,U);n.jwAddEventListener(f.JWPLAYER_PLAYLIST_ITEM,v);n.jwAddEventListener(f.JWPLAYER_ERROR,w);V();function V(){ab.display=L("div","display");ab.display_text=L("div","display_text");ab.display.appendChild(ab.display_text);ab.display_image=L("img","display_image");ab.display_image.onerror=function(ad){a(ab.display_image)};ab.display_image.onload=G;ab.display_icon=L("div","display_icon");ab.display_iconBackground=L("div","display_iconBackground");ab.display.appendChild(ab.display_image);ab.display_iconBackground.appendChild(ab.display_icon);ab.display.appendChild(ab.display_iconBackground);l();setTimeout((function(){t=true;if(ac.icons.toString()=="true"){O()}}),1)}this.getDisplayElement=function(){return ab.display};this.resize=function(ae,ad){if(n.jwGetFullscreen()&&e.isMobile()){return}c(ab.display,{width:ae,height:ad});c(ab.display_text,{width:(ae-10),top:((ad-e.getBoundingClientRect(ab.display_text).height)/2)});c(ab.display_iconBackground,{top:((ad-n.skin.getSkinElement("display","background").height)/2),left:((ae-n.skin.getSkinElement("display","background").width)/2)});if(k!=ae||B!=ad){k=ae;B=ad;j=undefined;O()}if(!n.jwGetFullscreen()){D=ae;W=ad}i();v({})};this.show=function(){if(m){m=false;y(n.jwGetState())}};this.hide=function(){if(!m){K();m=true}};function G(ad){E=ab.display_image.naturalWidth;Y=ab.display_image.naturalHeight;i();if(n.jwGetState()==d.IDLE){c(ab.display_image,{display:"block",opacity:0});e.fadeTo(ab.display_image,1,0.1)}H=false}function i(){if(n.jwGetFullscreen()&&n.jwGetStretching()==e.stretching.EXACTFIT){var ad=document.createElement("div");e.stretch(e.stretching.UNIFORM,ad,k,B,D,W);e.stretch(e.stretching.EXACTFIT,ab.display_image,e.parseDimension(ad.style.width),e.parseDimension(ad.style.height),E,Y);c(ab.display_image,{left:ad.style.left,top:ad.style.top})}else{e.stretch(n.jwGetStretching(),ab.display_image,k,B,E,Y)}}function L(ad,af){var ae=document.createElement(ad);ae.id=n.id+"_jwplayer_"+af;c(ae,M[af].style);return ae}function l(){for(var ad in ab){if(e.exists(M[ad].click)){ab[ad].onclick=M[ad].click}}}function s(ad){if(typeof ad.preventDefault!="undefined"){ad.preventDefault()}else{ad.returnValue=false}if(typeof r=="function"){r(ad);return}else{if(n.jwGetState()!=d.PLAYING){n.jwPlay()}else{n.jwPause()}}}function Z(ad){if(J){K();return}ab.display_icon.style.backgroundImage=(["url(",n.skin.getSkinElement("display",ad).src,")"]).join("");c(ab.display_icon,{width:n.skin.getSkinElement("display",ad).width,height:n.skin.getSkinElement("display",ad).height,top:(n.skin.getSkinElement("display","background").height-n.skin.getSkinElement("display",ad).height)/2,left:(n.skin.getSkinElement("display","background").width-n.skin.getSkinElement("display",ad).width)/2});h();if(e.exists(n.skin.getSkinElement("display",ad+"Over"))){ab.display_icon.onmouseover=function(ae){ab.display_icon.style.backgroundImage=["url(",n.skin.getSkinElement("display",ad+"Over").src,")"].join("")};ab.display_icon.onmouseout=function(ae){ab.display_icon.style.backgroundImage=["url(",n.skin.getSkinElement("display",ad).src,")"].join("")}}else{ab.display_icon.onmouseover=null;ab.display_icon.onmouseout=null}}function K(){if(ac.icons.toString()=="true"){a(ab.display_icon);a(ab.display_iconBackground);X()}}function h(){if(!m&&ac.icons.toString()=="true"){g(ab.display_icon);g(ab.display_iconBackground);O()}}function w(ad){J=true;K();ab.display_text.innerHTML=ad.message;g(ab.display_text);ab.display_text.style.top=((B-e.getBoundingClientRect(ab.display_text).height)/2)+"px"}function N(){aa=false;ab.display_image.style.display="none"}function U(){A=""}function v(ad){if((ad.type==f.JWPLAYER_PLAYER_STATE||ad.type==f.JWPLAYER_PLAYLIST_ITEM)&&J){J=false;a(ab.display_text)}var ae=n.jwGetState();if(ae==A){return}A=ae;if(I>=0){clearTimeout(I)}if(T||n.jwGetState()==d.PLAYING||n.jwGetState()==d.PAUSED){y(n.jwGetState())}else{I=setTimeout(q(n.jwGetState()),500)}}function q(ad){return(function(){y(ad)})}function y(ad){if(e.exists(R)){clearInterval(R);R=null;e.animations.rotate(ab.display_icon,0)}switch(ad){case d.BUFFERING:if(e.isIPod()){N();K()}else{if(n.jwGetPlaylist()[n.jwGetPlaylistIndex()].provider=="sound"){C()}z=0;R=setInterval(function(){z+=S;e.animations.rotate(ab.display_icon,z%360)},x);Z("bufferIcon");T=true}break;case d.PAUSED:if(!e.isIPod()){if(n.jwGetPlaylist()[n.jwGetPlaylistIndex()].provider!="sound"){c(ab.display_image,{background:"transparent no-repeat center center"})}Z("playIcon");T=true}break;case d.IDLE:if(n.jwGetPlaylist()[n.jwGetPlaylistIndex()]&&n.jwGetPlaylist()[n.jwGetPlaylistIndex()].image){C()}else{N()}Z("playIcon");T=true;break;default:if(n.jwGetPlaylist()[n.jwGetPlaylistIndex()]&&n.jwGetPlaylist()[n.jwGetPlaylistIndex()].provider=="sound"){if(e.isIPod()){N();T=false}else{C()}}else{N();T=false}if(n.jwGetMute()&&ac.showmute){Z("muteIcon")}else{K()}break}I=-1}function C(){if(n.jwGetPlaylist()[n.jwGetPlaylistIndex()]){var ad=n.jwGetPlaylist()[n.jwGetPlaylistIndex()].image;if(ad){if(ad!=u){u=ad;H=true;ab.display_image.src=e.getAbsolutePath(ad)}else{if(!(H||aa)){aa=true;ab.display_image.style.opacity=0;ab.display_image.style.display="block";e.fadeTo(ab.display_image,1,0.1)}}}}}function F(ad){return function(){if(!t){return}if(!m&&j!=ad){j=ad;Q.sendEvent(ad,{component:"display",boundingRect:e.getDimensions(ab.display_iconBackground)})}}}var O=F(f.JWPLAYER_COMPONENT_SHOW);var X=F(f.JWPLAYER_COMPONENT_HIDE);this.setAlternateClickHandler=function(ad){r=ad};this.revertAlternateClickHandler=function(){r=undefined};return this}})(jwplayer.html5);(function(a){var b=jwplayer.utils,c=jwplayer.events;a.model=function(d){var j=this,f,l,m=b.getCookies(),h={width:480,height:320,item:0,playlist:undefined,skin:undefined,volume:90,mute:false,autostart:false,debug:undefined};function i(n){return n}function k(){b.extend(j,new c.eventdispatcher());b.extend(j,{id:d.id,state:c.state.IDLE,position:0,buffer:0,playlist:[],config:b.extend({},h,m,i(d))});j.setItem(j.config.item);l=document.createElement("video");f=new a.video(l);f.addGlobalListener(e)}var g={};g[c.JWPLAYER_MEDIA_MUTE]="mute";g[c.JWPLAYER_MEDIA_VOLUME]="volume";g[c.JWPLAYER_PLAYER_STATE]="newstate->state";g[c.JWPLAYER_MEDIA_BUFFER]="bufferPercent->buffer";g[c.JWPLAYER_MEDIA_TIME]="position";function e(n){var p=g[n.type];if(p){var q=p.split("->"),r=q[0],o=q[1]?q[1]:r;if(j[o]!=n[r]){j[o]=n[r];j.sendEvent(n.type,n)}}else{j.sendEvent(n.type,n)}}this.getVideo=function(){return f};this.setFullscreen=function(n){if(n!=j.fullscreen){j.fullscreen=n;j.sendEvent(c.JWPLAYER_FULLSCREEN,{fullscreen:n})}};this.setItem=function(n){var o;if(n==j.playlist.length||n<-1){o=0}else{if(n==-1||n>j.playlist.length){o=j.playlist.length-1}else{o=n}}if(o!=j.item){j.item=o;j.sendEvent(c.JWPLAYER_PLAYLIST_ITEM,{index:j.item})}};k()}})(jwplayer.html5);(function(a){a.player=function(b){var j=this,h=new a.model(b),e=new a.view(this,h),f=new a.controller(h,e);function i(){j.id=h.id;var k=new a.setup(h,e,f);k.addEventListener(jwplayer.events.JWPLAYER_READY,c);k.addEventListener(jwplayer.events.JWPLAYER_ERROR,g);k.start()}function c(k){f.sendEvent(k.type,k);f.load()}function g(k){console.log(k);alert("Can't set up: "+k.message)}this.jwPlay=f.play;this.jwPause=f.pause;this.jwStop=f.stop;this.jwSeek=f.seek;this.jwSetVolume=f.setVolume;this.jwSetMute=f.setMute;this.jwLoad=f.load;this.jwPlaylistNext=f.next;this.jwPlaylistPrev=f.prev;this.jwPlaylistItem=f.item;this.jwSetFullscreen=f.setFullscreen;function d(k){return function(){return h[k]}}this.jwGetPlaylistIndex=d("item");this.jwGetPosition=d("position");this.jwGetDuration=d("duration");this.jwGetBuffer=d("buffer");this.jwGetWidth=d("width");this.jwGetHeight=d("height");this.jwGetFullscreen=d("fullscreen");this.jwGetVolume=d("volume");this.jwGetMute=d("mute");this.jwGetState=d("state");this.jwGetStretching=d("stretching");this.jwGetPlaylist=d("playlist");this.jwAddEventListener=f.addEventListener;this.jwRemoveEventListener=f.removeEventListener;i()}})(jwplayer.html5);(function(a){var b=jwplayer.utils;a.playlist=function(c){var e=[];if(c&&c instanceof Array&&c.length>0){for(var d in c){if(!isNaN(parseInt(d))){e.push(new a.playlistitem(c[d]))}}}else{e.push(new a.playlistitem(c))}return e}})(jwplayer.html5);(function(a){a.playlistitem=function(c){var d={description:"",image:"",link:"",mediaid:"",title:"",provider:"",file:"",duration:-1,start:0,currentLevel:-1,levels:[]};var b=jwplayer.utils.extend({},d,c);if(b.levels.length===0){b.levels[0]=new a.playlistitemlevel(b)}return b}})(jwplayer.html5);(function(a){a.html5.playlistitemlevel=function(b){var d={file:"",streamer:"",bitrate:0,width:0};for(var c in d){if(a.utils.exists(b[c])){d[c]=b[c]}}return d}})(jwplayer);(function(a){var d=jwplayer,b=d.utils,c=d.events;a.playlistloader=function(){var f=new c.eventdispatcher();b.extend(this,f);this.load=function(h){b.ajax(h,g,e)};function g(i){try{var h=a.parsers.rssparser.parse(i.responseXML.firstChild);f.sendEvent(c.JWPLAYER_PLAYLIST_LOADED,{playlist:new a.playlist(h)})}catch(j){e("Could not load the playlist.")}}function e(h){f.sendEvent(c.JWPLAYER_ERROR,{message:h?h:"Could not load playlist an unknown reason."})}}})(jwplayer.html5);(function(f){var h=jwplayer,k=h.utils,e=h.events,i="config",d="skin",c="playlist",j="preview",b="components",a="plugins",g="ready";f.setup=function(q,F,G){var J=q,o=F,D=G,s={},A={},y,x=new e.eventdispatcher(),t=false,u=[];function r(){p(i,n);p(d,N,i);p(c,w,i);p(j,I,c);p(b,M,d);p(a,H,b);p(g,B,a)}function p(O,Q,P){u.push({name:O,method:Q,depends:P})}function E(){for(var Q=0;Q<u.length;Q++){var O=u[Q];if(!O.depends||s[O.depends]){u.splice(Q,1);try{O.method();E()}catch(P){v(P.message)}return}}if(u.length>0&&!t){setTimeout(E,500)}}function m(O){s[O]=true}function n(){m(i)}function N(){new f.skinloader(J.config.skin,z,L)}function z(O){y=O;m(d)}function L(O){v(O.message)}function w(){switch(k.typeOf(J.config.playlist)){case"string":var O=new f.playlistloader();O.addEventListener(e.JWPLAYER_PLAYLIST_LOADED,l);O.addEventListener(e.JWPLAYER_ERROR,C);O.load(J.config.playlist);break;case"array":J.playlist=new f.playlist(J.config.playlist);m(c)}}function l(O){J.playlist=O.playlist;m(c)}function C(O){v(O.message)}function I(){var P=J.playlist[J.item].image;if(P){var O=new Image();O.addEventListener("load",K,false);O.addEventListener("error",K,false);O.src=P}}function K(O){m(j)}function M(){o.setup(y);m(b)}function H(){m(a)}function B(){x.sendEvent(e.JWPLAYER_READY);m(g)}function v(O){t=true;x.sendEvent(e.JWPLAYER_ERROR,{message:O})}k.extend(this,x);this.start=E;r()}})(jwplayer.html5);(function(a){a.skin=function(){var b={};var c=false;this.load=function(d,e){new a.skinloader(d,function(f){c=true;b=f;e()},function(){new a.skinloader("",function(f){c=true;b=f;e()})})};this.getSkinElement=function(d,e){if(c){try{return b[d].elements[e]}catch(f){jwplayer.utils.log("No such skin component / element: ",[d,e])}}return null};this.getComponentSettings=function(d){if(c&&b&&b[d]){return b[d].settings}return null};this.getComponentLayout=function(d){if(c){var e=b[d].layout;if(e&&(e.left||e.right||e.center)){return b[d].layout}}return null}}})(jwplayer.html5);(function(a){var b=jwplayer.utils;a.skinloader=function(g,p,k){var o={};var d=p;var l=k;var f=true;var j;var n=g;var s=false;function m(){if(typeof n!="string"||n===""){e(a.defaultskin().xml)}else{b.ajax(b.getAbsolutePath(n),function(t){try{if(b.exists(t.responseXML)){e(t.responseXML);return}}catch(u){i()}e(a.defaultskin().xml)},function(t){e(a.defaultskin().xml)})}}function e(y){var E=y.getElementsByTagName("component");if(E.length===0){return}for(var H=0;H<E.length;H++){var C=E[H].getAttribute("name");var B={settings:{},elements:{},layout:{}};o[C]=B;var G=E[H].getElementsByTagName("elements")[0].getElementsByTagName("element");for(var F=0;F<G.length;F++){c(G[F],C)}var z=E[H].getElementsByTagName("settings")[0];if(z&&z.childNodes.length>0){var K=z.getElementsByTagName("setting");for(var P=0;P<K.length;P++){var Q=K[P].getAttribute("name");var I=K[P].getAttribute("value");var x=/color$/.test(Q)?"color":null;o[C].settings[Q]=b.typechecker(I,x)}}var L=E[H].getElementsByTagName("layout")[0];if(L&&L.childNodes.length>0){var M=L.getElementsByTagName("group");for(var w=0;w<M.length;w++){var A=M[w];o[C].layout[A.getAttribute("position")]={elements:[]};for(var O=0;O<A.attributes.length;O++){var D=A.attributes[O];o[C].layout[A.getAttribute("position")][D.name]=D.value}var N=A.getElementsByTagName("*");for(var v=0;v<N.length;v++){var t=N[v];o[C].layout[A.getAttribute("position")].elements.push({type:t.tagName});for(var u=0;u<t.attributes.length;u++){var J=t.attributes[u];o[C].layout[A.getAttribute("position")].elements[v][J.name]=J.value}if(!b.exists(o[C].layout[A.getAttribute("position")].elements[v].name)){o[C].layout[A.getAttribute("position")].elements[v].name=t.tagName}}}}f=false;r()}}function r(){clearInterval(j);if(!s){j=setInterval(function(){q()},100)}}function c(y,x){var w=new Image();var t=y.getAttribute("name");var v=y.getAttribute("src");var A;if(v.indexOf("data:image/png;base64,")===0){A=v}else{var u=b.getAbsolutePath(n);var z=u.substr(0,u.lastIndexOf("/"));A=[z,x,v].join("/")}o[x].elements[t]={height:0,width:0,src:"",ready:false,image:w};w.onload=function(B){h(w,t,x)};w.onerror=function(B){s=true;r();l()};w.src=A}function i(){for(var u in o){var w=o[u];for(var t in w.elements){var x=w.elements[t];var v=x.image;v.onload=null;v.onerror=null;delete x.image;delete w.elements[t]}delete o[u]}}function q(){for(var t in o){if(t!="properties"){for(var u in o[t].elements){if(!o[t].elements[u].ready){return}}}}if(f===false){clearInterval(j);d(o)}}function h(t,v,u){if(o[u]&&o[u].elements[v]){o[u].elements[v].height=t.height;o[u].elements[v].width=t.width;o[u].elements[v].src=t.src;o[u].elements[v].ready=true;r()}else{b.log("Loaded an image for a missing element: "+u+"."+v)}}m()}})(jwplayer.html5);(function(a){var f=jwplayer,d=f.utils,e=f.events,c=e.state,b=d.isMobile();a.video=function(D){var w={abort:t,canplay:J,canplaythrough:t,durationchange:h,emptied:t,ended:t,error:A,loadeddata:t,loadedmetadata:J,loadstart:t,pause:o,play:o,playing:o,progress:t,ratechange:t,readystatechange:t,seeked:t,seeking:t,stalled:t,suspend:t,timeupdate:k,volumechange:G,waiting:x},s,m,l,E,y,v,H=c.IDLE,r=0,n=-1,z=-1,p=new e.eventdispatcher();d.extend(this,p);function u(L){s=L;K();s.controls=true;s.controls=false}function K(){for(var L in w){s.addEventListener(L,w[L],false)}}function C(L,M){p.sendEvent(L,M)}function t(L){}function h(L){m=s.duration;k()}function k(L){if(H==c.PLAYING){l=s.currentTime;C(e.JWPLAYER_MEDIA_TIME,{position:l,duration:m});if(l>=m&&m>0){F()}}}function J(L){if(!y){y=true;C(e.JWPLAYER_MEDIA_BUFFER_FULL);if(v>0){B(v)}}}function o(L){if(s.paused){I(c.PAUSED)}else{I(c.PLAYING)}}function x(L){I(c.BUFFERING)}function A(L){d.log("Error: %o",s.error);I(c.IDLE)}this.load=function(L){y=false;v=0;m=0;l=0;I(c.BUFFERING);s.src=L;s.load();n=setInterval(i,100);if(b){s.controls=true;s.style.opacity=1}};var q=this.stop=function(){s.removeAttribute("src");s.load();s.style.opacity=0;clearInterval(n);I(c.IDLE)};this.play=function(){s.style.opacity=1;s.play()};this.pause=function(){s.pause()};var B=this.seek=function(L){if(y){v=0;C(e.JWPLAYER_MEDIA_SEEK,{position:l,offset:L});s.currentTime=L}else{v=L}};var j=this.volume=function(L){if(s.muted){s.muted=false}s.volume=L/100};function G(L){C(e.JWPLAYER_MEDIA_VOLUME,{volume:Math.round(s.volume*100)});C(e.JWPLAYER_MEDIA_MUTE,{mute:s.muted})}this.mute=function(L){if(!d.exists(L)){L=!s.mute}if(L){r=s.volume*100;j(0);s.muted=true}else{j(r)}};function I(L){if(L==c.PAUSED&&H==c.IDLE){return}if(H!=L){var M=H;H=L;C(e.JWPLAYER_PLAYER_STATE,{oldstate:M,newstate:L})}}function i(){var L=g();if(L!=z){z=L;C(e.JWPLAYER_MEDIA_BUFFER,{bufferPercent:Math.round(z*100)})}if(L>=1){clearInterval(n)}}function g(){if(s.buffered.length==0||s.duration==0){return 0}else{return s.buffered.end(s.buffered.length-1)/s.duration}}function F(){q();C(e.JWPLAYER_MEDIA_COMPLETE)}this.getTag=function(){return D};u(D)}})(jwplayer.html5);(function(a){var g=jwplayer,e=g.utils,d=document,c="jwplayer",b="jwvideocontainer",f="jwcontrolscontainer";a.view=function(m,l){var p=m,n=l,s={},k,h;this.setup=function(t){p.skin=t;k=d.getElementById(p.id);k.className=c;h=d.createElement("span");h.className=b;h.appendChild(n.getVideo().getTag());_controlsLayer=d.createElement("span");_controlsLayer.className=f;if(!e.isMobile()){s.controlbar=new a.controlbar(p);_controlsLayer.appendChild(s.controlbar.getDisplayElement())}k.appendChild(h);k.appendChild(_controlsLayer);d.addEventListener("webkitfullscreenchange",r,false);d.addEventListener("mozfullscreenchange",r,false);d.addEventListener("keydown",o,false)};var q=this.fullscreen=function(t){if(!e.exists(t)){t=!n.fullscreen}if(t){if(!n.fullscreen){j(true);if(k.requestFullScreen){k.requestFullScreen()}else{if(k.mozRequestFullScreen){k.mozRequestFullScreen()}else{if(k.webkitRequestFullScreenWithKeys){k.webkitRequestFullScreenWithKeys()}else{if(k.webkitRequestFullScreen){k.webkitRequestFullScreen()}}}}}n.setFullscreen(true)}else{j(false);if(d.cancelFullScreen){d.cancelFullScreen()}else{if(d.mozCancelFullScreen){d.mozCancelFullScreen()}else{if(d.webkitCancelFullScreen){d.webkitCancelFullScreen()}}}n.setFullscreen(false)}};this.resize=function(u,t){return};function o(t){switch(t.keyCode){case 27:if(n.fullscreen){q(false)}break;case 32:p.jwPlay();break}}function j(t){if(t){k.className+=" jwfullscreen"}else{k.className=k.className.replace(/\s+jwfullscreen/,"")}}function i(){return(d.mozFullScreenElement==k||d.webkitCurrentFullScreenElement==k)}function r(t){n.setFullscreen(i());q(n.fullscreen)}};e.appendStylesheet("."+b+" ,."+f,{width:"100%",height:"100%",display:"inline-block",position:"absolute"});e.appendStylesheet("."+b+" video",{width:"100%",height:"100%",background:"#000",opacity:0,"-webkit-transition":"opacity .15s ease"});e.appendStylesheet("."+c+":-webkit-full-screen",{width:"100% !important",height:"100% !important"});e.appendStylesheet("."+c+":-moz-full-screen",{width:"100% !important",height:"100% !important"});e.appendStylesheet("."+c+".jwfullscreen",{left:0,right:0,top:0,bottom:0,"z-index":1000,position:"fixed !important"})})(jwplayer.html5);(function(a){a.parsers={localName:function(b){if(!b){return""}else{if(b.localName){return b.localName}else{if(b.baseName){return b.baseName}else{return""}}}},textContent:function(b){if(!b){return""}else{if(b.textContent){return b.textContent}else{if(b.text){return b.text}else{return""}}}},getChildNode:function(c,b){return c.childNodes[b]},numChildren:function(b){if(b.childNodes){return b.childNodes.length}else{return 0}}}})(jwplayer.html5);(function(b){var a=b.html5.parsers;var d=a.jwparser=function(){};var c="jwplayer";d.parseEntry=function(h,j){for(var f=0;f<h.childNodes.length;f++){var g=h.childNodes[f];if(g.prefix==c){var e=a.localName(g);j[e]=b.utils.strings.serialize(a.textContent(g));if(e=="file"&&j.levels){delete j.levels}}if(!j.file){j.file=j.link}}return j}})(jwplayer);(function(d){var h=jwplayer.utils.strings,g=h.xmlAttribute,b=d.localName,a=d.textContent,c=d.numChildren;var f=d.mediaparser=function(){};var e="media";f.parseGroup=function(m,n){for(var k=0;k<c(m);k++){var l=m.childNodes[k];if(l.prefix==e){if(!b(l)){continue}switch(b(l).toLowerCase()){case"content":n.file=g(l,"url");if(g(l,"duration")){n.duration=h.seconds(g(l,"duration"))}if(g(l,"start")){n.start=h.seconds(g(l,"start"))}if(c(l)>0){n=f.parseGroup(l,n)}if(g(l,"width")||g(l,"bitrate")||g(l,"url")){if(!n.levels){n.levels=[]}n.levels.push({width:g(l,"width"),bitrate:g(l,"bitrate"),file:g(l,"url")})}break;case"title":n.title=a(l);break;case"description":n.description=a(l);break;case"keywords":n.tags=a(l);break;case"thumbnail":n.image=g(l,"url");break;case"credit":n.author=a(l);break;case"player":var j=l.url;break;case"group":f.parseGroup(l,n);break}}}return n}})(jwplayer.html5.parsers);(function(f){var g=jwplayer.utils,a=f.textContent,d=f.getChildNode,e=f.numChildren,c=f.localName;f.rssparser={};f.rssparser.parse=function(o){var h=[];for(var m=0;m<e(o);m++){var n=d(o,m),k=c(n).toLowerCase();if(k=="channel"){for(var l=0;l<e(n);l++){var p=d(n,l);if(c(p).toLowerCase()=="item"){h.push(b(p))}}}}return h};function b(l){var m={};for(var j=0;j<l.childNodes.length;j++){var k=l.childNodes[j];var h=c(k);if(!h){continue}switch(h.toLowerCase()){case"enclosure":m.file=g.strings.xmlAttribute(k,"url");break;case"title":m.title=a(k);break;case"pubdate":m.date=a(k);break;case"description":m.description=a(k);break;case"link":m.link=a(k);break;case"category":if(m.tags){m.tags+=a(k)}else{m.tags=a(k)}break}}m=f.mediaparser.parseGroup(l,m);m=f.jwparser.parseEntry(l,m);return new jwplayer.html5.playlistitem(m)}})(jwplayer.html5.parsers)}; 
  • branches/jw6/src/js/html5/jwplayer.html5.controlbar.js

    r2175 r2177  
    152152                        _api = api; 
    153153 
    154                         config = _utils.extend({}, config); 
    155154                        _id = _api.id + "_controlbar"; 
    156155                        _duration = 0; 
     
    166165                        _skin = _api.skin; 
    167166                         
    168                         _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, _api.settings.controlbar); 
     167                        _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, config); 
    169168                        _layout = (_skin.controlbar.layout.left || _skin.controlbar.layout.right || _skin.controlbar.layout.center) ? _skin.controlbar.layout : _defaults.layout; 
    170169                        _createStyles(); 
     
    200199                function _stateHandler(evt) { 
    201200                        switch (evt.newstate) { 
     201                        case jwplayer.events.state.BUFFERING: 
    202202                        case jwplayer.events.state.PLAYING: 
    203                         case jwplayer.events.state.BUFFERING: 
    204203                                if (_elements['timeSliderThumb']) { 
    205204                                        _elements['timeSliderThumb'].style.opacity = 1; 
    206                                 } 
    207                                 if (_elements["timeRail"]) { 
    208                                         _elements["timeRail"].className = "jwrail jwsmooth"; 
    209205                                } 
    210206                                _toggleButton("play", true); 
     
    221217                                        _elements['timeSliderThumb'].style.opacity = 0; 
    222218                                } 
     219                                if (_elements["timeRail"]) { 
     220                                        _elements["timeRail"].className = "jwrail"; 
     221                                        setTimeout(function() { 
     222                                                // Temporarily disable the buffer animation 
     223                                                _elements["timeRail"].className += " jwsmooth"; 
     224                                        }, 100); 
     225                                } 
    223226                                _setBuffer(0); 
    224227                                _timeUpdated({ position: 0, duration: 0}); 
    225                                 if (_elements["timeRail"]) { 
    226                                         _elements["timeRail"].className = "jwrail"; 
    227                                 } 
    228228                                break; 
    229229                        } 
     
    323323                function _buildImage(name, style, stretch, nocenter) { 
    324324                        var element = _createSpan(); 
    325                         //element.id = _createElementId(name); 
    326325                        element.className = 'jw'+name; 
    327326                         
     
    358357                         
    359358                        var element = document.createElement("button"); 
    360                         //element.id = _createElementId(name); 
    361359                        element.className = 'jw'+name; 
    362360                        element.addEventListener("click", _buttonClickHandler(name), false); 
     
    448446                        } 
    449447                        if (_elements[name]) { 
    450                                 _elements[name].className = 'jw' + name + (state ? " jwtoggle" : ""); 
     448                                _elements[name].className = 'jw' + name + (state ? " jwtoggle jwtoggling" : " jwtoggling"); 
     449                                // Use the jwtoggling class to temporarily disable the animation; 
     450                                setTimeout(function() { 
     451                                        _elements[name].className = _elements[name].className.replace(" jwtoggling", "");  
     452                                }, 100); 
    451453                        } 
    452454                        _toggleStates[name] = state; 
     
    722724        } 
    723725 
    724         /** 
    725          * General JW Player controlbar styles -- should only be executed once 
    726          **/ 
    727         function _generalStyles() { 
    728                 _style(CB_CLASS, { 
    729                         position: JW_CSS_ABSOLUTE, 
    730                         overflow: 'hidden', 
    731                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    732                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    733                 '-o-transition': JW_CSS_SMOOTH_EASE 
    734                 }) 
    735                 _style(CB_CLASS+' span',{ 
    736                         height: JW_CSS_100PCT, 
    737                         '-webkit-user-select': JW_CSS_NONE, 
    738                         '-webkit-user-drag': JW_CSS_NONE, 
    739                         'user-select': JW_CSS_NONE, 
    740                         'user-drag': JW_CSS_NONE 
    741                 }); 
    742             _style(CB_CLASS+' .jwgroup', { 
    743                 display: JW_CSS_INLINE 
    744             }); 
    745             _style(CB_CLASS+' span, '+CB_CLASS+' .jwgroup button,'+CB_CLASS+' .jwleft', { 
    746                 position: JW_CSS_RELATIVE, 
    747                         'float': JW_CSS_LEFT 
    748             }); 
    749                 _style(CB_CLASS+' .jwright', { 
    750                         position: JW_CSS_ABSOLUTE 
    751                 }); 
    752             _style(CB_CLASS+' .jwcenter', { 
    753                 position: JW_CSS_ABSOLUTE 
    754             }); 
    755             _style(CB_CLASS+' button', { 
    756                 display: JW_CSS_INLINE_BLOCK, 
    757                 height: JW_CSS_100PCT, 
    758                 border: JW_CSS_NONE, 
    759                 cursor: 'pointer', 
    760                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    761                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    762                 '-o-transition': JW_CSS_SMOOTH_EASE 
    763             }); 
    764             _style(CB_CLASS+' .jwcapRight', {  
    765                         right: 0, 
    766                         position: JW_CSS_ABSOLUTE 
    767                 }); 
    768             _style(CB_CLASS+' .jwtime,' + CB_CLASS + ' .jwgroup span.jwstretch', { 
    769                 position: JW_CSS_ABSOLUTE, 
    770                 height: JW_CSS_100PCT, 
    771                 width: JW_CSS_100PCT, 
    772                 left: 0 
    773             }); 
    774             _style(CB_CLASS+' .jwrail,' + CB_CLASS + ' .jwthumb', { 
    775                 position: JW_CSS_ABSOLUTE, 
    776                 height: JW_CSS_100PCT, 
    777                 cursor: 'pointer' 
    778             }); 
    779             _style(CB_CLASS + ' .jwtime .jwsmooth span', { 
    780                 '-webkit-transition': JW_CSS_SMOOTH_EASE, 
    781                 '-moz-transition': JW_CSS_SMOOTH_EASE, 
    782                 '-o-transition': JW_CSS_SMOOTH_EASE 
    783             }); 
    784             _style(CB_CLASS + ' .jwdivider+.jwdivider', { 
    785                 display: JW_CSS_NONE 
    786             }); 
    787             _style(CB_CLASS + ' .jwtext', { 
    788                         padding: '0 5px', 
    789                         'text-align': 'center' 
    790                 }); 
    791  
    792         } 
     726        /************************************************************* 
     727         * Player stylesheets - done once on script initialization;  * 
     728         * These CSS rules are used for all JW Player instances      * 
     729         *************************************************************/ 
     730 
     731        _style(CB_CLASS, { 
     732                position: JW_CSS_ABSOLUTE, 
     733                overflow: 'hidden', 
     734        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     735        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     736        '-o-transition': JW_CSS_SMOOTH_EASE 
     737        }) 
    793738         
    794         _generalStyles(); 
     739        _style(CB_CLASS+' span',{ 
     740                height: JW_CSS_100PCT, 
     741                '-webkit-user-select': JW_CSS_NONE, 
     742                '-webkit-user-drag': JW_CSS_NONE, 
     743                'user-select': JW_CSS_NONE, 
     744                'user-drag': JW_CSS_NONE 
     745        }); 
     746         
     747    _style(CB_CLASS+' .jwgroup', { 
     748        display: JW_CSS_INLINE 
     749    }); 
     750     
     751    _style(CB_CLASS+' span, '+CB_CLASS+' .jwgroup button,'+CB_CLASS+' .jwleft', { 
     752        position: JW_CSS_RELATIVE, 
     753                'float': JW_CSS_LEFT 
     754    }); 
     755     
     756        _style(CB_CLASS+' .jwright', { 
     757                position: JW_CSS_ABSOLUTE 
     758        }); 
     759         
     760    _style(CB_CLASS+' .jwcenter', { 
     761        position: JW_CSS_ABSOLUTE 
     762    }); 
     763     
     764    _style(CB_CLASS+' button', { 
     765        display: JW_CSS_INLINE_BLOCK, 
     766        height: JW_CSS_100PCT, 
     767        border: JW_CSS_NONE, 
     768        cursor: 'pointer', 
     769        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     770        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     771        '-o-transition': JW_CSS_SMOOTH_EASE 
     772    }); 
     773     
     774    _style(CB_CLASS+' .jwcapRight', {  
     775                right: 0, 
     776                position: JW_CSS_ABSOLUTE 
     777        }); 
     778     
     779    _style(CB_CLASS+' .jwtime,' + CB_CLASS + ' .jwgroup span.jwstretch', { 
     780        position: JW_CSS_ABSOLUTE, 
     781        height: JW_CSS_100PCT, 
     782        width: JW_CSS_100PCT, 
     783        left: 0 
     784    }); 
     785     
     786    
     787     
     788    _style(CB_CLASS+' .jwrail,' + CB_CLASS + ' .jwthumb', { 
     789        position: JW_CSS_ABSOLUTE, 
     790        height: JW_CSS_100PCT, 
     791        cursor: 'pointer' 
     792    }); 
     793     
     794    _style(CB_CLASS + ' .jwtime .jwsmooth span', { 
     795        '-webkit-transition': JW_CSS_SMOOTH_EASE, 
     796        '-moz-transition': JW_CSS_SMOOTH_EASE, 
     797        '-o-transition': JW_CSS_SMOOTH_EASE 
     798    }); 
     799     
     800    _style(CB_CLASS + ' .jwdivider+.jwdivider', { 
     801        display: JW_CSS_NONE 
     802    }); 
     803     
     804    _style(CB_CLASS + ' .jwtext', { 
     805                padding: '0 5px', 
     806                'text-align': 'center' 
     807        }); 
     808     
     809    _style(CB_CLASS + ' .jwtoggling', { 
     810        '-webkit-transition': JW_CSS_NONE, 
     811        '-moz-transition': JW_CSS_NONE, 
     812        '-o-transition': JW_CSS_NONE 
     813    }); 
    795814         
    796815})(jwplayer); 
  • branches/jw6/src/js/html5/jwplayer.html5.controller.js

    r2175 r2177  
    1111                _states = _events.state; 
    1212         
    13         html5.controller = function(model) { 
    14                 var _model = model,  
     13        html5.controller = function(model, view) { 
     14                var _model = model, 
     15                        _view = view, 
    1516                        _video = model.getVideo(), 
    16 //                      _debug = 'console', 
    17                         _eventDispatcher = new _events.eventdispatcher(_model.id); 
     17                        _eventDispatcher = new _events.eventdispatcher(_model.id, _model.config.debug); 
    1818                 
    1919                _utils.extend(this, _eventDispatcher); 
     
    3434                var file; 
    3535                 
    36                 this.load = function(item) { 
    37                         if (_video.getTag().canPlayType("video/mp4")) { 
    38                                 file = "http://playertest.longtailvideo.com/bunny.mp4";          
    39                         } else if (_video.getTag().canPlayType("video/webm")) { 
    40                                 file = "http://playertest.longtailvideo.com/bunny.webm";                 
    41                         } else { 
    42                                 file = "http://playertest.longtailvideo.com/bunny.ogv";          
     36                function _load(item) { 
     37                        if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 
     38                                _video.stop(); 
    4339                        } 
    44                         if (_utils.isMobile()) { 
    45                                 _video.load(file); 
     40                         
     41                        switch (_utils.typeOf(item)) { 
     42                        case "string": 
     43                                file = item; 
     44                                break; 
     45                        case "object": 
     46                                file = item.file; 
     47                                break; 
     48                        case "number": 
     49                                file = _model.playlist[item].file; 
     50                                break; 
     51                        default: 
     52                                file = _model.playlist[_model.item].file; 
    4653                        } 
     54                                 
     55//                      if (_video.getTag().canPlayType("video/mp4")) { 
     56//                              file = "http://playertest.longtailvideo.com/bunny.mp4";          
     57//                      } else if (_video.getTag().canPlayType("video/webm")) { 
     58//                              file = "http://playertest.longtailvideo.com/bunny.webm";                 
     59//                      } else { 
     60//                              file = "http://playertest.longtailvideo.com/bunny.ogv";          
     61//                      } 
     62//                      if (_utils.isMobile()) { 
     63//                              _video.load(file); 
     64//                      } 
    4765                } 
    4866                 
    49                 this.play = function() { 
     67                function _play() { 
    5068                        if (_model.state == _states.IDLE) { 
    5169                                _video.load(file); 
     
    5573                } 
    5674 
    57                 this.stop = function() { 
     75                function _stop() { 
    5876                        _video.stop(); 
    5977                } 
    6078 
    61                 this.pause = function() { 
     79                function _pause() { 
    6280                        if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 
    6381                                _video.pause(); 
     
    6583                } 
    6684 
    67                 this.seek = function(pos) { 
     85                function _seek(pos) { 
    6886                        _video.seek(pos); 
    6987                } 
    7088                 
    71                 this.volume = function(vol) { 
     89                function _setVolume(vol) { 
    7290                        _video.volume(vol); 
    7391                } 
    7492                 
    75                 this.mute = function(state) { 
     93                function _setMute(state) { 
    7694                        if (!_utils.exists(state)) state = !_model.mute; 
    7795                        _video.mute(state); 
    7896                } 
    79  
    80                 this.prev = function() { 
     97                 
     98                function _setFullscreen(state) { 
     99                        _view.fullscreen(state); 
    81100                } 
    82101 
    83                 this.next = function() { 
     102                 
     103                function _item(item) { 
     104                        _stop(); 
     105                        _model.setItem(item); 
     106                        _load(_model.item); 
     107                        _play(); 
    84108                } 
    85109                 
    86                 this.item = function(item) {} 
     110                function _prev() { 
     111                        _item(_model.item - 1); 
     112                } 
     113                 
     114                function _next() { 
     115                        _item(_model.item + 1); 
     116                } 
     117                 
     118                 
     119                // TODO: implement waitForReady; either in Controller or in API 
     120                function _waitForReady(func) { 
     121                        return function() { 
     122                                func.apply(this, arguments); 
     123                        } 
     124                } 
     125                 
     126                this.play = _waitForReady(_play); 
     127                this.pause = _waitForReady(_pause); 
     128                this.seek = _waitForReady(_seek); 
     129                this.stop = _waitForReady(_stop); 
     130                this.load = _waitForReady(_load); 
     131                this.next = _waitForReady(_next); 
     132                this.prev = _waitForReady(_prev); 
     133                this.item = _waitForReady(_item); 
     134                this.setVolume = _waitForReady(_setVolume); 
     135                this.setMute = _waitForReady(_setMute); 
     136                this.setFullscreen = _waitForReady(_setFullscreen); 
     137                 
     138/*              this.playerReady = _playerReady; 
     139                this.detachMedia = _detachMedia;  
     140                this.attachMedia = _attachMedia; 
     141                this.beforePlay = function() {  
     142                        return _preplay;  
     143                } 
     144*/               
    87145                 
    88146                _init(); 
  • branches/jw6/src/js/html5/jwplayer.html5.model.js

    r2175 r2177  
    66 */ 
    77(function(html5) { 
    8         var _utils = jwplayer.utils; 
     8        var _utils = jwplayer.utils, 
     9                _events = jwplayer.events; 
    910 
    1011        html5.model = function(config) { 
     
    1314                        _video,  
    1415                        // HTML5 <video> tag 
    15                         _videoTag; 
    16  
    17                 _utils.extend(_model, new jwplayer.events.eventdispatcher()); 
     16                        _videoTag, 
     17                        // Saved settings 
     18                        _cookies = _utils.getCookies(), 
     19                        // Defaults 
     20                        _defaults = { 
     21                                width: 480, 
     22                                height: 320, 
     23                                item: 0, 
     24                                playlist: undefined, 
     25                                skin: undefined, 
     26                                volume: 90, 
     27                                mute: false, 
     28        //                      repeat: "", 
     29        //                      stretching: jwplayer.utils.stretching.UNIFORM, 
     30                                autostart: false, 
     31                                debug: undefined 
     32                        }; 
    1833 
    1934                function _parseConfig(config) { 
     
    2237 
    2338                function _init() { 
     39                        _utils.extend(_model, new _events.eventdispatcher()); 
    2440                        _utils.extend(_model, { 
    25                                 id : config.id, 
    26                                 settings : _parseConfig(config), 
    27                                 volume : 0, 
    28                                 state : jwplayer.events.state.IDLE, 
    29                                 mute : false 
     41                                id: config.id, 
     42                                state : _events.state.IDLE, 
     43                                position: 0, 
     44                                buffer: 0, 
     45                                playlist: [], 
     46                                config: _utils.extend({}, _defaults, _cookies, _parseConfig(config))  
    3047                        }); 
    31  
     48                        _model.setItem(_model.config.item); 
     49                         
    3250                        _videoTag = document.createElement("video"); 
    3351                        _video = new html5.video(_videoTag); 
     
    3553                } 
    3654 
     55                var _eventMap = {}; 
     56                _eventMap[_events.JWPLAYER_MEDIA_MUTE] = "mute"; 
     57                _eventMap[_events.JWPLAYER_MEDIA_VOLUME] = "volume"; 
     58                _eventMap[_events.JWPLAYER_PLAYER_STATE] = "newstate->state"; 
     59                _eventMap[_events.JWPLAYER_MEDIA_BUFFER] = "bufferPercent->buffer"; 
     60                _eventMap[_events.JWPLAYER_MEDIA_TIME] = "position"; 
     61                         
    3762                function _videoEventHandler(evt) { 
    38                         switch (evt.type) { 
    39                         case jwplayer.events.JWPLAYER_MEDIA_MUTE: 
    40                                 if (_model.mute == evt.mute) 
    41                                         return; 
    42                                 _model.mute = evt.mute; 
    43                                 break; 
    44                         case jwplayer.events.JWPLAYER_MEDIA_VOLUME: 
    45                                 if (_model.volume == evt.volume) 
    46                                         return; 
    47                                 _model.volume = evt.volume; 
    48                                 break; 
    49                         case jwplayer.events.JWPLAYER_PLAYER_STATE: 
    50                                 if (_model.state == evt.newstate) 
    51                                         return; 
    52                                 _model.state = evt.newstate; 
     63                        var mapping = _eventMap[evt.type]; 
     64                        if (mapping) { 
     65                                var split = mapping.split("->"), 
     66                                        eventProp = split[0], 
     67                                        stateProp = split[1] ? split[1] : eventProp; 
     68                                if (_model[stateProp] != evt[eventProp]) { 
     69                                        _model[stateProp] = evt[eventProp]; 
     70                                        _model.sendEvent(evt.type, evt); 
     71                                } 
     72                        } else { 
     73                                _model.sendEvent(evt.type, evt); 
    5374                        } 
    54                         _model.sendEvent(evt.type, evt); 
    5575                } 
    5676                 
     
    6282                        if (state != _model.fullscreen) { 
    6383                                _model.fullscreen = state; 
    64                                 _model.sendEvent(jwplayer.events.JWPLAYER_FULLSCREEN, { fullscreen: state } ); 
     84                                _model.sendEvent(_events.JWPLAYER_FULLSCREEN, { fullscreen: state } ); 
     85                        } 
     86                } 
     87                 
     88                this.setItem = function(index) { 
     89                        var newItem; 
     90                        if (index == _model.playlist.length || index < -1) 
     91                                newItem = 0; 
     92                        else if (index == -1 || index > _model.playlist.length) 
     93                                newItem = _model.playlist.length - 1; 
     94                        else 
     95                                newItem = index; 
     96                         
     97                        if (newItem != _model.item) { 
     98                                _model.item = newItem; 
     99                                _model.sendEvent(_events.JWPLAYER_PLAYLIST_ITEM, { 
     100                                        "index": _model.item 
     101                                }); 
    65102                        } 
    66103                } 
  • branches/jw6/src/js/html5/jwplayer.html5.player.js

    r2175 r2177  
    11/** 
    2  * Main HTMl5 player class 
     2 * Main HTML5 player class 
    33 * 
    44 * @author pablo 
     
    77(function(html5) { 
    88        html5.player = function(config) { 
    9                 var _model, _view, _controller, 
    10                         _api = this; 
    11                  
     9                var _api = this, 
     10                        _model = new html5.model(config),  
     11                        _view = new html5.view(this, _model),  
     12                        _controller = new html5.controller(_model, _view); 
     13 
    1214                function _init() { 
    13                         _model = new html5.model(config); 
     15                        _api.id = _model.id; 
    1416                         
    15                         _api.id = _model.id; 
    16                         _api.settings = _model.settings; 
    17                                                  
    18                         _controller = new html5.controller(_model); 
    19                         _controller.load(); 
    20                          
     17//                      _controller.load(); 
     18/*                       
    2119                        (new html5.skinloader(config.skin, function(skin) { 
    2220                                _api.skin = skin; 
    23                                 _view = new html5.view(_api, _model); 
     21                                _view.setup(); 
    2422                        }, function(err) { _utils.log(err); })); 
    25                          
     23*/ 
     24                        var setup = new html5.setup(_model, _view, _controller); 
     25                        setup.addEventListener(jwplayer.events.JWPLAYER_READY, _readyHandler); 
     26                        setup.addEventListener(jwplayer.events.JWPLAYER_ERROR, _errorHandler); 
     27                        setup.start(); 
    2628                } 
    2729                 
    28                 this.jwPlay = function(){ _controller.play() }; 
    29                 this.jwPause = function(){ _controller.pause() }; 
    30                 this.jwStop = function(){ _controller.stop() }; 
    31                 this.jwSeek = function(pos){ _controller.seek(pos) }; 
    32                 this.jwSetVolume = function(vol){ _controller.volume(vol) }; 
    33                 this.jwSetMute = function(state){ _controller.mute(state) }; 
    34                 this.jwLoad = function(item) { _controller.load(item); } 
    35                 this.jwPlaylistNext = function() { _controller.next(); } 
    36                 this.jwPlaylistPrev = function() { _controller.prev(); } 
    37                 this.jwPlaylistItem = function(item) { _controller.item(item); } 
    38                 this.jwSetFullscreen = function(state) { _view.fullscreen(state); } 
     30                function _readyHandler(evt) { 
     31                        _controller.sendEvent(evt.type, evt); 
     32                        _controller.load(); 
     33                } 
     34 
     35                function _errorHandler(evt) { 
     36                        console.log(evt); 
     37                        alert("Can't set up: " + evt.message); 
     38                } 
     39 
    3940                 
    40                 this.jwGetState = function(){ return _model.state }; 
    41                 this.jwGetVolume = function(){ return _model.volume }; 
    42                 this.jwGetMute = function(){ return _model.mute }; 
    43                 this.jwGetFullscreen = function(){ return _model.fullscreen }; 
     41                /** Methods **/ 
     42                 
     43                this.jwPlay = _controller.play; 
     44                this.jwPause = _controller.pause; 
     45                this.jwStop = _controller.stop; 
     46                this.jwSeek = _controller.seek; 
     47                this.jwSetVolume = _controller.setVolume; 
     48                this.jwSetMute = _controller.setMute; 
     49                this.jwLoad = _controller.load; 
     50                this.jwPlaylistNext = _controller.next; 
     51                this.jwPlaylistPrev = _controller.prev; 
     52                this.jwPlaylistItem = _controller.item; 
     53                this.jwSetFullscreen = _controller.setFullscreen; 
     54                 
    4455 
    45                 this.jwAddEventListener = function(type, handler) { _controller.addEventListener(type, handler); }; 
    46                 this.jwRemoveEventListener = function(type, handler) { _controller.removeEventListener(type, handler); }; 
     56                /** Getters **/ 
     57                 
     58                function _statevarFactory(statevar) { 
     59                        return function() { 
     60                                return _model[statevar]; 
     61                        }; 
     62                } 
     63                 
     64                this.jwGetPlaylistIndex = _statevarFactory('item'); 
     65                this.jwGetPosition = _statevarFactory('position'); 
     66                this.jwGetDuration = _statevarFactory('duration'); 
     67                this.jwGetBuffer = _statevarFactory('buffer'); 
     68                this.jwGetWidth = _statevarFactory('width'); 
     69                this.jwGetHeight = _statevarFactory('height'); 
     70                this.jwGetFullscreen = _statevarFactory('fullscreen'); 
     71                this.jwGetVolume = _statevarFactory('volume'); 
     72                this.jwGetMute = _statevarFactory('mute'); 
     73                this.jwGetState = _statevarFactory('state'); 
     74                this.jwGetStretching = _statevarFactory('stretching'); 
     75                this.jwGetPlaylist = _statevarFactory('playlist'); 
     76 
     77                 
     78                this.jwAddEventListener = _controller.addEventListener; 
     79                this.jwRemoveEventListener = _controller.removeEventListener; 
    4780                 
    4881                _init(); 
  • branches/jw6/src/js/html5/jwplayer.html5.skinloader.js

    r2175 r2177  
    66 * @version 6.0 
    77 */ 
    8 (function(jwplayerhtml5) { 
     8(function(html5) { 
    99        var _utils = jwplayer.utils; 
    1010         
    1111        /** Constructor **/ 
    12         jwplayerhtml5.skinloader = function(skinPath, completeHandler, errorHandler) { 
     12        html5.skinloader = function(skinPath, completeHandler, errorHandler) { 
    1313                var _skin = {}; 
    1414                var _completeHandler = completeHandler; 
     
    2222                function _load() { 
    2323                        if (typeof _skinPath != "string" || _skinPath === "") { 
    24                                 _loadSkin(jwplayerhtml5.defaultskin().xml); 
     24                                _loadSkin(html5.defaultskin().xml); 
    2525                        } else { 
    2626                                _utils.ajax(_utils.getAbsolutePath(_skinPath), function(xmlrequest) { 
     
    3333                                                _clearSkin(); 
    3434                                        } 
    35                                         _loadSkin(jwplayer.html5.defaultskin().xml); 
     35                                        _loadSkin(html5.defaultskin().xml); 
    3636                                }, function(path) { 
    37                                         _loadSkin(jwplayer.html5.defaultskin().xml); 
     37                                        _loadSkin(html5.defaultskin().xml); 
    3838                                }); 
    3939                        } 
  • branches/jw6/src/js/html5/jwplayer.html5.video.js

    r2175 r2177  
    135135                function _errorHandler(evt) { 
    136136                        _utils.log("Error: %o", _video.error); 
    137                         _generalHandler(evt); 
     137                        _setState(_states.IDLE); 
    138138                } 
    139139 
  • branches/jw6/src/js/html5/jwplayer.html5.view.js

    r2175 r2177  
    99 
    1010        DOCUMENT = document,  
    11         VIEW_CONTAINER_CLASS = "jwcontainer",  
     11        VIEW_CONTAINER_CLASS = "jwplayer",  
    1212        VIEW_VIDEO_CONTAINER_CLASS = "jwvideocontainer",  
    1313        VIEW_CONTROLS_CONTAINER_CLASS = "jwcontrolscontainer"; 
     
    2020                        _videoLayer; 
    2121 
    22                  
    23                 function _init() { 
     22                this.setup = function(skin) { 
     23                        _api.skin = skin; 
     24                         
    2425                        _container = DOCUMENT.getElementById(_api.id); 
    2526                        _container.className = VIEW_CONTAINER_CLASS; 
     
    4445                } 
    4546 
     47                /**  
     48                 * Switch to fullscreen mode.  If a native fullscreen method is available in the browser, use that.   
     49                 * Otherwise, use the false fullscreen method using CSS.  
     50                 **/ 
    4651                var _fullscreen = this.fullscreen = function(state) { 
    4752                        if (!_utils.exists(state)) { 
     
    5156                        if (state) { 
    5257                                if (!_model.fullscreen) { 
     58                                        _fakeFullscreen(true); 
     59                                         
    5360                                        if (_container.requestFullScreen) { 
    5461                                                _container.requestFullScreen(); 
     
    5966                                        } else if (_container.webkitRequestFullScreen) { 
    6067                                                _container.webkitRequestFullScreen(); 
    61                                         } else { 
    62                                                 _fakeFullscreen(true); 
    6368                                        } 
    6469                                } 
    6570                                _model.setFullscreen(true); 
    6671                        } else { 
     72                        _fakeFullscreen(false); 
    6773                            if (DOCUMENT.cancelFullScreen) {   
    6874                                DOCUMENT.cancelFullScreen();   
     
    7177                            } else if (DOCUMENT.webkitCancelFullScreen) {   
    7278                                DOCUMENT.webkitCancelFullScreen();   
    73                             } else { 
    74                                 _fakeFullscreen(false); 
    7579                            } 
    76                                  
    7780                                _model.setFullscreen(false); 
    7881                        } 
    7982                } 
    8083 
     84                /** 
     85                 * Resize the player 
     86                 */ 
     87                this.resize = function(width, height) { 
     88                        // TODO: implement 
     89                        return; 
     90                } 
     91                 
     92                 
     93                /** 
     94                 * Listen for keystrokes.  Currently only ESC is recognized, to switch out of fullscreen mode. 
     95                 **/ 
    8196                function _keyHandler(evt) { 
    8297                        switch (evt.keyCode) { 
    83                         // ESC key 
     98                        // ESC 
    8499                        case 27: 
    85100                                if (_model.fullscreen) { 
     
    87102                                } 
    88103                                break; 
     104                        // SPACE 
     105                        case 32: 
     106                                _api.jwPlay() 
     107                                break; 
    89108                        } 
    90109                } 
    91110                 
     111                /** 
     112                 * False fullscreen mode. This is used for browsers without full support for HTML5 fullscreen. 
     113                 * This method sets the CSS of the container element to a fixed position with 100% width and height. 
     114                 */ 
    92115                function _fakeFullscreen(state) { 
    93116                        if (state) { 
     
    97120                        } 
    98121                } 
    99                  
    100                 function _fullscreenChangeHandler(evt) { 
    101                         _model.setFullscreen(DOCUMENT.mozFullScreenElement == _container ||  
     122 
     123                /** 
     124                 * Return whether or not we're in native fullscreen 
     125                 */ 
     126                function _isNativeFullscreen() { 
     127                        return (DOCUMENT.mozFullScreenElement == _container ||  
    102128                                        DOCUMENT.webkitCurrentFullScreenElement == _container); 
    103129                } 
     130                 
     131                /** 
     132                 * If the browser enters or exits fullscreen mode (without the view's knowing about it) update the model. 
     133                 **/ 
     134                function _fullscreenChangeHandler(evt) { 
     135                        _model.setFullscreen(_isNativeFullscreen()); 
     136                        _fullscreen(_model.fullscreen); 
     137                } 
    104138 
    105                 _init(); 
    106139        } 
    107140 
    108         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-webkit-full-screen', { 
    109                 width: "100% !important", 
    110                 height: "100% !important" 
    111         }); 
    112         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-moz-full-screen', { 
    113                 width: "100% !important", 
    114                 height: "100% !important" 
    115         }); 
    116         _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+'.jwfullscreen', { 
    117                 left: 0, 
    118                 right: 0, 
    119                 top: 0, 
    120                 bottom: 0, 
    121                 position: "fixed !important" 
    122         }); 
    123          
    124          
     141        /************************************************************* 
     142         * Player stylesheets - done once on script initialization;  * 
     143         * These CSS rules are used for all JW Player instances      * 
     144         *************************************************************/ 
     145 
     146        // Container styles 
     147 
    125148        _utils.appendStylesheet('.' + VIEW_VIDEO_CONTAINER_CLASS + ' ,.'+ VIEW_CONTROLS_CONTAINER_CLASS, { 
    126149                width : "100%", 
     
    138161        }); 
    139162 
     163 
     164         
     165        // Fullscreen styles 
     166         
     167        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-webkit-full-screen', { 
     168                width: "100% !important", 
     169                height: "100% !important" 
     170        }); 
     171         
     172        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+':-moz-full-screen', { 
     173                width: "100% !important", 
     174                height: "100% !important" 
     175        }); 
     176         
     177        _utils.appendStylesheet('.' + VIEW_CONTAINER_CLASS+'.jwfullscreen', { 
     178                left: 0, 
     179                right: 0, 
     180                top: 0, 
     181                bottom: 0, 
     182                'z-index': 1000, 
     183                position: "fixed !important" 
     184        }); 
     185         
    140186})(jwplayer.html5); 
  • branches/jw6/test/controller.html

    r2175 r2177  
    66 
    77          <style type="text/css"> 
    8                 #wrapper { 
     8                .wrapper { 
    99             width: 720px; 
    1010             height: 426px; 
     11             position: relative; 
    1112                } 
    1213           
     
    1516             height: 100%; 
    1617         position: relative; 
    17              background-image: url('http://content.bitsontherun.com/thumbs/gSzpo2wh-480.jpg'); 
    18              background-size: 100% 100%; 
     18         background: #000; 
    1919            } 
    2020             
     
    3535                 form = document.getElementById("form"); 
    3636                 document.getElementById("player").innerHTML = ""; 
    37              player = new jwplayer.html5.player({id: "player", skin: form.skin.options[form.skin.selectedIndex].value}); 
     37             player = new jwplayer.html5.player({ 
     38                     id: "player",  
     39                     skin: form.skin.options[form.skin.selectedIndex].value, 
     40                     playlist: "http://content.bitsontherun.com/feeds/Hilgq9Ju.rss", 
     41                     debug: undefined 
     42                 }); 
    3843           } 
    3944          </script> 
     
    4146         
    4247        <body onload="init()"> 
     48         
     49        <a href="http://sitetophone.com/316502-1120">site</a> 
     50         
    4351    <form id="form" onsubmit="update(this); return false;"> 
    4452      skin: <select name="skin" onchange="init()"> 
    4553        <option value="">default</option> 
    4654        <option value="../../../skins/beelden/beelden.xml">beelden</option> 
    47         <option value="../../../skins/stormtrooper/stormtrooper.xml" selected>stormtrooper</option> 
    48         <option value="../../../skins/glow/src/glow.xml">glow</option> 
     55        <option value="../../../skins/stormtrooper/stormtrooper.xml">stormtrooper</option> 
     56        <option value="../../../skins/glow/src/glow.xml" selected>glow</option> 
    4957        <option value="../../../skins/five/five.xml">five</option> 
    5058        <option value="../../../tags/skins/snel/snel.xml">snel</option> 
     
    5563    </form> 
    5664     
    57         <div id="wrapper"> 
    58             <div id="player"> 
    59             </div> 
     65        <div class="wrapper"> 
     66            <div id="player"></div> 
    6067        </div> 
    6168 
Note: See TracChangeset for help on using the changeset viewer.