webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -1,99 +1,99 @@
1
- jQuery.webshims.register('mediaelement-native-fix', function($, webshims, window, document, undefined){
2
- if(Modernizr.videoBuffered){return;}
3
-
4
- var getBufferedData = function(elem){
5
- var data = webshims.data(elem, 'mediaelementBuffered');
6
- if(!data){
7
- data = {
8
- buffered: {
9
- start: function(index){
10
- if(index >= data.buffered.length){
11
- webshims.error('buffered index size error');
12
- return;
13
- }
14
- return 0;
15
- },
16
- end: function(index){
17
- if(index >= data.buffered.length){
18
- webshims.error('buffered index size error');
19
- return;
20
- }
21
- return data.loaded;
22
- },
23
- length: 0
24
- },
25
- loaded: 0
26
- };
27
- webshims.data(elem, 'mediaelementBuffered', data);
28
- }
29
- return data;
30
- };
31
-
32
- var loadProgessListener = function(e){
33
- e = e.originalEvent;
34
- if(!e || !('lengthComputable' in e)){return;}
35
- var data = webshims.data(e.target, 'mediaelement');
36
- if(data && data.isActive != 'html5'){return;}
37
- if(e.lengthComputable && 'loaded' in e){
38
- var duration = e.target.duration;
39
- var bufferedData = getBufferedData(e.target);
40
- bufferedData.loaded = (duration) ? e.loaded / e.total * duration : 0;
41
- if(bufferedData.loaded){
42
- bufferedData.buffered.length = 1;
43
- }
44
- if(e.type == 'load'){
45
- $(e.target).triggerHandler('progress');
46
- }
47
- }
48
- };
49
- var removeProgress = function(e){
50
- var data = getBufferedData(e.target);
51
- data.buffered.length = 0;
52
- data.loaded = 0;
53
- };
54
-
55
- ['audio', 'video'].forEach(function(nodeName){
56
- var sup = webshims.defineNodeNameProperty(nodeName, 'buffered', {
57
- prop: {
58
- get: function(){
59
- var data = webshims.data(this, 'mediaelement');
60
-
61
- if(data && data.isActive == 'flash' && sup.prop._supget){
62
- sup.prop._supget.apply(this);
63
- } else {
64
- return getBufferedData(this).buffered;
65
- }
66
- }
67
- }
68
- });
69
- });
70
-
71
- (function(){
72
- var videoElem = document.createElement('video');
73
- if( !('preload' in videoElem) && ('autobuffer' in videoElem)){
74
- var noBufferProps = {
75
- metadata: 1,
76
- none: 1
77
- };
78
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['preload'], {
79
- set: function(value, boolValue, curType){
80
- if(noBufferProps[value] || curType == 'removeAttr'){
81
- this.autobuffer = false;
82
- } else if( !(webshims.data(this, 'mediaelement') || {}).isActive == 'html5') {
83
- this.autobuffer = true;
84
- }
85
- },
86
- initAttr: true
87
- });
88
- }
89
- })();
90
-
91
- webshims.addReady(function(context, insertedElement){
92
- $('video, audio', context)
93
- .add(insertedElement.filter('video, audio'))
94
- .bind('load progress', loadProgessListener)
95
- .bind('emptied', removeProgress)
96
- ;
97
- });
98
-
1
+ jQuery.webshims.register('mediaelement-native-fix', function($, webshims, window, document, undefined){
2
+ if(Modernizr.videoBuffered){return;}
3
+
4
+ var getBufferedData = function(elem){
5
+ var data = webshims.data(elem, 'mediaelementBuffered');
6
+ if(!data){
7
+ data = {
8
+ buffered: {
9
+ start: function(index){
10
+ if(index >= data.buffered.length){
11
+ webshims.error('buffered index size error');
12
+ return;
13
+ }
14
+ return 0;
15
+ },
16
+ end: function(index){
17
+ if(index >= data.buffered.length){
18
+ webshims.error('buffered index size error');
19
+ return;
20
+ }
21
+ return data.loaded;
22
+ },
23
+ length: 0
24
+ },
25
+ loaded: 0
26
+ };
27
+ webshims.data(elem, 'mediaelementBuffered', data);
28
+ }
29
+ return data;
30
+ };
31
+
32
+ var loadProgessListener = function(e){
33
+ e = e.originalEvent;
34
+ if(!e || !('lengthComputable' in e)){return;}
35
+ var data = webshims.data(e.target, 'mediaelement');
36
+ if(data && data.isActive != 'html5'){return;}
37
+ if(e.lengthComputable && 'loaded' in e){
38
+ var duration = e.target.duration;
39
+ var bufferedData = getBufferedData(e.target);
40
+ bufferedData.loaded = (duration) ? e.loaded / e.total * duration : 0;
41
+ if(bufferedData.loaded){
42
+ bufferedData.buffered.length = 1;
43
+ }
44
+ if(e.type == 'load'){
45
+ $(e.target).triggerHandler('progress');
46
+ }
47
+ }
48
+ };
49
+ var removeProgress = function(e){
50
+ var data = getBufferedData(e.target);
51
+ data.buffered.length = 0;
52
+ data.loaded = 0;
53
+ };
54
+
55
+ ['audio', 'video'].forEach(function(nodeName){
56
+ var sup = webshims.defineNodeNameProperty(nodeName, 'buffered', {
57
+ prop: {
58
+ get: function(){
59
+ var data = webshims.data(this, 'mediaelement');
60
+
61
+ if(data && data.isActive == 'flash' && sup.prop._supget){
62
+ sup.prop._supget.apply(this);
63
+ } else {
64
+ return getBufferedData(this).buffered;
65
+ }
66
+ }
67
+ }
68
+ });
69
+ });
70
+
71
+ (function(){
72
+ var videoElem = document.createElement('video');
73
+ if( !('preload' in videoElem) && ('autobuffer' in videoElem)){
74
+ var noBufferProps = {
75
+ metadata: 1,
76
+ none: 1
77
+ };
78
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['preload'], {
79
+ set: function(value, boolValue, curType){
80
+ if(noBufferProps[value] || curType == 'removeAttr'){
81
+ this.autobuffer = false;
82
+ } else if( !(webshims.data(this, 'mediaelement') || {}).isActive == 'html5') {
83
+ this.autobuffer = true;
84
+ }
85
+ },
86
+ initAttr: true
87
+ });
88
+ }
89
+ })();
90
+
91
+ webshims.addReady(function(context, insertedElement){
92
+ $('video, audio', context)
93
+ .add(insertedElement.filter('video, audio'))
94
+ .on('load progress', loadProgessListener)
95
+ .on('emptied', removeProgress)
96
+ ;
97
+ });
98
+
99
99
  });
