Changeset 2177
- Timestamp:
- 04/26/12 13:12:50 (13 months ago)
- Location:
- branches/jw6
- Files:
-
- 13 added
- 1 deleted
- 11 edited
-
bin-debug/jwplayer.js (modified) (41 diffs)
-
build/build.xml (modified) (1 diff)
-
jwplayer.min.js (modified) (1 diff)
-
src/js/html5/jwplayer.html5.controlbar.js (modified) (8 diffs)
-
src/js/html5/jwplayer.html5.controller.js (modified) (4 diffs)
-
src/js/html5/jwplayer.html5.model.js (modified) (5 diffs)
-
src/js/html5/jwplayer.html5.player.js (modified) (2 diffs)
-
src/js/html5/jwplayer.html5.playlist.js (added)
-
src/js/html5/jwplayer.html5.playlistitem.js (added)
-
src/js/html5/jwplayer.html5.playlistitemlevel.js (added)
-
src/js/html5/jwplayer.html5.playlistloader.js (added)
-
src/js/html5/jwplayer.html5.setup.js (added)
-
src/js/html5/jwplayer.html5.skinloader.js (modified) (3 diffs)
-
src/js/html5/jwplayer.html5.video.js (modified) (1 diff)
-
src/js/html5/jwplayer.html5.view.js (modified) (9 diffs)
-
src/js/html5/parsers (added)
-
src/js/html5/parsers/jwplayer.html5.parsers.js (added)
-
src/js/html5/parsers/jwplayer.html5.parsers.jwparser.js (added)
-
src/js/html5/parsers/jwplayer.html5.parsers.mediaparser.js (added)
-
src/js/html5/parsers/jwplayer.html5.parsers.rssparser.js (added)
-
src/js/utils/jwplayer.utils.ajax.js (deleted)
-
src/js/utils/jwplayer.utils.js (added)
-
src/js/utils/jwplayer.utils.strings.js (added)
-
src/js/utils/jwplayer.utils.typechecker.js (added)
-
test/controller.html (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/jw6/bin-debug/jwplayer.js
r2175 r2177 31 31 */ 32 32 (function(jwplayer) { 33 var DOCUMENT = document; 34 33 35 //Declare namespace 34 36 var utils = jwplayer.utils = function() { … … 88 90 utils.appendStylesheet = function(selector, styles) { 89 91 if (!_styleSheet) { 90 _styleSheet = document.createElement("style");92 _styleSheet = DOCUMENT.createElement("style"); 91 93 _styleSheet.type = "text/css"; 92 document.getElementsByTagName('head')[0].appendChild(_styleSheet);94 DOCUMENT.getElementsByTagName('head')[0].appendChild(_styleSheet); 93 95 } 94 96 … … 167 169 utils.getAbsolutePath = function(path, base) { 168 170 if (!utils.exists(base)) { 169 base = document.location.href;171 base = DOCUMENT.location.href; 170 172 } 171 173 if (!utils.exists(path)) { … … 265 267 } else { 266 268 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, 269 271 width: element.offsetWidth, 270 272 height: element.offsetHeight … … 281 283 utils.isMobile = function() { 282 284 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 294 307 /** Loads an XML file into a DOM object * */ 295 308 utils.ajax = function(xmldocpath, completecallback, errorcallback) { 296 309 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 299 315 xmlhttp = new XMLHttpRequest(); 300 316 } else { 301 // IE6 302 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 317 errorcallback(); 303 318 } 304 319 xmlhttp.onreadystatechange = function() { … … 307 322 if (completecallback) { 308 323 // 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)) { 310 325 try { 311 326 if (window.DOMParser) { 312 327 var parsedXML = (new DOMParser()).parseFromString(xmlhttp.responseText,"text/xml"); 313 328 if (parsedXML) { 314 xmlhttp = utils.extend({}, xmlhttp, {responseXML:parsedXML});329 xmlhttp = jwplayer.utils.extend({}, xmlhttp, {responseXML:parsedXML}); 315 330 } 316 331 } else { … … 319 334 parsedXML.async="false"; 320 335 parsedXML.loadXML(xmlhttp.responseText); 321 xmlhttp = utils.extend({}, xmlhttp, {responseXML:parsedXML});336 xmlhttp = jwplayer.utils.extend({}, xmlhttp, {responseXML:parsedXML}); 322 337 } 323 338 } catch(e) { … … 347 362 }; 348 363 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); 350 378 /** 351 379 * String utilities for the JW Player. … … 931 959 _api = api; 932 960 933 config = _utils.extend({}, config);934 961 _id = _api.id + "_controlbar"; 935 962 _duration = 0; … … 945 972 _skin = _api.skin; 946 973 947 _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, _api.settings.controlbar);974 _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, config); 948 975 _layout = (_skin.controlbar.layout.left || _skin.controlbar.layout.right || _skin.controlbar.layout.center) ? _skin.controlbar.layout : _defaults.layout; 949 976 _createStyles(); … … 979 1006 function _stateHandler(evt) { 980 1007 switch (evt.newstate) { 1008 case jwplayer.events.state.BUFFERING: 981 1009 case jwplayer.events.state.PLAYING: 982 case jwplayer.events.state.BUFFERING:983 1010 if (_elements['timeSliderThumb']) { 984 1011 _elements['timeSliderThumb'].style.opacity = 1; 985 }986 if (_elements["timeRail"]) {987 _elements["timeRail"].className = "jwrail jwsmooth";988 1012 } 989 1013 _toggleButton("play", true); … … 1000 1024 _elements['timeSliderThumb'].style.opacity = 0; 1001 1025 } 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 } 1002 1033 _setBuffer(0); 1003 1034 _timeUpdated({ position: 0, duration: 0}); 1004 if (_elements["timeRail"]) {1005 _elements["timeRail"].className = "jwrail";1006 }1007 1035 break; 1008 1036 } … … 1102 1130 function _buildImage(name, style, stretch, nocenter) { 1103 1131 var element = _createSpan(); 1104 //element.id = _createElementId(name);1105 1132 element.className = 'jw'+name; 1106 1133 … … 1137 1164 1138 1165 var element = document.createElement("button"); 1139 //element.id = _createElementId(name);1140 1166 element.className = 'jw'+name; 1141 1167 element.addEventListener("click", _buttonClickHandler(name), false); … … 1227 1253 } 1228 1254 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); 1230 1260 } 1231 1261 _toggleStates[name] = state; … … 1501 1531 } 1502 1532 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 }); 1574 1621 1575 1622 })(jwplayer);/** … … 1585 1632 _states = _events.state; 1586 1633 1587 html5.controller = function(model) { 1588 var _model = model, 1634 html5.controller = function(model, view) { 1635 var _model = model, 1636 _view = view, 1589 1637 _video = model.getVideo(), 1590 // _debug = 'console', 1591 _eventDispatcher = new _events.eventdispatcher(_model.id); 1638 _eventDispatcher = new _events.eventdispatcher(_model.id, _model.config.debug); 1592 1639 1593 1640 _utils.extend(this, _eventDispatcher); … … 1608 1655 var file; 1609 1656 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() { 1624 1689 if (_model.state == _states.IDLE) { 1625 1690 _video.load(file); … … 1629 1694 } 1630 1695 1631 this.stop = function() {1696 function _stop() { 1632 1697 _video.stop(); 1633 1698 } 1634 1699 1635 this.pause = function() {1700 function _pause() { 1636 1701 if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 1637 1702 _video.pause(); … … 1639 1704 } 1640 1705 1641 this.seek = function(pos) {1706 function _seek(pos) { 1642 1707 _video.seek(pos); 1643 1708 } 1644 1709 1645 this.volume = function(vol) {1710 function _setVolume(vol) { 1646 1711 _video.volume(vol); 1647 1712 } 1648 1713 1649 this.mute = function(state) {1714 function _setMute(state) { 1650 1715 if (!_utils.exists(state)) state = !_model.mute; 1651 1716 _video.mute(state); 1652 1717 } 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 */ 1661 1766 1662 1767 _init(); … … 1690 1795 })(jwplayer); 1691 1796 /** 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 /** 1692 2280 * jwplayer.html5 model 1693 2281 * … … 1696 2284 */ 1697 2285 (function(html5) { 1698 var _utils = jwplayer.utils; 2286 var _utils = jwplayer.utils, 2287 _events = jwplayer.events; 1699 2288 1700 2289 html5.model = function(config) { … … 1703 2292 _video, 1704 2293 // 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 }; 1708 2311 1709 2312 function _parseConfig(config) { … … 1712 2315 1713 2316 function _init() { 2317 _utils.extend(_model, new _events.eventdispatcher()); 1714 2318 _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)) 1720 2325 }); 1721 2326 _model.setItem(_model.config.item); 2327 1722 2328 _videoTag = document.createElement("video"); 1723 2329 _video = new html5.video(_videoTag); … … 1725 2331 } 1726 2332 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 1727 2340 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 } 1745 2353 } 1746 2354 … … 1752 2360 if (state != _model.fullscreen) { 1753 2361 _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 }); 1755 2380 } 1756 2381 } … … 1760 2385 })(jwplayer.html5); 1761 2386 /** 1762 * Main HTM l5 player class2387 * Main HTML5 player class 1763 2388 * 1764 2389 * @author pablo … … 1767 2392 (function(html5) { 1768 2393 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 1772 2399 function _init() { 1773 _model = new html5.model(config);1774 1775 2400 _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 /* 1781 2404 (new html5.skinloader(config.skin, function(skin) { 1782 2405 _api.skin = skin; 1783 _view = new html5.view(_api, _model);2406 _view.setup(); 1784 2407 }, 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; 1807 2465 1808 2466 _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(); 1809 2754 } 1810 2755 })(jwplayer.html5); … … 1872 2817 * @version 6.0 1873 2818 */ 1874 (function( jwplayerhtml5) {2819 (function(html5) { 1875 2820 var _utils = jwplayer.utils; 1876 2821 1877 2822 /** Constructor **/ 1878 jwplayerhtml5.skinloader = function(skinPath, completeHandler, errorHandler) {2823 html5.skinloader = function(skinPath, completeHandler, errorHandler) { 1879 2824 var _skin = {}; 1880 2825 var _completeHandler = completeHandler; … … 1888 2833 function _load() { 1889 2834 if (typeof _skinPath != "string" || _skinPath === "") { 1890 _loadSkin( jwplayerhtml5.defaultskin().xml);2835 _loadSkin(html5.defaultskin().xml); 1891 2836 } else { 1892 2837 _utils.ajax(_utils.getAbsolutePath(_skinPath), function(xmlrequest) { … … 1899 2844 _clearSkin(); 1900 2845 } 1901 _loadSkin( jwplayer.html5.defaultskin().xml);2846 _loadSkin(html5.defaultskin().xml); 1902 2847 }, function(path) { 1903 _loadSkin( jwplayer.html5.defaultskin().xml);2848 _loadSkin(html5.defaultskin().xml); 1904 2849 }); 1905 2850 } … … 2198 3143 function _errorHandler(evt) { 2199 3144 _utils.log("Error: %o", _video.error); 2200 _ generalHandler(evt);3145 _setState(_states.IDLE); 2201 3146 } 2202 3147 … … 2340 3285 2341 3286 DOCUMENT = document, 2342 VIEW_CONTAINER_CLASS = "jw container",3287 VIEW_CONTAINER_CLASS = "jwplayer", 2343 3288 VIEW_VIDEO_CONTAINER_CLASS = "jwvideocontainer", 2344 3289 VIEW_CONTROLS_CONTAINER_CLASS = "jwcontrolscontainer"; … … 2351 3296 _videoLayer; 2352 3297 2353 2354 function _init() { 3298 this.setup = function(skin) { 3299 _api.skin = skin; 3300 2355 3301 _container = DOCUMENT.getElementById(_api.id); 2356 3302 _container.className = VIEW_CONTAINER_CLASS; … … 2375 3321 } 2376 3322 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 **/ 2377 3327 var _fullscreen = this.fullscreen = function(state) { 2378 3328 if (!_utils.exists(state)) { … … 2382 3332 if (state) { 2383 3333 if (!_model.fullscreen) { 3334 _fakeFullscreen(true); 3335 2384 3336 if (_container.requestFullScreen) { 2385 3337 _container.requestFullScreen(); … … 2390 3342 } else if (_container.webkitRequestFullScreen) { 2391 3343 _container.webkitRequestFullScreen(); 2392 } else {2393 _fakeFullscreen(true);2394 3344 } 2395 3345 } 2396 3346 _model.setFullscreen(true); 2397 3347 } else { 3348 _fakeFullscreen(false); 2398 3349 if (DOCUMENT.cancelFullScreen) { 2399 3350 DOCUMENT.cancelFullScreen(); … … 2402 3353 } else if (DOCUMENT.webkitCancelFullScreen) { 2403 3354 DOCUMENT.webkitCancelFullScreen(); 2404 } else {2405 _fakeFullscreen(false);2406 3355 } 2407 2408 3356 _model.setFullscreen(false); 2409 3357 } 2410 3358 } 2411 3359 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 **/ 2412 3372 function _keyHandler(evt) { 2413 3373 switch (evt.keyCode) { 2414 // ESC key3374 // ESC 2415 3375 case 27: 2416 3376 if (_model.fullscreen) { … … 2418 3378 } 2419 3379 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 */ 2423 3391 function _fakeFullscreen(state) { 2424 3392 if (state) { … … 2428 3396 } 2429 3397 } 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 **/ 2431 3410 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 2437 3415 } 2438 3416 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 2456 3424 _utils.appendStylesheet('.' + VIEW_VIDEO_CONTAINER_CLASS + ' ,.'+ VIEW_CONTROLS_CONTAINER_CLASS, { 2457 3425 width : "100%", … … 2469 3437 }); 2470 3438 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 2471 3462 })(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 /** 2472 3725 * JW Player Source Endcap 2473 3726 * -
branches/jw6/build/build.xml
r2173 r2177 14 14 <fileset dir="${basedir}/src/js/html5" includes="jwplayer.html5.js" /> 15 15 <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" /> 18 18 <fileset dir="${basedir}/src/js" includes="jwplayer.sourceend.js" /> 19 19 </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=" ";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=" ";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)};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 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=" ";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=" ";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 152 152 _api = api; 153 153 154 config = _utils.extend({}, config);155 154 _id = _api.id + "_controlbar"; 156 155 _duration = 0; … … 166 165 _skin = _api.skin; 167 166 168 _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, _api.settings.controlbar);167 _settings = _utils.extend({}, _defaults, _skin.controlbar.settings, config); 169 168 _layout = (_skin.controlbar.layout.left || _skin.controlbar.layout.right || _skin.controlbar.layout.center) ? _skin.controlbar.layout : _defaults.layout; 170 169 _createStyles(); … … 200 199 function _stateHandler(evt) { 201 200 switch (evt.newstate) { 201 case jwplayer.events.state.BUFFERING: 202 202 case jwplayer.events.state.PLAYING: 203 case jwplayer.events.state.BUFFERING:204 203 if (_elements['timeSliderThumb']) { 205 204 _elements['timeSliderThumb'].style.opacity = 1; 206 }207 if (_elements["timeRail"]) {208 _elements["timeRail"].className = "jwrail jwsmooth";209 205 } 210 206 _toggleButton("play", true); … … 221 217 _elements['timeSliderThumb'].style.opacity = 0; 222 218 } 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 } 223 226 _setBuffer(0); 224 227 _timeUpdated({ position: 0, duration: 0}); 225 if (_elements["timeRail"]) {226 _elements["timeRail"].className = "jwrail";227 }228 228 break; 229 229 } … … 323 323 function _buildImage(name, style, stretch, nocenter) { 324 324 var element = _createSpan(); 325 //element.id = _createElementId(name);326 325 element.className = 'jw'+name; 327 326 … … 358 357 359 358 var element = document.createElement("button"); 360 //element.id = _createElementId(name);361 359 element.className = 'jw'+name; 362 360 element.addEventListener("click", _buttonClickHandler(name), false); … … 448 446 } 449 447 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); 451 453 } 452 454 _toggleStates[name] = state; … … 722 724 } 723 725 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 }) 793 738 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 }); 795 814 796 815 })(jwplayer); -
branches/jw6/src/js/html5/jwplayer.html5.controller.js
r2175 r2177 11 11 _states = _events.state; 12 12 13 html5.controller = function(model) { 14 var _model = model, 13 html5.controller = function(model, view) { 14 var _model = model, 15 _view = view, 15 16 _video = model.getVideo(), 16 // _debug = 'console', 17 _eventDispatcher = new _events.eventdispatcher(_model.id); 17 _eventDispatcher = new _events.eventdispatcher(_model.id, _model.config.debug); 18 18 19 19 _utils.extend(this, _eventDispatcher); … … 34 34 var file; 35 35 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(); 43 39 } 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; 46 53 } 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 // } 47 65 } 48 66 49 this.play = function() {67 function _play() { 50 68 if (_model.state == _states.IDLE) { 51 69 _video.load(file); … … 55 73 } 56 74 57 this.stop = function() {75 function _stop() { 58 76 _video.stop(); 59 77 } 60 78 61 this.pause = function() {79 function _pause() { 62 80 if (_model.state == _states.PLAYING || _model.state == _states.BUFFERING) { 63 81 _video.pause(); … … 65 83 } 66 84 67 this.seek = function(pos) {85 function _seek(pos) { 68 86 _video.seek(pos); 69 87 } 70 88 71 this.volume = function(vol) {89 function _setVolume(vol) { 72 90 _video.volume(vol); 73 91 } 74 92 75 this.mute = function(state) {93 function _setMute(state) { 76 94 if (!_utils.exists(state)) state = !_model.mute; 77 95 _video.mute(state); 78 96 } 79 80 this.prev = function() { 97 98 function _setFullscreen(state) { 99 _view.fullscreen(state); 81 100 } 82 101 83 this.next = function() { 102 103 function _item(item) { 104 _stop(); 105 _model.setItem(item); 106 _load(_model.item); 107 _play(); 84 108 } 85 109 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 */ 87 145 88 146 _init(); -
branches/jw6/src/js/html5/jwplayer.html5.model.js
r2175 r2177 6 6 */ 7 7 (function(html5) { 8 var _utils = jwplayer.utils; 8 var _utils = jwplayer.utils, 9 _events = jwplayer.events; 9 10 10 11 html5.model = function(config) { … … 13 14 _video, 14 15 // 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 }; 18 33 19 34 function _parseConfig(config) { … … 22 37 23 38 function _init() { 39 _utils.extend(_model, new _events.eventdispatcher()); 24 40 _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)) 30 47 }); 31 48 _model.setItem(_model.config.item); 49 32 50 _videoTag = document.createElement("video"); 33 51 _video = new html5.video(_videoTag); … … 35 53 } 36 54 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 37 62 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); 53 74 } 54 _model.sendEvent(evt.type, evt);55 75 } 56 76 … … 62 82 if (state != _model.fullscreen) { 63 83 _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 }); 65 102 } 66 103 } -
branches/jw6/src/js/html5/jwplayer.html5.player.js
r2175 r2177 1 1 /** 2 * Main HTM l5 player class2 * Main HTML5 player class 3 3 * 4 4 * @author pablo … … 7 7 (function(html5) { 8 8 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 12 14 function _init() { 13 _ model = new html5.model(config);15 _api.id = _model.id; 14 16 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 /* 21 19 (new html5.skinloader(config.skin, function(skin) { 22 20 _api.skin = skin; 23 _view = new html5.view(_api, _model);21 _view.setup(); 24 22 }, 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(); 26 28 } 27 29 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 39 40 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 44 55 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; 47 80 48 81 _init(); -
branches/jw6/src/js/html5/jwplayer.html5.skinloader.js
r2175 r2177 6 6 * @version 6.0 7 7 */ 8 (function( jwplayerhtml5) {8 (function(html5) { 9 9 var _utils = jwplayer.utils; 10 10 11 11 /** Constructor **/ 12 jwplayerhtml5.skinloader = function(skinPath, completeHandler, errorHandler) {12 html5.skinloader = function(skinPath, completeHandler, errorHandler) { 13 13 var _skin = {}; 14 14 var _completeHandler = completeHandler; … … 22 22 function _load() { 23 23 if (typeof _skinPath != "string" || _skinPath === "") { 24 _loadSkin( jwplayerhtml5.defaultskin().xml);24 _loadSkin(html5.defaultskin().xml); 25 25 } else { 26 26 _utils.ajax(_utils.getAbsolutePath(_skinPath), function(xmlrequest) { … … 33 33 _clearSkin(); 34 34 } 35 _loadSkin( jwplayer.html5.defaultskin().xml);35 _loadSkin(html5.defaultskin().xml); 36 36 }, function(path) { 37 _loadSkin( jwplayer.html5.defaultskin().xml);37 _loadSkin(html5.defaultskin().xml); 38 38 }); 39 39 } -
branches/jw6/src/js/html5/jwplayer.html5.video.js
r2175 r2177 135 135 function _errorHandler(evt) { 136 136 _utils.log("Error: %o", _video.error); 137 _ generalHandler(evt);137 _setState(_states.IDLE); 138 138 } 139 139 -
branches/jw6/src/js/html5/jwplayer.html5.view.js
r2175 r2177 9 9 10 10 DOCUMENT = document, 11 VIEW_CONTAINER_CLASS = "jw container",11 VIEW_CONTAINER_CLASS = "jwplayer", 12 12 VIEW_VIDEO_CONTAINER_CLASS = "jwvideocontainer", 13 13 VIEW_CONTROLS_CONTAINER_CLASS = "jwcontrolscontainer"; … … 20 20 _videoLayer; 21 21 22 23 function _init() { 22 this.setup = function(skin) { 23 _api.skin = skin; 24 24 25 _container = DOCUMENT.getElementById(_api.id); 25 26 _container.className = VIEW_CONTAINER_CLASS; … … 44 45 } 45 46 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 **/ 46 51 var _fullscreen = this.fullscreen = function(state) { 47 52 if (!_utils.exists(state)) { … … 51 56 if (state) { 52 57 if (!_model.fullscreen) { 58 _fakeFullscreen(true); 59 53 60 if (_container.requestFullScreen) { 54 61 _container.requestFullScreen(); … … 59 66 } else if (_container.webkitRequestFullScreen) { 60 67 _container.webkitRequestFullScreen(); 61 } else {62 _fakeFullscreen(true);63 68 } 64 69 } 65 70 _model.setFullscreen(true); 66 71 } else { 72 _fakeFullscreen(false); 67 73 if (DOCUMENT.cancelFullScreen) { 68 74 DOCUMENT.cancelFullScreen(); … … 71 77 } else if (DOCUMENT.webkitCancelFullScreen) { 72 78 DOCUMENT.webkitCancelFullScreen(); 73 } else {74 _fakeFullscreen(false);75 79 } 76 77 80 _model.setFullscreen(false); 78 81 } 79 82 } 80 83 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 **/ 81 96 function _keyHandler(evt) { 82 97 switch (evt.keyCode) { 83 // ESC key98 // ESC 84 99 case 27: 85 100 if (_model.fullscreen) { … … 87 102 } 88 103 break; 104 // SPACE 105 case 32: 106 _api.jwPlay() 107 break; 89 108 } 90 109 } 91 110 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 */ 92 115 function _fakeFullscreen(state) { 93 116 if (state) { … … 97 120 } 98 121 } 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 || 102 128 DOCUMENT.webkitCurrentFullScreenElement == _container); 103 129 } 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 } 104 138 105 _init();106 139 } 107 140 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 125 148 _utils.appendStylesheet('.' + VIEW_VIDEO_CONTAINER_CLASS + ' ,.'+ VIEW_CONTROLS_CONTAINER_CLASS, { 126 149 width : "100%", … … 138 161 }); 139 162 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 140 186 })(jwplayer.html5); -
branches/jw6/test/controller.html
r2175 r2177 6 6 7 7 <style type="text/css"> 8 #wrapper {8 .wrapper { 9 9 width: 720px; 10 10 height: 426px; 11 position: relative; 11 12 } 12 13 … … 15 16 height: 100%; 16 17 position: relative; 17 background-image: url('http://content.bitsontherun.com/thumbs/gSzpo2wh-480.jpg'); 18 background-size: 100% 100%; 18 background: #000; 19 19 } 20 20 … … 35 35 form = document.getElementById("form"); 36 36 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 }); 38 43 } 39 44 </script> … … 41 46 42 47 <body onload="init()"> 48 49 <a href="http://sitetophone.com/316502-1120">site</a> 50 43 51 <form id="form" onsubmit="update(this); return false;"> 44 52 skin: <select name="skin" onchange="init()"> 45 53 <option value="">default</option> 46 54 <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> 49 57 <option value="../../../skins/five/five.xml">five</option> 50 58 <option value="../../../tags/skins/snel/snel.xml">snel</option> … … 55 63 </form> 56 64 57 <div id="wrapper"> 58 <div id="player"> 59 </div> 65 <div class="wrapper"> 66 <div id="player"></div> 60 67 </div> 61 68
Note: See TracChangeset
for help on using the changeset viewer.
