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,6 +1,515 @@
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() {
8
+
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,
32
+
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
+ }
57
+ }
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)];
67
+ }
68
+ }
69
+ }
70
+ catch(e) {}
71
+ }
72
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
73
+ }();
74
+
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+
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) {
104
+
105
+ }
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
+ }
115
+
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)];
136
+ }
137
+ }
138
+ else if (counter < 10) {
139
+ counter++;
140
+ setTimeout(arguments.callee, 10);
141
+ return;
142
+ }
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;
161
+ }
162
+ }
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);
181
+ }
182
+ else {
183
+ setTimeout(arguments.callee, 10);
184
+ }
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
+ }
208
+ }
209
+ }
210
+ }
211
+ return ac;
212
+ }
213
+
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
+ }
236
+ }
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] + '" />';
242
+ }
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
+ }
260
+ }
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
+ }
265
+ }
266
+ el.parentNode.replaceChild(o, el);
267
+ r = o;
268
+ }
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);
291
+ }
292
+ else {
293
+ setTimeout(arguments.callee, 10);
294
+ }
295
+ })();
296
+ }
297
+ else {
298
+ obj.parentNode.removeChild(obj);
299
+ }
300
+ }
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;
309
+ }
310
+ }
311
+ obj.parentNode.removeChild(obj);
312
+ }
313
+ }
314
+
315
+ /* Functions to optimize JavaScript compression
316
+ */
317
+ function getElementById(id) {
318
+ var el = null;
319
+ try {
320
+ el = doc.getElementById(id);
321
+ }
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
+ }
347
+
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
+ }
358
+
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]);
368
+ }
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]);
373
+ }
374
+ // cleanup library's main closures to avoid memory leaks
375
+ for (var k in ua) {
376
+ ua[k] = null;
377
+ }
378
+ ua = null;
379
+ for (var l in swfmini) {
380
+ swfmini[l] = null;
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);
400
+ }
401
+ },
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];
414
+ }
415
+ }
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];
423
+ }
424
+ }
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];
429
+ }
430
+ else {
431
+ par.flashvars = k + "=" + flashvarsObj[k];
432
+ }
433
+ }
434
+ }
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;
442
+ }
443
+ else { // show alternative content
444
+ setVisibility(replaceElemIdStr, true);
445
+ }
446
+ if (callbackFn) { callbackFn(callbackObj); }
447
+ });
448
+ }
449
+ else if (callbackFn) { callbackFn(callbackObj); }
450
+ },
451
+
452
+ switchOffAutoHideShow: function() {
453
+ autoHideShow = false;
454
+ },
455
+
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);
467
+ }
468
+ else {
469
+ return undefined;
470
+ }
471
+ },
472
+
473
+ showExpressInstall: function() {
474
+
475
+ },
476
+
477
+ removeSWF: function(objElemIdStr) {
478
+ if (ua.w3) {
479
+ removeSWF(objElemIdStr);
480
+ }
481
+ },
482
+
483
+ createCSS: function() {
484
+
485
+ },
486
+
487
+ addDomLoadEvent: addDomLoadEvent,
488
+
489
+ addLoadEvent: addLoadEvent,
490
+
491
+
492
+ // For internal usage only
493
+ expressInstallCallback: function() {
494
+
495
+ }
496
+ };
497
+ }();
498
+
1
499
  //DOM-Extension helper
2
500
  jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
3
501
  "use strict";
502
+
503
+ webshims.assumeARIA = Modernizr.localstorage || Modernizr.video || Modernizr.boxsizing;
504
+
505
+ if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
506
+ webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
507
+ }
508
+
509
+ if(!$.parseHTML){
510
+ webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
511
+ }
512
+
4
513
  //shortcus
5
514
  var modules = webshims.modules;
6
515
  var listReg = /\s*,\s*/;
@@ -17,10 +526,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
17
526
  return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
18
527
  };
19
528
 
20
- $.fn.onTrigger = function(evt, fn){
21
- return this.on(evt, fn).each(fn);
22
- };
23
-
529
+
24
530
  $.fn.val = function(val){
25
531
  var elem = this[0];
26
532
  if(arguments.length && val == null){
@@ -49,6 +555,9 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
49
555
  }
50
556
  });
51
557
  };
558
+ $.fn.onTrigger = function(evt, fn){
559
+ return this.on(evt, fn).each(fn);
560
+ };
52
561
 
53
562
  var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
