webshims-rails 0.4.7 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +15 -0
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +1 -1
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +1 -1
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +197 -166
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1711 -1609
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +2575 -2253
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +2452 -1476
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1405 -1159
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1316 -963
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1862 -179
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +4327 -287
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +3887 -586
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2911 -2159
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +3425 -1730
  16. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2854 -1203
  17. data/vendor/assets/javascripts/webshims/shims/combos/2.js +3351 -2130
  18. data/vendor/assets/javascripts/webshims/shims/combos/20.js +2426 -581
  19. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1915 -1574
  20. data/vendor/assets/javascripts/webshims/shims/combos/22.js +864 -2275
  21. data/vendor/assets/javascripts/webshims/shims/combos/23.js +609 -1811
  22. data/vendor/assets/javascripts/webshims/shims/combos/3.js +1655 -2736
  23. data/vendor/assets/javascripts/webshims/shims/combos/4.js +1037 -603
  24. data/vendor/assets/javascripts/webshims/shims/combos/5.js +3100 -773
  25. data/vendor/assets/javascripts/webshims/shims/combos/6.js +3631 -840
  26. data/vendor/assets/javascripts/webshims/shims/combos/7.js +3596 -1354
  27. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1731 -188
  28. data/vendor/assets/javascripts/webshims/shims/combos/9.js +3243 -1431
  29. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +107 -18
  30. data/vendor/assets/javascripts/webshims/shims/es5.js +1 -0
  31. data/vendor/assets/javascripts/webshims/shims/form-core.js +553 -464
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +160 -154
  33. data/vendor/assets/javascripts/webshims/shims/form-message.js +73 -49
  34. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +18 -1
  35. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +161 -36
  36. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2130 -813
  37. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +206 -58
  38. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ar.js → formcfg-ar.js} +30 -0
  39. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ch-ZN.js → formcfg-ch-ZN.js} +31 -0
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-de.txt → formcfg-de.txt} +50 -11
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-el.js → formcfg-el.js} +31 -0
  42. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-en.txt → formcfg-en.txt} +44 -11
  43. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-es.js → formcfg-es.js} +31 -0
  44. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-fr.js → formcfg-fr.js} +31 -0
  45. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-he.js → formcfg-he.js} +31 -0
  46. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hi.js → formcfg-hi.js} +31 -0
  47. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-hu.js → formcfg-hu.js} +31 -0
  48. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-it.js → formcfg-it.js} +31 -0
  49. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ja.js → formcfg-ja.js} +31 -0
  50. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-nl.js → formcfg-nl.js} +31 -0
  51. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-pt-PT.js → formcfg-pt-PT.js} +31 -0
  52. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-ru.js → formcfg-ru.js} +31 -0
  53. data/vendor/assets/javascripts/webshims/shims/i18n/{errormessages-sv.js → formcfg-sv.js} +32 -0
  54. data/vendor/assets/javascripts/webshims/shims/json-storage.js +16 -10
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +155 -122
  56. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +76 -41
  57. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +8 -16
  58. data/vendor/assets/javascripts/webshims/shims/range-ui.js +388 -0
  59. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +12 -0
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1186 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +868 -548
  63. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/swfmini.js +497 -0
  66. data/vendor/assets/javascripts/webshims/shims/track-ui.js +3 -0
  67. data/vendor/assets/javascripts/webshims/shims/track.js +29 -29
  68. metadata +26 -125
  69. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +0 -1
  70. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +0 -1
  71. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +0 -1
  72. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +0 -1
  73. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +0 -1
  74. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +0 -1
  75. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  76. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -73
  77. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -49
  78. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +0 -1
  79. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +0 -1
  82. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -73
  83. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -49
  84. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +0 -1
  85. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +0 -1
  86. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +0 -1
  87. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +0 -1
  88. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +0 -1
  89. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +0 -1
  90. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +0 -1
  91. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +0 -1
  92. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +0 -1
  93. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +0 -1
  94. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +0 -1
  95. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +0 -1
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +0 -1
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +0 -1
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +0 -1
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +0 -1
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +0 -1
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +0 -1
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +0 -1
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +0 -1
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +0 -1
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +0 -1
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +0 -1
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +0 -1
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +0 -1
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +0 -1
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +0 -1
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +0 -1
  112. data/vendor/assets/javascripts/webshims/minified/shims/details.js +0 -1
  113. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +0 -1
  114. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +0 -1
  115. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +0 -1
  116. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +0 -1
  117. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +0 -1
  118. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +0 -1
  119. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +0 -1
  120. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +0 -1
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +0 -1
  122. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +0 -1
  123. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +0 -1
  124. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +0 -1
  125. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +0 -1
  126. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +0 -33
  127. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +0 -1
  128. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +0 -34
  129. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +0 -1
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +0 -1
  131. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +0 -1
  132. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +0 -1
  133. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +0 -1
  134. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +0 -1
  135. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +0 -1
  136. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +0 -1
  137. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +0 -1
  138. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +0 -1
  139. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +0 -1
  140. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +0 -1
  141. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -1
  142. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  143. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -87
  144. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +0 -1
  145. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +0 -1
  146. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +0 -1
  147. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +0 -1
  148. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +0 -1
  149. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  150. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  151. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  152. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +0 -1
  153. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  154. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  155. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  156. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +0 -1
  157. data/vendor/assets/javascripts/webshims/minified/shims/track.js +0 -1
  158. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  159. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  160. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2872
  161. data/vendor/assets/javascripts/webshims/shims/combos/25.js +0 -2376
  162. data/vendor/assets/javascripts/webshims/shims/combos/26.js +0 -3009
  163. data/vendor/assets/javascripts/webshims/shims/combos/27.js +0 -4150
  164. data/vendor/assets/javascripts/webshims/shims/combos/59.js +0 -1747
  165. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -1
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -87
  168. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +0 -972