@@ -1,1074 +1,958 @@
1
- /*
2
- * todos:
3
- * - decouple muted/volume (needs improvement)
4
- * - implement video <-> flashcanvas pro API
5
- * - improve buffered-property with youtube/rtmp
6
- * - use jwplayer5 api instead of old flash4 api
7
- */
8
-
9
- jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
10
- "use strict";
11
- var SENDEVENT = 'sendEvent';
12
- var mediaelement = webshims.mediaelement;
13
- var swfobject = window.swfobject;
14
- var hasNative = Modernizr.audio && Modernizr.video;
15
- var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
16
- var loadedSwf = 0;
17
- var getProps = {
18
- paused: true,
19
- ended: false,
20
- currentSrc: '',
21
- duration: window.NaN,
22
-
23
- readyState: 0,
24
- networkState: 0,
25
- videoHeight: 0,
26
- videoWidth: 0,
27
- error: null,
28
- buffered: {
29
- start: function(index){
30
- if(index){
31
- webshims.error('buffered index size error');
32
- return;
33
- }
34
- return 0;
35
- },
36
- end: function(index){
37
- if(index){
38
- webshims.error('buffered index size error');
39
- return;
40
- }
41
- return 0;
42
- },
43
- length: 0
44
- }
45
- };
46
- var getPropKeys = Object.keys(getProps);
47
-
48
- var getSetProps = {
49
- currentTime: 0,
50
- volume: 1,
51
- muted: false
52
- };
53
- var getSetPropKeys = Object.keys(getSetProps);
54
-
55
- var playerStateObj = $.extend({
56
- isActive: 'html5',
57
- activating: 'html5',
58
- wasSwfReady: false,
59
- _bufferedEnd: 0,
60
- _bufferedStart: 0,
61
- _metadata: false,
62
- _durationCalcs: -1,
63
- _callMeta: false,
64
- currentTime: 0,
65
- _ppFlag: undefined
66
- }, getProps, getSetProps);
67
-
68
- var idRep = /^jwplayer-/;
69
- var getSwfDataFromID = function(id){
70
-
71
- var elem = document.getElementById(id.replace(idRep, ''));
72
- if(!elem){return;}
73
- var data = webshims.data(elem, 'mediaelement');
74
- return data.isActive == 'third' ? data : null;
75
- };
76
-
77
-
78
- var getSwfDataFromElem = function(elem){
79
- try {
80
- (elem.nodeName);
81
- } catch(er){
82
- return null;
83
- }
84
- var data = webshims.data(elem, 'mediaelement');
85
- return (data && data.isActive== 'third') ? data : null;
86
- };
87
-
88
- var trigger = function(elem, evt){
89
- evt = $.Event(evt);
90
- evt.preventDefault();
91
- $.event.trigger(evt, undefined, elem);
92
- };
93
-
94
- var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
95
- var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
96
-
97
- webshims.extendUNDEFProp(options.jwParams, {
98
- allowscriptaccess: 'always',
99
- allowfullscreen: 'true',
100
- wmode: 'transparent'
101
- });
102
- webshims.extendUNDEFProp(options.jwVars, {
103
- screencolor: 'ffffffff'
104
- });
105
- webshims.extendUNDEFProp(options.jwAttrs, {
106
- bgcolor: '#000000'
107
- });
108
-
109
- var getDuration = function(data, obj){
110
- var curDuration = data.duration;
111
- if(curDuration && data._durationCalcs > 0){return;}
112
- try {
113
- data.duration = data.jwapi.getPlaylist()[0].duration;
114
- if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
115
- data.duration = curDuration;
116
- }
117
- } catch(er){}
118
- if(data.duration && data.duration != data._lastDuration){
119
- trigger(data._elem, 'durationchange');
120
- if(data._elemNodeName == 'audio' || data._callMeta){
121
- mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
122
- }
123
- data._durationCalcs--;
124
- } else {
125
- data._durationCalcs++;
126
- }
127
- };
128
- var setReadyState = function(readyState, data){
129
- if(readyState < 3){
130
- clearTimeout(data._canplaythroughTimer);
131
- }
132
- if(readyState >= 3 && data.readyState < 3){
133
- data.readyState = readyState;
134
- trigger(data._elem, 'canplay');
135
- clearTimeout(data._canplaythroughTimer);
136
- data._canplaythroughTimer = setTimeout(function(){
137
- setReadyState(4, data);
138
- }, 4000);
139
- }
140
- if(readyState >= 4 && data.readyState < 4){
141
- data.readyState = readyState;
142
- trigger(data._elem, 'canplaythrough');
143
- }
144
- data.readyState = readyState;
145
- };
146
-
147
- $.extend($.event.customEvent, {
148
- updatemediaelementdimensions: true,
149
- flashblocker: true,
150
- swfstageresize: true,
151
- mediaelementapichange: true
152
- });
153
-
154
- mediaelement.jwEvents = {
155
- View: {
156
-
157
- PLAY: function(obj){
158
- var data = getSwfDataFromID(obj.id);
159
- if(!data || data.stopPlayPause){return;}
160
- data._ppFlag = true;
161
- if(data.paused == obj.state){
162
- data.paused = !obj.state;
163
- if(data.ended){
164
- data.ended = false;
165
- }
166
- trigger(data._elem, obj.state ? 'play' : 'pause');
167
- }
168
- }
169
- },
170
- Model: {
171
-
172
- BUFFER: function(obj){
173
- var data = getSwfDataFromID(obj.id);
174
- if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
175
- data.networkState = (obj.percentage == 100) ? 1 : 2;
176
- if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
177
- getDuration(data, obj);
178
- }
179
-
180
- if(data.ended){
181
- data.ended = false;
182
- }
183
- if(!data.duration){
184
- return;
185
- }
186
- if(obj.percentage > 2 && obj.percentage < 20){
187
- setReadyState(3, data);
188
- } else if(obj.percentage > 20){
189
- setReadyState(4, data);
190
- }
191
- if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
192
- data._bufferedStart = data.currentTime || 0;
193
- }
194
-
195
- data._bufferedEnd = obj.percentage;
196
- data.buffered.length = 1;
197
- if(obj.percentage == 100){
198
- data.networkState = 1;
199
- setReadyState(4, data);
200
- }
201
- $.event.trigger('progress', undefined, data._elem, true);
202
- },
203
- META: function(obj, data){
204
-
205
- data = data && data.networkState ? data : getSwfDataFromID(obj.id);
206
-
207
- if(!data){return;}
208
- if( !('duration' in obj) ){
209
- data._callMeta = true;
210
- return;
211
- }
212
-
213
- if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
214
-
215
- data._metadata = true;
216
-
217
- var oldDur = data.duration;
218
- if(obj.duration){
219
- data.duration = obj.duration;
220
- }
221
- data._lastDuration = data.duration;
222
- if(obj.height || obj.width){
223
- data.videoHeight = obj.height || 0;
224
- data.videoWidth = obj.width || 0;
225
- }
226
- if(!data.networkState){
227
- data.networkState = 2;
228
- }
229
- if(data.readyState < 1){
230
- setReadyState(1, data);
231
- }
232
- if(data.duration && oldDur !== data.duration){
233
- trigger(data._elem, 'durationchange');
234
- }
235
-
236
- trigger(data._elem, 'loadedmetadata');
237
- },
238
- TIME: function(obj){
239
- var data = getSwfDataFromID(obj.id);
240
- if(!data || data.currentTime === obj.position){return;}
241
- data.currentTime = obj.position;
242
- if(data.duration && data.duration < data.currentTime){
243
- getDuration(data, obj);
244
- }
245
- if(data.readyState < 2){
246
- setReadyState(2, data);
247
- }
248
- if(data.ended){
249
- data.ended = false;
250
- }
251
- trigger(data._elem, 'timeupdate');
252
-
253
- },
254
- STATE: function(obj){
255
- var data = getSwfDataFromID(obj.id);
256
- if(!data){return;}
257
- switch(obj.newstate) {
258
- case 'BUFFERING':
259
-
260
- if(data.ended){
261
- data.ended = false;
262
- }
263
- setReadyState(1, data);
264
- trigger(data._elem, 'waiting');
265
- break;
266
- case 'PLAYING':
267
- data.paused = false;
268
- data._ppFlag = true;
269
- if(!data.duration){
270
- getDuration(data, obj);
271
- }
272
- if(data.readyState < 3){
273
- setReadyState(3, data);
274
- }
275
- if(data.ended){
276
- data.ended = false;
277
- }
278
- trigger(data._elem, 'playing');
279
- break;
280
- case 'PAUSED':
281
- if(!data.paused && !data.stopPlayPause){
282
- data.paused = true;
283
- data._ppFlag = true;
284
- trigger(data._elem, 'pause');
285
- }
286
- break;
287
- case 'COMPLETED':
288
- if(data.readyState < 4){
289
- setReadyState(4, data);
290
- }
291
- data.ended = true;
292
- trigger(data._elem, 'ended');
293
- break;
294
- }
295
- }
296
- }
297
- ,Controller: {
298
-
299
- ERROR: function(obj){
300
- var data = getSwfDataFromID(obj.id);
301
- if(!data){return;}
302
- mediaelement.setError(data._elem, obj.message);
303
- },
304
- SEEK: function(obj){
305
- var data = getSwfDataFromID(obj.id);
306
- if(!data){return;}
307
- if(data.ended){
308
- data.ended = false;
309
- }
310
- if(data.paused){
311
- try {
312
- data.jwapi[SENDEVENT]('play', 'false');
313
- } catch(er){}
314
- }
315
- if(data.currentTime != obj.position){
316
- data.currentTime = obj.position;
317
- trigger(data._elem, 'timeupdate');
318
- }
319
-
320
-
321
- },
322
- VOLUME: function(obj){
323
- var data = getSwfDataFromID(obj.id);
324
- if(!data){return;}
325
- var newVolume = obj.percentage / 100;
326
- if(data.volume == newVolume){return;}
327
- data.volume = newVolume;
328
- trigger(data._elem, 'volumechange');
329
- },
330
- MUTE: function(obj){
331
- if(obj.state){return;}
332
- var data = getSwfDataFromID(obj.id);
333
- if(!data){return;}
334
- if(data.muted == obj.state){return;}
335
- data.muted = obj.state;
336
- trigger(data._elem, 'volumechange');
337
- }
338
- }
339
- };
340
-
341
- var initEvents = function(data){
342
- var passed = true;
343
- $.each(mediaelement.jwEvents, function(mvcName, evts){
344
- $.each(evts, function(evtName){
345
- try {
346
- data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
347
- } catch(er){
348
- passed = false;
349
- return false;
350
- }
351
- });
352
- });
353
- return passed;
354
- };
355
-
356
- var workActionQueue = function(data){
357
- var actionLen = data.actionQueue.length;
358
- var i = 0;
359
- var operation;
360
- if(actionLen && data.isActive == 'third'){
361
- while(data.actionQueue.length && actionLen > i){
362
- i++;
363
- operation = data.actionQueue.shift();
364
- data.jwapi[operation.fn].apply(data.jwapi, operation.args);
365
- }
366
- }
367
- if(data.actionQueue.length){
368
- data.actionQueue = [];
369
- }
370
- };
371
- var startAutoPlay = function(data){
372
- if(!data){return;}
373
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
374
- setTimeout(function(){
375
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
376
- try {
377
- $(data._elem).play();
378
- } catch(er){}
379
- }
380
- }, 1);
381
- }
382
- };
383
-
384
- var startIntrinsicDimension = function(data){
385
- if(!data || data._elemNodeName != 'video'){return;}
386
- var img;
387
- var widthAuto;
388
- var heightAuto;
389
- var lastIntrinsicSize = {};
390
- var shadowElem;
391
- var errorTimer;
392
- var blockResize;
393
- var lastSize;
394
- var setSize = function(width, height){
395
- if(!height || !width || height < 1 || width < 1 || data.isActive != 'third'){return;}
396
- if(img){
397
- img.remove();
398
- img = false;
399
- }
400
- lastIntrinsicSize.width = width;
401
- lastIntrinsicSize.height = height;
402
- clearTimeout(errorTimer);
403
- widthAuto = data._elem.style.width == 'auto';
404
- heightAuto = data._elem.style.height == 'auto';
405
-
406
- if(!widthAuto && !heightAuto){return;}
407
- var curSize;
408
- shadowElem = shadowElem || $(data._elem).getShadowElement();
409
- var cur;
410
- if(widthAuto && !heightAuto){
411
- cur = shadowElem.height();
412
- width *= cur / height;
413
- height = cur;
414
- } else if(!widthAuto && heightAuto){
415
- cur = shadowElem.width();
416
- height *= cur / width;
417
- width = cur;
418
- }
419
- blockResize = true;
420
- setTimeout(function(){
421
- blockResize = false;
422
- }, 9);
423
-
424
- shadowElem.css({width: width, height: height});
425
- };
426
- var setPosterSrc = function(){
427
- if(data.isActive != 'third' || ($.prop(data._elem, 'readyState') && $.prop(this, 'videoWidth'))){return;}
428
- var posterSrc = $.prop(data._elem, 'poster');
429
- if(!posterSrc){return;}
430
- widthAuto = data._elem.style.width == 'auto';
431
- heightAuto = data._elem.style.height == 'auto';
432
- if(!widthAuto && !heightAuto){return;}
433
- if(img){
434
- img.remove();
435
- img = false;
436
- }
437
- img = $('<img style="position: absolute; height: auto; width: auto; top: 0px; left: 0px; visibility: hidden;" />');
438
- img
439
- .bind('load error alreadycomplete', function(e){
440
- clearTimeout(errorTimer);
441
-
442
- var elem = this;
443
- var width = elem.naturalWidth || elem.width || elem.offsetWidth;
444
- var height = elem.naturalHeight || elem.height || elem.offsetHeight;
445
-
446
- if(height && width){
447
- setSize(width, height);
448
- elem = null;
449
- } else {
450
- setTimeout(function(){
451
- width = elem.naturalWidth || elem.width || elem.offsetWidth;
452
- height = elem.naturalHeight || elem.height || elem.offsetHeight;
453
- setSize(width, height);
454
- if(img){
455
- img.remove();
456
- img = false;
457
- }
458
- elem = null;
459
- }, 9);
460
- }
461
- $(this).unbind();
462
- })
463
- .prop('src', posterSrc)
464
- .appendTo('body')
465
- .each(function(){
466
- if(this.complete || this.error){
467
- $(this).triggerHandler('alreadycomplete');
468
- } else {
469
- clearTimeout(errorTimer);
470
- errorTimer = setTimeout(function(){
471
- $(data._elem).triggerHandler('error');
472
- }, 9999);
473
- }
474
- })
475
- ;
476
- };
477
-
478
- $(data._elem)
479
- .bind('loadedmetadata', function(){
480
- setSize($.prop(this, 'videoWidth'), $.prop(this, 'videoHeight'));
481
- })
482
- .bind('emptied', setPosterSrc)
483
- .bind('swfstageresize updatemediaelementdimensions', function(){
484
- if(blockResize){return;}
485
- setSize(lastIntrinsicSize.width, lastIntrinsicSize.height);
486
- })
487
- .bind('emptied', function(){
488
- lastIntrinsicSize = {};
489
- })
490
- .triggerHandler('swfstageresize')
491
- ;
492
-
493
- setPosterSrc();
494
- if($.prop(data._elem, 'readyState')){
495
- setSize($.prop(data._elem, 'videoWidth'), $.prop(data._elem, 'videoHeight'));
496
- }
497
- };
498
-
499
- mediaelement.playerResize = function(id){
500
- if(!id){return;}
501
- var elem = document.getElementById(id.replace(idRep, ''));
502
-
503
- if(elem){
504
- $(elem).triggerHandler('swfstageresize');
505
- }
506
- elem = null;
507
- };
508
-
509
-
510
- $(document).bind('emptied', function(e){
511
- var data = getSwfDataFromElem(e.target);
512
- startAutoPlay(data);
513
- });
514
-
515
- var localConnectionTimer;
516
- mediaelement.jwPlayerReady = function(jwData){
517
- var data = getSwfDataFromID(jwData.id);
518
- var passed = true;
519
- var i = 0;
520
- var doneFn = function(){
521
- if(i > 9){return;}
522
- i++;
523
- if(initEvents(data)){
524
- if(!data.wasSwfReady){
525
- var version = parseFloat( jwData.version, 10);
526
- if(version < 5.1 || version >= 6){
527
- webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
528
- }
529
- } else {
530
- $(data._elem).mediaLoad();
531
-
532
- }
533
- data.wasSwfReady = true;
534
- data.tryedReframeing = 0;
535
- workActionQueue(data);
536
- startAutoPlay(data);
537
- } else {
538
- clearTimeout(data.reframeTimer);
539
- data.reframeTimer = setTimeout(doneFn, 9 * i);
540
- if(i > 2 && data.tryedReframeing < 9){
541
- data.tryedReframeing++;
542
- data.shadowElem.css({overflow: 'visible'});
543
- setTimeout(function(){
544
- data.shadowElem.css({overflow: 'hidden'});
545
- }, 16);
546
- }
547
- }
548
- };
549
- if(!data || !data.jwapi){return;}
550
- if(!data.tryedReframeing){
551
- data.tryedReframeing = 0;
552
- }
553
- clearTimeout(localConnectionTimer);
554
- data.jwData = jwData;
555
- data.shadowElem.removeClass('flashblocker-assumed');
556
- $.prop(data._elem, 'volume', data.volume);
557
- $.prop(data._elem, 'muted', data.muted);
558
- doneFn();
559
-
560
- };
561
-
562
- var addMediaToStopEvents = $.noop;
563
- if(hasNative){
564
- var stopEvents = {
565
- play: 1,
566
- playing: 1
567
- };
568
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
569
- var hidevents = hideEvtArray.map(function(evt){
570
- return evt +'.webshimspolyfill';
571
- }).join(' ');
572
-
573
- var hidePlayerEvents = function(event){
574
- var data = webshims.data(event.target, 'mediaelement');
575
- if(!data){return;}
576
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
577
- if( isNativeHTML5 == (data.activating == 'third') ){
578
- event.stopImmediatePropagation();
579
- if(stopEvents[event.type] && data.isActive != data.activating){
580
- $(event.target).pause();
581
- }
582
- }
583
- };
584
-
585
- addMediaToStopEvents = function(elem){
586
- $(elem)
587
- .unbind(hidevents)
588
- .bind(hidevents, hidePlayerEvents)
589
- ;
590
- hideEvtArray.forEach(function(evt){
591
- webshims.moveToFirstEvent(elem, evt);
592
- });
593
- };
594
- addMediaToStopEvents(document);
595
- }
596
-
597
-
598
- mediaelement.setActive = function(elem, type, data){
599
- if(!data){
600
- data = webshims.data(elem, 'mediaelement');
601
- }
602
- if(!data || data.isActive == type){return;}
603
- if(type != 'html5' && type != 'third'){
604
- webshims.warn('wrong type for mediaelement activating: '+ type);
605
- }
606
- var shadowData = webshims.data(elem, 'shadowData');
607
- data.activating = type;
608
- $(elem).pause();
609
- data.isActive = type;
610
- if(type == 'third'){
611
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
612
- $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
613
- } else {
614
- $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
615
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
616
- }
617
- $(elem).trigger('mediaelementapichange');
618
- };
619
-
620
-
621
-
622
- var resetSwfProps = (function(){
623
- var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
624
- var len = resetProtoProps.length;
625
- return function(data){
626
-
627
- if(!data){return;}
628
- var lenI = len;
629
- var networkState = data.networkState;
630
- setReadyState(0, data);
631
- while(--lenI){
632
- delete data[resetProtoProps[lenI]];
633
- }
634
- data.actionQueue = [];
635
- data.buffered.length = 0;
636
- if(networkState){
637
- trigger(data._elem, 'emptied');
638
- }
639
- };
640
- })();
641
-
642
- var setElementDimension = function(data, hasControls){
643
- var elem = data._elem;
644
- var box = data.shadowElem;
645
- $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
646
- if(data._elemNodeName == 'audio' && !hasControls){
647
- box.css({width: 0, height: 0});
648
- } else {
649
- box.css({
650
- width: elem.style.width || $(elem).width(),
651
- height: elem.style.height || $(elem).height()
652
- });
653
- }
654
- };
655
-
656
- mediaelement.createSWF = function( elem, canPlaySrc, data ){
657
- if(!hasFlash){
658
- setTimeout(function(){
659
- $(elem).mediaLoad(); //<- this should produce a mediaerror
660
- }, 1);
661
- return;
662
- }
663
-
664
- if(loadedSwf < 1){
665
- loadedSwf = 1;
666
- } else {
667
- loadedSwf++;
668
- }
669
- var vars = $.extend({}, options.jwVars, {
670
- image: $.prop(elem, 'poster') || '',
671
- file: canPlaySrc.srcProp
672
- });
673
- var elemVars = $(elem).data('jwvars') || {};
674
-
675
- if(!data){
676
- data = webshims.data(elem, 'mediaelement');
677
- }
678
-
679
- if(data && data.swfCreated){
680
- mediaelement.setActive(elem, 'third', data);
681
- resetSwfProps(data);
682
- data.currentSrc = canPlaySrc.srcProp;
683
- $.extend(vars, elemVars);
684
- options.changeJW(vars, elem, canPlaySrc, data, 'load');
685
- queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
686
- return;
687
- }
688
-
689
-
690
- var hasControls = $.prop(elem, 'controls');
691
- var elemId = 'jwplayer-'+ webshims.getID(elem);
692
- var params = $.extend(
693
- {},
694
- options.jwParams,
695
- $(elem).data('jwparams')
696
- );
697
- var elemNodeName = elem.nodeName.toLowerCase();
698
- var attrs = $.extend(
699
- {},
700
- options.jwAttrs,
701
- {
702
- name: elemId,
703
- id: elemId
704
- },
705
- $(elem).data('jwattrs')
706
- );
707
- var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
708
- .css({
709
- position: 'relative',
710
- overflow: 'hidden'
711
- })
712
- ;
713
- data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
714
- actionQueue: {
715
- value: []
716
- },
717
- shadowElem: {
718
- value: box
719
- },
720
- _elemNodeName: {
721
- value: elemNodeName
722
- },
723
- _elem: {
724
- value: elem
725
- },
726
- currentSrc: {
727
- value: canPlaySrc.srcProp
728
- },
729
- swfCreated: {
730
- value: true
731
- },
732
- buffered: {
733
- value: {
734
- start: function(index){
735
- if(index >= data.buffered.length){
736
- webshims.error('buffered index size error');
737
- return;
738
- }
739
- return 0;
740
- },
741
- end: function(index){
742
- if(index >= data.buffered.length){
743
- webshims.error('buffered index size error');
744
- return;
745
- }
746
- return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
747
- },
748
- length: 0
749
- }
750
- }
751
- }));
752
-
753
- setElementDimension(data, hasControls);
754
-
755
- box.insertBefore(elem);
756
-
757
- if(hasNative){
758
- $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
759
- }
760
-
761
- $.extend(vars,
762
- {
763
- id: elemId,
764
- controlbar: hasControls ? options.jwVars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
765
- icons: ''+ (hasControls && elemNodeName == 'video')
766
- },
767
- elemVars,
768
- {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
769
- );
770
- if(vars.plugins){
771
- vars.plugins += ','+jwplugin;
772
- } else {
773
- vars.plugins = jwplugin;
774
- }
775
-
776
-
777
- webshims.addShadowDom(elem, box);
778
-
779
- addMediaToStopEvents(elem);
780
-
781
- mediaelement.setActive(elem, 'third', data);
782
-
783
- options.changeJW(vars, elem, canPlaySrc, data, 'embed');
784
-
785
- $(elem).bind('updatemediaelementdimensions updateshadowdom', function(){
786
- setElementDimension(data, $.prop(elem, 'controls'));
787
- });
788
-
789
- startIntrinsicDimension(data);
790
-
791
- swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
792
-
793
- if(swfData.success){
794
- data.jwapi = swfData.ref;
795
-
796
- if(!hasControls){
797
- $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
798
- }
799
- setTimeout(function(){
800
- if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
801
- box.addClass('flashblocker-assumed');
802
- $(elem).trigger('flashblocker');
803
- webshims.warn("flashblocker assumed");
804
- }
805
- $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
806
- }, 9);
807
- if(!localConnectionTimer){
808
- clearTimeout(localConnectionTimer);
809
- localConnectionTimer = setTimeout(function(){
810
- var flash = $(swfData.ref);
811
- if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
812
- webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
813
- } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
814
- webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
815
- }
816
- flash = null;
817
- }, 8000);
818
- }
819
- }
820
- });
821
- };
822
-
823
-
824
- var queueSwfMethod = function(elem, fn, args, data){
825
- data = data || getSwfDataFromElem(elem);
826
- if(data){
827
- if(data.jwapi && data.jwapi[fn]){
828
- data.jwapi[fn].apply(data.jwapi, args || []);
829
- } else {
830
- //todo add to queue
831
- data.actionQueue.push({fn: fn, args: args});
832
- if(data.actionQueue.length > 10){
833
- setTimeout(function(){
834
- if(data.actionQueue.length > 5){
835
- data.actionQueue.shift();
836
- }
837
- }, 99);
838
- }
839
- }
840
- return data;
841
- }
842
- return false;
843
- };
844
-
845
- ['audio', 'video'].forEach(function(nodeName){
846
- var descs = {};
847
- var mediaSup;
848
- var createGetProp = function(key){
849
- if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
850
-
851
- descs[key] = {
852
- get: function(){
853
- var data = getSwfDataFromElem(this);
854
- if(data){
855
- return data[key];
856
- } else if(hasNative && mediaSup[key].prop._supget) {
857
- return mediaSup[key].prop._supget.apply(this);
858
- } else {
859
- return playerStateObj[key];
860
- }
861
- },
862
- writeable: false
863
- };
864
- };
865
- var createGetSetProp = function(key, setFn){
866
- createGetProp(key);
867
- delete descs[key].writeable;
868
- descs[key].set = setFn;
869
- };
870
-
871
- createGetSetProp('volume', function(v){
872
- var data = getSwfDataFromElem(this);
873
- if(data){
874
- v *= 100;
875
- if(!isNaN(v)){
876
- var muted = data.muted;
877
- if(v < 0 || v > 100){
878
- webshims.error('volume greater or less than allowed '+ (v / 100));
879
- }
880
-
881
- queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
882
- if(muted){
883
- try {
884
- data.jwapi.sendEvent('mute', 'true');
885
- } catch(er){}
886
- }
887
- v /= 100;
888
- if(data.volume == v || data.isActive != 'third'){return;}
889
- data.volume = v;
890
- trigger(data._elem, 'volumechange');
891
- data = null;
892
- }
893
- } else if(mediaSup.volume.prop._supset) {
894
- return mediaSup.volume.prop._supset.apply(this, arguments);
895
- }
896
- });
897
-
898
- createGetSetProp('muted', function(m){
899
- var data = getSwfDataFromElem(this);
900
- if(data){
901
- m = !!m;
902
- queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
903
- if(data.muted == m || data.isActive != 'third'){return;}
904
- data.muted = m;
905
- trigger(data._elem, 'volumechange');
906
- data = null;
907
- } else if(mediaSup.muted.prop._supset) {
908
- return mediaSup.muted.prop._supset.apply(this, arguments);
909
- }
910
- });
911
-
912
-
913
- createGetSetProp('currentTime', function(t){
914
- var data = getSwfDataFromElem(this);
915
- if(data){
916
- t *= 1;
917
- if (!isNaN(t)) {
918
- if(data.paused){
919
- clearTimeout(data.stopPlayPause);
920
- data.stopPlayPause = setTimeout(function(){
921
- data.paused = true;
922
- data.stopPlayPause = false;
923
- }, 50);
924
- }
925
- queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
926
-
927
- if(data.paused){
928
- if(data.readyState > 0){
929
- data.currentTime = t;
930
- trigger(data._elem, 'timeupdate');
931
- }
932
- try {
933
- data.jwapi[SENDEVENT]('play', 'false');
934
- } catch(er){}
935
-
936
- }
937
- }
938
-
939
- } else if(mediaSup.currentTime.prop._supset) {
940
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
941
- }
942
- });
943
-
944
- ['play', 'pause'].forEach(function(fn){
945
- descs[fn] = {
946
- value: function(){
947
- var data = getSwfDataFromElem(this);
948
- if(data){
949
- if(data.stopPlayPause){
950
- clearTimeout(data.stopPlayPause);
951
- }
952
- queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
953
- setTimeout(function(){
954
- if(data.isActive == 'third'){
955
- data._ppFlag = true;
956
- if(data.paused != (fn != 'play')){
957
- data.paused = fn != 'play';
958
- trigger(data._elem, fn);
959
- }
960
- }
961
- }, 1);
962
- } else if(mediaSup[fn].prop._supvalue) {
963
- return mediaSup[fn].prop._supvalue.apply(this, arguments);
964
- }
965
- }
966
- };
967
- });
968
-
969
- getPropKeys.forEach(createGetProp);
970
-
971
- webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
972
- var data = getSwfDataFromElem(this);
973
- $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
974
-
975
- if(data){
976
- try {
977
- queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
978
- } catch(er){
979
- webshims.warn("you need to generate a crossdomain.xml");
980
- }
981
- if(nodeName == 'audio'){
982
- setElementDimension(data, boolProp);
983
- }
984
- $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
985
- }
986
- });
987
-
988
- mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
989
- });
990
-
991
- if(hasFlash){
992
- var oldClean = $.cleanData;
993
- var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
994
- var flashNames = {
995
- object: 1,
996
- OBJECT: 1
997
- };
998
- $.cleanData = function(elems){
999
- var i, len, prop;
1000
- if(elems && (len = elems.length) && loadedSwf){
1001
-
1002
- for(i = 0; i < len; i++){
1003
- if(flashNames[elems[i].nodeName]){
1004
- if(SENDEVENT in elems[i]){
1005
- loadedSwf--;
1006
- try {
1007
- elems[i][SENDEVENT]('play', false);
1008
- } catch(er){}
1009
- }
1010
- if(gcBrowser){
1011
- try {
1012
- for (prop in elems[i]) {
1013
- if (typeof elems[i][prop] == "function") {
1014
- elems[i][prop] = null;
1015
- }
1016
- }
1017
- } catch(er){}
1018
- }
1019
- }
1020
- }
1021
-
1022
- }
1023
- return oldClean.apply(this, arguments);
1024
- };
1025
- }
1026
-
1027
- if(!hasNative){
1028
-
1029
- ['poster', 'src'].forEach(function(prop){
1030
- webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
1031
- //attr: {},
1032
- reflect: true,
1033
- propType: 'src'
1034
- });
1035
- });
1036
-
1037
-
1038
- ['autoplay', 'controls'].forEach(function(name){
1039
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
1040
- });
1041
-
1042
- webshims.defineNodeNamesProperties(['audio', 'video'], {
1043
- HAVE_CURRENT_DATA: {
1044
- value: 2
1045
- },
1046
- HAVE_ENOUGH_DATA: {
1047
- value: 4
1048
- },
1049
- HAVE_FUTURE_DATA: {
1050
- value: 3
1051
- },
1052
- HAVE_METADATA: {
1053
- value: 1
1054
- },
1055
- HAVE_NOTHING: {
1056
- value: 0
1057
- },
1058
- NETWORK_EMPTY: {
1059
- value: 0
1060
- },
1061
- NETWORK_IDLE: {
1062
- value: 1
1063
- },
1064
- NETWORK_LOADING: {
1065
- value: 2
1066
- },
1067
- NETWORK_NO_SOURCE: {
1068
- value: 3
1069
- }
1070
-
1071
- }, 'prop');
1072
- }
1073
-
1
+ /*
2
+ * todos:
3
+ * - decouple muted/volume (needs improvement)
4
+ * - implement video <-> flashcanvas pro API
5
+ * - improve buffered-property with youtube/rtmp
6
+ * - use jwplayer5 api instead of old flash4 api
7
+ */
8
+
9
+ jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
10
+ "use strict";
11
+ var SENDEVENT = 'sendEvent';
12
+ var mediaelement = webshims.mediaelement;
13
+ var swfobject = window.swfobject;
14
+ var hasNative = Modernizr.audio && Modernizr.video;
15
+ var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
16
+ var loadedSwf = 0;
17
+ var getProps = {
18
+ paused: true,
19
+ ended: false,
20
+ currentSrc: '',
21
+ duration: window.NaN,
22
+
23
+ readyState: 0,
24
+ networkState: 0,
25
+ videoHeight: 0,
26
+ videoWidth: 0,
27
+ error: null,
28
+ buffered: {
29
+ start: function(index){
30
+ if(index){
31
+ webshims.error('buffered index size error');
32
+ return;
33
+ }
34
+ return 0;
35
+ },
36
+ end: function(index){
37
+ if(index){
38
+ webshims.error('buffered index size error');
39
+ return;
40
+ }
41
+ return 0;
42
+ },
43
+ length: 0
44
+ }
45
+ };
46
+ var getPropKeys = Object.keys(getProps);
47
+
48
+ var getSetProps = {
49
+ currentTime: 0,
50
+ volume: 1,
51
+ muted: false
52
+ };
53
+ var getSetPropKeys = Object.keys(getSetProps);
54
+
55
+ var playerStateObj = $.extend({
56
+ isActive: 'html5',
57
+ activating: 'html5',
58
+ wasSwfReady: false,
59
+ _bufferedEnd: 0,
60
+ _bufferedStart: 0,
61
+ _metadata: false,
62
+ _durationCalcs: -1,
63
+ _callMeta: false,
64
+ currentTime: 0,
65
+ _ppFlag: undefined
66
+ }, getProps, getSetProps);
67
+
68
+ var idRep = /^jwplayer-/;
69
+ var getSwfDataFromID = function(id){
70
+
71
+ var elem = document.getElementById(id.replace(idRep, ''));
72
+ if(!elem){return;}
73
+ var data = webshims.data(elem, 'mediaelement');
74
+ return data.isActive == 'third' ? data : null;
75
+ };
76
+
77
+
78
+ var getSwfDataFromElem = function(elem){
79
+ try {
80
+ (elem.nodeName);
81
+ } catch(er){
82
+ return null;
83
+ }
84
+ var data = webshims.data(elem, 'mediaelement');
85
+ return (data && data.isActive== 'third') ? data : null;
86
+ };
87
+
88
+ var trigger = function(elem, evt){
89
+ evt = $.Event(evt);
90
+ evt.preventDefault();
91
+ $.event.trigger(evt, undefined, elem);
92
+ };
93
+
94
+ var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
95
+ var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
96
+
97
+ webshims.extendUNDEFProp(options.params, {
98
+ allowscriptaccess: 'always',
99
+ allowfullscreen: 'true',
100
+ wmode: 'transparent'
101
+ });
102
+ webshims.extendUNDEFProp(options.vars, {
103
+ screencolor: 'ffffffff'
104
+ });
105
+ webshims.extendUNDEFProp(options.attrs, {
106
+ bgcolor: '#000000'
107
+ });
108
+
109
+ var getDuration = function(data, obj){
110
+ var curDuration = data.duration;
111
+ if(curDuration && data._durationCalcs > 0){return;}
112
+ try {
113
+ data.duration = data.jwapi.getPlaylist()[0].duration;
114
+ if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
115
+ data.duration = curDuration;
116
+ }
117
+ } catch(er){}
118
+ if(data.duration && data.duration != data._lastDuration){
119
+ trigger(data._elem, 'durationchange');
120
+ if(data._elemNodeName == 'audio' || data._callMeta){
121
+ mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
122
+ }
123
+ data._durationCalcs--;
124
+ } else {
125
+ data._durationCalcs++;
126
+ }
127
+ };
128
+ var setReadyState = function(readyState, data){
129
+ if(readyState < 3){
130
+ clearTimeout(data._canplaythroughTimer);
131
+ }
132
+ if(readyState >= 3 && data.readyState < 3){
133
+ data.readyState = readyState;
134
+ trigger(data._elem, 'canplay');
135
+ clearTimeout(data._canplaythroughTimer);
136
+ data._canplaythroughTimer = setTimeout(function(){
137
+ setReadyState(4, data);
138
+ }, 4000);
139
+ }
140
+ if(readyState >= 4 && data.readyState < 4){
141
+ data.readyState = readyState;
142
+ trigger(data._elem, 'canplaythrough');
143
+ }
144
+ data.readyState = readyState;
145
+ };
146
+
147
+ $.extend($.event.customEvent, {
148
+ updatemediaelementdimensions: true,
149
+ flashblocker: true,
150
+ swfstageresize: true,
151
+ mediaelementapichange: true
152
+ });
153
+
154
+ mediaelement.jwEvents = {
155
+ View: {
156
+
157
+ PLAY: function(obj){
158
+ var data = getSwfDataFromID(obj.id);
159
+ if(!data || data.stopPlayPause){return;}
160
+ data._ppFlag = true;
161
+ if(data.paused == obj.state){
162
+ data.paused = !obj.state;
163
+ if(data.ended){
164
+ data.ended = false;
165
+ }
166
+ trigger(data._elem, obj.state ? 'play' : 'pause');
167
+ }
168
+ }
169
+ },
170
+ Model: {
171
+
172
+ BUFFER: function(obj){
173
+ var data = getSwfDataFromID(obj.id);
174
+ if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
175
+ data.networkState = (obj.percentage == 100) ? 1 : 2;
176
+ if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
177
+ getDuration(data, obj);
178
+ }
179
+
180
+ if(data.ended){
181
+ data.ended = false;
182
+ }
183
+ if(!data.duration){
184
+ return;
185
+ }
186
+ if(obj.percentage > 2 && obj.percentage < 20){
187
+ setReadyState(3, data);
188
+ } else if(obj.percentage > 20){
189
+ setReadyState(4, data);
190
+ }
191
+ if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
192
+ data._bufferedStart = data.currentTime || 0;
193
+ }
194
+
195
+ data._bufferedEnd = obj.percentage;
196
+ data.buffered.length = 1;
197
+ if(obj.percentage == 100){
198
+ data.networkState = 1;
199
+ setReadyState(4, data);
200
+ }
201
+ $.event.trigger('progress', undefined, data._elem, true);
202
+ },
203
+ META: function(obj, data){
204
+
205
+ data = data && data.networkState ? data : getSwfDataFromID(obj.id);
206
+
207
+ if(!data){return;}
208
+ if( !('duration' in obj) ){
209
+ data._callMeta = true;
210
+ return;
211
+ }
212
+
213
+ if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
214
+
215
+ data._metadata = true;
216
+
217
+ var oldDur = data.duration;
218
+ if(obj.duration){
219
+ data.duration = obj.duration;
220
+ }
221
+ data._lastDuration = data.duration;
222
+ if(obj.height || obj.width){
223
+ data.videoHeight = obj.height || 0;
224
+ data.videoWidth = obj.width || 0;
225
+ }
226
+ if(!data.networkState){
227
+ data.networkState = 2;
228
+ }
229
+ if(data.readyState < 1){
230
+ setReadyState(1, data);
231
+ }
232
+ if(data.duration && oldDur !== data.duration){
233
+ trigger(data._elem, 'durationchange');
234
+ }
235
+
236
+ trigger(data._elem, 'loadedmetadata');
237
+ },
238
+ TIME: function(obj){
239
+ var data = getSwfDataFromID(obj.id);
240
+ if(!data || data.currentTime === obj.position){return;}
241
+ data.currentTime = obj.position;
242
+ if(data.duration && data.duration < data.currentTime){
243
+ getDuration(data, obj);
244
+ }
245
+ if(data.readyState < 2){
246
+ setReadyState(2, data);
247
+ }
248
+ if(data.ended){
249
+ data.ended = false;
250
+ }
251
+ trigger(data._elem, 'timeupdate');
252
+
253
+ },
254
+ STATE: function(obj){
255
+ var data = getSwfDataFromID(obj.id);
256
+ if(!data){return;}
257
+ switch(obj.newstate) {
258
+ case 'BUFFERING':
259
+
260
+ if(data.ended){
261
+ data.ended = false;
262
+ }
263
+ setReadyState(1, data);
264
+ trigger(data._elem, 'waiting');
265
+ break;
266
+ case 'PLAYING':
267
+ data.paused = false;
268
+ data._ppFlag = true;
269
+ if(!data.duration){
270
+ getDuration(data, obj);
271
+ }
272
+ if(data.readyState < 3){
273
+ setReadyState(3, data);
274
+ }
275
+ if(data.ended){
276
+ data.ended = false;
277
+ }
278
+ trigger(data._elem, 'playing');
279
+ break;
280
+ case 'PAUSED':
281
+ if(!data.paused && !data.stopPlayPause){
282
+ data.paused = true;
283
+ data._ppFlag = true;
284
+ trigger(data._elem, 'pause');
285
+ }
286
+ break;
287
+ case 'COMPLETED':
288
+ if(data.readyState < 4){
289
+ setReadyState(4, data);
290
+ }
291
+ data.ended = true;
292
+ trigger(data._elem, 'ended');
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ ,Controller: {
298
+
299
+ ERROR: function(obj){
300
+ var data = getSwfDataFromID(obj.id);
301
+ if(!data){return;}
302
+ mediaelement.setError(data._elem, obj.message);
303
+ },
304
+ SEEK: function(obj){
305
+ var data = getSwfDataFromID(obj.id);
306
+ if(!data){return;}
307
+ if(data.ended){
308
+ data.ended = false;
309
+ }
310
+ if(data.paused){
311
+ try {
312
+ data.jwapi[SENDEVENT]('play', 'false');
313
+ } catch(er){}
314
+ }
315
+ if(data.currentTime != obj.position){
316
+ data.currentTime = obj.position;
317
+ trigger(data._elem, 'timeupdate');
318
+ }
319
+
320
+
321
+ },
322
+ VOLUME: function(obj){
323
+ var data = getSwfDataFromID(obj.id);
324
+ if(!data){return;}
325
+ var newVolume = obj.percentage / 100;
326
+ if(data.volume == newVolume){return;}
327
+ data.volume = newVolume;
328
+ trigger(data._elem, 'volumechange');
329
+ },
330
+ MUTE: function(obj){
331
+ if(obj.state){return;}
332
+ var data = getSwfDataFromID(obj.id);
333
+ if(!data){return;}
334
+ if(data.muted == obj.state){return;}
335
+ data.muted = obj.state;
336
+ trigger(data._elem, 'volumechange');
337
+ }
338
+ }
339
+ };
340
+
341
+ var initEvents = function(data){
342
+ var passed = true;
343
+ $.each(mediaelement.jwEvents, function(mvcName, evts){
344
+ $.each(evts, function(evtName){
345
+ try {
346
+ data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
347
+ } catch(er){
348
+ passed = false;
349
+ return false;
350
+ }
351
+ });
352
+ });
353
+ return passed;
354
+ };
355
+
356
+ var workActionQueue = function(data){
357
+ var actionLen = data.actionQueue.length;
358
+ var i = 0;
359
+ var operation;
360
+ if(actionLen && data.isActive == 'third'){
361
+ while(data.actionQueue.length && actionLen > i){
362
+ i++;
363
+ operation = data.actionQueue.shift();
364
+ data.jwapi[operation.fn].apply(data.jwapi, operation.args);
365
+ }
366
+ }
367
+ if(data.actionQueue.length){
368
+ data.actionQueue = [];
369
+ }
370
+ };
371
+ var startAutoPlay = function(data){
372
+ if(!data){return;}
373
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
374
+ setTimeout(function(){
375
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
376
+ try {
377
+ $(data._elem).play();
378
+ } catch(er){}
379
+ }
380
+ }, 1);
381
+ }
382
+ };
383
+
384
+
385
+ mediaelement.playerResize = function(id){
386
+ if(!id){return;}
387
+ var elem = document.getElementById(id.replace(idRep, ''));
388
+
389
+ if(elem){
390
+ $(elem).triggerHandler('swfstageresize');
391
+ }
392
+ elem = null;
393
+ };
394
+
395
+
396
+ $(document).on('emptied', function(e){
397
+ var data = getSwfDataFromElem(e.target);
398
+ startAutoPlay(data);
399
+ });
400
+
401
+ var localConnectionTimer;
402
+ mediaelement.jwPlayerReady = function(jwData){
403
+ var data = getSwfDataFromID(jwData.id);
404
+ var passed = true;
405
+ var i = 0;
406
+ var doneFn = function(){
407
+ if(i > 9){return;}
408
+ i++;
409
+ if(initEvents(data)){
410
+ if(!data.wasSwfReady){
411
+ var version = parseFloat( jwData.version, 10);
412
+ if(version < 5.1 || version >= 6){
413
+ webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
414
+ }
415
+ } else {
416
+ $(data._elem).mediaLoad();
417
+
418
+ }
419
+ data.wasSwfReady = true;
420
+ data.tryedReframeing = 0;
421
+ workActionQueue(data);
422
+ startAutoPlay(data);
423
+ } else {
424
+ clearTimeout(data.reframeTimer);
425
+ data.reframeTimer = setTimeout(doneFn, 9 * i);
426
+ if(i > 2 && data.tryedReframeing < 9){
427
+ data.tryedReframeing++;
428
+ data.shadowElem.css({overflow: 'visible'});
429
+ setTimeout(function(){
430
+ data.shadowElem.css({overflow: 'hidden'});
431
+ }, 16);
432
+ }
433
+ }
434
+ };
435
+ if(!data || !data.jwapi){return;}
436
+ if(!data.tryedReframeing){
437
+ data.tryedReframeing = 0;
438
+ }
439
+ clearTimeout(localConnectionTimer);
440
+ data.jwData = jwData;
441
+ data.shadowElem.removeClass('flashblocker-assumed');
442
+ $.prop(data._elem, 'volume', data.volume);
443
+ $.prop(data._elem, 'muted', data.muted);
444
+ doneFn();
445
+
446
+ };
447
+
448
+ var addMediaToStopEvents = $.noop;
449
+ if(hasNative){
450
+ var stopEvents = {
451
+ play: 1,
452
+ playing: 1
453
+ };
454
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
455
+ var hidevents = hideEvtArray.map(function(evt){
456
+ return evt +'.webshimspolyfill';
457
+ }).join(' ');
458
+
459
+ var hidePlayerEvents = function(event){
460
+ var data = webshims.data(event.target, 'mediaelement');
461
+ if(!data){return;}
462
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
463
+ if( isNativeHTML5 == (data.activating == 'third') ){
464
+ event.stopImmediatePropagation();
465
+ if(stopEvents[event.type] && data.isActive != data.activating){
466
+ $(event.target).pause();
467
+ }
468
+ }
469
+ };
470
+
471
+ addMediaToStopEvents = function(elem){
472
+ $(elem)
473
+ .off(hidevents)
474
+ .on(hidevents, hidePlayerEvents)
475
+ ;
476
+ hideEvtArray.forEach(function(evt){
477
+ webshims.moveToFirstEvent(elem, evt);
478
+ });
479
+ };
480
+ addMediaToStopEvents(document);
481
+ }
482
+
483
+
484
+ mediaelement.setActive = function(elem, type, data){
485
+ if(!data){
486
+ data = webshims.data(elem, 'mediaelement');
487
+ }
488
+ if(!data || data.isActive == type){return;}
489
+ if(type != 'html5' && type != 'third'){
490
+ webshims.warn('wrong type for mediaelement activating: '+ type);
491
+ }
492
+ var shadowData = webshims.data(elem, 'shadowData');
493
+ data.activating = type;
494
+ $(elem).pause();
495
+ data.isActive = type;
496
+ if(type == 'third'){
497
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
498
+ $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
499
+ } else {
500
+ $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
501
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
502
+ }
503
+ $(elem).trigger('mediaelementapichange');
504
+ };
505
+
506
+
507
+
508
+ var resetSwfProps = (function(){
509
+ var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
510
+ var len = resetProtoProps.length;
511
+ return function(data){
512
+
513
+ if(!data){return;}
514
+ var lenI = len;
515
+ var networkState = data.networkState;
516
+ setReadyState(0, data);
517
+ while(--lenI){
518
+ delete data[resetProtoProps[lenI]];
519
+ }
520
+ data.actionQueue = [];
521
+ data.buffered.length = 0;
522
+ if(networkState){
523
+ trigger(data._elem, 'emptied');
524
+ }
525
+ };
526
+ })();
527
+
528
+ var setElementDimension = function(data, hasControls){
529
+ var elem = data._elem;
530
+ var box = data.shadowElem;
531
+ $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
532
+ if(data._elemNodeName == 'audio' && !hasControls){
533
+ box.css({width: 0, height: 0});
534
+ } else {
535
+ box.css({
536
+ width: elem.style.width || $(elem).width(),
537
+ height: elem.style.height || $(elem).height()
538
+ });
539
+ }
540
+ };
541
+
542
+ mediaelement.createSWF = function( elem, canPlaySrc, data ){
543
+ if(!hasFlash){
544
+ setTimeout(function(){
545
+ $(elem).mediaLoad(); //<- this should produce a mediaerror
546
+ }, 1);
547
+ return;
548
+ }
549
+
550
+ if(loadedSwf < 1){
551
+ loadedSwf = 1;
552
+ } else {
553
+ loadedSwf++;
554
+ }
555
+ var vars = $.extend({}, options.vars, {
556
+ image: $.prop(elem, 'poster') || '',
557
+ file: canPlaySrc.srcProp
558
+ });
559
+ var elemVars = $(elem).data('vars') || {};
560
+
561
+ if(!data){
562
+ data = webshims.data(elem, 'mediaelement');
563
+ }
564
+
565
+ if(data && data.swfCreated){
566
+ mediaelement.setActive(elem, 'third', data);
567
+ resetSwfProps(data);
568
+ data.currentSrc = canPlaySrc.srcProp;
569
+ $.extend(vars, elemVars);
570
+ options.changeSWF(vars, elem, canPlaySrc, data, 'load');
571
+ queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
572
+ return;
573
+ }
574
+
575
+
576
+ var hasControls = $.prop(elem, 'controls');
577
+ var elemId = 'jwplayer-'+ webshims.getID(elem);
578
+ var params = $.extend(
579
+ {},
580
+ options.params,
581
+ $(elem).data('params')
582
+ );
583
+ var elemNodeName = elem.nodeName.toLowerCase();
584
+ var attrs = $.extend(
585
+ {},
586
+ options.attrs,
587
+ {
588
+ name: elemId,
589
+ id: elemId
590
+ },
591
+ $(elem).data('attrs')
592
+ );
593
+ var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
594
+ .css({
595
+ position: 'relative',
596
+ overflow: 'hidden'
597
+ })
598
+ ;
599
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
600
+ actionQueue: {
601
+ value: []
602
+ },
603
+ shadowElem: {
604
+ value: box
605
+ },
606
+ _elemNodeName: {
607
+ value: elemNodeName
608
+ },
609
+ _elem: {
610
+ value: elem
611
+ },
612
+ currentSrc: {
613
+ value: canPlaySrc.srcProp
614
+ },
615
+ swfCreated: {
616
+ value: true
617
+ },
618
+ buffered: {
619
+ value: {
620
+ start: function(index){
621
+ if(index >= data.buffered.length){
622
+ webshims.error('buffered index size error');
623
+ return;
624
+ }
625
+ return 0;
626
+ },
627
+ end: function(index){
628
+ if(index >= data.buffered.length){
629
+ webshims.error('buffered index size error');
630
+ return;
631
+ }
632
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
633
+ },
634
+ length: 0
635
+ }
636
+ }
637
+ }));
638
+
639
+ setElementDimension(data, hasControls);
640
+
641
+ box.insertBefore(elem);
642
+
643
+ if(hasNative){
644
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
645
+ }
646
+
647
+ $.extend(vars,
648
+ {
649
+ id: elemId,
650
+ controlbar: hasControls ? options.vars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
651
+ icons: ''+ (hasControls && elemNodeName == 'video')
652
+ },
653
+ elemVars,
654
+ {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
655
+ );
656
+ if(vars.plugins){
657
+ vars.plugins += ','+jwplugin;
658
+ } else {
659
+ vars.plugins = jwplugin;
660
+ }
661
+
662
+
663
+ webshims.addShadowDom(elem, box);
664
+
665
+ addMediaToStopEvents(elem);
666
+
667
+ mediaelement.setActive(elem, 'third', data);
668
+
669
+ options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
670
+
671
+ $(elem).on('updatemediaelementdimensions updateshadowdom', function(){
672
+ setElementDimension(data, $.prop(elem, 'controls'));
673
+ });
674
+
675
+
676
+ swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
677
+
678
+ if(swfData.success){
679
+ data.jwapi = swfData.ref;
680
+
681
+ if(!hasControls){
682
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
683
+ }
684
+ setTimeout(function(){
685
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
686
+ box.addClass('flashblocker-assumed');
687
+ $(elem).trigger('flashblocker');
688
+ webshims.warn("flashblocker assumed");
689
+ }
690
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
691
+ }, 9);
692
+ if(!localConnectionTimer){
693
+ clearTimeout(localConnectionTimer);
694
+ localConnectionTimer = setTimeout(function(){
695
+ var flash = $(swfData.ref);
696
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
697
+ webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
698
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
699
+ webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
700
+ }
701
+ flash = null;
702
+ }, 8000);
703
+ }
704
+ }
705
+ });
706
+ };
707
+
708
+
709
+ var queueSwfMethod = function(elem, fn, args, data){
710
+ data = data || getSwfDataFromElem(elem);
711
+ if(data){
712
+ if(data.jwapi && data.jwapi[fn]){
713
+ data.jwapi[fn].apply(data.jwapi, args || []);
714
+ } else {
715
+ //todo add to queue
716
+ data.actionQueue.push({fn: fn, args: args});
717
+ if(data.actionQueue.length > 10){
718
+ setTimeout(function(){
719
+ if(data.actionQueue.length > 5){
720
+ data.actionQueue.shift();
721
+ }
722
+ }, 99);
723
+ }
724
+ }
725
+ return data;
726
+ }
727
+ return false;
728
+ };
729
+
730
+ ['audio', 'video'].forEach(function(nodeName){
731
+ var descs = {};
732
+ var mediaSup;
733
+ var createGetProp = function(key){
734
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
735
+
736
+ descs[key] = {
737
+ get: function(){
738
+ var data = getSwfDataFromElem(this);
739
+ if(data){
740
+ return data[key];
741
+ } else if(hasNative && mediaSup[key].prop._supget) {
742
+ return mediaSup[key].prop._supget.apply(this);
743
+ } else {
744
+ return playerStateObj[key];
745
+ }
746
+ },
747
+ writeable: false
748
+ };
749
+ };
750
+ var createGetSetProp = function(key, setFn){
751
+ createGetProp(key);
752
+ delete descs[key].writeable;
753
+ descs[key].set = setFn;
754
+ };
755
+
756
+ createGetSetProp('volume', function(v){
757
+ var data = getSwfDataFromElem(this);
758
+ if(data){
759
+ v *= 100;
760
+ if(!isNaN(v)){
761
+ var muted = data.muted;
762
+ if(v < 0 || v > 100){
763
+ webshims.error('volume greater or less than allowed '+ (v / 100));
764
+ }
765
+
766
+ queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
767
+ if(muted){
768
+ try {
769
+ data.jwapi.sendEvent('mute', 'true');
770
+ } catch(er){}
771
+ }
772
+ v /= 100;
773
+ if(data.volume == v || data.isActive != 'third'){return;}
774
+ data.volume = v;
775
+ trigger(data._elem, 'volumechange');
776
+ data = null;
777
+ }
778
+ } else if(mediaSup.volume.prop._supset) {
779
+ return mediaSup.volume.prop._supset.apply(this, arguments);
780
+ }
781
+ });
782
+
783
+ createGetSetProp('muted', function(m){
784
+ var data = getSwfDataFromElem(this);
785
+ if(data){
786
+ m = !!m;
787
+ queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
788
+ if(data.muted == m || data.isActive != 'third'){return;}
789
+ data.muted = m;
790
+ trigger(data._elem, 'volumechange');
791
+ data = null;
792
+ } else if(mediaSup.muted.prop._supset) {
793
+ return mediaSup.muted.prop._supset.apply(this, arguments);
794
+ }
795
+ });
796
+
797
+
798
+ createGetSetProp('currentTime', function(t){
799
+ var data = getSwfDataFromElem(this);
800
+ if(data){
801
+ t *= 1;
802
+ if (!isNaN(t)) {
803
+ if(data.paused){
804
+ clearTimeout(data.stopPlayPause);
805
+ data.stopPlayPause = setTimeout(function(){
806
+ data.paused = true;
807
+ data.stopPlayPause = false;
808
+ }, 50);
809
+ }
810
+ queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
811
+
812
+ if(data.paused){
813
+ if(data.readyState > 0){
814
+ data.currentTime = t;
815
+ trigger(data._elem, 'timeupdate');
816
+ }
817
+ try {
818
+ data.jwapi[SENDEVENT]('play', 'false');
819
+ } catch(er){}
820
+
821
+ }
822
+ }
823
+
824
+ } else if(mediaSup.currentTime.prop._supset) {
825
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
826
+ }
827
+ });
828
+
829
+ ['play', 'pause'].forEach(function(fn){
830
+ descs[fn] = {
831
+ value: function(){
832
+ var data = getSwfDataFromElem(this);
833
+ if(data){
834
+ if(data.stopPlayPause){
835
+ clearTimeout(data.stopPlayPause);
836
+ }
837
+ queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
838
+ setTimeout(function(){
839
+ if(data.isActive == 'third'){
840
+ data._ppFlag = true;
841
+ if(data.paused != (fn != 'play')){
842
+ data.paused = fn != 'play';
843
+ trigger(data._elem, fn);
844
+ }
845
+ }
846
+ }, 1);
847
+ } else if(mediaSup[fn].prop._supvalue) {
848
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
849
+ }
850
+ }
851
+ };
852
+ });
853
+
854
+ getPropKeys.forEach(createGetProp);
855
+
856
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
857
+ var data = getSwfDataFromElem(this);
858
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
859
+
860
+ if(data){
861
+ try {
862
+ queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
863
+ } catch(er){
864
+ webshims.warn("you need to generate a crossdomain.xml");
865
+ }
866
+ if(nodeName == 'audio'){
867
+ setElementDimension(data, boolProp);
868
+ }
869
+ $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
870
+ }
871
+ });
872
+
873
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
874
+ });
875
+
876
+ if(hasFlash){
877
+ var oldClean = $.cleanData;
878
+ var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
879
+ var flashNames = {
880
+ object: 1,
881
+ OBJECT: 1
882
+ };
883
+ $.cleanData = function(elems){
884
+ var i, len, prop;
885
+ if(elems && (len = elems.length) && loadedSwf){
886
+
887
+ for(i = 0; i < len; i++){
888
+ if(flashNames[elems[i].nodeName]){
889
+ if(SENDEVENT in elems[i]){
890
+ loadedSwf--;
891
+ try {
892
+ elems[i][SENDEVENT]('play', false);
893
+ } catch(er){}
894
+ }
895
+ if(gcBrowser){
896
+ try {
897
+ for (prop in elems[i]) {
898
+ if (typeof elems[i][prop] == "function") {
899
+ elems[i][prop] = null;
900
+ }
901
+ }
902
+ } catch(er){}
903
+ }
904
+ }
905
+ }
906
+
907
+ }
908
+ return oldClean.apply(this, arguments);
909
+ };
910
+ }
911
+
912
+ if(!hasNative){
913
+
914
+ ['poster', 'src'].forEach(function(prop){
915
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
916
+ //attr: {},
917
+ reflect: true,
918
+ propType: 'src'
919
+ });
920
+ });
921
+
922
+
923
+ ['autoplay', 'controls'].forEach(function(name){
924
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
925
+ });
926
+
927
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
928
+ HAVE_CURRENT_DATA: {
929
+ value: 2
930
+ },
931
+ HAVE_ENOUGH_DATA: {
932
+ value: 4
933
+ },
934
+ HAVE_FUTURE_DATA: {
935
+ value: 3
936
+ },
937
+ HAVE_METADATA: {
938
+ value: 1
939
+ },
940
+ HAVE_NOTHING: {
941
+ value: 0
942
+ },
943
+ NETWORK_EMPTY: {
944
+ value: 0
945
+ },
946
+ NETWORK_IDLE: {
947
+ value: 1
948
+ },
949
+ NETWORK_LOADING: {
950
+ value: 2
951
+ },
952
+ NETWORK_NO_SOURCE: {
953
+ value: 3
954
+ }
955
+
956
+ }, 'prop');
957
+ }
1074
958
  });