webshims-rails 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/lib/webshims-rails.rb +1 -1
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/readme.textile +5 -3
  4. data/vendor/assets/javascripts/webshims/dev/extras/custom-validity.js +261 -0
  5. data/vendor/assets/javascripts/webshims/dev/extras/modernizr-custom.js +535 -0
  6. data/vendor/assets/javascripts/webshims/dev/extras/mousepress.js +60 -0
  7. data/vendor/assets/javascripts/webshims/dev/polyfiller.js +1171 -0
  8. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/README +62 -0
  9. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/canvas2png.js +42 -0
  10. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.js +28 -0
  11. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/proxy.php +73 -0
  13. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/save.php +49 -0
  14. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/README +82 -0
  15. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/canvas2png.js +42 -0
  16. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  18. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flashcanvas.js +31 -0
  19. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/proxy.php +73 -0
  20. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/save.php +49 -0
  21. data/vendor/assets/javascripts/webshims/dev/shims/combos/1.js +1710 -0
  22. data/vendor/assets/javascripts/webshims/dev/shims/combos/10.js +3317 -0
  23. data/vendor/assets/javascripts/webshims/dev/shims/combos/11.js +1585 -0
  24. data/vendor/assets/javascripts/webshims/dev/shims/combos/12.js +1587 -0
  25. data/vendor/assets/javascripts/webshims/dev/shims/combos/13.js +1054 -0
  26. data/vendor/assets/javascripts/webshims/dev/shims/combos/14.js +476 -0
  27. data/vendor/assets/javascripts/webshims/dev/shims/combos/15.js +314 -0
  28. data/vendor/assets/javascripts/webshims/dev/shims/combos/16.js +2101 -0
  29. data/vendor/assets/javascripts/webshims/dev/shims/combos/17.js +2264 -0
  30. data/vendor/assets/javascripts/webshims/dev/shims/combos/18.js +2161 -0
  31. data/vendor/assets/javascripts/webshims/dev/shims/combos/19.js +2244 -0
  32. data/vendor/assets/javascripts/webshims/dev/shims/combos/2.js +2294 -0
  33. data/vendor/assets/javascripts/webshims/dev/shims/combos/20.js +1607 -0
  34. data/vendor/assets/javascripts/webshims/dev/shims/combos/21.js +1635 -0
  35. data/vendor/assets/javascripts/webshims/dev/shims/combos/22.js +2409 -0
  36. data/vendor/assets/javascripts/webshims/dev/shims/combos/23.js +2168 -0
  37. data/vendor/assets/javascripts/webshims/dev/shims/combos/24.js +2777 -0
  38. data/vendor/assets/javascripts/webshims/dev/shims/combos/25.js +2204 -0
  39. data/vendor/assets/javascripts/webshims/dev/shims/combos/26.js +2863 -0
  40. data/vendor/assets/javascripts/webshims/dev/shims/combos/27.js +4079 -0
  41. data/vendor/assets/javascripts/webshims/dev/shims/combos/3.js +2971 -0
  42. data/vendor/assets/javascripts/webshims/dev/shims/combos/4.js +823 -0
  43. data/vendor/assets/javascripts/webshims/dev/shims/combos/5.js +1078 -0
  44. data/vendor/assets/javascripts/webshims/dev/shims/combos/59.js +1754 -0
  45. data/vendor/assets/javascripts/webshims/dev/shims/combos/6.js +1230 -0
  46. data/vendor/assets/javascripts/webshims/dev/shims/combos/7.js +1485 -0
  47. data/vendor/assets/javascripts/webshims/dev/shims/combos/8.js +1442 -0
  48. data/vendor/assets/javascripts/webshims/dev/shims/combos/9.js +2515 -0
  49. data/vendor/assets/javascripts/webshims/dev/shims/details.js +146 -0
  50. data/vendor/assets/javascripts/webshims/dev/shims/dom-extend.js +908 -0
  51. data/vendor/assets/javascripts/webshims/dev/shims/es5.js +802 -0
  52. data/vendor/assets/javascripts/webshims/dev/shims/excanvas.js +924 -0
  53. data/vendor/assets/javascripts/webshims/dev/shims/form-core.js +660 -0
  54. data/vendor/assets/javascripts/webshims/dev/shims/form-datalist.js +677 -0
  55. data/vendor/assets/javascripts/webshims/dev/shims/form-message.js +164 -0
  56. data/vendor/assets/javascripts/webshims/dev/shims/form-native-extend.js +256 -0
  57. data/vendor/assets/javascripts/webshims/dev/shims/form-native-fix.js +261 -0
  58. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-api.js +384 -0
  59. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-ui.js +847 -0
  60. data/vendor/assets/javascripts/webshims/dev/shims/form-shim-extend.js +1472 -0
  61. data/vendor/assets/javascripts/webshims/dev/shims/geolocation.js +168 -0
  62. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ar.js +32 -0
  63. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ch-ZN.js +32 -0
  64. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-de.txt +33 -0
  65. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-el.js +32 -0
  66. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-en.txt +34 -0
  67. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-es.js +32 -0
  68. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-fr.js +32 -0
  69. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-he.js +32 -0
  70. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hi.js +32 -0
  71. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hu.js +32 -0
  72. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-it.js +32 -0
  73. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ja.js +32 -0
  74. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-nl.js +32 -0
  75. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-pt-PT.js +32 -0
  76. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ru.js +32 -0
  77. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-sv.js +32 -0
  78. data/vendor/assets/javascripts/webshims/dev/shims/json-storage.js +308 -0
  79. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/license.txt +1 -0
  80. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/player.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/readme.html +87 -0
  82. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-core.js +534 -0
  83. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-native-fix.js +99 -0
  84. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-swf.js +1074 -0
  85. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-yt.js +543 -0
  86. data/vendor/assets/javascripts/webshims/dev/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/dev/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/dev/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/dev/shims/styles/shim.css +677 -0
  90. data/vendor/assets/javascripts/webshims/dev/shims/swf/jwwebshims.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/dev/shims/swf/localStorage.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/dev/shims/track-ui.js +292 -0
  93. data/vendor/assets/javascripts/webshims/dev/shims/track.js +763 -0
  94. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +20 -20
  95. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +29 -29
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +37 -33
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +83 -76
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +44 -42
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -38
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -25
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +60 -55
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +68 -64
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +60 -59
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +66 -64
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +74 -69
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +46 -43
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -47
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +61 -57
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +68 -60
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +82 -77
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +58 -0
  112. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +80 -0
  113. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -0
  114. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +96 -91
  115. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +30 -31
  116. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +37 -39
  117. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +59 -61
  118. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +31 -29
  119. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +38 -37
  120. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +38 -33
  121. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +68 -63
  122. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +22 -20
  123. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +15 -14
  124. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +22 -22
  125. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +22 -22
  126. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +8 -9
  127. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +7 -8
  128. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +23 -21
  129. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +44 -33
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +3 -0
  131. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  132. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +86 -86
  133. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +16 -13
  134. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +30 -30
  135. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +14 -0
  136. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +71 -10
  137. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -0
  138. data/vendor/assets/javascripts/webshims/minified/shims/track.js +20 -0
  139. metadata +101 -5
  140. data/vendor/assets/javascripts/webshims/minified/shims/form-output.js +0 -5
@@ -0,0 +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
+
99
+ });
@@ -0,0 +1,1074 @@
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.info("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
+
1074
+ });