54
563
  var elementData = function(elem, key, val){
@@ -70,13 +579,69 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
70
579
 
71
580
  [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
72
581
  $.fn[data.name] = function(){
73
- return this.map(function(){
582
+ var elems = [];
583
+ this.each(function(){
74
584
  var shadowData = elementData(this, 'shadowData');
75
- return shadowData && shadowData[data.prop] || this;
585
+ var elem = shadowData && shadowData[data.prop] || this;
586
+ if($.inArray(elem, elems) == -1){
587
+ elems.push(elem);
588
+ }
76
589
  });
590
+ return this.pushStack(elems);
77
591
  };
78
592
  });
79
593
 
594
+ if($.Tween.propHooks._default && $.css){
595
+ (function(){
596
+ var isjQ8 = false;
597
+ try {
598
+ isjQ8 = $.css($('<b style="width: 10px" />')[0], 'width', '') == '10px';
599
+ } catch(er){
600
+ webshims.error(er);
601
+ }
602
+ var css = isjQ8 ?
603
+ function(elem, prop){
604
+ return $.css( elem, prop, false, "" );
605
+ } :
606
+ function(elem, prop){
607
+ return $.css( elem, prop, "" );
608
+ }
609
+ ;
610
+
611
+ $.extend($.Tween.propHooks._default, {
612
+ get: function( tween ) {
613
+ var result;
614
+
615
+ if ( (tween.elem[ tween.prop ] != null || havePolyfill[ tween.prop ]) &&
616
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
617
+ return havePolyfill[ tween.prop ] ? $.prop(tween.elem, tween.prop) : tween.elem[ tween.prop ];
618
+ }
619
+
620
+ // passing an empty string as a 3rd parameter to .css will automatically
621
+ // attempt a parseFloat and fallback to a string if the parse fails
622
+ // so, simple values such as "10px" are parsed to Float.
623
+ // complex values such as "rotate(1rad)" are returned as is.
624
+ result = css( tween.elem, tween.prop );
625
+ // Empty strings, null, undefined and "auto" are converted to 0.
626
+ return !result || result === "auto" ? 0 : result;
627
+ },
628
+ set: function( tween ) {
629
+ // use step hook for back compat - use cssHook if its there - use .style if its
630
+ // available and use plain properties where available
631
+ if ( jQuery.fx.step[ tween.prop ] ) {
632
+ jQuery.fx.step[ tween.prop ]( tween );
633
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
634
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
635
+ } else if( !havePolyfill[ tween.prop ] ) {
636
+ tween.elem[ tween.prop ] = tween.now;
637
+ } else {
638
+ $.prop(tween.elem, tween.prop, tween.now);
639
+ }
640
+ }
641
+ });
642
+ })();
643
+ }
644
+
80
645
 
81
646
  ['removeAttr', 'prop', 'attr'].forEach(function(type){
82
647
  olds[type] = $[type];
@@ -196,7 +761,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
196
761
  getSup('set', desc, oldDesc) :
197
762
  (webshims.cfg.useStrict && prop == 'prop') ?
198
763
  function(){throw(prop +' is readonly on '+ nodeName);} :
199
- $.noop
764
+ function(){webshims.info(prop +' is readonly on '+ nodeName);}
200
765
  ;
201
766
  }
202
767
  if(!desc.get){
@@ -214,15 +779,14 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
214
779
 
215
780
  });
216
781
 
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
782
  var extendNativeValue = (function(){
220
783
  var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
221
784
  var has = Object.prototype.hasOwnProperty;
785
+ //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
786
+ var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
222
787
  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) ) ){
788
+ var elem , elemProto;
789
+ if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
226
790
  var sup = elem[prop];
227
791
  desc._supvalue = function(){
228
792
  if(sup && sup.apply){
@@ -344,15 +908,24 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
344
908
  var ID = new Date().getTime();
345
909
  return function(elem){
346
910
  elem = $(elem);
347
- var id = elem.attr('id');
911
+ var id = elem.prop('id');
348
912
  if(!id){
349
913
  ID++;
350
914
  id = 'ID-'+ ID;
351
- elem.attr('id', id);
915
+ elem.eq(0).prop('id', id);
352
916
  }
353
917
  return id;
354
918
  };
355
919
  })(),
920
+ implement: function(elem, type){
921
+ var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
922
+ if(data[type]){
923
+ webshims.info(type +' already implemented for element #'+elem.id);
924
+ return false;
925
+ }
926
+ data[type] = true;
927
+ return true;
928
+ },
356
929
  extendUNDEFProp: function(obj, props){
357
930
  $.each(props, function(name, prop){
358
931
  if( !(name in obj) ){
@@ -831,7 +1404,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
831
1404
  var callRegister = function(module){
832
1405
  if(registeredCallbacks[module]){
833
1406
  registeredCallbacks[module].forEach(function(data){
834
- data.callback();
1407
+ data.callback(currentLang, shortLang, '');
835
1408
  });
836
1409
  }
837
1410
  };
@@ -872,7 +1445,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
872
1445
  registeredCallbacks[lang.register] = [];
873
1446
  }
874
1447
  registeredCallbacks[lang.register].push(lang);
875
- lang.callback();
1448
+ lang.callback(currentLang, shortLang, '');
876
1449
  } else {
877
1450
  if(!lang.activeLang){
878
1451
  lang.activeLang = '';
@@ -909,8 +1482,20 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
909
1482
  });
910
1483
  //html5a11y
911
1484
  (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;}
1485
+ if(!$.webshims.assumeARIA || ('content' in document.createElement('template'))){return;}
1486
+
1487
+ $(function(){
1488
+ var main = $('main').attr({role: 'main'});
1489
+ if(main.length > 1){
1490
+ webshims.error('only one main element allowed in document');
1491
+ } else if(main.is('article *, section *')) {
1492
+ webshims.error('main not allowed inside of article/section elements');
1493
+ }
1494
+ });
1495
+
1496
+ if(('hidden' in document.createElement('a'))){
1497
+ return;
1498
+ }
914
1499
 
915
1500
  var elemMappings = {
916
1501
  article: "article",
@@ -926,6 +1511,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
926
1511
  }
927
1512
  };
928
1513
 
1514
+
929
1515
  $.webshims.addReady(function(context, contextElem){
930
1516
  $.each(elemMappings, function(name, role){
931
1517
  var elems = $(name, context).add(contextElem.filter(name));
@@ -937,6 +1523,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
937
1523
  var header = document.getElementsByTagName('header')[0];
938
1524
  var footers = document.getElementsByTagName('footer');
939
1525
  var footerLen = footers.length;
1526
+
940
1527
  if (header && !$(header).closest('section, article')[0]) {
941
1528
  addRole(header, 'banner');
942
1529
  }
@@ -952,80 +1539,1013 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
952
1539
 
953
1540
  })(jQuery, document);
954
1541
 
955
- (function($, Modernizr, webshims){
1542
+ //additional tests for partial implementation of forms features
1543
+ (function($){
956
1544
  "use strict";
957
- var hasNative = Modernizr.audio && Modernizr.video;
958
- var supportsLoop = false;
1545
+ var isWebkit = 'webkitURL' in window;
1546
+ var Modernizr = window.Modernizr;
1547
+ var webshims = $.webshims;
959
1548
  var bugs = webshims.bugs;
960
-
961
- var loadSwf = function(){
962
- webshims.ready(swfType, function(){
963
- if(!webshims.mediaelement.createSWF){
964
- webshims.mediaelement.loadSwf = true;
965
- webshims.reTest([swfType], hasNative);
1549
+ var form = $('<form action="#" style="width: 1px; height: 1px; overflow: hidden;"><select name="b" required="" /><input required="" name="a" /></form>');
1550
+ var testRequiredFind = function(){
1551
+ if(form[0].querySelector){
1552
+ try {
1553
+ bugs.findRequired = !(form[0].querySelector('select:required'));
1554
+ } catch(er){
1555
+ bugs.findRequired = false;
966
1556
  }
967
- });
968
- };
969
- var options = webshims.cfg.mediaelement;
970
- var swfType = options && options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris';
971
- var hasSwf;
972
- if(!options){
973
- webshims.error("mediaelement wasn't implemented but loaded");
974
- return;
975
- }
976
- if(hasNative){
977
- var videoElem = document.createElement('video');
978
- Modernizr.videoBuffered = ('buffered' in videoElem);
979
- supportsLoop = ('loop' in videoElem);
980
-
981
- webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
982
-
983
- if(!Modernizr.videoBuffered){
984
- webshims.addPolyfill('mediaelement-native-fix', {
985
- f: 'mediaelement',
986
- test: Modernizr.videoBuffered,
987
- d: ['dom-support']
988
- });
989
-
990
- webshims.reTest('mediaelement-native-fix');
991
1557
  }
992
- }
1558
+ };
1559
+ var inputElem = $('input', form).eq(0);
1560
+ var onDomextend = function(fn){
1561
+ webshims.loader.loadList(['dom-extend']);
1562
+ webshims.ready('dom-extend', fn);
1563
+ };
993
1564
 
994
- if(hasNative && !options.preferFlash){
995
- var switchOptions = function(e){
996
- var parent = e.target.parentNode;
997
- if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
998
- webshims.ready('DOM mediaelement', function(){
999
- if(hasSwf){
1000
- loadSwf();
1001
- }
1002
- webshims.ready('WINDOWLOAD '+swfType, function(){
1003
- setTimeout(function(){
1004
- if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
1005
- options.preferFlash = true;
1006
- document.removeEventListener('error', switchOptions, true);
1007
- $('audio, video').each(function(){
1008
- webshims.mediaelement.selectSource(this);
1009
- });
1010
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
1011
- } else if(!hasSwf){
1012
- document.removeEventListener('error', switchOptions, true);
1013
- }
1014
- }, 20);
1015
- });
1016
- });
1017
- }
1018
- };
1019
- document.addEventListener('error', switchOptions, true);
1020
- $('audio, video').each(function(){
1021
- if(this.error){
1022
- switchOptions({target: this});
1023
- }
1024
- });
1025
- }
1565
+ bugs.findRequired = false;
1566
+ bugs.validationMessage = false;
1026
1567
 
1568
+ webshims.capturingEventPrevented = function(e){
1569
+ if(!e._isPolyfilled){
1570
+ var isDefaultPrevented = e.isDefaultPrevented;
1571
+ var preventDefault = e.preventDefault;
1572
+ e.preventDefault = function(){
1573
+ clearTimeout($.data(e.target, e.type + 'DefaultPrevented'));
1574
+ $.data(e.target, e.type + 'DefaultPrevented', setTimeout(function(){
1575
+ $.removeData(e.target, e.type + 'DefaultPrevented');
1576
+ }, 30));
1577
+ return preventDefault.apply(this, arguments);
1578
+ };
1579
+ e.isDefaultPrevented = function(){
1580
+ return !!(isDefaultPrevented.apply(this, arguments) || $.data(e.target, e.type + 'DefaultPrevented') || false);
1581
+ };
1582
+ e._isPolyfilled = true;
1583
+ }
1584
+ };
1027
1585
 
1028
- if(Modernizr.track && !bugs.track){
1586
+ if(!Modernizr.formvalidation || bugs.bustedValidity){
1587
+ testRequiredFind();
1588
+ } else {
1589
+ //create delegatable events
1590
+ webshims.capturingEvents(['invalid'], true);
1591
+
1592
+ if(window.opera || window.testGoodWithFix){
1593
+
1594
+ form.appendTo('head');
1595
+
1596
+ testRequiredFind();
1597
+ bugs.validationMessage = !(inputElem.prop('validationMessage'));
1598
+
1599
+ webshims.reTest(['form-native-extend', 'form-message']);
1600
+
1601
+ form.remove();
1602
+
1603
+ $(function(){
1604
+ onDomextend(function(){
1605
+
1606
+ //Opera shows native validation bubbles in case of input.checkValidity()
1607
+ // Opera 11.6/12 hasn't fixed this issue right, it's buggy
1608
+ var preventDefault = function(e){
1609
+ e.preventDefault();
1610
+ };
1611
+
1612
+ ['form', 'input', 'textarea', 'select'].forEach(function(name){
1613
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1614
+ prop: {
1615
+ value: function(){
1616
+ if (!webshims.fromSubmit) {
1617
+ $(this).on('invalid.checkvalidity', preventDefault);
1618
+ }
1619
+
1620
+ webshims.fromCheckValidity = true;
1621
+ var ret = desc.prop._supvalue.apply(this, arguments);
1622
+ if (!webshims.fromSubmit) {
1623
+ $(this).unbind('invalid.checkvalidity', preventDefault);
1624
+ }
1625
+ webshims.fromCheckValidity = false;
1626
+ return ret;
1627
+ }
1628
+ }
1629
+ });
1630
+ });
1631
+
1632
+ });
1633
+ });
1634
+ }
1635
+
1636
+ if(isWebkit && !webshims.bugs.bustedValidity){
1637
+ (function(){
1638
+ var elems = /^(?:textarea|input)$/i;
1639
+ var form = false;
1640
+
1641
+ document.addEventListener('contextmenu', function(e){
1642
+ if(elems.test( e.target.nodeName || '') && (form = e.target.form)){
1643
+ setTimeout(function(){
1644
+ form = false;
1645
+ }, 1);
1646
+ }
1647
+ }, false);
1648
+
1649
+ $(window).on('invalid', function(e){
1650
+ if(e.originalEvent && form && form == e.target.form){
1651
+ e.wrongWebkitInvalid = true;
1652
+ e.stopImmediatePropagation();
1653
+ }
1654
+ });
1655
+
1656
+ })();
1657
+ }
1658
+ }
1659
+
1660
+ $.webshims.register('form-core', function($, webshims, window, document, undefined, options){
1661
+
1662
+ var checkTypes = {checkbox: 1, radio: 1};
1663
+ var emptyJ = $([]);
1664
+ var bugs = webshims.bugs;
1665
+ var getGroupElements = function(elem){
1666
+ elem = $(elem);
1667
+ var name;
1668
+ var form;
1669
+ var ret = emptyJ;
1670
+ if(elem[0].type == 'radio'){
1671
+ form = elem.prop('form');
1672
+ name = elem[0].name;
1673
+ if(!name){
1674
+ ret = elem;
1675
+ } else if(form){
1676
+ ret = $(form[name]);
1677
+ } else {
1678
+ ret = $(document.getElementsByName(name)).filter(function(){
1679
+ return !$.prop(this, 'form');
1680
+ });
1681
+ }
1682
+ ret = ret.filter('[type="radio"]');
1683
+ }
1684
+ return ret;
1685
+ };
1686
+
1687
+ var getContentValidationMessage = webshims.getContentValidationMessage = function(elem, validity, key){
1688
+ var message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || '';
1689
+ if(key && message[key]){
1690
+ message = message[key];
1691
+ }
1692
+ if(typeof message == 'object'){
1693
+ validity = validity || $.prop(elem, 'validity') || {valid: 1};
1694
+ if(!validity.valid){
1695
+ $.each(validity, function(name, prop){
1696
+ if(prop && name != 'valid' && message[name]){
1697
+ message = message[name];
1698
+ return false;
1699
+ }
1700
+ });
1701
+ }
1702
+ }
1703
+
1704
+ if(typeof message == 'object'){
1705
+ message = message.defaultMessage;
1706
+ }
1707
+ return message || '';
1708
+ };
1709
+
1710
+ /*
1711
+ * Selectors for all browsers
1712
+ */
1713
+ var rangeTypes = {number: 1, range: 1, date: 1/*, time: 1, 'datetime-local': 1, datetime: 1, month: 1, week: 1*/};
1714
+ var hasInvalid = function(elem){
1715
+ var ret = false;
1716
+ $($.prop(elem, 'elements')).each(function(){
1717
+ ret = $(this).is(':invalid');
1718
+ if(ret){
1719
+ return false;
1720
+ }
1721
+ });
1722
+ return ret;
1723
+ };
1724
+ $.extend($.expr[":"], {
1725
+ "valid-element": function(elem){
1726
+ return $.nodeName(elem, 'form') ? !hasInvalid(elem) :!!($.prop(elem, 'willValidate') && isValid(elem));
1727
+ },
1728
+ "invalid-element": function(elem){
1729
+ return $.nodeName(elem, 'form') ? hasInvalid(elem) : !!($.prop(elem, 'willValidate') && !isValid(elem));
1730
+ },
1731
+ "required-element": function(elem){
1732
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required'));
1733
+ },
1734
+ "user-error": function(elem){
1735
+ return ($.prop(elem, 'willValidate') && $(elem).hasClass('user-error'));
1736
+ },
1737
+ "optional-element": function(elem){
1738
+ return !!($.prop(elem, 'willValidate') && $.prop(elem, 'required') === false);
1739
+ },
1740
+ "in-range": function(elem){
1741
+ if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1742
+ return false;
1743
+ }
1744
+ var val = $.prop(elem, 'validity');
1745
+ return !!(val && !val.rangeOverflow && !val.rangeUnderflow);
1746
+ },
1747
+ "out-of-range": function(elem){
1748
+ if(!rangeTypes[$.prop(elem, 'type')] || !$.prop(elem, 'willValidate')){
1749
+ return false;
1750
+ }
1751
+ var val = $.prop(elem, 'validity');
1752
+ return !!(val && (val.rangeOverflow || val.rangeUnderflow));
1753
+ }
1754
+
1755
+ });
1756
+
1757
+ ['valid', 'invalid', 'required', 'optional'].forEach(function(name){
1758
+ $.expr[":"][name] = $.expr.filters[name+"-element"];
1759
+ });
1760
+
1761
+
1762
+ $.expr[":"].focus = function( elem ) {
1763
+ try {
1764
+ var doc = elem.ownerDocument;
1765
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus());
1766
+ } catch(e){}
1767
+ return false;
1768
+ };
1769
+
1770
+
1771
+ var customEvents = $.event.customEvent || {};
1772
+ var isValid = function(elem){
1773
+ return ($.prop(elem, 'validity') || {valid: 1}).valid;
1774
+ };
1775
+
1776
+ if (bugs.bustedValidity || bugs.findRequired) {
1777
+ (function(){
1778
+ var find = $.find;
1779
+ var matchesSelector = $.find.matchesSelector;
1780
+
1781
+ var regExp = /(\:valid|\:invalid|\:optional|\:required|\:in-range|\:out-of-range)(?=[\s\[\~\.\+\>\:\#*]|$)/ig;
1782
+ var regFn = function(sel){
1783
+ return sel + '-element';
1784
+ };
1785
+
1786
+ $.find = (function(){
1787
+ var slice = Array.prototype.slice;
1788
+ var fn = function(sel){
1789
+ var ar = arguments;
1790
+ ar = slice.call(ar, 1, ar.length);
1791
+ ar.unshift(sel.replace(regExp, regFn));
1792
+ return find.apply(this, ar);
1793
+ };
1794
+ for (var i in find) {
1795
+ if(find.hasOwnProperty(i)){
1796
+ fn[i] = find[i];
1797
+ }
1798
+ }
1799
+ return fn;
1800
+ })();
1801
+ if(!Modernizr.prefixed || Modernizr.prefixed("matchesSelector", document.documentElement)){
1802
+ $.find.matchesSelector = function(node, expr){
1803
+ expr = expr.replace(regExp, regFn);
1804
+ return matchesSelector.call(this, node, expr);
1805
+ };
1806
+ }
1807
+
1808
+ })();
1809
+ }
1810
+
1811
+ //ToDo needs testing
1812
+ var oldAttr = $.prop;
1813
+ var changeVals = {selectedIndex: 1, value: 1, checked: 1, disabled: 1, readonly: 1};
1814
+ $.prop = function(elem, name, val){
1815
+ var ret = oldAttr.apply(this, arguments);
1816
+ if(elem && 'form' in elem && changeVals[name] && val !== undefined && $(elem).hasClass(invalidClass)){
1817
+ if(isValid(elem)){
1818
+ $(elem).getShadowElement().removeClass(invalidClass);
1819
+ if(name == 'checked' && val) {
1820
+ getGroupElements(elem).not(elem).removeClass(invalidClass).removeAttr('aria-invalid');
1821
+ }
1822
+ }
1823
+ }
1824
+ return ret;
1825
+ };
1826
+
1827
+ var returnValidityCause = function(validity, elem){
1828
+ var ret;
1829
+ $.each(validity, function(name, value){
1830
+ if(value){
1831
+ ret = (name == 'customError') ? $.prop(elem, 'validationMessage') : name;
1832
+ return false;
1833
+ }
1834
+ });
1835
+ return ret;
1836
+ };
1837
+
1838
+ var isInGroup = function(name){
1839
+ var ret;
1840
+ try {
1841
+ ret = document.activeElement.name === name;
1842
+ } catch(e){}
1843
+ return ret;
1844
+ };
1845
+ /* form-ui-invalid/form-ui-valid are deprecated. use user-error/user-success instead */
1846
+ var invalidClass = 'user-error';
1847
+ var validClass = 'user-success';
1848
+ var stopChangeTypes = {
1849
+ time: 1,
1850
+ date: 1,
1851
+ month: 1,
1852
+ datetime: 1,
1853
+ week: 1,
1854
+ 'datetime-local': 1
1855
+ };
1856
+ var switchValidityClass = function(e){
1857
+ var elem, timer;
1858
+ if(!e.target){return;}
1859
+ elem = $(e.target).getNativeElement()[0];
1860
+ if(elem.type == 'submit' || !$.prop(elem, 'willValidate')){return;}
1861
+ timer = $.data(elem, 'webshimsswitchvalidityclass');
1862
+ var switchClass = function(){
1863
+ if(e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name)){return;}
1864
+ var validity = $.prop(elem, 'validity');
1865
+ var shadowElem = $(elem).getShadowElement();
1866
+ var addClass, removeClass, trigger, generaltrigger, validityCause;
1867
+
1868
+ if(isWebkit && e.type == 'change' && !bugs.bustedValidity && stopChangeTypes[shadowElem.prop('type')] && shadowElem.is(':focus')){return;}
1869
+
1870
+ $(elem).trigger('refreshCustomValidityRules');
1871
+
1872
+ if(validity.valid){
1873
+ if(!shadowElem.hasClass(validClass)){
1874
+ addClass = validClass;
1875
+ removeClass = invalidClass;
1876
+ generaltrigger = 'changedvaliditystate';
1877
+ trigger = 'changedvalid';
1878
+ if(checkTypes[elem.type] && elem.checked){
1879
+ getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass).removeAttr('aria-invalid');
1880
+ }
1881
+ $.removeData(elem, 'webshimsinvalidcause');
1882
+ }
1883
+ } else {
1884
+ validityCause = returnValidityCause(validity, elem);
1885
+ if($.data(elem, 'webshimsinvalidcause') != validityCause){
1886
+ $.data(elem, 'webshimsinvalidcause', validityCause);
1887
+ generaltrigger = 'changedvaliditystate';
1888
+ }
1889
+ if(!shadowElem.hasClass(invalidClass)){
1890
+ addClass = invalidClass;
1891
+ removeClass = validClass;
1892
+ if (checkTypes[elem.type] && !elem.checked) {
1893
+ getGroupElements(elem).not(elem).removeClass(removeClass).addClass(addClass);
1894
+ }
1895
+ trigger = 'changedinvalid';
1896
+ }
1897
+ }
1898
+
1899
+ if(addClass){
1900
+ shadowElem.addClass(addClass).removeClass(removeClass);
1901
+ //jQuery 1.6.1 IE9 bug (doubble trigger bug)
1902
+ setTimeout(function(){
1903
+ $(elem).trigger(trigger);
1904
+ }, 0);
1905
+ }
1906
+ if(generaltrigger){
1907
+ setTimeout(function(){
1908
+ $(elem).trigger(generaltrigger);
1909
+ }, 0);
1910
+ }
1911
+
1912
+ $.removeData(elem, 'webshimsswitchvalidityclass');
1913
+ };
1914
+
1915
+ if(timer){
1916
+ clearTimeout(timer);
1917
+ }
1918
+ if(e.type == 'refreshvalidityui'){
1919
+ switchClass();
1920
+ } else {
1921
+ $.data(elem, 'webshimsswitchvalidityclass', setTimeout(switchClass, 9));
1922
+ }
1923
+ };
1924
+
1925
+ $(document).on(options.validityUIEvents || 'focusout change refreshvalidityui', switchValidityClass);
1926
+ customEvents.changedvaliditystate = true;
1927
+ customEvents.refreshCustomValidityRules = true;
1928
+ customEvents.changedvalid = true;
1929
+ customEvents.changedinvalid = true;
1930
+ customEvents.refreshvalidityui = true;
1931
+
1932
+
1933
+ webshims.triggerInlineForm = function(elem, event){
1934
+ $(elem).trigger(event);
1935
+ };
1936
+
1937
+ webshims.modules["form-core"].getGroupElements = getGroupElements;
1938
+
1939
+
1940
+ var setRoot = function(){
1941
+ webshims.scrollRoot = (isWebkit || document.compatMode == 'BackCompat') ?
1942
+ $(document.body) :
1943
+ $(document.documentElement)
1944
+ ;
1945
+ };
1946
+ var minWidth = (Modernizr.boxSizing || Modernizr['display-table'] || $.support.getSetAttribute) ?
1947
+ 'minWidth' :
1948
+ 'width'
1949
+ ;
1950
+ setRoot();
1951
+ webshims.ready('DOM', setRoot);
1952
+
1953
+ webshims.getRelOffset = function(posElem, relElem){
1954
+ posElem = $(posElem);
1955
+ var offset = $(relElem).offset();
1956
+ var bodyOffset;
1957
+ $.swap($(posElem)[0], {visibility: 'hidden', display: 'inline-block', left: 0, top: 0}, function(){
1958
+ bodyOffset = posElem.offset();
1959
+ });
1960
+ offset.top -= bodyOffset.top;
1961
+ offset.left -= bodyOffset.left;
1962
+ return offset;
1963
+ };
1964
+
1965
+ webshims.wsPopover = {
1966
+ _create: function(){
1967
+ this.options = $.extend({}, webshims.cfg.wspopover, this.options);
1968
+ this.id = webshims.wsPopover.id++;
1969
+ this.eventns = '.wsoverlay'+this.id;
1970
+ this.timers = {};
1971
+ this.element = $('<div class="ws-popover" tabindex="-1"><div class="ws-po-outerbox"><div class="ws-po-arrow"><div class="ws-po-arrowbox" /></div><div class="ws-po-box" /></div></div>');
1972
+ this.contentElement = $('.ws-po-box', this.element);
1973
+ this.lastElement = $([]);
1974
+ this.bindElement();
1975
+
1976
+ this.element.data('wspopover', this);
1977
+
1978
+ },
1979
+ options: {},
1980
+ content: function(html){
1981
+ this.contentElement.html(html);
1982
+ },
1983
+ bindElement: function(){
1984
+ var that = this;
1985
+ var stopBlur = function(){
1986
+ that.stopBlur = false;
1987
+ };
1988
+ this.preventBlur = function(e){
1989
+ that.stopBlur = true;
1990
+ clearTimeout(that.timers.stopBlur);
1991
+ that.timers.stopBlur = setTimeout(stopBlur, 9);
1992
+ };
1993
+ this.element.on({
1994
+ 'mousedown': this.preventBlur
1995
+ });
1996
+ },
1997
+
1998
+ isInElement: function(container, contained){
1999
+ return container == contained || $.contains(container, contained);
2000
+ },
2001
+ show: function(element){
2002
+ var e = $.Event('wspopoverbeforeshow');
2003
+ this.element.trigger(e);
2004
+ if(e.isDefaultPrevented() || this.isVisible){return;}
2005
+ this.isVisible = true;
2006
+ element = $(element || this.options.prepareFor).getNativeElement() ;
2007
+
2008
+ var that = this;
2009
+ var visual = $(element).getShadowElement();
2010
+
2011
+ this.clear();
2012
+ this.element.removeClass('ws-po-visible').css('display', 'none');
2013
+
2014
+ this.prepareFor(element, visual);
2015
+
2016
+ this.position(visual);
2017
+ that.timers.show = setTimeout(function(){
2018
+ that.element.css('display', '');
2019
+ that.timers.show = setTimeout(function(){
2020
+ that.element.addClass('ws-po-visible').trigger('wspopovershow');
2021
+ }, 9);
2022
+ }, 9);
2023
+ $(document).on('focusin'+this.eventns+' mousedown'+this.eventns, function(e){
2024
+ if(that.options.hideOnBlur && !that.stopBlur && !that.isInElement(that.lastElement[0] || document.body, e.target) && !that.isInElement(element[0] || document.body, e.target) && !that.isInElement(that.element[0], e.target)){
2025
+ that.hide();
2026
+ }
2027
+ });
2028
+ $(window).on('resize'+this.eventns + ' pospopover'+this.eventns, function(){
2029
+ clearTimeout(that.timers.repos);
2030
+ that.timers.repos = setTimeout(function(){
2031
+ that.position(visual);
2032
+ }, 900);
2033
+ });
2034
+ },
2035
+ prepareFor: function(element, visual){
2036
+ var onBlur;
2037
+ var opts = $.extend({}, this.options, $(element.prop('form') || []).data('wspopover') || {}, element.data('wspopover'));
2038
+ var that = this;
2039
+ var css = {};
2040
+ this.lastElement = $(element).getShadowFocusElement();
2041
+ if(opts.appendTo == 'element'){
2042
+ this.element.insertAfter(element);
2043
+ } else {
2044
+ this.element.appendTo(opts.appendTo);
2045
+ }
2046
+
2047
+ this.element.attr({
2048
+ 'data-class': element.prop('className'),
2049
+ 'data-id': element.prop('id')
2050
+ });
2051
+
2052
+ css[minWidth] = opts.constrainWidth ? visual.outerWidth() : '';
2053
+
2054
+ this.element.css(css);
2055
+
2056
+ if(opts.hideOnBlur){
2057
+ onBlur = function(e){
2058
+ if(that.stopBlur){
2059
+ e.stopImmediatePropagation();
2060
+ } else {
2061
+ that.hide();
2062
+ }
2063
+ };
2064
+
2065
+ that.timers.bindBlur = setTimeout(function(){
2066
+ that.lastElement.off(that.eventns).on('focusout'+that.eventns + ' blur'+that.eventns, onBlur);
2067
+ that.lastElement.getNativeElement().off(that.eventns);
2068
+ }, 10);
2069
+
2070
+
2071
+ }
2072
+
2073
+ if(!this.prepared){
2074
+
2075
+ if($.fn.bgIframe){
2076
+ this.element.bgIframe();
2077
+ }
2078
+ }
2079
+ this.prepared = true;
2080
+ },
2081
+ clear: function(){
2082
+ $(window).off(this.eventns);
2083
+ $(document).off(this.eventns);
2084
+
2085
+ this.stopBlur = false;
2086
+ $.each(this.timers, function(timerName, val){
2087
+ clearTimeout(val);
2088
+ });
2089
+ },
2090
+ hide: function(){
2091
+ var e = $.Event('wspopoverbeforehide');
2092
+ this.element.trigger(e);
2093
+ if(e.isDefaultPrevented() || !this.isVisible){return;}
2094
+ this.isVisible = false;
2095
+ var that = this;
2096
+ var forceHide = function(){
2097
+ that.element.css('display', 'none').attr({'data-id': '', 'data-class': '', 'hidden': 'hidden'});
2098
+ clearTimeout(that.timers.forcehide);
2099
+ };
2100
+ this.clear();
2101
+ this.element.removeClass('ws-po-visible').trigger('wspopoverhide');
2102
+ $(window).on('resize'+this.eventns, forceHide);
2103
+ that.timers.forcehide = setTimeout(forceHide, 999);
2104
+ },
2105
+ position: function(element){
2106
+ var offset = webshims.getRelOffset(this.element.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0}).removeAttr('hidden'), element);
2107
+ offset.top += element.outerHeight();
2108
+ this.element.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(offset);
2109
+ }
2110
+ };
2111
+
2112
+ webshims.wsPopover.id = 0;
2113
+
2114
+ /* some extra validation UI */
2115
+ webshims.validityAlert = (function(){
2116
+
2117
+
2118
+ var focusTimer = false;
2119
+
2120
+ var api = webshims.objectCreate(webshims.wsPopover, {}, options.messagePopover);
2121
+ var boundHide = api.hide.bind(api);
2122
+
2123
+ api.element.addClass('validity-alert').attr({role: 'alert'});
2124
+ $.extend(api, {
2125
+ hideDelay: 5000,
2126
+ showFor: function(elem, message, noFocusElem, noBubble){
2127
+
2128
+ elem = $(elem).getNativeElement();
2129
+ this.clear();
2130
+ this.hide();
2131
+ if(!noBubble){
2132
+ this.getMessage(elem, message);
2133
+
2134
+ this.show(elem);
2135
+ if(this.hideDelay){
2136
+ this.timers.delayedHide = setTimeout(boundHide, this.hideDelay);
2137
+ }
2138
+
2139
+ }
2140
+
2141
+ if(!noFocusElem){
2142
+ this.setFocus(elem);
2143
+ }
2144
+ },
2145
+ setFocus: function(element){
2146
+ var focusElem = $(element).getShadowFocusElement();
2147
+ var scrollTop = webshims.scrollRoot.scrollTop();
2148
+ var elemTop = focusElem.offset().top - 30;
2149
+ var smooth;
2150
+
2151
+ if(scrollTop > elemTop){
2152
+ webshims.scrollRoot.animate(
2153
+ {scrollTop: elemTop - 5},
2154
+ {
2155
+ queue: false,
2156
+ duration: Math.max( Math.min( 600, (scrollTop - elemTop) * 1.5 ), 80 )
2157
+ }
2158
+ );
2159
+ smooth = true;
2160
+ }
2161
+ try {
2162
+ focusElem[0].focus();
2163
+ } catch(e){}
2164
+ if(smooth){
2165
+ webshims.scrollRoot.scrollTop(scrollTop);
2166
+ setTimeout(function(){
2167
+ webshims.scrollRoot.scrollTop(scrollTop);
2168
+ }, 0);
2169
+ }
2170
+
2171
+ $(window).triggerHandler('pospopover'+this.eventns);
2172
+ },
2173
+ getMessage: function(elem, message){
2174
+ if (!message) {
2175
+ message = getContentValidationMessage(elem[0]) || elem.prop('customValidationMessage') || elem.prop('validationMessage');
2176
+ }
2177
+ if (message) {
2178
+ api.contentElement.text(message);
2179
+ } else {
2180
+ this.hide();
2181
+ }
2182
+ }
2183
+ });
2184
+
2185
+
2186
+ return api;
2187
+ })();
2188
+
2189
+
2190
+ /* extension, but also used to fix native implementation workaround/bugfixes */
2191
+ (function(){
2192
+ var firstEvent,
2193
+ invalids = [],
2194
+ stopSubmitTimer,
2195
+ form
2196
+ ;
2197
+
2198
+ $(document).on('invalid', function(e){
2199
+ if(e.wrongWebkitInvalid){return;}
2200
+ var jElm = $(e.target);
2201
+ var shadowElem = jElm.getShadowElement();
2202
+ if(!shadowElem.hasClass(invalidClass)){
2203
+ shadowElem.addClass(invalidClass).removeClass(validClass);
2204
+ setTimeout(function(){
2205
+ $(e.target).trigger('changedinvalid').trigger('changedvaliditystate');
2206
+ }, 0);
2207
+ }
2208
+
2209
+ if(!firstEvent){
2210
+ //trigger firstinvalid
2211
+ firstEvent = $.Event('firstinvalid');
2212
+ firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
2213
+ var firstSystemInvalid = $.Event('firstinvalidsystem');
2214
+ $(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
2215
+ jElm.trigger(firstEvent);
2216
+ }
2217
+
2218
+ //if firstinvalid was prevented all invalids will be also prevented
2219
+ if( firstEvent && firstEvent.isDefaultPrevented() ){
2220
+ e.preventDefault();
2221
+ }
2222
+ invalids.push(e.target);
2223
+ e.extraData = 'fix';
2224
+ clearTimeout(stopSubmitTimer);
2225
+ stopSubmitTimer = setTimeout(function(){
2226
+ var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
2227
+ //reset firstinvalid
2228
+ firstEvent = false;
2229
+ invalids = [];
2230
+ $(e.target).trigger(lastEvent, lastEvent);
2231
+ }, 9);
2232
+ jElm = null;
2233
+ shadowElem = null;
2234
+ });
2235
+ })();
2236
+
2237
+ $.fn.getErrorMessage = function(){
2238
+ var message = '';
2239
+ var elem = this[0];
2240
+ if(elem){
2241
+ message = getContentValidationMessage(elem) || $.prop(elem, 'customValidationMessage') || $.prop(elem, 'validationMessage');
2242
+ }
2243
+ return message;
2244
+ };
2245
+
2246
+ if(options.replaceValidationUI){
2247
+ if(options.overrideMessages && (options.customMessages || options.customMessages == null)){
2248
+ options.customMessages = true;
2249
+ options.overrideMessages = false;
2250
+ webshims.info("set overrideMessages to false. Use customMessages instead");
2251
+ }
2252
+ webshims.ready('DOM forms', function(){
2253
+ $(document).on('firstinvalid', function(e){
2254
+ if(!e.isInvalidUIPrevented()){
2255
+ e.preventDefault();
2256
+ $.webshims.validityAlert.showFor( e.target );
2257
+ }
2258
+ });
2259
+ });
2260
+ }
2261
+ });
2262
+
2263
+ })(jQuery);
2264
+ jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
2265
+ "use strict";
2266
+ var validityMessages = webshims.validityMessages;
2267
+
2268
+ var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
2269
+
2270
+ validityMessages.en = $.extend(true, {
2271
+ typeMismatch: {
2272
+ defaultMessage: 'Please enter a valid value.',
2273
+ email: 'Please enter an email address.',
2274
+ url: 'Please enter a URL.',
2275
+ number: 'Please enter a number.',
2276
+ date: 'Please enter a date.',
2277
+ time: 'Please enter a time.',
2278
+ range: 'Invalid input.',
2279
+ month: 'Please enter a valid value.',
2280
+ "datetime-local": 'Please enter a datetime.'
2281
+ },
2282
+ rangeUnderflow: {
2283
+ defaultMessage: 'Value must be greater than or equal to {%min}.'
2284
+ },
2285
+ rangeOverflow: {
2286
+ defaultMessage: 'Value must be less than or equal to {%max}.'
2287
+ },
2288
+ stepMismatch: 'Invalid input.',
2289
+ tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
2290
+ patternMismatch: 'Invalid input. {%title}',
2291
+ valueMissing: {
2292
+ defaultMessage: 'Please fill out this field.',
2293
+ checkbox: 'Please check this box if you want to proceed.'
2294
+ }
2295
+ }, (validityMessages.en || validityMessages['en-US'] || {}));
2296
+
2297
+ if(typeof validityMessages['en'].valueMissing == 'object'){
2298
+ ['select', 'radio'].forEach(function(type){
2299
+ validityMessages.en.valueMissing[type] = 'Please select an option.';
2300
+ });
2301
+ }
2302
+ if(typeof validityMessages.en.rangeUnderflow == 'object'){
2303
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
2304
+ validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
2305
+ });
2306
+ }
2307
+ if(typeof validityMessages.en.rangeOverflow == 'object'){
2308
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
2309
+ validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
2310
+ });
2311
+ }
2312
+
2313
+ validityMessages['en-US'] = validityMessages['en-US'] || validityMessages.en;
2314
+ validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
2315
+
2316
+ validityMessages.de = $.extend(true, {
2317
+ typeMismatch: {
2318
+ defaultMessage: '{%value} ist in diesem Feld nicht zulässig.',
2319
+ email: '{%value} ist keine gültige E-Mail-Adresse.',
2320
+ url: '{%value} ist kein(e) gültige(r) Webadresse/Pfad.',
2321
+ number: '{%value} ist keine Nummer.',
2322
+ date: '{%value} ist kein Datum.',
2323
+ time: '{%value} ist keine Uhrzeit.',
2324
+ month: '{%value} ist in diesem Feld nicht zulässig.',
2325
+ range: '{%value} ist keine Nummer.',
2326
+ "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
2327
+ },
2328
+ rangeUnderflow: {
2329
+ defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
2330
+ },
2331
+ rangeOverflow: {
2332
+ defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
2333
+ },
2334
+ stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
2335
+ tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
2336
+ patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format. {%title}',
2337
+ valueMissing: {
2338
+ defaultMessage: 'Bitte geben Sie einen Wert ein.',
2339
+ checkbox: 'Bitte aktivieren Sie das Kästchen.'
2340
+ }
2341
+ }, (validityMessages.de || {}));
2342
+
2343
+ if(typeof validityMessages.de.valueMissing == 'object'){
2344
+ ['select', 'radio'].forEach(function(type){
2345
+ validityMessages.de.valueMissing[type] = 'Bitte wählen Sie eine Option aus.';
2346
+ });
2347
+ }
2348
+ if(typeof validityMessages.de.rangeUnderflow == 'object'){
2349
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
2350
+ validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
2351
+ });
2352
+ }
2353
+ if(typeof validityMessages.de.rangeOverflow == 'object'){
2354
+ ['date', 'time', 'datetime-local', 'month'].forEach(function(type){
2355
+ validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
2356
+ });
2357
+ }
2358
+
2359
+ var currentValidationMessage = validityMessages[''];
2360
+ var getMessageFromObj = function(message, elem){
2361
+ if(message && typeof message !== 'string'){
2362
+ message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
2363
+ }
2364
+ return message || '';
2365
+ };
2366
+ var valueVals = {
2367
+ value: 1,
2368
+ min: 1,
2369
+ max: 1
2370
+ };
2371
+
2372
+ webshims.createValidationMessage = function(elem, name){
2373
+ var spinner;
2374
+ var message = getMessageFromObj(currentValidationMessage[name], elem);
2375
+
2376
+ if(!message){
2377
+ message = getMessageFromObj(validityMessages[''][name], elem) || 'invalid value';
2378
+ webshims.info('could not find errormessage for: '+ name +' / '+ $.prop(elem, 'type') +'. in language: '+$.webshims.activeLang());
2379
+ }
2380
+ if(message){
2381
+ ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
2382
+ if(message.indexOf('{%'+attr) === -1){return;}
2383
+ var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.prop(elem, attr)) || '';
2384
+ if(name == 'patternMismatch' && attr == 'title' && !val){
2385
+ webshims.error('no title for patternMismatch provided. Always add a title attribute.');
2386
+ }
2387
+ if(valueVals[attr]){
2388
+ if(!spinner){
2389
+ spinner = $(elem).getShadowElement().data('wsspinner');
2390
+ }
2391
+ if(spinner && spinner.formatValue){
2392
+ val = spinner.formatValue(val, false);
2393
+ }
2394
+ }
2395
+ message = message.replace('{%'+ attr +'}', val);
2396
+ if('value' == attr){
2397
+ message = message.replace('{%valueLen}', val.length);
2398
+ }
2399
+
2400
+ });
2401
+ }
2402
+
2403
+ return message || '';
2404
+ };
2405
+
2406
+
2407
+ if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
2408
+ implementProperties.push('validationMessage');
2409
+ }
2410
+
2411
+ webshims.activeLang({
2412
+ langObj: validityMessages,
2413
+ module: 'form-core',
2414
+ callback: function(langObj){
2415
+
2416
+ currentValidationMessage = langObj;
2417
+ }
2418
+ });
2419
+
2420
+ implementProperties.forEach(function(messageProp){
2421
+ webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
2422
+ prop: {
2423
+ value: '',
2424
+ writeable: false
2425
+ }
2426
+ });
2427
+ ['input', 'select', 'textarea'].forEach(function(nodeName){
2428
+ var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
2429
+ prop: {
2430
+ get: function(){
2431
+ var elem = this;
2432
+ var message = '';
2433
+ if(!$.prop(elem, 'willValidate')){
2434
+ return message;
2435
+ }
2436
+
2437
+ var validity = $.prop(elem, 'validity') || {valid: 1};
2438
+
2439
+ if(validity.valid){return message;}
2440
+ message = webshims.getContentValidationMessage(elem, validity);
2441
+
2442
+ if(message){return message;}
2443
+
2444
+ if(validity.customError && elem.nodeName){
2445
+ message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
2446
+ if(message){return message;}
2447
+ }
2448
+ $.each(validity, function(name, prop){
2449
+ if(name == 'valid' || !prop){return;}
2450
+
2451
+ message = webshims.createValidationMessage(elem, name);
2452
+ if(message){
2453
+ return false;
2454
+ }
2455
+ });
2456
+ return message || '';
2457
+ },
2458
+ writeable: false
2459
+ }
2460
+ });
2461
+ });
2462
+
2463
+ });
2464
+ });
2465
+ (function($, Modernizr, webshims){
2466
+ "use strict";
2467
+ var hasNative = Modernizr.audio && Modernizr.video;
2468
+ var supportsLoop = false;
2469
+ var bugs = webshims.bugs;
2470
+
2471
+ var loadSwf = function(){
2472
+ webshims.ready(swfType, function(){
2473
+ if(!webshims.mediaelement.createSWF){
2474
+ webshims.mediaelement.loadSwf = true;
2475
+ webshims.reTest([swfType], hasNative);
2476
+ }
2477
+ });
2478
+ };
2479
+ var options = webshims.cfg.mediaelement;
2480
+ var swfType = 'mediaelement-jaris';
2481
+ var hasSwf;
2482
+ if(!options){
2483
+ webshims.error("mediaelement wasn't implemented but loaded");
2484
+ return;
2485
+ }
2486
+ if(hasNative){
2487
+ var videoElem = document.createElement('video');
2488
+ Modernizr.videoBuffered = ('buffered' in videoElem);
2489
+ supportsLoop = ('loop' in videoElem);
2490
+
2491
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
2492
+
2493
+ if(!Modernizr.videoBuffered){
2494
+ webshims.addPolyfill('mediaelement-native-fix', {
2495
+ f: 'mediaelement',
2496
+ test: Modernizr.videoBuffered,
2497
+ d: ['dom-support']
2498
+ });
2499
+
2500
+ webshims.reTest('mediaelement-native-fix');
2501
+ }
2502
+ }
2503
+
2504
+ if(hasNative && !options.preferFlash){
2505
+ var noSwitch = {
2506
+ 1: 1,
2507
+ 2: 1
2508
+ };
2509
+ var switchOptions = function(e){
2510
+ var media;
2511
+ var parent = e.target.parentNode;
2512
+ if(!options.preferFlash &&
2513
+ ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) &&
2514
+ (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')]
2515
+ ){
2516
+ $(function(){
2517
+ if(hasSwf && !options.preferFlash){
2518
+ loadSwf();
2519
+ webshims.ready('WINDOWLOAD '+swfType, function(){
2520
+ setTimeout(function(){
2521
+ if(!options.preferFlash && webshims.mediaelement.createSWF && !media.is('.nonnative-api-active')){
2522
+ options.preferFlash = true;
2523
+ document.removeEventListener('error', switchOptions, true);
2524
+ $('audio, video').each(function(){
2525
+ webshims.mediaelement.selectSource(this);
2526
+ });
2527
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
2528
+ }
2529
+ }, 9);
2530
+ });
2531
+ } else{
2532
+ document.removeEventListener('error', switchOptions, true);
2533
+ }
2534
+ });
2535
+ }
2536
+ };
2537
+ document.addEventListener('error', switchOptions, true);
2538
+ $('audio, video').each(function(){
2539
+ var error = $.prop(this, 'error');
2540
+ if(error && !noSwitch[error]){
2541
+ switchOptions({target: this});
2542
+ return false;
2543
+ }
2544
+ });
2545
+ }
2546
+
2547
+
2548
+ if(Modernizr.track && !bugs.track){
1029
2549
  (function(){
1030
2550
 
1031
2551
  if(!bugs.track){
@@ -1054,6 +2574,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1054
2574
  } else {
1055
2575
  webshims.info("track support was overwritten. due to bad browser support");
1056
2576
  }
2577
+ return false;
1057
2578
  }
1058
2579
  };
1059
2580
  var detectTrackError = function(){
@@ -1077,7 +2598,7 @@ jQuery.webshims.register('dom-extend', function($, webshims, window, document, u
1077
2598
  }
1078
2599
 
1079
2600
  webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
1080
- hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
2601
+ hasSwf = swfmini.hasFlashPlayerVersion('9.0.115');
1081
2602
  $('html').addClass(hasSwf ? 'swf' : 'no-swf');
1082
2603
  var mediaelement = webshims.mediaelement;
1083
2604
  mediaelement.parseRtmp = function(data){
@@ -1170,7 +2691,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1170
2691
  loaded = true;
1171
2692
  webshims.loader.loadScript("https://www.youtube.com/player_api");
1172
2693
  $(function(){
1173
- webshims.polyfill("mediaelement-yt");
2694
+ webshims._polyfill(["mediaelement-yt"]);
1174
2695
  });
1175
2696
  };
1176
2697
  })();
@@ -1294,7 +2815,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1294
2815
  });
1295
2816
  };