@@ -1,1105 +1,500 @@
1
- //DOM-Extension helper
2
- jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
3
- "use strict";
4
- //shortcus
5
- var modules = webshims.modules;
6
- var listReg = /\s*,\s*/;
7
-
8
- //proxying attribute
9
- var olds = {};
10
- var havePolyfill = {};
11
- var extendedProps = {};
12
- var extendQ = {};
13
- var modifyProps = {};
14
-
15
- var oldVal = $.fn.val;
16
- var singleVal = function(elem, name, val, pass, _argless){
17
- return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
18
- };
1
+ /*! SWFMini - a SWFObject 2.2 cut down version for webshims
2
+ *
3
+ * based on SWFObject v2.2 <http://code.google.com/p/swfobject/>
4
+ is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
5
+ */
6
+
7
+ var swfmini = function() {
19
8
 
20
- $.fn.onTrigger = function(evt, fn){
21
- return this.on(evt, fn).each(fn);
22
- };
9
+ var UNDEF = "undefined",
10
+ OBJECT = "object",
11
+ webshims = jQuery.webshims,
12
+ SHOCKWAVE_FLASH = "Shockwave Flash",
13
+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
14
+ FLASH_MIME_TYPE = "application/x-shockwave-flash",
15
+
16
+ win = window,
17
+ doc = document,
18
+ nav = navigator,
19
+
20
+ plugin = false,
21
+ domLoadFnArr = [main],
22
+ objIdArr = [],
23
+ listenersArr = [],
24
+ storedAltContent,
25
+ storedAltContentId,
26
+ storedCallbackFn,
27
+ storedCallbackObj,
28
+ isDomLoaded = false,
29
+ dynamicStylesheet,
30
+ dynamicStylesheetMedia,
31
+ autoHideShow = true,
23
32
 
24
- $.fn.val = function(val){
25
- var elem = this[0];
26
- if(arguments.length && val == null){
27
- val = '';
28
- }
29
- if(!arguments.length){
30
- if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
31
- return $.prop(elem, 'value', val, 'val', true);
32
- }
33
- if($.isArray(val)){
34
- return oldVal.apply(this, arguments);
33
+ /* Centralized function for browser feature detection
34
+ - User agent string detection is only used when no good alternative is possible
35
+ - Is executed directly for optimal performance
36
+ */
37
+ ua = function() {
38
+ var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
39
+ u = nav.userAgent.toLowerCase(),
40
+ p = nav.platform.toLowerCase(),
41
+ windows = p ? /win/.test(p) : /win/.test(u),
42
+ mac = p ? /mac/.test(p) : /mac/.test(u),
43
+ webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
44
+ ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
45
+ playerVersion = [0,0,0],
46
+ d = null;
47
+ if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
48
+ d = nav.plugins[SHOCKWAVE_FLASH].description;
49
+ if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
50
+ plugin = true;
51
+ ie = false; // cascaded feature detection for Internet Explorer
52
+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
53
+ playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
54
+ playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
55
+ playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
56
+ }
35
57
  }
36
- var isFunction = $.isFunction(val);
37
- return this.each(function(i){
38
- elem = this;
39
- if(elem.nodeType === 1){
40
- if(isFunction){
41
- var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
42
- if(genVal == null){
43
- genVal = '';
58
+ else if (typeof win.ActiveXObject != UNDEF) {
59
+ try {
60
+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
61
+ if (a) { // a will return null when ActiveX is disabled
62
+ d = a.GetVariable("$version");
63
+ if (d) {
64
+ ie = true; // cascaded feature detection for Internet Explorer
65
+ d = d.split(" ")[1].split(",");
66
+ playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
44
67
  }
45
- $.prop(elem, 'value', genVal, 'val') ;
46
- } else {
47
- $.prop(elem, 'value', val, 'val');
48
68
  }
49
69
  }
50
- });
51
- };
70
+ catch(e) {}
71
+ }
72
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
73
+ }();
52
74
 
53
- var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
54
- var elementData = function(elem, key, val){
55
- elem = elem.jquery ? elem[0] : elem;
56
- if(!elem){return val || {};}
57
- var data = $.data(elem, dataID);
58
- if(val !== undefined){
59
- if(!data){
60
- data = $.data(elem, dataID, {});
61
- }
62
- if(key){
63
- data[key] = val;
64
- }
75
+
76
+ function callDomLoadFunctions() {
77
+ if (isDomLoaded) { return; }
78
+ try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
79
+ var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
80
+ t.parentNode.removeChild(t);
81
+ }
82
+ catch (e) { return; }
83
+ isDomLoaded = true;
84
+ var dl = domLoadFnArr.length;
85
+ for (var i = 0; i < dl; i++) {
86
+ domLoadFnArr[i]();
87
+ }
88
+ }
89
+
90
+ function addDomLoadEvent(fn) {
91
+ if (isDomLoaded) {
92
+ fn();
93
+ }
94
+ else {
95
+ domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
65
96
  }
97
+ }
98
+
99
+ /* Cross-browser onload
100
+ - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
101
+ - Will fire an event as soon as a web page including all of its assets are loaded
102
+ */
103
+ function addLoadEvent(fn) {
66
104
 
67
- return key ? data && data[key] : data;
68
- };
69
-
70
-
71
- [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
72
- $.fn[data.name] = function(){
73
- return this.map(function(){
74
- var shadowData = elementData(this, 'shadowData');
75
- return shadowData && shadowData[data.prop] || this;
76
- });
77
- };
78
- });
105
+ }
79
106
 
107
+ /* Main function
108
+ - Will preferably execute onDomLoad, otherwise onload (as a fallback)
109
+ */
110
+ function main() {
111
+ if (plugin) {
112
+ testPlayerVersion();
113
+ }
114
+ }
80
115
 
81
- ['removeAttr', 'prop', 'attr'].forEach(function(type){
82
- olds[type] = $[type];
83
- $[type] = function(elem, name, value, pass, _argless){
84
- var isVal = (pass == 'val');
85
- var oldMethod = !isVal ? olds[type] : singleVal;
86
- if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
87
- return oldMethod(elem, name, value, pass, _argless);
88
- }
89
-
90
- var nodeName = (elem.nodeName || '').toLowerCase();
91
- var desc = extendedProps[nodeName];
92
- var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
93
- var propMethod;
94
- var oldValMethod;
95
- var ret;
96
-
97
-
98
- if(!desc){
99
- desc = extendedProps['*'];
100
- }
101
- if(desc){
102
- desc = desc[name];
103
- }
104
-
105
- if(desc){
106
- propMethod = desc[curType];
107
- }
108
-
109
- if(propMethod){
110
- if(name == 'value'){
111
- oldValMethod = propMethod.isVal;
112
- propMethod.isVal = isVal;
113
- }
114
- if(curType === 'removeAttr'){
115
- return propMethod.value.call(elem);
116
- } else if(value === undefined){
117
- return (propMethod.get) ?
118
- propMethod.get.call(elem) :
119
- propMethod.value
120
- ;
121
- } else if(propMethod.set) {
122
- if(type == 'attr' && value === true){
123
- value = name;
116
+ /* Detect the Flash Player version for non-Internet Explorer browsers
117
+ - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
118
+ a. Both release and build numbers can be detected
119
+ b. Avoid wrong descriptions by corrupt installers provided by Adobe
120
+ c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
121
+ - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
122
+ */
123
+ function testPlayerVersion() {
124
+ var b = doc.getElementsByTagName("body")[0];
125
+ var o = createElement(OBJECT);
126
+ o.setAttribute("type", FLASH_MIME_TYPE);
127
+ var t = b.appendChild(o);
128
+ if (t) {
129
+ var counter = 0;
130
+ (function(){
131
+ if (typeof t.GetVariable != UNDEF) {
132
+ var d = t.GetVariable("$version");
133
+ if (d) {
134
+ d = d.split(" ")[1].split(",");
135
+ ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
124
136
  }
125
-
126
- ret = propMethod.set.call(elem, value);
127
137
  }
128
- if(name == 'value'){
129
- propMethod.isVal = oldValMethod;
138
+ else if (counter < 10) {
139
+ counter++;
140
+ setTimeout(arguments.callee, 10);
141
+ return;
130
142
  }
131
- } else {
132
- ret = oldMethod(elem, name, value, pass, _argless);
133
- }
134
- if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
135
-
136
- var boolValue;
137
- if(curType == 'removeAttr'){
138
- boolValue = false;
139
- } else if(curType == 'prop'){
140
- boolValue = !!(value);
141
- } else {
142
- boolValue = true;
143
+ b.removeChild(o);
144
+ t = null;
145
+ })();
146
+ }
147
+ }
148
+
149
+
150
+ function getObjectById(objectIdStr) {
151
+ var r = null;
152
+ var o = getElementById(objectIdStr);
153
+ if (o && o.nodeName == "OBJECT") {
154
+ if (typeof o.SetVariable != UNDEF) {
155
+ r = o;
156
+ }
157
+ else {
158
+ var n = o.getElementsByTagName(OBJECT)[0];
159
+ if (n) {
160
+ r = n;
143
161
  }
144
-
145
- modifyProps[nodeName][name].forEach(function(fn){
146
- if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
147
- fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
148
- }
149
- });
150
- }
151
- return ret;
152
- };
153
-
154
- extendQ[type] = function(nodeName, prop, desc){
155
-
156
- if(!extendedProps[nodeName]){
157
- extendedProps[nodeName] = {};
158
- }
159
- if(!extendedProps[nodeName][prop]){
160
- extendedProps[nodeName][prop] = {};
161
162
  }
162
- var oldDesc = extendedProps[nodeName][prop][type];
163
- var getSup = function(propType, descriptor, oDesc){
164
- if(descriptor && descriptor[propType]){
165
- return descriptor[propType];
166
- }
167
- if(oDesc && oDesc[propType]){
168
- return oDesc[propType];
169
- }
170
- if(type == 'prop' && prop == 'value'){
171
- return function(value){
172
- var elem = this;
173
- return (desc.isVal) ?
174
- singleVal(elem, prop, value, false, (arguments.length === 0)) :
175
- olds[type](elem, prop, value)
176
- ;
177
- };
178
- }
179
- if(type == 'prop' && propType == 'value' && desc.value.apply){
180
- return function(value){
181
- var sup = olds[type](this, prop);
182
- if(sup && sup.apply){
183
- sup = sup.apply(this, arguments);
184
- }
185
- return sup;
186
- };
163
+ }
164
+ return r;
165
+ }
166
+
167
+
168
+ /* Functions to abstract and display alternative content
169
+ */
170
+ function displayAltContent(obj) {
171
+ if (ua.ie && ua.win && obj.readyState != 4) {
172
+ // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
173
+ // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
174
+ var el = createElement("div");
175
+ obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
176
+ el.parentNode.replaceChild(abstractAltContent(obj), el);
177
+ obj.style.display = "none";
178
+ (function(){
179
+ if (obj.readyState == 4) {
180
+ obj.parentNode.removeChild(obj);
187
181
  }
188
- return function(value){
189
- return olds[type](this, prop, value);
190
- };
191
- };
192
- extendedProps[nodeName][prop][type] = desc;
193
- if(desc.value === undefined){
194
- if(!desc.set){
195
- desc.set = desc.writeable ?
196
- getSup('set', desc, oldDesc) :
197
- (webshims.cfg.useStrict && prop == 'prop') ?
198
- function(){throw(prop +' is readonly on '+ nodeName);} :
199
- $.noop
200
- ;
182
+ else {
183
+ setTimeout(arguments.callee, 10);
201
184
  }
202
- if(!desc.get){
203
- desc.get = getSup('get', desc, oldDesc);
185
+ })();
186
+ }
187
+ else {
188
+ obj.parentNode.replaceChild(abstractAltContent(obj), obj);
189
+ }
190
+ }
191
+
192
+ function abstractAltContent(obj) {
193
+ var ac = createElement("div");
194
+ if (ua.win && ua.ie) {
195
+ ac.innerHTML = obj.innerHTML;
196
+ }
197
+ else {
198
+ var nestedObj = obj.getElementsByTagName(OBJECT)[0];
199
+ if (nestedObj) {
200
+ var c = nestedObj.childNodes;
201
+ if (c) {
202
+ var cl = c.length;
203
+ for (var i = 0; i < cl; i++) {
204
+ if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
205
+ ac.appendChild(c[i].cloneNode(true));
206
+ }
207
+ }
204
208
  }
205
-
206
209
  }
207
-
208
- ['value', 'get', 'set'].forEach(function(descProp){
209
- if(desc[descProp]){
210
- desc['_sup'+descProp] = getSup(descProp, oldDesc);
211
- }
212
- });
213
- };
214
-
215
- });
210
+ }
211
+ return ac;
212
+ }
216
213
 
217
- //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
218
- var isExtendNativeSave = Modernizr.ES5;
219
- var extendNativeValue = (function(){
220
- var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
221
- var has = Object.prototype.hasOwnProperty;
222
- return function(nodeName, prop, desc){
223
- var elem;
224
- var elemProto;
225
- if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
226
- var sup = elem[prop];
227
- desc._supvalue = function(){
228
- if(sup && sup.apply){
229
- return sup.apply(this, arguments);
214
+ /* Cross-browser dynamic SWF creation
215
+ */
216
+ function createSWF(attObj, parObj, id) {
217
+ var r, el = getElementById(id);
218
+ if (ua.wk && ua.wk < 312) { return r; }
219
+ if (el) {
220
+ if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
221
+ attObj.id = id;
222
+ }
223
+ if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
224
+ var att = "";
225
+ for (var i in attObj) {
226
+ if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
227
+ if (i.toLowerCase() == "data") {
228
+ parObj.movie = attObj[i];
229
+ }
230
+ else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
231
+ att += ' class="' + attObj[i] + '"';
232
+ }
233
+ else if (i.toLowerCase() != "classid") {
234
+ att += ' ' + i + '="' + attObj[i] + '"';
235
+ }
230
236
  }
231
- return sup;
232
- };
233
- elemProto[prop] = desc.value;
234
- } else {
235
- desc._supvalue = function(){
236
- var data = elementData(this, 'propValue');
237
- if(data && data[prop] && data[prop].apply){
238
- return data[prop].apply(this, arguments);
237
+ }
238
+ var par = "";
239
+ for (var j in parObj) {
240
+ if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
241
+ par += '<param name="' + j + '" value="' + parObj[j] + '" />';
239
242
  }
240
- return data && data[prop];
241
- };
242
- initProp.extendValue(nodeName, prop, desc.value);
243
- }
244
- desc.value._supvalue = desc._supvalue;
245
- };
246
- })();
247
-
248
- var initProp = (function(){
249
-
250
- var initProps = {};
251
-
252
- webshims.addReady(function(context, contextElem){
253
- var nodeNameCache = {};
254
- var getElementsByName = function(name){
255
- if(!nodeNameCache[name]){
256
- nodeNameCache[name] = $(context.getElementsByTagName(name));
257
- if(contextElem[0] && $.nodeName(contextElem[0], name)){
258
- nodeNameCache[name] = nodeNameCache[name].add(contextElem);
243
+ }
244
+ el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
245
+ objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
246
+ r = getElementById(attObj.id);
247
+ }
248
+ else { // well-behaving browsers
249
+ var o = createElement(OBJECT);
250
+ o.setAttribute("type", FLASH_MIME_TYPE);
251
+ for (var m in attObj) {
252
+ if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
253
+ if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
254
+ o.setAttribute("class", attObj[m]);
255
+ }
256
+ else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
257
+ o.setAttribute(m, attObj[m]);
258
+ }
259
259
  }
260
260
  }
261
- };
262
-
263
-
264
- $.each(initProps, function(name, fns){
265
- getElementsByName(name);
266
- if(!fns || !fns.forEach){
267
- webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
268
- return;
261
+ for (var n in parObj) {
262
+ if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
263
+ createObjParam(o, n, parObj[n]);
264
+ }
269
265
  }
270
- fns.forEach(function(fn){
271
- nodeNameCache[name].each(fn);
272
- });
273
- });
274
- nodeNameCache = null;
275
- });
276
-
277
- var tempCache;
278
- var emptyQ = $([]);
279
- var createNodeNameInit = function(nodeName, fn){
280
- if(!initProps[nodeName]){
281
- initProps[nodeName] = [fn];
282
- } else {
283
- initProps[nodeName].push(fn);
284
- }
285
- if($.isDOMReady){
286
- (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
266
+ el.parentNode.replaceChild(o, el);
267
+ r = o;
287
268
  }
288
- };
289
-
290
- var elementExtends = {};
291
- return {
292
- createTmpCache: function(nodeName){
293
- if($.isDOMReady){
294
- tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
295
- }
296
- return tempCache || emptyQ;
297
- },
298
- flushTmpCache: function(){
299
- tempCache = null;
300
- },
301
- content: function(nodeName, prop){
302
- createNodeNameInit(nodeName, function(){
303
- var val = $.attr(this, prop);
304
- if(val != null){
305
- $.attr(this, prop, val);
269
+ }
270
+ return r;
271
+ }
272
+
273
+ function createObjParam(el, pName, pValue) {
274
+ var p = createElement("param");
275
+ p.setAttribute("name", pName);
276
+ p.setAttribute("value", pValue);
277
+ el.appendChild(p);
278
+ }
279
+
280
+ /* Cross-browser SWF removal
281
+ - Especially needed to safely and completely remove a SWF in Internet Explorer
282
+ */
283
+ function removeSWF(id) {
284
+ var obj = getElementById(id);
285
+ if (obj && obj.nodeName == "OBJECT") {
286
+ if (ua.ie && ua.win) {
287
+ obj.style.display = "none";
288
+ (function(){
289
+ if (obj.readyState == 4) {
290
+ removeObjectInIE(id);
306
291
  }
307
- });
308
- },
309
- createElement: function(nodeName, fn){
310
- createNodeNameInit(nodeName, fn);
311
- },
312
- extendValue: function(nodeName, prop, value){
313
- createNodeNameInit(nodeName, function(){
314
- $(this).each(function(){
315
- var data = elementData(this, 'propValue', {});
316
- data[prop] = this[prop];
317
- this[prop] = value;
318
- });
319
- });
292
+ else {
293
+ setTimeout(arguments.callee, 10);
294
+ }
295
+ })();
296
+ }
297
+ else {
298
+ obj.parentNode.removeChild(obj);
320
299
  }
321
- };
322
- })();
323
-
324
- var createPropDefault = function(descs, removeType){
325
- if(descs.defaultValue === undefined){
326
- descs.defaultValue = '';
327
300
  }
328
- if(!descs.removeAttr){
329
- descs.removeAttr = {
330
- value: function(){
331
- descs[removeType || 'prop'].set.call(this, descs.defaultValue);
332
- descs.removeAttr._supvalue.call(this);
301
+ }
302
+
303
+ function removeObjectInIE(id) {
304
+ var obj = getElementById(id);
305
+ if (obj) {
306
+ for (var i in obj) {
307
+ if (typeof obj[i] == "function") {
308
+ obj[i] = null;
333
309
  }
334
- };
310
+ }
311
+ obj.parentNode.removeChild(obj);
335
312
  }
336
- if(!descs.attr){
337
- descs.attr = {};
313
+ }
314
+
315
+ /* Functions to optimize JavaScript compression
316
+ */
317
+ function getElementById(id) {
318
+ var el = null;
319
+ try {
320
+ el = doc.getElementById(id);
338
321
  }
339
- };
322
+ catch (e) {}
323
+ return el;
324
+ }
325
+
326
+ function createElement(el) {
327
+ return doc.createElement(el);
328
+ }
329
+
330
+ /* Updated attachEvent function for Internet Explorer
331
+ - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
332
+ */
333
+ function addListener(target, eventType, fn) {
334
+ target.attachEvent(eventType, fn);
335
+ listenersArr[listenersArr.length] = [target, eventType, fn];
336
+ }
337
+
338
+ /* Flash Player and SWF content version matching
339
+ */
340
+ function hasPlayerVersion(rv) {
341
+ var pv = ua.pv, v = rv.split(".");
342
+ v[0] = parseInt(v[0], 10);
343
+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
344
+ v[2] = parseInt(v[2], 10) || 0;
345
+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
346
+ }
340
347
 
341
- $.extend(webshims, {
348
+
349
+
350
+ function setVisibility(id, isVisible) {
351
+ if (!autoHideShow) { return; }
352
+ var elem;
353
+ var v = isVisible ? "visible" : "hidden";
354
+ if (isDomLoaded && (elem && getElementById(id))) {
355
+ getElementById(id).style.visibility = v;
356
+ }
357
+ }
342
358
 
343
- getID: (function(){
344
- var ID = new Date().getTime();
345
- return function(elem){
346
- elem = $(elem);
347
- var id = elem.attr('id');
348
- if(!id){
349
- ID++;
350
- id = 'ID-'+ ID;
351
- elem.attr('id', id);
359
+ /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
360
+ */
361
+ var cleanup = function() {
362
+ if (ua.ie && ua.win && window.attachEvent) {
363
+ window.attachEvent("onunload", function() {
364
+ // remove listeners to avoid memory leaks
365
+ var ll = listenersArr.length;
366
+ for (var i = 0; i < ll; i++) {
367
+ listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
352
368
  }
353
- return id;
354
- };
355
- })(),
356
- extendUNDEFProp: function(obj, props){
357
- $.each(props, function(name, prop){
358
- if( !(name in obj) ){
359
- obj[name] = prop;
369
+ // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
370
+ var il = objIdArr.length;
371
+ for (var j = 0; j < il; j++) {
372
+ removeSWF(objIdArr[j]);
360
373
  }
361
- });
362
- },
363
- //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
364
- createPropDefault: createPropDefault,
365
- data: elementData,
366
- moveToFirstEvent: function(elem, eventType, bindType){
367
- var events = ($._data(elem, 'events') || {})[eventType];
368
- var fn;
369
-
370
- if(events && events.length > 1){
371
- fn = events.pop();
372
- if(!bindType){
373
- bindType = 'bind';
374
+ // cleanup library's main closures to avoid memory leaks
375
+ for (var k in ua) {
376
+ ua[k] = null;
374
377
  }
375
- if(bindType == 'bind' && events.delegateCount){
376
- events.splice( events.delegateCount, 0, fn);
377
- } else {
378
- events.unshift( fn );
378
+ ua = null;
379
+ for (var l in swfmini) {
380
+ swfmini[l] = null;
379
381
  }
380
-
381
-
382
+ swfmini = null;
383
+ });
384
+ }
385
+ }();
386
+
387
+ webshims.ready('DOM', callDomLoadFunctions);
388
+
389
+ return {
390
+ /* Public API
391
+ - Reference: http://code.google.com/p/swfobject/wiki/documentation
392
+ */
393
+ registerObject: function() {
394
+
395
+ },
396
+
397
+ getObjectById: function(objectIdStr) {
398
+ if (ua.w3) {
399
+ return getObjectById(objectIdStr);
382
400
  }
383
- elem = null;
384
401
  },
385
- addShadowDom: (function(){
386
- var resizeTimer;
387
- var lastHeight;
388
- var lastWidth;
389
-
390
- var docObserve = {
391
- init: false,
392
- runs: 0,
393
- test: function(){
394
- var height = docObserve.getHeight();
395
- var width = docObserve.getWidth();
396
-
397
- if(height != docObserve.height || width != docObserve.width){
398
- docObserve.height = height;
399
- docObserve.width = width;
400
- docObserve.handler({type: 'docresize'});
401
- docObserve.runs++;
402
- if(docObserve.runs < 9){
403
- setTimeout(docObserve.test, 90);
404
- }
405
- } else {
406
- docObserve.runs = 0;
407
- }
408
- },
409
- handler: function(e){
410
- clearTimeout(resizeTimer);
411
- resizeTimer = setTimeout(function(){
412
- if(e.type == 'resize'){
413
- var width = $(window).width();
414
- var height = $(window).width();
415
- if(height == lastHeight && width == lastWidth){
416
- return;
417
- }
418
- lastHeight = height;
419
- lastWidth = width;
420
-
421
- docObserve.height = docObserve.getHeight();
422
- docObserve.width = docObserve.getWidth();
423
-
402
+
403
+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
404
+ var callbackObj = {success:false, id:replaceElemIdStr};
405
+ if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
406
+ setVisibility(replaceElemIdStr, false);
407
+ addDomLoadEvent(function() {
408
+ widthStr += ""; // auto-convert to string
409
+ heightStr += "";
410
+ var att = {};
411
+ if (attObj && typeof attObj === OBJECT) {
412
+ for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
413
+ att[i] = attObj[i];
424
414
  }
425
- $(document).triggerHandler('updateshadowdom');
426
- }, (e.type == 'resize') ? 50 : 9);
427
- },
428
- _create: function(){
429
- $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
430
- var body = document.body;
431
- var doc = document.documentElement;
432
- docObserve[type] = function(){
433
- return Math.max(
434
- body[ "scroll" + name ], doc[ "scroll" + name ],
435
- body[ "offset" + name ], doc[ "offset" + name ],
436
- doc[ "client" + name ]
437
- );
438
- };
439
- });
440
- },
441
- start: function(){
442
- if(!this.init && document.body){
443
- this.init = true;
444
- this._create();
445
- this.height = docObserve.getHeight();
446
- this.width = docObserve.getWidth();
447
- setInterval(this.test, 600);
448
- $(this.test);
449
- webshims.ready('WINDOWLOAD', this.test);
450
- $(window).bind('resize', this.handler);
451
- (function(){
452
- var oldAnimate = $.fn.animate;
453
- var animationTimer;
454
-
455
- $.fn.animate = function(){
456
- clearTimeout(animationTimer);
457
- animationTimer = setTimeout(function(){
458
- docObserve.test();
459
- }, 99);
460
-
461
- return oldAnimate.apply(this, arguments);
462
- };
463
- })();
464
- }
465
- }
466
- };
467
-
468
-
469
- webshims.docObserve = function(){
470
- webshims.ready('DOM', function(){
471
- docObserve.start();
472
- });
473
- };
474
- return function(nativeElem, shadowElem, opts){
475
- opts = opts || {};
476
- if(nativeElem.jquery){
477
- nativeElem = nativeElem[0];
478
- }
479
- if(shadowElem.jquery){
480
- shadowElem = shadowElem[0];
481
- }
482
- var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
483
- var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
484
- var shadowFocusElementData = {};
485
- if(!opts.shadowFocusElement){
486
- opts.shadowFocusElement = shadowElem;
487
- } else if(opts.shadowFocusElement){
488
- if(opts.shadowFocusElement.jquery){
489
- opts.shadowFocusElement = opts.shadowFocusElement[0];
490
415
  }
491
- shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
492
- }
493
-
494
- nativeData.hasShadow = shadowElem;
495
- shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
496
- shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
497
- nativeElement: nativeElem,
498
- shadowElement: shadowElem,
499
- shadowFocusElement: opts.shadowFocusElement
500
- };
501
- if(opts.shadowChilds){
502
- opts.shadowChilds.each(function(){
503
- elementData(this, 'shadowData', shadowData.shadowData);
504
- });
505
- }
506
-
507
- if(opts.data){
508
- shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
509
- }
510
- opts = null;
511
- webshims.docObserve();
512
- };
513
- })(),
514
- propTypes: {
515
- standard: function(descs, name){
516
- createPropDefault(descs);
517
- if(descs.prop){return;}
518
- descs.prop = {
519
- set: function(val){
520
- descs.attr.set.call(this, ''+val);
521
- },
522
- get: function(){
523
- return descs.attr.get.call(this) || descs.defaultValue;
524
- }
525
- };
526
-
527
- },
528
- "boolean": function(descs, name){
529
-
530
- createPropDefault(descs);
531
- if(descs.prop){return;}
532
- descs.prop = {
533
- set: function(val){
534
- if(val){
535
- descs.attr.set.call(this, "");
536
- } else {
537
- descs.removeAttr.value.call(this);
416
+ att.data = swfUrlStr;
417
+ att.width = widthStr;
418
+ att.height = heightStr;
419
+ var par = {};
420
+ if (parObj && typeof parObj === OBJECT) {
421
+ for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
422
+ par[j] = parObj[j];
538
423
  }
539
- },
540
- get: function(){
541
- return descs.attr.get.call(this) != null;
542
424
  }
543
- };
544
- },
545
- "src": (function(){
546
- var anchor = document.createElement('a');
547
- anchor.style.display = "none";
548
- return function(descs, name){
549
-
550
- createPropDefault(descs);
551
- if(descs.prop){return;}
552
- descs.prop = {
553
- set: function(val){
554
- descs.attr.set.call(this, val);
555
- },
556
- get: function(){
557
- var href = this.getAttribute(name);
558
- var ret;
559
- if(href == null){return '';}
560
-
561
- anchor.setAttribute('href', href+'' );
562
-
563
- if(!$.support.hrefNormalized){
564
- try {
565
- $(anchor).insertAfter(this);
566
- ret = anchor.getAttribute('href', 4);
567
- } catch(er){
568
- ret = anchor.getAttribute('href', 4);
569
- }
570
- $(anchor).detach();
425
+ if (flashvarsObj && typeof flashvarsObj === OBJECT) {
426
+ for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
427
+ if (typeof par.flashvars != UNDEF) {
428
+ par.flashvars += "&" + k + "=" + flashvarsObj[k];
571
429
  }
572
- return ret || anchor.href;
573
- }
574
- };
575
- };
576
- })(),
577
- enumarated: function(descs, name){
578
-
579
- createPropDefault(descs);
580
- if(descs.prop){return;}
581
- descs.prop = {
582
- set: function(val){
583
- descs.attr.set.call(this, val);
584
- },
585
- get: function(){
586
- var val = (descs.attr.get.call(this) || '').toLowerCase();
587
- if(!val || descs.limitedTo.indexOf(val) == -1){
588
- val = descs.defaultValue;
430
+ else {
431
+ par.flashvars = k + "=" + flashvarsObj[k];
589
432
  }
590
- return val;
591
- }
592
- };
593
- }
594
-
595
- // ,unsignedLong: $.noop
596
- // ,"doubble": $.noop
597
- // ,"long": $.noop
598
- // ,tokenlist: $.noop
599
- // ,settableTokenlist: $.noop
600
- },
601
- reflectProperties: function(nodeNames, props){
602
- if(typeof props == 'string'){
603
- props = props.split(listReg);
604
- }
605
- props.forEach(function(prop){
606
- webshims.defineNodeNamesProperty(nodeNames, prop, {
607
- prop: {
608
- set: function(val){
609
- $.attr(this, prop, val);
610
- },
611
- get: function(){
612
- return $.attr(this, prop) || '';
613
433
  }
614
434
  }
615
- });
616
- });
617
- },
618
- defineNodeNameProperty: function(nodeName, prop, descs){
619
- havePolyfill[prop] = true;
620
-
621
- if(descs.reflect){
622
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
623
- }
624
-
625
- ['prop', 'attr', 'removeAttr'].forEach(function(type){
626
- var desc = descs[type];
627
- if(desc){
628
- if(type === 'prop'){
629
- desc = $.extend({writeable: true}, desc);
630
- } else {
631
- desc = $.extend({}, desc, {writeable: true});
435
+ if (hasPlayerVersion(swfVersionStr)) { // create SWF
436
+ var obj = createSWF(att, par, replaceElemIdStr);
437
+ if (att.id == replaceElemIdStr) {
438
+ setVisibility(replaceElemIdStr, true);
439
+ }
440
+ callbackObj.success = true;
441
+ callbackObj.ref = obj;
632
442
  }
633
-
634
- extendQ[type](nodeName, prop, desc);
635
- if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
636
- extendNativeValue(nodeName, prop, desc);
443
+ else { // show alternative content
444
+ setVisibility(replaceElemIdStr, true);
637
445
  }
638
- descs[type] = desc;
639
- }
640
- });
641
- if(descs.initAttr){
642
- initProp.content(nodeName, prop);
446
+ if (callbackFn) { callbackFn(callbackObj); }
447
+ });
643
448
  }
644
- return descs;
449
+ else if (callbackFn) { callbackFn(callbackObj); }
645
450
  },
646
451
 
647
- defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
648
- var olddesc;
649
- for(var prop in descs){
650
- if(!_noTmpCache && descs[prop].initAttr){
651
- initProp.createTmpCache(name);
652
- }
653
- if(propType){
654
- if(descs[prop][propType]){
655
- //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
656
- } else {
657
- descs[prop][propType] = {};
658
- ['value', 'set', 'get'].forEach(function(copyProp){
659
- if(copyProp in descs[prop]){
660
- descs[prop][propType][copyProp] = descs[prop][copyProp];
661
- delete descs[prop][copyProp];
662
- }
663
- });
664
- }
665
- }
666
- descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
667
- }
668
- if(!_noTmpCache){
669
- initProp.flushTmpCache();
670
- }
671
- return descs;
452
+ switchOffAutoHideShow: function() {
453
+ autoHideShow = false;
672
454
  },
673
455
 
674
- createElement: function(nodeName, create, descs){
675
- var ret;
676
- if($.isFunction(create)){
677
- create = {
678
- after: create
679
- };
680
- }
681
- initProp.createTmpCache(nodeName);
682
- if(create.before){
683
- initProp.createElement(nodeName, create.before);
684
- }
685
- if(descs){
686
- ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
456
+ ua: ua,
457
+
458
+ getFlashPlayerVersion: function() {
459
+ return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
460
+ },
461
+
462
+ hasFlashPlayerVersion: hasPlayerVersion,
463
+
464
+ createSWF: function(attObj, parObj, replaceElemIdStr) {
465
+ if (ua.w3) {
466
+ return createSWF(attObj, parObj, replaceElemIdStr);
687
467
  }
688
- if(create.after){
689
- initProp.createElement(nodeName, create.after);
468
+ else {
469
+ return undefined;
690
470
  }
691
- initProp.flushTmpCache();
692
- return ret;
693
471
  },
694
- onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
695
- if(typeof nodeNames == 'string'){
696
- nodeNames = nodeNames.split(listReg);
697
- }
698
- if($.isFunction(desc)){
699
- desc = {set: desc};
472
+
473
+ showExpressInstall: function() {
474
+
475
+ },
476
+
477
+ removeSWF: function(objElemIdStr) {
478
+ if (ua.w3) {
479
+ removeSWF(objElemIdStr);
700
480
  }
481
+ },
482
+
483
+ createCSS: function() {
701
484
 
702
- nodeNames.forEach(function(name){
703
- if(!modifyProps[name]){
704
- modifyProps[name] = {};
705
- }
706
- if(typeof props == 'string'){
707
- props = props.split(listReg);
708
- }
709
- if(desc.initAttr){
710
- initProp.createTmpCache(name);
711
- }
712
- props.forEach(function(prop){
713
- if(!modifyProps[name][prop]){
714
- modifyProps[name][prop] = [];
715
- havePolyfill[prop] = true;
716
- }
717
- if(desc.set){
718
- if(only){
719
- desc.set.only = only;
720
- }
721
- modifyProps[name][prop].push(desc.set);
722
- }
723
-
724
- if(desc.initAttr){
725
- initProp.content(name, prop);
726
- }
727
- });
728
- initProp.flushTmpCache();
729
-
730
- });
731
- },
732
- defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
733
- if(!descs){
734
- descs = {};
735
- }
736
- if($.isFunction(descs)){
737
- descs.set = descs;
738
- }
739
- webshims.defineNodeNamesProperty(elementNames, prop, {
740
- attr: {
741
- set: function(val){
742
- this.setAttribute(prop, val);
743
- if(descs.set){
744
- descs.set.call(this, true);
745
- }
746
- },
747
- get: function(){
748
- var ret = this.getAttribute(prop);
749
- return (ret == null) ? undefined : prop;
750
- }
751
- },
752
- removeAttr: {
753
- value: function(){
754
- this.removeAttribute(prop);
755
- if(descs.set){
756
- descs.set.call(this, false);
757
- }
758
- }
759
- },
760
- reflect: true,
761
- propType: 'boolean',
762
- initAttr: descs.initAttr || false
763
- });
764
- },
765
- contentAttr: function(elem, name, val){
766
- if(!elem.nodeName){return;}
767
- var attr;
768
- if(val === undefined){
769
- attr = (elem.attributes[name] || {});
770
- val = attr.specified ? attr.value : null;
771
- return (val == null) ? undefined : val;
772
- }
773
-
774
- if(typeof val == 'boolean'){
775
- if(!val){
776
- elem.removeAttribute(name);
777
- } else {
778
- elem.setAttribute(name, name);
779
- }
780
- } else {
781
- elem.setAttribute(name, val);
782
- }
783
485
  },
784
486
 
785
- // set current Lang:
786
- // - webshims.activeLang(lang:string);
787
- // get current lang
788
- // - webshims.activeLang();
789
- // get current lang
790
- // webshims.activeLang({
791
- // register: moduleName:string,
792
- // callback: callback:function
793
- // });
794
- // get/set including removeLang
795
- // - webshims.activeLang({
796
- // module: moduleName:string,
797
- // callback: callback:function,
798
- // langObj: languageObj:array/object
799
- // });
800
- activeLang: (function(){
801
- var callbacks = [];
802
- var registeredCallbacks = {};
803
- var currentLang;
804
- var shortLang;
805
- var notLocal = /:\/\/|^\.*\//;
806
- var loadRemoteLang = function(data, lang, options){
807
- var langSrc;
808
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
809
- data.loading = true;
810
- langSrc = options.langSrc;
811
- if(!notLocal.test(langSrc)){
812
- langSrc = webshims.cfg.basePath+langSrc;
813
- }
814
- webshims.loader.loadScript(langSrc+lang+'.js', function(){
815
- if(data.langObj[lang]){
816
- data.loading = false;
817
- callLang(data, true);
818
- } else {
819
- $(function(){
820
- if(data.langObj[lang]){
821
- callLang(data, true);
822
- }
823
- data.loading = false;
824
- });
825
- }
826
- });
827
- return true;
828
- }
829
- return false;
830
- };
831
- var callRegister = function(module){
832
- if(registeredCallbacks[module]){
833
- registeredCallbacks[module].forEach(function(data){
834
- data.callback();
835
- });
836
- }
837
- };
838
- var callLang = function(data, _noLoop){
839
- if(data.activeLang != currentLang && data.activeLang !== shortLang){
840
- var options = modules[data.module].options;
841
- if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
842
- data.activeLang = currentLang;
843
- data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
844
- callRegister(data.module);
845
- } else if( !_noLoop &&
846
- !loadRemoteLang(data, currentLang, options) &&
847
- !loadRemoteLang(data, shortLang, options) &&
848
- data.langObj[''] && data.activeLang !== '' ) {
849
- data.activeLang = '';
850
- data.callback(data.langObj[''], currentLang);
851
- callRegister(data.module);
852
- }
853
- }
854
- };
855
-
856
-
857
- var activeLang = function(lang){
858
-
859
- if(typeof lang == 'string' && lang !== currentLang){
860
- currentLang = lang;
861
- shortLang = currentLang.split('-')[0];
862
- if(currentLang == shortLang){
863
- shortLang = false;
864
- }
865
- $.each(callbacks, function(i, data){
866
- callLang(data);
867
- });
868
- } else if(typeof lang == 'object'){
869
-
870
- if(lang.register){
871
- if(!registeredCallbacks[lang.register]){
872
- registeredCallbacks[lang.register] = [];
873
- }
874
- registeredCallbacks[lang.register].push(lang);
875
- lang.callback();
876
- } else {
877
- if(!lang.activeLang){
878
- lang.activeLang = '';
879
- }
880
- callbacks.push(lang);
881
- callLang(lang);
882
- }
883
- }
884
- return currentLang;
885
- };
487
+ addDomLoadEvent: addDomLoadEvent,
488
+
489
+ addLoadEvent: addLoadEvent,
490
+
491
+
492
+ // For internal usage only
493
+ expressInstallCallback: function() {
886
494
 
887
- return activeLang;
888
- })()
889
- });
890
-
891
- $.each({
892
- defineNodeNamesProperty: 'defineNodeNameProperty',
893
- defineNodeNamesProperties: 'defineNodeNameProperties',
894
- createElements: 'createElement'
895
- }, function(name, baseMethod){
896
- webshims[name] = function(names, a, b, c){
897
- if(typeof names == 'string'){
898
- names = names.split(listReg);
899
- }
900
- var retDesc = {};
901
- names.forEach(function(nodeName){
902
- retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
903
- });
904
- return retDesc;
905
- };
906
- });
907
-
908
- webshims.isReady('webshimLocalization', true);
909
- });
910
- //html5a11y
911
- (function($, document){
912
- //if we support basic styleing or do not support ARIA (assumed) abort
913
- if(!Modernizr.localstorage || ('hidden' in document.createElement('a'))){return;}
914
-
915
- var elemMappings = {
916
- article: "article",
917
- aside: "complementary",
918
- section: "region",
919
- nav: "navigation",
920
- address: "contentinfo"
921
- };
922
- var addRole = function(elem, role){
923
- var hasRole = elem.getAttribute('role');
924
- if (!hasRole) {
925
- elem.setAttribute('role', role);
926
- }
927
- };
928
-
929
- $.webshims.addReady(function(context, contextElem){
930
- $.each(elemMappings, function(name, role){
931
- var elems = $(name, context).add(contextElem.filter(name));
932
- for (var i = 0, len = elems.length; i < len; i++) {
933
- addRole(elems[i], role);
934
- }
935
- });
936
- if (context === document) {
937
- var header = document.getElementsByTagName('header')[0];
938
- var footers = document.getElementsByTagName('footer');
939
- var footerLen = footers.length;
940
- if (header && !$(header).closest('section, article')[0]) {
941
- addRole(header, 'banner');
942
- }
943
- if (!footerLen) {
944
- return;
945
- }
946
- var footer = footers[footerLen - 1];
947
- if (!$(footer).closest('section, article')[0]) {
948
- addRole(footer, 'contentinfo');
949
- }
950
- }
951
- });
952
-
953
- })(jQuery, document);
954
-
955
- jQuery.webshims.register('details', function($, webshims, window, doc, undefined, options){
956
- var isInterActiveSummary = function(summary){
957
- var details = $(summary).parent('details');
958
- if(details[0] && details.children(':first').get(0) === summary){
959
- return details;
960
- }
961
- };
962
-
963
- var bindDetailsSummary = function(summary, details){
964
- summary = $(summary);
965
- details = $(details);
966
- var oldSummary = $.data(details[0], 'summaryElement');
967
- $.data(summary[0], 'detailsElement', details);
968
- if(!oldSummary || summary[0] !== oldSummary[0]){
969
- if(oldSummary){
970
- if(oldSummary.hasClass('fallback-summary')){
971
- oldSummary.remove();
972
- } else {
973
- oldSummary
974
- .unbind('.summaryPolyfill')
975
- .removeData('detailsElement')
976
- .removeAttr('role')
977
- .removeAttr('tabindex')
978
- .removeAttr('aria-expanded')
979
- .removeClass('summary-button')
980
- .find('span.details-open-indicator')
981
- .remove()
982
- ;
983
- }
984
- }
985
- $.data(details[0], 'summaryElement', summary);
986
- details.prop('open', details.prop('open'));
987
495
  }
988
496
  };
989
- var getSummary = function(details){
990
- var summary = $.data(details, 'summaryElement');
991
- if(!summary){
992
- summary = $('> summary:first-child', details);
993
- if(!summary[0]){
994
- $(details).prependPolyfill('<summary class="fallback-summary">'+ options.text +'</summary>');
995
- summary = $.data(details, 'summaryElement');
996
- } else {
997
- bindDetailsSummary(summary, details);
998
- }
999
- }
1000
- return summary;
1001
- };
1002
-
1003
- // var isOriginalPrevented = function(e){
1004
- // var src = e.originalEvent;
1005
- // if(!src){return e.isDefaultPrevented();}
1006
- //
1007
- // return src.defaultPrevented || src.returnValue === false ||
1008
- // src.getPreventDefault && src.getPreventDefault();
1009
- // };
1010
-
1011
- webshims.createElement('summary', function(){
1012
- var details = isInterActiveSummary(this);
1013
- if(!details || $.data(this, 'detailsElement')){return;}
1014
- var timer;
1015
- var stopNativeClickTest;
1016
- var tabindex = $.attr(this, 'tabIndex') || '0';
1017
- bindDetailsSummary(this, details);
1018
- $(this)
1019
- .on({
1020
- 'focus.summaryPolyfill': function(){
1021
- $(this).addClass('summary-has-focus');
1022
- },
1023
- 'blur.summaryPolyfill': function(){
1024
- $(this).removeClass('summary-has-focus');
1025
- },
1026
- 'mouseenter.summaryPolyfill': function(){
1027
- $(this).addClass('summary-has-hover');
1028
- },
1029
- 'mouseleave.summaryPolyfill': function(){
1030
- $(this).removeClass('summary-has-hover');
1031
- },
1032
- 'click.summaryPolyfill': function(e){
1033
- var details = isInterActiveSummary(this);
1034
- if(details){
1035
- if(!stopNativeClickTest && e.originalEvent){
1036
- stopNativeClickTest = true;
1037
- e.stopImmediatePropagation();
1038
- e.preventDefault();
1039
- $(this).trigger('click');
1040
- stopNativeClickTest = false;
1041
- return false;
1042
- } else {
1043
- clearTimeout(timer);
1044
-
1045
- timer = setTimeout(function(){
1046
- if(!e.isDefaultPrevented()){
1047
- details.prop('open', !details.prop('open'));
1048
- }
1049
- }, 0);
1050
- }
1051
- }
1052
- },
1053
- 'keydown.summaryPolyfill': function(e){
1054
- if( (e.keyCode == 13 || e.keyCode == 32) && !e.isDefaultPrevented()){
1055
- stopNativeClickTest = true;
1056
- e.preventDefault();
1057
- $(this).trigger('click');
1058
- stopNativeClickTest = false;
1059
- }
1060
- }
1061
- })
1062
- .attr({tabindex: tabindex, role: 'button'})
1063
- .prepend('<span class="details-open-indicator" />')
1064
- ;
1065
- webshims.moveToFirstEvent(this, 'click');
1066
- });
1067
-
1068
- var initDetails;
1069
- webshims.defineNodeNamesBooleanProperty('details', 'open', function(val){
1070
- var summary = $($.data(this, 'summaryElement'));
1071
- if(!summary){return;}
1072
- var action = (val) ? 'removeClass' : 'addClass';
1073
- var details = $(this);
1074
- if (!initDetails && options.animate){
1075
- details.stop().css({width: '', height: ''});
1076
- var start = {
1077
- width: details.width(),
1078
- height: details.height()
1079
- };
1080
- }
1081
- summary.attr('aria-expanded', ''+val);
1082
- details[action]('closed-details-summary').children().not(summary[0])[action]('closed-details-child');
1083
- if(!initDetails && options.animate){
1084
- var end = {
1085
- width: details.width(),
1086
- height: details.height()
1087
- };
1088
- details.css(start).animate(end, {
1089
- complete: function(){
1090
- $(this).css({width: '', height: ''});
1091
- }
1092
- });
1093
- }
1094
-
1095
- });
1096
- webshims.createElement('details', function(){
1097
- initDetails = true;
1098
- var summary = getSummary(this);
1099
- $.prop(this, 'open', $.prop(this, 'open'));
1100
- initDetails = false;
1101
- });
1102
- });
497
+ }();
1103
498
 
1104
499
  (function($, Modernizr, webshims){
1105
500
  "use strict";
@@ -1116,7 +511,7 @@ jQuery.webshims.register('details', function($, webshims, window, doc, undefined
1116
511
  });
1117
512
  };
1118
513
  var options = webshims.cfg.mediaelement;
1119
- var swfType = options && options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris';
514
+ var swfType = 'mediaelement-jaris';
1120
515
  var hasSwf;
1121
516
  if(!options){
1122
517
  webshims.error("mediaelement wasn't implemented but loaded");
@@ -1141,34 +536,44 @@ jQuery.webshims.register('details', function($, webshims, window, doc, undefined
1141
536
  }
1142
537
 
1143
538
  if(hasNative && !options.preferFlash){
539
+ var noSwitch = {
540
+ 1: 1,
541
+ 2: 1
542
+ };
1144
543
  var switchOptions = function(e){
544
+ var media;
1145
545
  var parent = e.target.parentNode;
1146
- if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
1147
- webshims.ready('DOM mediaelement', function(){
1148
- if(hasSwf){
546
+ if(!options.preferFlash &&
547
+ ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) &&
548
+ (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')]
549
+ ){
550
+ $(function(){
551
+ if(hasSwf && !options.preferFlash){
1149
552
  loadSwf();
553
+ webshims.ready('WINDOWLOAD '+swfType, function(){
554
+ setTimeout(function(){
555
+ if(!options.preferFlash && webshims.mediaelement.createSWF && !media.is('.nonnative-api-active')){
556
+ options.preferFlash = true;
557
+ document.removeEventListener('error', switchOptions, true);
558
+ $('audio, video').each(function(){
559
+ webshims.mediaelement.selectSource(this);
560
+ });
561
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
562
+ }
563
+ }, 9);
564
+ });
565
+ } else{
566
+ document.removeEventListener('error', switchOptions, true);
1150
567
  }
1151
- webshims.ready('WINDOWLOAD '+swfType, function(){
1152
- setTimeout(function(){
1153
- if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
1154
- options.preferFlash = true;
1155
- document.removeEventListener('error', switchOptions, true);
1156
- $('audio, video').each(function(){
1157
- webshims.mediaelement.selectSource(this);
1158
- });
1159
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
1160
- } else if(!hasSwf){
1161
- document.removeEventListener('error', switchOptions, true);
1162
- }
1163
- }, 20);
1164
- });
1165
568
  });
1166
569
  }
1167
570
  };
1168
571
  document.addEventListener('error', switchOptions, true);
1169
572
  $('audio, video').each(function(){
1170
- if(this.error){
573
+ var error = $.prop(this, 'error');
574
+ if(error && !noSwitch[error]){
1171
575
  switchOptions({target: this});
576
+ return false;
1172
577
  }
1173
578
  });
1174
579
  }
@@ -1203,6 +608,7 @@ jQuery.webshims.register('details', function($, webshims, window, doc, undefined
1203
608
  } else {
1204
609
  webshims.info("track support was overwritten. due to bad browser support");
1205
610
  }
611
+ return false;
1206
612
  }
1207
613
  };
1208
614
  var detectTrackError = function(){
@@ -1226,7 +632,7 @@ jQuery.webshims.register('details', function($, webshims, window, doc, undefined
1226
632
  }
1227
633
 
1228
634
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
1229
- hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
635
+ hasSwf = swfmini.hasFlashPlayerVersion('9.0.115');
1230
636
  $('html').addClass(hasSwf ? 'swf' : 'no-swf');
1231
637
  var mediaelement = webshims.mediaelement;
1232
638
  mediaelement.parseRtmp = function(data){
@@ -1319,7 +725,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1319
725
  loaded = true;
1320
726
  webshims.loader.loadScript("https://www.youtube.com/player_api");
1321
727
  $(function(){
1322
- webshims.polyfill("mediaelement-yt");
728
+ webshims._polyfill(["mediaelement-yt"]);
1323
729
  });
1324
730
  };
1325
731
  })();
@@ -1443,7 +849,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1443
849
  });
1444
850
  };
1445
851
 
1446
- mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'jwplayer/jwplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
852
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
1447
853
 
1448
854
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
1449
855
  var ret = '';
@@ -1468,11 +874,12 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1468
874
  if(hasNative){
1469
875
  mediaElem = $(mediaElem);
1470
876
  var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
1471
- if(!nativeCanPlayType[nodeName]){return ret;}
877
+ var nativeCanPlay = (nativeCanPlayType[nodeName] || {prop: {_supvalue: false}}).prop._supvalue || mediaElem[0].canPlayType;
878
+ if(!nativeCanPlay){return ret;}
1472
879
  srces = srces || mediaelement.srces(mediaElem);
1473
880
 
1474
881
  $.each(srces, function(i, src){
1475
- if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
882
+ if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
1476
883
  ret = src;
1477
884
  return false;
1478
885
  }
@@ -1487,7 +894,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1487
894
  }
1488
895
 
1489
896
  $(elem).pause().data('mediaerror', message);
1490
- webshims.warn('mediaelementError: '+ message);
897
+ webshims.error('mediaelementError: '+ message);
1491
898
  setTimeout(function(){
1492
899
  if($(elem).data('mediaerror')){
1493
900
  $(elem).trigger('mediaerror');
@@ -1561,6 +968,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1561
968
  };
1562
969
  mediaelement.selectSource = selectSource;
1563
970
 
971
+
1564
972
  $(document).on('ended', function(e){
1565
973
  var data = webshims.data(e.target, 'mediaelement');
1566
974
  if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
@@ -1570,121 +978,141 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1570
978
  }, 1);
1571
979
 
1572
980
  });
1573
- if(!supportsLoop){
1574
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
1575
- }
1576
981
 
1577
- ['audio', 'video'].forEach(function(nodeName){
1578
- var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
1579
- prop: {
1580
- value: function(){
1581
- var data = webshims.data(this, 'mediaelement');
1582
- selectSource(this, data);
1583
- if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
1584
- supLoad.prop._supvalue.apply(this, arguments);
982
+ webshims.ready('dom-support', function(){
983
+ if(!supportsLoop){
984
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
985
+ }
986
+
987
+ ['audio', 'video'].forEach(function(nodeName){
988
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
989
+ prop: {
990
+ value: function(){
991
+ var data = webshims.data(this, 'mediaelement');
992
+ selectSource(this, data);
993
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
994
+ supLoad.prop._supvalue.apply(this, arguments);
995
+ }
1585
996
  }
1586
997
  }
1587
- }
1588
- });
1589
- nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
1590
- prop: {
1591
- value: function(type){
1592
- var ret = '';
1593
- if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
1594
- ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
1595
- if(ret == 'no'){
1596
- ret = '';
998
+ });
999
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
1000
+ prop: {
1001
+ value: function(type){
1002
+ var ret = '';
1003
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
1004
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
1005
+ if(ret == 'no'){
1006
+ ret = '';
1007
+ }
1597
1008
  }
1598
- }
1599
- if(!ret && hasSwf){
1600
- type = $.trim((type || '').split(';')[0]);
1601
- if(mediaelement.swfMimeTypes.indexOf(type) != -1){
1602
- ret = 'maybe';
1009
+ if(!ret && hasSwf){
1010
+ type = $.trim((type || '').split(';')[0]);
1011
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
1012
+ ret = 'maybe';
1013
+ }
1603
1014
  }
1015
+ return ret;
1604
1016
  }
1605
- return ret;
1606
1017
  }
1018
+ });
1019
+ });
1020
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
1021
+ set: function(){
1022
+ var elem = this;
1023
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
1024
+ clearTimeout(baseData.loadTimer);
1025
+ baseData.loadTimer = setTimeout(function(){
1026
+ selectSource(elem);
1027
+ elem = null;
1028
+ }, 9);
1607
1029
  }
1608
1030
  });
1609
1031
  });
1610
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
1611
- set: function(){
1612
- var elem = this;
1613
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
1614
- clearTimeout(baseData.loadTimer);
1615
- baseData.loadTimer = setTimeout(function(){
1616
- selectSource(elem);
1617
- elem = null;
1618
- }, 9);
1619
- }
1620
- });
1621
1032
 
1622
1033
  var initMediaElements = function(){
1623
-
1624
- webshims.addReady(function(context, insertedElement){
1625
- var media = $('video, audio', context)
1626
- .add(insertedElement.filter('video, audio'))
1627
- .each(function(){
1628
- var data = webshims.data(this, 'mediaelement');
1629
-
1630
- if(hasNative && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])') && (!data || data.isActive == 'html5')){
1631
- //IE controls not visible bug
1632
- $(this).prop('preload', 'metadata').mediaLoad();
1633
- } else {
1634
- selectSource(this, data);
1635
- }
1034
+ var testFixMedia = function(){
1035
+ if(webshims.implement(this, 'mediaelement')){
1036
+ selectSource(this);
1037
+
1038
+ if(hasNative){
1039
+ var bufferTimer;
1040
+ var lastBuffered;
1041
+ var elem = this;
1042
+ var getBufferedString = function(){
1043
+ var buffered = $.prop(elem, 'buffered');
1044
+ if(!buffered){return;}
1045
+ var bufferString = "";
1046
+ for(var i = 0, len = buffered.length; i < len;i++){
1047
+ bufferString += buffered.end(i);
1048
+ }
1049
+ return bufferString;
1050
+ };
1051
+ var testBuffer = function(){
1052
+ var buffered = getBufferedString();
1053
+ if(buffered != lastBuffered){
1054
+ lastBuffered = buffered;
1055
+ $(elem).triggerHandler('progress');
1056
+ }
1057
+ };
1636
1058
 
1637
- if(hasNative){
1638
-
1639
- //FF progress bug
1640
- (function(){
1641
- var bufferTimer;
1642
- var lastBuffered;
1643
- var elem = this;
1644
- var getBufferedString = function(){
1645
- var buffered = $.prop(elem, 'buffered');
1646
- if(!buffered){return;}
1647
- var bufferString = "";
1648
- for(var i = 0, len = buffered.length; i < len;i++){
1649
- bufferString += buffered.end(i);
1059
+ $(this)
1060
+ .on({
1061
+ 'play loadstart progress': function(e){
1062
+ if(e.type == 'progress'){
1063
+ lastBuffered = getBufferedString();
1650
1064
  }
1651
- return bufferString;
1652
- };
1653
- var testBuffer = function(){
1654
- var buffered = getBufferedString();
1655
- if(buffered != lastBuffered){
1656
- lastBuffered = buffered;
1657
- $(elem).triggerHandler('progress');
1065
+ clearTimeout(bufferTimer);
1066
+ bufferTimer = setTimeout(testBuffer, 999);
1067
+ },
1068
+ 'emptied stalled mediaerror abort suspend': function(e){
1069
+ if(e.type == 'emptied'){
1070
+ lastBuffered = false;
1658
1071
  }
1659
- };
1660
-
1661
- $(this)
1662
- .on({
1663
- 'play loadstart progress': function(e){
1664
- if(e.type == 'progress'){
1665
- lastBuffered = getBufferedString();
1666
- }
1667
- clearTimeout(bufferTimer);
1668
- bufferTimer = setTimeout(testBuffer, 999);
1669
- },
1670
- 'emptied stalled mediaerror abort suspend': function(e){
1671
- if(e.type == 'emptied'){
1672
- lastBuffered = false;
1673
- }
1674
- clearTimeout(bufferTimer);
1675
- }
1676
- })
1677
- ;
1678
- })();
1072
+ clearTimeout(bufferTimer);
1073
+ }
1074
+ })
1075
+ ;
1076
+ if('ActiveXObject' in window && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay],.nonnative-api-active)')){
1077
+ $(this).prop('preload', 'metadata').mediaLoad();
1679
1078
  }
1680
-
1681
- })
1682
- ;
1683
- if(!loadTrackUi.loaded && $('track', media).length){
1684
- loadTrackUi();
1079
+ }
1685
1080
  }
1686
- media = null;
1081
+
1082
+ };
1083
+ var handleMedia = false;
1084
+
1085
+
1086
+ webshims.ready('dom-support', function(){
1087
+ handleMedia = true;
1088
+ webshims.addReady(function(context, insertedElement){
1089
+ var media = $('video, audio', context)
1090
+ .add(insertedElement.filter('video, audio'))
1091
+ .each(testFixMedia)
1092
+ ;
1093
+ if(!loadTrackUi.loaded && $('track', media).length){
1094
+ loadTrackUi();
1095
+ }
1096
+ media = null;
1097
+ });
1687
1098
  });
1099
+
1100
+ if(hasNative && !handleMedia){
1101
+ webshims.addReady(function(context, insertedElement){
1102
+ if(!handleMedia){
1103
+ $('video, audio', context)
1104
+ .add(insertedElement.filter('video, audio'))
1105
+ .each(function(){
1106
+ if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){
1107
+ loadThird();
1108
+ handleMedia = true;
1109
+ return false;
1110
+ }
1111
+ })
1112
+ ;
1113
+ }
1114
+ });
1115
+ }
1688
1116
  };
1689
1117
 
1690
1118
  if(Modernizr.track && !bugs.track){
@@ -1704,4 +1132,822 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1704
1132
  }
1705
1133
  webshims.ready('WINDOWLOAD mediaelement', loadTrackUi);
1706
1134
  });
1707
- })(jQuery, Modernizr, jQuery.webshims);
1135
+ })(jQuery, Modernizr, jQuery.webshims);
1136
+ jQuery.webshims.register('track', function($, webshims, window, document, undefined){
1137
+ "use strict";
1138
+ var mediaelement = webshims.mediaelement;
1139
+ var id = new Date().getTime();
1140
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
1141
+ //descriptions are not really shown, but they are inserted into the dom
1142
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
1143
+ var notImplemented = function(){
1144
+ webshims.error('not implemented yet');
1145
+ };
1146
+ var dummyTrack = $('<track />');
1147
+ var supportTrackMod = Modernizr.ES5 && Modernizr.objectAccessor;
1148
+ var createEventTarget = function(obj){
1149
+ var eventList = {};
1150
+ obj.addEventListener = function(name, fn){
1151
+ if(eventList[name]){
1152
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
1153
+ }
1154
+ eventList[name] = fn;
1155
+
1156
+ };
1157
+ obj.removeEventListener = function(name, fn){
1158
+ if(eventList[name] && eventList[name] != fn){
1159
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
1160
+ }
1161
+ if(eventList[name]){
1162
+ delete eventList[name];
1163
+ }
1164
+ };
1165
+ return obj;
1166
+ };
1167
+
1168
+ var cueListProto = {
1169
+ getCueById: function(id){
1170
+ var cue = null;
1171
+ for(var i = 0, len = this.length; i < len; i++){
1172
+ if(this[i].id === id){
1173
+ cue = this[i];
1174
+ break;
1175
+ }
1176
+ }
1177
+ return cue;
1178
+ }
1179
+ };
1180
+ var numericModes = {
1181
+ 0: 'disabled',
1182
+ 1: 'hidden',
1183
+ 2: 'showing'
1184
+ };
1185
+
1186
+ var textTrackProto = {
1187
+ shimActiveCues: null,
1188
+ _shimActiveCues: null,
1189
+ activeCues: null,
1190
+ cues: null,
1191
+ kind: 'subtitles',
1192
+ label: '',
1193
+ language: '',
1194
+ mode: 'disabled',
1195
+ readyState: 0,
1196
+ oncuechange: null,
1197
+ toString: function() {
1198
+ return "[object TextTrack]";
1199
+ },
1200
+ addCue: function(cue){
1201
+ if(!this.cues){
1202
+ this.cues = mediaelement.createCueList();
1203
+ } else {
1204
+ var lastCue = this.cues[this.cues.length-1];
1205
+ if(lastCue && lastCue.startTime > cue.startTime){
1206
+ webshims.error("cue startTime higher than previous cue's startTime");
1207
+ }
1208
+ }
1209
+ if(cue.track && cue.track.removeCue){
1210
+ cue.track.removeCue(cue);
1211
+ }
1212
+ cue.track = this;
1213
+ this.cues.push(cue);
1214
+ },
1215
+ //ToDo: make it more dynamic
1216
+ removeCue: function(cue){
1217
+ var cues = this.cues || [];
1218
+ var i = 0;
1219
+ var len = cues.length;
1220
+ if(cue.track != this){
1221
+ webshims.error("cue not part of track");
1222
+ return;
1223
+ }
1224
+ for(; i < len; i++){
1225
+ if(cues[i] === cue){
1226
+ cues.splice(i, 1);
1227
+ cue.track = null;
1228
+ break;
1229
+ }
1230
+ }
1231
+ if(cue.track){
1232
+ webshims.error("cue not part of track");
1233
+ return;
1234
+ }
1235
+ },
1236
+ DISABLED: 'disabled',
1237
+ OFF: 'disabled',
1238
+ HIDDEN: 'hidden',
1239
+ SHOWING: 'showing',
1240
+ ERROR: 3,
1241
+ LOADED: 2,
1242
+ LOADING: 1,
1243
+ NONE: 0
1244
+ };
1245
+ var copyProps = ['kind', 'label', 'srclang'];
1246
+ var copyName = {srclang: 'language'};
1247
+
1248
+ var owns = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
1249
+
1250
+ var updateMediaTrackList = function(baseData, trackList){
1251
+ var removed = [];
1252
+ var added = [];
1253
+ var newTracks = [];
1254
+ var i, len;
1255
+ if(!baseData){
1256
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
1257
+ }
1258
+
1259
+ if(!trackList){
1260
+ baseData.blockTrackListUpdate = true;
1261
+ trackList = $.prop(this, 'textTracks');
1262
+ baseData.blockTrackListUpdate = false;
1263
+ }
1264
+
1265
+ clearTimeout(baseData.updateTrackListTimer);
1266
+
1267
+ $('track', this).each(function(){
1268
+ var track = $.prop(this, 'track');
1269
+ newTracks.push(track);
1270
+ if(trackList.indexOf(track) == -1){
1271
+ added.push(track);
1272
+ }
1273
+ });
1274
+
1275
+ if(baseData.scriptedTextTracks){
1276
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
1277
+ newTracks.push(baseData.scriptedTextTracks[i]);
1278
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
1279
+ added.push(baseData.scriptedTextTracks[i]);
1280
+ }
1281
+ }
1282
+ }
1283
+
1284
+ for(i = 0, len = trackList.length; i < len; i++){
1285
+ if(newTracks.indexOf(trackList[i]) == -1){
1286
+ removed.push(trackList[i]);
1287
+ }
1288
+ }
1289
+
1290
+ if(removed.length || added.length){
1291
+ trackList.splice(0);
1292
+
1293
+ for(i = 0, len = newTracks.length; i < len; i++){
1294
+ trackList.push(newTracks[i]);
1295
+ }
1296
+ for(i = 0, len = removed.length; i < len; i++){
1297
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
1298
+ }
1299
+ for(i = 0, len = added.length; i < len; i++){
1300
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
1301
+ }
1302
+ if(baseData.scriptedTextTracks || removed.length){
1303
+ $(this).triggerHandler('updatetrackdisplay');
1304
+ }
1305
+ }
1306
+ };
1307
+
1308
+ var refreshTrack = function(track, trackData){
1309
+ if(!trackData){
1310
+ trackData = webshims.data(track, 'trackData');
1311
+ }
1312
+ if(trackData && !trackData.isTriggering){
1313
+ trackData.isTriggering = true;
1314
+ setTimeout(function(){
1315
+ if(!(trackData.track || {}).readyState){
1316
+ $(track).triggerHandler('checktrackmode');
1317
+ } else {
1318
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
1319
+ }
1320
+ trackData.isTriggering = false;
1321
+ }, 1);
1322
+ }
1323
+ };
1324
+
1325
+ var emptyDiv = $('<div />')[0];
1326
+ window.TextTrackCue = function(startTime, endTime, text){
1327
+ if(arguments.length != 3){
1328
+ webshims.error("wrong arguments.length for TextTrackCue.constructor");
1329
+ }
1330
+
1331
+ this.startTime = startTime;
1332
+ this.endTime = endTime;
1333
+ this.text = text;
1334
+
1335
+ this.id = "";
1336
+ this.pauseOnExit = false;
1337
+
1338
+ createEventTarget(this);
1339
+ };
1340
+
1341
+ window.TextTrackCue.prototype = {
1342
+
1343
+ onenter: null,
1344
+ onexit: null,
1345
+ pauseOnExit: false,
1346
+ getCueAsHTML: function(){
1347
+ var lastText = "";
1348
+ var parsedText = "";
1349
+ var fragment = document.createDocumentFragment();
1350
+ var fn;
1351
+ if(!owns(this, 'getCueAsHTML')){
1352
+ fn = this.getCueAsHTML = function(){
1353
+ var i, len;
1354
+ if(lastText != this.text){
1355
+ lastText = this.text;
1356
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
1357
+ emptyDiv.innerHTML = parsedText;
1358
+
1359
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
1360
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
1361
+ }
1362
+ }
1363
+ return fragment.cloneNode(true);
1364
+ };
1365
+
1366
+ }
1367
+ return fn ? fn.apply(this, arguments) : fragment.cloneNode(true);
1368
+ },
1369
+ track: null,
1370
+
1371
+
1372
+ id: ''
1373
+ //todo-->
1374
+ // ,
1375
+ // snapToLines: true,
1376
+ // line: 'auto',
1377
+ // size: 100,
1378
+ // position: 50,
1379
+ // vertical: '',
1380
+ // align: 'middle'
1381
+ };
1382
+
1383
+
1384
+
1385
+
1386
+
1387
+ mediaelement.createCueList = function(){
1388
+ return $.extend([], cueListProto);
1389
+ };
1390
+
1391
+ mediaelement.parseCueTextToHTML = (function(){
1392
+ var tagSplits = /(<\/?[^>]+>)/ig;
1393
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
1394
+ var regEnd = /\<\s*\//;
1395
+ var addToTemplate = function(localName, attribute, tag, html){
1396
+ var ret;
1397
+ if(regEnd.test(html)){
1398
+ ret = '</'+ localName +'>';
1399
+ } else {
1400
+ tag.splice(0, 1);
1401
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '&#34;')) +'">';
1402
+ }
1403
+ return ret;
1404
+ };
1405
+ var replacer = function(html){
1406
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
1407
+ if(tag[0]){
1408
+ tag[0] = tag[0].toLowerCase();
1409
+ if(allowedTags.test(tag[0])){
1410
+ if(tag[0] == 'c'){
1411
+ html = addToTemplate('span', 'class', tag, html);
1412
+ } else if(tag[0] == 'v'){
1413
+ html = addToTemplate('q', 'title', tag, html);
1414
+ }
1415
+ } else {
1416
+ html = "";
1417
+ }
1418
+ }
1419
+ return html;
1420
+ };
1421
+
1422
+ return function(cueText){
1423
+ return cueText.replace(tagSplits, replacer);
1424
+ };
1425
+ })();
1426
+
1427
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
1428
+ var loadEvents = 'play playing timeupdate updatetrackdisplay';
1429
+ var obj = trackData.track;
1430
+ var load = function(){
1431
+ var src = $.prop(track, 'src');
1432
+ var error;
1433
+ var ajax;
1434
+ if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
1435
+ $(mediaelem).unbind(loadEvents, load);
1436
+ $(track).unbind('checktrackmode', load);
1437
+ if(!obj.readyState){
1438
+ error = function(){
1439
+ obj.readyState = 3;
1440
+ obj.cues = null;
1441
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
1442
+ $(track).triggerHandler('error');
1443
+ };
1444
+ obj.readyState = 1;
1445
+ try {
1446
+ obj.cues = mediaelement.createCueList();
1447
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
1448
+ ajax = $.ajax({
1449
+ dataType: 'text',
1450
+ url: src,
1451
+ success: function(text){
1452
+ if(ajax.getResponseHeader('content-type') != 'text/vtt'){
1453
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
1454
+ }
1455
+ mediaelement.parseCaptions(text, obj, function(cues){
1456
+ if(cues && 'length' in cues){
1457
+ obj.readyState = 2;
1458
+ $(track).triggerHandler('load');
1459
+ $(mediaelem).triggerHandler('updatetrackdisplay');
1460
+ } else {
1461
+ error();
1462
+ }
1463
+ });
1464
+
1465
+ },
1466
+ error: error
1467
+ });
1468
+ } catch(er){
1469
+ error();
1470
+ webshims.warn(er);
1471
+ }
1472
+ }
1473
+ }
1474
+ };
1475
+ obj.readyState = 0;
1476
+ obj.shimActiveCues = null;
1477
+ obj._shimActiveCues = null;
1478
+ obj.activeCues = null;
1479
+ obj.cues = null;
1480
+ $(mediaelem).unbind(loadEvents, load);
1481
+ $(track).unbind('checktrackmode', load);
1482
+ $(mediaelem).on(loadEvents, load);
1483
+ $(track).on('checktrackmode', load);
1484
+ if(_default){
1485
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
1486
+ load();
1487
+ }
1488
+ };
1489
+
1490
+ mediaelement.createTextTrack = function(mediaelem, track){
1491
+ var obj, trackData;
1492
+ if(track.nodeName){
1493
+ trackData = webshims.data(track, 'trackData');
1494
+
1495
+ if(trackData){
1496
+ refreshTrack(track, trackData);
1497
+ obj = trackData.track;
1498
+ }
1499
+ }
1500
+
1501
+ if(!obj){
1502
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
1503
+
1504
+ if(!supportTrackMod){
1505
+ copyProps.forEach(function(copyProp){
1506
+ var prop = $.prop(track, copyProp);
1507
+ if(prop){
1508
+ obj[copyName[copyProp] || copyProp] = prop;
1509
+ }
1510
+ });
1511
+ }
1512
+
1513
+
1514
+ if(track.nodeName){
1515
+
1516
+ if(supportTrackMod){
1517
+ copyProps.forEach(function(copyProp){
1518
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1519
+ get: function(){
1520
+ return $.prop(track, copyProp);
1521
+ }
1522
+ });
1523
+ });
1524
+ }
1525
+
1526
+ trackData = webshims.data(track, 'trackData', {track: obj});
1527
+ mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
1528
+ } else {
1529
+ if(supportTrackMod){
1530
+ copyProps.forEach(function(copyProp){
1531
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1532
+ value: track[copyProp],
1533
+ writeable: false
1534
+ });
1535
+ });
1536
+ }
1537
+ obj.cues = mediaelement.createCueList();
1538
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
1539
+ obj.mode = 'hidden';
1540
+ obj.readyState = 2;
1541
+ }
1542
+ }
1543
+ return obj;
1544
+ };
1545
+
1546
+
1547
+ /*
1548
+ taken from:
1549
+ Captionator 0.5.1 [CaptionCrunch]
1550
+ Christopher Giffard, 2011
1551
+ Share and enjoy
1552
+
1553
+ https://github.com/cgiffard/Captionator
1554
+
1555
+ modified for webshims
1556
+ */
1557
+ mediaelement.parseCaptionChunk = (function(){
1558
+ // Set up timestamp parsers
1559
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
1560
+ var GoogleTimestampParser = /^([\d\.]+)\s+\+([\d\.]+)\s*(.*)/;
1561
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
1562
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
1563
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
1564
+
1565
+ return function(subtitleElement,objectCount){
1566
+ var cueDefaults = [];
1567
+
1568
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, cueSettings = "", id, specialCueData;
1569
+ var timestampMatch, tmpCue;
1570
+
1571
+ // WebVTT Special Cue Logic
1572
+ if ((specialCueData = WebVTTDEFAULTSCueParser.exec(subtitleElement))) {
1573
+ // cueDefaults = specialCueData.slice(2).join("");
1574
+ // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
1575
+ return null;
1576
+ } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
1577
+ return null;
1578
+ } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
1579
+ return null; // At this stage, we don't want to do anything with these.
1580
+ }
1581
+
1582
+ subtitleParts = subtitleElement.split(/\n/g);
1583
+
1584
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
1585
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
1586
+ subtitleParts.shift();
1587
+ }
1588
+
1589
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
1590
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
1591
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
1592
+ }
1593
+
1594
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
1595
+ var timestamp = subtitleParts[subtitlePartIndex];
1596
+
1597
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
1598
+
1599
+ // WebVTT
1600
+
1601
+ timeData = timestampMatch.slice(1);
1602
+
1603
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
1604
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
1605
+ parseInt((timeData[2]||0),10) + // Seconds
1606
+ parseFloat("0." + (timeData[3]||0)); // MS
1607
+
1608
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
1609
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
1610
+ parseInt((timeData[6]||0),10) + // Seconds
1611
+ parseFloat("0." + (timeData[7]||0)); // MS
1612
+ /*
1613
+ if (timeData[8]) {
1614
+ cueSettings = timeData[8];
1615
+ }
1616
+ */
1617
+ }
1618
+
1619
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
1620
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
1621
+ break;
1622
+ }
1623
+
1624
+ if (!timeIn && !timeOut) {
1625
+ // We didn't extract any time information. Assume the cue is invalid!
1626
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
1627
+ return null;
1628
+ }
1629
+ /*
1630
+ // Consolidate cue settings, convert defaults to object
1631
+ var compositeCueSettings =
1632
+ cueDefaults
1633
+ .reduce(function(previous,current,index,array){
1634
+ previous[current.split(":")[0]] = current.split(":")[1];
1635
+ return previous;
1636
+ },{});
1637
+
1638
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
1639
+ compositeCueSettings =
1640
+ cueSettings
1641
+ .split(/\s+/g)
1642
+ .filter(function(set) { return set && !!set.length; })
1643
+ // Convert array to a key/val object
1644
+ .reduce(function(previous,current,index,array){
1645
+ previous[current.split(":")[0]] = current.split(":")[1];
1646
+ return previous;
1647
+ },compositeCueSettings);
1648
+
1649
+ // Turn back into string like the TextTrackCue constructor expects
1650
+ cueSettings = "";
1651
+ for (var key in compositeCueSettings) {
1652
+ if (compositeCueSettings.hasOwnProperty(key)) {
1653
+ cueSettings += !!cueSettings.length ? " " : "";
1654
+ cueSettings += key + ":" + compositeCueSettings[key];
1655
+ }
1656
+ }
1657
+ */
1658
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
1659
+ html = subtitleParts.join("\n");
1660
+ tmpCue = new TextTrackCue(timeIn, timeOut, html);
1661
+ if(id){
1662
+ tmpCue.id = id;
1663
+ }
1664
+ return tmpCue;
1665
+ };
1666
+ })();
1667
+
1668
+ mediaelement.parseCaptions = function(captionData, track, complete) {
1669
+ var subtitles = mediaelement.createCueList();
1670
+ var cue, lazyProcess, regWevVTT;
1671
+ var startDate;
1672
+ var isWEBVTT;
1673
+ if (captionData) {
1674
+
1675
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
1676
+
1677
+ lazyProcess = function(i, len){
1678
+
1679
+ for(; i < len; i++){
1680
+ cue = captionData[i];
1681
+ if(regWevVTT.test(cue)){
1682
+ isWEBVTT = true;
1683
+ } else if(cue.replace(/\s*/ig,"").length){
1684
+ if(!isWEBVTT){
1685
+ webshims.error('please use WebVTT format. This is the standard');
1686
+ complete(null);
1687
+ break;
1688
+ }
1689
+ cue = mediaelement.parseCaptionChunk(cue, i);
1690
+ if(cue){
1691
+ track.addCue(cue);
1692
+ }
1693
+ }
1694
+ if(startDate < (new Date().getTime()) - 30){
1695
+ i++;
1696
+ setTimeout(function(){
1697
+ startDate = new Date().getTime();
1698
+ lazyProcess(i, len);
1699
+ }, 90);
1700
+
1701
+ break;
1702
+ }
1703
+ }
1704
+ if(i >= len){
1705
+ if(!isWEBVTT){
1706
+ webshims.error('please use WebVTT format. This is the standard');
1707
+ }
1708
+ complete(track.cues);
1709
+ }
1710
+ };
1711
+
1712
+ captionData = captionData.replace(/\r\n/g,"\n");
1713
+
1714
+ setTimeout(function(){
1715
+ captionData = captionData.replace(/\r/g,"\n");
1716
+ setTimeout(function(){
1717
+ startDate = new Date().getTime();
1718
+ captionData = captionData.split(/\n\n+/g);
1719
+ lazyProcess(0, captionData.length);
1720
+ }, 9);
1721
+ }, 9);
1722
+
1723
+ } else {
1724
+ webshims.error("Required parameter captionData not supplied.");
1725
+ }
1726
+ };
1727
+
1728
+
1729
+ mediaelement.createTrackList = function(mediaelem, baseData){
1730
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
1731
+ if(!baseData.textTracks){
1732
+ baseData.textTracks = [];
1733
+ webshims.defineProperties(baseData.textTracks, {
1734
+ onaddtrack: {value: null},
1735
+ onremovetrack: {value: null}
1736
+ });
1737
+ createEventTarget(baseData.textTracks);
1738
+ }
1739
+ return baseData.textTracks;
1740
+ };
1741
+
1742
+ if(!Modernizr.track){
1743
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
1744
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
1745
+
1746
+ webshims.defineNodeNameProperties('track', {
1747
+ src: {
1748
+ //attr: {},
1749
+ reflect: true,
1750
+ propType: 'src'
1751
+ }
1752
+ });
1753
+ }
1754
+
1755
+ webshims.defineNodeNameProperties('track', {
1756
+ kind: {
1757
+ attr: Modernizr.track ? {
1758
+ set: function(value){
1759
+ var trackData = webshims.data(this, 'trackData');
1760
+ this.setAttribute('data-kind', value);
1761
+ if(trackData){
1762
+ trackData.attrKind = value;
1763
+ }
1764
+ },
1765
+ get: function(){
1766
+ var trackData = webshims.data(this, 'trackData');
1767
+ if(trackData && ('attrKind' in trackData)){
1768
+ return trackData.attrKind;
1769
+ }
1770
+ return this.getAttribute('kind');
1771
+ }
1772
+ } : {},
1773
+ reflect: true,
1774
+ propType: 'enumarated',
1775
+ defaultValue: 'subtitles',
1776
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
1777
+ }
1778
+ });
1779
+
1780
+ $.each(copyProps, function(i, copyProp){
1781
+ var name = copyName[copyProp] || copyProp;
1782
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
1783
+ var trackData = webshims.data(this, 'trackData');
1784
+ var track = this;
1785
+ if(trackData){
1786
+ if(copyProp == 'kind'){
1787
+ refreshTrack(this, trackData);
1788
+ }
1789
+ if(!supportTrackMod){
1790
+ trackData.track[name] = $.prop(this, copyProp);
1791
+ }
1792
+ clearTimeout(trackData.changedTrackPropTimer);
1793
+ trackData.changedTrackPropTimer = setTimeout(function(){
1794
+ $(track).trigger('updatesubtitlestate');
1795
+ }, 1);
1796
+ }
1797
+ });
1798
+ });
1799
+
1800
+
1801
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
1802
+ if(val){
1803
+ var data = webshims.data(this, 'trackData');
1804
+ var media;
1805
+ if(data){
1806
+ media = $(this).closest('video, audio');
1807
+ if(media[0]){
1808
+ mediaelement.loadTextTrack(media, this, data);
1809
+ }
1810
+ }
1811
+ }
1812
+
1813
+ });
1814
+
1815
+ //
1816
+
1817
+ webshims.defineNodeNamesProperties(['track'], {
1818
+ ERROR: {
1819
+ value: 3
1820
+ },
1821
+ LOADED: {
1822
+ value: 2
1823
+ },
1824
+ LOADING: {
1825
+ value: 1
1826
+ },
1827
+ NONE: {
1828
+ value: 0
1829
+ },
1830
+ readyState: {
1831
+ get: function(){
1832
+ return ($.prop(this, 'track') || {readyState: 0}).readyState;
1833
+ },
1834
+ writeable: false
1835
+ },
1836
+ track: {
1837
+ get: function(){
1838
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
1839
+ },
1840
+ writeable: false
1841
+ }
1842
+ }, 'prop');
1843
+
1844
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
1845
+ textTracks: {
1846
+ get: function(){
1847
+ var media = this;
1848
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
1849
+ var tracks = mediaelement.createTrackList(media, baseData);
1850
+ if(!baseData.blockTrackListUpdate){
1851
+ updateMediaTrackList.call(media, baseData, tracks);
1852
+ }
1853
+ return tracks;
1854
+ },
1855
+ writeable: false
1856
+ },
1857
+ addTextTrack: {
1858
+ value: function(kind, label, lang){
1859
+ var textTrack = mediaelement.createTextTrack(this, {
1860
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
1861
+ label: label || '',
1862
+ srclang: lang || ''
1863
+ });
1864
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
1865
+ if (!baseData.scriptedTextTracks) {
1866
+ baseData.scriptedTextTracks = [];
1867
+ }
1868
+ baseData.scriptedTextTracks.push(textTrack);
1869
+ updateMediaTrackList.call(this);
1870
+ return textTrack;
1871
+ }
1872
+ }
1873
+ }, 'prop');
1874
+
1875
+
1876
+ $(document).on('emptied ended updatetracklist', function(e){
1877
+ if($(e.target).is('audio, video')){
1878
+ var baseData = webshims.data(e.target, 'mediaelementBase');
1879
+ if(baseData){
1880
+ clearTimeout(baseData.updateTrackListTimer);
1881
+ baseData.updateTrackListTimer = setTimeout(function(){
1882
+ updateMediaTrackList.call(e.target, baseData);
1883
+ }, 0);
1884
+ }
1885
+ }
1886
+ });
1887
+
1888
+ var getNativeReadyState = function(trackElem, textTrack){
1889
+ return textTrack.readyState || trackElem.readyState;
1890
+ };
1891
+ var stopOriginalEvent = function(e){
1892
+ if(e.originalEvent){
1893
+ e.stopImmediatePropagation();
1894
+ }
1895
+ };
1896
+ var startTrackImplementation = function(){
1897
+ if(webshims.implement(this, 'track')){
1898
+ var shimedTrack = $.prop(this, 'track');
1899
+ var origTrack = this.track;
1900
+ var kind;
1901
+ var readyState;
1902
+ if(origTrack){
1903
+ kind = $.prop(this, 'kind');
1904
+ readyState = getNativeReadyState(this, origTrack);
1905
+ if (origTrack.mode || readyState) {
1906
+ shimedTrack.mode = numericModes[origTrack.mode] || origTrack.mode;
1907
+ }
1908
+ //disable track from showing + remove UI
1909
+ if(kind != 'descriptions'){
1910
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
1911
+ this.kind = 'metadata';
1912
+ $(this).attr({kind: kind});
1913
+ }
1914
+
1915
+ }
1916
+ $(this).on('load error', stopOriginalEvent);
1917
+ }
1918
+ };
1919
+ webshims.addReady(function(context, insertedElement){
1920
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
1921
+ $('video, audio', context)
1922
+ .add(insertedMedia)
1923
+ .each(function(){
1924
+ updateMediaTrackList.call(this);
1925
+ })
1926
+ .each(function(){
1927
+ if(Modernizr.track){
1928
+ var shimedTextTracks = $.prop(this, 'textTracks');
1929
+ var origTextTracks = this.textTracks;
1930
+ if(shimedTextTracks.length != origTextTracks.length){
1931
+ webshims.error("textTracks couldn't be copied");
1932
+ }
1933
+
1934
+ $('track', this).each(startTrackImplementation);
1935
+ }
1936
+ })
1937
+ ;
1938
+ insertedMedia.each(function(){
1939
+ var media = this;
1940
+ var baseData = webshims.data(media, 'mediaelementBase');
1941
+ if(baseData){
1942
+ clearTimeout(baseData.updateTrackListTimer);
1943
+ baseData.updateTrackListTimer = setTimeout(function(){
1944
+ updateMediaTrackList.call(media, baseData);
1945
+ }, 9);
1946
+ }
1947
+ });
1948
+ });
1949
+
1950
+ if(Modernizr.track){
1951
+ $('video, audio').trigger('trackapichange');
1952
+ }
1953
+ });