├── .gitignore ├── iaous.png ├── jwplayer-5.3 ├── player.swf ├── jwplayer.js └── jwplayer.html5.js ├── functions.php └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | .buildpath 2 | .project 3 | .settings 4 | ._* 5 | -------------------------------------------------------------------------------- /iaous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dflydev/ddrem-iaous/master/iaous.png -------------------------------------------------------------------------------- /jwplayer-5.3/player.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dflydev/ddrem-iaous/master/jwplayer-5.3/player.swf -------------------------------------------------------------------------------- /functions.php: -------------------------------------------------------------------------------- 1 | 1) { 28 | for (var i = 1; i < args.length; i++) { 29 | for (element in args[i]) { 30 | args[0][element] = args[i][element]; 31 | } 32 | } 33 | return args[0]; 34 | } 35 | return null; 36 | }; 37 | 38 | /** Updates the contents of an HTML element **/ 39 | jwplayer.utils.html = function(element, content) { 40 | element.innerHTML = content; 41 | }; 42 | 43 | /** Appends an HTML element to another element HTML element **/ 44 | jwplayer.utils.append = function(originalElement, appendedElement) { 45 | originalElement.appendChild(appendedElement); 46 | }; 47 | 48 | /** Wraps an HTML element with another element **/ 49 | jwplayer.utils.wrap = function(originalElement, appendedElement) { 50 | originalElement.parentNode.replaceChild(appendedElement, originalElement); 51 | appendedElement.appendChild(originalElement); 52 | }; 53 | 54 | /** Loads an XML file into a DOM object **/ 55 | jwplayer.utils.ajax = function(xmldocpath, completecallback, errorcallback) { 56 | var xmlhttp; 57 | if (window.XMLHttpRequest) { 58 | // IE>7, Firefox, Chrome, Opera, Safari 59 | xmlhttp = new XMLHttpRequest(); 60 | } else { 61 | // IE6 62 | xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 63 | } 64 | xmlhttp.onreadystatechange = function() { 65 | if (xmlhttp.readyState === 4) { 66 | if (xmlhttp.status === 200) { 67 | if (completecallback) { 68 | completecallback(xmlhttp); 69 | } 70 | } else { 71 | if (errorcallback) { 72 | errorcallback(xmldocpath); 73 | } 74 | } 75 | } 76 | }; 77 | xmlhttp.open("GET", xmldocpath, true); 78 | xmlhttp.send(null); 79 | return xmlhttp; 80 | }; 81 | 82 | /** Loads a file **/ 83 | jwplayer.utils.load = function(domelement, completecallback, errorcallback) { 84 | domelement.onreadystatechange = function() { 85 | if (domelement.readyState === 4) { 86 | if (domelement.status === 200) { 87 | if (completecallback) { 88 | completecallback(); 89 | } 90 | } else { 91 | if (errorcallback) { 92 | errorcallback(); 93 | } 94 | } 95 | } 96 | }; 97 | }; 98 | 99 | /** Finds tags in a DOM, returning a new DOM **/ 100 | jwplayer.utils.find = function(dom, tag) { 101 | return dom.getElementsByTagName(tag); 102 | }; 103 | 104 | /** **/ 105 | 106 | /** Appends an HTML element to another element HTML element **/ 107 | jwplayer.utils.append = function(originalElement, appendedElement) { 108 | originalElement.appendChild(appendedElement); 109 | }; 110 | 111 | /** 112 | * Detects whether the current browser is IE (version 8 or below). 113 | * Technique from http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html 114 | * Note - this detection no longer works for IE9. 115 | **/ 116 | jwplayer.utils.isIE = function() { 117 | return (!+"\v1"); 118 | }; 119 | 120 | /** 121 | * Detects whether the current browser is mobile Safari. 122 | **/ 123 | jwplayer.utils.isIOS = function() { 124 | var agent = navigator.userAgent.toLowerCase(); 125 | return (agent.match(/iP(hone|ad)/i) !== null); 126 | }; 127 | 128 | /** 129 | * Detects whether the browser can handle HTML5 video. 130 | * Using this as a proxy for detecting all HTML5 features needed for the JW HTML5 Player. Do we need more granularity? 131 | */ 132 | jwplayer.utils.hasHTML5 = function() { 133 | return !!document.createElement('video').canPlayType; 134 | }; 135 | 136 | /** 137 | * Detects whether or not the current player has flash capabilities 138 | * TODO: Add minimum flash version constraint: 9.0.115 139 | */ 140 | jwplayer.utils.hasFlash = function() { 141 | return (typeof navigator.plugins != "undefined" && typeof navigator.plugins['Shockwave Flash'] != "undefined") || (typeof window.ActiveXObject != "undefined"); 142 | }; 143 | /** 144 | * Parser for the JW Player. 145 | * 146 | * @author zach 147 | * @version 1.0 148 | * @lastmodifieddate 2010-08-09 149 | */ 150 | (function(jwplayer) { 151 | 152 | jwplayer.utils.mediaparser = function() {}; 153 | 154 | var elementAttributes = { 155 | element: { 156 | width: 'width', 157 | height: 'height', 158 | id: 'id', 159 | 'class': 'className', 160 | name: 'name' 161 | }, 162 | media: { 163 | src: 'file', 164 | preload: 'preload', 165 | autoplay: 'autostart', 166 | loop: 'repeat', 167 | controls: 'controls' 168 | }, 169 | source: { 170 | src: 'file', 171 | type: 'type', 172 | media: 'media', 173 | 'data-jw-width': 'width', 174 | 'data-jw-bitrate': 'bitrate' 175 | 176 | }, 177 | video: { 178 | poster: 'image' 179 | } 180 | }; 181 | 182 | var parsers = {}; 183 | 184 | jwplayer.utils.mediaparser.parseMedia = function(element) { 185 | return parseElement(element); 186 | }; 187 | 188 | function getAttributeList(elementType, attributes) { 189 | if (attributes === undefined) { 190 | attributes = elementAttributes[elementType]; 191 | } else { 192 | jwplayer.utils.extend(attributes, elementAttributes[elementType]); 193 | } 194 | return attributes; 195 | } 196 | 197 | function parseElement(domElement, attributes) { 198 | if (parsers[domElement.tagName.toLowerCase()] && (attributes === undefined)) { 199 | return parsers[domElement.tagName.toLowerCase()](domElement); 200 | } else { 201 | attributes = getAttributeList('element', attributes); 202 | var configuration = {}; 203 | for (var attribute in attributes) { 204 | if (attribute != "length") { 205 | var value = domElement.getAttribute(attribute); 206 | if (!(value === "" || value === undefined || value === null)) { 207 | configuration[attributes[attribute]] = domElement.getAttribute(attribute); 208 | } 209 | } 210 | } 211 | //configuration.screencolor = 212 | var bgColor = domElement.style['#background-color']; 213 | if (bgColor && !(bgColor == "transparent" || bgColor == "rgba(0, 0, 0, 0)")) { 214 | configuration.screencolor = bgColor; 215 | } 216 | return configuration; 217 | } 218 | } 219 | 220 | function parseMediaElement(domElement, attributes) { 221 | attributes = getAttributeList('media', attributes); 222 | var sources = []; 223 | if (jwplayer.utils.isIE()) { 224 | // IE6/7/8 case 225 | var currentElement = domElement.nextSibling; 226 | if (currentElement !== undefined){ 227 | while(currentElement.tagName.toLowerCase() == "source") { 228 | sources.push(parseSourceElement(currentElement)); 229 | currentElement = currentElement.nextSibling; 230 | } 231 | } 232 | } else { 233 | //var sourceTags = domElement.getElementsByTagName("source"); 234 | var sourceTags = jwplayer.utils.selectors("source", domElement); 235 | for (var i in sourceTags) { 236 | if (!isNaN(i)){ 237 | sources.push(parseSourceElement(sourceTags[i])); 238 | } 239 | } 240 | } 241 | var configuration = parseElement(domElement, attributes); 242 | if (configuration.file !== undefined) { 243 | sources[0] = { 244 | 'file': configuration.file 245 | }; 246 | } 247 | configuration.levels = sources; 248 | return configuration; 249 | } 250 | 251 | function parseSourceElement(domElement, attributes) { 252 | attributes = getAttributeList('source', attributes); 253 | var result = parseElement(domElement, attributes); 254 | result.width = result.width ? result.width : 0; 255 | result.bitrate = result.bitrate ? result.bitrate : 0; 256 | return result; 257 | } 258 | 259 | function parseVideoElement(domElement, attributes) { 260 | attributes = getAttributeList('video', attributes); 261 | var result = parseMediaElement(domElement, attributes); 262 | return result; 263 | } 264 | 265 | /** For IE browsers, replacing a media element's contents isn't possible, since only the start tag 266 | * is matched by document.getElementById. This method traverses the elements siblings until it finds 267 | * the closing tag. If it can't find one, it will not remove the element's siblings. 268 | * 269 | * @param toReplace The media element to be replaced 270 | * @param html The replacement HTML code (string) 271 | **/ 272 | jwplayer.utils.mediaparser.replaceMediaElement = function(toReplace, html) { 273 | if (jwplayer.utils.isIE()) { 274 | var endTagFound = false; 275 | var siblings = []; 276 | var currentSibling = toReplace.nextSibling; 277 | while (currentSibling && !endTagFound) { 278 | siblings.push(currentSibling); 279 | currentSibling = currentSibling.nextSibling; 280 | if (currentSibling.nodeType == 1 && currentSibling.tagName.toLowerCase() == ("/")+toReplace.tagName.toLowerCase() ) { 281 | endTagFound = true; 282 | } 283 | } 284 | if (endTagFound) { 285 | while (siblings.length > 0) { 286 | var element = siblings.pop(); 287 | element.parentNode.removeChild(element); 288 | } 289 | } 290 | 291 | toReplace.outerHTML = html; 292 | } 293 | }; 294 | 295 | parsers.media = parseMediaElement; 296 | parsers.audio = parseMediaElement; 297 | parsers.source = parseSourceElement; 298 | parsers.video = parseVideoElement; 299 | 300 | 301 | })(jwplayer); 302 | jwplayer.utils.selectors = function(selector, parent){ 303 | if (parent === undefined) { 304 | parent = document; 305 | } 306 | selector = jwplayer.utils.strings.trim(selector); 307 | var selectType = selector.charAt(0); 308 | if (selectType == "#"){ 309 | return parent.getElementById(selector.substr(1)); 310 | } else if (selectType == "."){ 311 | if (parent.getElementsByClassName) { 312 | return parent.getElementsByClassName(selector.substr(1)); 313 | } else { 314 | return jwplayer.utils.selectors.getElementsByTagAndClass("*", selector.substr(1)); 315 | } 316 | } else { 317 | if (selector.indexOf(".") > 0){ 318 | selectors = selector.split("."); 319 | return jwplayer.utils.selectors.getElementsByTagAndClass(selectors[0], selectors[1]); 320 | } else { 321 | return parent.getElementsByTagName(selector); 322 | } 323 | } 324 | return null; 325 | }; 326 | 327 | jwplayer.utils.selectors.getElementsByTagAndClass = function(tagName, className, parent) { 328 | elements = []; 329 | if (parent === undefined) { 330 | parent = document; 331 | } 332 | var selected = parent.getElementsByTagName(tagName); 333 | for (var i = 0; i < selected.length; i++){ 334 | if (selected[i].className !== undefined){ 335 | var classes = selected[i].className.split(" "); 336 | for (var classIndex = 0; classIndex < classes.length; classIndex++){ 337 | if (classes[classIndex] == className){ 338 | elements.push(selected[i]); 339 | } 340 | } 341 | } 342 | } 343 | return elements; 344 | };jwplayer.utils.strings = function(){}; 345 | 346 | jwplayer.utils.strings.trim = function(inputString){ 347 | return inputString.replace(/^\s*/, "").replace(/\s*$/, ""); 348 | }; 349 | (function(jwplayer) { 350 | var _players = []; 351 | 352 | jwplayer.constructor = function(container) { 353 | return jwplayer.api.selectPlayer(container); 354 | }; 355 | 356 | jwplayer.api = function() {}; 357 | 358 | jwplayer.api.events = { 359 | API_READY: 'jwplayerAPIReady', 360 | JWPLAYER_READY: 'jwplayerReady', 361 | JWPLAYER_FULLSCREEN: 'jwplayerFullscreen', 362 | JWPLAYER_RESIZE: 'jwplayerResize', 363 | JWPLAYER_ERROR: 'jwplayerError', 364 | JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', 365 | JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', 366 | JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', 367 | JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', 368 | JWPLAYER_MEDIA_COMPLETE: 'jwplayerMediaComplete', 369 | JWPLAYER_MEDIA_TIME: 'jwplayerMediaTime', 370 | JWPLAYER_MEDIA_VOLUME: 'jwplayerMediaVolume', 371 | JWPLAYER_MEDIA_META: 'jwplayerMediaMeta', 372 | JWPLAYER_MEDIA_MUTE: 'jwplayerMediaMute', 373 | JWPLAYER_PLAYER_STATE: 'jwplayerPlayerState', 374 | JWPLAYER_PLAYLIST_LOADED: 'jwplayerPlaylistLoaded', 375 | JWPLAYER_PLAYLIST_ITEM: 'jwplayerPlaylistItem' 376 | }; 377 | 378 | jwplayer.api.events.state = { 379 | BUFFERING: 'BUFFERING', 380 | IDLE: 'IDLE', 381 | PAUSED: 'PAUSED', 382 | PLAYING: 'PLAYING' 383 | }; 384 | 385 | jwplayer.api.PlayerAPI = function(container) { 386 | this.container = container; 387 | this.id = container.id; 388 | 389 | var _listeners = {}; 390 | var _stateListeners = {}; 391 | var _readyListeners = []; 392 | var _player = undefined; 393 | var _playerReady = false; 394 | var _queuedCalls = []; 395 | 396 | var _originalHTML = container.outerHTML; 397 | 398 | var _itemMeta = {}; 399 | 400 | /** Use this function to set the internal low-level player. This is a javascript object which contains the low-level API calls. **/ 401 | this.setPlayer = function(player) { 402 | _player = player; 403 | }; 404 | 405 | this.stateListener = function(state, callback) { 406 | if (!_stateListeners[state]) { 407 | _stateListeners[state] = []; 408 | this.eventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, stateCallback(state)); 409 | } 410 | _stateListeners[state].push(callback); 411 | return this; 412 | }; 413 | 414 | function stateCallback(state) { 415 | return function(args) { 416 | var newstate = args['newstate'], 417 | oldstate = args['oldstate']; 418 | if (newstate == state) { 419 | var callbacks = _stateListeners[newstate]; 420 | if (callbacks) { 421 | for (var c in callbacks) { 422 | if (typeof callbacks[c] == 'function') { 423 | callbacks[c].call(this, {oldstate:oldstate, newstate:newstate}); 424 | } 425 | } 426 | } 427 | } 428 | }; 429 | }; 430 | 431 | this.addInternalListener = function(player, type) { 432 | player.jwAddEventListener(type, 'function(dat) { jwplayer("'+this.id+'").dispatchEvent("'+type+'", dat); }'); 433 | }; 434 | 435 | this.eventListener = function(type, callback) { 436 | if (!_listeners[type]) { 437 | _listeners[type] = []; 438 | if (_player && _playerReady) { 439 | this.addInternalListener(_player, type); 440 | } 441 | } 442 | _listeners[type].push(callback); 443 | return this; 444 | }; 445 | 446 | this.dispatchEvent = function(type) { 447 | if (_listeners[type]) { 448 | var args = translateEventResponse(type, arguments[1]); 449 | for (var l in _listeners[type]) { 450 | if (typeof _listeners[type][l] == 'function') { 451 | _listeners[type][l].call(this, args); 452 | } 453 | } 454 | } 455 | }; 456 | 457 | function translateEventResponse(type, eventProperties) { 458 | var translated = jwplayer.utils.extend({}, eventProperties); 459 | if (type == jwplayer.api.events.JWPLAYER_FULLSCREEN) { 460 | translated['fullscreen'] = translated['message']; 461 | delete translated['message']; 462 | } else if (typeof translated['data'] == "object") { 463 | // Takes ViewEvent "data" block and moves it up a level 464 | translated = jwplayer.utils.extend(translated, translated['data']); 465 | delete translated['data']; 466 | } 467 | 468 | return translated; 469 | } 470 | 471 | this.callInternal = function(funcName, args) { 472 | if (_playerReady) { 473 | if (typeof _player != "undefined" && typeof _player[funcName] == "function") { 474 | if (args !== undefined) { 475 | return (_player[funcName])(args); 476 | } else { 477 | return (_player[funcName])(); 478 | } 479 | } 480 | return null; 481 | } else { 482 | _queuedCalls.push({method:funcName, parameters:args}); 483 | } 484 | }; 485 | 486 | this.playerReady = function(obj) { 487 | _playerReady = true; 488 | if (!_player) { 489 | this.setPlayer(document.getElementById(obj['id'])); 490 | } 491 | 492 | for (var eventType in _listeners) { 493 | this.addInternalListener(_player, eventType); 494 | } 495 | 496 | this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, function(data) { 497 | _itemMeta = {}; 498 | }); 499 | 500 | this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_META, function(data) { 501 | jwplayer.utils.extend(_itemMeta, data.metadata); 502 | }); 503 | 504 | this.dispatchEvent(jwplayer.api.events.API_READY); 505 | 506 | while (_queuedCalls.length > 0) { 507 | var call = _queuedCalls.shift(); 508 | this.callInternal(call.method, call.parameters); 509 | } 510 | }; 511 | 512 | this.getItemMeta = function() { 513 | return _itemMeta; 514 | }; 515 | 516 | this.destroy = function() { 517 | _listeners = {}; 518 | _queuedCalls = []; 519 | if (this.container.outerHTML != _originalHTML){ 520 | jwplayer.api.destroyPlayer(this.id, _originalHTML); 521 | } 522 | }; 523 | 524 | 525 | /** Using this function instead of array.slice since Arguments are not an array **/ 526 | function slice(list, from, to) { 527 | var ret = []; 528 | if (!from) { from = 0; } 529 | if (!to) { to = list.length-1; } 530 | for (var i=from; i<=to; i++) { 531 | ret.push(list[i]); 532 | } 533 | return ret; 534 | } 535 | 536 | }; 537 | 538 | jwplayer.api.PlayerAPI.prototype = { 539 | // Player properties 540 | container: undefined, 541 | options: undefined, 542 | id: undefined, 543 | 544 | // Player Getters 545 | getBuffer: function() { return this.callInternal('jwGetBuffer'); }, 546 | getDuration: function() { return this.callInternal('jwGetDuration'); }, 547 | getFullscreen: function() { return this.callInternal('jwGetFullscreen'); }, 548 | getHeight: function() { return this.callInternal('jwGetHeight'); }, 549 | getLockState: function() { return this.callInternal('jwGetLockState'); }, 550 | getMeta: function() { return this.getItemMeta(); }, 551 | getMute: function() { return this.callInternal('jwGetMute'); }, 552 | getPlaylist: function() { return this.callInternal('jwGetPlaylist'); }, 553 | getPlaylistItem: function(item) { 554 | if (item == undefined) item = 0; 555 | return this.getPlaylist()[item]; 556 | }, 557 | getPosition: function() { return this.callInternal('jwGetPosition'); }, 558 | getState: function() { return this.callInternal('jwGetState'); }, 559 | getVolume: function() { return this.callInternal('jwGetVolume'); }, 560 | getWidth: function() { return this.callInternal('jwGetWidth'); }, 561 | 562 | // Player Public Methods 563 | setFullscreen: function(fullscreen) { this.callInternal("jwSetFullscreen", fullscreen); return this;}, 564 | setMute: function(mute) { this.callInternal("jwSetMute", mute); return this; }, 565 | lock: function() { return this; }, 566 | unlock: function() { return this; }, 567 | load: function(toLoad) { this.callInternal("jwLoad", toLoad); return this; }, 568 | playlistItem: function(item) { this.callInternal("jwPlaylistItem", item); return this; }, 569 | playlistPrev: function() { this.callInternal("jwPlaylistPrev"); return this; }, 570 | playlistNext: function() { this.callInternal("jwPlaylistNext"); return this; }, 571 | resize: function(width, height) { 572 | this.container.width = width; 573 | this.container.height = height; 574 | return this; 575 | }, 576 | play: function(state) { 577 | if (typeof state === "undefined") { 578 | var state = this.getState(); 579 | if (state == jwplayer.api.events.state.PLAYING || state == jwplayer.api.events.state.BUFFERING) { 580 | this.callInternal("jwPause"); 581 | } else { 582 | this.callInternal("jwPlay"); 583 | } 584 | } else { 585 | this.callInternal("jwPlay", state); 586 | } 587 | return this; 588 | }, 589 | pause: function() { 590 | var state = this.getState(); 591 | switch (state) { 592 | case jwplayer.api.events.state.PLAYING: 593 | case jwplayer.api.events.state.BUFFERING: 594 | this.callInternal("jwPause"); 595 | break; 596 | case jwplayer.api.events.state.PAUSED: 597 | this.callInternal("jwPlay"); 598 | break; 599 | } 600 | return this; 601 | }, 602 | stop: function() { this.callInternal("jwStop"); return this; }, 603 | seek: function(position) { this.callInternal("jwSeek", position); return this; }, 604 | setVolume: function(volume) { this.callInternal("jwSetVolume", volume); return this; }, 605 | 606 | // Player Events 607 | onBufferChange: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, callback); }, 608 | onBufferFull: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, callback); }, 609 | onError: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_ERROR, callback); }, 610 | onFullscreen: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_FULLSCREEN, callback); }, 611 | onMeta: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_META, callback); }, 612 | onMute: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, callback); }, 613 | onPlaylist: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, callback); }, 614 | onPlaylistItem: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, callback); }, 615 | onReady: function(callback) { return this.eventListener(jwplayer.api.events.API_READY, callback); }, 616 | onResize: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_RESIZE, callback); }, 617 | onComplete: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, callback); }, 618 | onTime: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, callback); }, 619 | onVolume: function(callback) { return this.eventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, callback); }, 620 | 621 | // State events 622 | onBuffer: function(callback) { return this.stateListener(jwplayer.api.events.state.BUFFERING, callback); }, 623 | onPause: function(callback) { return this.stateListener(jwplayer.api.events.state.PAUSED, callback); }, 624 | onPlay: function(callback) { return this.stateListener(jwplayer.api.events.state.PLAYING, callback); }, 625 | onIdle: function(callback) { return this.stateListener(jwplayer.api.events.state.IDLE, callback); }, 626 | 627 | setup: function(options) { return this; }, 628 | remove: function() { 629 | this.destroy(); 630 | }, 631 | 632 | // Player plugin API 633 | initializePlugin: function(pluginName, pluginCode) { return this; } 634 | }; 635 | 636 | jwplayer.api.selectPlayer = function(identifier) { 637 | var _container; 638 | 639 | if (identifier == undefined) identifier = 0; 640 | 641 | if (identifier.nodeType) { 642 | // Handle DOM Element 643 | _container = identifier; 644 | } else if (typeof identifier == 'string') { 645 | // Find container by ID 646 | _container = document.getElementById(identifier); 647 | } 648 | 649 | if (_container) { 650 | var foundPlayer = jwplayer.api.playerById(_container.id); 651 | if (foundPlayer) { 652 | return foundPlayer; 653 | } else { 654 | // Todo: register new object 655 | return jwplayer.api.addPlayer(new jwplayer.api.PlayerAPI(_container)); 656 | } 657 | } else if (typeof identifier == 'number') { 658 | return jwplayer.getPlayers()[identifier]; 659 | } 660 | 661 | return null; 662 | }; 663 | 664 | jwplayer.api.playerById = function(id) { 665 | for(var p in _players) { 666 | if (_players[p].id == id) { 667 | return _players[p]; 668 | } 669 | } 670 | return null; 671 | }; 672 | 673 | jwplayer.api.addPlayer = function(player) { 674 | for (var i in _players) { 675 | if (_players[i] == player) { 676 | return player; // Player is already in the list; 677 | } 678 | } 679 | 680 | _players.push(player); 681 | return player; 682 | }; 683 | 684 | jwplayer.api.destroyPlayer = function(playerId, replacementHTML) { 685 | var index = -1; 686 | for(var p in _players) { 687 | if (_players[p].id == playerId) { 688 | index = p; 689 | continue; 690 | } 691 | } 692 | if (index >= 0) { 693 | var toDestroy = document.getElementById(_players[index].id); 694 | if (toDestroy) { 695 | if (replacementHTML) { 696 | toDestroy.outerHTML = replacementHTML; 697 | } else { 698 | var replacement = document.createElement('div'); 699 | replacement.setAttribute('id', toDestroy.id); 700 | toDestroy.parentNode.replaceChild(replacement, toDestroy); 701 | } 702 | } 703 | _players.splice(index, 1); 704 | } 705 | 706 | return null; 707 | }; 708 | 709 | // Can't make this a read-only getter, thanks to IE incompatibility. 710 | jwplayer.getPlayers = function() { 711 | return _players.slice(0); 712 | }; 713 | 714 | })(jwplayer); 715 | 716 | var _userPlayerReady = (typeof playerReady == 'function') ? playerReady : undefined; 717 | 718 | playerReady = function(obj) { 719 | var api = jwplayer.api.playerById(obj['id']); 720 | if (api) { 721 | api.playerReady(obj); 722 | } 723 | 724 | if (_userPlayerReady) { 725 | _userPlayerReady.call(this, obj); 726 | } 727 | }; 728 | (function(jwplayer) { 729 | 730 | jwplayer.embed = function() { 731 | }; 732 | 733 | jwplayer.embed.Embedder = function(playerApi) { 734 | this.constructor(playerApi); 735 | }; 736 | 737 | jwplayer.embed.defaults = { 738 | width : 400, 739 | height : 300, 740 | players: [{type:"flash", src:"player.swf"},{type:'html5'}], 741 | components: { 742 | controlbar: { 743 | position: "over" 744 | } 745 | } 746 | }; 747 | 748 | jwplayer.embed.Embedder.prototype = { 749 | config: undefined, 750 | api: undefined, 751 | events: {}, 752 | players: undefined, 753 | 754 | constructor : function(playerApi) { 755 | this.api = playerApi; 756 | var mediaConfig = jwplayer.utils.mediaparser.parseMedia(this.api.container); 757 | this.config = this.parseConfig(jwplayer.utils.extend({}, jwplayer.embed.defaults, mediaConfig, this.api.config)); 758 | }, 759 | 760 | embedPlayer : function() { 761 | // TODO: Parse playlist for playable content 762 | var player = this.players[0]; 763 | if (player && player.type) { 764 | switch (player.type) { 765 | case 'flash': 766 | if (jwplayer.utils.hasFlash()) { 767 | // TODO: serialize levels & playlist, de-serialize in 768 | // Flash 769 | if (this.config.levels || this.config.playlist) { 770 | this.api.onReady(this.loadAfterReady(this.config)); 771 | } 772 | 773 | // Make sure we're passing the correct ID into Flash for 774 | // Linux API support 775 | this.config.id = this.api.id; 776 | 777 | var flashPlayer = jwplayer.embed.embedFlash(document.getElementById(this.api.id), player, this.config); 778 | this.api.container = flashPlayer; 779 | this.api.setPlayer(flashPlayer); 780 | } else { 781 | this.players.splice(0, 1); 782 | return this.embedPlayer(); 783 | } 784 | break; 785 | case 'html5': 786 | if (jwplayer.utils.hasHTML5()) { 787 | var html5player = jwplayer.embed.embedHTML5(document.getElementById(this.api.id), player, this.config); 788 | this.api.container = document.getElementById(this.api.id); 789 | this.api.setPlayer(html5player); 790 | } else { 791 | this.players.splice(0, 1); 792 | return this.embedPlayer(); 793 | } 794 | break; 795 | } 796 | } else { 797 | this.api.container.innerHTML = "

No suitable players found

"; 798 | } 799 | 800 | this.setupEvents(); 801 | 802 | return this.api; 803 | }, 804 | 805 | setupEvents : function() { 806 | for (evt in this.events) { 807 | if (typeof this.api[evt] == "function") { 808 | (this.api[evt]).call(this.api, this.events[evt]); 809 | } 810 | } 811 | }, 812 | 813 | loadAfterReady : function(loadParams) { 814 | return function(obj) { 815 | if (loadParams.playlist) { 816 | this.load(loadParams.playlist); 817 | } else if (loadParams.levels) { 818 | var item = this.getPlaylistItem(0); 819 | if (!item) { 820 | item = { file: loadParams.levels[0].file, provider:'video' }; 821 | } 822 | if (!item.image) { 823 | item.image = loadParams.image; 824 | } 825 | item.levels = loadParams.levels; 826 | this.load(item); 827 | } 828 | }; 829 | }, 830 | 831 | parseConfig : function(config) { 832 | var parsedConfig = jwplayer.utils.extend( {}, config); 833 | if (parsedConfig.events) { 834 | this.events = parsedConfig.events; 835 | delete parsedConfig['events']; 836 | } 837 | if (parsedConfig.players) { 838 | this.players = parsedConfig.players; 839 | delete parsedConfig['players']; 840 | } 841 | if (parsedConfig.plugins) { 842 | if (typeof parsedConfig.plugins == "object") { 843 | parsedConfig = jwplayer.utils.extend(parsedConfig, jwplayer.embed.parsePlugins(parsedConfig.plugins)); 844 | } 845 | } 846 | return parsedConfig; 847 | } 848 | 849 | }; 850 | 851 | jwplayer.embed.embedFlash = function(_container, _player, _options) { 852 | var params = jwplayer.utils.extend( {}, _options); 853 | 854 | var width = params.width; 855 | delete params['width']; 856 | 857 | var height = params.height; 858 | delete params['height']; 859 | 860 | // These properties are loaded after playerready; not sent in as 861 | // flashvars. 862 | if (params.levels && params.levels.length && params.file === undefined) { 863 | // params.file = params.levels[0]['file']; 864 | } 865 | 866 | delete params['levels']; 867 | delete params['playlist']; 868 | 869 | jwplayer.embed.parseConfigBlock(params, 'components'); 870 | jwplayer.embed.parseConfigBlock(params, 'providers'); 871 | 872 | if (jwplayer.utils.isIE()) { 873 | var html = ''; 881 | html += ''; 882 | html += ''; 883 | html += ''; 884 | html += ''; 886 | html += ''; 887 | if (_container.tagName.toLowerCase() == "video") { 888 | jwplayer.utils.mediaparser.replaceMediaElement(_container, html); 889 | } else { 890 | _container.outerHTML = html; 891 | } 892 | return document.getElementById(_container.id); 893 | } else { 894 | var obj = document.createElement('object'); 895 | obj.setAttribute('type', 'application/x-shockwave-flash'); 896 | obj.setAttribute('data', _player.src); 897 | obj.setAttribute('width', width); 898 | obj.setAttribute('height', height); 899 | obj.setAttribute('id', _container.id); 900 | obj.setAttribute('name', _container.id); 901 | jwplayer.embed.appendAttribute(obj, 'allowfullscreen', 'true'); 902 | jwplayer.embed.appendAttribute(obj, 'allowscriptaccess', 'always'); 903 | jwplayer.embed.appendAttribute(obj, 'flashvars', jwplayer.embed 904 | .jsonToFlashvars(params)); 905 | _container.parentNode.replaceChild(obj, _container); 906 | return obj; 907 | } 908 | 909 | }; 910 | 911 | jwplayer.embed.embedHTML5 = function(container, player, options) { 912 | if (jwplayer.html5) { 913 | container.innerHTML = "

Embedded HTML5 player goes here

"; 914 | var playerOptions = jwplayer.utils.extend( {screencolor:'0x000000'}, options); 915 | jwplayer.embed.parseConfigBlock(playerOptions, 'components'); 916 | // TODO: remove this requirement from the html5 player (sources 917 | // instead of levels) 918 | if (playerOptions.levels && !playerOptions.sources) 919 | playerOptions.sources = options.levels; 920 | return new (jwplayer.html5(container)).setup(playerOptions); 921 | } else { 922 | return null; 923 | } 924 | }; 925 | 926 | jwplayer.embed.appendAttribute = function(object, name, value) { 927 | var param = document.createElement('param'); 928 | param.setAttribute('name', name); 929 | param.setAttribute('value', value); 930 | object.appendChild(param); 931 | }; 932 | 933 | jwplayer.embed.jsonToFlashvars = function(json) { 934 | var flashvars = ''; 935 | for (key in json) { 936 | flashvars += key + '=' + escape(json[key]) + '&'; 937 | } 938 | return flashvars.substring(0, flashvars.length - 1); 939 | }; 940 | 941 | jwplayer.embed.parsePlugins = function(pluginBlock) { 942 | if (!pluginBlock) return {}; 943 | 944 | var flat = {}, pluginKeys = []; 945 | 946 | for (plugin in pluginBlock) { 947 | var pluginName = plugin.indexOf('-') > 0 ? plugin.substring(0, plugin.indexOf('-')) : plugin; 948 | var pluginConfig = pluginBlock[plugin]; 949 | pluginKeys.push(plugin); 950 | for (param in pluginConfig) { 951 | flat[pluginName + '.' + param] = pluginConfig[param]; 952 | } 953 | } 954 | flat['plugins'] = pluginKeys.join(','); 955 | return flat; 956 | }; 957 | 958 | jwplayer.embed.parseConfigBlock = function(options, blockName) { 959 | if (options[blockName]) { 960 | var components = options[blockName]; 961 | for ( var name in components) { 962 | var component = components[name]; 963 | if (typeof component == "string") { 964 | // i.e. controlbar="over" 965 | options[name] = component; 966 | } else { 967 | // i.e. controlbar.position="over" 968 | for ( var option in component) { 969 | options[name + '.' + option] = component[option]; 970 | } 971 | } 972 | } 973 | delete options[blockName]; 974 | } 975 | }; 976 | 977 | jwplayer.api.PlayerAPI.prototype.setup = function(options, players) { 978 | if (options && options['flashplayer'] && !options['players']) { 979 | options['players'] = [{type:'flash', src:options['flashplayer']},{type:'html5'}]; 980 | delete options['flashplayer']; 981 | } 982 | if (players && !options['players']) { 983 | if (typeof players == "string") { 984 | options['players'] = [{type:"flash", src:players}]; 985 | } else if (players instanceof Array) { 986 | options['players'] = players; 987 | } else if (typeof players == "object" && players.type) { 988 | options['players'] = [players]; 989 | } 990 | } 991 | 992 | // Destroy original API on setup() to remove existing listeners 993 | var newId = this.id; 994 | this.remove(); 995 | var newApi = jwplayer(newId); 996 | newApi.config = options; 997 | return (new jwplayer.embed.Embedder(newApi)).embedPlayer(); 998 | }; 999 | 1000 | function noviceEmbed() { 1001 | if (!document.body) { 1002 | return setTimeout(noviceEmbed, 15); 1003 | } 1004 | var videoTags = jwplayer.utils.selectors.getElementsByTagAndClass('video','jwplayer'); 1005 | for (var i=0; i 0 && (queryparams < 0 || (queryparams > protocol))); 70 | } 71 | 72 | 73 | jwplayer.html5.utils.mapEmpty = function(map) { 74 | for (var val in map) { 75 | return false; 76 | } 77 | return true; 78 | }; 79 | 80 | jwplayer.html5.utils.mapLength = function(map) { 81 | var result = 0; 82 | for (var val in map) { 83 | result++; 84 | } 85 | return result; 86 | }; 87 | 88 | /** Logger **/ 89 | jwplayer.html5.utils.log = function(msg, obj) { 90 | if (obj) { 91 | obj.message = msg; 92 | console.log(obj); 93 | } else { 94 | console.log(msg); 95 | } 96 | return this; 97 | }; 98 | 99 | jwplayer.html5.utils.css = function(domelement, styles) { 100 | if (domelement !== undefined) { 101 | for (var style in styles) { 102 | try { 103 | domelement.style[style.replace("_", "-")] = styles[style]; 104 | } catch (err) { 105 | console.log(err); 106 | } 107 | } 108 | } 109 | }; 110 | })(jwplayer); 111 | /** 112 | * JW Player view component 113 | * 114 | * @author zach 115 | * @version 1.0 116 | */ 117 | (function(jwplayer) { 118 | 119 | var _css = jwplayer.html5.utils.css; 120 | 121 | jwplayer.html5.view = function(api, container, model) { 122 | var _container; 123 | var _wrapper; 124 | var _zindex = 0; 125 | var _width; 126 | var _height; 127 | var _box = { 128 | top: 0, 129 | right: 0, 130 | bottom: 0, 131 | left: 0 132 | }; 133 | 134 | function createWrapper() { 135 | _wrapper = document.createElement("div"); 136 | _wrapper.id = _container.id; 137 | _container.id = _wrapper.id + "_video"; 138 | 139 | _css(_wrapper, { 140 | position: 'relative', 141 | height: model.height, 142 | width: model.width, 143 | margin: 'auto', 144 | padding: 0, 145 | background: api.skin.getComponentSettings("display").backgroundcolor === undefined ? "" : api.skin.getComponentSettings("display").backgroundcolor.replace("0x", "#"), 146 | z_index: getNextZIndex() 147 | }); 148 | 149 | _css(_container, { 150 | position: 'absolute', 151 | width: model.width, 152 | height: model.height, 153 | top: 0, 154 | left: 0, 155 | z_index: 1, 156 | margin: 'auto', 157 | display: 'block' 158 | }); 159 | 160 | jwplayer.utils.wrap(_container, _wrapper); 161 | } 162 | 163 | function getNextZIndex() { 164 | return _zindex++; 165 | } 166 | 167 | function layoutComponents() { 168 | if (model.getMedia() !== undefined && !model.getMedia().hasChrome && !model.config.chromeless) { 169 | for (var pluginIndex in model.plugins.order) { 170 | var pluginName = model.plugins.order[pluginIndex]; 171 | if (model.plugins.object[pluginName].getDisplayElement !== undefined) { 172 | var plugincss = { 173 | position: 'absolute', 174 | z_index: getNextZIndex(), 175 | margin: 0, 176 | padding: 0 177 | }; 178 | var elementWidth, elementHeight; 179 | switch (model.plugins.config[pluginName].position.toUpperCase()) { 180 | case jwplayer.html5.view.positions.OVER: 181 | break; 182 | case jwplayer.html5.view.positions.TOP: 183 | plugincss.top = 0; 184 | elementHeight = getNumber(model.plugins.object[pluginName].getDisplayElement().style.height); 185 | _box.top += elementHeight; 186 | for (var childNode in _wrapper.childNodes) { 187 | if (!isNaN(parseInt(childNode, 10))) { 188 | _wrapper.childNodes[childNode].style.height = getNumber(_wrapper.childNodes[childNode].style.height) - elementHeight; 189 | _wrapper.childNodes[childNode].style.top = getNumber(_wrapper.childNodes[childNode].style.top) + elementHeight; 190 | } 191 | } 192 | break; 193 | case jwplayer.html5.view.positions.RIGHT: 194 | elementWidth = getNumber(model.plugins.object[pluginName].getDisplayElement().style.width); 195 | _box.right += elementWidth; 196 | break; 197 | case jwplayer.html5.view.positions.BOTTOM: 198 | elementHeight = getNumber(model.plugins.object[pluginName].getDisplayElement().style.height); 199 | plugincss.top = getNumber(_wrapper.style.height) - elementHeight - _box.bottom; 200 | _box.bottom += elementHeight; 201 | break; 202 | case jwplayer.html5.view.positions.LEFT: 203 | elementWidth = getNumber(model.plugins.object[pluginName].getDisplayElement().style.width); 204 | _box.left += elementWidth; 205 | break; 206 | } 207 | _container.parentNode.appendChild(model.plugins.object[pluginName].getDisplayElement()); 208 | model.plugins.style[pluginName] = plugincss; 209 | } 210 | } 211 | } else { 212 | model.getMedia().getDisplayElement().poster = model.playlist[model.item].image; 213 | model.getMedia().getDisplayElement().controls = "controls"; 214 | } 215 | } 216 | 217 | function getNumber(style) { 218 | if (style === "") { 219 | return 0; 220 | } 221 | return parseInt(style.replace("px", ""), 10); 222 | } 223 | 224 | this.setup = function(container) { 225 | _container = container; 226 | createWrapper(); 227 | layoutComponents(); 228 | _resize(model.width, model.height); 229 | window.onresize = function(evt) { 230 | if (api.jwGetFullscreen()) { 231 | model.width = document.body.clientWidth; 232 | model.height = document.body.clientHeight; 233 | } 234 | _resize(model.width, model.height); 235 | }; 236 | }; 237 | 238 | function _resize(width, height) { 239 | if (!model.fullscreen) { 240 | _width = width; 241 | _height = height; 242 | } 243 | for (var pluginIndex in model.plugins.order) { 244 | var pluginName = model.plugins.order[pluginIndex]; 245 | var style = model.plugins.style[pluginName]; 246 | if (api.jwGetFullscreen()){ 247 | style = jwplayer.utils.extend({}, model.plugins.style[pluginName], { 248 | position: "fixed", 249 | top: 0, 250 | left: 0 251 | }); 252 | } 253 | _css(model.plugins.object[pluginName].getDisplayElement(), style); 254 | if (model.plugins.config[pluginName].position == jwplayer.html5.view.positions.OVER && !api.jwGetFullscreen()) { 255 | model.plugins.object[pluginName].resize(model.width - _box.left - _box.right, model.height - _box.top - _box.bottom); 256 | } else { 257 | model.plugins.object[pluginName].resize(model.width, model.height); 258 | } 259 | } 260 | if (!model.fullscreen) { 261 | _css(model.getMedia().getDisplayElement(), { 262 | position: 'absolute', 263 | width: (model.width - _box.left - _box.right), 264 | height: (model.height - _box.top - _box.bottom), 265 | top: _box.top, 266 | left: _box.left 267 | }); 268 | } 269 | } 270 | 271 | this.resize = _resize; 272 | 273 | this.fullscreen = function(state) { 274 | if (model.getMedia().getDisplayElement().webkitSupportsFullscreen) { 275 | if (state) { 276 | model.height = screen.availHeight; 277 | model.width = screen.availWidth; 278 | model.getMedia().getDisplayElement().webkitEnterFullscreen(); 279 | } else { 280 | model.height = _height; 281 | model.width = _width; 282 | model.getMedia().getDisplayElement().webkitExitFullscreen(); 283 | } 284 | } else { 285 | if (state) { 286 | model.width = document.body.clientWidth; 287 | model.height = document.body.clientHeight; 288 | _css(_wrapper, { 289 | position: "fixed", 290 | width: "100%", 291 | height: "100%", 292 | top: 0, 293 | left: 0 294 | }); 295 | _css(model.getMedia().getDisplayElement(), { 296 | position: "fixed", 297 | width: "100%", 298 | height: "100%" 299 | }); 300 | } else { 301 | model.width = _width; 302 | model.height = _height; 303 | _css(_wrapper, { 304 | position: 'relative', 305 | height: model.height, 306 | width: model.width 307 | }); 308 | _css(model.getMedia().getDisplayElement(), { 309 | position: 'absolute', 310 | width: model.width, 311 | height: model.height, 312 | top: _box.top, 313 | left: _box.left 314 | }); 315 | } 316 | _resize(model.width, model.height); 317 | } 318 | }; 319 | 320 | }; 321 | 322 | jwplayer.html5.view.positions = { 323 | TOP: "TOP", 324 | RIGHT: "RIGHT", 325 | BOTTOM: "BOTTOM", 326 | LEFT: "LEFT", 327 | OVER: "OVER" 328 | }; 329 | })(jwplayer); 330 | /** 331 | * jwplayer controlbar component of the JW Player. 332 | * 333 | * @author zach 334 | * @version 1.0 335 | */ 336 | (function(jwplayer) { 337 | /** Map with config for the jwplayerControlbar plugin. **/ 338 | var _defaults = { 339 | backgroundcolor: "000000", 340 | margin: 10, 341 | //font: "_sans", 342 | font: "Arial,sans-serif", 343 | fontsize: 10, 344 | fontcolor: "000000", 345 | fontstyle: "normal", 346 | //fontweight: "normal", 347 | fontweight: "bold", 348 | buttoncolor: "ffffff", 349 | position: jwplayer.html5.view.positions.BOTTOM, 350 | idlehide: false, 351 | layout: { 352 | "left": { 353 | "position": "left", 354 | "elements": [{ 355 | "name": "play", 356 | "type": "button" 357 | }, { 358 | "name": "divider", 359 | "type": "divider" 360 | }, { 361 | "name": "prev", 362 | "type": "button" 363 | }, { 364 | "name": "divider", 365 | "type": "divider" 366 | }, { 367 | "name": "next", 368 | "type": "button" 369 | }, { 370 | "name": "divider", 371 | "type": "divider" 372 | }, { 373 | "name": "elapsed", 374 | "type": "text" 375 | }] 376 | }, 377 | "center": { 378 | "position": "center", 379 | "elements": [{ 380 | "name": "time", 381 | "type": "slider" 382 | }] 383 | }, 384 | "right": { 385 | "position": "right", 386 | "elements": [{ 387 | "name": "duration", 388 | "type": "text" 389 | }, { 390 | "name": "divider", 391 | "type": "divider" 392 | }, { 393 | "name": "blank", 394 | "type": "button" 395 | }, { 396 | "name": "fullscreen", 397 | "type": "button" 398 | }, { 399 | "name": "divider", 400 | "type": "divider" 401 | }, { 402 | "name": "mute", 403 | "type": "button" 404 | }, { 405 | "name": "volume", 406 | "type": "slider" 407 | }] 408 | } 409 | } 410 | }; 411 | 412 | _css = jwplayer.html5.utils.css; 413 | 414 | _hide = function(element) { 415 | _css(element, { 416 | display: "none" 417 | }); 418 | }; 419 | 420 | _show = function(element) { 421 | _css(element, { 422 | display: "block" 423 | }); 424 | }; 425 | 426 | jwplayer.html5.controlbar = function(api, config) { 427 | var _settings = jwplayer.utils.extend({}, _defaults, api.skin.getComponentSettings("controlbar"), config); 428 | if (jwplayer.html5.utils.mapLength(api.skin.getComponentLayout("controlbar")) > 0) { 429 | _settings.layout = api.skin.getComponentLayout("controlbar"); 430 | } 431 | var _wrapper; 432 | var _dividerid = 0; 433 | var _marginleft = 0; 434 | var _marginright = 0; 435 | var _scrubber = "none"; 436 | var _mousedown; 437 | var _currentPosition; 438 | var _currentDuration; 439 | var _currentBuffer; 440 | var _width; 441 | var _height; 442 | var _prevElement; 443 | var _elements = {}; 444 | var _ready = false; 445 | var _fadeOutTimeout; 446 | 447 | 448 | function _buildBase() { 449 | var wrappercss = { 450 | height: api.skin.getSkinElement("controlbar", "background").height, 451 | background_color: "#" + _settings.backgroundcolor 452 | }; 453 | 454 | _wrapper = document.createElement("div"); 455 | _wrapper.id = api.id + "_jwplayer_controlbar"; 456 | _css(_wrapper, wrappercss); 457 | 458 | _addElement("capLeft", "left", false, _wrapper); 459 | var domelmentcss = { 460 | position: "absolute", 461 | height: api.skin.getSkinElement("controlbar", "background").height, 462 | background: " url(" + api.skin.getSkinElement("controlbar", "background").src + ") repeat-x center left", 463 | left: api.skin.getSkinElement("controlbar", "capLeft").width 464 | }; 465 | _appendNewElement("elements", _wrapper, domelmentcss); 466 | _addElement("capRight", "right", false, _wrapper); 467 | } 468 | 469 | this.getDisplayElement = function() { 470 | return _wrapper; 471 | }; 472 | 473 | this.resize = function(width, height) { 474 | if (_wrapper.parentElement !== undefined && !_ready) { 475 | _ready = true; 476 | document.getElementById(api.id).onmousemove = _fadeOut; 477 | } 478 | _width = width; 479 | _height = height; 480 | if (api.jwGetFullscreen()) { 481 | _show(_elements.normalscreenButton); 482 | _hide(_elements.fullscreenButton); 483 | } else { 484 | _hide(_elements.normalscreenButton); 485 | _show(_elements.fullscreenButton); 486 | } 487 | _resizeBar(); 488 | _timeHandler({}); 489 | _bufferHandler({}); 490 | }; 491 | 492 | function _fadeOut() { 493 | _wrapper.style.opacity = 1; 494 | if (_fadeOutTimeout !== undefined) { 495 | clearTimeout(_fadeOutTimeout); 496 | } 497 | _fadeOutTimeout = setTimeout(function() { 498 | console.log("fading out"); 499 | jwplayer.html5.utils.fadeTo(_wrapper, 0, 1, 1); 500 | _fadeOutTimeout = undefined; 501 | }, 2000); 502 | } 503 | 504 | function _fadeIn(){ 505 | _wrapper.style.opacity = 1; 506 | } 507 | 508 | function _appendNewElement(id, parent, css) { 509 | var element = document.createElement("div"); 510 | _elements[id] = element; 511 | element.id = _wrapper.id + "_" + id; 512 | parent.appendChild(element); 513 | if (css !== undefined) { 514 | _css(element, css); 515 | } 516 | return element; 517 | } 518 | 519 | /** Draw the jwplayerControlbar elements. **/ 520 | function _buildElements() { 521 | _buildGroup(_settings.layout.left); 522 | _buildGroup(_settings.layout.right, -1); 523 | _buildGroup(_settings.layout.center); 524 | } 525 | 526 | /** Layout a group of elements**/ 527 | function _buildGroup(group, order) { 528 | var alignment = group.position == "right" ? "right" : "left"; 529 | var elements = jwplayer.utils.extend([], group.elements); 530 | if (order !== undefined) { 531 | elements.reverse(); 532 | } 533 | for (var i = 0; i < elements.length; i++) { 534 | _buildElement(elements[i], alignment); 535 | } 536 | } 537 | 538 | function getNewDivivderId() { 539 | return _dividerid++; 540 | } 541 | 542 | /** Draw a single element into the jwplayerControlbar. **/ 543 | function _buildElement(element, alignment) { 544 | switch (element.name) { 545 | case "play": 546 | _addElement("playButton", alignment, false); 547 | _addElement("pauseButton", alignment, true); 548 | _buildHandler("playButton", "jwPlay"); 549 | _buildHandler("pauseButton", "jwPause"); 550 | break; 551 | case "divider": 552 | _addElement("divider" + getNewDivivderId(), alignment, true); 553 | break; 554 | case "prev": 555 | if (api.jwGetPlaylist().length > 1) { 556 | _addElement("prevButton", alignment, true); 557 | _buildHandler("prevButton", "jwPlaylistPrev"); 558 | } 559 | break; 560 | case "next": 561 | if (api.jwGetPlaylist().length > 1) { 562 | _addElement("nextButton", alignment, true); 563 | _buildHandler("nextButton", "jwPlaylistNext"); 564 | } 565 | break; 566 | case "elapsed": 567 | _addElement("elapsedText", alignment, true); 568 | break; 569 | case "time": 570 | var offsetLeft = api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 571 | var offsetRight = api.skin.getSkinElement("controlbar", "timeSliderCapRight") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapRight").width; 572 | var offset = alignment == "left" ? offsetLeft : offsetRight; 573 | var width = api.skin.getSkinElement("controlbar", "timeSliderRail").width + offsetLeft + offsetRight; 574 | var slidercss = { 575 | height: api.skin.getSkinElement("controlbar", "background").height, 576 | position: "absolute", 577 | top: "0px", 578 | width: width 579 | }; 580 | slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 581 | var _timeslider = _appendNewElement("timeSlider", _elements.elements, slidercss); 582 | _addElement("timeSliderCapLeft", alignment, true, _timeslider, alignment == "left" ? 0 : offset); 583 | _addElement("timeSliderRail", alignment, false, _timeslider, offset); 584 | _addElement("timeSliderBuffer", alignment, false, _timeslider, offset); 585 | _addElement("timeSliderProgress", alignment, false, _timeslider, offset); 586 | _addElement("timeSliderThumb", alignment, false, _timeslider, offset); 587 | _addElement("timeSliderCapRight", alignment, true, _timeslider, alignment == "right" ? 0 : offset); 588 | _addSliderListener("time"); 589 | break; 590 | case "fullscreen": 591 | _addElement("fullscreenButton", alignment, false); 592 | _addElement("normalscreenButton", alignment, true); 593 | _buildHandler("fullscreenButton", "jwSetFullscreen", true); 594 | _buildHandler("normalscreenButton", "jwSetFullscreen", false); 595 | break; 596 | case "volume": 597 | var offsetLeft = api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 598 | var offsetRight = api.skin.getSkinElement("controlbar", "volumeSliderCapRight") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapRight").width; 599 | var offset = alignment == "left" ? offsetLeft : offsetRight; 600 | var width = api.skin.getSkinElement("controlbar", "volumeSliderRail").width + offsetLeft + offsetRight; 601 | var slidercss = { 602 | height: api.skin.getSkinElement("controlbar", "background").height, 603 | position: "absolute", 604 | top: "0px", 605 | width: width 606 | }; 607 | slidercss[alignment] = alignment == "left" ? _marginleft : _marginright; 608 | var _volumeslider = _appendNewElement("volumeSlider", _elements.elements, slidercss); 609 | _addElement("volumeSliderCapLeft", alignment, true, _volumeslider, alignment == "left" ? 0 : offset); 610 | _addElement("volumeSliderRail", alignment, true, _volumeslider, offset); 611 | _addElement("volumeSliderProgress", alignment, false, _volumeslider, offset); 612 | _addElement("volumeSliderCapRight", alignment, true, _volumeslider, alignment == "right" ? 0 : offset); 613 | _addSliderListener("volume"); 614 | break; 615 | case "mute": 616 | _addElement("muteButton", alignment, false); 617 | _addElement("unmuteButton", alignment, true); 618 | _buildHandler("muteButton", "jwSetMute", true); 619 | _buildHandler("unmuteButton", "jwSetMute", false); 620 | 621 | break; 622 | case "duration": 623 | _addElement("durationText", alignment, true); 624 | break; 625 | } 626 | } 627 | 628 | function _addElement(element, alignment, offset, parent, position) { 629 | if ((api.skin.getSkinElement("controlbar", element) !== undefined || element.indexOf("Text") > 0 || element.indexOf("divider") === 0) && !(element.indexOf("divider") === 0 && _prevElement.indexOf("divider") === 0)) { 630 | _prevElement = element; 631 | var css = { 632 | height: api.skin.getSkinElement("controlbar", "background").height, 633 | position: "absolute", 634 | top: "0px" 635 | }; 636 | var wid; 637 | if (element.indexOf("Text") > 0) { 638 | element.innerhtml = "00:00"; 639 | css.font = _settings.fontsize + "px/" + (api.skin.getSkinElement("controlbar", "background").height + 1) + "px " + _settings.font; 640 | css.color = _settings.fontcolor; 641 | css.text_align = "center"; 642 | css.font_weight = _settings.fontweight; 643 | css.font_style = _settings.fontstyle; 644 | css.cursor = "default"; 645 | wid = 14 + 3 * _settings.fontsize; 646 | css.color = "#" + _settings.fontcolor.substr(-6); 647 | } else if (element.indexOf("divider") === 0) { 648 | css.background = "url(" + api.skin.getSkinElement("controlbar", "divider").src + ") repeat-x center left"; 649 | wid = api.skin.getSkinElement("controlbar", "divider").width; 650 | } else { 651 | css.background = "url(" + api.skin.getSkinElement("controlbar", element).src + ") repeat-x center left"; 652 | wid = api.skin.getSkinElement("controlbar", element).width; 653 | } 654 | if (alignment == "left") { 655 | css.left = position === undefined ? _marginleft : position; 656 | if (offset) { 657 | _marginleft += wid; 658 | } 659 | } else if (alignment == "right") { 660 | css.right = position === undefined ? _marginright : position; 661 | if (offset) { 662 | _marginright += wid; 663 | } 664 | } 665 | 666 | if (parent === undefined) { 667 | parent = _elements.elements; 668 | } 669 | 670 | css.width = wid; 671 | 672 | var newelement = _appendNewElement(element, parent, css); 673 | if (api.skin.getSkinElement("controlbar", element + "Over") !== undefined) { 674 | newelement.onmouseover = function(evt) { 675 | evt.stopPropagation(); 676 | newelement.style["background-image"] = ["url(", api.skin.getSkinElement("controlbar", element + "Over").src, ")"].join(""); 677 | }; 678 | newelement.onmouseout = function(evt) { 679 | evt.stopPropagation(); 680 | newelement.style["background-image"] = ["url(", api.skin.getSkinElement("controlbar", element).src, ")"].join(""); 681 | }; 682 | } 683 | 684 | } 685 | } 686 | 687 | function _addListeners() { 688 | // Register events with the player. 689 | //api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED, _playlistHandler); 690 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, _bufferHandler); 691 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 692 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_TIME, _timeHandler); 693 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _muteHandler); 694 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, _volumeHandler); 695 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE, _completeHandler); 696 | } 697 | 698 | /** Add interactivity to the jwplayerControlbar elements. **/ 699 | function _init() { 700 | // Trigger a few events so the bar looks good on startup. 701 | _timeHandler({ 702 | id: api.id, 703 | duration: api.jwGetDuration(), 704 | position: 0 705 | }); 706 | _bufferHandler({ 707 | id: api.id, 708 | bufferProgress: 0 709 | }); 710 | _muteHandler({ 711 | id: api.id, 712 | mute: api.jwGetMute() 713 | }); 714 | _stateHandler({ 715 | id: api.id, 716 | newstate: jwplayer.api.events.state.IDLE 717 | }); 718 | _volumeHandler({ 719 | id: api.id, 720 | volume: api.jwGetVolume() 721 | }); 722 | } 723 | 724 | 725 | /** Set a single button handler. **/ 726 | function _buildHandler(element, handler, args) { 727 | if (api.skin.getSkinElement("controlbar", element) !== undefined) { 728 | var _element = _elements[element]; 729 | if (_element !== null) { 730 | _css(_element, { 731 | cursor: "pointer" 732 | }); 733 | if (handler == "fullscreen") { 734 | _element.onmouseup = function(evt) { 735 | evt.stopPropagation(); 736 | api.jwSetFullscreen(!api.jwGetFullscreen()); 737 | }; 738 | } else { 739 | _element.onmouseup = function(evt) { 740 | evt.stopPropagation(); 741 | if (!(args === null)) { 742 | api[handler](args); 743 | } else { 744 | api[handler](); 745 | } 746 | 747 | }; 748 | } 749 | } 750 | } 751 | } 752 | 753 | /** Set the volume drag handler. **/ 754 | function _addSliderListener(name) { 755 | var bar = _elements[name + "Slider"]; 756 | _css(_elements.elements, { 757 | "cursor": "pointer" 758 | }); 759 | _css(bar, { 760 | "cursor": "pointer" 761 | }); 762 | bar.onmousedown = function(evt) { 763 | _scrubber = name; 764 | }; 765 | bar.onmouseup = function(evt) { 766 | evt.stopPropagation(); 767 | _sliderUp(evt.pageX); 768 | }; 769 | bar.onmousemove = function(evt) { 770 | if (_scrubber == "time") { 771 | _mousedown = true; 772 | var xps = evt.pageX - bar.getBoundingClientRect().left - window.pageXOffset; 773 | _css(_elements.timeSliderThumb, { 774 | left: xps 775 | }); 776 | } 777 | }; 778 | } 779 | 780 | 781 | /** The slider has been moved up. **/ 782 | function _sliderUp(msx) { 783 | _mousedown = false; 784 | var railRect, xps; 785 | if (_scrubber == "time") { 786 | railRect = _elements.timeSliderRail.getBoundingClientRect(); 787 | xps = msx - railRect.left + window.pageXOffset; 788 | var pos = xps / railRect.width * _currentDuration; 789 | if (pos < 0) { 790 | pos = 0; 791 | } else if (pos > _currentDuration) { 792 | pos = _currentDuration - 3; 793 | } 794 | api.jwSeek(pos); 795 | if (api.jwGetState() != jwplayer.api.events.state.PLAYING) { 796 | api.jwPlay(); 797 | } 798 | } else if (_scrubber == "volume") { 799 | railRect = _elements.volumeSliderRail.getBoundingClientRect(); 800 | xps = msx - railRect.left - window.pageXOffset; 801 | var pct = Math.round(xps / railRect.width * 100); 802 | if (pct < 0) { 803 | pct = 0; 804 | } else if (pct > 100) { 805 | pct = 100; 806 | } 807 | if (api.jwGetMute()) { 808 | api.jwSetMute(false); 809 | } 810 | api.jwSetVolume(pct); 811 | } 812 | _scrubber = "none"; 813 | } 814 | 815 | 816 | /** Update the buffer percentage. **/ 817 | function _bufferHandler(event) { 818 | if (!(event.bufferPercent === null)) { 819 | _currentBuffer = event.bufferPercent; 820 | } 821 | 822 | var wid = _elements.timeSliderRail.getBoundingClientRect().width; 823 | var bufferWidth = isNaN(Math.round(wid * _currentBuffer / 100)) ? 0 : Math.round(wid * _currentBuffer / 100); 824 | _css(_elements.timeSliderBuffer, { 825 | width: bufferWidth 826 | }); 827 | } 828 | 829 | 830 | /** Update the mute state. **/ 831 | function _muteHandler(event) { 832 | if (event.mute) { 833 | _hide(_elements.muteButton); 834 | _show(_elements.unmuteButton); 835 | _hide(_elements.volumeSliderProgress); 836 | } else { 837 | _show(_elements.muteButton); 838 | _hide(_elements.unmuteButton); 839 | _show(_elements.volumeSliderProgress); 840 | } 841 | } 842 | 843 | 844 | /** Update the playback state. **/ 845 | function _stateHandler(event) { 846 | // Handle the play / pause button 847 | if (event.newstate == jwplayer.api.events.state.BUFFERING || event.newstate == jwplayer.api.events.state.PLAYING) { 848 | _show(_elements.pauseButton); 849 | _hide(_elements.playButton); 850 | } else { 851 | _hide(_elements.pauseButton); 852 | _show(_elements.playButton); 853 | } 854 | 855 | // Show / hide progress bar 856 | if (event.newstate == jwplayer.api.events.state.IDLE) { 857 | if (!_settings.idlehide) { 858 | _fadeIn(); 859 | } 860 | _hide(_elements.timeSliderBuffer); 861 | _hide(_elements.timeSliderProgress); 862 | _hide(_elements.timeSliderThumb); 863 | } else { 864 | _show(_elements.timeSliderBuffer); 865 | if (event.newstate != jwplayer.api.events.state.BUFFERING) { 866 | _show(_elements.timeSliderProgress); 867 | _show(_elements.timeSliderThumb); 868 | } 869 | } 870 | } 871 | 872 | 873 | /** Handles event completion **/ 874 | function _completeHandler(event) { 875 | _timeHandler(jwplayer.utils.extend(event, { 876 | position: 0, 877 | duration: _currentDuration 878 | })); 879 | } 880 | 881 | 882 | /** Update the playback time. **/ 883 | function _timeHandler(event) { 884 | if (!(event.position === null)) { 885 | _currentPosition = event.position; 886 | } 887 | if (!(event.duration === null)) { 888 | _currentDuration = event.duration; 889 | } 890 | var progress = (_currentPosition === _currentDuration === 0) ? 0 : _currentPosition / _currentDuration; 891 | var railRect = _elements.timeSliderRail.getBoundingClientRect(); 892 | var progressWidth = isNaN(Math.round(railRect.width * progress)) ? 0 : Math.round(railRect.width * progress); 893 | var thumbPosition = progressWidth; 894 | 895 | _elements.timeSliderProgress.style.width = progressWidth; 896 | if (!_mousedown) { 897 | if (_elements.timeSliderThumb) { 898 | _elements.timeSliderThumb.style.left = thumbPosition; 899 | } 900 | } 901 | if (_elements.durationText) { 902 | _elements.durationText.innerHTML = _timeFormat(_currentDuration); 903 | } 904 | if (_elements.elapsedText) { 905 | _elements.elapsedText.innerHTML = _timeFormat(_currentPosition); 906 | } 907 | } 908 | 909 | 910 | /** Format the elapsed / remaining text. **/ 911 | function _timeFormat(sec) { 912 | str = "00:00"; 913 | if (sec > 0) { 914 | str = Math.floor(sec / 60) < 10 ? "0" + Math.floor(sec / 60) + ":" : Math.floor(sec / 60) + ":"; 915 | str += Math.floor(sec % 60) < 10 ? "0" + Math.floor(sec % 60) : Math.floor(sec % 60); 916 | } 917 | return str; 918 | } 919 | 920 | 921 | /** Resize the jwplayerControlbar. **/ 922 | function _resizeBar() { 923 | var controlbarcss = { 924 | width: _width 925 | }; 926 | var elementcss = {}; 927 | if (_settings.position.toUpperCase() == jwplayer.html5.view.positions.OVER || api.jwGetFullscreen()) { 928 | controlbarcss.left = _settings.margin; 929 | controlbarcss.width -= 2 * _settings.margin; 930 | controlbarcss.top = _height - api.skin.getSkinElement("controlbar", "background").height - _settings.margin; 931 | } else { 932 | controlbarcss.left = 0; 933 | } 934 | 935 | elementcss.left = api.skin.getSkinElement("controlbar", "capLeft").width; 936 | elementcss.width = controlbarcss.width - api.skin.getSkinElement("controlbar", "capLeft").width - api.skin.getSkinElement("controlbar", "capRight").width; 937 | 938 | var timeSliderLeft = api.skin.getSkinElement("controlbar", "timeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "timeSliderCapLeft").width; 939 | _css(_elements.timeSliderRail, { 940 | width: (elementcss.width - _marginleft - _marginright), 941 | left: timeSliderLeft 942 | }); 943 | if (_elements.timeSliderCapRight !== null) { 944 | _css(_elements.timeSliderCapRight, { 945 | left: timeSliderLeft + (elementcss.width - _marginleft - _marginright) 946 | }); 947 | } 948 | _css(_wrapper, controlbarcss); 949 | _css(_elements.elements, elementcss); 950 | 951 | } 952 | 953 | 954 | /** Update the volume level. **/ 955 | function _volumeHandler(event) { 956 | if (_elements.volumeSliderRail !== null) { 957 | var progress = isNaN(event.volume / 100) ? 1 : event.volume / 100; 958 | var width = parseInt(_elements.volumeSliderRail.style.width.replace("px", ""), 10); 959 | var progressWidth = isNaN(Math.round(width * progress)) ? 0 : Math.round(width * progress); 960 | var offset = parseInt(_elements.volumeSliderRail.style.right.replace("px", ""), 10); 961 | 962 | var volumeSliderLeft = api.skin.getSkinElement("controlbar", "volumeSliderCapLeft") === undefined ? 0 : api.skin.getSkinElement("controlbar", "volumeSliderCapLeft").width; 963 | _css(_elements.volumeSliderProgress, { 964 | width: progressWidth, 965 | left: volumeSliderLeft 966 | }); 967 | 968 | if (_elements.volumeSliderCapLeft !== undefined) { 969 | _css(_elements.volumeSliderCapLeft, { 970 | left: 0 971 | }); 972 | } 973 | } 974 | } 975 | 976 | function _setup() { 977 | _buildBase(); 978 | _buildElements(); 979 | _addListeners(); 980 | _init(); 981 | _wrapper.style.opacity = _settings.idlehide ? 0 : 1; 982 | } 983 | 984 | _setup(); 985 | return this; 986 | }; 987 | })(jwplayer); 988 | /** 989 | * JW Player controller component 990 | * 991 | * @author zach 992 | * @version 1.0 993 | */ 994 | (function(jwplayer) { 995 | 996 | var _mediainfovariables = ["width", "height", "state", "playlist", "item", "position", "buffer", "duration", "volume", "mute", "fullscreen"]; 997 | 998 | jwplayer.html5.controller = function(api, container, model, view) { 999 | var _model = model; 1000 | var _view = view; 1001 | 1002 | var debug = (_model.config.debug !== undefined) && (_model.config.debug.toString().toLowerCase() == 'console'); 1003 | var _eventDispatcher = new jwplayer.html5.eventdispatcher(container.id, debug); 1004 | jwplayer.utils.extend(this, _eventDispatcher); 1005 | 1006 | function forward(evt) { 1007 | _eventDispatcher.sendEvent(evt.type, evt); 1008 | } 1009 | 1010 | _model.addGlobalListener(forward); 1011 | 1012 | function _play() { 1013 | try { 1014 | if (_model.playlist[0].levels[0].file.length > 0) { 1015 | switch (_model.state) { 1016 | case jwplayer.api.events.state.IDLE: 1017 | _model.setActiveMediaProvider(_model.playlist[_model.item]); 1018 | _model.addEventListener(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL, function() { 1019 | _model.getMedia().play(); 1020 | }); 1021 | _model.getMedia().load(_model.playlist[_model.item]); 1022 | break; 1023 | case jwplayer.api.events.state.PAUSED: 1024 | _model.getMedia().play(); 1025 | break; 1026 | } 1027 | } 1028 | return true; 1029 | } catch (err) { 1030 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1031 | } 1032 | return false; 1033 | } 1034 | 1035 | 1036 | /** Switch the pause state of the player. **/ 1037 | function _pause() { 1038 | try { 1039 | if (_model.playlist[0].levels[0].file.length > 0) { 1040 | switch (_model.state) { 1041 | case jwplayer.api.events.state.PLAYING: 1042 | case jwplayer.api.events.state.BUFFERING: 1043 | _model.getMedia().pause(); 1044 | break; 1045 | } 1046 | } 1047 | return true; 1048 | } catch (err) { 1049 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1050 | } 1051 | return false; 1052 | } 1053 | 1054 | 1055 | /** Seek to a position in the video. **/ 1056 | function _seek(position) { 1057 | try { 1058 | if (_model.playlist[0].levels[0].file.length > 0) { 1059 | switch (_model.state) { 1060 | case jwplayer.api.events.state.PLAYING: 1061 | case jwplayer.api.events.state.PAUSED: 1062 | case jwplayer.api.events.state.BUFFERING: 1063 | _model.getMedia().seek(position); 1064 | break; 1065 | } 1066 | } 1067 | return true; 1068 | } catch (err) { 1069 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1070 | } 1071 | return false; 1072 | } 1073 | 1074 | 1075 | /** Stop playback and loading of the video. **/ 1076 | function _stop() { 1077 | try { 1078 | if (_model.playlist[0].levels[0].file.length > 0) { 1079 | _model.getMedia().stop(); 1080 | } 1081 | return true; 1082 | } catch (err) { 1083 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1084 | } 1085 | return false; 1086 | } 1087 | 1088 | /** Stop playback and loading of the video. **/ 1089 | function _next() { 1090 | try { 1091 | if (_model.playlist[0].levels[0].file.length > 0) { 1092 | if (_model.item + 1 == _model.playlist.length) { 1093 | return _item(0); 1094 | } else { 1095 | return _item(_model.item + 1); 1096 | } 1097 | } 1098 | return true; 1099 | } catch (err) { 1100 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1101 | } 1102 | return false; 1103 | } 1104 | 1105 | /** Stop playback and loading of the video. **/ 1106 | function _prev() { 1107 | try { 1108 | if (_model.playlist[0].levels[0].file.length > 0) { 1109 | if (_model.item === 0) { 1110 | return _item(_model.playlist.length - 1); 1111 | } else { 1112 | return _item(_model.item - 1); 1113 | } 1114 | } 1115 | return true; 1116 | } catch (err) { 1117 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1118 | } 1119 | return false; 1120 | } 1121 | 1122 | /** Stop playback and loading of the video. **/ 1123 | function _item(item) { 1124 | try { 1125 | if (_model.playlist[0].levels[0].file.length > 0) { 1126 | var oldstate = _model.state; 1127 | _stop(); 1128 | _model.item = item; 1129 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 1130 | "item": item 1131 | }); 1132 | if (oldstate == jwplayer.api.events.state.PLAYING || oldstate == jwplayer.api.events.state.BUFFERING) { 1133 | _play(); 1134 | } 1135 | } 1136 | return true; 1137 | } catch (err) { 1138 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1139 | } 1140 | return false; 1141 | } 1142 | 1143 | /** Get / set the video's volume level. **/ 1144 | function _setVolume(volume) { 1145 | try { 1146 | switch (typeof(volume)) { 1147 | case "number": 1148 | _model.getMedia().volume(volume); 1149 | break; 1150 | case "string": 1151 | _model.getMedia().volume(parseInt(volume, 10)); 1152 | break; 1153 | } 1154 | return true; 1155 | } catch (err) { 1156 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1157 | } 1158 | return false; 1159 | } 1160 | 1161 | 1162 | /** Get / set the mute state of the player. **/ 1163 | function _setMute(state) { 1164 | try { 1165 | _model.getMedia().mute(state); 1166 | return true; 1167 | } catch (err) { 1168 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1169 | } 1170 | return false; 1171 | } 1172 | 1173 | 1174 | /** Resizes the video **/ 1175 | function _resize(width, height) { 1176 | try { 1177 | _model.width = width; 1178 | _model.height = height; 1179 | _view.resize(width, height); 1180 | return true; 1181 | } catch (err) { 1182 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1183 | } 1184 | return false; 1185 | } 1186 | 1187 | 1188 | /** Jumping the player to/from fullscreen. **/ 1189 | function _setFullscreen(state) { 1190 | try { 1191 | _model.fullscreen = state; 1192 | _view.fullscreen(state); 1193 | return true; 1194 | } catch (err) { 1195 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1196 | } 1197 | return false; 1198 | } 1199 | 1200 | 1201 | /** Loads a new video **/ 1202 | function _load(arg) { 1203 | try { 1204 | _model.loadPlaylist(arg); 1205 | return true; 1206 | } catch (err) { 1207 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, err); 1208 | } 1209 | return false; 1210 | } 1211 | 1212 | this.play = _play; 1213 | this.pause = _pause; 1214 | this.seek = _seek; 1215 | this.stop = _stop; 1216 | this.next = _next; 1217 | this.prev = _prev; 1218 | this.item = _item; 1219 | this.setVolume = _setVolume; 1220 | this.setMute = _setMute; 1221 | this.resize = _resize; 1222 | this.setFullscreen = _setFullscreen; 1223 | this.load = _load; 1224 | }; 1225 | })(jwplayer); 1226 | /** 1227 | * JW Player Default skin 1228 | * 1229 | * @author zach 1230 | * @version 1.0 1231 | */ 1232 | (function(jwplayer) { 1233 | jwplayer.html5.defaultSkin = function() { 1234 | this.text = ''; 1235 | this.xml = null; 1236 | 1237 | //http://www.w3schools.com/Dom/dom_parser.asp 1238 | if (window.DOMParser) { 1239 | parser = new DOMParser(); 1240 | this.xml = parser.parseFromString(this.text, "text/xml"); 1241 | } else { 1242 | //IE 1243 | this.xml = new ActiveXObject("Microsoft.XMLDOM"); 1244 | this.xml.async = "false"; 1245 | this.xml.loadXML(this.text); 1246 | } 1247 | return this; 1248 | }; 1249 | 1250 | })(jwplayer); 1251 | /** 1252 | * JW Player view component 1253 | * 1254 | * @author zach 1255 | * @version 1.0 1256 | */ 1257 | (function(jwplayer) { 1258 | 1259 | var _logoDefaults = { 1260 | prefix: "http://l.longtailvideo.com/html5/0/", 1261 | file: "logo.png", 1262 | link: "http://www.longtailvideo.com/players/jw-flv-player/", 1263 | margin: 8, 1264 | out: 0.5, 1265 | over: 1, 1266 | timeout: 3, 1267 | hide: "true", 1268 | position: "bottom-left", 1269 | width: 93, 1270 | height: 30 1271 | }; 1272 | 1273 | _css = jwplayer.html5.utils.css; 1274 | 1275 | _hide = function(element) { 1276 | _css(element, { 1277 | display: "none" 1278 | }); 1279 | }; 1280 | 1281 | _show = function(element) { 1282 | _css(element, { 1283 | display: "block" 1284 | }); 1285 | }; 1286 | 1287 | 1288 | jwplayer.html5.display = function(api, config) { 1289 | var _display = {}; 1290 | var _width; 1291 | var _height; 1292 | var _degreesRotated; 1293 | var _rotationInterval; 1294 | var _bufferRotation = api.skin.getComponentSettings("display").bufferrotation === undefined ? 15 : parseInt(api.skin.getComponentSettings("display").bufferrotation, 10); 1295 | var _bufferInterval = api.skin.getComponentSettings("display").bufferinterval === undefined ? 100 : parseInt(api.skin.getComponentSettings("display").bufferinterval, 10); 1296 | var _elements = _initializeDisplayElements(); 1297 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYER_STATE, _stateHandler); 1298 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, _stateHandler); 1299 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, _stateHandler); 1300 | api.jwAddEventListener(jwplayer.api.events.JWPLAYER_MEDIA_ERROR, function(obj) { 1301 | }); 1302 | _setupDisplay(); 1303 | 1304 | 1305 | function _setupDisplay() { 1306 | _display.display = createElement("div", "display"); 1307 | _display.display_image = createElement("div", "display_image"); 1308 | _display.display_icon = createElement("div", "display_icon"); 1309 | _display.display_iconBackground = createElement("div", "display_iconBackground"); 1310 | _display.logo = createElement("div", "logo"); 1311 | _display.display.appendChild(_display.display_image); 1312 | _display.display_iconBackground.appendChild(_display.display_icon); 1313 | _display.display.appendChild(_display.display_iconBackground); 1314 | _display.display.appendChild(_display.logo); 1315 | _setupDisplayElements(); 1316 | } 1317 | 1318 | 1319 | this.getDisplayElement = function() { 1320 | return _display.display; 1321 | }; 1322 | 1323 | this.resize = function(width, height) { 1324 | _width = width; 1325 | _height = height; 1326 | _css(_display.display, { 1327 | width: width, 1328 | height: height 1329 | }); 1330 | _css(_display.display_image, { 1331 | width: width, 1332 | height: height 1333 | }); 1334 | _css(_display.display_iconBackground, { 1335 | top: ((_height - api.skin.getSkinElement("display", "background").height) / 2) + "px", 1336 | left: ((_width - api.skin.getSkinElement("display", "background").width) / 2) + "px" 1337 | }); 1338 | _stateHandler({}); 1339 | }; 1340 | 1341 | function createElement(tag, element) { 1342 | var _element = document.createElement(tag); 1343 | _element.id = api.id + "_jwplayer_" + element; 1344 | _css(_element, _elements[element].style); 1345 | return _element; 1346 | } 1347 | 1348 | function _getStyle(element) { 1349 | var result = ''; 1350 | for (var style in _elements[element].style) { 1351 | result += style + ":" + _elements[element].style[style] + ";"; 1352 | } 1353 | if (result === '') { 1354 | return ' '; 1355 | } 1356 | return ' style="' + result + '" '; 1357 | } 1358 | 1359 | 1360 | function _setupDisplayElements() { 1361 | for (var element in _display) { 1362 | if (_elements[element].click !== undefined) { 1363 | _display[element].onclick = _elements[element].click; 1364 | } 1365 | } 1366 | } 1367 | 1368 | 1369 | function _initializeDisplayElements() { 1370 | var elements = { 1371 | display: { 1372 | style: { 1373 | cursor: 'pointer' 1374 | }, 1375 | click: _displayClickHandler 1376 | }, 1377 | display_icon: { 1378 | style: { 1379 | cursor: 'pointer', 1380 | position: 'absolute', 1381 | top: ((api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", "playIcon").height) / 2) + "px", 1382 | left: ((api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", "playIcon").width) / 2) + "px", 1383 | border: 0, 1384 | margin: 0, 1385 | padding: 0 1386 | } 1387 | }, 1388 | display_iconBackground: { 1389 | style: { 1390 | cursor: 'pointer', 1391 | position: 'absolute', 1392 | top: ((_height - api.skin.getSkinElement("display", "background").height) / 2) + "px", 1393 | left: ((_width - api.skin.getSkinElement("display", "background").width) / 2) + "px", 1394 | border: 0, 1395 | 'background-image': (['url(', api.skin.getSkinElement("display", "background").src, ')']).join(''), 1396 | width: api.skin.getSkinElement("display", "background").width + "px", 1397 | height: api.skin.getSkinElement("display", "background").height + "px", 1398 | margin: 0, 1399 | padding: 0 1400 | } 1401 | }, 1402 | display_image: { 1403 | style: { 1404 | display: 'block', 1405 | width: _width + "px", 1406 | height: _height + "px", 1407 | position: 'absolute', 1408 | cursor: 'pointer', 1409 | left: 0, 1410 | top: 0, 1411 | margin: 0, 1412 | padding: 0, 1413 | 'text-decoration': 'none' 1414 | } 1415 | }, 1416 | logo: { 1417 | style: { 1418 | position: 'absolute', 1419 | width: _logoDefaults.width + "px", 1420 | height: _logoDefaults.height + "px", 1421 | 'background-image': (['url(', _logoDefaults.prefix, _logoDefaults.file, ')']).join(''), 1422 | margin: 0, 1423 | padding: 0, 1424 | display: 'none', 1425 | 'text-decoration': 'none' 1426 | }, 1427 | click: _logoClickHandler 1428 | } 1429 | }; 1430 | var positions = _logoDefaults.position.split("-"); 1431 | for (var position in positions) { 1432 | elements.logo.style[positions[position]] = _logoDefaults.margin + "px"; 1433 | } 1434 | return elements; 1435 | } 1436 | 1437 | 1438 | function _displayClickHandler(evt) { 1439 | if (typeof evt.preventDefault != "undefined") { 1440 | evt.preventDefault(); // W3C 1441 | } else { 1442 | evt.returnValue = false; // IE 1443 | } 1444 | if (api.jwGetState() != jwplayer.api.events.state.PLAYING) { 1445 | api.jwPlay(); 1446 | } else { 1447 | api.jwPause(); 1448 | } 1449 | } 1450 | 1451 | 1452 | function _logoClickHandler(evt) { 1453 | evt.stopPropagation(); 1454 | return; 1455 | } 1456 | 1457 | 1458 | function _setDisplayIcon(newIcon) { 1459 | _show(_display.display_iconBackground); 1460 | _display.display_icon.style["background-image"] = (['url(', api.skin.getSkinElement("display", newIcon).src, ')']).join(''); 1461 | _css(_display.display_icon, { 1462 | display: "block", 1463 | width: api.skin.getSkinElement("display", newIcon).width, 1464 | height: api.skin.getSkinElement("display", newIcon).height, 1465 | top: (api.skin.getSkinElement("display", "background").height - api.skin.getSkinElement("display", newIcon).height) / 2, 1466 | left: (api.skin.getSkinElement("display", "background").width - api.skin.getSkinElement("display", newIcon).width) / 2 1467 | }); 1468 | if (api.skin.getSkinElement("display", newIcon + "Over") !== undefined) { 1469 | _display.display_icon.onmouseover = function(evt) { 1470 | evt.stopPropagation(); 1471 | _display.display_icon.style["background-image"] = ["url(", api.skin.getSkinElement("display", newIcon + "Over").src, ")"].join(""); 1472 | }; 1473 | _display.display_icon.onmouseout = function(evt) { 1474 | evt.stopPropagation(); 1475 | _display.display_icon.style["background-image"] = ["url(", api.skin.getSkinElement("display", newIcon).src, ")"].join(""); 1476 | }; 1477 | } else { 1478 | _display.display_icon.onmouseover = undefined; 1479 | _display.display_icon.onmouseout = undefined; 1480 | } 1481 | } 1482 | 1483 | function _hideDisplayIcon() { 1484 | _hide(_display.display_icon); 1485 | _hide(_display.display_iconBackground); 1486 | } 1487 | 1488 | function _stateHandler(obj) { 1489 | if (_rotationInterval !== undefined) { 1490 | clearInterval(_rotationInterval); 1491 | _rotationInterval = undefined; 1492 | jwplayer.html5.utils.animations.rotate(_display.display_icon, 0); 1493 | } 1494 | switch (api.jwGetState()) { 1495 | case jwplayer.api.events.state.BUFFERING: 1496 | jwplayer.html5.utils.fadeTo(_display.logo, 0, _logoDefaults.timeout, 1); 1497 | _setDisplayIcon("bufferIcon"); 1498 | _degreesRotated = 0; 1499 | _rotationInterval = setInterval(function() { 1500 | _degreesRotated += _bufferRotation; 1501 | jwplayer.html5.utils.animations.rotate(_display.display_icon, _degreesRotated % 360); 1502 | }, _bufferInterval); 1503 | _setDisplayIcon("bufferIcon"); 1504 | break; 1505 | case jwplayer.api.events.state.PAUSED: 1506 | jwplayer.html5.utils.fadeTo(_display.logo, 1, 0, 0); 1507 | _css(_display.display_image, { 1508 | background: "transparent no-repeat center center" 1509 | }); 1510 | _show(_display.display_iconBackground); 1511 | _setDisplayIcon("playIcon"); 1512 | break; 1513 | case jwplayer.api.events.state.IDLE: 1514 | _display.logo.style.display = "block"; 1515 | var background = api.jwGetPlaylist()[api.jwGetItem()].image === "" ? "" : " url('" + jwplayer.html5.utils.getAbsolutePath(api.jwGetPlaylist()[api.jwGetItem()].image) + "')"; 1516 | _css(_display.display_image, { 1517 | background: background + " no-repeat center center" 1518 | }); 1519 | _show(_display.display_iconBackground); 1520 | _setDisplayIcon("playIcon"); 1521 | break; 1522 | default: 1523 | if (api.jwGetMute()) { 1524 | _css(_display.display_image, { 1525 | background: "transparent no-repeat center center" 1526 | }); 1527 | _show(_display.display_iconBackground); 1528 | _setDisplayIcon("muteIcon"); 1529 | 1530 | } else { 1531 | try { 1532 | _display.logo.clearQueue(); 1533 | } catch (err) { 1534 | 1535 | } 1536 | _display.logo.style.display = "block"; 1537 | jwplayer.html5.utils.fadeTo(_display.logo, 0, _logoDefaults.timeout, 1); 1538 | _css(_display.display_image, { 1539 | background: "transparent no-repeat center center" 1540 | }); 1541 | _hide(_display.display_iconBackground); 1542 | _hide(_display.display_icon); 1543 | } 1544 | break; 1545 | } 1546 | } 1547 | 1548 | return this; 1549 | }; 1550 | 1551 | 1552 | 1553 | })(jwplayer); 1554 | /** 1555 | * Event dispatcher for the JW Player for HTML5 1556 | * 1557 | * @author zach 1558 | * @version 1.0 1559 | */ 1560 | (function(jwplayer) { 1561 | jwplayer.html5.eventdispatcher = function(id, debug) { 1562 | var _listeners; 1563 | var _globallisteners; 1564 | 1565 | /** Clears all event listeners **/ 1566 | this.resetEventListeners = function() { 1567 | _listeners = {}; 1568 | _globallisteners = []; 1569 | }; 1570 | 1571 | this.resetEventListeners(); 1572 | 1573 | /** Add an event listener for a specific type of event. **/ 1574 | this.addEventListener = function(type, listener, count) { 1575 | try { 1576 | if (_listeners[type] === undefined) { 1577 | _listeners[type] = []; 1578 | } 1579 | 1580 | if (typeof(listener) == "string") { 1581 | eval("listener = " + listener); 1582 | } 1583 | _listeners[type].push({ 1584 | listener: listener, 1585 | count: count 1586 | }); 1587 | } catch (err) { 1588 | jwplayer.html5.utils.log("error", err); 1589 | } 1590 | return false; 1591 | }; 1592 | 1593 | 1594 | /** Remove an event listener for a specific type of event. **/ 1595 | this.removeEventListener = function(type, listener) { 1596 | try { 1597 | for (var lisenterIndex in _listeners[type]) { 1598 | if (_listeners[type][lisenterIndex].toString() == listener.toString()) { 1599 | _listeners[type].slice(lisenterIndex, lisenterIndex + 1); 1600 | break; 1601 | } 1602 | } 1603 | } catch (err) { 1604 | jwplayer.html5.utils.log("error", err); 1605 | } 1606 | return false; 1607 | }; 1608 | 1609 | /** Add an event listener for all events. **/ 1610 | this.addGlobalListener = function(listener, count) { 1611 | try { 1612 | if (typeof(listener) == "string") { 1613 | eval("listener = " + listener); 1614 | } 1615 | _globallisteners.push({ 1616 | listener: listener, 1617 | count: count 1618 | }); 1619 | } catch (err) { 1620 | jwplayer.html5.utils.log("error", err); 1621 | } 1622 | return false; 1623 | }; 1624 | 1625 | /** Add an event listener for all events. **/ 1626 | this.removeGlobalListener = function(listener) { 1627 | try { 1628 | for (var lisenterIndex in _globallisteners) { 1629 | if (_globallisteners[lisenterIndex].toString() == listener.toString()) { 1630 | _globallisteners.slice(lisenterIndex, lisenterIndex + 1); 1631 | break; 1632 | } 1633 | } 1634 | } catch (err) { 1635 | jwplayer.html5.utils.log("error", err); 1636 | } 1637 | return false; 1638 | }; 1639 | 1640 | 1641 | /** Send an event **/ 1642 | this.sendEvent = function(type, data) { 1643 | if (data === undefined) { 1644 | data = {}; 1645 | } 1646 | jwplayer.utils.extend(data, { 1647 | id: id, 1648 | version: jwplayer.html5.version, 1649 | type: type 1650 | }); 1651 | if (debug) { 1652 | jwplayer.html5.utils.log(type, data); 1653 | } 1654 | for (var listenerIndex in _listeners[type]) { 1655 | try { 1656 | _listeners[type][listenerIndex].listener(data); 1657 | } catch (err) { 1658 | jwplayer.html5.utils.log("There was an error while handling a listener", err); 1659 | } 1660 | if (_listeners[type][listenerIndex].count === 1) { 1661 | delete _listeners[type][listenerIndex]; 1662 | } else if (_listeners[type][listenerIndex].count > 0) { 1663 | _listeners[type][listenerIndex].count = _listeners[type][listenerIndex].count - 1; 1664 | } 1665 | } 1666 | for (var globalListenerIndex in _globallisteners) { 1667 | try { 1668 | _globallisteners[globalListenerIndex].listener(data); 1669 | } catch (err) { 1670 | jwplayer.html5.utils.log("There was an error while handling a listener", err); 1671 | } 1672 | if (_globallisteners[globalListenerIndex].count === 1) { 1673 | delete _globallisteners[globalListenerIndex]; 1674 | } else if (_globallisteners[globalListenerIndex].count > 0) { 1675 | _globallisteners[globalListenerIndex].count = _globallisteners[globalListenerIndex].count - 1; 1676 | } 1677 | } 1678 | }; 1679 | }; 1680 | })(jwplayer); 1681 | /** 1682 | * JW Player Video Media component 1683 | * 1684 | * @author zach 1685 | * @version 1.0 1686 | */ 1687 | (function(jwplayer) { 1688 | jwplayer.html5.extensionmap = { 1689 | "3gp": "video/3gpp", 1690 | "3gpp": "video/3gpp", 1691 | "3g2": "video/3gpp2", 1692 | "3gpp2": "video/3gpp2", 1693 | "flv": "video/x-flv", 1694 | "f4a": "audio/mp4", 1695 | "f4b": "audio/mp4", 1696 | "f4p": "video/mp4", 1697 | "f4v": "video/mp4", 1698 | "mov": "video/quicktime", 1699 | "m4a": "audio/mp4", 1700 | "m4b": "audio/mp4", 1701 | "m4p": "audio/mp4", 1702 | "m4v": "video/mp4", 1703 | "mkv": "video/x-matroska", 1704 | "mp4": "video/mp4", 1705 | "sdp": "application/sdp", 1706 | "vp6": "video/x-vp6", 1707 | "aac": "audio/aac", 1708 | "mp3": "audio/mp3", 1709 | "ogg": "audio/ogg", 1710 | "ogv": "video/ogg", 1711 | "webm": "video/webm" 1712 | }; 1713 | })(jwplayer); 1714 | /** 1715 | * JW Player Video Media component 1716 | * 1717 | * @author zach 1718 | * @version 1.0 1719 | */ 1720 | (function(jwplayer) { 1721 | 1722 | var _states = { 1723 | "ended": jwplayer.api.events.state.IDLE, 1724 | "playing": jwplayer.api.events.state.PLAYING, 1725 | "pause": jwplayer.api.events.state.PAUSED, 1726 | "buffering": jwplayer.api.events.state.BUFFERING 1727 | }; 1728 | 1729 | var _css = jwplayer.html5.utils.css; 1730 | 1731 | jwplayer.html5.mediavideo = function(model, container) { 1732 | var _events = { 1733 | 'abort': _generalHandler, 1734 | 'canplay': _stateHandler, 1735 | 'canplaythrough': _stateHandler, 1736 | 'durationchange': _metaHandler, 1737 | 'emptied': _generalHandler, 1738 | 'ended': _stateHandler, 1739 | 'error': _errorHandler, 1740 | 'loadeddata': _metaHandler, 1741 | 'loadedmetadata': _metaHandler, 1742 | 'loadstart': _stateHandler, 1743 | 'pause': _stateHandler, 1744 | 'play': _positionHandler, 1745 | 'playing': _stateHandler, 1746 | 'progress': _progressHandler, 1747 | 'ratechange': _generalHandler, 1748 | 'seeked': _stateHandler, 1749 | 'seeking': _stateHandler, 1750 | 'stalled': _stateHandler, 1751 | 'suspend': _stateHandler, 1752 | 'timeupdate': _positionHandler, 1753 | 'volumechange': _generalHandler, 1754 | 'waiting': _stateHandler, 1755 | 'canshowcurrentframe': _generalHandler, 1756 | 'dataunavailable': _generalHandler, 1757 | 'empty': _generalHandler, 1758 | 'load': _generalHandler, 1759 | 'loadedfirstframe': _generalHandler 1760 | }; 1761 | var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 1762 | jwplayer.utils.extend(this, _eventDispatcher); 1763 | var _model = model; 1764 | var _container = container; 1765 | var _bufferFull; 1766 | var _bufferingComplete; 1767 | var _state = jwplayer.api.events.state.IDLE; 1768 | var _interval = null; 1769 | var _stopped; 1770 | var _loadcount = 0; 1771 | var _start = false; 1772 | var hasChrome = false; 1773 | 1774 | function _getState() { 1775 | return _state; 1776 | } 1777 | 1778 | function _generalHandler(event) { 1779 | } 1780 | 1781 | function _stateHandler(event) { 1782 | if (_states[event.type]) { 1783 | _setState(_states[event.type]); 1784 | } 1785 | } 1786 | 1787 | function _setState(newstate) { 1788 | if (_stopped) { 1789 | newstate = jwplayer.api.events.state.IDLE; 1790 | } 1791 | if (_state != newstate) { 1792 | var oldstate = _state; 1793 | _model.state = newstate; 1794 | _state = newstate; 1795 | if (newstate == jwplayer.api.events.state.IDLE) { 1796 | _clearInterval(); 1797 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_COMPLETE); 1798 | 1799 | if (_container.style.display != 'none') { 1800 | _container.style.display = 'none'; 1801 | } 1802 | } 1803 | 1804 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYER_STATE, { 1805 | oldstate: oldstate, 1806 | newstate: newstate 1807 | }); 1808 | } 1809 | _stopped = false; 1810 | } 1811 | 1812 | 1813 | function _metaHandler(event) { 1814 | var meta = { 1815 | height: event.target.videoHeight, 1816 | width: event.target.videoWidth, 1817 | duration: event.target.duration 1818 | }; 1819 | if (_model.duration === 0) { 1820 | _model.duration = event.target.duration; 1821 | } 1822 | _model.playlist[_model.item] = jwplayer.utils.extend(_model.playlist[_model.item], meta); 1823 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_META, { 1824 | metadata: meta 1825 | }); 1826 | } 1827 | 1828 | 1829 | function _positionHandler(event) { 1830 | if (_stopped) { 1831 | return; 1832 | } 1833 | if (!(event.target === undefined)) { 1834 | if (_model.duration === 0) { 1835 | _model.duration = event.target.duration; 1836 | } 1837 | 1838 | if (_state == jwplayer.api.events.state.PLAYING) { 1839 | if (!_start && _container.readyState > 0) { 1840 | _start = true; 1841 | _container.currentTime = _model.playlist[_model.item].start; 1842 | _container.volume = _model.volume / 100; 1843 | _container.muted = _model.mute; 1844 | } 1845 | _model.position = Math.round(event.target.currentTime * 10) / 10; 1846 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_TIME, { 1847 | position: Math.round(event.target.currentTime * 10) / 10, 1848 | duration: Math.round(event.target.duration * 10) / 10 1849 | }); 1850 | } 1851 | } 1852 | _progressHandler({}); 1853 | } 1854 | 1855 | 1856 | function _progressHandler(event) { 1857 | var bufferPercent, bufferTime, bufferFill; 1858 | if (!isNaN(event.loaded / event.total)) { 1859 | bufferPercent = event.loaded / event.total * 100; 1860 | bufferTime = bufferPercent / 100 * (_model.duration - _container.currentTime); 1861 | } else if ((_container.buffered !== undefined) && (_container.buffered.length > 0)) { 1862 | maxBufferIndex = 0; 1863 | if (maxBufferIndex >= 0) { 1864 | bufferPercent = _container.buffered.end(maxBufferIndex) / _container.duration * 100; 1865 | bufferTime = _container.buffered.end(maxBufferIndex) - _container.currentTime; 1866 | } 1867 | } 1868 | 1869 | bufferFill = bufferTime / _model.config.bufferlength * 100; 1870 | 1871 | if (_bufferFull === false) { 1872 | _bufferFull = true; 1873 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER_FULL); 1874 | } 1875 | 1876 | if (!_bufferingComplete) { 1877 | if (bufferPercent == 100 && _bufferingComplete === false) { 1878 | _bufferingComplete = true; 1879 | } 1880 | 1881 | if (!(bufferPercent === null)) { 1882 | _model.buffer = Math.round(bufferPercent); 1883 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_BUFFER, { 1884 | bufferPercent: Math.round(bufferPercent) 1885 | }); 1886 | } 1887 | 1888 | } 1889 | } 1890 | 1891 | 1892 | function _startInterval() { 1893 | if (_interval === null) { 1894 | _interval = setInterval(function() { 1895 | _positionHandler({}); 1896 | }, 100); 1897 | } 1898 | } 1899 | 1900 | function _clearInterval() { 1901 | clearInterval(_interval); 1902 | _interval = null; 1903 | } 1904 | 1905 | function _errorHandler(event) { 1906 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_ERROR, {}); 1907 | } 1908 | 1909 | this.getDisplayElement = function() { 1910 | return _container; 1911 | }; 1912 | 1913 | this.play = function() { 1914 | if (_state != jwplayer.api.events.state.PLAYING) { 1915 | _container.play(); 1916 | _setState(jwplayer.api.events.state.PLAYING); 1917 | _startInterval(); 1918 | } 1919 | }; 1920 | 1921 | 1922 | /** Switch the pause state of the player. **/ 1923 | this.pause = function() { 1924 | _container.pause(); 1925 | _setState(jwplayer.api.events.state.PAUSED); 1926 | }; 1927 | 1928 | 1929 | /** Seek to a position in the video. **/ 1930 | this.seek = function(position) { 1931 | _container.currentTime = position; 1932 | _container.play(); 1933 | }; 1934 | 1935 | 1936 | /** Stop playback and loading of the video. **/ 1937 | this.stop = function() { 1938 | _stopped = true; 1939 | _container.pause(); 1940 | _clearInterval(); 1941 | _model.position = 0; 1942 | _setState(jwplayer.api.events.state.IDLE); 1943 | }; 1944 | 1945 | 1946 | /** Change the video's volume level. **/ 1947 | this.volume = function(position) { 1948 | _container.volume = position / 100; 1949 | _model.volume = position; 1950 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_VOLUME, { 1951 | volume: Math.round(position) 1952 | }); 1953 | }; 1954 | 1955 | 1956 | /** Switch the mute state of the player. **/ 1957 | this.mute = function(state) { 1958 | _container.muted = state; 1959 | _model.mute = state; 1960 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_MUTE, { 1961 | mute: state 1962 | }); 1963 | }; 1964 | 1965 | 1966 | /** Resize the player. **/ 1967 | this.resize = function(width, height) { 1968 | // TODO: Fullscreen 1969 | if (false) { 1970 | _css(_container, { 1971 | width: width, 1972 | height: height 1973 | }); 1974 | } 1975 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_RESIZE, { 1976 | fullscreen: _model.fullscreen, 1977 | width: width, 1978 | hieght: height 1979 | }); 1980 | }; 1981 | 1982 | 1983 | /** Switch the fullscreen state of the player. **/ 1984 | this.fullscreen = function(state) { 1985 | _model.fullscreen = state; 1986 | if (state === true) { 1987 | this.resize("100%", "100%"); 1988 | } else { 1989 | this.resize(_model.config.width, _model.config.height); 1990 | } 1991 | }; 1992 | 1993 | 1994 | /** Load a new video into the player. **/ 1995 | this.load = function(playlistItem) { 1996 | _embed(playlistItem); 1997 | 1998 | _bufferFull = false; 1999 | _bufferingComplete = false; 2000 | _start = false; 2001 | 2002 | if (_container.style.display != 'none') { 2003 | _container.style.display = 'block'; 2004 | } 2005 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_LOADED); 2006 | _setState(jwplayer.api.events.state.BUFFERING); 2007 | _positionHandler({}); 2008 | }; 2009 | 2010 | _embed = function(playlistItem) { 2011 | var vid = _container.ownerDocument.createElement("video"); 2012 | vid.preload = "none"; 2013 | vid.loop = _model.config.repeat; 2014 | for (var sourceIndex in playlistItem.levels) { 2015 | var sourceModel = playlistItem.levels[sourceIndex]; 2016 | var source = _container.ownerDocument.createElement("source"); 2017 | source.src = jwplayer.html5.utils.getAbsolutePath(sourceModel.file); 2018 | if (sourceModel.type === undefined) { 2019 | var extension = jwplayer.html5.utils.extension(sourceModel.file); 2020 | if (jwplayer.html5.extensionmap[extension] !== undefined) { 2021 | source.type = jwplayer.html5.extensionmap[extension]; 2022 | } else { 2023 | source.type = 'video/' + extension + ';'; 2024 | } 2025 | } else { 2026 | source.type = sourceModel.type; 2027 | } 2028 | vid.appendChild(source); 2029 | } 2030 | vid.style.position = _container.style.position; 2031 | vid.style.top = _container.style.top; 2032 | vid.style.left = _container.style.left; 2033 | vid.style.width = _container.style.width; 2034 | vid.style.height = _container.style.height; 2035 | vid.volume = 0; 2036 | _container.parentNode.replaceChild(vid, _container); 2037 | vid.id = _container.id; 2038 | _container = vid; 2039 | for (var event in _events) { 2040 | _container.addEventListener(event, function(evt) { 2041 | _events[evt.type](evt); 2042 | }, true); 2043 | } 2044 | }; 2045 | 2046 | this.embed = _embed; 2047 | 2048 | return this; 2049 | }; 2050 | })(jwplayer); 2051 | /** 2052 | * JW Player model component 2053 | * 2054 | * @author zach 2055 | * @version 1.0 2056 | */ 2057 | (function(jwplayer) { 2058 | 2059 | var _configurableStateVariables = ["width", "height", "start", "duration", "volume", "mute", "fullscreen", "item", "plugins"]; 2060 | 2061 | jwplayer.html5.model = function(api, container, options) { 2062 | var _model = { 2063 | media: undefined, 2064 | playlist: [], 2065 | state: jwplayer.api.events.state.IDLE, 2066 | position: 0, 2067 | buffer: 0, 2068 | config: { 2069 | width: 480, 2070 | height: 320, 2071 | item: 0, 2072 | skin: undefined, 2073 | file: undefined, 2074 | image: undefined, 2075 | start: 0, 2076 | duration: 0, 2077 | bufferlength: 5, 2078 | volume: 90, 2079 | mute: false, 2080 | fullscreen: false, 2081 | repeat: false, 2082 | autostart: false, 2083 | debug: undefined, 2084 | screencolor: undefined 2085 | } 2086 | }; 2087 | var _media; 2088 | var _container = container; 2089 | var _eventDispatcher = new jwplayer.html5.eventdispatcher(); 2090 | var _components = ["display", "controlbar"]; 2091 | 2092 | jwplayer.utils.extend(_model, _eventDispatcher); 2093 | 2094 | for (var option in options) { 2095 | switch (options[option]) { 2096 | case "": 2097 | continue; 2098 | case "true": 2099 | _model.config[option] = true; 2100 | break; 2101 | case "false": 2102 | _model.config[option] = false; 2103 | break; 2104 | } 2105 | var config = _model.config; 2106 | var path = option.split("."); 2107 | for (var edge in path) { 2108 | if (edge == path.length - 1) { 2109 | config[path[edge]] = options[option]; 2110 | } else { 2111 | if (config[path[edge]] === undefined) { 2112 | config[path[edge]] = {}; 2113 | } 2114 | config = config[path[edge]]; 2115 | } 2116 | } 2117 | } 2118 | for (var index in _configurableStateVariables) { 2119 | var configurableStateVariable = _configurableStateVariables[index]; 2120 | _model[configurableStateVariable] = _model.config[configurableStateVariable]; 2121 | } 2122 | 2123 | var pluginorder = _model.plugins === undefined ? _components : _components.concat(_model.plugins); 2124 | 2125 | _model.plugins = { 2126 | order: pluginorder, 2127 | config: { 2128 | display: { 2129 | position: jwplayer.html5.view.positions.OVER, 2130 | screencolor: _model.config.screencolor 2131 | }, 2132 | controlbar: { 2133 | position: jwplayer.html5.view.positions.BOTTOM 2134 | } 2135 | }, 2136 | object: {}, 2137 | style: {} 2138 | }; 2139 | 2140 | for (var pluginIndex in _model.plugins.order) { 2141 | var pluginName = _model.plugins.order[pluginIndex]; 2142 | var pluginConfig = _model.config[pluginName] === undefined ? {} : _model.config[pluginName]; 2143 | _model.plugins.config[pluginName] = _model.plugins.config[pluginName] === undefined ? pluginConfig : jwplayer.utils.extend(_model.plugins.config[pluginName], pluginConfig); 2144 | if (_model.plugins.config[pluginName].position === undefined) { 2145 | _model.plugins.config[pluginName].position = jwplayer.html5.view.positions.OVER; 2146 | } 2147 | } 2148 | 2149 | _model.loadPlaylist = function(playlist, ready) { 2150 | ready = ready === null ? true : false; 2151 | _model.playlist = new jwplayer.html5.playlist(playlist); 2152 | if (ready) { 2153 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 2154 | _eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 2155 | "item": _model.config.item 2156 | }); 2157 | } 2158 | _model.setActiveMediaProvider(_model.playlist[_model.item]); 2159 | }; 2160 | 2161 | function forward(evt) { 2162 | if (evt.type == jwplayer.api.events.JWPLAYER_MEDIA_LOADED) { 2163 | _container = _media.getDisplayElement(); 2164 | } 2165 | _eventDispatcher.sendEvent(evt.type, evt); 2166 | } 2167 | 2168 | _model.setActiveMediaProvider = function(playlistItem) { 2169 | if (_media === undefined) { 2170 | _media = new jwplayer.html5.mediavideo(_model, _container); 2171 | _media.addGlobalListener(forward); 2172 | if (_model.config.chromeless) { 2173 | _media.embed(playlistItem); 2174 | } 2175 | } 2176 | return true; 2177 | }; 2178 | 2179 | _model.getMedia = function() { 2180 | return _media; 2181 | }; 2182 | 2183 | _model.setupPlugins = function() { 2184 | for (var plugin in _model.plugins.order) { 2185 | if (jwplayer.html5[_model.plugins.order[plugin]] !== undefined) { 2186 | _model.plugins.object[_model.plugins.order[plugin]] = new jwplayer.html5[_model.plugins.order[plugin]](api, _model.plugins.config[_model.plugins.order[plugin]]); 2187 | } else { 2188 | _model.plugins.object[_model.plugins.order[plugin]] = new window[_model.plugins.order[plugin]](api, _model.plugins.config[_model.plugins.order[plugin]]); 2189 | } 2190 | } 2191 | }; 2192 | 2193 | return _model; 2194 | }; 2195 | 2196 | 2197 | })(jwplayer); 2198 | /** 2199 | * JW Player playlist model 2200 | * 2201 | * @author zach 2202 | * @version 1.0 2203 | */ 2204 | (function(jwplayer) { 2205 | jwplayer.html5.playlist = function(config) { 2206 | var _playlist = []; 2207 | if (config.playlist && config.playlist.length > 0) { 2208 | _playlist = config.playlist; 2209 | } else { 2210 | _playlist.push(new jwplayer.html5.playlistitem(config)); 2211 | // For testing 2212 | _playlist.push(new jwplayer.html5.playlistitem(config)); 2213 | _playlist.push(new jwplayer.html5.playlistitem(config)); 2214 | } 2215 | return _playlist; 2216 | }; 2217 | 2218 | })(jwplayer); 2219 | /** 2220 | * JW Player playlist item model 2221 | * 2222 | * @author zach 2223 | * @version 1.0 2224 | */ 2225 | (function(jwplayer) { 2226 | jwplayer.html5.playlistitem = function(config) { 2227 | var _playlistitem = { 2228 | author: "", 2229 | date: "", 2230 | description: "", 2231 | image: "", 2232 | link: "", 2233 | mediaid: "", 2234 | tags: "", 2235 | title: "", 2236 | provider: "", 2237 | 2238 | file: "", 2239 | streamer: "", 2240 | duration: -1, 2241 | start: 0, 2242 | 2243 | currentLevel: -1, 2244 | levels: [] 2245 | }; 2246 | 2247 | for (var property in _playlistitem) { 2248 | if (config[property] !== undefined) { 2249 | _playlistitem[property] = config[property]; 2250 | } 2251 | } 2252 | if (_playlistitem.levels.length === 0) { 2253 | _playlistitem.levels[0] = new jwplayer.html5.playlistitemlevel(_playlistitem); 2254 | } 2255 | return _playlistitem; 2256 | }; 2257 | })(jwplayer); 2258 | /** 2259 | * JW Player playlist item level model 2260 | * 2261 | * @author zach 2262 | * @version 1.0 2263 | */ 2264 | (function(jwplayer) { 2265 | jwplayer.html5.playlistitemlevel = function(config) { 2266 | var _playlistitemlevel = { 2267 | file: "", 2268 | streamer: "", 2269 | bitrate: 0, 2270 | width: 0 2271 | }; 2272 | 2273 | for (var property in _playlistitemlevel) { 2274 | if (config[property] !== undefined) { 2275 | _playlistitemlevel[property] = config[property]; 2276 | } 2277 | } 2278 | return _playlistitemlevel; 2279 | }; 2280 | 2281 | })(jwplayer); 2282 | /** 2283 | * JW Player component that loads PNG skins. 2284 | * 2285 | * @author zach 2286 | * @version 1.0 2287 | */ 2288 | (function(jwplayer) { 2289 | jwplayer.html5.skin = function() { 2290 | var _components = {}; 2291 | var _loaded = false; 2292 | 2293 | this.load = function(path, callback) { 2294 | new jwplayer.html5.skinloader(path, function(skin) { 2295 | _loaded = true; 2296 | _components = skin; 2297 | callback(); 2298 | }); 2299 | }; 2300 | 2301 | this.getSkinElement = function(component, element) { 2302 | if (_loaded) { 2303 | try { 2304 | return _components[component].elements[element]; 2305 | } catch (err) { 2306 | jwplayer.html5.utils.log("No such skin component / element: ", [component, element]); 2307 | } 2308 | } 2309 | return null; 2310 | }; 2311 | 2312 | this.getComponentSettings = function(component) { 2313 | if (_loaded) { 2314 | return _components[component].settings; 2315 | } 2316 | return null; 2317 | }; 2318 | 2319 | this.getComponentLayout = function(component) { 2320 | if (_loaded) { 2321 | return _components[component].layout; 2322 | } 2323 | return null; 2324 | }; 2325 | 2326 | }; 2327 | })(jwplayer); 2328 | /** 2329 | * JW Player component that loads PNG skins. 2330 | * 2331 | * @author zach 2332 | * @version 1.0 2333 | */ 2334 | (function(jwplayer) { 2335 | /** Constructor **/ 2336 | jwplayer.html5.skinloader = function(skinPath, completeHandler) { 2337 | var _skin = {}; 2338 | var _completeHandler = completeHandler; 2339 | var _loading = true; 2340 | var _completeInterval; 2341 | 2342 | skinPath = jwplayer.html5.utils.getAbsolutePath(skinPath); 2343 | 2344 | /** Load the skin **/ 2345 | function _load() { 2346 | if (skinPath === undefined) { 2347 | _loadSkin(jwplayer.html5.defaultSkin().xml); 2348 | } else { 2349 | jwplayer.utils.ajax(skinPath, function(xmlrequest) { 2350 | _loadSkin(xmlrequest.responseXML); 2351 | }, function(path) { 2352 | _loadSkin(jwplayer.html5.defaultSkin().xml); 2353 | }); 2354 | } 2355 | 2356 | } 2357 | 2358 | 2359 | function _loadSkin(xml) { 2360 | var components = xml.getElementsByTagName('component'); 2361 | if (components.length === 0) { 2362 | return; 2363 | } 2364 | for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 2365 | var componentName = components[componentIndex].getAttribute("name"); 2366 | var component = { 2367 | settings: {}, 2368 | elements: {}, 2369 | layout: {} 2370 | }; 2371 | _skin[componentName] = component; 2372 | var elements = components[componentIndex].getElementsByTagName('elements')[0].getElementsByTagName('element'); 2373 | for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 2374 | _loadImage(elements[elementIndex], componentName); 2375 | } 2376 | var settingsElement = components[componentIndex].getElementsByTagName('settings')[0]; 2377 | if (settingsElement !== undefined && settingsElement.childNodes.length > 0) { 2378 | var settings = settingsElement.getElementsByTagName('setting'); 2379 | for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 2380 | _skin[componentName].settings[settings[settingIndex].getAttribute("name")] = settings[settingIndex].getAttribute("value"); 2381 | } 2382 | } 2383 | var layout = components[componentIndex].getElementsByTagName('layout')[0]; 2384 | if (layout !== undefined && layout.childNodes.length > 0) { 2385 | var groups = layout.getElementsByTagName('group'); 2386 | for (var groupIndex = 0; groupIndex < groups.length; groupIndex++) { 2387 | var group = groups[groupIndex]; 2388 | _skin[componentName].layout[group.getAttribute("position")] = { 2389 | elements: [] 2390 | }; 2391 | for (var attributeIndex = 0; attributeIndex < group.attributes.length; attributeIndex++) { 2392 | var attribute = group.attributes[attributeIndex]; 2393 | _skin[componentName].layout[group.getAttribute("position")][attribute.name] = attribute.value; 2394 | } 2395 | var groupElements = group.getElementsByTagName('*'); 2396 | for (var groupElementIndex = 0; groupElementIndex < groupElements.length; groupElementIndex++) { 2397 | var element = groupElements[groupElementIndex]; 2398 | _skin[componentName].layout[group.getAttribute("position")].elements.push({type:element.tagName}); 2399 | for (var attributeIndex = 0; attributeIndex < element.attributes.length; attributeIndex++) { 2400 | var attribute = element.attributes[attributeIndex]; 2401 | _skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex][attribute.name] = attribute.value; 2402 | } 2403 | if (_skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex].name === undefined){ 2404 | _skin[componentName].layout[group.getAttribute("position")].elements[groupElementIndex].name = element.tagName; 2405 | } 2406 | } 2407 | } 2408 | } 2409 | 2410 | _loading = false; 2411 | 2412 | _resetCompleteIntervalTest(); 2413 | } 2414 | } 2415 | 2416 | 2417 | function _resetCompleteIntervalTest() { 2418 | clearInterval(_completeInterval); 2419 | _completeInterval = setInterval(function() { 2420 | _checkComplete(); 2421 | }, 100); 2422 | } 2423 | 2424 | 2425 | /** Load the data for a single element. **/ 2426 | function _loadImage(element, component) { 2427 | var img = new Image(); 2428 | var elementName = element.getAttribute("name"); 2429 | var elementSource = element.getAttribute("src"); 2430 | var imgUrl; 2431 | if (elementSource.indexOf('data:image/png;base64,') === 0) { 2432 | imgUrl = elementSource; 2433 | } else { 2434 | var skinUrl = jwplayer.html5.utils.getAbsolutePath(skinPath); 2435 | var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 2436 | imgUrl = [skinRoot, component, elementSource].join('/'); 2437 | } 2438 | 2439 | _skin[component].elements[elementName] = { 2440 | height: 0, 2441 | width: 0, 2442 | src: '', 2443 | ready: false 2444 | }; 2445 | 2446 | img.onload = function(evt) { 2447 | _completeImageLoad(img, elementName, component); 2448 | }; 2449 | img.onerror = function(evt) { 2450 | _skin[component].elements[elementName].ready = true; 2451 | _resetCompleteIntervalTest(); 2452 | }; 2453 | 2454 | img.src = imgUrl; 2455 | } 2456 | 2457 | 2458 | function _checkComplete() { 2459 | for (var component in _skin) { 2460 | if (component != 'properties') { 2461 | for (var element in _skin[component].elements) { 2462 | if (!_skin[component].elements[element].ready) { 2463 | return; 2464 | } 2465 | } 2466 | } 2467 | } 2468 | if (_loading === false) { 2469 | clearInterval(_completeInterval); 2470 | _completeHandler(_skin); 2471 | } 2472 | } 2473 | 2474 | 2475 | function _completeImageLoad(img, element, component) { 2476 | _skin[component].elements[element].height = img.height; 2477 | _skin[component].elements[element].width = img.width; 2478 | _skin[component].elements[element].src = img.src; 2479 | _skin[component].elements[element].ready = true; 2480 | _resetCompleteIntervalTest(); 2481 | } 2482 | 2483 | _load(); 2484 | }; 2485 | })(jwplayer); 2486 | /** 2487 | * JW Player component that loads / interfaces PNG skinning. 2488 | * 2489 | * @author zach 2490 | * @version 1.0 2491 | */ 2492 | (function(jwplayer) { 2493 | 2494 | var _completeHandler; 2495 | var _loading; 2496 | 2497 | /** Constructor **/ 2498 | jwplayer.html5.skinner = function(player, completeHandler) { 2499 | _completeHandler = completeHandler; 2500 | player.skin = { 2501 | properties: {} 2502 | }; 2503 | _load(player); 2504 | }; 2505 | 2506 | /** Load the skin **/ 2507 | function _load(player) { 2508 | if (jwplayer.html5.utils.getAbsolutePath(player._model.config.skin) === undefined) { 2509 | _loadSkin(player, jwplayer.html5.defaultSkin); 2510 | } else { 2511 | $.ajax({ 2512 | url: jwplayer.html5.utils.getAbsolutePath(player._model.config.skin), 2513 | complete: function(xmlrequest, textStatus) { 2514 | if (textStatus == "success") { 2515 | _loadSkin(player, xmlrequest.responseXML); 2516 | } else { 2517 | _loadSkin(player, jwplayer.html5.defaultSkin); 2518 | } 2519 | } 2520 | 2521 | }); 2522 | } 2523 | 2524 | } 2525 | 2526 | 2527 | function _loadSkin(player, xml) { 2528 | var components = $('component', xml); 2529 | if (components.length === 0) { 2530 | return; 2531 | } 2532 | for (var componentIndex = 0; componentIndex < components.length; componentIndex++) { 2533 | _loading = true; 2534 | 2535 | var componentName = $(components[componentIndex]).attr('name'); 2536 | var component = { 2537 | settings: {}, 2538 | elements: {} 2539 | }; 2540 | player.skin[componentName] = component; 2541 | var elements = $(components[componentIndex]).find('element'); 2542 | for (var elementIndex = 0; elementIndex < elements.length; elementIndex++) { 2543 | _loadImage(elements[elementIndex], componentName, player); 2544 | } 2545 | var settings = $(components[componentIndex]).find('setting'); 2546 | for (var settingIndex = 0; settingIndex < settings.length; settingIndex++) { 2547 | player.skin[componentName].settings[$(settings[settingIndex]).attr("name")] = $(settings[settingIndex]).attr("value"); 2548 | } 2549 | 2550 | _loading = false; 2551 | 2552 | _resetCompleteIntervalTest(player); 2553 | } 2554 | } 2555 | 2556 | 2557 | function _resetCompleteIntervalTest(player) { 2558 | clearInterval(player.skin._completeInterval); 2559 | player.skin._completeInterval = setInterval(function() { 2560 | _checkComplete(player); 2561 | }, 100); 2562 | } 2563 | 2564 | 2565 | /** Load the data for a single element. **/ 2566 | function _loadImage(element, component, player) { 2567 | var img = new Image(); 2568 | var elementName = $(element).attr('name'); 2569 | var elementSource = $(element).attr('src'); 2570 | var imgUrl; 2571 | if (elementSource.indexOf('data:image/png;base64,') === 0) { 2572 | imgUrl = elementSource; 2573 | } else { 2574 | var skinUrl = jwplayer.html5.utils.getAbsolutePath(player._model.config.skin); 2575 | var skinRoot = skinUrl.substr(0, skinUrl.lastIndexOf('/')); 2576 | imgUrl = [skinRoot, component, elementSource].join('/'); 2577 | } 2578 | 2579 | player.skin[component].elements[elementName] = { 2580 | height: 0, 2581 | width: 0, 2582 | src: '', 2583 | ready: false 2584 | }; 2585 | 2586 | $(img).load(_completeImageLoad(img, elementName, component, player)); 2587 | $(img).error(function() { 2588 | player.skin[component].elements[elementName].ready = true; 2589 | _resetCompleteIntervalTest(player); 2590 | }); 2591 | 2592 | img.src = imgUrl; 2593 | } 2594 | 2595 | 2596 | function _checkComplete(player) { 2597 | for (var component in player.skin) { 2598 | if (component != 'properties') { 2599 | for (var element in player.skin[component].elements) { 2600 | if (!player.skin[component].elements[element].ready) { 2601 | return; 2602 | } 2603 | } 2604 | } 2605 | } 2606 | if (_loading === false) { 2607 | clearInterval(player.skin._completeInterval); 2608 | _completeHandler(); 2609 | } 2610 | } 2611 | 2612 | 2613 | function _completeImageLoad(img, element, component, player) { 2614 | return function() { 2615 | player.skin[component].elements[element].height = img.height; 2616 | player.skin[component].elements[element].width = img.width; 2617 | player.skin[component].elements[element].src = img.src; 2618 | player.skin[component].elements[element].ready = true; 2619 | _resetCompleteIntervalTest(player); 2620 | }; 2621 | } 2622 | 2623 | 2624 | jwplayer.html5.skinner.hasComponent = function(player, component) { 2625 | return (player.skin[component] !== null); 2626 | }; 2627 | 2628 | 2629 | jwplayer.html5.skinner.getSkinElement = function(player, component, element) { 2630 | try { 2631 | return player.skin[component].elements[element]; 2632 | } catch (err) { 2633 | jwplayer.html5.utils.log("No such skin component / element: ", [player, component, element]); 2634 | } 2635 | return null; 2636 | }; 2637 | 2638 | 2639 | jwplayer.html5.skinner.addSkinElement = function(player, component, name, element) { 2640 | try { 2641 | player.skin[component][name] = element; 2642 | } catch (err) { 2643 | jwplayer.html5.utils.log("No such skin component ", [player, component]); 2644 | } 2645 | }; 2646 | 2647 | jwplayer.html5.skinner.getSkinProperties = function(player) { 2648 | return player.skin.properties; 2649 | }; 2650 | 2651 | })(jwplayer); 2652 | /** 2653 | * Utility methods for the JW Player. 2654 | * 2655 | * @author zach 2656 | * @version 1.0 2657 | */ 2658 | (function(jwplayer) { 2659 | var _animations = {}; 2660 | 2661 | jwplayer.html5.utils.animations = function() { 2662 | }; 2663 | 2664 | jwplayer.html5.utils.animations.transform = function(domelement, value) { 2665 | domelement.style.webkitTransform = value; 2666 | domelement.style.MozTransform = value; 2667 | domelement.style.OTransform = value; 2668 | }; 2669 | 2670 | jwplayer.html5.utils.animations.transformOrigin = function(domelement, value) { 2671 | domelement.style.webkitTransformOrigin = value; 2672 | domelement.style.MozTransformOrigin = value; 2673 | domelement.style.OTransformOrigin = value; 2674 | }; 2675 | 2676 | jwplayer.html5.utils.animations.rotate = function(domelement, deg) { 2677 | jwplayer.html5.utils.animations.transform(domelement, ["rotate(", deg, "deg)"].join("")); 2678 | }; 2679 | 2680 | jwplayer.html5.utils.fadeTo = function(domelement, endAlpha, time, startAlpha, startTime) { 2681 | // Interrupting 2682 | if (_animations[domelement] != startTime && startTime !== undefined){ 2683 | return; 2684 | } 2685 | var currentTime = new Date().getTime(); 2686 | if (startAlpha === undefined) { 2687 | startAlpha = domelement.style.opacity === "" ? 1 : domelement.style.opacity; 2688 | } 2689 | if (typeof startAlpha == "string"){ 2690 | startAlpha = parseInt(startAlpha, 10); 2691 | } 2692 | if (domelement.style.opacity == endAlpha && domelement.style.opacity !== "" && startTime !== undefined){ 2693 | return; 2694 | } 2695 | if (startTime === undefined) { 2696 | startTime = currentTime; 2697 | _animations[domelement] = startTime; 2698 | } 2699 | var percentTime = (currentTime - startTime) / (time * 1000); 2700 | percentTime = percentTime > 1 ? 1 : percentTime; 2701 | var delta = endAlpha - startAlpha; 2702 | var alpha = startAlpha + (percentTime * delta); 2703 | if (alpha > 1){ 2704 | alpha = 1; 2705 | } else if (alpha < 0) { 2706 | alpha = 0; 2707 | } 2708 | domelement.style.opacity = alpha; 2709 | setTimeout(function() { 2710 | jwplayer.html5.utils.fadeTo(domelement, endAlpha, time, startAlpha, startTime); 2711 | }, 100); 2712 | }; 2713 | 2714 | })(jwplayer); 2715 | /** 2716 | * A factory for API calls that either set listeners or return data 2717 | * 2718 | * @author zach 2719 | * @version 1.0 2720 | */ 2721 | (function(jwplayer) { 2722 | 2723 | jwplayer.html5.api = function(container, options) { 2724 | var _container = document.createElement('div'); 2725 | container.parentNode.replaceChild(_container, container); 2726 | _container.id = container.id; 2727 | 2728 | var _model = new jwplayer.html5.model(this, _container, options); 2729 | var _view = new jwplayer.html5.view(this, _container, _model); 2730 | var _controller = new jwplayer.html5.controller(this, _container, _model, _view); 2731 | 2732 | this.version = "1.0"; 2733 | this.id = _container.id; 2734 | this.skin = new jwplayer.html5.skin(); 2735 | 2736 | this.jwPlay = _controller.play; 2737 | this.jwPause = _controller.pause; 2738 | this.jwStop = _controller.stop; 2739 | this.jwSeek = _controller.seek; 2740 | this.jwPlaylistItem = _controller.item; 2741 | this.jwPlaylistNext = _controller.next; 2742 | this.jwPlaylistPrev = _controller.prev; 2743 | this.jwResize = _controller.resize; 2744 | this.jwLoad = _controller.load; 2745 | 2746 | function _statevarFactory(statevar) { 2747 | return function() { 2748 | return _model[statevar]; 2749 | }; 2750 | } 2751 | 2752 | this.jwGetItem = _statevarFactory('item'); 2753 | this.jwGetPosition = _statevarFactory('position'); 2754 | this.jwGetDuration = _statevarFactory('duration'); 2755 | this.jwGetBuffer = _statevarFactory('buffer'); 2756 | this.jwGetWidth = _statevarFactory('width'); 2757 | this.jwGetHeight = _statevarFactory('height'); 2758 | this.jwGetFullscreen = _statevarFactory('fullscreen'); 2759 | this.jwSetFullscreen = _controller.setFullscreen; 2760 | this.jwGetVolume = _statevarFactory('volume'); 2761 | this.jwSetVolume = _controller.setVolume; 2762 | this.jwGetMute = _statevarFactory('mute'); 2763 | this.jwSetMute = _controller.setMute; 2764 | 2765 | this.jwGetState = _statevarFactory('state'); 2766 | this.jwGetVersion = function() { 2767 | return this.version; 2768 | }; 2769 | this.jwGetPlaylist = function() { 2770 | return _model.playlist; 2771 | }; 2772 | 2773 | this.jwAddEventListener = _controller.addEventListener; 2774 | this.jwRemoveEventListener = _controller.removeEventListener; 2775 | this.jwSendEvent = _controller.sendEvent; 2776 | 2777 | //UNIMPLEMENTED 2778 | this.jwGetLevel = function() { 2779 | }; 2780 | this.jwGetBandwidth = function() { 2781 | }; 2782 | this.jwGetLockState = function() { 2783 | }; 2784 | this.jwLock = function() { 2785 | }; 2786 | this.jwUnlock = function() { 2787 | }; 2788 | 2789 | this.skin.load(_model.config.skin, function() { 2790 | _model.loadPlaylist(_model.config, false); 2791 | _model.setupPlugins(); 2792 | _view.setup(_model.getMedia().getDisplayElement()); 2793 | var evt = { 2794 | id: this.id, 2795 | version: this.version 2796 | }; 2797 | _controller.sendEvent(jwplayer.api.events.JWPLAYER_READY, evt); 2798 | if (playerReady !== undefined) { 2799 | playerReady(evt); 2800 | } 2801 | 2802 | if (window[_model.config.playerReady] !== undefined) { 2803 | window[_model.config.playerReady](evt); 2804 | } 2805 | 2806 | _model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED); 2807 | _model.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM, { 2808 | "item": _model.config.item 2809 | }); 2810 | 2811 | if (_model.config.autostart === true && !_model.config.chromeless) { 2812 | _controller.play(); 2813 | } 2814 | }); 2815 | 2816 | return this; 2817 | }; 2818 | 2819 | })(jwplayer); 2820 | --------------------------------------------------------------------------------