webshims-rails 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/lib/webshims-rails.rb +1 -1
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/readme.textile +5 -3
  4. data/vendor/assets/javascripts/webshims/dev/extras/custom-validity.js +261 -0
  5. data/vendor/assets/javascripts/webshims/dev/extras/modernizr-custom.js +535 -0
  6. data/vendor/assets/javascripts/webshims/dev/extras/mousepress.js +60 -0
  7. data/vendor/assets/javascripts/webshims/dev/polyfiller.js +1171 -0
  8. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/README +62 -0
  9. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/canvas2png.js +42 -0
  10. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.js +28 -0
  11. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/proxy.php +73 -0
  13. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/save.php +49 -0
  14. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/README +82 -0
  15. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/canvas2png.js +42 -0
  16. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  18. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flashcanvas.js +31 -0
  19. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/proxy.php +73 -0
  20. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/save.php +49 -0
  21. data/vendor/assets/javascripts/webshims/dev/shims/combos/1.js +1710 -0
  22. data/vendor/assets/javascripts/webshims/dev/shims/combos/10.js +3317 -0
  23. data/vendor/assets/javascripts/webshims/dev/shims/combos/11.js +1585 -0
  24. data/vendor/assets/javascripts/webshims/dev/shims/combos/12.js +1587 -0
  25. data/vendor/assets/javascripts/webshims/dev/shims/combos/13.js +1054 -0
  26. data/vendor/assets/javascripts/webshims/dev/shims/combos/14.js +476 -0
  27. data/vendor/assets/javascripts/webshims/dev/shims/combos/15.js +314 -0
  28. data/vendor/assets/javascripts/webshims/dev/shims/combos/16.js +2101 -0
  29. data/vendor/assets/javascripts/webshims/dev/shims/combos/17.js +2264 -0
  30. data/vendor/assets/javascripts/webshims/dev/shims/combos/18.js +2161 -0
  31. data/vendor/assets/javascripts/webshims/dev/shims/combos/19.js +2244 -0
  32. data/vendor/assets/javascripts/webshims/dev/shims/combos/2.js +2294 -0
  33. data/vendor/assets/javascripts/webshims/dev/shims/combos/20.js +1607 -0
  34. data/vendor/assets/javascripts/webshims/dev/shims/combos/21.js +1635 -0
  35. data/vendor/assets/javascripts/webshims/dev/shims/combos/22.js +2409 -0
  36. data/vendor/assets/javascripts/webshims/dev/shims/combos/23.js +2168 -0
  37. data/vendor/assets/javascripts/webshims/dev/shims/combos/24.js +2777 -0
  38. data/vendor/assets/javascripts/webshims/dev/shims/combos/25.js +2204 -0
  39. data/vendor/assets/javascripts/webshims/dev/shims/combos/26.js +2863 -0
  40. data/vendor/assets/javascripts/webshims/dev/shims/combos/27.js +4079 -0
  41. data/vendor/assets/javascripts/webshims/dev/shims/combos/3.js +2971 -0
  42. data/vendor/assets/javascripts/webshims/dev/shims/combos/4.js +823 -0
  43. data/vendor/assets/javascripts/webshims/dev/shims/combos/5.js +1078 -0
  44. data/vendor/assets/javascripts/webshims/dev/shims/combos/59.js +1754 -0
  45. data/vendor/assets/javascripts/webshims/dev/shims/combos/6.js +1230 -0
  46. data/vendor/assets/javascripts/webshims/dev/shims/combos/7.js +1485 -0
  47. data/vendor/assets/javascripts/webshims/dev/shims/combos/8.js +1442 -0
  48. data/vendor/assets/javascripts/webshims/dev/shims/combos/9.js +2515 -0
  49. data/vendor/assets/javascripts/webshims/dev/shims/details.js +146 -0
  50. data/vendor/assets/javascripts/webshims/dev/shims/dom-extend.js +908 -0
  51. data/vendor/assets/javascripts/webshims/dev/shims/es5.js +802 -0
  52. data/vendor/assets/javascripts/webshims/dev/shims/excanvas.js +924 -0
  53. data/vendor/assets/javascripts/webshims/dev/shims/form-core.js +660 -0
  54. data/vendor/assets/javascripts/webshims/dev/shims/form-datalist.js +677 -0
  55. data/vendor/assets/javascripts/webshims/dev/shims/form-message.js +164 -0
  56. data/vendor/assets/javascripts/webshims/dev/shims/form-native-extend.js +256 -0
  57. data/vendor/assets/javascripts/webshims/dev/shims/form-native-fix.js +261 -0
  58. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-api.js +384 -0
  59. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-ui.js +847 -0
  60. data/vendor/assets/javascripts/webshims/dev/shims/form-shim-extend.js +1472 -0
  61. data/vendor/assets/javascripts/webshims/dev/shims/geolocation.js +168 -0
  62. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ar.js +32 -0
  63. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ch-ZN.js +32 -0
  64. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-de.txt +33 -0
  65. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-el.js +32 -0
  66. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-en.txt +34 -0
  67. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-es.js +32 -0
  68. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-fr.js +32 -0
  69. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-he.js +32 -0
  70. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hi.js +32 -0
  71. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hu.js +32 -0
  72. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-it.js +32 -0
  73. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ja.js +32 -0
  74. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-nl.js +32 -0
  75. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-pt-PT.js +32 -0
  76. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ru.js +32 -0
  77. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-sv.js +32 -0
  78. data/vendor/assets/javascripts/webshims/dev/shims/json-storage.js +308 -0
  79. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/license.txt +1 -0
  80. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/player.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/readme.html +87 -0
  82. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-core.js +534 -0
  83. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-native-fix.js +99 -0
  84. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-swf.js +1074 -0
  85. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-yt.js +543 -0
  86. data/vendor/assets/javascripts/webshims/dev/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/dev/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/dev/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/dev/shims/styles/shim.css +677 -0
  90. data/vendor/assets/javascripts/webshims/dev/shims/swf/jwwebshims.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/dev/shims/swf/localStorage.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/dev/shims/track-ui.js +292 -0
  93. data/vendor/assets/javascripts/webshims/dev/shims/track.js +763 -0
  94. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +20 -20
  95. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +29 -29
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +37 -33
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +83 -76
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +44 -42
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -38
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -25
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +60 -55
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +68 -64
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +60 -59
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +66 -64
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +74 -69
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +46 -43
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -47
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +61 -57
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +68 -60
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +82 -77
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +58 -0
  112. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +80 -0
  113. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -0
  114. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +96 -91
  115. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +30 -31
  116. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +37 -39
  117. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +59 -61
  118. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +31 -29
  119. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +38 -37
  120. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +38 -33
  121. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +68 -63
  122. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +22 -20
  123. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +15 -14
  124. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +22 -22
  125. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +22 -22
  126. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +8 -9
  127. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +7 -8
  128. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +23 -21
  129. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +44 -33
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +3 -0
  131. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  132. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +86 -86
  133. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +16 -13
  134. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +30 -30
  135. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +14 -0
  136. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +71 -10
  137. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -0
  138. data/vendor/assets/javascripts/webshims/minified/shims/track.js +20 -0
  139. metadata +101 -5
  140. data/vendor/assets/javascripts/webshims/minified/shims/form-output.js +0 -5