1296
2817
 
1297
- 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'];
2818
+ 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'];
1298
2819
 
1299
2820
  mediaelement.canThirdPlaySrces = function(mediaElem, srces){
1300
2821
  var ret = '';
@@ -1319,11 +2840,12 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1319
2840
  if(hasNative){
1320
2841
  mediaElem = $(mediaElem);
1321
2842
  var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
1322
- if(!nativeCanPlayType[nodeName]){return ret;}
2843
+ var nativeCanPlay = (nativeCanPlayType[nodeName] || {prop: {_supvalue: false}}).prop._supvalue || mediaElem[0].canPlayType;
2844
+ if(!nativeCanPlay){return ret;}
1323
2845
  srces = srces || mediaelement.srces(mediaElem);
1324
2846
 
1325
2847
  $.each(srces, function(i, src){
1326
- if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
2848
+ if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
1327
2849
  ret = src;
1328
2850
  return false;
1329
2851
  }
@@ -1338,7 +2860,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1338
2860
  }
1339
2861
 
1340
2862
  $(elem).pause().data('mediaerror', message);
1341
- webshims.warn('mediaelementError: '+ message);
2863
+ webshims.error('mediaelementError: '+ message);
1342
2864
  setTimeout(function(){
1343
2865
  if($(elem).data('mediaerror')){
1344
2866
  $(elem).trigger('mediaerror');
@@ -1412,6 +2934,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1412
2934
  };
1413
2935
  mediaelement.selectSource = selectSource;
1414
2936
 
2937
+
1415
2938
  $(document).on('ended', function(e){
1416
2939
  var data = webshims.data(e.target, 'mediaelement');
1417
2940
  if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
@@ -1421,121 +2944,141 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
1421
2944
  }, 1);
1422
2945
 
1423
2946
  });
1424
- if(!supportsLoop){
1425
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
1426
- }
1427
2947
 
1428
- ['audio', 'video'].forEach(function(nodeName){
1429
- var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
1430
- prop: {
1431
- value: function(){
1432
- var data = webshims.data(this, 'mediaelement');
1433
- selectSource(this, data);
1434
- if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
1435
- supLoad.prop._supvalue.apply(this, arguments);
2948
+ webshims.ready('dom-support', function(){
2949
+ if(!supportsLoop){
2950
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
2951
+ }
2952
+
2953
+ ['audio', 'video'].forEach(function(nodeName){
2954
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
2955
+ prop: {
2956
+ value: function(){
2957
+ var data = webshims.data(this, 'mediaelement');
2958
+ selectSource(this, data);
2959
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
2960
+ supLoad.prop._supvalue.apply(this, arguments);
2961
+ }
1436
2962
  }
1437
2963
  }
1438
- }
1439
- });
1440
- nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
1441
- prop: {
1442
- value: function(type){
1443
- var ret = '';
1444
- if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
1445
- ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
1446
- if(ret == 'no'){
1447
- ret = '';
2964
+ });
2965
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
2966
+ prop: {
2967
+ value: function(type){
2968
+ var ret = '';
2969
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
2970
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
2971
+ if(ret == 'no'){
2972
+ ret = '';
2973
+ }
1448
2974
  }
1449
- }
1450
- if(!ret && hasSwf){
1451
- type = $.trim((type || '').split(';')[0]);
1452
- if(mediaelement.swfMimeTypes.indexOf(type) != -1){
1453
- ret = 'maybe';
2975
+ if(!ret && hasSwf){
2976
+ type = $.trim((type || '').split(';')[0]);
2977
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
2978
+ ret = 'maybe';
2979
+ }
1454
2980
  }
2981
+ return ret;
1455
2982
  }
1456
- return ret;
1457
2983
  }
2984
+ });
2985
+ });
2986
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
2987
+ set: function(){
2988
+ var elem = this;
2989
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2990
+ clearTimeout(baseData.loadTimer);
2991
+ baseData.loadTimer = setTimeout(function(){
2992
+ selectSource(elem);
2993
+ elem = null;
2994
+ }, 9);
1458
2995
  }
1459
2996
  });
