├── .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 = '';
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 |
--------------------------------------------------------------------------------