@@ -0,0 +1,4079 @@
1
+ // vim: ts=4 sts=4 sw=4 expandtab
2
+ // -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License
3
+ // -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)
4
+ // -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA
5
+ // -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License
6
+ // -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License
7
+ // -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License
8
+ // -- kossnocorp Sasha Koss XXX TODO License or CLA
9
+ // -- bryanforbes Bryan Forbes XXX TODO License or CLA
10
+ // -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence
11
+ // -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License
12
+ // -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License
13
+ // -- bbqsrc Brendan Molloy XXX TODO License or CLA
14
+ // -- iwyg XXX TODO License or CLA
15
+ // -- DomenicDenicola Domenic Denicola XXX TODO License or CLA
16
+ // -- xavierm02 Montillet Xavier XXX TODO License or CLA
17
+ // -- Raynos Raynos XXX TODO License or CLA
18
+ // -- samsonjs Sami Samhuri XXX TODO License or CLA
19
+ // -- rwldrn Rick Waldron Copyright (C) 2011 MIT License
20
+ // -- lexer Alexey Zakharov XXX TODO License or CLA
21
+
22
+ /*!
23
+ Copyright (c) 2009, 280 North Inc. http://280north.com/
24
+ MIT License. http://github.com/280north/narwhal/blob/master/README.md
25
+ */
26
+
27
+ (function (undefined) {
28
+
29
+ /**
30
+ * Brings an environment as close to ECMAScript 5 compliance
31
+ * as is possible with the facilities of erstwhile engines.
32
+ *
33
+ * ES5 Draft
34
+ * http://www.ecma-international.org/publications/files/drafts/tc39-2009-050.pdf
35
+ *
36
+ * NOTE: this is a draft, and as such, the URL is subject to change. If the
37
+ * link is broken, check in the parent directory for the latest TC39 PDF.
38
+ * http://www.ecma-international.org/publications/files/drafts/
39
+ *
40
+ * Previous ES5 Draft
41
+ * http://www.ecma-international.org/publications/files/drafts/tc39-2009-025.pdf
42
+ * This is a broken link to the previous draft of ES5 on which most of the
43
+ * numbered specification references and quotes herein were taken. Updating
44
+ * these references and quotes to reflect the new document would be a welcome
45
+ * volunteer project.
46
+ *
47
+ * @module
48
+ */
49
+
50
+ /*whatsupdoc*/
51
+
52
+ // Shortcut to an often accessed properties, in order to avoid multiple
53
+ // dereference that costs universally.
54
+ // _Please note: Shortcuts are defined after `Function.prototype.bind` as we
55
+ // us it in defining shortcuts.
56
+ var call = Function.prototype.call;
57
+ var prototypeOfArray = Array.prototype;
58
+ var prototypeOfObject = Object.prototype;
59
+ var slice = prototypeOfArray.slice;
60
+ var owns;
61
+ var toString;
62
+
63
+ // ES-5 15.3.4.5
64
+ // http://www.ecma-international.org/publications/files/drafts/tc39-2009-025.pdf
65
+
66
+ if (!Function.prototype.bind) {
67
+ Function.prototype.bind = function (that) { // .length is 1
68
+ // 1. Let Target be the this value.
69
+ var target = this;
70
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
71
+ if (typeof target != "function")
72
+ throw new TypeError(); // TODO message
73
+ // 3. Let A be a new (possibly empty) internal list of all of the
74
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
75
+ // XXX slicedArgs will stand in for "A" if used
76
+ var args = slice.call(arguments, 1); // for normal call
77
+ // 4. Let F be a new native ECMAScript object.
78
+ // 9. Set the [[Prototype]] internal property of F to the standard
79
+ // built-in Function prototype object as specified in 15.3.3.1.
80
+ // 10. Set the [[Call]] internal property of F as described in
81
+ // 15.3.4.5.1.
82
+ // 11. Set the [[Construct]] internal property of F as described in
83
+ // 15.3.4.5.2.
84
+ // 12. Set the [[HasInstance]] internal property of F as described in
85
+ // 15.3.4.5.3.
86
+ // 13. The [[Scope]] internal property of F is unused and need not
87
+ // exist.
88
+ var bound = function () {
89
+
90
+ if (this instanceof bound) {
91
+ // 15.3.4.5.2 [[Construct]]
92
+ // When the [[Construct]] internal method of a function object,
93
+ // F that was created using the bind function is called with a
94
+ // list of arguments ExtraArgs the following steps are taken:
95
+ // 1. Let target be the value of F's [[TargetFunction]]
96
+ // internal property.
97
+ // 2. If target has no [[Construct]] internal method, a
98
+ // TypeError exception is thrown.
99
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
100
+ // property.
101
+ // 4. Let args be a new list containing the same values as the
102
+ // list boundArgs in the same order followed by the same
103
+ // values as the list ExtraArgs in the same order.
104
+
105
+ var F = function(){};
106
+ F.prototype = target.prototype;
107
+ var self = new F;
108
+
109
+ var result = target.apply(
110
+ self,
111
+ args.concat(slice.call(arguments))
112
+ );
113
+ if (result !== null && Object(result) === result)
114
+ return result;
115
+ return self;
116
+
117
+ } else {
118
+ // 15.3.4.5.1 [[Call]]
119
+ // When the [[Call]] internal method of a function object, F,
120
+ // which was created using the bind function is called with a
121
+ // this value and a list of arguments ExtraArgs the following
122
+ // steps are taken:
123
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
124
+ // property.
125
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
126
+ // property.
127
+ // 3. Let target be the value of F's [[TargetFunction]] internal
128
+ // property.
129
+ // 4. Let args be a new list containing the same values as the list
130
+ // boundArgs in the same order followed by the same values as
131
+ // the list ExtraArgs in the same order. 5. Return the
132
+ // result of calling the [[Call]] internal method of target
133
+ // providing boundThis as the this value and providing args
134
+ // as the arguments.
135
+
136
+ // equiv: target.call(this, ...boundArgs, ...args)
137
+ return target.apply(
138
+ that,
139
+ args.concat(slice.call(arguments))
140
+ );
141
+
142
+ }
143
+
144
+ };
145
+ // XXX bound.length is never writable, so don't even try
146
+ //
147
+ // 16. The length own property of F is given attributes as specified in
148
+ // 15.3.5.1.
149
+ // TODO
150
+ // 17. Set the [[Extensible]] internal property of F to true.
151
+ // TODO
152
+ // 18. Call the [[DefineOwnProperty]] internal method of F with
153
+ // arguments "caller", PropertyDescriptor {[[Value]]: null,
154
+ // [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:
155
+ // false}, and false.
156
+ // TODO
157
+ // 19. Call the [[DefineOwnProperty]] internal method of F with
158
+ // arguments "arguments", PropertyDescriptor {[[Value]]: null,
159
+ // [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:
160
+ // false}, and false.
161
+ // TODO
162
+ // NOTE Function objects created using Function.prototype.bind do not
163
+ // have a prototype property.
164
+ // XXX can't delete it in pure-js.
165
+ return bound;
166
+ };
167
+ }
168
+
169
+ toString = call.bind(prototypeOfObject.toString);
170
+ owns = call.bind(prototypeOfObject.hasOwnProperty);
171
+
172
+
173
+ //
174
+ // Array
175
+ // =====
176
+ //
177
+
178
+ // ES5 15.4.3.2
179
+ if (!Array.isArray) {
180
+ Array.isArray = function (obj) {
181
+ return toString(obj) == "[object Array]";
182
+ };
183
+ }
184
+
185
+ // The IsCallable() check in the Array functions
186
+ // has been replaced with a strict check on the
187
+ // internal class of the object to trap cases where
188
+ // the provided function was actually a regular
189
+ // expression literal, which in V8 and
190
+ // JavaScriptCore is a typeof "function". Only in
191
+ // V8 are regular expression literals permitted as
192
+ // reduce parameters, so it is desirable in the
193
+ // general case for the shim to match the more
194
+ // strict and common behavior of rejecting regular
195
+ // expressions.
196
+
197
+ // ES5 15.4.4.18
198
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
199
+ if (!Array.prototype.forEach) {
200
+ Array.prototype.forEach = function (fun /*, thisp*/) {
201
+ var self = toObject(this),
202
+ thisp = arguments[1],
203
+ i = 0,
204
+ length = self.length >>> 0;
205
+
206
+ // If no callback function or if callback is not a callable function
207
+ if (toString(fun) != "[object Function]") {
208
+ throw new TypeError(); // TODO message
209
+ }
210
+
211
+ while (i < length) {
212
+ if (i in self) {
213
+ // Invoke the callback function with call, passing arguments:
214
+ // context, property value, property key, thisArg object context
215
+ fun.call(thisp, self[i], i, self);
216
+ }
217
+ i++;
218
+ }
219
+ };
220
+ }
221
+
222
+ // ES5 15.4.4.19
223
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
224
+ if (!Array.prototype.map) {
225
+ Array.prototype.map = function (fun /*, thisp*/) {
226
+ var self = toObject(this),
227
+ length = self.length >>> 0,
228
+ result = Array(length),
229
+ thisp = arguments[1];
230
+
231
+ // If no callback function or if callback is not a callable function
232
+ if (toString(fun) != "[object Function]") {
233
+ throw new TypeError(); // TODO message
234
+ }
235
+
236
+ for (var i = 0; i < length; i++) {
237
+ if (i in self)
238
+ result[i] = fun.call(thisp, self[i], i, self);
239
+ }
240
+ return result;
241
+ };
242
+ }
243
+
244
+ // ES5 15.4.4.20
245
+ if (!Array.prototype.filter) {
246
+ Array.prototype.filter = function (fun /*, thisp */) {
247
+ var self = toObject(this),
248
+ length = self.length >>> 0,
249
+ result = [],
250
+ thisp = arguments[1];
251
+
252
+ // If no callback function or if callback is not a callable function
253
+ if (toString(fun) != "[object Function]") {
254
+ throw new TypeError(); // TODO message
255
+ }
256
+
257
+ for (var i = 0; i < length; i++) {
258
+ if (i in self && fun.call(thisp, self[i], i, self))
259
+ result.push(self[i]);
260
+ }
261
+ return result;
262
+ };
263
+ }
264
+
265
+ // ES5 15.4.4.16
266
+ if (!Array.prototype.every) {
267
+ Array.prototype.every = function (fun /*, thisp */) {
268
+ var self = toObject(this),
269
+ length = self.length >>> 0,
270
+ thisp = arguments[1];
271
+
272
+ // If no callback function or if callback is not a callable function
273
+ if (toString(fun) != "[object Function]") {
274
+ throw new TypeError(); // TODO message
275
+ }
276
+
277
+ for (var i = 0; i < length; i++) {
278
+ if (i in self && !fun.call(thisp, self[i], i, self))
279
+ return false;
280
+ }
281
+ return true;
282
+ };
283
+ }
284
+
285
+ // ES5 15.4.4.17
286
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
287
+ if (!Array.prototype.some) {
288
+ Array.prototype.some = function (fun /*, thisp */) {
289
+ var self = toObject(this),
290
+ length = self.length >>> 0,
291
+ thisp = arguments[1];
292
+
293
+ // If no callback function or if callback is not a callable function
294
+ if (toString(fun) != "[object Function]") {
295
+ throw new TypeError(); // TODO message
296
+ }
297
+
298
+ for (var i = 0; i < length; i++) {
299
+ if (i in self && fun.call(thisp, self[i], i, self))
300
+ return true;
301
+ }
302
+ return false;
303
+ };
304
+ }
305
+
306
+ // ES5 15.4.4.21
307
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
308
+ if (!Array.prototype.reduce) {
309
+ Array.prototype.reduce = function (fun /*, initial*/) {
310
+ var self = toObject(this),
311
+ length = self.length >>> 0;
312
+
313
+ // If no callback function or if callback is not a callable function
314
+ if (toString(fun) != "[object Function]") {
315
+ throw new TypeError(); // TODO message
316
+ }
317
+
318
+ // no value to return if no initial value and an empty array
319
+ if (!length && arguments.length == 1)
320
+ throw new TypeError(); // TODO message
321
+
322
+ var i = 0;
323
+ var result;
324
+ if (arguments.length >= 2) {
325
+ result = arguments[1];
326
+ } else {
327
+ do {
328
+ if (i in self) {
329
+ result = self[i++];
330
+ break;
331
+ }
332
+
333
+ // if array contains no values, no initial value to return
334
+ if (++i >= length)
335
+ throw new TypeError(); // TODO message
336
+ } while (true);
337
+ }
338
+
339
+ for (; i < length; i++) {
340
+ if (i in self)
341
+ result = fun.call(void 0, result, self[i], i, self);
342
+ }
343
+
344
+ return result;
345
+ };
346
+ }
347
+
348
+ // ES5 15.4.4.22
349
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
350
+ if (!Array.prototype.reduceRight) {
351
+ Array.prototype.reduceRight = function (fun /*, initial*/) {
352
+ var self = toObject(this),
353
+ length = self.length >>> 0;
354
+
355
+ // If no callback function or if callback is not a callable function
356
+ if (toString(fun) != "[object Function]") {
357
+ throw new TypeError(); // TODO message
358
+ }
359
+
360
+ // no value to return if no initial value, empty array
361
+ if (!length && arguments.length == 1)
362
+ throw new TypeError(); // TODO message
363
+
364
+ var result, i = length - 1;
365
+ if (arguments.length >= 2) {
366
+ result = arguments[1];
367
+ } else {
368
+ do {
369
+ if (i in self) {
370
+ result = self[i--];
371
+ break;
372
+ }
373
+
374
+ // if array contains no values, no initial value to return
375
+ if (--i < 0)
376
+ throw new TypeError(); // TODO message
377
+ } while (true);
378
+ }
379
+
380
+ do {
381
+ if (i in this)
382
+ result = fun.call(void 0, result, self[i], i, self);
383
+ } while (i--);
384
+
385
+ return result;
386
+ };
387
+ }
388
+
389
+ // ES5 15.4.4.14
390
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
391
+ if (!Array.prototype.indexOf) {
392
+ Array.prototype.indexOf = function (sought /*, fromIndex */ ) {
393
+ var self = toObject(this),
394
+ length = self.length >>> 0;
395
+
396
+ if (!length)
397
+ return -1;
398
+
399
+ var i = 0;
400
+ if (arguments.length > 1)
401
+ i = toInteger(arguments[1]);
402
+
403
+ // handle negative indices
404
+ i = i >= 0 ? i : length - Math.abs(i);
405
+ for (; i < length; i++) {
406
+ if (i in self && self[i] === sought) {
407
+ return i;
408
+ }
409
+ }
410
+ return -1;
411
+ };
412
+ }
413
+
414
+ // ES5 15.4.4.15
415
+ if (!Array.prototype.lastIndexOf) {
416
+ Array.prototype.lastIndexOf = function (sought /*, fromIndex */) {
417
+ var self = toObject(this),
418
+ length = self.length >>> 0;
419
+
420
+ if (!length)
421
+ return -1;
422
+ var i = length - 1;
423
+ if (arguments.length > 1)
424
+ i = toInteger(arguments[1]);
425
+ // handle negative indices
426
+ i = i >= 0 ? i : length - Math.abs(i);
427
+ for (; i >= 0; i--) {
428
+ if (i in self && sought === self[i])
429
+ return i;
430
+ }
431
+ return -1;
432
+ };
433
+ }
434
+
435
+ //
436
+ // Array
437
+ // =====
438
+ //
439
+
440
+ // ES5 15.4.4.12
441
+ // http://es5.github.com/#x15.4.4.12
442
+ // Default value for second param
443
+ // [bugfix, ielt9, old browsers]
444
+ // IE < 9 bug: [1,2].splice(0).join("") == "" but should be "12"
445
+ if([1,2].splice(0).length != 2) {
446
+ var _origArraySplice = Array.prototype.splice;
447
+
448
+ Array.prototype.splice = function(start, deleteCount) {
449
+ if(!arguments.length)return [];
450
+
451
+ return _origArraySplice.apply(this, [
452
+ start === void 0 ? 0 : start,
453
+ deleteCount === void 0 ? (this.length - start) : deleteCount
454
+ ].concat(slice.call(arguments, 2)))
455
+ };
456
+ }
457
+
458
+ //
459
+ // Object
460
+ // ======
461
+ //
462
+
463
+
464
+ // ES5 15.2.3.14
465
+ // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
466
+ if (!Object.keys) {
467
+
468
+ var hasDontEnumBug = true,
469
+ dontEnums = [
470
+ "toString",
471
+ "toLocaleString",
472
+ "valueOf",
473
+ "hasOwnProperty",
474
+ "isPrototypeOf",
475
+ "propertyIsEnumerable",
476
+ "constructor"
477
+ ],
478
+ dontEnumsLength = dontEnums.length;
479
+
480
+ for (var key in {"toString": null})
481
+ hasDontEnumBug = false;
482
+
483
+ Object.keys = function keys(object) {
484
+
485
+ if ((typeof object != "object" && typeof object != "function") || object === null)
486
+ throw new TypeError("Object.keys called on a non-object");
487
+
488
+ var keys = [];
489
+ for (var name in object) {
490
+ if (owns(object, name)) {
491
+ keys.push(name);
492
+ }
493
+ }
494
+
495
+ if (hasDontEnumBug) {
496
+ for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
497
+ var dontEnum = dontEnums[i];
498
+ if (owns(object, dontEnum)) {
499
+ keys.push(dontEnum);
500
+ }
501
+ }
502
+ }
503
+
504
+ return keys;
505
+ };
506
+
507
+ }
508
+
509
+ //
510
+ // Date
511
+ // ====
512
+ //
513
+
514
+ // ES5 15.9.5.43
515
+ // Format a Date object as a string according to a simplified subset of the ISO 8601
516
+ // standard as defined in 15.9.1.15.
517
+ if (!Date.prototype.toISOString) {
518
+ Date.prototype.toISOString = function toISOString() {
519
+ var result, length, value;
520
+ if (!isFinite(this))
521
+ throw new RangeError;
522
+
523
+ // the date time string format is specified in 15.9.1.15.
524
+ result = [this.getUTCFullYear(), this.getUTCMonth() + 1, this.getUTCDate(),
525
+ this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
526
+
527
+ length = result.length;
528
+ while (length--) {
529
+ value = result[length];
530
+ // pad months, days, hours, minutes, and seconds to have two digits.
531
+ if (value < 10)
532
+ result[length] = "0" + value;
533
+ }
534
+ // pad milliseconds to have three digits.
535
+ return result.slice(0, 3).join("-") + "T" + result.slice(3).join(":") + "." +
536
+ ("000" + this.getUTCMilliseconds()).slice(-3) + "Z";
537
+ }
538
+ }
539
+
540
+ // ES5 15.9.4.4
541
+ if (!Date.now) {
542
+ Date.now = function now() {
543
+ return new Date().getTime();
544
+ };
545
+ }
546
+
547
+ // ES5 15.9.5.44
548
+ if (!Date.prototype.toJSON) {
549
+ Date.prototype.toJSON = function toJSON(key) {
550
+ // This function provides a String representation of a Date object for
551
+ // use by JSON.stringify (15.12.3). When the toJSON method is called
552
+ // with argument key, the following steps are taken:
553
+
554
+ // 1. Let O be the result of calling ToObject, giving it the this
555
+ // value as its argument.
556
+ // 2. Let tv be ToPrimitive(O, hint Number).
557
+ // 3. If tv is a Number and is not finite, return null.
558
+ // XXX
559
+ // 4. Let toISO be the result of calling the [[Get]] internal method of
560
+ // O with argument "toISOString".
561
+ // 5. If IsCallable(toISO) is false, throw a TypeError exception.
562
+ if (typeof this.toISOString != "function")
563
+ throw new TypeError(); // TODO message
564
+ // 6. Return the result of calling the [[Call]] internal method of
565
+ // toISO with O as the this value and an empty argument list.
566
+ return this.toISOString();
567
+
568
+ // NOTE 1 The argument is ignored.
569
+
570
+ // NOTE 2 The toJSON function is intentionally generic; it does not
571
+ // require that its this value be a Date object. Therefore, it can be
572
+ // transferred to other kinds of objects for use as a method. However,
573
+ // it does require that any such object have a toISOString method. An
574
+ // object is free to use the argument key to filter its
575
+ // stringification.
576
+ };
577
+ }
578
+
579
+
580
+ //
581
+ // String
582
+ // ======
583
+ //
584
+
585
+ // ES5 15.5.4.20
586
+ var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
587
+ "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
588
+ "\u2029\uFEFF";
589
+ if (!String.prototype.trim || ws.trim()) {
590
+ // http://blog.stevenlevithan.com/archives/faster-trim-javascript
591
+ // http://perfectionkills.com/whitespace-deviations/
592
+ ws = "[" + ws + "]";
593
+ var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
594
+ trimEndRegexp = new RegExp(ws + ws + "*$");
595
+ String.prototype.trim = function trim() {
596
+ return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
597
+ };
598
+ }
599
+
600
+ // ES5 15.5.4.14
601
+ // http://es5.github.com/#x15.5.4.14
602
+ // [bugfix, chrome]
603
+ // If separator is undefined, then the result array contains just one String, which is the this value (converted to a String). If limit is not undefined, then the output array is truncated so that it contains no more than limit elements.
604
+ // "0".split(undefined, 0) -> []
605
+ if("0".split(void 0, 0).length) {
606
+ var oldSplit = String.prototype.split;
607
+ String.prototype.split = function(separator, limit) {
608
+ if(separator === void 0 && limit === 0)return [];
609
+ return oldSplit.apply(this, arguments);
610
+ }
611
+ }
612
+
613
+ // ECMA-262, 3rd B.2.3
614
+ // Note an ECMAScript standart, although ECMAScript 3rd Edition has a non-normative section suggesting uniform semantics
615
+ // and it should be normalized across all browsers
616
+ // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
617
+ if("".substr && "0b".substr(-1) !== "b") {
618
+ var oldSubstr = String.prototype.substr;
619
+ /**
620
+ * Get the substring of a string
621
+ * @param {integer} start where to start the substring
622
+ * @param {integer} length how many characters to return
623
+ * @return {string}
624
+ */
625
+ String.prototype.substr = function(start, length) {
626
+ return oldSubstr.call(this, start < 0 ? (start = this.length + start) < 0 ? 0 : start : start, length);
627
+ }
628
+ }
629
+
630
+ //
631
+ // Util
632
+ // ======
633
+ //
634
+
635
+ // http://jsperf.com/to-integer
636
+ var toInteger = function (n) {
637
+ n = +n;
638
+ if (n !== n) // isNaN
639
+ n = -1;
640
+ else if (n !== 0 && n !== (1/0) && n !== -(1/0))
641
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
642
+ return n;
643
+ };
644
+
645
+ var prepareString = "a"[0] != "a",
646
+ // ES5 9.9
647
+ toObject = function (o) {
648
+ if (o == null) { // this matches both null and undefined
649
+ throw new TypeError(); // TODO message
650
+ }
651
+ // If the implementation doesn't support by-index access of
652
+ // string characters (ex. IE < 7), split the string
653
+ if (prepareString && typeof o == "string" && o) {
654
+ return o.split("");
655
+ }
656
+ return Object(o);
657
+ };
658
+
659
+ })();
660
+
661
+
662
+
663
+ (function($, shims){
664
+ var defineProperty = 'defineProperty';
665
+ var advancedObjectProperties = !!(Object.create && Object.defineProperties && Object.getOwnPropertyDescriptor);
666
+ //safari5 has defineProperty-interface, but it can't be used on dom-object
667
+ //only do this test in non-IE browsers, because this hurts dhtml-behavior in some IE8 versions
668
+ if (advancedObjectProperties && !$.browser.msie && Object[defineProperty] && Object.prototype.__defineGetter__) {
669
+ (function(){
670
+ try {
671
+ var foo = document.createElement('foo');
672
+ Object[defineProperty](foo, 'bar', {
673
+ get: function(){
674
+ return true;
675
+ }
676
+ });
677
+ advancedObjectProperties = !!foo.bar;
678
+ }
679
+ catch (e) {
680
+ advancedObjectProperties = false;
681
+ }
682
+ foo = null;
683
+ })();
684
+ }
685
+
686
+ Modernizr.objectAccessor = !!((advancedObjectProperties || (Object.prototype.__defineGetter__ && Object.prototype.__lookupSetter__)) && (!$.browser.opera || shims.browserVersion >= 11));
687
+ Modernizr.advancedObjectProperties = advancedObjectProperties;
688
+
689
+ if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !Object.getOwnPropertyDescriptor || !Object.defineProperty)){
690
+ var call = Function.prototype.call;
691
+ var prototypeOfObject = Object.prototype;
692
+ var owns = call.bind(prototypeOfObject.hasOwnProperty);
693
+
694
+ shims.objectCreate = function(proto, props, opts, no__proto__){
695
+ var o;
696
+ var f = function(){};
697
+
698
+ f.prototype = proto;
699
+ o = new f();
700
+
701
+ if(!no__proto__ && !('__proto__' in o) && !Modernizr.objectAccessor){
702
+ o.__proto__ = proto;
703
+ }
704
+
705
+ if(props){
706
+ shims.defineProperties(o, props);
707
+ }
708
+
709
+ if(opts){
710
+ o.options = jQuery.extend(true, {}, o.options || {}, opts);
711
+ opts = o.options;
712
+ }
713
+
714
+ if(o._create && jQuery.isFunction(o._create)){
715
+ o._create(opts);
716
+ }
717
+ return o;
718
+ };
719
+
720
+ shims.defineProperties = function(object, props){
721
+ for (var name in props) {
722
+ if (owns(props, name)) {
723
+ shims.defineProperty(object, name, props[name]);
724
+ }
725
+ }
726
+ return object;
727
+ };
728
+
729
+ var descProps = ['configurable', 'enumerable', 'writable'];
730
+ shims.defineProperty = function(proto, property, descriptor){
731
+ if(typeof descriptor != "object" || descriptor === null){return proto;}
732
+
733
+ if(owns(descriptor, "value")){
734
+ proto[property] = descriptor.value;
735
+ return proto;
736
+ }
737
+
738
+ if(proto.__defineGetter__){
739
+ if (typeof descriptor.get == "function") {
740
+ proto.__defineGetter__(property, descriptor.get);
741
+ }
742
+ if (typeof descriptor.set == "function"){
743
+ proto.__defineSetter__(property, descriptor.set);
744
+ }
745
+ }
746
+ return proto;
747
+ };
748
+
749
+ shims.getPrototypeOf = function (object) {
750
+ return Object.getPrototypeOf && Object.getPrototypeOf(object) || object.__proto__ || object.constructor && object.constructor.prototype;
751
+ };
752
+
753
+ //based on http://www.refactory.org/s/object_getownpropertydescriptor/view/latest
754
+ shims.getOwnPropertyDescriptor = function(obj, prop){
755
+ if (typeof obj !== "object" && typeof obj !== "function" || obj === null){
756
+ throw new TypeError("Object.getOwnPropertyDescriptor called on a non-object");
757
+ }
758
+ var descriptor;
759
+ if(Object.defineProperty && Object.getOwnPropertyDescriptor){
760
+ try{
761
+ descriptor = Object.getOwnPropertyDescriptor(obj, prop);
762
+ return descriptor;
763
+ } catch(e){}
764
+ }
765
+ descriptor = {
766
+ configurable: true,
767
+ enumerable: true,
768
+ writable: true,
769
+ value: undefined
770
+ };
771
+ var getter = obj.__lookupGetter__ && obj.__lookupGetter__(prop),
772
+ setter = obj.__lookupSetter__ && obj.__lookupSetter__(prop)
773
+ ;
774
+
775
+ if (!getter && !setter) { // not an accessor so return prop
776
+ if(!owns(obj, prop)){
777
+ return;
778
+ }
779
+ descriptor.value = obj[prop];
780
+ return descriptor;
781
+ }
782
+
783
+ // there is an accessor, remove descriptor.writable; populate descriptor.get and descriptor.set
784
+ delete descriptor.writable;
785
+ delete descriptor.value;
786
+ descriptor.get = descriptor.set = undefined;
787
+
788
+ if(getter){
789
+ descriptor.get = getter;
790
+ }
791
+
792
+ if(setter){
793
+ descriptor.set = setter;
794
+ }
795
+
796
+ return descriptor;
797
+ };
798
+
799
+ }
800
+ })(jQuery, jQuery.webshims);
801
+
802
+
803
+ //DOM-Extension helper
804
+ jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){
805
+ "use strict";
806
+ //shortcus
807
+ var modules = webshims.modules;
808
+ var listReg = /\s*,\s*/;
809
+
810
+ //proxying attribute
811
+ var olds = {};
812
+ var havePolyfill = {};
813
+ var extendedProps = {};
814
+ var extendQ = {};
815
+ var modifyProps = {};
816
+
817
+ var oldVal = $.fn.val;
818
+ var singleVal = function(elem, name, val, pass, _argless){
819
+ return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
820
+ };
821
+ $.fn.val = function(val){
822
+ var elem = this[0];
823
+ if(arguments.length && val == null){
824
+ val = '';
825
+ }
826
+ if(!arguments.length){
827
+ if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
828
+ return $.prop(elem, 'value', val, 'val', true);
829
+ }
830
+ if($.isArray(val)){
831
+ return oldVal.apply(this, arguments);
832
+ }
833
+ var isFunction = $.isFunction(val);
834
+ return this.each(function(i){
835
+ elem = this;
836
+ if(elem.nodeType === 1){
837
+ if(isFunction){
838
+ var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
839
+ if(genVal == null){
840
+ genVal = '';
841
+ }
842
+ $.prop(elem, 'value', genVal, 'val') ;
843
+ } else {
844
+ $.prop(elem, 'value', val, 'val');
845
+ }
846
+ }
847
+ });
848
+ };
849
+
850
+ var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
851
+ var elementData = function(elem, key, val){
852
+ elem = elem.jquery ? elem[0] : elem;
853
+ if(!elem){return val || {};}
854
+ var data = $.data(elem, dataID);
855
+ if(val !== undefined){
856
+ if(!data){
857
+ data = $.data(elem, dataID, {});
858
+ }
859
+ if(key){
860
+ data[key] = val;
861
+ }
862
+ }
863
+
864
+ return key ? data && data[key] : data;
865
+ };
866
+
867
+
868
+ [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
869
+ $.fn[data.name] = function(){
870
+ return this.map(function(){
871
+ var shadowData = elementData(this, 'shadowData');
872
+ return shadowData && shadowData[data.prop] || this;
873
+ });
874
+ };
875
+ });
876
+
877
+
878
+ ['removeAttr', 'prop', 'attr'].forEach(function(type){
879
+ olds[type] = $[type];
880
+ $[type] = function(elem, name, value, pass, _argless){
881
+ var isVal = (pass == 'val');
882
+ var oldMethod = !isVal ? olds[type] : singleVal;
883
+ if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
884
+ return oldMethod(elem, name, value, pass, _argless);
885
+ }
886
+
887
+ var nodeName = (elem.nodeName || '').toLowerCase();
888
+ var desc = extendedProps[nodeName];
889
+ var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
890
+ var propMethod;
891
+ var oldValMethod;
892
+ var ret;
893
+
894
+
895
+ if(!desc){
896
+ desc = extendedProps['*'];
897
+ }
898
+ if(desc){
899
+ desc = desc[name];
900
+ }
901
+
902
+ if(desc){
903
+ propMethod = desc[curType];
904
+ }
905
+
906
+ if(propMethod){
907
+ if(name == 'value'){
908
+ oldValMethod = propMethod.isVal;
909
+ propMethod.isVal = isVal;
910
+ }
911
+ if(curType === 'removeAttr'){
912
+ return propMethod.value.call(elem);
913
+ } else if(value === undefined){
914
+ return (propMethod.get) ?
915
+ propMethod.get.call(elem) :
916
+ propMethod.value
917
+ ;
918
+ } else if(propMethod.set) {
919
+ if(type == 'attr' && value === true){
920
+ value = name;
921
+ }
922
+
923
+ ret = propMethod.set.call(elem, value);
924
+ }
925
+ if(name == 'value'){
926
+ propMethod.isVal = oldValMethod;
927
+ }
928
+ } else {
929
+ ret = oldMethod(elem, name, value, pass, _argless);
930
+ }
931
+ if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
932
+
933
+ var boolValue;
934
+ if(curType == 'removeAttr'){
935
+ boolValue = false;
936
+ } else if(curType == 'prop'){
937
+ boolValue = !!(value);
938
+ } else {
939
+ boolValue = true;
940
+ }
941
+
942
+ modifyProps[nodeName][name].forEach(function(fn){
943
+ if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
944
+ fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
945
+ }
946
+ });
947
+ }
948
+ return ret;
949
+ };
950
+
951
+ extendQ[type] = function(nodeName, prop, desc){
952
+
953
+ if(!extendedProps[nodeName]){
954
+ extendedProps[nodeName] = {};
955
+ }
956
+ if(!extendedProps[nodeName][prop]){
957
+ extendedProps[nodeName][prop] = {};
958
+ }
959
+ var oldDesc = extendedProps[nodeName][prop][type];
960
+ var getSup = function(propType, descriptor, oDesc){
961
+ if(descriptor && descriptor[propType]){
962
+ return descriptor[propType];
963
+ }
964
+ if(oDesc && oDesc[propType]){
965
+ return oDesc[propType];
966
+ }
967
+ if(type == 'prop' && prop == 'value'){
968
+ return function(value){
969
+ var elem = this;
970
+ return (desc.isVal) ?
971
+ singleVal(elem, prop, value, false, (arguments.length === 0)) :
972
+ olds[type](elem, prop, value)
973
+ ;
974
+ };
975
+ }
976
+ if(type == 'prop' && propType == 'value' && desc.value.apply){
977
+ return function(value){
978
+ var sup = olds[type](this, prop);
979
+ if(sup && sup.apply){
980
+ sup = sup.apply(this, arguments);
981
+ }
982
+ return sup;
983
+ };
984
+ }
985
+ return function(value){
986
+ return olds[type](this, prop, value);
987
+ };
988
+ };
989
+ extendedProps[nodeName][prop][type] = desc;
990
+ if(desc.value === undefined){
991
+ if(!desc.set){
992
+ desc.set = desc.writeable ?
993
+ getSup('set', desc, oldDesc) :
994
+ (webshims.cfg.useStrict && prop == 'prop') ?
995
+ function(){throw(prop +' is readonly on '+ nodeName);} :
996
+ $.noop
997
+ ;
998
+ }
999
+ if(!desc.get){
1000
+ desc.get = getSup('get', desc, oldDesc);
1001
+ }
1002
+
1003
+ }
1004
+
1005
+ ['value', 'get', 'set'].forEach(function(descProp){
1006
+ if(desc[descProp]){
1007
+ desc['_sup'+descProp] = getSup(descProp, oldDesc);
1008
+ }
1009
+ });
1010
+ };
1011
+
1012
+ });
1013
+
1014
+ //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
1015
+ var isExtendNativeSave = (!$.browser.msie || parseInt($.browser.version, 10) > 8);
1016
+ var extendNativeValue = (function(){
1017
+ var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
1018
+ var has = Object.prototype.hasOwnProperty;
1019
+ return function(nodeName, prop, desc){
1020
+ var elem = document.createElement(nodeName);
1021
+ var elemProto = webshims.getPrototypeOf(elem);
1022
+ if( isExtendNativeSave && elemProto && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
1023
+ var sup = elem[prop];
1024
+ desc._supvalue = function(){
1025
+ if(sup && sup.apply){
1026
+ return sup.apply(this, arguments);
1027
+ }
1028
+ return sup;
1029
+ };
1030
+ elemProto[prop] = desc.value;
1031
+ } else {
1032
+ desc._supvalue = function(){
1033
+ var data = elementData(this, 'propValue');
1034
+ if(data && data[prop] && data[prop].apply){
1035
+ return data[prop].apply(this, arguments);
1036
+ }
1037
+ return data && data[prop];
1038
+ };
1039
+ initProp.extendValue(nodeName, prop, desc.value);
1040
+ }
1041
+ desc.value._supvalue = desc._supvalue;
1042
+ };
1043
+ })();
1044
+
1045
+ var initProp = (function(){
1046
+
1047
+ var initProps = {};
1048
+
1049
+ webshims.addReady(function(context, contextElem){
1050
+ var nodeNameCache = {};
1051
+ var getElementsByName = function(name){
1052
+ if(!nodeNameCache[name]){
1053
+ nodeNameCache[name] = $(context.getElementsByTagName(name));
1054
+ if(contextElem[0] && $.nodeName(contextElem[0], name)){
1055
+ nodeNameCache[name] = nodeNameCache[name].add(contextElem);
1056
+ }
1057
+ }
1058
+ };
1059
+
1060
+
1061
+ $.each(initProps, function(name, fns){
1062
+ getElementsByName(name);
1063
+ if(!fns || !fns.forEach){
1064
+ webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
1065
+ return;
1066
+ }
1067
+ fns.forEach(function(fn){
1068
+ nodeNameCache[name].each(fn);
1069
+ });
1070
+ });
1071
+ nodeNameCache = null;
1072
+ });
1073
+
1074
+ var tempCache;
1075
+ var emptyQ = $([]);
1076
+ var createNodeNameInit = function(nodeName, fn){
1077
+ if(!initProps[nodeName]){
1078
+ initProps[nodeName] = [fn];
1079
+ } else {
1080
+ initProps[nodeName].push(fn);
1081
+ }
1082
+ if($.isDOMReady){
1083
+ (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
1084
+ }
1085
+ };
1086
+
1087
+ var elementExtends = {};
1088
+ return {
1089
+ createTmpCache: function(nodeName){
1090
+ if($.isDOMReady){
1091
+ tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
1092
+ }
1093
+ return tempCache || emptyQ;
1094
+ },
1095
+ flushTmpCache: function(){
1096
+ tempCache = null;
1097
+ },
1098
+ content: function(nodeName, prop){
1099
+ createNodeNameInit(nodeName, function(){
1100
+ var val = $.attr(this, prop);
1101
+ if(val != null){
1102
+ $.attr(this, prop, val);
1103
+ }
1104
+ });
1105
+ },
1106
+ createElement: function(nodeName, fn){
1107
+ createNodeNameInit(nodeName, fn);
1108
+ },
1109
+ extendValue: function(nodeName, prop, value){
1110
+ createNodeNameInit(nodeName, function(){
1111
+ $(this).each(function(){
1112
+ var data = elementData(this, 'propValue', {});
1113
+ data[prop] = this[prop];
1114
+ this[prop] = value;
1115
+ });
1116
+ });
1117
+ }
1118
+ };
1119
+ })();
1120
+
1121
+ var createPropDefault = function(descs, removeType){
1122
+ if(descs.defaultValue === undefined){
1123
+ descs.defaultValue = '';
1124
+ }
1125
+ if(!descs.removeAttr){
1126
+ descs.removeAttr = {
1127
+ value: function(){
1128
+ descs[removeType || 'prop'].set.call(this, descs.defaultValue);
1129
+ descs.removeAttr._supvalue.call(this);
1130
+ }
1131
+ };
1132
+ }
1133
+ if(!descs.attr){
1134
+ descs.attr = {};
1135
+ }
1136
+ };
1137
+
1138
+ $.extend(webshims, {
1139
+
1140
+ getID: (function(){
1141
+ var ID = new Date().getTime();
1142
+ return function(elem){
1143
+ elem = $(elem);
1144
+ var id = elem.attr('id');
1145
+ if(!id){
1146
+ ID++;
1147
+ id = 'ID-'+ ID;
1148
+ elem.attr('id', id);
1149
+ }
1150
+ return id;
1151
+ };
1152
+ })(),
1153
+ extendUNDEFProp: function(obj, props){
1154
+ $.each(props, function(name, prop){
1155
+ if( !(name in obj) ){
1156
+ obj[name] = prop;
1157
+ }
1158
+ });
1159
+ },
1160
+ //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
1161
+ createPropDefault: createPropDefault,
1162
+ data: elementData,
1163
+ moveToFirstEvent: (function(){
1164
+ var getData = $._data ? '_data' : 'data';
1165
+ return function(elem, eventType, bindType){
1166
+ var events = ($[getData](elem, 'events') || {})[eventType];
1167
+ var fn;
1168
+
1169
+ if(events && events.length > 1){
1170
+ fn = events.pop();
1171
+ if(!bindType){
1172
+ bindType = 'bind';
1173
+ }
1174
+ if(bindType == 'bind' && events.delegateCount){
1175
+ events.splice( events.delegateCount, 0, fn);
1176
+ } else {
1177
+ events.unshift( fn );
1178
+ }
1179
+
1180
+
1181
+ }
1182
+ elem = null;
1183
+ };
1184
+ })(),
1185
+ addShadowDom: (function(){
1186
+ var resizeTimer;
1187
+ var lastHeight;
1188
+ var lastWidth;
1189
+ var handler;
1190
+ var docObserve = {
1191
+ init: false,
1192
+ start: function(){
1193
+ if(!this.init){
1194
+ this.init = true;
1195
+ this.height = $(document).height();
1196
+ this.width = $(document).width();
1197
+ setInterval(function(){
1198
+ var height = $(document).height();
1199
+ var width = $(document).width();
1200
+ if(height != docObserve.height || width != docObserve.width){
1201
+ docObserve.height = height;
1202
+ docObserve.width = width;
1203
+ handler({type: 'docresize'});
1204
+ }
1205
+ }, 400);
1206
+ }
1207
+ }
1208
+ };
1209
+
1210
+ handler = function(e){
1211
+ clearTimeout(resizeTimer);
1212
+ resizeTimer = setTimeout(function(){
1213
+ if(e.type == 'resize'){
1214
+ var width = $(window).width();
1215
+ var height = $(window).width();
1216
+ if(height == lastHeight && width == lastWidth){
1217
+ return;
1218
+ }
1219
+ lastHeight = height;
1220
+ lastWidth = width;
1221
+ docObserve.height = $(document).height();
1222
+ docObserve.width = $(document).width();
1223
+ }
1224
+ $.event.trigger('updateshadowdom');
1225
+ }, 40);
1226
+ };
1227
+ $(window).bind('resize', handler);
1228
+
1229
+ $.event.customEvent.updateshadowdom = true;
1230
+
1231
+ return function(nativeElem, shadowElem, opts){
1232
+ opts = opts || {};
1233
+ if(nativeElem.jquery){
1234
+ nativeElem = nativeElem[0];
1235
+ }
1236
+ if(shadowElem.jquery){
1237
+ shadowElem = shadowElem[0];
1238
+ }
1239
+ var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
1240
+ var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
1241
+ var shadowFocusElementData = {};
1242
+ if(!opts.shadowFocusElement){
1243
+ opts.shadowFocusElement = shadowElem;
1244
+ } else if(opts.shadowFocusElement){
1245
+ if(opts.shadowFocusElement.jquery){
1246
+ opts.shadowFocusElement = opts.shadowFocusElement[0];
1247
+ }
1248
+ shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
1249
+ }
1250
+
1251
+ nativeData.hasShadow = shadowElem;
1252
+ shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
1253
+ shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
1254
+ nativeElement: nativeElem,
1255
+ shadowElement: shadowElem,
1256
+ shadowFocusElement: opts.shadowFocusElement
1257
+ };
1258
+ if(opts.shadowChilds){
1259
+ opts.shadowChilds.each(function(){
1260
+ elementData(this, 'shadowData', shadowData.shadowData);
1261
+ });
1262
+ }
1263
+
1264
+ if(opts.data){
1265
+ shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
1266
+ }
1267
+ opts = null;
1268
+ docObserve.start();
1269
+ }
1270
+ })(),
1271
+ propTypes: {
1272
+ standard: function(descs, name){
1273
+ createPropDefault(descs);
1274
+ if(descs.prop){return;}
1275
+ descs.prop = {
1276
+ set: function(val){
1277
+ descs.attr.set.call(this, ''+val);
1278
+ },
1279
+ get: function(){
1280
+ return descs.attr.get.call(this) || descs.defaultValue;
1281
+ }
1282
+ };
1283
+
1284
+ },
1285
+ "boolean": function(descs, name){
1286
+
1287
+ createPropDefault(descs);
1288
+ if(descs.prop){return;}
1289
+ descs.prop = {
1290
+ set: function(val){
1291
+ if(val){
1292
+ descs.attr.set.call(this, "");
1293
+ } else {
1294
+ descs.removeAttr.value.call(this);
1295
+ }
1296
+ },
1297
+ get: function(){
1298
+ return descs.attr.get.call(this) != null;
1299
+ }
1300
+ };
1301
+ },
1302
+ "src": (function(){
1303
+ var anchor = document.createElement('a');
1304
+ anchor.style.display = "none";
1305
+ return function(descs, name){
1306
+
1307
+ createPropDefault(descs);
1308
+ if(descs.prop){return;}
1309
+ descs.prop = {
1310
+ set: function(val){
1311
+ descs.attr.set.call(this, val);
1312
+ },
1313
+ get: function(){
1314
+ var href = this.getAttribute(name);
1315
+ var ret;
1316
+ if(href == null){return '';}
1317
+
1318
+ anchor.setAttribute('href', href+'' );
1319
+
1320
+ if(!$.support.hrefNormalized){
1321
+ try {
1322
+ $(anchor).insertAfter(this);
1323
+ ret = anchor.getAttribute('href', 4);
1324
+ } catch(er){
1325
+ ret = anchor.getAttribute('href', 4);
1326
+ }
1327
+ $(anchor).detach();
1328
+ }
1329
+ return ret || anchor.href;
1330
+ }
1331
+ };
1332
+ };
1333
+ })(),
1334
+ enumarated: function(descs, name){
1335
+
1336
+ createPropDefault(descs);
1337
+ if(descs.prop){return;}
1338
+ descs.prop = {
1339
+ set: function(val){
1340
+ descs.attr.set.call(this, val);
1341
+ },
1342
+ get: function(){
1343
+ var val = (descs.attr.get.call(this) || '').toLowerCase();
1344
+ if(!val || descs.limitedTo.indexOf(val) == -1){
1345
+ val = descs.defaultValue;
1346
+ }
1347
+ return val;
1348
+ }
1349
+ };
1350
+ }
1351
+
1352
+ // ,unsignedLong: $.noop
1353
+ // ,"doubble": $.noop
1354
+ // ,"long": $.noop
1355
+ // ,tokenlist: $.noop
1356
+ // ,settableTokenlist: $.noop
1357
+ },
1358
+ reflectProperties: function(nodeNames, props){
1359
+ if(typeof props == 'string'){
1360
+ props = props.split(listReg);
1361
+ }
1362
+ props.forEach(function(prop){
1363
+ webshims.defineNodeNamesProperty(nodeNames, prop, {
1364
+ prop: {
1365
+ set: function(val){
1366
+ $.attr(this, prop, val);
1367
+ },
1368
+ get: function(){
1369
+ return $.attr(this, prop) || '';
1370
+ }
1371
+ }
1372
+ });
1373
+ });
1374
+ },
1375
+ defineNodeNameProperty: function(nodeName, prop, descs){
1376
+ havePolyfill[prop] = true;
1377
+
1378
+ if(descs.reflect){
1379
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
1380
+ }
1381
+
1382
+ ['prop', 'attr', 'removeAttr'].forEach(function(type){
1383
+ var desc = descs[type];
1384
+ if(desc){
1385
+ if(type === 'prop'){
1386
+ desc = $.extend({writeable: true}, desc);
1387
+ } else {
1388
+ desc = $.extend({}, desc, {writeable: true});
1389
+ }
1390
+
1391
+ extendQ[type](nodeName, prop, desc);
1392
+ if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
1393
+ extendNativeValue(nodeName, prop, desc);
1394
+ }
1395
+ descs[type] = desc;
1396
+ }
1397
+ });
1398
+ if(descs.initAttr){
1399
+ initProp.content(nodeName, prop);
1400
+ }
1401
+ return descs;
1402
+ },
1403
+
1404
+ defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
1405
+ var olddesc;
1406
+ for(var prop in descs){
1407
+ if(!_noTmpCache && descs[prop].initAttr){
1408
+ initProp.createTmpCache(name);
1409
+ }
1410
+ if(propType){
1411
+ if(descs[prop][propType]){
1412
+ webshims.log('override: '+ name +'['+prop +'] for '+ propType);
1413
+ } else {
1414
+ descs[prop][propType] = {};
1415
+ ['value', 'set', 'get'].forEach(function(copyProp){
1416
+ if(copyProp in descs[prop]){
1417
+ descs[prop][propType][copyProp] = descs[prop][copyProp];
1418
+ delete descs[prop][copyProp];
1419
+ }
1420
+ });
1421
+ }
1422
+ }
1423
+ descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
1424
+ }
1425
+ if(!_noTmpCache){
1426
+ initProp.flushTmpCache();
1427
+ }
1428
+ return descs;
1429
+ },
1430
+
1431
+ createElement: function(nodeName, create, descs){
1432
+ var ret;
1433
+ if($.isFunction(create)){
1434
+ create = {
1435
+ after: create
1436
+ };
1437
+ }
1438
+ initProp.createTmpCache(nodeName);
1439
+ if(create.before){
1440
+ initProp.createElement(nodeName, create.before);
1441
+ }
1442
+ if(descs){
1443
+ ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
1444
+ }
1445
+ if(create.after){
1446
+ initProp.createElement(nodeName, create.after);
1447
+ }
1448
+ initProp.flushTmpCache();
1449
+ return ret;
1450
+ },
1451
+ onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
1452
+ if(typeof nodeNames == 'string'){
1453
+ nodeNames = nodeNames.split(listReg);
1454
+ }
1455
+ if($.isFunction(desc)){
1456
+ desc = {set: desc};
1457
+ }
1458
+
1459
+ nodeNames.forEach(function(name){
1460
+ if(!modifyProps[name]){
1461
+ modifyProps[name] = {};
1462
+ }
1463
+ if(typeof props == 'string'){
1464
+ props = props.split(listReg);
1465
+ }
1466
+ if(desc.initAttr){
1467
+ initProp.createTmpCache(name);
1468
+ }
1469
+ props.forEach(function(prop){
1470
+ if(!modifyProps[name][prop]){
1471
+ modifyProps[name][prop] = [];
1472
+ havePolyfill[prop] = true;
1473
+ }
1474
+ if(desc.set){
1475
+ if(only){
1476
+ desc.set.only = only;
1477
+ }
1478
+ modifyProps[name][prop].push(desc.set);
1479
+ }
1480
+
1481
+ if(desc.initAttr){
1482
+ initProp.content(name, prop);
1483
+ }
1484
+ });
1485
+ initProp.flushTmpCache();
1486
+
1487
+ });
1488
+ },
1489
+ defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
1490
+ if(!descs){
1491
+ descs = {};
1492
+ }
1493
+ if($.isFunction(descs)){
1494
+ descs.set = descs;
1495
+ }
1496
+ webshims.defineNodeNamesProperty(elementNames, prop, {
1497
+ attr: {
1498
+ set: function(val){
1499
+ this.setAttribute(prop, val);
1500
+ if(descs.set){
1501
+ descs.set.call(this, true);
1502
+ }
1503
+ },
1504
+ get: function(){
1505
+ var ret = this.getAttribute(prop);
1506
+ return (ret == null) ? undefined : prop;
1507
+ }
1508
+ },
1509
+ removeAttr: {
1510
+ value: function(){
1511
+ this.removeAttribute(prop);
1512
+ if(descs.set){
1513
+ descs.set.call(this, false);
1514
+ }
1515
+ }
1516
+ },
1517
+ reflect: true,
1518
+ propType: 'boolean',
1519
+ initAttr: descs.initAttr || false
1520
+ });
1521
+ },
1522
+ contentAttr: function(elem, name, val){
1523
+ if(!elem.nodeName){return;}
1524
+ var attr;
1525
+ if(val === undefined){
1526
+ attr = (elem.attributes[name] || {});
1527
+ val = attr.specified ? attr.value : null;
1528
+ return (val == null) ? undefined : val;
1529
+ }
1530
+
1531
+ if(typeof val == 'boolean'){
1532
+ if(!val){
1533
+ elem.removeAttribute(name);
1534
+ } else {
1535
+ elem.setAttribute(name, name);
1536
+ }
1537
+ } else {
1538
+ elem.setAttribute(name, val);
1539
+ }
1540
+ },
1541
+
1542
+ // set current Lang:
1543
+ // - webshims.activeLang(lang:string);
1544
+ // get current lang
1545
+ // - webshims.activeLang();
1546
+ // get current lang
1547
+ // webshims.activeLang({
1548
+ // register: moduleName:string,
1549
+ // callback: callback:function
1550
+ // });
1551
+ // get/set including removeLang
1552
+ // - webshims.activeLang({
1553
+ // module: moduleName:string,
1554
+ // callback: callback:function,
1555
+ // langObj: languageObj:array/object
1556
+ // });
1557
+ activeLang: (function(){
1558
+ var callbacks = [];
1559
+ var registeredCallbacks = {};
1560
+ var currentLang;
1561
+ var shortLang;
1562
+ var notLocal = /:\/\/|^\.*\//;
1563
+ var loadRemoteLang = function(data, lang, options){
1564
+ var langSrc;
1565
+ if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
1566
+ data.loading = true;
1567
+ langSrc = options.langSrc;
1568
+ if(!notLocal.test(langSrc)){
1569
+ langSrc = webshims.cfg.basePath+langSrc;
1570
+ }
1571
+ webshims.loader.loadScript(langSrc+lang+'.js', function(){
1572
+ if(data.langObj[lang]){
1573
+ data.loading = false;
1574
+ callLang(data, true);
1575
+ } else {
1576
+ $(function(){
1577
+ if(data.langObj[lang]){
1578
+ callLang(data, true);
1579
+ }
1580
+ data.loading = false;
1581
+ });
1582
+ }
1583
+ });
1584
+ return true;
1585
+ }
1586
+ return false;
1587
+ };
1588
+ var callRegister = function(module){
1589
+ if(registeredCallbacks[module]){
1590
+ registeredCallbacks[module].forEach(function(data){
1591
+ data.callback();
1592
+ });
1593
+ }
1594
+ };
1595
+ var callLang = function(data, _noLoop){
1596
+ if(data.activeLang != currentLang && data.activeLang !== shortLang){
1597
+ var options = modules[data.module].options;
1598
+ if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
1599
+ data.activeLang = currentLang;
1600
+ data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
1601
+ callRegister(data.module);
1602
+ } else if( !_noLoop &&
1603
+ !loadRemoteLang(data, currentLang, options) &&
1604
+ !loadRemoteLang(data, shortLang, options) &&
1605
+ data.langObj[''] && data.activeLang !== '' ) {
1606
+ data.activeLang = '';
1607
+ data.callback(data.langObj[''], currentLang);
1608
+ callRegister(data.module);
1609
+ }
1610
+ }
1611
+ };
1612
+
1613
+
1614
+ var activeLang = function(lang){
1615
+
1616
+ if(typeof lang == 'string' && lang !== currentLang){
1617
+ currentLang = lang;
1618
+ shortLang = currentLang.split('-')[0];
1619
+ if(currentLang == shortLang){
1620
+ shortLang = false;
1621
+ }
1622
+ $.each(callbacks, function(i, data){
1623
+ callLang(data);
1624
+ });
1625
+ } else if(typeof lang == 'object'){
1626
+
1627
+ if(lang.register){
1628
+ if(!registeredCallbacks[lang.register]){
1629
+ registeredCallbacks[lang.register] = [];
1630
+ }
1631
+ registeredCallbacks[lang.register].push(lang);
1632
+ lang.callback();
1633
+ } else {
1634
+ if(!lang.activeLang){
1635
+ lang.activeLang = '';
1636
+ }
1637
+ callbacks.push(lang);
1638
+ callLang(lang);
1639
+ }
1640
+ }
1641
+ return currentLang;
1642
+ };
1643
+
1644
+ return activeLang;
1645
+ })()
1646
+ });
1647
+
1648
+ $.each({
1649
+ defineNodeNamesProperty: 'defineNodeNameProperty',
1650
+ defineNodeNamesProperties: 'defineNodeNameProperties',
1651
+ createElements: 'createElement'
1652
+ }, function(name, baseMethod){
1653
+ webshims[name] = function(names, a, b, c){
1654
+ if(typeof names == 'string'){
1655
+ names = names.split(listReg);
1656
+ }
1657
+ var retDesc = {};
1658
+ names.forEach(function(nodeName){
1659
+ retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
1660
+ });
1661
+ return retDesc;
1662
+ };
1663
+ });
1664
+
1665
+ webshims.isReady('webshimLocalization', true);
1666
+ });
1667
+ //html5a11y
1668
+ (function($, document){
1669
+ var browserVersion = $.webshims.browserVersion;
1670
+ if($.browser.mozilla && browserVersion > 5){return;}
1671
+ if (!$.browser.msie || (browserVersion < 12 && browserVersion > 7)) {
1672
+ var elemMappings = {
1673
+ article: "article",
1674
+ aside: "complementary",
1675
+ section: "region",
1676
+ nav: "navigation",
1677
+ address: "contentinfo"
1678
+ };
1679
+ var addRole = function(elem, role){
1680
+ var hasRole = elem.getAttribute('role');
1681
+ if (!hasRole) {
1682
+ elem.setAttribute('role', role);
1683
+ }
1684
+ };
1685
+
1686
+ $.webshims.addReady(function(context, contextElem){
1687
+ $.each(elemMappings, function(name, role){
1688
+ var elems = $(name, context).add(contextElem.filter(name));
1689
+ for (var i = 0, len = elems.length; i < len; i++) {
1690
+ addRole(elems[i], role);
1691
+ }
1692
+ });
1693
+ if (context === document) {
1694
+ var header = document.getElementsByTagName('header')[0];
1695
+ var footers = document.getElementsByTagName('footer');
1696
+ var footerLen = footers.length;
1697
+ if (header && !$(header).closest('section, article')[0]) {
1698
+ addRole(header, 'banner');
1699
+ }
1700
+ if (!footerLen) {
1701
+ return;
1702
+ }
1703
+ var footer = footers[footerLen - 1];
1704
+ if (!$(footer).closest('section, article')[0]) {
1705
+ addRole(footer, 'contentinfo');
1706
+ }
1707
+ }
1708
+ });
1709
+ }
1710
+ })(jQuery, document);
1711
+ (function($, Modernizr, webshims){
1712
+ "use strict";
1713
+ var hasNative = Modernizr.audio && Modernizr.video;
1714
+ var supportsLoop = false;
1715
+ var options = webshims.cfg.mediaelement;
1716
+ var bugs = webshims.bugs;
1717
+ var loadSwf = function(){
1718
+ webshims.ready('mediaelement-swf', function(){
1719
+ if(!webshims.mediaelement.createSWF){
1720
+ webshims.modules["mediaelement-swf"].test = $.noop;
1721
+ webshims.reTest(["mediaelement-swf"], hasNative);
1722
+ }
1723
+ });
1724
+ };
1725
+ var hasSwf;
1726
+ if(hasNative){
1727
+ var videoElem = document.createElement('video');
1728
+ Modernizr.videoBuffered = ('buffered' in videoElem);
1729
+ supportsLoop = ('loop' in videoElem);
1730
+
1731
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
1732
+
1733
+ if(!Modernizr.videoBuffered){
1734
+ webshims.addPolyfill('mediaelement-native-fix', {
1735
+ f: 'mediaelement',
1736
+ test: Modernizr.videoBuffered,
1737
+ d: ['dom-support']
1738
+ });
1739
+
1740
+ webshims.reTest('mediaelement-native-fix');
1741
+ }
1742
+ }
1743
+
1744
+ if(hasNative && !options.preferFlash){
1745
+ var switchOptions = function(e){
1746
+ var parent = e.target.parentNode;
1747
+ if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
1748
+ webshims.ready('DOM mediaelement', function(){
1749
+ if(hasSwf){
1750
+ loadSwf();
1751
+ }
1752
+ webshims.ready('WINDOWLOAD mediaelement-swf', function(){
1753
+ setTimeout(function(){
1754
+ if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
1755
+ options.preferFlash = true;
1756
+ document.removeEventListener('error', switchOptions, true);
1757
+ $('audio, video').mediaLoad();
1758
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
1759
+ } else if(!hasSwf){
1760
+ document.removeEventListener('error', switchOptions, true);
1761
+ }
1762
+ }, 20);
1763
+ });
1764
+ });
1765
+ }
1766
+ };
1767
+ document.addEventListener('error', switchOptions, true);
1768
+ $('audio, video').each(function(){
1769
+ if(this.error){
1770
+ switchOptions({target: this});
1771
+ }
1772
+ });
1773
+ }
1774
+
1775
+ bugs.track = false;
1776
+
1777
+ if(Modernizr.track){
1778
+ (function(){
1779
+
1780
+ if(!bugs.track){
1781
+ bugs.track = typeof $('<track />')[0].readyState != 'number';
1782
+ }
1783
+
1784
+ if(!bugs.track){
1785
+ try {
1786
+ new TextTrackCue(2, 3, '');
1787
+ } catch(e){
1788
+ bugs.track = true;
1789
+ }
1790
+ }
1791
+
1792
+ var trackOptions = webshims.cfg.track;
1793
+ var trackListener = function(e){
1794
+ $(e.target).filter('track').each(changeApi);
1795
+ };
1796
+ var changeApi = function(){
1797
+ if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
1798
+ trackOptions.override = true;
1799
+ webshims.reTest('track');
1800
+ document.removeEventListener('error', trackListener, true);
1801
+ if(this && $.nodeName(this, 'track')){
1802
+ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
1803
+ } else {
1804
+ webshims.info("track support was overwritten. due to bad browser support");
1805
+ }
1806
+ }
1807
+ };
1808
+ var detectTrackError = function(){
1809
+ document.addEventListener('error', trackListener, true);
1810
+
1811
+ if(bugs.track){
1812
+ changeApi();
1813
+ } else {
1814
+ $('track').each(changeApi);
1815
+ }
1816
+ };
1817
+ if(!trackOptions.override){
1818
+ if(webshims.isReady('track')){
1819
+ detectTrackError();
1820
+ } else {
1821
+ $(detectTrackError);
1822
+ }
1823
+ }
1824
+ })();
1825
+
1826
+ }
1827
+
1828
+ webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
1829
+ hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
1830
+
1831
+ var mediaelement = webshims.mediaelement;
1832
+
1833
+ var getSrcObj = function(elem, nodeName){
1834
+ elem = $(elem);
1835
+ var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
1836
+ if(!src.src){return src;}
1837
+ var tmp = elem.attr('type');
1838
+ if(tmp){
1839
+ src.type = tmp;
1840
+ src.container = $.trim(tmp.split(';')[0]);
1841
+ } else {
1842
+ if(!nodeName){
1843
+ nodeName = elem[0].nodeName.toLowerCase();
1844
+ if(nodeName == 'source'){
1845
+ nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
1846
+ }
1847
+ }
1848
+ tmp = mediaelement.getTypeForSrc(src.src, nodeName );
1849
+
1850
+ if(tmp){
1851
+ src.type = tmp;
1852
+ src.container = tmp;
1853
+ }
1854
+ }
1855
+ tmp = elem.attr('media');
1856
+ if(tmp){
1857
+ src.media = tmp;
1858
+ }
1859
+ return src;
1860
+ };
1861
+
1862
+
1863
+
1864
+ var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
1865
+
1866
+ var loadYt = (function(){
1867
+ var loaded;
1868
+ return function(){
1869
+ if(loaded || !hasYt){return;}
1870
+ loaded = true;
1871
+ webshims.loader.loadScript("https://www.youtube.com/player_api");
1872
+ $(function(){
1873
+ webshims.polyfill("mediaelement-yt");
1874
+ });
1875
+ };
1876
+ })();
1877
+ var loadThird = function(){
1878
+ if(hasSwf){
1879
+ loadSwf();
1880
+ } else {
1881
+ loadYt();
1882
+ }
1883
+ };
1884
+
1885
+ webshims.addPolyfill('mediaelement-yt', {
1886
+ test: !hasYt,
1887
+ d: ['dom-support']
1888
+ });
1889
+
1890
+ mediaelement.mimeTypes = {
1891
+ audio: {
1892
+ //ogm shouldn´t be used!
1893
+ 'audio/ogg': ['ogg','oga', 'ogm'],
1894
+ 'audio/ogg;codecs="opus"': 'opus',
1895
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
1896
+ 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
1897
+ 'audio/wav': ['wav'],
1898
+ 'audio/3gpp': ['3gp','3gpp'],
1899
+ 'audio/webm': ['webm'],
1900
+ 'audio/fla': ['flv', 'f4a', 'fla'],
1901
+ 'application/x-mpegURL': ['m3u8', 'm3u']
1902
+ },
1903
+ video: {
1904
+ //ogm shouldn´t be used!
1905
+ 'video/ogg': ['ogg','ogv', 'ogm'],
1906
+ 'video/mpeg': ['mpg','mpeg','mpe'],
1907
+ 'video/mp4': ['mp4','mpg4', 'm4v'],
1908
+ 'video/quicktime': ['mov','qt'],
1909
+ 'video/x-msvideo': ['avi'],
1910
+ 'video/x-ms-asf': ['asf', 'asx'],
1911
+ 'video/flv': ['flv', 'f4v'],
1912
+ 'video/3gpp': ['3gp','3gpp'],
1913
+ 'video/webm': ['webm'],
1914
+ 'application/x-mpegURL': ['m3u8', 'm3u'],
1915
+ 'video/MP2T': ['ts']
1916
+ }
1917
+ }
1918
+ ;
1919
+
1920
+ mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
1921
+
1922
+ mediaelement.getTypeForSrc = function(src, nodeName){
1923
+ if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
1924
+ return 'video/youtube';
1925
+ }
1926
+ src = src.split('?')[0].split('.');
1927
+ src = src[src.length - 1];
1928
+ var mt;
1929
+
1930
+ $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
1931
+ if(exts.indexOf(src) !== -1){
1932
+ mt = mimeType;
1933
+ return false;
1934
+ }
1935
+ });
1936
+ return mt;
1937
+ };
1938
+
1939
+
1940
+ mediaelement.srces = function(mediaElem, srces){
1941
+ mediaElem = $(mediaElem);
1942
+ if(!srces){
1943
+ srces = [];
1944
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
1945
+ var src = getSrcObj(mediaElem, nodeName);
1946
+
1947
+ if(!src.src){
1948
+
1949
+ $('source', mediaElem).each(function(){
1950
+ src = getSrcObj(this, nodeName);
1951
+ if(src.src){srces.push(src);}
1952
+ });
1953
+ } else {
1954
+ srces.push(src);
1955
+ }
1956
+ return srces;
1957
+ } else {
1958
+ mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
1959
+ if(!$.isArray(srces)){
1960
+ srces = [srces];
1961
+ }
1962
+ srces.forEach(function(src){
1963
+ var source = document.createElement('source');
1964
+ if(typeof src == 'string'){
1965
+ src = {src: src};
1966
+ }
1967
+ source.setAttribute('src', src.src);
1968
+ if(src.type){
1969
+ source.setAttribute('type', src.type);
1970
+ }
1971
+ if(src.media){
1972
+ source.setAttribute('media', src.media);
1973
+ }
1974
+ mediaElem.append(source);
1975
+ });
1976
+
1977
+ }
1978
+ };
1979
+
1980
+
1981
+ $.fn.loadMediaSrc = function(srces, poster){
1982
+ return this.each(function(){
1983
+ if(poster !== undefined){
1984
+ $(this).removeAttr('poster');
1985
+ if(poster){
1986
+ $.attr(this, 'poster', poster);
1987
+ }
1988
+ }
1989
+ mediaelement.srces(this, srces);
1990
+ $(this).mediaLoad();
1991
+ });
1992
+ };
1993
+
1994
+ 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'];
1995
+
1996
+ mediaelement.canThirdPlaySrces = function(mediaElem, srces){
1997
+ var ret = '';
1998
+ if(hasSwf || hasYt){
1999
+ mediaElem = $(mediaElem);
2000
+ srces = srces || mediaelement.srces(mediaElem);
2001
+ $.each(srces, function(i, src){
2002
+ if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
2003
+ ret = src;
2004
+ return false;
2005
+ }
2006
+ });
2007
+
2008
+ }
2009
+
2010
+ return ret;
2011
+ };
2012
+
2013
+ var nativeCanPlayType = {};
2014
+ mediaelement.canNativePlaySrces = function(mediaElem, srces){
2015
+ var ret = '';
2016
+ if(hasNative){
2017
+ mediaElem = $(mediaElem);
2018
+ var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
2019
+ if(!nativeCanPlayType[nodeName]){return ret;}
2020
+ srces = srces || mediaelement.srces(mediaElem);
2021
+
2022
+ $.each(srces, function(i, src){
2023
+ if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
2024
+ ret = src;
2025
+ return false;
2026
+ }
2027
+ });
2028
+ }
2029
+ return ret;
2030
+ };
2031
+
2032
+ mediaelement.setError = function(elem, message){
2033
+ if(!message){
2034
+ message = "can't play sources";
2035
+ }
2036
+
2037
+ $(elem).pause().data('mediaerror', message);
2038
+ webshims.warn('mediaelementError: '+ message);
2039
+ setTimeout(function(){
2040
+ if($(elem).data('mediaerror')){
2041
+ $(elem).trigger('mediaerror');
2042
+ }
2043
+ }, 1);
2044
+ };
2045
+
2046
+ var handleThird = (function(){
2047
+ var requested;
2048
+ return function( mediaElem, ret, data ){
2049
+ webshims.ready(hasSwf ? 'mediaelement-swf' : 'mediaelement-yt', function(){
2050
+ if(mediaelement.createSWF){
2051
+ mediaelement.createSWF( mediaElem, ret, data );
2052
+ } else if(!requested) {
2053
+ requested = true;
2054
+ loadThird();
2055
+ //readd to ready
2056
+ handleThird( mediaElem, ret, data );
2057
+ }
2058
+ });
2059
+ if(!requested && hasYt && !mediaelement.createSWF){
2060
+ loadYt();
2061
+ }
2062
+ };
2063
+ })();
2064
+
2065
+ var stepSources = function(elem, data, useSwf, _srces, _noLoop){
2066
+ var ret;
2067
+ if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
2068
+ ret = mediaelement.canThirdPlaySrces(elem, _srces);
2069
+ if(!ret){
2070
+ if(_noLoop){
2071
+ mediaelement.setError(elem, false);
2072
+ } else {
2073
+ stepSources(elem, data, false, _srces, true);
2074
+ }
2075
+ } else {
2076
+ handleThird(elem, ret, data);
2077
+ }
2078
+ } else {
2079
+ ret = mediaelement.canNativePlaySrces(elem, _srces);
2080
+ if(!ret){
2081
+ if(_noLoop){
2082
+ mediaelement.setError(elem, false);
2083
+ if(data && data.isActive == 'third') {
2084
+ mediaelement.setActive(elem, 'html5', data);
2085
+ }
2086
+ } else {
2087
+ stepSources(elem, data, true, _srces, true);
2088
+ }
2089
+ } else if(data && data.isActive == 'third') {
2090
+ mediaelement.setActive(elem, 'html5', data);
2091
+ }
2092
+ }
2093
+ };
2094
+ var stopParent = /^(?:embed|object|datalist)$/i;
2095
+ var selectSource = function(elem, data){
2096
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2097
+ var _srces = mediaelement.srces(elem);
2098
+ var parent = elem.parentNode;
2099
+
2100
+ clearTimeout(baseData.loadTimer);
2101
+ $.data(elem, 'mediaerror', false);
2102
+
2103
+ if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
2104
+ data = data || webshims.data(elem, 'mediaelement');
2105
+ stepSources(elem, data, options.preferFlash || undefined, _srces);
2106
+ };
2107
+
2108
+
2109
+ $(document).bind('ended', function(e){
2110
+ var data = webshims.data(e.target, 'mediaelement');
2111
+ if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
2112
+ setTimeout(function(){
2113
+ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
2114
+ $(e.target).prop('currentTime', 0).play();
2115
+ }, 1);
2116
+
2117
+ });
2118
+ if(!supportsLoop){
2119
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
2120
+ }
2121
+
2122
+ ['audio', 'video'].forEach(function(nodeName){
2123
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
2124
+ prop: {
2125
+ value: function(){
2126
+ var data = webshims.data(this, 'mediaelement');
2127
+ selectSource(this, data);
2128
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
2129
+ supLoad.prop._supvalue.apply(this, arguments);
2130
+ }
2131
+ }
2132
+ }
2133
+ });
2134
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
2135
+ prop: {
2136
+ value: function(type){
2137
+ var ret = '';
2138
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
2139
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
2140
+ if(ret == 'no'){
2141
+ ret = '';
2142
+ }
2143
+ }
2144
+ if(!ret && hasSwf){
2145
+ type = $.trim((type || '').split(';')[0]);
2146
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
2147
+ ret = 'maybe';
2148
+ }
2149
+ }
2150
+ return ret;
2151
+ }
2152
+ }
2153
+ });
2154
+ });
2155
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
2156
+ set: function(){
2157
+ var elem = this;
2158
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2159
+ clearTimeout(baseData.loadTimer);
2160
+ baseData.loadTimer = setTimeout(function(){
2161
+ selectSource(elem);
2162
+ elem = null;
2163
+ }, 9);
2164
+ }
2165
+ });
2166
+
2167
+ var initMediaElements = function(){
2168
+
2169
+ webshims.addReady(function(context, insertedElement){
2170
+ $('video, audio', context)
2171
+ .add(insertedElement.filter('video, audio'))
2172
+ .each(function(){
2173
+ if($.browser.msie && webshims.browserVersion > 8 && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])')){
2174
+ $(this).prop('preload', 'metadata').mediaLoad();
2175
+ } else {
2176
+ selectSource(this);
2177
+ }
2178
+
2179
+
2180
+
2181
+ if(hasNative){
2182
+ var bufferTimer;
2183
+ var lastBuffered;
2184
+ var elem = this;
2185
+ var getBufferedString = function(){
2186
+ var buffered = $.prop(elem, 'buffered');
2187
+ if(!buffered){return;}
2188
+ var bufferString = "";
2189
+ for(var i = 0, len = buffered.length; i < len;i++){
2190
+ bufferString += buffered.end(i);
2191
+ }
2192
+ return bufferString;
2193
+ };
2194
+ var testBuffer = function(){
2195
+ var buffered = getBufferedString();
2196
+ if(buffered != lastBuffered){
2197
+ lastBuffered = buffered;
2198
+ $(elem).triggerHandler('progress');
2199
+ }
2200
+ };
2201
+
2202
+ $(this)
2203
+ .bind('play loadstart progress', function(e){
2204
+ if(e.type == 'progress'){
2205
+ lastBuffered = getBufferedString();
2206
+ }
2207
+ clearTimeout(bufferTimer);
2208
+ bufferTimer = setTimeout(testBuffer, 999);
2209
+ })
2210
+ .bind('emptied stalled mediaerror abort suspend', function(e){
2211
+ if(e.type == 'emptied'){
2212
+ lastBuffered = false;
2213
+ }
2214
+ clearTimeout(bufferTimer);
2215
+ })
2216
+ ;
2217
+ }
2218
+
2219
+ })
2220
+ ;
2221
+ });
2222
+ };
2223
+
2224
+ if(Modernizr.track && !bugs.track){
2225
+ webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
2226
+ get: function(){
2227
+ return this._shimActiveCues || this.activeCues;
2228
+ }
2229
+ });
2230
+ }
2231
+ //set native implementation ready, before swf api is retested
2232
+ if(hasNative){
2233
+ webshims.isReady('mediaelement-core', true);
2234
+ initMediaElements();
2235
+ webshims.ready('WINDOWLOAD mediaelement', loadThird);
2236
+ } else {
2237
+ webshims.ready('mediaelement-swf', initMediaElements);
2238
+ }
2239
+ $(function(){
2240
+ webshims.loader.loadList(['track-ui']);
2241
+ });
2242
+
2243
+ });
2244
+ })(jQuery, Modernizr, jQuery.webshims);/*
2245
+ * todos:
2246
+ * - decouple muted/volume (needs improvement)
2247
+ * - implement video <-> flashcanvas pro API
2248
+ * - improve buffered-property with youtube/rtmp
2249
+ * - use jwplayer5 api instead of old flash4 api
2250
+ */
2251
+
2252
+ jQuery.webshims.register('mediaelement-swf', function($, webshims, window, document, undefined, options){
2253
+ "use strict";
2254
+ var SENDEVENT = 'sendEvent';
2255
+ var mediaelement = webshims.mediaelement;
2256
+ var swfobject = window.swfobject;
2257
+ var hasNative = Modernizr.audio && Modernizr.video;
2258
+ var hasFlash = swfobject.hasFlashPlayerVersion('9.0.115');
2259
+ var loadedSwf = 0;
2260
+ var getProps = {
2261
+ paused: true,
2262
+ ended: false,
2263
+ currentSrc: '',
2264
+ duration: window.NaN,
2265
+
2266
+ readyState: 0,
2267
+ networkState: 0,
2268
+ videoHeight: 0,
2269
+ videoWidth: 0,
2270
+ error: null,
2271
+ buffered: {
2272
+ start: function(index){
2273
+ if(index){
2274
+ webshims.error('buffered index size error');
2275
+ return;
2276
+ }
2277
+ return 0;
2278
+ },
2279
+ end: function(index){
2280
+ if(index){
2281
+ webshims.error('buffered index size error');
2282
+ return;
2283
+ }
2284
+ return 0;
2285
+ },
2286
+ length: 0
2287
+ }
2288
+ };
2289
+ var getPropKeys = Object.keys(getProps);
2290
+
2291
+ var getSetProps = {
2292
+ currentTime: 0,
2293
+ volume: 1,
2294
+ muted: false
2295
+ };
2296
+ var getSetPropKeys = Object.keys(getSetProps);
2297
+
2298
+ var playerStateObj = $.extend({
2299
+ isActive: 'html5',
2300
+ activating: 'html5',
2301
+ wasSwfReady: false,
2302
+ _bufferedEnd: 0,
2303
+ _bufferedStart: 0,
2304
+ _metadata: false,
2305
+ _durationCalcs: -1,
2306
+ _callMeta: false,
2307
+ currentTime: 0,
2308
+ _ppFlag: undefined
2309
+ }, getProps, getSetProps);
2310
+
2311
+ var idRep = /^jwplayer-/;
2312
+ var getSwfDataFromID = function(id){
2313
+
2314
+ var elem = document.getElementById(id.replace(idRep, ''));
2315
+ if(!elem){return;}
2316
+ var data = webshims.data(elem, 'mediaelement');
2317
+ return data.isActive == 'third' ? data : null;
2318
+ };
2319
+
2320
+
2321
+ var getSwfDataFromElem = function(elem){
2322
+ try {
2323
+ (elem.nodeName);
2324
+ } catch(er){
2325
+ return null;
2326
+ }
2327
+ var data = webshims.data(elem, 'mediaelement');
2328
+ return (data && data.isActive== 'third') ? data : null;
2329
+ };
2330
+
2331
+ var trigger = function(elem, evt){
2332
+ evt = $.Event(evt);
2333
+ evt.preventDefault();
2334
+ $.event.trigger(evt, undefined, elem);
2335
+ };
2336
+
2337
+ var playerSwfPath = options.playerPath || webshims.cfg.basePath + "jwplayer/" + (options.playerName || "player.swf");
2338
+ var jwplugin = options.pluginPath || webshims.cfg.basePath +'swf/jwwebshims.swf';
2339
+
2340
+ webshims.extendUNDEFProp(options.jwParams, {
2341
+ allowscriptaccess: 'always',
2342
+ allowfullscreen: 'true',
2343
+ wmode: 'transparent'
2344
+ });
2345
+ webshims.extendUNDEFProp(options.jwVars, {
2346
+ screencolor: 'ffffffff'
2347
+ });
2348
+ webshims.extendUNDEFProp(options.jwAttrs, {
2349
+ bgcolor: '#000000'
2350
+ });
2351
+
2352
+ var getDuration = function(data, obj){
2353
+ var curDuration = data.duration;
2354
+ if(curDuration && data._durationCalcs > 0){return;}
2355
+ try {
2356
+ data.duration = data.jwapi.getPlaylist()[0].duration;
2357
+ if(!data.duration || data.duration <= 0 || data.duration === data._lastDuration){
2358
+ data.duration = curDuration;
2359
+ }
2360
+ } catch(er){}
2361
+ if(data.duration && data.duration != data._lastDuration){
2362
+ trigger(data._elem, 'durationchange');
2363
+ if(data._elemNodeName == 'audio' || data._callMeta){
2364
+ mediaelement.jwEvents.Model.META($.extend({duration: data.duration}, obj), data);
2365
+ }
2366
+ data._durationCalcs--;
2367
+ } else {
2368
+ data._durationCalcs++;
2369
+ }
2370
+ };
2371
+ var setReadyState = function(readyState, data){
2372
+ if(readyState < 3){
2373
+ clearTimeout(data._canplaythroughTimer);
2374
+ }
2375
+ if(readyState >= 3 && data.readyState < 3){
2376
+ data.readyState = readyState;
2377
+ trigger(data._elem, 'canplay');
2378
+ clearTimeout(data._canplaythroughTimer);
2379
+ data._canplaythroughTimer = setTimeout(function(){
2380
+ setReadyState(4, data);
2381
+ }, 4000);
2382
+ }
2383
+ if(readyState >= 4 && data.readyState < 4){
2384
+ data.readyState = readyState;
2385
+ trigger(data._elem, 'canplaythrough');
2386
+ }
2387
+ data.readyState = readyState;
2388
+ };
2389
+
2390
+ $.extend($.event.customEvent, {
2391
+ updatemediaelementdimensions: true,
2392
+ flashblocker: true,
2393
+ swfstageresize: true,
2394
+ mediaelementapichange: true
2395
+ });
2396
+
2397
+ mediaelement.jwEvents = {
2398
+ View: {
2399
+
2400
+ PLAY: function(obj){
2401
+ var data = getSwfDataFromID(obj.id);
2402
+ if(!data || data.stopPlayPause){return;}
2403
+ data._ppFlag = true;
2404
+ if(data.paused == obj.state){
2405
+ data.paused = !obj.state;
2406
+ if(data.ended){
2407
+ data.ended = false;
2408
+ }
2409
+ trigger(data._elem, obj.state ? 'play' : 'pause');
2410
+ }
2411
+ }
2412
+ },
2413
+ Model: {
2414
+
2415
+ BUFFER: function(obj){
2416
+ var data = getSwfDataFromID(obj.id);
2417
+ if(!data || !('percentage' in obj) || data._bufferedEnd == obj.percentage){return;}
2418
+ data.networkState = (obj.percentage == 100) ? 1 : 2;
2419
+ if(isNaN(data.duration) || (obj.percentage > 5 && obj.percentage < 25) || (obj.percentage === 100)){
2420
+ getDuration(data, obj);
2421
+ }
2422
+
2423
+ if(data.ended){
2424
+ data.ended = false;
2425
+ }
2426
+ if(!data.duration){
2427
+ return;
2428
+ }
2429
+ if(obj.percentage > 2 && obj.percentage < 20){
2430
+ setReadyState(3, data);
2431
+ } else if(obj.percentage > 20){
2432
+ setReadyState(4, data);
2433
+ }
2434
+ if(data._bufferedEnd && (data._bufferedEnd > obj.percentage)){
2435
+ data._bufferedStart = data.currentTime || 0;
2436
+ }
2437
+
2438
+ data._bufferedEnd = obj.percentage;
2439
+ data.buffered.length = 1;
2440
+ if(obj.percentage == 100){
2441
+ data.networkState = 1;
2442
+ setReadyState(4, data);
2443
+ }
2444
+ $.event.trigger('progress', undefined, data._elem, true);
2445
+ },
2446
+ META: function(obj, data){
2447
+
2448
+ data = data && data.networkState ? data : getSwfDataFromID(obj.id);
2449
+
2450
+ if(!data){return;}
2451
+ if( !('duration' in obj) ){
2452
+ data._callMeta = true;
2453
+ return;
2454
+ }
2455
+
2456
+ if( data._metadata && (!obj.height || data.videoHeight == obj.height) && (obj.duration === data.duration) ){return;}
2457
+
2458
+ data._metadata = true;
2459
+
2460
+ var oldDur = data.duration;
2461
+ if(obj.duration){
2462
+ data.duration = obj.duration;
2463
+ }
2464
+ data._lastDuration = data.duration;
2465
+ if(obj.height || obj.width){
2466
+ data.videoHeight = obj.height || 0;
2467
+ data.videoWidth = obj.width || 0;
2468
+ }
2469
+ if(!data.networkState){
2470
+ data.networkState = 2;
2471
+ }
2472
+ if(data.readyState < 1){
2473
+ setReadyState(1, data);
2474
+ }
2475
+ if(data.duration && oldDur !== data.duration){
2476
+ trigger(data._elem, 'durationchange');
2477
+ }
2478
+
2479
+ trigger(data._elem, 'loadedmetadata');
2480
+ },
2481
+ TIME: function(obj){
2482
+ var data = getSwfDataFromID(obj.id);
2483
+ if(!data || data.currentTime === obj.position){return;}
2484
+ data.currentTime = obj.position;
2485
+ if(data.duration && data.duration < data.currentTime){
2486
+ getDuration(data, obj);
2487
+ }
2488
+ if(data.readyState < 2){
2489
+ setReadyState(2, data);
2490
+ }
2491
+ if(data.ended){
2492
+ data.ended = false;
2493
+ }
2494
+ trigger(data._elem, 'timeupdate');
2495
+
2496
+ },
2497
+ STATE: function(obj){
2498
+ var data = getSwfDataFromID(obj.id);
2499
+ if(!data){return;}
2500
+ switch(obj.newstate) {
2501
+ case 'BUFFERING':
2502
+
2503
+ if(data.ended){
2504
+ data.ended = false;
2505
+ }
2506
+ setReadyState(1, data);
2507
+ trigger(data._elem, 'waiting');
2508
+ break;
2509
+ case 'PLAYING':
2510
+ data.paused = false;
2511
+ data._ppFlag = true;
2512
+ if(!data.duration){
2513
+ getDuration(data, obj);
2514
+ }
2515
+ if(data.readyState < 3){
2516
+ setReadyState(3, data);
2517
+ }
2518
+ if(data.ended){
2519
+ data.ended = false;
2520
+ }
2521
+ trigger(data._elem, 'playing');
2522
+ break;
2523
+ case 'PAUSED':
2524
+ if(!data.paused && !data.stopPlayPause){
2525
+ data.paused = true;
2526
+ data._ppFlag = true;
2527
+ trigger(data._elem, 'pause');
2528
+ }
2529
+ break;
2530
+ case 'COMPLETED':
2531
+ if(data.readyState < 4){
2532
+ setReadyState(4, data);
2533
+ }
2534
+ data.ended = true;
2535
+ trigger(data._elem, 'ended');
2536
+ break;
2537
+ }
2538
+ }
2539
+ }
2540
+ ,Controller: {
2541
+
2542
+ ERROR: function(obj){
2543
+ var data = getSwfDataFromID(obj.id);
2544
+ if(!data){return;}
2545
+ mediaelement.setError(data._elem, obj.message);
2546
+ },
2547
+ SEEK: function(obj){
2548
+ var data = getSwfDataFromID(obj.id);
2549
+ if(!data){return;}
2550
+ if(data.ended){
2551
+ data.ended = false;
2552
+ }
2553
+ if(data.paused){
2554
+ try {
2555
+ data.jwapi[SENDEVENT]('play', 'false');
2556
+ } catch(er){}
2557
+ }
2558
+ if(data.currentTime != obj.position){
2559
+ data.currentTime = obj.position;
2560
+ trigger(data._elem, 'timeupdate');
2561
+ }
2562
+
2563
+
2564
+ },
2565
+ VOLUME: function(obj){
2566
+ var data = getSwfDataFromID(obj.id);
2567
+ if(!data){return;}
2568
+ var newVolume = obj.percentage / 100;
2569
+ if(data.volume == newVolume){return;}
2570
+ data.volume = newVolume;
2571
+ trigger(data._elem, 'volumechange');
2572
+ },
2573
+ MUTE: function(obj){
2574
+ if(obj.state){return;}
2575
+ var data = getSwfDataFromID(obj.id);
2576
+ if(!data){return;}
2577
+ if(data.muted == obj.state){return;}
2578
+ data.muted = obj.state;
2579
+ trigger(data._elem, 'volumechange');
2580
+ }
2581
+ }
2582
+ };
2583
+
2584
+ var initEvents = function(data){
2585
+ var passed = true;
2586
+ $.each(mediaelement.jwEvents, function(mvcName, evts){
2587
+ $.each(evts, function(evtName){
2588
+ try {
2589
+ data.jwapi['add'+ mvcName +'Listener'](evtName, 'jQuery.webshims.mediaelement.jwEvents.'+ mvcName +'.'+ evtName);
2590
+ } catch(er){
2591
+ passed = false;
2592
+ return false;
2593
+ }
2594
+ });
2595
+ });
2596
+ return passed;
2597
+ };
2598
+
2599
+ var workActionQueue = function(data){
2600
+ var actionLen = data.actionQueue.length;
2601
+ var i = 0;
2602
+ var operation;
2603
+ if(actionLen && data.isActive == 'third'){
2604
+ while(data.actionQueue.length && actionLen > i){
2605
+ i++;
2606
+ operation = data.actionQueue.shift();
2607
+ data.jwapi[operation.fn].apply(data.jwapi, operation.args);
2608
+ }
2609
+ }
2610
+ if(data.actionQueue.length){
2611
+ data.actionQueue = [];
2612
+ }
2613
+ };
2614
+ var startAutoPlay = function(data){
2615
+ if(!data){return;}
2616
+ if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
2617
+ setTimeout(function(){
2618
+ if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
2619
+ try {
2620
+ $(data._elem).play();
2621
+ } catch(er){}
2622
+ }
2623
+ }, 1);
2624
+ }
2625
+ };
2626
+
2627
+ var startIntrinsicDimension = function(data){
2628
+ if(!data || data._elemNodeName != 'video'){return;}
2629
+ var img;
2630
+ var widthAuto;
2631
+ var heightAuto;
2632
+ var lastIntrinsicSize = {};
2633
+ var shadowElem;
2634
+ var errorTimer;
2635
+ var blockResize;
2636
+ var lastSize;
2637
+ var setSize = function(width, height){
2638
+ if(!height || !width || height < 1 || width < 1 || data.isActive != 'third'){return;}
2639
+ if(img){
2640
+ img.remove();
2641
+ img = false;
2642
+ }
2643
+ lastIntrinsicSize.width = width;
2644
+ lastIntrinsicSize.height = height;
2645
+ clearTimeout(errorTimer);
2646
+ widthAuto = data._elem.style.width == 'auto';
2647
+ heightAuto = data._elem.style.height == 'auto';
2648
+
2649
+ if(!widthAuto && !heightAuto){return;}
2650
+ var curSize;
2651
+ shadowElem = shadowElem || $(data._elem).getShadowElement();
2652
+ var cur;
2653
+ if(widthAuto && !heightAuto){
2654
+ cur = shadowElem.height();
2655
+ width *= cur / height;
2656
+ height = cur;
2657
+ } else if(!widthAuto && heightAuto){
2658
+ cur = shadowElem.width();
2659
+ height *= cur / width;
2660
+ width = cur;
2661
+ }
2662
+ blockResize = true;
2663
+ setTimeout(function(){
2664
+ blockResize = false;
2665
+ }, 9);
2666
+
2667
+ shadowElem.css({width: width, height: height});
2668
+ };
2669
+ var setPosterSrc = function(){
2670
+ if(data.isActive != 'third' || ($.prop(data._elem, 'readyState') && $.prop(this, 'videoWidth'))){return;}
2671
+ var posterSrc = $.prop(data._elem, 'poster');
2672
+ if(!posterSrc){return;}
2673
+ widthAuto = data._elem.style.width == 'auto';
2674
+ heightAuto = data._elem.style.height == 'auto';
2675
+ if(!widthAuto && !heightAuto){return;}
2676
+ if(img){
2677
+ img.remove();
2678
+ img = false;
2679
+ }
2680
+ img = $('<img style="position: absolute; height: auto; width: auto; top: 0px; left: 0px; visibility: hidden;" />');
2681
+ img
2682
+ .bind('load error alreadycomplete', function(e){
2683
+ clearTimeout(errorTimer);
2684
+
2685
+ var elem = this;
2686
+ var width = elem.naturalWidth || elem.width || elem.offsetWidth;
2687
+ var height = elem.naturalHeight || elem.height || elem.offsetHeight;
2688
+
2689
+ if(height && width){
2690
+ setSize(width, height);
2691
+ elem = null;
2692
+ } else {
2693
+ setTimeout(function(){
2694
+ width = elem.naturalWidth || elem.width || elem.offsetWidth;
2695
+ height = elem.naturalHeight || elem.height || elem.offsetHeight;
2696
+ setSize(width, height);
2697
+ if(img){
2698
+ img.remove();
2699
+ img = false;
2700
+ }
2701
+ elem = null;
2702
+ }, 9);
2703
+ }
2704
+ $(this).unbind();
2705
+ })
2706
+ .prop('src', posterSrc)
2707
+ .appendTo('body')
2708
+ .each(function(){
2709
+ if(this.complete || this.error){
2710
+ $(this).triggerHandler('alreadycomplete');
2711
+ } else {
2712
+ clearTimeout(errorTimer);
2713
+ errorTimer = setTimeout(function(){
2714
+ $(data._elem).triggerHandler('error');
2715
+ }, 9999);
2716
+ }
2717
+ })
2718
+ ;
2719
+ };
2720
+
2721
+ $(data._elem)
2722
+ .bind('loadedmetadata', function(){
2723
+ setSize($.prop(this, 'videoWidth'), $.prop(this, 'videoHeight'));
2724
+ })
2725
+ .bind('emptied', setPosterSrc)
2726
+ .bind('swfstageresize updatemediaelementdimensions', function(){
2727
+ if(blockResize){return;}
2728
+ setSize(lastIntrinsicSize.width, lastIntrinsicSize.height);
2729
+ })
2730
+ .bind('emptied', function(){
2731
+ lastIntrinsicSize = {};
2732
+ })
2733
+ .triggerHandler('swfstageresize')
2734
+ ;
2735
+
2736
+ setPosterSrc();
2737
+ if($.prop(data._elem, 'readyState')){
2738
+ setSize($.prop(data._elem, 'videoWidth'), $.prop(data._elem, 'videoHeight'));
2739
+ }
2740
+ };
2741
+
2742
+ mediaelement.playerResize = function(id){
2743
+ if(!id){return;}
2744
+ var elem = document.getElementById(id.replace(idRep, ''));
2745
+
2746
+ if(elem){
2747
+ $(elem).triggerHandler('swfstageresize');
2748
+ }
2749
+ elem = null;
2750
+ };
2751
+
2752
+
2753
+ $(document).bind('emptied', function(e){
2754
+ var data = getSwfDataFromElem(e.target);
2755
+ startAutoPlay(data);
2756
+ });
2757
+
2758
+ var localConnectionTimer;
2759
+ mediaelement.jwPlayerReady = function(jwData){
2760
+ var data = getSwfDataFromID(jwData.id);
2761
+ var passed = true;
2762
+ var i = 0;
2763
+ var doneFn = function(){
2764
+ if(i > 9){return;}
2765
+ i++;
2766
+ if(initEvents(data)){
2767
+ if(!data.wasSwfReady){
2768
+ var version = parseFloat( jwData.version, 10);
2769
+ if(version < 5.1 || version >= 6){
2770
+ webshims.warn('mediaelement-swf is only testet with jwplayer 5.6+');
2771
+ }
2772
+ } else {
2773
+ $(data._elem).mediaLoad();
2774
+
2775
+ }
2776
+ data.wasSwfReady = true;
2777
+ data.tryedReframeing = 0;
2778
+ workActionQueue(data);
2779
+ startAutoPlay(data);
2780
+ } else {
2781
+ clearTimeout(data.reframeTimer);
2782
+ data.reframeTimer = setTimeout(doneFn, 9 * i);
2783
+ if(i > 2 && data.tryedReframeing < 9){
2784
+ data.tryedReframeing++;
2785
+ data.shadowElem.css({overflow: 'visible'});
2786
+ setTimeout(function(){
2787
+ data.shadowElem.css({overflow: 'hidden'});
2788
+ }, 16);
2789
+ }
2790
+ }
2791
+ };
2792
+ if(!data || !data.jwapi){return;}
2793
+ if(!data.tryedReframeing){
2794
+ data.tryedReframeing = 0;
2795
+ }
2796
+ clearTimeout(localConnectionTimer);
2797
+ data.jwData = jwData;
2798
+ data.shadowElem.removeClass('flashblocker-assumed');
2799
+ $.prop(data._elem, 'volume', data.volume);
2800
+ $.prop(data._elem, 'muted', data.muted);
2801
+ doneFn();
2802
+
2803
+ };
2804
+
2805
+ var addMediaToStopEvents = $.noop;
2806
+ if(hasNative){
2807
+ var stopEvents = {
2808
+ play: 1,
2809
+ playing: 1
2810
+ };
2811
+ var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
2812
+ var hidevents = hideEvtArray.map(function(evt){
2813
+ return evt +'.webshimspolyfill';
2814
+ }).join(' ');
2815
+
2816
+ var hidePlayerEvents = function(event){
2817
+ var data = webshims.data(event.target, 'mediaelement');
2818
+ if(!data){return;}
2819
+ var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
2820
+ if( isNativeHTML5 == (data.activating == 'third') ){
2821
+ event.stopImmediatePropagation();
2822
+ if(stopEvents[event.type] && data.isActive != data.activating){
2823
+ $(event.target).pause();
2824
+ }
2825
+ }
2826
+ };
2827
+
2828
+ addMediaToStopEvents = function(elem){
2829
+ $(elem)
2830
+ .unbind(hidevents)
2831
+ .bind(hidevents, hidePlayerEvents)
2832
+ ;
2833
+ hideEvtArray.forEach(function(evt){
2834
+ webshims.moveToFirstEvent(elem, evt);
2835
+ });
2836
+ };
2837
+ addMediaToStopEvents(document);
2838
+ }
2839
+
2840
+
2841
+ mediaelement.setActive = function(elem, type, data){
2842
+ if(!data){
2843
+ data = webshims.data(elem, 'mediaelement');
2844
+ }
2845
+ if(!data || data.isActive == type){return;}
2846
+ if(type != 'html5' && type != 'third'){
2847
+ webshims.warn('wrong type for mediaelement activating: '+ type);
2848
+ }
2849
+ var shadowData = webshims.data(elem, 'shadowData');
2850
+ data.activating = type;
2851
+ $(elem).pause();
2852
+ data.isActive = type;
2853
+ if(type == 'third'){
2854
+ shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
2855
+ $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
2856
+ } else {
2857
+ $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
2858
+ shadowData.shadowElement = shadowData.shadowFocusElement = false;
2859
+ }
2860
+ $(elem).trigger('mediaelementapichange');
2861
+ };
2862
+
2863
+
2864
+
2865
+ var resetSwfProps = (function(){
2866
+ var resetProtoProps = ['_bufferedEnd', '_bufferedStart', '_metadata', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'videoHeight', 'videoWidth', '_callMeta', '_durationCalcs'];
2867
+ var len = resetProtoProps.length;
2868
+ return function(data){
2869
+
2870
+ if(!data){return;}
2871
+ var lenI = len;
2872
+ var networkState = data.networkState;
2873
+ setReadyState(0, data);
2874
+ while(--lenI){
2875
+ delete data[resetProtoProps[lenI]];
2876
+ }
2877
+ data.actionQueue = [];
2878
+ data.buffered.length = 0;
2879
+ if(networkState){
2880
+ trigger(data._elem, 'emptied');
2881
+ }
2882
+ };
2883
+ })();
2884
+
2885
+ var setElementDimension = function(data, hasControls){
2886
+ var elem = data._elem;
2887
+ var box = data.shadowElem;
2888
+ $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
2889
+ if(data._elemNodeName == 'audio' && !hasControls){
2890
+ box.css({width: 0, height: 0});
2891
+ } else {
2892
+ box.css({
2893
+ width: elem.style.width || $(elem).width(),
2894
+ height: elem.style.height || $(elem).height()
2895
+ });
2896
+ }
2897
+ };
2898
+
2899
+ mediaelement.createSWF = function( elem, canPlaySrc, data ){
2900
+ if(!hasFlash){
2901
+ setTimeout(function(){
2902
+ $(elem).mediaLoad(); //<- this should produce a mediaerror
2903
+ }, 1);
2904
+ return;
2905
+ }
2906
+
2907
+ if(loadedSwf < 1){
2908
+ loadedSwf = 1;
2909
+ } else {
2910
+ loadedSwf++;
2911
+ }
2912
+ var vars = $.extend({}, options.jwVars, {
2913
+ image: $.prop(elem, 'poster') || '',
2914
+ file: canPlaySrc.srcProp
2915
+ });
2916
+ var elemVars = $(elem).data('jwvars') || {};
2917
+
2918
+ if(!data){
2919
+ data = webshims.data(elem, 'mediaelement');
2920
+ }
2921
+
2922
+ if(data && data.swfCreated){
2923
+ mediaelement.setActive(elem, 'third', data);
2924
+ resetSwfProps(data);
2925
+ data.currentSrc = canPlaySrc.srcProp;
2926
+ $.extend(vars, elemVars);
2927
+ options.changeJW(vars, elem, canPlaySrc, data, 'load');
2928
+ queueSwfMethod(elem, SENDEVENT, ['LOAD', vars]);
2929
+ return;
2930
+ }
2931
+
2932
+
2933
+ var hasControls = $.prop(elem, 'controls');
2934
+ var elemId = 'jwplayer-'+ webshims.getID(elem);
2935
+ var params = $.extend(
2936
+ {},
2937
+ options.jwParams,
2938
+ $(elem).data('jwparams')
2939
+ );
2940
+ var elemNodeName = elem.nodeName.toLowerCase();
2941
+ var attrs = $.extend(
2942
+ {},
2943
+ options.jwAttrs,
2944
+ {
2945
+ name: elemId,
2946
+ id: elemId
2947
+ },
2948
+ $(elem).data('jwattrs')
2949
+ );
2950
+ var box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
2951
+ .css({
2952
+ position: 'relative',
2953
+ overflow: 'hidden'
2954
+ })
2955
+ ;
2956
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
2957
+ actionQueue: {
2958
+ value: []
2959
+ },
2960
+ shadowElem: {
2961
+ value: box
2962
+ },
2963
+ _elemNodeName: {
2964
+ value: elemNodeName
2965
+ },
2966
+ _elem: {
2967
+ value: elem
2968
+ },
2969
+ currentSrc: {
2970
+ value: canPlaySrc.srcProp
2971
+ },
2972
+ swfCreated: {
2973
+ value: true
2974
+ },
2975
+ buffered: {
2976
+ value: {
2977
+ start: function(index){
2978
+ if(index >= data.buffered.length){
2979
+ webshims.error('buffered index size error');
2980
+ return;
2981
+ }
2982
+ return 0;
2983
+ },
2984
+ end: function(index){
2985
+ if(index >= data.buffered.length){
2986
+ webshims.error('buffered index size error');
2987
+ return;
2988
+ }
2989
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd / 100) + data._bufferedStart;
2990
+ },
2991
+ length: 0
2992
+ }
2993
+ }
2994
+ }));
2995
+
2996
+ setElementDimension(data, hasControls);
2997
+
2998
+ box.insertBefore(elem);
2999
+
3000
+ if(hasNative){
3001
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted')});
3002
+ }
3003
+
3004
+ $.extend(vars,
3005
+ {
3006
+ id: elemId,
3007
+ controlbar: hasControls ? options.jwVars.controlbar || (elemNodeName == 'video' ? 'over' : 'bottom') : (elemNodeName == 'video') ? 'none' : 'bottom',
3008
+ icons: ''+ (hasControls && elemNodeName == 'video')
3009
+ },
3010
+ elemVars,
3011
+ {playerready: 'jQuery.webshims.mediaelement.jwPlayerReady'}
3012
+ );
3013
+ if(vars.plugins){
3014
+ vars.plugins += ','+jwplugin;
3015
+ } else {
3016
+ vars.plugins = jwplugin;
3017
+ }
3018
+
3019
+
3020
+ webshims.addShadowDom(elem, box);
3021
+
3022
+ addMediaToStopEvents(elem);
3023
+
3024
+ mediaelement.setActive(elem, 'third', data);
3025
+
3026
+ options.changeJW(vars, elem, canPlaySrc, data, 'embed');
3027
+
3028
+ $(elem).bind('updatemediaelementdimensions updateshadowdom', function(){
3029
+ setElementDimension(data, $.prop(elem, 'controls'));
3030
+ });
3031
+
3032
+ startIntrinsicDimension(data);
3033
+
3034
+ swfobject.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.0", false, vars, params, attrs, function(swfData){
3035
+
3036
+ if(swfData.success){
3037
+ data.jwapi = swfData.ref;
3038
+
3039
+ if(!hasControls){
3040
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
3041
+ }
3042
+ setTimeout(function(){
3043
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
3044
+ box.addClass('flashblocker-assumed');
3045
+ $(elem).trigger('flashblocker');
3046
+ webshims.warn("flashblocker assumed");
3047
+ }
3048
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
3049
+ }, 9);
3050
+ if(!localConnectionTimer){
3051
+ clearTimeout(localConnectionTimer);
3052
+ localConnectionTimer = setTimeout(function(){
3053
+ var flash = $(swfData.ref);
3054
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
3055
+ webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
3056
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
3057
+ webshims.info("JS-SWF connection can't be established on hidden or unconnected flash objects");
3058
+ }
3059
+ flash = null;
3060
+ }, 8000);
3061
+ }
3062
+ }
3063
+ });
3064
+ };
3065
+
3066
+
3067
+ var queueSwfMethod = function(elem, fn, args, data){
3068
+ data = data || getSwfDataFromElem(elem);
3069
+ if(data){
3070
+ if(data.jwapi && data.jwapi[fn]){
3071
+ data.jwapi[fn].apply(data.jwapi, args || []);
3072
+ } else {
3073
+ //todo add to queue
3074
+ data.actionQueue.push({fn: fn, args: args});
3075
+ if(data.actionQueue.length > 10){
3076
+ setTimeout(function(){
3077
+ if(data.actionQueue.length > 5){
3078
+ data.actionQueue.shift();
3079
+ }
3080
+ }, 99);
3081
+ }
3082
+ }
3083
+ return data;
3084
+ }
3085
+ return false;
3086
+ };
3087
+
3088
+ ['audio', 'video'].forEach(function(nodeName){
3089
+ var descs = {};
3090
+ var mediaSup;
3091
+ var createGetProp = function(key){
3092
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
3093
+
3094
+ descs[key] = {
3095
+ get: function(){
3096
+ var data = getSwfDataFromElem(this);
3097
+ if(data){
3098
+ return data[key];
3099
+ } else if(hasNative && mediaSup[key].prop._supget) {
3100
+ return mediaSup[key].prop._supget.apply(this);
3101
+ } else {
3102
+ return playerStateObj[key];
3103
+ }
3104
+ },
3105
+ writeable: false
3106
+ };
3107
+ };
3108
+ var createGetSetProp = function(key, setFn){
3109
+ createGetProp(key);
3110
+ delete descs[key].writeable;
3111
+ descs[key].set = setFn;
3112
+ };
3113
+
3114
+ createGetSetProp('volume', function(v){
3115
+ var data = getSwfDataFromElem(this);
3116
+ if(data){
3117
+ v *= 100;
3118
+ if(!isNaN(v)){
3119
+ var muted = data.muted;
3120
+ if(v < 0 || v > 100){
3121
+ webshims.error('volume greater or less than allowed '+ (v / 100));
3122
+ }
3123
+
3124
+ queueSwfMethod(this, SENDEVENT, ['VOLUME', v], data);
3125
+ if(muted){
3126
+ try {
3127
+ data.jwapi.sendEvent('mute', 'true');
3128
+ } catch(er){}
3129
+ }
3130
+ v /= 100;
3131
+ if(data.volume == v || data.isActive != 'third'){return;}
3132
+ data.volume = v;
3133
+ trigger(data._elem, 'volumechange');
3134
+ data = null;
3135
+ }
3136
+ } else if(mediaSup.volume.prop._supset) {
3137
+ return mediaSup.volume.prop._supset.apply(this, arguments);
3138
+ }
3139
+ });
3140
+
3141
+ createGetSetProp('muted', function(m){
3142
+ var data = getSwfDataFromElem(this);
3143
+ if(data){
3144
+ m = !!m;
3145
+ queueSwfMethod(this, SENDEVENT, ['mute', ''+m], data);
3146
+ if(data.muted == m || data.isActive != 'third'){return;}
3147
+ data.muted = m;
3148
+ trigger(data._elem, 'volumechange');
3149
+ data = null;
3150
+ } else if(mediaSup.muted.prop._supset) {
3151
+ return mediaSup.muted.prop._supset.apply(this, arguments);
3152
+ }
3153
+ });
3154
+
3155
+
3156
+ createGetSetProp('currentTime', function(t){
3157
+ var data = getSwfDataFromElem(this);
3158
+ if(data){
3159
+ t *= 1;
3160
+ if (!isNaN(t)) {
3161
+ if(data.paused){
3162
+ clearTimeout(data.stopPlayPause);
3163
+ data.stopPlayPause = setTimeout(function(){
3164
+ data.paused = true;
3165
+ data.stopPlayPause = false;
3166
+ }, 50);
3167
+ }
3168
+ queueSwfMethod(this, SENDEVENT, ['SEEK', '' + t], data);
3169
+
3170
+ if(data.paused){
3171
+ if(data.readyState > 0){
3172
+ data.currentTime = t;
3173
+ trigger(data._elem, 'timeupdate');
3174
+ }
3175
+ try {
3176
+ data.jwapi[SENDEVENT]('play', 'false');
3177
+ } catch(er){}
3178
+
3179
+ }
3180
+ }
3181
+
3182
+ } else if(mediaSup.currentTime.prop._supset) {
3183
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
3184
+ }
3185
+ });
3186
+
3187
+ ['play', 'pause'].forEach(function(fn){
3188
+ descs[fn] = {
3189
+ value: function(){
3190
+ var data = getSwfDataFromElem(this);
3191
+ if(data){
3192
+ if(data.stopPlayPause){
3193
+ clearTimeout(data.stopPlayPause);
3194
+ }
3195
+ queueSwfMethod(this, SENDEVENT, ['play', fn == 'play'], data);
3196
+ setTimeout(function(){
3197
+ if(data.isActive == 'third'){
3198
+ data._ppFlag = true;
3199
+ if(data.paused != (fn != 'play')){
3200
+ data.paused = fn != 'play';
3201
+ trigger(data._elem, fn);
3202
+ }
3203
+ }
3204
+ }, 1);
3205
+ } else if(mediaSup[fn].prop._supvalue) {
3206
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
3207
+ }
3208
+ }
3209
+ };
3210
+ });
3211
+
3212
+ getPropKeys.forEach(createGetProp);
3213
+
3214
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
3215
+ var data = getSwfDataFromElem(this);
3216
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
3217
+
3218
+ if(data){
3219
+ try {
3220
+ queueSwfMethod(this, boolProp ? 'showControls' : 'hideControls', [nodeName], data);
3221
+ } catch(er){
3222
+ webshims.warn("you need to generate a crossdomain.xml");
3223
+ }
3224
+ if(nodeName == 'audio'){
3225
+ setElementDimension(data, boolProp);
3226
+ }
3227
+ $(data.jwapi).attr('tabindex', boolProp ? '0' : '-1');
3228
+ }
3229
+ });
3230
+
3231
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
3232
+ });
3233
+
3234
+ if(hasFlash){
3235
+ var oldClean = $.cleanData;
3236
+ var gcBrowser = $.browser.msie && webshims.browserVersion < 9;
3237
+ var flashNames = {
3238
+ object: 1,
3239
+ OBJECT: 1
3240
+ };
3241
+ $.cleanData = function(elems){
3242
+ var i, len, prop;
3243
+ if(elems && (len = elems.length) && loadedSwf){
3244
+
3245
+ for(i = 0; i < len; i++){
3246
+ if(flashNames[elems[i].nodeName]){
3247
+ if(SENDEVENT in elems[i]){
3248
+ loadedSwf--;
3249
+ try {
3250
+ elems[i][SENDEVENT]('play', false);
3251
+ } catch(er){}
3252
+ }
3253
+ if(gcBrowser){
3254
+ try {
3255
+ for (prop in elems[i]) {
3256
+ if (typeof elems[i][prop] == "function") {
3257
+ elems[i][prop] = null;
3258
+ }
3259
+ }
3260
+ } catch(er){}
3261
+ }
3262
+ }
3263
+ }
3264
+
3265
+ }
3266
+ return oldClean.apply(this, arguments);
3267
+ };
3268
+ }
3269
+
3270
+ if(!hasNative){
3271
+
3272
+ ['poster', 'src'].forEach(function(prop){
3273
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
3274
+ //attr: {},
3275
+ reflect: true,
3276
+ propType: 'src'
3277
+ });
3278
+ });
3279
+
3280
+
3281
+ ['autoplay', 'controls'].forEach(function(name){
3282
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
3283
+ });
3284
+
3285
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
3286
+ HAVE_CURRENT_DATA: {
3287
+ value: 2
3288
+ },
3289
+ HAVE_ENOUGH_DATA: {
3290
+ value: 4
3291
+ },
3292
+ HAVE_FUTURE_DATA: {
3293
+ value: 3
3294
+ },
3295
+ HAVE_METADATA: {
3296
+ value: 1
3297
+ },
3298
+ HAVE_NOTHING: {
3299
+ value: 0
3300
+ },
3301
+ NETWORK_EMPTY: {
3302
+ value: 0
3303
+ },
3304
+ NETWORK_IDLE: {
3305
+ value: 1
3306
+ },
3307
+ NETWORK_LOADING: {
3308
+ value: 2
3309
+ },
3310
+ NETWORK_NO_SOURCE: {
3311
+ value: 3
3312
+ }
3313
+
3314
+ }, 'prop');
3315
+ }
3316
+
3317
+ });jQuery.webshims.register('track', function($, webshims, window, document, undefined){
3318
+ var mediaelement = webshims.mediaelement;
3319
+ var id = new Date().getTime();
3320
+ var showTracks = {subtitles: 1, captions: 1};
3321
+ var notImplemented = function(){
3322
+ webshims.error('not implemented yet');
3323
+ };
3324
+
3325
+ var createEventTarget = function(obj){
3326
+ var eventList = {};
3327
+ obj.addEventListener = function(name, fn){
3328
+ if(eventList[name]){
3329
+ webshims.error('always use $.bind to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
3330
+ }
3331
+ eventList[name] = fn;
3332
+
3333
+ };
3334
+ obj.removeEventListener = function(name, fn){
3335
+ if(eventList[name] && eventList[name] != fn){
3336
+ webshims.error('always use $.bind/$.unbind to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
3337
+ }
3338
+ if(eventList[name]){
3339
+ delete eventList[name];
3340
+ }
3341
+ };
3342
+ return obj;
3343
+ };
3344
+
3345
+
3346
+ var cueListProto = {
3347
+ getCueById: function(id){
3348
+ var cue = null;
3349
+ for(var i = 0, len = this.length; i < len; i++){
3350
+ if(this[i].id === id){
3351
+ cue = this[i];
3352
+ break;
3353
+ }
3354
+ }
3355
+ return cue;
3356
+ }
3357
+ };
3358
+ var textTrackProto = {
3359
+ shimActiveCues: null,
3360
+ _shimActiveCues: null,
3361
+ activeCues: null,
3362
+ cues: null,
3363
+ kind: 'subtitles',
3364
+ label: '',
3365
+ language: '',
3366
+ mode: 'disabled',
3367
+ readyState: 0,
3368
+ oncuechange: null,
3369
+ toString: function() {
3370
+ return "[object TextTrack]";
3371
+ },
3372
+ addCue: function(cue){
3373
+ if(!this.cues){
3374
+ this.cues = mediaelement.createCueList();
3375
+ } else {
3376
+ var lastCue = this.cues[this.cues.length-1];
3377
+ if(lastCue && lastCue.startTime > cue.startTime){
3378
+ webshims.error("cue startTime higher than previous cue's startTime");
3379
+ }
3380
+ }
3381
+ if(cue.track){
3382
+ webshims.error("cue already part of a track element");
3383
+ }
3384
+ cue.track = this;
3385
+ this.cues.push(cue);
3386
+ },
3387
+ removeCue: notImplemented,
3388
+ DISABLED: 'disabled',
3389
+ OFF: 'disabled',
3390
+ HIDDEN: 'hidden',
3391
+ SHOWING: 'showing',
3392
+ ERROR: 3,
3393
+ LOADED: 2,
3394
+ LOADING: 1,
3395
+ NONE: 0
3396
+ };
3397
+ var copyProps = ['kind', 'label', 'srclang'];
3398
+
3399
+ var owns = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
3400
+
3401
+ //ToDo: add/remove event
3402
+ var updateMediaTrackList = function(baseData, trackList){
3403
+ var removed = [];
3404
+ var added = [];
3405
+ var newTracks = [];
3406
+ var i, len;
3407
+ if(!baseData){
3408
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
3409
+ }
3410
+
3411
+ if(!trackList){
3412
+ baseData.blockTrackListUpdate = true;
3413
+ trackList = $.prop(this, 'textTracks');
3414
+ baseData.blockTrackListUpdate = false;
3415
+ }
3416
+
3417
+ clearTimeout(baseData.updateTrackListTimer);
3418
+
3419
+ $('track', this).each(function(){
3420
+ var track = $.prop(this, 'track');
3421
+ newTracks.push(track);
3422
+ if(trackList.indexOf(track) == -1){
3423
+ added.push(track);
3424
+ }
3425
+ });
3426
+
3427
+ if(baseData.scriptedTextTracks){
3428
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
3429
+ newTracks.push(baseData.scriptedTextTracks[i]);
3430
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
3431
+ added.push(baseData.scriptedTextTracks[i]);
3432
+ }
3433
+ }
3434
+ }
3435
+
3436
+ for(i = 0, len = trackList.length; i < len; i++){
3437
+ if(newTracks.indexOf(trackList[i]) == -1){
3438
+ removed.push(trackList[i]);
3439
+ }
3440
+ }
3441
+
3442
+ if(removed.length || added.length){
3443
+ trackList.splice(0);
3444
+
3445
+ for(i = 0, len = newTracks.length; i < len; i++){
3446
+ trackList.push(newTracks[i]);
3447
+ }
3448
+ for(i = 0, len = removed.length; i < len; i++){
3449
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: trackList, track: removed[i]}));
3450
+ }
3451
+ for(i = 0, len = added.length; i < len; i++){
3452
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: trackList, track: added[i]}));
3453
+ }
3454
+ if(baseData.scriptedTextTracks || removed.length){
3455
+ $(this).triggerHandler('updatetrackdisplay');
3456
+ }
3457
+ }
3458
+ };
3459
+
3460
+ var refreshTrack = function(track, trackData){
3461
+ var mode, kind;
3462
+ if(!trackData){
3463
+ trackData = webshims.data(track, 'trackData');
3464
+ }
3465
+ if(trackData && !trackData.isTriggering){
3466
+ trackData.isTriggering = true;
3467
+ mode = (trackData.track || {}).mode;
3468
+ kind = (trackData.track || {}).kind;
3469
+ setTimeout(function(){
3470
+ if(mode !== (trackData.track || {}).mode || kind != (trackData.track || {}).kind){
3471
+ if(!(trackData.track || {}).readyState){
3472
+ $(track).triggerHandler('checktrackmode');
3473
+ } else {
3474
+ $(track).parent().triggerHandler('updatetrackdisplay');
3475
+ }
3476
+ }
3477
+ trackData.isTriggering = false;
3478
+
3479
+ }, 9);
3480
+ }
3481
+ };
3482
+
3483
+ var emptyDiv = $('<div />')[0];
3484
+ window.TextTrackCue = function(startTime, endTime, text){
3485
+ if(arguments.length != 3){
3486
+ webshims.error("wrong arguments.length for TextTrackCue.constructor");
3487
+ }
3488
+
3489
+ this.startTime = startTime;
3490
+ this.endTime = endTime;
3491
+ this.text = text;
3492
+
3493
+ this.id = "";
3494
+ this.pauseOnExit = false;
3495
+
3496
+ createEventTarget(this);
3497
+ };
3498
+
3499
+ window.TextTrackCue.prototype = {
3500
+
3501
+ onenter: null,
3502
+ onexit: null,
3503
+ pauseOnExit: false,
3504
+ getCueAsHTML: function(){
3505
+ var lastText = "";
3506
+ var parsedText = "";
3507
+ var fragment = document.createDocumentFragment();
3508
+ var fn;
3509
+ if(!owns(this, 'getCueAsHTML')){
3510
+ fn = this.getCueAsHTML = function(){
3511
+ var i, len;
3512
+ if(lastText != this.text){
3513
+ lastText = this.text;
3514
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
3515
+ emptyDiv.innerHTML = parsedText;
3516
+
3517
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
3518
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
3519
+ }
3520
+ }
3521
+ return fragment.cloneNode(true);
3522
+ };
3523
+
3524
+ }
3525
+ return fn ? fn.apply(this, arguments) : fragment.cloneNode(true);
3526
+ },
3527
+ track: null,
3528
+
3529
+
3530
+ id: ''
3531
+ //todo-->
3532
+ // ,
3533
+ // snapToLines: true,
3534
+ // line: 'auto',
3535
+ // size: 100,
3536
+ // position: 50,
3537
+ // vertical: '',
3538
+ // align: 'middle'
3539
+ };
3540
+
3541
+
3542
+
3543
+
3544
+
3545
+ mediaelement.createCueList = function(){
3546
+ return $.extend([], cueListProto);
3547
+ };
3548
+
3549
+ mediaelement.parseCueTextToHTML = (function(){
3550
+ var tagSplits = /(<\/?[^>]+>)/ig;
3551
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
3552
+ var regEnd = /\<\s*\//;
3553
+ var addToTemplate = function(localName, attribute, tag, html){
3554
+ var ret;
3555
+ if(regEnd.test(html)){
3556
+ ret = '</'+ localName +'>';
3557
+ } else {
3558
+ tag.splice(0, 1);
3559
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '&#34;')) +'">';
3560
+ }
3561
+ return ret;
3562
+ };
3563
+ var replacer = function(html){
3564
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
3565
+ if(tag[0]){
3566
+ tag[0] = tag[0].toLowerCase();
3567
+ if(allowedTags.test(tag[0])){
3568
+ if(tag[0] == 'c'){
3569
+ html = addToTemplate('span', 'class', tag, html);
3570
+ } else if(tag[0] == 'v'){
3571
+ html = addToTemplate('q', 'title', tag, html);
3572
+ }
3573
+ } else {
3574
+ html = "";
3575
+ }
3576
+ }
3577
+ return html;
3578
+ };
3579
+
3580
+ return function(cueText){
3581
+ return cueText.replace(tagSplits, replacer);
3582
+ };
3583
+ })();
3584
+
3585
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
3586
+ var loadEvents = 'play playing timeupdate updatetrackdisplay';
3587
+ var obj = trackData.track;
3588
+ var load = function(){
3589
+ var src = $.prop(track, 'src');
3590
+ var error;
3591
+ var ajax;
3592
+ if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
3593
+ $(mediaelem).unbind(loadEvents, load);
3594
+ $(track).unbind('checktrackmode', load);
3595
+ if(!obj.readyState){
3596
+ error = function(){
3597
+ obj.readyState = 3;
3598
+ obj.cues = null;
3599
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
3600
+ $(track).triggerHandler('error');
3601
+ };
3602
+ obj.readyState = 1;
3603
+ try {
3604
+ obj.cues = mediaelement.createCueList();
3605
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
3606
+ ajax = $.ajax({
3607
+ dataType: 'text',
3608
+ url: src,
3609
+ success: function(text){
3610
+ if(ajax.getResponseHeader('content-type') != 'text/vtt'){
3611
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
3612
+ }
3613
+ mediaelement.parseCaptions(text, obj, function(cues){
3614
+ if(cues && 'length' in cues){
3615
+ obj.readyState = 2;
3616
+ $(track).triggerHandler('load');
3617
+ $(mediaelem).triggerHandler('updatetrackdisplay');
3618
+ } else {
3619
+ error();
3620
+ }
3621
+ });
3622
+
3623
+ },
3624
+ error: error
3625
+ });
3626
+ } catch(er){
3627
+ error();
3628
+ webshims.warn(er);
3629
+ }
3630
+ }
3631
+ }
3632
+ };
3633
+ obj.readyState = 0;
3634
+ obj.shimActiveCues = null;
3635
+ obj._shimActiveCues = null;
3636
+ obj.activeCues = null;
3637
+ obj.cues = null;
3638
+ $(mediaelem).unbind(loadEvents, load);
3639
+ $(track).unbind('checktrackmode', load);
3640
+ $(mediaelem).bind(loadEvents, load);
3641
+ $(track).bind('checktrackmode', load);
3642
+ if(_default){
3643
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
3644
+ load();
3645
+ }
3646
+ };
3647
+
3648
+ mediaelement.createTextTrack = function(mediaelem, track){
3649
+ var obj, trackData;
3650
+ if(track.nodeName){
3651
+ trackData = webshims.data(track, 'trackData');
3652
+
3653
+ if(trackData){
3654
+ refreshTrack(track, trackData);
3655
+ obj = trackData.track;
3656
+ }
3657
+ }
3658
+
3659
+ if(!obj){
3660
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
3661
+ copyProps.forEach(function(copyProp){
3662
+ var prop = $.prop(track, copyProp);
3663
+ if(prop){
3664
+ if(copyProp == 'srclang'){
3665
+ copyProp = 'language';
3666
+ }
3667
+ obj[copyProp] = prop;
3668
+ }
3669
+ });
3670
+
3671
+
3672
+ if(track.nodeName){
3673
+ trackData = webshims.data(track, 'trackData', {track: obj});
3674
+ mediaelement.loadTextTrack(mediaelem, track, trackData, $.prop(track, 'default'));
3675
+ } else {
3676
+ obj.cues = mediaelement.createCueList();
3677
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
3678
+ obj.mode = 'hidden';
3679
+ obj.readyState = 2;
3680
+ }
3681
+ }
3682
+ return obj;
3683
+ };
3684
+
3685
+
3686
+ /*
3687
+ taken from:
3688
+ Captionator 0.5.1 [CaptionCrunch]
3689
+ Christopher Giffard, 2011
3690
+ Share and enjoy
3691
+
3692
+ https://github.com/cgiffard/Captionator
3693
+
3694
+ modified for webshims
3695
+ */
3696
+ mediaelement.parseCaptionChunk = (function(){
3697
+ // Set up timestamp parsers
3698
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
3699
+ var GoogleTimestampParser = /^([\d\.]+)\s+\+([\d\.]+)\s*(.*)/;
3700
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
3701
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
3702
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
3703
+
3704
+ return function(subtitleElement,objectCount){
3705
+ var cueDefaults = [];
3706
+
3707
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, cueSettings = "", id, specialCueData;
3708
+ var timestampMatch, tmpCue;
3709
+
3710
+ // WebVTT Special Cue Logic
3711
+ if ((specialCueData = WebVTTDEFAULTSCueParser.exec(subtitleElement))) {
3712
+ // cueDefaults = specialCueData.slice(2).join("");
3713
+ // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
3714
+ return null;
3715
+ } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
3716
+ return null;
3717
+ } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
3718
+ return null; // At this stage, we don't want to do anything with these.
3719
+ }
3720
+
3721
+ subtitleParts = subtitleElement.split(/\n/g);
3722
+
3723
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
3724
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
3725
+ subtitleParts.shift();
3726
+ }
3727
+
3728
+ if (subtitleParts[0].match(/^\s*[a-z0-9]+\s*$/ig)) {
3729
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
3730
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
3731
+ }
3732
+
3733
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
3734
+ var timestamp = subtitleParts[subtitlePartIndex];
3735
+
3736
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
3737
+
3738
+ // WebVTT
3739
+
3740
+ timeData = timestampMatch.slice(1);
3741
+
3742
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
3743
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
3744
+ parseInt((timeData[2]||0),10) + // Seconds
3745
+ parseFloat("0." + (timeData[3]||0)); // MS
3746
+
3747
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
3748
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
3749
+ parseInt((timeData[6]||0),10) + // Seconds
3750
+ parseFloat("0." + (timeData[7]||0)); // MS
3751
+ /*
3752
+ if (timeData[8]) {
3753
+ cueSettings = timeData[8];
3754
+ }
3755
+ */
3756
+ }
3757
+
3758
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
3759
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
3760
+ break;
3761
+ }
3762
+
3763
+ if (!timeIn && !timeOut) {
3764
+ // We didn't extract any time information. Assume the cue is invalid!
3765
+ return null;
3766
+ }
3767
+ /*
3768
+ // Consolidate cue settings, convert defaults to object
3769
+ var compositeCueSettings =
3770
+ cueDefaults
3771
+ .reduce(function(previous,current,index,array){
3772
+ previous[current.split(":")[0]] = current.split(":")[1];
3773
+ return previous;
3774
+ },{});
3775
+
3776
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
3777
+ compositeCueSettings =
3778
+ cueSettings
3779
+ .split(/\s+/g)
3780
+ .filter(function(set) { return set && !!set.length; })
3781
+ // Convert array to a key/val object
3782
+ .reduce(function(previous,current,index,array){
3783
+ previous[current.split(":")[0]] = current.split(":")[1];
3784
+ return previous;
3785
+ },compositeCueSettings);
3786
+
3787
+ // Turn back into string like the TextTrackCue constructor expects
3788
+ cueSettings = "";
3789
+ for (var key in compositeCueSettings) {
3790
+ if (compositeCueSettings.hasOwnProperty(key)) {
3791
+ cueSettings += !!cueSettings.length ? " " : "";
3792
+ cueSettings += key + ":" + compositeCueSettings[key];
3793
+ }
3794
+ }
3795
+ */
3796
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
3797
+ html = subtitleParts.join("\n");
3798
+ tmpCue = new TextTrackCue(timeIn, timeOut, html);
3799
+ if(id){
3800
+ tmpCue.id = id;
3801
+ }
3802
+ return tmpCue;
3803
+ };
3804
+ })();
3805
+
3806
+ mediaelement.parseCaptions = function(captionData, track, complete) {
3807
+ var subtitles = mediaelement.createCueList();
3808
+ var cue, lazyProcess, regWevVTT;
3809
+ var startDate;
3810
+ var isWEBVTT;
3811
+ if (captionData) {
3812
+
3813
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
3814
+
3815
+ lazyProcess = function(i, len){
3816
+
3817
+ for(; i < len; i++){
3818
+ cue = captionData[i];
3819
+ if(regWevVTT.test(cue)){
3820
+ isWEBVTT = true;
3821
+ } else if(cue.replace(/\s*/ig,"").length){
3822
+ if(!isWEBVTT){
3823
+ webshims.error('please use WebVTT format. This is the standard');
3824
+ complete(null);
3825
+ break;
3826
+ }
3827
+ cue = mediaelement.parseCaptionChunk(cue, i);
3828
+ if(cue){
3829
+ track.addCue(cue);
3830
+ }
3831
+ }
3832
+ if(startDate < (new Date().getTime()) - 9){
3833
+ i++;
3834
+ setTimeout(function(){
3835
+ startDate = new Date().getTime();
3836
+ lazyProcess(i, len);
3837
+ }, 90);
3838
+
3839
+ break;
3840
+ }
3841
+ }
3842
+ if(i >= len){
3843
+ if(!isWEBVTT){
3844
+ webshims.error('please use WebVTT format. This is the standard');
3845
+ }
3846
+ complete(track.cues);
3847
+ }
3848
+ };
3849
+
3850
+ captionData = captionData.replace(/\r\n/g,"\n");
3851
+
3852
+ setTimeout(function(){
3853
+ captionData = captionData.replace(/\r/g,"\n");
3854
+ setTimeout(function(){
3855
+ startDate = new Date().getTime();
3856
+ captionData = captionData.split(/\n\n+/g);
3857
+ lazyProcess(0, captionData.length);
3858
+ }, 9);
3859
+ }, 9);
3860
+
3861
+ } else {
3862
+ webshims.error("Required parameter captionData not supplied.");
3863
+ }
3864
+ };
3865
+
3866
+
3867
+ mediaelement.createTrackList = function(mediaelem, baseData){
3868
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
3869
+ if(!baseData.textTracks){
3870
+ baseData.textTracks = [];
3871
+ webshims.defineProperties(baseData.textTracks, {
3872
+ onaddtrack: {value: null},
3873
+ onremovetrack: {value: null}
3874
+ });
3875
+ createEventTarget(baseData.textTracks);
3876
+ }
3877
+ return baseData.textTracks;
3878
+ };
3879
+
3880
+ if(!Modernizr.track){
3881
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
3882
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
3883
+
3884
+ webshims.defineNodeNameProperties('track', {
3885
+ src: {
3886
+ //attr: {},
3887
+ reflect: true,
3888
+ propType: 'src'
3889
+ }
3890
+ });
3891
+ }
3892
+
3893
+ webshims.defineNodeNameProperties('track', {
3894
+ kind: {
3895
+ attr: Modernizr.track ? {
3896
+ set: function(value){
3897
+ var trackData = webshims.data(this, 'trackData');
3898
+ this.setAttribute('data-kind', value);
3899
+ if(trackData){
3900
+ trackData.attrKind = value;
3901
+ }
3902
+ },
3903
+ get: function(){
3904
+ var trackData = webshims.data(this, 'trackData');
3905
+ if(trackData && ('attrKind' in trackData)){
3906
+ return trackData.attrKind;
3907
+ }
3908
+ return this.getAttribute('kind');
3909
+ }
3910
+ } : {},
3911
+ reflect: true,
3912
+ propType: 'enumarated',
3913
+ defaultValue: 'subtitles',
3914
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
3915
+ }
3916
+ });
3917
+
3918
+ webshims.onNodeNamesPropertyModify('track', 'kind', function(){
3919
+ var trackData = webshims.data(this, 'trackData');
3920
+ if(trackData){
3921
+ trackData.track.kind = $.prop(this, 'kind');
3922
+ refreshTrack(this, trackData);
3923
+ }
3924
+ });
3925
+
3926
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
3927
+ if(val){
3928
+ var data = webshims.data(this, 'trackData');
3929
+ var media;
3930
+ if(data){
3931
+ media = $(this).closest('video, audio');
3932
+ if(media[0]){
3933
+ mediaelement.loadTextTrack(media, this, data);
3934
+ }
3935
+ }
3936
+ }
3937
+
3938
+ });
3939
+
3940
+ //
3941
+
3942
+ webshims.defineNodeNamesProperties(['track'], {
3943
+ ERROR: {
3944
+ value: 3
3945
+ },
3946
+ LOADED: {
3947
+ value: 2
3948
+ },
3949
+ LOADING: {
3950
+ value: 1
3951
+ },
3952
+ NONE: {
3953
+ value: 0
3954
+ },
3955
+ readyState: {
3956
+ get: function(){
3957
+ return ($.prop(this, 'track') || {readyState: 0}).readyState;
3958
+ },
3959
+ writeable: false
3960
+ },
3961
+ track: {
3962
+ get: function(){
3963
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
3964
+ },
3965
+ writeable: false
3966
+ }
3967
+ }, 'prop');
3968
+
3969
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
3970
+ textTracks: {
3971
+ get: function(){
3972
+
3973
+ var media = this;
3974
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
3975
+ var tracks = mediaelement.createTrackList(media, baseData);
3976
+ if(!baseData.blockTrackListUpdate){
3977
+ updateMediaTrackList.call(media, baseData, tracks);
3978
+ }
3979
+ return tracks;
3980
+ },
3981
+ writeable: false
3982
+ },
3983
+ addTextTrack: {
3984
+ value: function(kind, label, lang){
3985
+ var textTrack = mediaelement.createTextTrack(this, {
3986
+ kind: kind || '',
3987
+ label: label || '',
3988
+ srclang: lang || ''
3989
+ });
3990
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
3991
+ if (!baseData.scriptedTextTracks) {
3992
+ baseData.scriptedTextTracks = [];
3993
+ }
3994
+ baseData.scriptedTextTracks.push(textTrack);
3995
+ updateMediaTrackList.call(this);
3996
+ return textTrack;
3997
+ }
3998
+ }
3999
+ }, 'prop');
4000
+
4001
+
4002
+ $(document).bind('emptied ended updatetracklist', function(e){
4003
+ if($(e.target).is('audio, video')){
4004
+ var baseData = webshims.data(e.target, 'mediaelementBase');
4005
+ if(baseData){
4006
+ clearTimeout(baseData.updateTrackListTimer);
4007
+ baseData.updateTrackListTimer = setTimeout(function(){
4008
+ updateMediaTrackList.call(e.target, baseData);
4009
+ }, 0);
4010
+ }
4011
+ }
4012
+ });
4013
+
4014
+ var getNativeReadyState = function(trackElem, textTrack){
4015
+ return textTrack.readyState || trackElem.readyState;
4016
+ };
4017
+
4018
+ webshims.addReady(function(context, insertedElement){
4019
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
4020
+ $('video, audio', context)
4021
+ .add(insertedMedia)
4022
+ .each(function(){
4023
+ updateMediaTrackList.call(this);
4024
+ })
4025
+ .each(function(){
4026
+ if(Modernizr.track){
4027
+ var shimedTextTracks = $.prop(this, 'textTracks');
4028
+ var origTextTracks = this.textTracks;
4029
+ if(shimedTextTracks.length != origTextTracks.length){
4030
+ webshims.error("textTracks couldn't be copied");
4031
+ }
4032
+
4033
+ $('track', this)
4034
+ .each(function(){
4035
+ var shimedTrack = $.prop(this, 'track');
4036
+ var origTrack = this.track;
4037
+ var kind;
4038
+ var readyState;
4039
+ if(origTrack){
4040
+ kind = $.prop(this, 'kind');
4041
+ readyState = getNativeReadyState(this, origTrack);
4042
+ if (origTrack.mode || readyState) {
4043
+ shimedTrack.mode = origTrack.mode;
4044
+ }
4045
+ //disable track from showing + remove UI
4046
+ if(kind != 'descriptions'){
4047
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
4048
+ this.kind = 'metadata';
4049
+ $(this).attr({kind: kind});
4050
+ }
4051
+
4052
+ }
4053
+ })
4054
+ .bind('load error', function(e){
4055
+ if(e.originalEvent){
4056
+ e.stopImmediatePropagation();
4057
+ }
4058
+ })
4059
+ ;
4060
+ }
4061
+ })
4062
+ ;
4063
+ insertedMedia.each(function(){
4064
+ var media = this;
4065
+ var baseData = webshims.data(media, 'mediaelementBase');
4066
+ if(baseData){
4067
+ clearTimeout(baseData.updateTrackListTimer);
4068
+ baseData.updateTrackListTimer = setTimeout(function(){
4069
+ updateMediaTrackList.call(media, baseData);
4070
+ }, 9);
4071
+ }
4072
+ });
4073
+ });
4074
+
4075
+ if(Modernizr.track){
4076
+ $('video, audio').trigger('trackapichange');
4077
+ }
4078
+
4079
+ });