Changeset 975
- Timestamp:
- 04/30/10 02:13:44 (3 years ago)
- Location:
- trunk/html5
- Files:
-
- 1 added
- 11 edited
-
index.html (modified) (3 diffs)
-
jquery.jwplayer.js (modified) (35 diffs)
-
src/jquery.jwplayerControlbar.js (modified) (9 diffs)
-
src/jquery.jwplayerController.js (modified) (2 diffs)
-
src/jquery.jwplayerCore.js (modified) (3 diffs)
-
src/jquery.jwplayerDisplay.js (added)
-
src/jquery.jwplayerMediaFlash.js (modified) (2 diffs)
-
src/jquery.jwplayerMediaVideo.js (modified) (8 diffs)
-
src/jquery.jwplayerModel.js (modified) (4 diffs)
-
src/jquery.jwplayerParse.js (modified) (3 diffs)
-
src/jquery.jwplayerUtils.js (modified) (2 diffs)
-
src/jquery.jwplayerView.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/html5/index.html
r962 r975 25 25 height="270" 26 26 id="player1" 27 class="jwplayer" 28 poster="./test/../test/files/bunny.jpg" 29 src="./test/files/bunny.mp4" 27 poster="http://developer.longtailvideo.com/player/trunk/html5/test/files/bunny.jpg" 30 28 width="480" 31 29 > 30 <source src='test/files/bunny.mp4''> 31 32 32 </video> 33 34 <script type="text/javascript"> 35 $('#player1').jwplayer({ 36 skin:'assets/five/five.xml', 37 repeat: 'list' 38 }); 39 </script> 33 40 34 41 <h4>Test 2: manual embed</h4> … … 42 49 </video> 43 50 51 44 52 <script type="text/javascript"> 45 53 $('#player2').jwplayer({ … … 47 55 }); 48 56 </script> 49 50 57 <h4>Test 3: Theora</h4> 51 58 <video -
trunk/html5/jquery.jwplayer.js
r971 r975 8 8 */ 9 9 (function($) { 10 11 var controlbars = {} 12 13 10 var controlbars = {}; 11 14 12 /** Hooking the jwplayerControlbar up to jQuery. **/ 15 13 $.fn.jwplayerControlbar = function(player, domelement) { … … 19 17 }; 20 18 19 $.fn.jwplayerControlbar.positions = { 20 BOTTOM: 'BOTTOM', 21 TOP: 'TOP', 22 OVER: 'OVER' 23 }; 24 21 25 22 26 /** Map with config for the jwplayerControlbar plugin. **/ … … 24 28 fontsize: 10, 25 29 fontcolor: '000000', 26 position: 'bottom',30 position: $.fn.jwplayerControlbar.positions.BOTTOM, 27 31 leftmargin: 0, 28 32 rightmargin: 0, … … 34 38 // Draw the background. 35 39 domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 36 $("#" + player.id + '_jwplayerControlbar').css('position', ' relative');40 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 37 41 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 42 switch (controlbars[player.id].position) { 43 case $.fn.jwplayerControlbar.positions.TOP: 44 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 45 break; 46 default: 47 $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 48 domelement.parents(":first").css('height', parseInt(domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 49 break; 50 } 38 51 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 39 52 // Draw all elements on top of the bar. … … 124 137 height: player.height() 125 138 }); 139 timeHandler({ 140 id: player.id, 141 time: 0, 142 duration: 0 143 }); 144 bufferHandler({ 145 id: player.id, 146 bufferProgress: 0 147 }); 126 148 muteHandler({ 127 149 id: player.id, … … 187 209 sliderUp(evt.pageX, player); 188 210 }); 189 $(bar).mouseleave(function(evt) {190 sliderUp(evt.pageX, player);191 evt.stopPropagation();192 });193 211 $(bar).mousemove(function(evt) { 194 212 if (controlbars[player.id].scrubber == 'time') { 195 var xps = evt.pageX - $(bar).position().left; 213 controlbars[player.id].mousedown = true; 214 var xps = evt.pageX - $(bar).offset().left; 196 215 $('#' + player.id + '_timeSliderThumb').css('left', xps); 197 216 } … … 202 221 /** The slider has been moved up. **/ 203 222 function sliderUp(msx, player) { 223 controlbars[player.id].mousedown = false; 204 224 if (controlbars[player.id].scrubber == 'time') { 205 225 var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left; 206 226 var wid = $('#' + player.id + '_timeSliderRail').width(); 207 var pos = xps / wid * player.duration();227 var pos = xps / wid * controlbars[player.id].currentDuration; 208 228 if (pos < 0) { 209 229 pos = 0; 210 } else if (pos > controlbars[player.id]. duration) {211 pos = controlbars[player.id]. duration - 3;230 } else if (pos > controlbars[player.id].currentDuration) { 231 pos = controlbars[player.id].currentDuration - 3; 212 232 } 213 233 player.seek(pos); 234 if (player.model.state != $.fn.jwplayer.states.PLAYING) { 235 player.play(); 236 } 214 237 } else if (controlbars[player.id].scrubber == 'volume') { 215 238 var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left; … … 273 296 } else { 274 297 $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 275 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 276 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 298 if (event.newstate != $.fn.jwplayer.states.BUFFERING) { 299 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 300 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 301 } 277 302 } 278 303 } 279 304 280 305 /** Handles event completion **/ 281 function completeHandler(event) {306 function completeHandler(event) { 282 307 timeHandler($.extend(event, { 283 308 position: 0, … … 301 326 302 327 $('#' + event.id + '_timeSliderProgress').css('width', Math.round(railWidth * progress)); 303 $('#' + event.id + '_timeSliderThumb').css('left', railLeft + Math.round((railWidth - thumbWidth) * progress)); 328 if (!controlbars[event.id].mousedown) { 329 $('#' + event.id + '_timeSliderThumb').css('left', railLeft + Math.round((railWidth - thumbWidth) * progress)); 330 } 304 331 305 332 $('#' + event.id + '_durationText').html(timeFormat(controlbars[event.id].currentDuration)); … … 386 413 (function($) { 387 414 388 var mediaParams ={ 389 volume: 100, 390 fullscreen: false, 391 mute: false, 392 width: 480, 393 height: 320, 394 duration: 0, 395 source: 0, 396 buffer: 0, 397 // I hate javascript 398 //state: $.fn.jwplayer.states.IDLE 399 state: 'IDLE' 400 }; 401 402 $.fn.jwplayerController = function() { 403 return this.each(function() { 404 }); 405 }; 406 407 408 $.fn.jwplayerController.play = function(player) { 409 player.media.play(); 410 try { 411 player.media.play(); 412 return true; 413 } catch (err) { 414 $.fn.jwplayerUtils.log("error", err); 415 } 416 return false; 417 }; 415 var mediaParams = function() { 416 return { 417 volume: 100, 418 fullscreen: false, 419 mute: false, 420 width: 480, 421 height: 320, 422 duration: 0, 423 source: 0, 424 sources: [], 425 buffer: 0, 426 state: $.fn.jwplayer.states.IDLE 427 }; 428 }; 429 430 $.fn.jwplayerController = function(player) { 431 return { 432 play: play(player), 433 pause: pause(player), 434 seek: seek(player), 435 stop: pause(player), 436 volume: volume(player), 437 mute: mute(player), 438 resize: resize(player), 439 fullscreen: fullscreen(player), 440 load: load(player), 441 mediaInfo: mediaInfo(player), 442 addEventListener: addEventListener(player), 443 removeEventListener: removeEventListener(player), 444 sendEvent: sendEvent(player) 445 }; 446 }; 447 448 449 function play(player) { 450 return function() { 451 try { 452 switch (player.model.state) { 453 case $.fn.jwplayer.states.IDLE: 454 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, player.media.play); 455 player.media.load(player.model.sources[player.model.source].file); 456 break; 457 case $.fn.jwplayer.states.PAUSED: 458 player.media.play(); 459 break; 460 } 461 462 return $.jwplayer(player.id); 463 } catch (err) { 464 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 465 } 466 return false; 467 }; 468 } 418 469 419 470 /** Switch the pause state of the player. **/ 420 $.fn.jwplayerController.pause = function(player) { 421 try { 422 player.media.pause(); 423 return true; 424 } catch (err) { 425 $.fn.jwplayerUtils.log("error", err); 426 } 427 return false; 428 }; 471 function pause(player) { 472 return function() { 473 try { 474 switch (player.model.state) { 475 case $.fn.jwplayer.states.PLAYING: 476 case $.fn.jwplayer.states.BUFFERING: 477 player.media.pause(); 478 break; 479 } 480 return $.jwplayer(player.id); 481 } catch (err) { 482 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 483 } 484 return false; 485 }; 486 } 429 487 430 488 431 489 /** Seek to a position in the video. **/ 432 $.fn.jwplayerController.seek = function(player, position) { 433 try { 434 player.media.seek(position); 435 return true; 436 } catch (err) { 437 $.fn.jwplayerUtils.log("error", err); 438 439 } 440 return false; 441 }; 490 function seek(player) { 491 return function(position) { 492 try { 493 switch (player.model.state) { 494 case $.fn.jwplayer.states.PLAYING: 495 case $.fn.jwplayer.states.PAUSED: 496 case $.fn.jwplayer.states.BUFFERING: 497 player.media.seek(position); 498 break; 499 } 500 return $.jwplayer(player.id); 501 } catch (err) { 502 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 503 } 504 return false; 505 }; 506 } 442 507 443 508 444 509 /** Stop playback and loading of the video. **/ 445 $.fn.jwplayerController.stop = function(player) { 446 try { 447 player.media.stop(); 448 return true; 449 } catch (err) { 450 $.fn.jwplayerUtils.log("error", err); 451 452 } 453 return false; 454 }; 510 function stop(player) { 511 return function() { 512 try { 513 player.media.stop(); 514 return $.jwplayer(player.id); 515 } catch (err) { 516 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 517 } 518 return false; 519 }; 520 } 455 521 456 522 457 523 /** Get / set the video's volume level. **/ 458 $.fn.jwplayerController.volume = function(player, position) { 459 try { 460 if (position === undefined) { 461 return player.model.volume; 462 } else { 463 player.media.volume(position); 464 player.model.volume = position; 465 return true; 466 } 467 } catch (err) { 468 $.fn.jwplayerUtils.log("error", err); 469 } 470 return false; 471 }; 524 function volume(player) { 525 return function(arg) { 526 try { 527 switch ($.fn.jwplayerUtils.typeOf(arg)) { 528 case "function": 529 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 530 break; 531 case "number": 532 player.media.volume(arg); 533 return true; 534 case "string": 535 player.media.volume(parseInt(arg, 10)); 536 return true; 537 default: 538 return player.model.volume; 539 } 540 return $.jwplayer(player.id); 541 } catch (err) { 542 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 543 } 544 return false; 545 }; 546 } 472 547 473 548 /** Get / set the mute state of the player. **/ 474 $.fn.jwplayerController.mute = function(player, state) { 475 try { 476 if (state === undefined) { 477 return player.model.mute; 478 } else { 479 player.media.mute(state); 480 return true; 481 } 482 return true; 483 } catch (err) { 484 $.fn.jwplayerUtils.log("error", err); 485 } 486 return false; 487 }; 549 function mute(player) { 550 return function(arg) { 551 try { 552 switch ($.fn.jwplayerUtils.typeOf(arg)) { 553 case "function": 554 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); 555 break; 556 case "boolean": 557 player.media.mute(arg); 558 break; 559 default: 560 return player.model.mute; 561 } 562 return $.jwplayer(player.id); 563 } catch (err) { 564 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 565 } 566 return false; 567 }; 568 } 569 570 571 /** Resizes the video **/ 572 function resize(player) { 573 return function(arg1, arg2) { 574 try { 575 switch ($.fn.jwplayerUtils.typeOf(arg1)) { 576 case "function": 577 player.addEventListener($.fn.jwplayer.events.JWPLAYER_RESIZE, arg1); 578 break; 579 case "number": 580 player.media.resize(arg1, arg2); 581 break; 582 default: 583 break; 584 } 585 return $.jwplayer(player.id); 586 } catch (err) { 587 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 588 } 589 return false; 590 }; 591 } 488 592 489 593 490 594 /** Jumping the player to/from fullscreen. **/ 491 $.fn.jwplayerController.fullscreen = function(player, state) { 492 try { 493 if (state === undefined) { 494 return player.model.fullscreen; 495 } else { 496 player.media.fullscreen(state); 497 return true; 498 } 499 } catch (err) { 500 $.fn.jwplayerUtils.log("error", err); 501 } 502 return false; 503 }; 504 505 /** Resizes the video **/ 506 $.fn.jwplayerController.resize = function(player, width, height) { 507 try { 508 player.media.resize(width, height); 509 return true; 510 } catch (err) { 511 $.fn.jwplayerUtils.log("error", err); 512 } 513 return false; 514 }; 595 function fullscreen(player) { 596 return function(arg) { 597 try { 598 switch ($.fn.jwplayerUtils.typeOf(arg)) { 599 case "function": 600 player.addEventListener($.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); 601 break; 602 case "boolean": 603 player.media.fullscreen(arg); 604 break; 605 default: 606 return player.model.fullscreen; 607 } 608 return $.jwplayer(player.id); 609 } catch (err) { 610 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 611 } 612 return false; 613 }; 614 } 615 616 /** Loads a new video **/ 617 function load(player) { 618 return function(arg) { 619 try { 620 switch ($.fn.jwplayerUtils.typeOf(arg)) { 621 case "function": 622 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); 623 break; 624 default: 625 player.media.load(arg); 626 break; 627 } 628 return $.jwplayer(player.id); 629 } catch (err) { 630 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 631 } 632 return false; 633 }; 634 } 635 515 636 516 637 /** Returns the meta **/ 517 $.fn.jwplayerController.mediaInfo = function(player) {638 function mediaInfo(player) { 518 639 try { 519 640 var result = {}; 520 for (var mediaParam in mediaParams ){641 for (var mediaParam in mediaParams()) { 521 642 result[mediaParam] = player.model[mediaParam]; 522 643 } … … 526 647 } 527 648 return false; 528 }; 529 530 /** Loads a new video **/ 531 $.fn.jwplayerController.load = function(player, path) { 532 try { 533 player.media.load(path); 534 return true; 535 } catch (err) { 536 $.fn.jwplayerUtils.log("error", err); 537 } 538 return false; 539 }; 649 } 650 651 652 /** Add an event listener. **/ 653 function addEventListener(player) { 654 return function(type, listener, count) { 655 try { 656 if (player.listeners[type] === undefined) { 657 player.listeners[type] = []; 658 } 659 player.listeners[type].push({ 660 listener: listener, 661 count: count 662 }); 663 } catch (err) { 664 $.fn.jwplayerUtils.log("error", err); 665 } 666 return false; 667 }; 668 } 669 670 671 /** Remove an event listener. **/ 672 function removeEventListener(player) { 673 return function(type, listener) { 674 try { 675 for (var lisenterIndex in player.listeners[type]) { 676 if (player.listeners[type][lisenterIndex] == listener) { 677 player.listeners[type].slice(lisenterIndex, lisenterIndex + 1); 678 break; 679 } 680 } 681 } catch (err) { 682 $.fn.jwplayerUtils.log("error", err); 683 } 684 return false; 685 }; 686 } 687 688 /** Send an event **/ 689 function sendEvent(player) { 690 return function(type, data) { 691 data = $.extend({ 692 id: player.id, 693 version: player.version 694 }, data); 695 if (player.config.debug == 'CONSOLE') { 696 $.fn.jwplayerUtils.log(type, data); 697 } 698 for (var listenerIndex in player.listeners[type]) { 699 try { 700 player.listeners[type][listenerIndex].listener(data); 701 } catch (err) { 702 $.fn.jwplayerUtils.log("There was an error while handling a listener", err); 703 } 704 if (player.listeners[type][listenerIndex].count === 1) { 705 delete player.listeners[type][listenerIndex]; 706 } else if (player.listeners[type][listenerIndex].count > 0) { 707 player.listeners[type][listenerIndex].count = player.listeners[type][listenerIndex].count - 1; 708 } 709 } 710 }; 711 } 540 712 541 713 })(jQuery); … … 549 721 */ 550 722 (function($) { 723 /** Map with all players on the page. **/ 724 var players = {}; 725 551 726 /** Hooking the controlbar up to jQuery. **/ 552 727 $.fn.jwplayer = function(options) { 553 728 return this.each(function() { 554 $.fn.jwplayerUtils.log("setup", this); 555 var model = $.fn.jwplayerModel($(this), options); 556 var player = { 557 model: model 558 }; 559 players[model.config.id] = player; 560 player = $.extend(player, api(player)); 561 $.fn.jwplayerView(player); 562 $.fn.jwplayerModel.setActiveMediaProvider(player); 563 $.fn.jwplayerSkinner(player, function() { 564 finishSetup(player); 565 }); 566 }); 567 }; 568 569 function finishSetup(player) { 570 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 571 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 572 } 573 574 575 /** Map with all players on the page. **/ 576 var players = {}; 729 $.fn.jwplayerUtils.log("Starting setup", this); 730 setupJWPlayer($(this), 0, options); 731 }); 732 }; 733 734 function setupJWPlayer(player, step, options) { 735 $.fn.jwplayerUtils.log("Starting step " + step, { 736 player: player, 737 options: options 738 }); 739 try { 740 switch (step) { 741 case 0: 742 var model = $.fn.jwplayerModel(player, options); 743 var player = { 744 model: model, 745 listeners: {} 746 }; 747 setupJWPlayer(player, step + 1); 748 break; 749 case 1: 750 player.controller = $.fn.jwplayerController(player); 751 players[player.model.config.id] = player; 752 setupJWPlayer($.extend(player, api(player)), step + 1); 753 break; 754 case 2: 755 $.fn.jwplayerView(player); 756 setupJWPlayer(player, step + 1); 757 break; 758 case 3: 759 $.fn.jwplayerModel.setActiveMediaProvider(player); 760 setupJWPlayer(player, step + 1); 761 break; 762 case 4: 763 $.fn.jwplayerSkinner(player, function() { 764 $.fn.jwplayerUtils.log("Skin loading complete", player); 765 setupJWPlayer(player, step + 1); 766 }); 767 break; 768 case 5: 769 $.fn.jwplayerDisplay($.jwplayer(player.id), player.model.domelement); 770 setupJWPlayer(player, step + 1); 771 break; 772 case 6: 773 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 774 setupJWPlayer(player, step + 1); 775 break; 776 case 7: 777 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 778 setupJWPlayer(player, step + 1) 779 break; 780 default: 781 if (player.config.autostart === true) { 782 player.play(); 783 } 784 if (player.config.repeat) { 785 if ((player.config.repeat.toLowerCase() == 'list') || (player.config.repeat.toLowerCase() == 'always') || (player.config.repeat.toLowerCase() == 'single')) { 786 player.complete(function() { 787 player.play(); 788 }); 789 } 790 } 791 break; 792 } 793 } catch (err) { 794 $.fn.jwplayerUtils.log("Setup failed at step " + step, err); 795 } 796 } 577 797 578 798 … … 587 807 width: 480, 588 808 mute: false, 589 flashplayer:'http://developer.longtailvideo.com/player/trunk/html5/assets/player.swf' 590 }; 591 592 593 /** Start playback or resume. **/ 594 function play(player) { 595 return function() { 596 $.fn.jwplayerController.play(player); 597 return jwplayer(player.id); 598 }; 599 } 600 601 /** Switch the pause state of the player. **/ 602 function pause(player) { 603 return function() { 604 $.fn.jwplayerController.pause(player); 605 return jwplayer(player.id); 606 }; 607 } 608 609 610 /** Seek to a position in the video. **/ 611 function seek(player) { 612 return function(arg) { 613 $.fn.jwplayerController.seek(player, arg); 614 return jwplayer(player.id); 615 }; 616 } 617 618 619 /** Stop playback and loading of the video. **/ 620 function stop(player) { 621 return function() { 622 $.fn.jwplayerController.stop(player); 623 return jwplayer(player.id); 624 }; 625 } 626 627 628 /** Change the video's volume level. **/ 629 function volume(player) { 809 bufferlength: 5, 810 start: 0, 811 position: 0, 812 flashplayer: 'http://developer.longtailvideo.com/player/trunk/html5/assets/player.swf' 813 }; 814 815 816 /** A factory for API calls that either set listeners or return data **/ 817 function dataListenerFactory(player, dataType, eventType) { 630 818 return function(arg) { 631 819 switch ($.fn.jwplayerUtils.typeOf(arg)) { 632 820 case "function": 633 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 634 break; 635 case "number": 636 $.fn.jwplayerController.volume(player, arg); 637 break; 638 case "string": 639 $.fn.jwplayerController.volume(player, parseInt(arg, 10)); 821 if (!$.fn.jwplayerUtils.isNull(eventType)) { 822 player.addEventListener(eventType, arg); 823 } 640 824 break; 641 825 default: 642 return $.fn.jwplayerController.volume(player); 643 } 644 return jwplayer(player.id); 645 }; 646 } 647 648 /** Switch the mute state of the player. **/ 649 function mute(player) { 650 return function(arg) { 651 switch ($.fn.jwplayerUtils.typeOf(arg)) { 652 case "function": 653 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); 654 break; 655 case "boolean": 656 $.fn.jwplayerController.mute(player, arg); 657 break; 658 default: 659 return $.fn.jwplayerController.mute(player); 660 } 661 return jwplayer(player.id); 662 }; 663 } 664 665 /** Resizing the player **/ 666 function resize(player) { 667 return function(arg1, arg2) { 668 switch ($.fn.jwplayerUtils.typeOf(arg)) { 669 case "function": 670 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_RESIZE, arg); 671 break; 672 case "number": 673 $.fn.jwplayerController.resize(player, arg1, arg2); 674 break; 675 default: 676 break; 677 } 678 return jwplayer(player.id); 679 }; 680 } 681 682 /** Fullscreen the player **/ 683 function fullscreen(player) { 684 return function(arg) { 685 switch ($.fn.jwplayerUtils.typeOf(arg)) { 686 case "function": 687 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); 688 break; 689 case "boolean": 690 $.fn.jwplayerController.fullscreen(player, arg); 691 break; 692 default: 693 return $.fn.jwplayerController.fullscreen(player); 694 } 695 return jwplayer(player.id); 696 }; 697 } 698 699 /** Adds a state listener **/ 700 function state(player) { 701 return function(arg) { 702 switch ($.fn.jwplayerUtils.typeOf(arg)) { 703 case "function": 704 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, arg); 705 break; 706 default: 707 return $.fn.jwplayerController.mediaInfo(player).state; 708 } 709 return jwplayer(player.id); 710 }; 711 } 712 713 /** Adds a buffer listener **/ 714 function buffer(player) { 715 return function(arg) { 716 switch ($.fn.jwplayerUtils.typeOf(arg)) { 717 case "function": 718 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, arg); 719 break; 720 default: 721 return $.fn.jwplayerController.mediaInfo(player).buffer; 722 } 723 return jwplayer(player.id); 724 }; 725 } 726 727 /** Returns the current time **/ 728 function time(player) { 729 return function(arg) { 730 switch ($.fn.jwplayerUtils.typeOf(arg)) { 731 case "function": 732 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, arg); 733 break; 734 default: 735 return $.fn.jwplayerController.mediaInfo(player).time; 736 } 737 return jwplayer(player.id); 738 }; 739 } 740 741 /** Loads a new video into the player **/ 742 function load(player) { 743 return function(arg) { 744 switch ($.fn.jwplayerUtils.typeOf(arg)) { 745 case "function": 746 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); 747 break; 748 default: 749 $.fn.jwplayerController.load(player, arg); 750 } 751 return jwplayer(player.id); 752 }; 753 } 754 755 /** Adds a listener for video completion **/ 756 function complete(player) { 757 return function(arg) { 758 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE, arg); 759 return jwplayer(player.id); 760 }; 761 } 762 763 /** Adds a listener for player ready **/ 764 function ready(player) { 765 return function(arg) { 766 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_READY, arg); 767 return jwplayer(player.id); 768 }; 769 } 770 771 /** Returns the duration **/ 772 function duration(player) { 773 return function() { 774 return $.fn.jwplayerController.mediaInfo(player).duration; 775 }; 776 } 777 778 /** Adds a listener for media errors. **/ 779 function error(player) { 780 return function(arg) { 781 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_ERROR, arg); 782 return jwplayer(player.id); 783 }; 784 } 785 786 787 /** Returns the width **/ 788 function width(player) { 789 return function() { 790 return $.fn.jwplayerController.mediaInfo(player).width; 791 }; 792 } 793 794 795 /** Returns the height **/ 796 function height(player) { 797 return function() { 798 return $.fn.jwplayerController.mediaInfo(player).height; 799 }; 800 } 801 802 /** Returns the available meta-data **/ 803 function meta(player) { 804 return function() { 805 switch ($.fn.jwplayerUtils.typeOf(arg)) { 806 case "function": 807 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_META, arg); 808 break; 809 default: 810 return $.fn.jwplayerController.mediaInfo(player); 811 } 812 return jwplayer(player.id); 813 }; 814 } 815 816 /** Returns the API method for adding an event listener.**/ 817 function apiAddEventListener(player) { 818 return function(type, listener) { 819 addEventListener(player, type, listener); 820 }; 821 } 822 823 /** Returns the API method for adding an event listener.**/ 824 function apiRemoveEventListener(player) { 825 return function(type, listener) { 826 removeEventListener(player, type, listener); 827 }; 828 } 829 830 /** Add an event listener. **/ 831 function addEventListener(player, type, listener) { 832 if (player.model.listeners[type] === undefined) { 833 player.model.listeners[type] = []; 834 } 835 player.model.listeners[type].push(listener); 836 } 837 838 839 /** Remove an event listener. **/ 840 function removeEventListener(player, type, listener) { 841 for (var lisenterIndex in player.model.listeners[type]) { 842 if (player.model.listeners[type][lisenterIndex] == listener) { 843 player.model.listeners[type].slice(lisenterIndex, lisenterIndex + 1); 844 break; 845 } 846 } 847 } 848 849 /** Send an event **/ 850 function sendEvent(player) { 851 return function(type, data) { 852 data = $.extend({ 853 id: player.id, 854 version: player.version 855 }, data); 856 //$.fn.jwplayerUtils.log(type, data); 857 for (var listener in player.model.listeners[type]) { 858 player.model.listeners[type][listener](data); 859 } 860 }; 861 } 862 826 if (!$.fn.jwplayerUtils.isNull(dataType)) { 827 return player.controller.mediaInfo[dataType]; 828 } 829 return player.controller.mediaInfo; 830 } 831 return $.jwplayer(player.id); 832 }; 833 } 834 863 835 864 836 function api(player) { 865 if (!$.fn.jwplayerUtils.isNull(player.id)) {837 if (!$.fn.jwplayerUtils.isNull(player.id)) { 866 838 return player; 867 839 } 868 840 return { 841 play: player.controller.play, 842 pause: player.controller.pause, 843 stop: player.controller.stop, 844 seek: player.controller.seek, 845 846 resize: player.controller.resize, 847 fullscreen: player.controller.fullscreen, 848 volume: player.controller.volume, 849 mute: player.controller.mute, 850 load: player.controller.load, 851 852 addEventListener: player.controller.addEventListener, 853 removeEventListener: player.controller.removeEventListener, 854 sendEvent: player.controller.sendEvent, 855 856 ready: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_READY), 857 error: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_ERROR), 858 complete: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE), 859 state: dataListenerFactory(player, 'state', $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE), 860 buffer: dataListenerFactory(player, 'buffer', $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER), 861 time: dataListenerFactory(player, 'position', $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME), 862 duration: dataListenerFactory(player, 'duration'), 863 width: dataListenerFactory(player, 'width'), 864 height: dataListenerFactory(player, 'height'), 865 meta: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_META), 866 869 867 id: player.model.config.id, 870 buffer: buffer(player),871 duration: duration(player),872 complete: complete(player),873 fullscreen: fullscreen(player),874 height: buffer(player),875 load: load(player),876 meta: meta(player),877 mute: mute(player),878 pause: pause(player),879 play: play(player),880 resize: resize(player),881 ready: ready(player),882 seek: seek(player),883 state: state(player),884 stop: stop(player),885 time: time(player),886 volume: volume(player),887 width: width(player),888 skin: player.skin,889 868 config: player.model.config, 890 addEventListener: apiAddEventListener(player), 891 removeEventListener: apiRemoveEventListener(player), 892 sendEvent: sendEvent(player), 893 version: '0.1-alpha' 869 version: '0.1-alpha', 870 skin: player.skin 894 871 }; 895 872 } … … 921 898 JWPLAYER_ERROR: 'jwplayerError', 922 899 JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', 923 //JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull',900 JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', 924 901 JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', 925 902 JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', … … 941 918 $("video.jwplayer").jwplayer(); 942 919 }); 920 921 })(jQuery); 922 /** 923 * JW Player view component 924 * 925 * @author zach 926 * @version 1.0alpha 927 * @lastmodifieddate 2010-04-11 928 */ 929 (function($) { 930 displays = {}; 931 932 $.fn.jwplayerDisplay = function(player, domelement) { 933 displays[player.id] = {}; 934 displays[player.id].domelement = domelement; 935 var meta = player.meta(); 936 domelement.before("<div id='" + player.id + "_display' style='width:" + meta.width + "px;height: " + meta.height + "px;position:relative;z-index:50' ><a id='" + player.id + "_displayImage' href='" + $.fn.jwplayerUtils.getAbsolutePath(meta.sources[meta.source].file) + "'> </a><img id='" + player.id + "_displayIconBackground' src='" + player.skin.display.elements.background.src + "' alt='Click to play video' style='position:absolute; top:" + (meta.height - 60) / 2 + "px; left:" + (meta.width - 60) / 2 + "px; border:0;' /><img id='" + player.id + "_displayIcon' src='" + player.skin.display.elements.playIcon.src + "' alt='Click to play video' style='position:absolute; top:" + (meta.height - 60) / 2 + "px; left:" + (meta.width - 60) / 2 + "px; border:0;' /></div>"); 937 var display = $("#" + player.id + "_display"); 938 var displayImage = $("#" + player.id + "_displayImage"); 939 var displayIcon = $("#" + player.id + "_displayIcon"); 940 var displayIconBackground = $("#" + player.id + "_displayIconBackground"); 941 displayImage.jwplayerCSS({ 942 'display': "block", 943 'background': "#ffffff url('" + $.fn.jwplayerUtils.getAbsolutePath(player.config.image) + "') no-repeat center center", 944 'width': meta.width, 945 'height': meta.height, 946 'position': "relative", 947 'left': 0, 948 'top': 0 949 }); 950 951 display.click(function(evt) { 952 $.fn.jwplayerUtils.log("click" + player.model.state, evt); 953 if (typeof evt.preventDefault != 'undefined') { 954 evt.preventDefault(); // W3C 955 } else { 956 evt.returnValue = false; // IE 957 } 958 if (player.model.state != $.fn.jwplayer.states.PLAYING) { 959 player.play(); 960 } else { 961 player.pause(); 962 } 963 964 }); 965 player.state(stateHandler); 966 player.mute(stateHandler); 967 player.error(function(obj) { 968 969 }); 970 displays[player.id].display = display; 971 displays[player.id].displayImage = displayImage; 972 displays[player.id].displayIcon = displayIcon; 973 displays[player.id].displayIconBackground = displayIconBackground; 974 }; 975 976 function setIcon(player, path) { 977 $("#" + player.id + "_displayIcon")[0].src = path; 978 } 979 980 function stateHandler(obj) { 981 switch ($.jwplayer(obj.id).model.state) { 982 case $.fn.jwplayer.states.BUFFERING: 983 displays[obj.id].displayIconBackground.css("display", "block"); 984 displays[obj.id].displayIcon[0].src = $.jwplayer(obj.id).skin.display.elements.bufferIcon.src; 985 displays[obj.id].displayIcon.css("display", "block"); 986 break; 987 case $.fn.jwplayer.states.PAUSED: 988 displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); 989 displays[obj.id].displayIconBackground.css("display", "block"); 990 displays[obj.id].displayIcon[0].src = $.jwplayer(obj.id).skin.display.elements.playIcon.src; 991 displays[obj.id].displayIcon.css("display", "block"); 992 break; 993 case $.fn.jwplayer.states.IDLE: 994 displays[obj.id].displayImage.css("background", "#ffffff url('" + $.fn.jwplayerUtils.getAbsolutePath($.jwplayer(obj.id).config.image) + "') no-repeat center center"); 995 displays[obj.id].displayIconBackground.css("display", "block"); 996 displays[obj.id].displayIcon[0].src = $.jwplayer(obj.id).skin.display.elements.playIcon.src; 997 displays[obj.id].displayIcon.css("display", "block"); 998 break; 999 default: 1000 if ($.jwplayer(obj.id).mute()) { 1001 displays[obj.id].displayIconBackground.css("display", "block"); 1002 displays[obj.id].displayIcon[0].src = $.jwplayer(obj.id).skin.display.elements.muteIcon.src; 1003 displays[obj.id].displayIcon.css("display", "block"); 1004 } else { 1005 displays[obj.id].displayImage.css("background", "transparent no-repeat center center"); 1006 displays[obj.id].displayIconBackground.css("display", "none"); 1007 displays[obj.id].displayIcon.css("display", "none"); 1008 } 1009 break; 1010 } 1011 } 943 1012 944 1013 })(jQuery); … … 1011 1080 1012 1081 function stateHandler(event, player) { 1082 $.fn.jwplayerUtils.log(event); 1013 1083 player.model.state = event.newstate; 1014 1084 player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { … … 1153 1223 function load(player) { 1154 1224 return function(path) { 1225 path = $.fn.jwplayerUtils.getAbsolutePath(path); 1155 1226 player.model.domelement[0].sendEvent("LOAD", path); 1227 player.model.domelement[0].sendEvent("PLAY"); 1156 1228 }; 1157 1229 } … … 1230 1302 resize: resize(player), 1231 1303 state: $.fn.jwplayer.states.IDLE, 1232 interval: null 1304 interval: null, 1305 loadcount: 0 1233 1306 }; 1234 1307 player.media = media; … … 1255 1328 if (player.model.state != newstate) { 1256 1329 var oldstate = player.model.state; 1330 player.media.state = newstate; 1257 1331 player.model.state = newstate; 1332 $.fn.jwplayerUtils.log($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 1333 oldstate: oldstate, 1334 newstate: newstate 1335 }); 1258 1336 player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 1259 1337 oldstate: oldstate, … … 1274 1352 duration: event.target.duration 1275 1353 }; 1276 if (player.model.duration === 0) {1354 if (player.model.duration === 0) { 1277 1355 player.model.duration = event.target.duration; 1278 1356 } … … 1282 1360 1283 1361 function positionHandler(event, player) { 1362 if (!$.fn.jwplayerUtils.isNull(event.target)) { 1363 if (player.model.duration === 0) { 1364 player.model.duration = event.target.duration; 1365 } 1366 1367 if (!$.fn.jwplayerUtils.isNull(event.target.currentTime)) { 1368 player.model.position = event.target.currentTime; 1369 } 1370 if (player.media.state == $.fn.jwplayer.states.PLAYING) { 1371 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 1372 position: event.target.currentTime, 1373 duration: event.target.duration 1374 }); 1375 } 1376 } 1377 1378 } 1379 1380 function progressHandler(event, player) { 1381 var bufferPercent, bufferTime, bufferFill; 1382 if (!isNaN(event.loaded / event.total)) { 1383 bufferPercent = event.loaded / event.total * 100; 1384 bufferTime = bufferPercent / 100 * player.model.duration; 1385 } else if (player.model.domelement[0].buffered !== undefined) { 1386 maxBufferIndex = 0; 1387 if (maxBufferIndex >= 0) { 1388 bufferPercent = player.model.domelement[0].buffered.end(maxBufferIndex) / player.model.domelement[0].duration * 100; 1389 bufferTime = player.model.domelement[0].buffered.end(maxBufferIndex) - player.model.position; 1390 } 1391 } 1392 1393 bufferFill = bufferTime / player.model.config.bufferlength * 100; 1394 1395 if (bufferFill < 25 && player.media.state == $.fn.jwplayer.states.PLAYING) { 1396 player.media.bufferFull = false; 1397 player.model.domelement[0].pause(); 1398 setState(PlayerState.BUFFERING); 1399 } else if (bufferFill > 95 && player.media.state == $.fn.jwplayer.states.BUFFERING && player.media.bufferFull === false && bufferTime > 0) { 1400 player.media.bufferFull = true; 1401 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 1402 } 1403 1404 if (!player.media.bufferingComplete) { 1405 if (bufferPercent == 100 && player.media.bufferingComplete === false) { 1406 player.media.bufferingComplete = true; 1407 } 1408 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 1409 'bufferPercent': bufferPercent 1410 }); 1411 } 1412 } 1413 1414 function startInterval(player) { 1284 1415 if (player.media.interval === null) { 1285 1416 player.media.interval = window.setInterval(function() { 1286 positionHandler( event, player);1417 positionHandler({}, player); 1287 1418 }, 100); 1288 1419 } 1289 if (player.model.duration === 0){ 1290 player.model.duration = event.target.duration; 1291 } 1292 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 1293 position: event.target.currentTime, 1294 duration: event.target.duration 1295 }); 1296 } 1297 1298 function progressHandler(event, player) { 1299 var buffer; 1300 if (!isNaN(event.loaded / event.total)) { 1301 buffer = event.loaded / event.total * 100; 1302 } else if (player.model.domelement[0].buffered !== undefined) { 1303 buffer = player.model.domelement[0].buffered.end(0) / player.model.domelement[0].duration * 100; 1304 } 1305 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 1306 'bufferPercent': buffer 1307 }); 1308 } 1420 } 1421 1309 1422 1310 1423 function errorHandler(event, player) { … … 1314 1427 function play(player) { 1315 1428 return function() { 1316 player.model.domelement[0].play(); 1429 if (player.media.state != $.fn.jwplayer.states.PLAYING) { 1430 setState(player, $.fn.jwplayer.states.PLAYING); 1431 player.model.domelement[0].play(); 1432 } 1317 1433 }; 1318 1434 } … … 1340 1456 player.model.domelement[0].currentTime = 0; 1341 1457 clearInterval(player.media.interval); 1342 player.media.interval = null;1458 player.media.interval = undefined; 1343 1459 setState(player, $.fn.jwplayer.states.IDLE); 1344 1460 }; … … 1387 1503 player.model.fullscreen = state; 1388 1504 if (state === true) { 1389 player.css("width", window.width);1390 player.css("height", window.height);1505 //player.css("width", window.width); 1506 //player.css("height", window.height); 1391 1507 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_RESIZE, { 1392 width: width,1393 hieght: height1508 width: player.model.width, 1509 hieght: player.model.height 1394 1510 }); 1395 1511 } else { … … 1402 1518 function load(player) { 1403 1519 return function(path) { 1520 path = $.fn.jwplayerUtils.getAbsolutePath(path); 1521 $.fn.jwplayerUtils.log("replay:" + player.model.domelement[0].src + ":" + path + ":" + (path == player.model.domelement[0].src)); 1522 if (path == player.model.domelement[0].src && player.media.loadcount > 0) { 1523 setState(player, $.fn.jwplayer.states.BUFFERING); 1524 setState(player, $.fn.jwplayer.states.PLAYING); 1525 player.model.domelement[0].currentTime = player.config.start; 1526 //player.model.domelement[0].paused = false; 1527 return; 1528 } else if (path != player.model.domelement[0].src) { 1529 player.media.loadcount = 0; 1530 } 1531 player.media.loadcount++; 1532 player.media.bufferFull = false; 1533 player.media.bufferingComplete = false; 1534 setState(player, $.fn.jwplayer.states.BUFFERING); 1404 1535 player.model.domelement[0].src = path; 1405 }; 1406 } 1407 })(jQuery);/** 1536 startInterval(player); 1537 player.model.domelement[0].currentTime = player.config.start; 1538 }; 1539 } 1540 1541 })(jQuery); 1542 /** 1408 1543 * JW Player model component 1409 1544 * … … 1419 1554 fullscreen: false, 1420 1555 mute: false, 1556 start: 0, 1421 1557 width: 480, 1422 1558 height: 320, … … 1427 1563 return { 1428 1564 sources: {}, 1429 listeners: {},1430 1565 state: $.fn.jwplayer.states.IDLE, 1431 1566 source: 0, … … 1437 1572 $.fn.jwplayerModel = function(domElement, options) { 1438 1573 var model = createModel(); 1439 model.config = $. fn.jwplayerParse(domElement[0], options);1574 model.config = $.extend(true, {}, $.fn.jwplayer.defaults, $.fn.jwplayerParse(domElement[0]), options); 1440 1575 if ($.fn.jwplayerUtils.isNull(model.config.id)) { 1441 1576 model.config.id = "jwplayer_" + jwplayerid++; … … 1451 1586 } 1452 1587 } 1588 //model = $.extend(true, {}, , model); 1453 1589 return model; 1454 1590 }; … … 1521 1657 var parsers = {}; 1522 1658 1523 $.fn.jwplayerParse = function(player , options) {1524 return $.extend(true, {}, $.fn.jwplayer.defaults, options, parseElement(player));1659 $.fn.jwplayerParse = function(player) { 1660 return parseElement(player); 1525 1661 }; 1526 1662 … … 1566 1702 }; 1567 1703 } 1704 if (!$.fn.jwplayerUtils.isiPhone()) { 1705 domElement.src = undefined; 1706 } 1568 1707 configuration.sources = sources; 1569 1708 return configuration; … … 1578 1717 attributes = getAttributeList('video', attributes); 1579 1718 var result = parseMediaElement(domElement, attributes); 1580 if (!$.fn.jwplayerUtils.isNull($(domElement).attr('poster')) ){1719 if (!$.fn.jwplayerUtils.isNull($(domElement).attr('poster')) && !$.fn.jwplayerUtils.isiPhone()){ 1581 1720 $(domElement).removeAttr('poster'); 1582 1721 } … … 1710 1849 return this.each(function() { 1711 1850 }); 1851 }; 1852 1853 //http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 1854 $.fn.jwplayerUtils.isiPhone = function() { 1855 var agent = navigator.userAgent.toLowerCase(); 1856 return agent.match(/iPhone/i); 1712 1857 }; 1713 1858 … … 1873 2018 1874 2019 function isAbsolutePath(path) { 2020 if(path === undefined){ 2021 return; 2022 } 1875 2023 var protocol = path.indexOf("://"); 1876 2024 var queryparams = path.indexOf("?"); … … 1974 2122 'margin': 'auto' 1975 2123 }); 1976 player.model.domelement. jwplayerCSS({2124 player.model.domelement.css({ 1977 2125 'position': 'absolute', 1978 2126 'width': player.model.config.width, 1979 2127 'height': player.model.config.height, 1980 'left': 0,1981 2128 'top': 0, 1982 'z-index': 0 1983 }); 1984 player.model.domelement.before("<a href='" + $.fn.jwplayerUtils.getAbsolutePath(player.model.sources[player.model.source].file) + "'><img src='http://content.bitsontherun.com/staticfiles/play.png' alt='Click to play video' style='position:absolute; top:" + (player.model.height - 60) / 2 + "px; left:" + (player.model.width - 60) / 2 + "px; border:0;' /></a>"); 1985 player.model.domelement.prev("a").jwplayerCSS({ 1986 'display': 'block', 1987 'background': '#ffffff url(' + $.fn.jwplayerUtils.getAbsolutePath(player.model.config.image) + ') no-repeat center center', 1988 'width': player.model.width, 1989 'height': player.model.height, 1990 'position': 'relative', 1991 'left': 0, 1992 'top': 0, 1993 'z-index': 50 1994 }); 1995 player.model.domelement.prev("a").click(function(evt) { 1996 if (typeof evt.preventDefault != 'undefined') { 1997 evt.preventDefault(); // W3C 1998 } else { 1999 evt.returnValue = false; // IE 2000 } 2001 if (player.state() !== $.fn.jwplayer.states.PLAYING) { 2002 player.play(); 2003 } else { 2004 player.pause(); 2005 } 2006 2007 }); 2008 player.state(function(obj) { 2009 imageHandler(obj, player); 2010 }); 2011 }; 2012 2013 function imageHandler(obj, player) { 2014 switch (obj.newstate) { 2015 case $.fn.jwplayer.states.IDLE: 2016 player.model.domelement.css("z-index", "0"); 2017 player.model.domelement.prev("a").css("z-index", "50"); 2018 break; 2019 case $.fn.jwplayer.states.PLAYING: 2020 player.model.domelement.prev("a").css("z-index", "0"); 2021 player.model.domelement.css("z-index", "50"); 2022 break; 2023 } 2024 } 2129 'z-index': 0, 2130 margin: 'auto' 2131 }); 2132 }; 2025 2133 2026 2134 $.fn.jwplayerView.switchMediaProvider = function() { -
trunk/html5/src/jquery.jwplayerControlbar.js
r971 r975 8 8 */ 9 9 (function($) { 10 11 var controlbars = {} 12 13 10 var controlbars = {}; 11 14 12 /** Hooking the jwplayerControlbar up to jQuery. **/ 15 13 $.fn.jwplayerControlbar = function(player, domelement) { … … 19 17 }; 20 18 19 $.fn.jwplayerControlbar.positions = { 20 BOTTOM: 'BOTTOM', 21 TOP: 'TOP', 22 OVER: 'OVER' 23 }; 24 21 25 22 26 /** Map with config for the jwplayerControlbar plugin. **/ … … 24 28 fontsize: 10, 25 29 fontcolor: '000000', 26 position: 'bottom',30 position: $.fn.jwplayerControlbar.positions.BOTTOM, 27 31 leftmargin: 0, 28 32 rightmargin: 0, … … 34 38 // Draw the background. 35 39 domelement.parents(":first").append('<div id="' + player.id + '_jwplayerControlbar"></div>'); 36 $("#" + player.id + '_jwplayerControlbar').css('position', ' relative');40 $("#" + player.id + '_jwplayerControlbar').css('position', 'absolute'); 37 41 $("#" + player.id + '_jwplayerControlbar').css('height', player.skin.controlbar.elements.background.height); 42 switch (controlbars[player.id].position) { 43 case $.fn.jwplayerControlbar.positions.TOP: 44 $("#" + player.id + '_jwplayerControlbar').css('top', 0); 45 break; 46 default: 47 $("#" + player.id + '_jwplayerControlbar').css('top', player.height()); 48 domelement.parents(":first").css('height', parseInt(domelement.parents(":first").css('height').replace('px', '')) + player.skin.controlbar.elements.background.height); 49 break; 50 } 38 51 $("#" + player.id + '_jwplayerControlbar').css('background', 'url(' + player.skin.controlbar.elements.background.src + ') repeat-x center left'); 39 52 // Draw all elements on top of the bar. … … 124 137 height: player.height() 125 138 }); 139 timeHandler({ 140 id: player.id, 141 time: 0, 142 duration: 0 143 }); 144 bufferHandler({ 145 id: player.id, 146 bufferProgress: 0 147 }); 126 148 muteHandler({ 127 149 id: player.id, … … 187 209 sliderUp(evt.pageX, player); 188 210 }); 189 $(bar).mouseleave(function(evt) {190 sliderUp(evt.pageX, player);191 evt.stopPropagation();192 });193 211 $(bar).mousemove(function(evt) { 194 212 if (controlbars[player.id].scrubber == 'time') { 195 var xps = evt.pageX - $(bar).position().left; 213 controlbars[player.id].mousedown = true; 214 var xps = evt.pageX - $(bar).offset().left; 196 215 $('#' + player.id + '_timeSliderThumb').css('left', xps); 197 216 } … … 202 221 /** The slider has been moved up. **/ 203 222 function sliderUp(msx, player) { 223 controlbars[player.id].mousedown = false; 204 224 if (controlbars[player.id].scrubber == 'time') { 205 225 var xps = msx - $('#' + player.id + '_timeSliderRail').offset().left; 206 226 var wid = $('#' + player.id + '_timeSliderRail').width(); 207 var pos = xps / wid * player.duration();227 var pos = xps / wid * controlbars[player.id].currentDuration; 208 228 if (pos < 0) { 209 229 pos = 0; 210 } else if (pos > controlbars[player.id]. duration) {211 pos = controlbars[player.id]. duration - 3;230 } else if (pos > controlbars[player.id].currentDuration) { 231 pos = controlbars[player.id].currentDuration - 3; 212 232 } 213 233 player.seek(pos); 234 if (player.model.state != $.fn.jwplayer.states.PLAYING) { 235 player.play(); 236 } 214 237 } else if (controlbars[player.id].scrubber == 'volume') { 215 238 var xps = msx - $('#' + player.id + '_volumeSliderRail').offset().left; … … 273 296 } else { 274 297 $('#' + event.id + '_timeSliderBuffer').css('display', 'block'); 275 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 276 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 298 if (event.newstate != $.fn.jwplayer.states.BUFFERING) { 299 $('#' + event.id + '_timeSliderProgress').css('display', 'block'); 300 $('#' + event.id + '_timeSliderThumb').css('display', 'block'); 301 } 277 302 } 278 303 } 279 304 280 305 /** Handles event completion **/ 281 function completeHandler(event) {306 function completeHandler(event) { 282 307 timeHandler($.extend(event, { 283 308 position: 0, … … 301 326 302 327 $('#' + event.id + '_timeSliderProgress').css('width', Math.round(railWidth * progress)); 303 $('#' + event.id + '_timeSliderThumb').css('left', railLeft + Math.round((railWidth - thumbWidth) * progress)); 328 if (!controlbars[event.id].mousedown) { 329 $('#' + event.id + '_timeSliderThumb').css('left', railLeft + Math.round((railWidth - thumbWidth) * progress)); 330 } 304 331 305 332 $('#' + event.id + '_durationText').html(timeFormat(controlbars[event.id].currentDuration)); -
trunk/html5/src/jquery.jwplayerController.js
r971 r975 8 8 (function($) { 9 9 10 var mediaParams ={ 11 volume: 100, 12 fullscreen: false, 13 mute: false, 14 width: 480, 15 height: 320, 16 duration: 0, 17 source: 0, 18 buffer: 0, 19 // I hate javascript 20 //state: $.fn.jwplayer.states.IDLE 21 state: 'IDLE' 10 var mediaParams = function() { 11 return { 12 volume: 100, 13 fullscreen: false, 14 mute: false, 15 width: 480, 16 height: 320, 17 duration: 0, 18 source: 0, 19 sources: [], 20 buffer: 0, 21 state: $.fn.jwplayer.states.IDLE 22 }; 22 23 }; 23 24 $.fn.jwplayerController = function() { 25 return this.each(function() { 26 }); 24 25 $.fn.jwplayerController = function(player) { 26 return { 27 play: play(player), 28 pause: pause(player), 29 seek: seek(player), 30 stop: pause(player), 31 volume: volume(player), 32 mute: mute(player), 33 resize: resize(player), 34 fullscreen: fullscreen(player), 35 load: load(player), 36 mediaInfo: mediaInfo(player), 37 addEventListener: addEventListener(player), 38 removeEventListener: removeEventListener(player), 39 sendEvent: sendEvent(player) 40 }; 27 41 }; 28 42 29 43 30 $.fn.jwplayerController.play = function(player) { 31 player.media.play(); 32 try { 33 player.media.play(); 34 return true; 35 } catch (err) { 36 $.fn.jwplayerUtils.log("error", err); 37 } 38 return false; 39 }; 44 function play(player) { 45 return function() { 46 try { 47 switch (player.model.state) { 48 case $.fn.jwplayer.states.IDLE: 49 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, player.media.play); 50 player.media.load(player.model.sources[player.model.source].file); 51 break; 52 case $.fn.jwplayer.states.PAUSED: 53 player.media.play(); 54 break; 55 } 56 57 return $.jwplayer(player.id); 58 } catch (err) { 59 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 60 } 61 return false; 62 }; 63 } 40 64 41 65 /** Switch the pause state of the player. **/ 42 $.fn.jwplayerController.pause = function(player) { 43 try { 44 player.media.pause(); 45 return true; 46 } catch (err) { 47 $.fn.jwplayerUtils.log("error", err); 48 } 49 return false; 50 }; 66 function pause(player) { 67 return function() { 68 try { 69 switch (player.model.state) { 70 case $.fn.jwplayer.states.PLAYING: 71 case $.fn.jwplayer.states.BUFFERING: 72 player.media.pause(); 73 break; 74 } 75 return $.jwplayer(player.id); 76 } catch (err) { 77 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 78 } 79 return false; 80 }; 81 } 51 82 52 83 53 84 /** Seek to a position in the video. **/ 54 $.fn.jwplayerController.seek = function(player, position) { 55 try { 56 player.media.seek(position); 57 return true; 58 } catch (err) { 59 $.fn.jwplayerUtils.log("error", err); 60 61 } 62 return false; 63 }; 85 function seek(player) { 86 return function(position) { 87 try { 88 switch (player.model.state) { 89 case $.fn.jwplayer.states.PLAYING: 90 case $.fn.jwplayer.states.PAUSED: 91 case $.fn.jwplayer.states.BUFFERING: 92 player.media.seek(position); 93 break; 94 } 95 return $.jwplayer(player.id); 96 } catch (err) { 97 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 98 } 99 return false; 100 }; 101 } 64 102 65 103 66 104 /** Stop playback and loading of the video. **/ 67 $.fn.jwplayerController.stop = function(player) { 68 try { 69 player.media.stop(); 70 return true; 71 } catch (err) { 72 $.fn.jwplayerUtils.log("error", err); 73 74 } 75 return false; 76 }; 105 function stop(player) { 106 return function() { 107 try { 108 player.media.stop(); 109 return $.jwplayer(player.id); 110 } catch (err) { 111 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 112 } 113 return false; 114 }; 115 } 77 116 78 117 79 118 /** Get / set the video's volume level. **/ 80 $.fn.jwplayerController.volume = function(player, position) { 81 try { 82 if (position === undefined) { 83 return player.model.volume; 84 } else { 85 player.media.volume(position); 86 player.model.volume = position; 87 return true; 88 } 89 } catch (err) { 90 $.fn.jwplayerUtils.log("error", err); 91 } 92 return false; 93 }; 119 function volume(player) { 120 return function(arg) { 121 try { 122 switch ($.fn.jwplayerUtils.typeOf(arg)) { 123 case "function": 124 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 125 break; 126 case "number": 127 player.media.volume(arg); 128 return true; 129 case "string": 130 player.media.volume(parseInt(arg, 10)); 131 return true; 132 default: 133 return player.model.volume; 134 } 135 return $.jwplayer(player.id); 136 } catch (err) { 137 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 138 } 139 return false; 140 }; 141 } 94 142 95 143 /** Get / set the mute state of the player. **/ 96 $.fn.jwplayerController.mute = function(player, state) { 97 try { 98 if (state === undefined) { 99 return player.model.mute; 100 } else { 101 player.media.mute(state); 102 return true; 103 } 104 return true; 105 } catch (err) { 106 $.fn.jwplayerUtils.log("error", err); 107 } 108 return false; 109 }; 144 function mute(player) { 145 return function(arg) { 146 try { 147 switch ($.fn.jwplayerUtils.typeOf(arg)) { 148 case "function": 149 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg); 150 break; 151 case "boolean": 152 player.media.mute(arg); 153 break; 154 default: 155 return player.model.mute; 156 } 157 return $.jwplayer(player.id); 158 } catch (err) { 159 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 160 } 161 return false; 162 }; 163 } 164 165 166 /** Resizes the video **/ 167 function resize(player) { 168 return function(arg1, arg2) { 169 try { 170 switch ($.fn.jwplayerUtils.typeOf(arg1)) { 171 case "function": 172 player.addEventListener($.fn.jwplayer.events.JWPLAYER_RESIZE, arg1); 173 break; 174 case "number": 175 player.media.resize(arg1, arg2); 176 break; 177 default: 178 break; 179 } 180 return $.jwplayer(player.id); 181 } catch (err) { 182 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 183 } 184 return false; 185 }; 186 } 110 187 111 188 112 189 /** Jumping the player to/from fullscreen. **/ 113 $.fn.jwplayerController.fullscreen = function(player, state) { 114 try { 115 if (state === undefined) { 116 return player.model.fullscreen; 117 } else { 118 player.media.fullscreen(state); 119 return true; 120 } 121 } catch (err) { 122 $.fn.jwplayerUtils.log("error", err); 123 } 124 return false; 125 }; 126 127 /** Resizes the video **/ 128 $.fn.jwplayerController.resize = function(player, width, height) { 129 try { 130 player.media.resize(width, height); 131 return true; 132 } catch (err) { 133 $.fn.jwplayerUtils.log("error", err); 134 } 135 return false; 136 }; 190 function fullscreen(player) { 191 return function(arg) { 192 try { 193 switch ($.fn.jwplayerUtils.typeOf(arg)) { 194 case "function": 195 player.addEventListener($.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg); 196 break; 197 case "boolean": 198 player.media.fullscreen(arg); 199 break; 200 default: 201 return player.model.fullscreen; 202 } 203 return $.jwplayer(player.id); 204 } catch (err) { 205 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 206 } 207 return false; 208 }; 209 } 210 211 /** Loads a new video **/ 212 function load(player) { 213 return function(arg) { 214 try { 215 switch ($.fn.jwplayerUtils.typeOf(arg)) { 216 case "function": 217 player.addEventListener($.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg); 218 break; 219 default: 220 player.media.load(arg); 221 break; 222 } 223 return $.jwplayer(player.id); 224 } catch (err) { 225 player.sendEvent($.fn.jwplayer.events.JWPLAYER_ERROR, err); 226 } 227 return false; 228 }; 229 } 230 137 231 138 232 /** Returns the meta **/ 139 $.fn.jwplayerController.mediaInfo = function(player) {233 function mediaInfo(player) { 140 234 try { 141 235 var result = {}; 142 for (var mediaParam in mediaParams ){236 for (var mediaParam in mediaParams()) { 143 237 result[mediaParam] = player.model[mediaParam]; 144 238 } … … 148 242 } 149 243 return false; 150 }; 151 152 /** Loads a new video **/ 153 $.fn.jwplayerController.load = function(player, path) { 154 try { 155 player.media.load(path); 156 return true; 157 } catch (err) { 158 $.fn.jwplayerUtils.log("error", err); 159 } 160 return false; 161 }; 244 } 245 246 247 /** Add an event listener. **/ 248 function addEventListener(player) { 249 return function(type, listener, count) { 250 try { 251 if (player.listeners[type] === undefined) { 252 player.listeners[type] = []; 253 } 254 player.listeners[type].push({ 255 listener: listener, 256 count: count 257 }); 258 } catch (err) { 259 $.fn.jwplayerUtils.log("error", err); 260 } 261 return false; 262 }; 263 } 264 265 266 /** Remove an event listener. **/ 267 function removeEventListener(player) { 268 return function(type, listener) { 269 try { 270 for (var lisenterIndex in player.listeners[type]) { 271 if (player.listeners[type][lisenterIndex] == listener) { 272 player.listeners[type].slice(lisenterIndex, lisenterIndex + 1); 273 break; 274 } 275 } 276 } catch (err) { 277 $.fn.jwplayerUtils.log("error", err); 278 } 279 return false; 280 }; 281 } 282 283 /** Send an event **/ 284 function sendEvent(player) { 285 return function(type, data) { 286 data = $.extend({ 287 id: player.id, 288 version: player.version 289 }, data); 290 if (player.config.debug == 'CONSOLE') { 291 $.fn.jwplayerUtils.log(type, data); 292 } 293 for (var listenerIndex in player.listeners[type]) { 294 try { 295 player.listeners[type][listenerIndex].listener(data); 296 } catch (err) { 297 $.fn.jwplayerUtils.log("There was an error while handling a listener", err); 298 } 299 if (player.listeners[type][listenerIndex].count === 1) { 300 delete player.listeners[type][listenerIndex]; 301 } else if (player.listeners[type][listenerIndex].count > 0) { 302 player.listeners[type][listenerIndex].count = player.listeners[type][listenerIndex].count - 1; 303 } 304 } 305 }; 306 } 162 307 163 308 })(jQuery); -
trunk/html5/src/jquery.jwplayerCore.js
r971 r975 8 8 */ 9 9 (function($) { 10 /** Map with all players on the page. **/ 11 var players = {}; 12 10 13 /** Hooking the controlbar up to jQuery. **/ 11 14 $.fn.jwplayer = function(options) { 12 15 return this.each(function() { 13 $.fn.jwplayerUtils.log("setup", this); 14 var model = $.fn.jwplayerModel($(this), options); 15 var player = { 16 model: model 17 }; 18 players[model.config.id] = player; 19 player = $.extend(player, api(player)); 20 $.fn.jwplayerView(player); 21 $.fn.jwplayerModel.setActiveMediaProvider(player); 22 $.fn.jwplayerSkinner(player, function() { 23 finishSetup(player); 24 }); 16 $.fn.jwplayerUtils.log("Starting setup", this); 17 setupJWPlayer($(this), 0, options); 25 18 }); 26 19 }; 27 20 28 function finishSetup(player) { 29 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 30 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 31 } 32 33 34 /** Map with all players on the page. **/ 35 var players = {}; 21 function setupJWPlayer(player, step, options) { 22 $.fn.jwplayerUtils.log("Starting step " + step, { 23 player: player, 24 options: options 25 }); 26 try { 27 switch (step) { 28 case 0: 29 var model = $.fn.jwplayerModel(player, options); 30 var player = { 31 model: model, 32 listeners: {} 33 }; 34 setupJWPlayer(player, step + 1); 35 break; 36 case 1: 37 player.controller = $.fn.jwplayerController(player); 38 players[player.model.config.id] = player; 39 setupJWPlayer($.extend(player, api(player)), step + 1); 40 break; 41 case 2: 42 $.fn.jwplayerView(player); 43 setupJWPlayer(player, step + 1); 44 break; 45 case 3: 46 $.fn.jwplayerModel.setActiveMediaProvider(player); 47 setupJWPlayer(player, step + 1); 48 break; 49 case 4: 50 $.fn.jwplayerSkinner(player, function() { 51 $.fn.jwplayerUtils.log("Skin loading complete", player); 52 setupJWPlayer(player, step + 1); 53 }); 54 break; 55 case 5: 56 $.fn.jwplayerDisplay($.jwplayer(player.id), player.model.domelement); 57 setupJWPlayer(player, step + 1); 58 break; 59 case 6: 60 $.fn.jwplayerControlbar($.jwplayer(player.id), player.model.domelement); 61 setupJWPlayer(player, step + 1); 62 break; 63 case 7: 64 player.sendEvent($.fn.jwplayer.events.JWPLAYER_READY); 65 setupJWPlayer(player, step + 1) 66 break; 67 default: 68 if (player.config.autostart === true) { 69 player.play(); 70 } 71 if (player.config.repeat) { 72 if ((player.config.repeat.toLowerCase() == 'list') || (player.config.repeat.toLowerCase() == 'always') || (player.config.repeat.toLowerCase() == 'single')) { 73 player.complete(function() { 74 player.play(); 75 }); 76 } 77 } 78 break; 79 } 80 } catch (err) { 81 $.fn.jwplayerUtils.log("Setup failed at step " + step, err); 82 } 83 } 36 84 37 85 … … 46 94 width: 480, 47 95 mute: false, 48 flashplayer:'http://developer.longtailvideo.com/player/trunk/html5/assets/player.swf' 49 }; 50 51 52 /** Start playback or resume. **/ 53 function play(player) { 54 return function() { 55 $.fn.jwplayerController.play(player); 56 return jwplayer(player.id); 57 }; 58 } 59 60 /** Switch the pause state of the player. **/ 61 function pause(player) { 62 return function() { 63 $.fn.jwplayerController.pause(player); 64 return jwplayer(player.id); 65 }; 66 } 67 68 69 /** Seek to a position in the video. **/ 70 function seek(player) { 71 return function(arg) { 72 $.fn.jwplayerController.seek(player, arg); 73 return jwplayer(player.id); 74 }; 75 } 76 77 78 /** Stop playback and loading of the video. **/ 79 function stop(player) { 80 return function() { 81 $.fn.jwplayerController.stop(player); 82 return jwplayer(player.id); 83 }; 84 } 85 86 87 /** Change the video's volume level. **/ 88 function volume(player) { 96 bufferlength: 5, 97 start: 0, 98 position: 0, 99 flashplayer: 'http://developer.longtailvideo.com/player/trunk/html5/assets/player.swf' 100 }; 101 102 103 /** A factory for API calls that either set listeners or return data **/ 104 function dataListenerFactory(player, dataType, eventType) { 89 105 return function(arg) { 90 106 switch ($.fn.jwplayerUtils.typeOf(arg)) { 91 107 case "function": 92 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_VOLUME, arg); 93 break; 94 case "number": 95 $.fn.jwplayerController.volume(player, arg); 96 break; 97 case "string": 98 $.fn.jwplayerController.volume(player, parseInt(arg, 10)); 108 if (!$.fn.jwplayerUtils.isNull(eventType)) { 109 player.addEventListener(eventType, arg); 110 } 99 111 break; 100 112 default: 101 return $.fn.jwplayerController.volume(player); 113 if (!$.fn.jwplayerUtils.isNull(dataType)) { 114 return player.controller.mediaInfo[dataType]; 115 } 116 return player.controller.mediaInfo; 102 117 } 103 return jwplayer(player.id);118 return $.jwplayer(player.id); 104 119 }; 105 120 } 106 121 107 /** Switch the mute state of the player. **/108 function mute(player) {109 return function(arg) {110 switch ($.fn.jwplayerUtils.typeOf(arg)) {111 case "function":112 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_MUTE, arg);113 break;114 case "boolean":115 $.fn.jwplayerController.mute(player, arg);116 break;117 default:118 return $.fn.jwplayerController.mute(player);119 }120 return jwplayer(player.id);121 };122 }123 124 /** Resizing the player **/125 function resize(player) {126 return function(arg1, arg2) {127 switch ($.fn.jwplayerUtils.typeOf(arg)) {128 case "function":129 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_RESIZE, arg);130 break;131 case "number":132 $.fn.jwplayerController.resize(player, arg1, arg2);133 break;134 default:135 break;136 }137 return jwplayer(player.id);138 };139 }140 141 /** Fullscreen the player **/142 function fullscreen(player) {143 return function(arg) {144 switch ($.fn.jwplayerUtils.typeOf(arg)) {145 case "function":146 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_FULLSCREEN, arg);147 break;148 case "boolean":149 $.fn.jwplayerController.fullscreen(player, arg);150 break;151 default:152 return $.fn.jwplayerController.fullscreen(player);153 }154 return jwplayer(player.id);155 };156 }157 158 /** Adds a state listener **/159 function state(player) {160 return function(arg) {161 switch ($.fn.jwplayerUtils.typeOf(arg)) {162 case "function":163 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, arg);164 break;165 default:166 return $.fn.jwplayerController.mediaInfo(player).state;167 }168 return jwplayer(player.id);169 };170 }171 172 /** Adds a buffer listener **/173 function buffer(player) {174 return function(arg) {175 switch ($.fn.jwplayerUtils.typeOf(arg)) {176 case "function":177 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, arg);178 break;179 default:180 return $.fn.jwplayerController.mediaInfo(player).buffer;181 }182 return jwplayer(player.id);183 };184 }185 186 /** Returns the current time **/187 function time(player) {188 return function(arg) {189 switch ($.fn.jwplayerUtils.typeOf(arg)) {190 case "function":191 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, arg);192 break;193 default:194 return $.fn.jwplayerController.mediaInfo(player).time;195 }196 return jwplayer(player.id);197 };198 }199 200 /** Loads a new video into the player **/201 function load(player) {202 return function(arg) {203 switch ($.fn.jwplayerUtils.typeOf(arg)) {204 case "function":205 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_LOADED, arg);206 break;207 default:208 $.fn.jwplayerController.load(player, arg);209 }210 return jwplayer(player.id);211 };212 }213 214 /** Adds a listener for video completion **/215 function complete(player) {216 return function(arg) {217 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE, arg);218 return jwplayer(player.id);219 };220 }221 222 /** Adds a listener for player ready **/223 function ready(player) {224 return function(arg) {225 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_READY, arg);226 return jwplayer(player.id);227 };228 }229 230 /** Returns the duration **/231 function duration(player) {232 return function() {233 return $.fn.jwplayerController.mediaInfo(player).duration;234 };235 }236 237 /** Adds a listener for media errors. **/238 function error(player) {239 return function(arg) {240 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_ERROR, arg);241 return jwplayer(player.id);242 };243 }244 245 246 /** Returns the width **/247 function width(player) {248 return function() {249 return $.fn.jwplayerController.mediaInfo(player).width;250 };251 }252 253 254 /** Returns the height **/255 function height(player) {256 return function() {257 return $.fn.jwplayerController.mediaInfo(player).height;258 };259 }260 261 /** Returns the available meta-data **/262 function meta(player) {263 return function() {264 switch ($.fn.jwplayerUtils.typeOf(arg)) {265 case "function":266 addEventListener(player, $.fn.jwplayer.events.JWPLAYER_MEDIA_META, arg);267 break;268 default:269 return $.fn.jwplayerController.mediaInfo(player);270 }271 return jwplayer(player.id);272 };273 }274 275 /** Returns the API method for adding an event listener.**/276 function apiAddEventListener(player) {277 return function(type, listener) {278 addEventListener(player, type, listener);279 };280 }281 282 /** Returns the API method for adding an event listener.**/283 function apiRemoveEventListener(player) {284 return function(type, listener) {285 removeEventListener(player, type, listener);286 };287 }288 289 /** Add an event listener. **/290 function addEventListener(player, type, listener) {291 if (player.model.listeners[type] === undefined) {292 player.model.listeners[type] = [];293 }294 player.model.listeners[type].push(listener);295 }296 297 298 /** Remove an event listener. **/299 function removeEventListener(player, type, listener) {300 for (var lisenterIndex in player.model.listeners[type]) {301 if (player.model.listeners[type][lisenterIndex] == listener) {302 player.model.listeners[type].slice(lisenterIndex, lisenterIndex + 1);303 break;304 }305 }306 }307 308 /** Send an event **/309 function sendEvent(player) {310 return function(type, data) {311 data = $.extend({312 id: player.id,313 version: player.version314 }, data);315 //$.fn.jwplayerUtils.log(type, data);316 for (var listener in player.model.listeners[type]) {317 player.model.listeners[type][listener](data);318 }319 };320 }321 322 122 323 123 function api(player) { 324 if (!$.fn.jwplayerUtils.isNull(player.id)) {124 if (!$.fn.jwplayerUtils.isNull(player.id)) { 325 125 return player; 326 126 } 327 127 return { 128 play: player.controller.play, 129 pause: player.controller.pause, 130 stop: player.controller.stop, 131 seek: player.controller.seek, 132 133 resize: player.controller.resize, 134 fullscreen: player.controller.fullscreen, 135 volume: player.controller.volume, 136 mute: player.controller.mute, 137 load: player.controller.load, 138 139 addEventListener: player.controller.addEventListener, 140 removeEventListener: player.controller.removeEventListener, 141 sendEvent: player.controller.sendEvent, 142 143 ready: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_READY), 144 error: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_ERROR), 145 complete: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_COMPLETE), 146 state: dataListenerFactory(player, 'state', $.fn.jwplayer.events.JWPLAYER_PLAYER_STATE), 147 buffer: dataListenerFactory(player, 'buffer', $.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER), 148 time: dataListenerFactory(player, 'position', $.fn.jwplayer.events.JWPLAYER_MEDIA_TIME), 149 duration: dataListenerFactory(player, 'duration'), 150 width: dataListenerFactory(player, 'width'), 151 height: dataListenerFactory(player, 'height'), 152 meta: dataListenerFactory(player, null, $.fn.jwplayer.events.JWPLAYER_MEDIA_META), 153 328 154 id: player.model.config.id, 329 buffer: buffer(player),330 duration: duration(player),331 complete: complete(player),332 fullscreen: fullscreen(player),333 height: buffer(player),334 load: load(player),335 meta: meta(player),336 mute: mute(player),337 pause: pause(player),338 play: play(player),339 resize: resize(player),340 ready: ready(player),341 seek: seek(player),342 state: state(player),343 stop: stop(player),344 time: time(player),345 volume: volume(player),346 width: width(player),347 skin: player.skin,348 155 config: player.model.config, 349 addEventListener: apiAddEventListener(player), 350 removeEventListener: apiRemoveEventListener(player), 351 sendEvent: sendEvent(player), 352 version: '0.1-alpha' 156 version: '0.1-alpha', 157 skin: player.skin 353 158 }; 354 159 } … … 380 185 JWPLAYER_ERROR: 'jwplayerError', 381 186 JWPLAYER_MEDIA_BUFFER: 'jwplayerMediaBuffer', 382 //JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull',187 JWPLAYER_MEDIA_BUFFER_FULL: 'jwplayerMediaBufferFull', 383 188 JWPLAYER_MEDIA_ERROR: 'jwplayerMediaError', 384 189 JWPLAYER_MEDIA_LOADED: 'jwplayerMediaLoaded', -
trunk/html5/src/jquery.jwplayerMediaFlash.js
r971 r975 67 67 68 68 function stateHandler(event, player) { 69 $.fn.jwplayerUtils.log(event); 69 70 player.model.state = event.newstate; 70 71 player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { … … 209 210 function load(player) { 210 211 return function(path) { 212 path = $.fn.jwplayerUtils.getAbsolutePath(path); 211 213 player.model.domelement[0].sendEvent("LOAD", path); 214 player.model.domelement[0].sendEvent("PLAY"); 212 215 }; 213 216 } -
trunk/html5/src/jquery.jwplayerMediaVideo.js
r971 r975 57 57 resize: resize(player), 58 58 state: $.fn.jwplayer.states.IDLE, 59 interval: null 59 interval: null, 60 loadcount: 0 60 61 }; 61 62 player.media = media; … … 82 83 if (player.model.state != newstate) { 83 84 var oldstate = player.model.state; 85 player.media.state = newstate; 84 86 player.model.state = newstate; 87 $.fn.jwplayerUtils.log($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 88 oldstate: oldstate, 89 newstate: newstate 90 }); 85 91 player.sendEvent($.fn.jwplayer.events.JWPLAYER_PLAYER_STATE, { 86 92 oldstate: oldstate, … … 101 107 duration: event.target.duration 102 108 }; 103 if (player.model.duration === 0) {109 if (player.model.duration === 0) { 104 110 player.model.duration = event.target.duration; 105 111 } … … 109 115 110 116 function positionHandler(event, player) { 117 if (!$.fn.jwplayerUtils.isNull(event.target)) { 118 if (player.model.duration === 0) { 119 player.model.duration = event.target.duration; 120 } 121 122 if (!$.fn.jwplayerUtils.isNull(event.target.currentTime)) { 123 player.model.position = event.target.currentTime; 124 } 125 if (player.media.state == $.fn.jwplayer.states.PLAYING) { 126 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 127 position: event.target.currentTime, 128 duration: event.target.duration 129 }); 130 } 131 } 132 133 } 134 135 function progressHandler(event, player) { 136 var bufferPercent, bufferTime, bufferFill; 137 if (!isNaN(event.loaded / event.total)) { 138 bufferPercent = event.loaded / event.total * 100; 139 bufferTime = bufferPercent / 100 * player.model.duration; 140 } else if (player.model.domelement[0].buffered !== undefined) { 141 maxBufferIndex = 0; 142 if (maxBufferIndex >= 0) { 143 bufferPercent = player.model.domelement[0].buffered.end(maxBufferIndex) / player.model.domelement[0].duration * 100; 144 bufferTime = player.model.domelement[0].buffered.end(maxBufferIndex) - player.model.position; 145 } 146 } 147 148 bufferFill = bufferTime / player.model.config.bufferlength * 100; 149 150 if (bufferFill < 25 && player.media.state == $.fn.jwplayer.states.PLAYING) { 151 player.media.bufferFull = false; 152 player.model.domelement[0].pause(); 153 setState(PlayerState.BUFFERING); 154 } else if (bufferFill > 95 && player.media.state == $.fn.jwplayer.states.BUFFERING && player.media.bufferFull === false && bufferTime > 0) { 155 player.media.bufferFull = true; 156 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER_FULL, {}); 157 } 158 159 if (!player.media.bufferingComplete) { 160 if (bufferPercent == 100 && player.media.bufferingComplete === false) { 161 player.media.bufferingComplete = true; 162 } 163 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 164 'bufferPercent': bufferPercent 165 }); 166 } 167 } 168 169 function startInterval(player) { 111 170 if (player.media.interval === null) { 112 171 player.media.interval = window.setInterval(function() { 113 positionHandler( event, player);172 positionHandler({}, player); 114 173 }, 100); 115 174 } 116 if (player.model.duration === 0){ 117 player.model.duration = event.target.duration; 118 } 119 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_TIME, { 120 position: event.target.currentTime, 121 duration: event.target.duration 122 }); 123 } 124 125 function progressHandler(event, player) { 126 var buffer; 127 if (!isNaN(event.loaded / event.total)) { 128 buffer = event.loaded / event.total * 100; 129 } else if (player.model.domelement[0].buffered !== undefined) { 130 buffer = player.model.domelement[0].buffered.end(0) / player.model.domelement[0].duration * 100; 131 } 132 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_BUFFER, { 133 'bufferPercent': buffer 134 }); 135 } 175 } 176 136 177 137 178 function errorHandler(event, player) { … … 141 182 function play(player) { 142 183 return function() { 143 player.model.domelement[0].play(); 184 if (player.media.state != $.fn.jwplayer.states.PLAYING) { 185 setState(player, $.fn.jwplayer.states.PLAYING); 186 player.model.domelement[0].play(); 187 } 144 188 }; 145 189 } … … 167 211 player.model.domelement[0].currentTime = 0; 168 212 clearInterval(player.media.interval); 169 player.media.interval = null;213 player.media.interval = undefined; 170 214 setState(player, $.fn.jwplayer.states.IDLE); 171 215 }; … … 214 258 player.model.fullscreen = state; 215 259 if (state === true) { 216 player.css("width", window.width);217 player.css("height", window.height);260 //player.css("width", window.width); 261 //player.css("height", window.height); 218 262 player.sendEvent($.fn.jwplayer.events.JWPLAYER_MEDIA_RESIZE, { 219 width: width,220 hieght: height263 width: player.model.width, 264 hieght: player.model.height 221 265 }); 222 266 } else { … … 229 273 function load(player) { 230 274 return function(path) { 275 path = $.fn.jwplayerUtils.getAbsolutePath(path); 276 $.fn.jwplayerUtils.log("replay:" + player.model.domelement[0].src + ":" + path + ":" + (path == player.model.domelement[0].src)); 277 if (path == player.model.domelement[0].src && player.media.loadcount > 0) { 278 setState(player, $.fn.jwplayer.states.BUFFERING); 279 setState(player, $.fn.jwplayer.states.PLAYING); 280 player.model.domelement[0].currentTime = player.config.start; 281 //player.model.domelement[0].paused = false; 282 return; 283 } else if (path != player.model.domelement[0].src) { 284 player.media.loadcount = 0; 285 } 286 player.media.loadcount++; 287 player.media.bufferFull = false; 288 player.media.bufferingComplete = false; 289 setState(player, $.fn.jwplayer.states.BUFFERING); 231 290 player.model.domelement[0].src = path; 232 }; 233 } 291 startInterval(player); 292 player.model.domelement[0].currentTime = player.config.start; 293 }; 294 } 295 234 296 })(jQuery); -
trunk/html5/src/jquery.jwplayerModel.js
r971 r975 13 13 fullscreen: false, 14 14 mute: false, 15 start: 0, 15 16 width: 480, 16 17 height: 320, … … 21 22 return { 22 23 sources: {}, 23 listeners: {},24 24 state: $.fn.jwplayer.states.IDLE, 25 25 source: 0, … … 31 31 $.fn.jwplayerModel = function(domElement, options) { 32 32 var model = createModel(); 33 model.config = $. fn.jwplayerParse(domElement[0], options);33 model.config = $.extend(true, {}, $.fn.jwplayer.defaults, $.fn.jwplayerParse(domElement[0]), options); 34 34 if ($.fn.jwplayerUtils.isNull(model.config.id)) { 35 35 model.config.id = "jwplayer_" + jwplayerid++; … … 45 45 } 46 46 } 47 //model = $.extend(true, {}, , model); 47 48 return model; 48 49 }; -
trunk/html5/src/jquery.jwplayerParse.js
r971 r975 35 35 var parsers = {}; 36 36 37 $.fn.jwplayerParse = function(player , options) {38 return $.extend(true, {}, $.fn.jwplayer.defaults, options, parseElement(player));37 $.fn.jwplayerParse = function(player) { 38 return parseElement(player); 39 39 }; 40 40 … … 80 80 }; 81 81 } 82 if (!$.fn.jwplayerUtils.isiPhone()) { 83 domElement.src = undefined; 84 } 82 85 configuration.sources = sources; 83 86 return configuration; … … 92 95 attributes = getAttributeList('video', attributes); 93 96 var result = parseMediaElement(domElement, attributes); 94 if (!$.fn.jwplayerUtils.isNull($(domElement).attr('poster')) ){97 if (!$.fn.jwplayerUtils.isNull($(domElement).attr('poster')) && !$.fn.jwplayerUtils.isiPhone()){ 95 98 $(domElement).removeAttr('poster'); 96 99 } -
trunk/html5/src/jquery.jwplayerUtils.js
r963 r975 13 13 return this.each(function() { 14 14 }); 15 }; 16 17 //http://old.nabble.com/jQuery-may-add-$.browser.isiPhone-td11163329s27240.html 18 $.fn.jwplayerUtils.isiPhone = function() { 19 var agent = navigator.userAgent.toLowerCase(); 20 return agent.match(/iPhone/i); 15 21 }; 16 22 … … 176 182 177 183 function isAbsolutePath(path) { 184 if(path === undefined){ 185 return; 186 } 178 187 var protocol = path.indexOf("://"); 179 188 var queryparams = path.indexOf("?"); -
trunk/html5/src/jquery.jwplayerView.js
r971 r975 27 27 'margin': 'auto' 28 28 }); 29 player.model.domelement. jwplayerCSS({29 player.model.domelement.css({ 30 30 'position': 'absolute', 31 31 'width': player.model.config.width, 32 32 'height': player.model.config.height, 33 'left': 0,34 33 'top': 0, 35 'z-index': 0 36 }); 37 player.model.domelement.before("<a href='" + $.fn.jwplayerUtils.getAbsolutePath(player.model.sources[player.model.source].file) + "'><img src='http://content.bitsontherun.com/staticfiles/play.png' alt='Click to play video' style='position:absolute; top:" + (player.model.height - 60) / 2 + "px; left:" + (player.model.width - 60) / 2 + "px; border:0;' /></a>"); 38 player.model.domelement.prev("a").jwplayerCSS({ 39 'display': 'block', 40 'background': '#ffffff url(' + $.fn.jwplayerUtils.getAbsolutePath(player.model.config.image) + ') no-repeat center center', 41 'width': player.model.width, 42 'height': player.model.height, 43 'position': 'relative', 44 'left': 0, 45 'top': 0, 46 'z-index': 50 47 }); 48 player.model.domelement.prev("a").click(function(evt) { 49 if (typeof evt.preventDefault != 'undefined') { 50 evt.preventDefault(); // W3C 51 } else { 52 evt.returnValue = false; // IE 53 } 54 if (player.state() !== $.fn.jwplayer.states.PLAYING) { 55 player.play(); 56 } else { 57 player.pause(); 58 } 59 60 }); 61 player.state(function(obj) { 62 imageHandler(obj, player); 34 'z-index': 0, 35 margin: 'auto' 63 36 }); 64 37 }; 65 66 function imageHandler(obj, player) {67 switch (obj.newstate) {68 case $.fn.jwplayer.states.IDLE:69 player.model.domelement.css("z-index", "0");70 player.model.domelement.prev("a").css("z-index", "50");71 break;72 case $.fn.jwplayer.states.PLAYING:73 player.model.domelement.prev("a").css("z-index", "0");74 player.model.domelement.css("z-index", "50");75 break;76 }77 }78 38 79 39 $.fn.jwplayerView.switchMediaProvider = function() {
Note: See TracChangeset
for help on using the changeset viewer.