1460
2997
  });
1461
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
1462
- set: function(){
1463
- var elem = this;
1464
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
1465
- clearTimeout(baseData.loadTimer);
1466
- baseData.loadTimer = setTimeout(function(){
1467
- selectSource(elem);
1468
- elem = null;
1469
- }, 9);
1470
- }
1471
- });
1472
2998
 
1473
2999
  var initMediaElements = function(){
1474
-
1475
- webshims.addReady(function(context, insertedElement){
1476
- var media = $('video, audio', context)
1477
- .add(insertedElement.filter('video, audio'))
1478
- .each(function(){
1479
- var data = webshims.data(this, 'mediaelement');
1480
-
1481
- if(hasNative && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])') && (!data || data.isActive == 'html5')){
1482
- //IE controls not visible bug
1483
- $(this).prop('preload', 'metadata').mediaLoad();
1484
- } else {
1485
- selectSource(this, data);
1486
- }
3000
+ var testFixMedia = function(){
3001
+ if(webshims.implement(this, 'mediaelement')){
3002
+ selectSource(this);
3003
+
3004
+ if(hasNative){
3005
+ var bufferTimer;
3006
+ var lastBuffered;
3007
+ var elem = this;
3008
+ var getBufferedString = function(){
3009
+ var buffered = $.prop(elem, 'buffered');
3010
+ if(!buffered){return;}
3011
+ var bufferString = "";
3012
+ for(var i = 0, len = buffered.length; i < len;i++){
3013
+ bufferString += buffered.end(i);
3014
+ }
3015
+ return bufferString;
3016
+ };
3017
+ var testBuffer = function(){
3018
+ var buffered = getBufferedString();
3019
+ if(buffered != lastBuffered){
3020
+ lastBuffered = buffered;
3021
+ $(elem).triggerHandler('progress');
3022
+ }
3023
+ };
1487
3024
 
1488
- if(hasNative){
1489
-
1490
- //FF progress bug
1491
- (function(){
1492
- var bufferTimer;
1493
- var lastBuffered;
1494
- var elem = this;
1495
- var getBufferedString = function(){
1496
- var buffered = $.prop(elem, 'buffered');
1497
- if(!buffered){return;}
1498
- var bufferString = "";
1499
- for(var i = 0, len = buffered.length; i < len;i++){
1500
- bufferString += buffered.end(i);
3025
+ $(this)
3026
+ .on({
3027
+ 'play loadstart progress': function(e){
3028
+ if(e.type == 'progress'){
3029
+ lastBuffered = getBufferedString();
1501
3030
  }
1502
- return bufferString;
1503
- };
1504
- var testBuffer = function(){
1505
- var buffered = getBufferedString();
1506
- if(buffered != lastBuffered){
1507
- lastBuffered = buffered;
1508
- $(elem).triggerHandler('progress');
3031
+ clearTimeout(bufferTimer);
3032
+ bufferTimer = setTimeout(testBuffer, 999);
3033
+ },
3034
+ 'emptied stalled mediaerror abort suspend': function(e){
3035
+ if(e.type == 'emptied'){
3036
+ lastBuffered = false;
1509
3037
  }
1510
- };
1511
-
1512
- $(this)
1513
- .on({
1514
- 'play loadstart progress': function(e){
1515
- if(e.type == 'progress'){
1516
- lastBuffered = getBufferedString();
1517
- }
1518
- clearTimeout(bufferTimer);
1519
- bufferTimer = setTimeout(testBuffer, 999);
1520
- },
1521
- 'emptied stalled mediaerror abort suspend': function(e){
1522
- if(e.type == 'emptied'){
1523
- lastBuffered = false;
1524
- }
1525
- clearTimeout(bufferTimer);
1526
- }
1527
- })
1528
- ;
1529
- })();
3038
+ clearTimeout(bufferTimer);
3039
+ }
3040
+ })
3041
+ ;
3042
+ if('ActiveXObject' in window && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay],.nonnative-api-active)')){
3043
+ $(this).prop('preload', 'metadata').mediaLoad();
1530
3044
  }
1531
-
1532
- })
1533
- ;
1534
- if(!loadTrackUi.loaded && $('track', media).length){
1535
- loadTrackUi();
3045
+ }
1536
3046
  }
1537
- media = null;
3047
+
3048
+ };
3049
+ var handleMedia = false;
3050
+
3051
+
3052
+ webshims.ready('dom-support', function(){
3053
+ handleMedia = true;
3054
+ webshims.addReady(function(context, insertedElement){
3055
+ var media = $('video, audio', context)
3056
+ .add(insertedElement.filter('video, audio'))
3057
+ .each(testFixMedia)
3058
+ ;
3059
+ if(!loadTrackUi.loaded && $('track', media).length){
3060
+ loadTrackUi();
3061
+ }
3062
+ media = null;
3063
+ });
1538
3064
  });
3065
+
3066
+ if(hasNative && !handleMedia){
3067
+ webshims.addReady(function(context, insertedElement){
3068
+ if(!handleMedia){
3069
+ $('video, audio', context)
3070
+ .add(insertedElement.filter('video, audio'))
3071
+ .each(function(){
3072
+ if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){
3073
+ loadThird();
3074
+ handleMedia = true;
3075
+ return false;
3076
+ }
3077
+ })
3078
+ ;
3079
+ }
3080
+ });
3081
+ }
1539
3082
  };
1540
3083
 
1541
3084
  if(Modernizr.track && !bugs.track){