webshims-rails 1.12.5 → 1.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +111 -132
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +40 -37
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +217 -36
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +151 -29
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +70 -93
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +70 -93
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +90 -13
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +202 -59
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +208 -70
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +151 -29
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +155 -30
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +79 -20
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +109 -47
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +79 -20
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +80 -87
  18. data/vendor/assets/javascripts/webshims/shims/combos/22.js +66 -83
  19. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -10
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +79 -20
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +66 -7
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +100 -25
  23. data/vendor/assets/javascripts/webshims/shims/combos/3.js +192 -47
  24. data/vendor/assets/javascripts/webshims/shims/combos/30.js +193 -49
  25. data/vendor/assets/javascripts/webshims/shims/combos/31.js +103 -36
  26. data/vendor/assets/javascripts/webshims/shims/combos/32.js +5 -3
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +1 -2
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2048 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +156 -20
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +151 -29
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +152 -31
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +199 -60
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +197 -58
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +218 -38
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +1004 -0
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +1283 -0
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +204 -1248
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +66 -7
  39. data/vendor/assets/javascripts/webshims/shims/es5.js +4 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-combat.js +3 -3
  41. data/vendor/assets/javascripts/webshims/shims/form-core.js +36 -27
  42. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +1 -2
  43. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +137 -0
  44. data/vendor/assets/javascripts/webshims/shims/form-message.js +90 -13
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +129 -15
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +9 -10
  47. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +886 -985
  48. data/vendor/assets/javascripts/webshims/shims/form-validation.js +78 -174
  49. data/vendor/assets/javascripts/webshims/shims/form-validators.js +39 -26
  50. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +45 -17
  51. data/vendor/assets/javascripts/webshims/shims/geolocation.js +10 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/b.js +71 -246
  53. data/vendor/assets/javascripts/webshims/shims/jme/c.js +133 -1002
  54. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +62 -23
  55. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +73 -10
  56. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +1117 -0
  57. data/vendor/assets/javascripts/webshims/shims/jme/p.js +603 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +5 -2
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -10
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -1
  61. data/vendor/assets/javascripts/webshims/shims/range-ui.js +22 -14
  62. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +29 -344
  63. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +362 -0
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +6 -483
  65. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +488 -0
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +2 -0
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +10 -2
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +6 -2
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +8 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +66 -83
  72. metadata +12 -5
  73. data/vendor/assets/javascripts/webshims/shims/$ajax.js +0 -862
  74. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2087
@@ -2,7 +2,9 @@
2
2
  // vim: ts=4 sts=4 sw=4 expandtab
3
3
 
4
4
  (function () {
5
-
5
+ setTimeout(function(){
6
+ webshims.isReady('es5', true);
7
+ });
6
8
  /**
7
9
  * Brings an environment as close to ECMAScript 5 compliance
8
10
  * as is possible with the facilities of erstwhile engines.
@@ -1441,6 +1443,7 @@ if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !
1441
1443
  };
1442
1444
 
1443
1445
  }
1446
+ webshims.isReady('es5', true);
1444
1447
  })(webshims.$, webshims);
1445
1448
 
1446
1449
 
@@ -2051,7 +2054,6 @@ if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !
2051
2054
 
2052
2055
  });;webshims.register('form-datalist', function($, webshims, window, document, undefined, options){
2053
2056
  "use strict";
2054
- var doc = document;
2055
2057
  var lazyLoad = function(name){
2056
2058
  if(!name || typeof name != 'string'){
2057
2059
  name = 'DOM';
@@ -2346,4 +2348,4 @@ if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !
2346
2348
  initializeDatalist();
2347
2349
  })();
2348
2350
 
2349
- });
2351
+ });
@@ -605,7 +605,6 @@ webshims.register('form-number-date-api', function($, webshims, window, document
605
605
 
606
606
  });;webshims.register('form-datalist', function($, webshims, window, document, undefined, options){
607
607
  "use strict";
608
- var doc = document;
609
608
  var lazyLoad = function(name){
610
609
  if(!name || typeof name != 'string'){
611
610
  name = 'DOM';
@@ -900,4 +899,4 @@ webshims.register('form-number-date-api', function($, webshims, window, document
900
899
  initializeDatalist();
901
900
  })();
902
901
 
903
- });
902
+ });
@@ -0,0 +1,2048 @@
1
+
2
+ //this might was already extended by ES5 shim feature
3
+ (function($){
4
+ "use strict";
5
+ var webshims = window.webshims;
6
+ if(webshims.defineProperties){return;}
7
+ var defineProperty = 'defineProperty';
8
+ var has = Object.prototype.hasOwnProperty;
9
+ var descProps = ['configurable', 'enumerable', 'writable'];
10
+ var extendUndefined = function(prop){
11
+ for(var i = 0; i < 3; i++){
12
+ if(prop[descProps[i]] === undefined && (descProps[i] !== 'writable' || prop.value !== undefined)){
13
+ prop[descProps[i]] = true;
14
+ }
15
+ }
16
+ };
17
+
18
+ var extendProps = function(props){
19
+ if(props){
20
+ for(var i in props){
21
+ if(has.call(props, i)){
22
+ extendUndefined(props[i]);
23
+ }
24
+ }
25
+ }
26
+ };
27
+
28
+ if(Object.create){
29
+ webshims.objectCreate = function(proto, props, opts){
30
+ extendProps(props);
31
+ var o = Object.create(proto, props);
32
+ if(opts){
33
+ o.options = $.extend(true, {}, o.options || {}, opts);
34
+ opts = o.options;
35
+ }
36
+ if(o._create && $.isFunction(o._create)){
37
+ o._create(opts);
38
+ }
39
+ return o;
40
+ };
41
+ }
42
+
43
+ if(Object[defineProperty]){
44
+ webshims[defineProperty] = function(obj, prop, desc){
45
+ extendUndefined(desc);
46
+ return Object[defineProperty](obj, prop, desc);
47
+ };
48
+ }
49
+ if(Object.defineProperties){
50
+ webshims.defineProperties = function(obj, props){
51
+ extendProps(props);
52
+ return Object.defineProperties(obj, props);
53
+ };
54
+ }
55
+ webshims.getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
56
+
57
+ webshims.getPrototypeOf = Object.getPrototypeOf;
58
+ })(window.webshims.$);
59
+ //DOM-Extension helper
60
+ webshims.register('dom-extend', function($, webshims, window, document, undefined){
61
+ "use strict";
62
+ var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
63
+ var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
64
+ var has = Object.prototype.hasOwnProperty;
65
+ webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
66
+
67
+ if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
68
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
69
+ }
70
+
71
+ if('debug' in webshims){
72
+ webshims.error('Use webshims.setOptions("debug", true||false||"noCombo"); to debug flag');
73
+ }
74
+
75
+ if (!webshims.cfg.no$Switch) {
76
+ var switch$ = function(){
77
+ if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
78
+ webshims.error("jQuery was included more than once. Make sure to include it only once or try the $.noConflict(extreme) feature! Webshims and other Plugins might not work properly. Or set webshims.cfg.no$Switch to 'true'.");
79
+ if (window.$) {
80
+ window.$ = webshims.$;
81
+ }
82
+ window.jQuery = webshims.$;
83
+ }
84
+ if(webshims.M != Modernizr){
85
+ webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
86
+ for(var i in Modernizr){
87
+ if(!(i in webshims.M)){
88
+ webshims.M[i] = Modernizr[i];
89
+ }
90
+ }
91
+ Modernizr = webshims.M;
92
+ }
93
+ };
94
+ switch$();
95
+ setTimeout(switch$, 90);
96
+ webshims.ready('DOM', switch$);
97
+ $(switch$);
98
+ webshims.ready('WINDOWLOAD', switch$);
99
+
100
+ }
101
+
102
+ //shortcus
103
+ var modules = webshims.modules;
104
+ var listReg = /\s*,\s*/;
105
+
106
+ //proxying attribute
107
+ var olds = {};
108
+ var havePolyfill = {};
109
+ var hasPolyfillMethod = {};
110
+ var extendedProps = {};
111
+ var extendQ = {};
112
+ var modifyProps = {};
113
+
114
+ var oldVal = $.fn.val;
115
+ var singleVal = function(elem, name, val, pass, _argless){
116
+ return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
117
+ };
118
+
119
+ //jquery mobile and jquery ui
120
+ if(!$.widget){
121
+ (function(){
122
+ var _cleanData = $.cleanData;
123
+ $.cleanData = function( elems ) {
124
+ if(!$.widget){
125
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
126
+ try {
127
+ $( elem ).triggerHandler( "remove" );
128
+ // http://bugs.jquery.com/ticket/8235
129
+ } catch( e ) {}
130
+ }
131
+ }
132
+ _cleanData( elems );
133
+ };
134
+ })();
135
+ }
136
+
137
+
138
+ $.fn.val = function(val){
139
+ var elem = this[0];
140
+ if(arguments.length && val == null){
141
+ val = '';
142
+ }
143
+ if(!arguments.length){
144
+ if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
145
+ return $.prop(elem, 'value', val, 'val', true);
146
+ }
147
+ if($.isArray(val)){
148
+ return oldVal.apply(this, arguments);
149
+ }
150
+ var isFunction = $.isFunction(val);
151
+ return this.each(function(i){
152
+ elem = this;
153
+ if(elem.nodeType === 1){
154
+ if(isFunction){
155
+ var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
156
+ if(genVal == null){
157
+ genVal = '';
158
+ }
159
+ $.prop(elem, 'value', genVal, 'val') ;
160
+ } else {
161
+ $.prop(elem, 'value', val, 'val');
162
+ }
163
+ }
164
+ });
165
+ };
166
+ $.fn.onTrigger = function(evt, fn){
167
+ return this.on(evt, fn).each(fn);
168
+ };
169
+
170
+ $.fn.onWSOff = function(evt, fn, trigger, evtDel){
171
+ if(!evtDel){
172
+ evtDel = document;
173
+ }
174
+ $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
175
+ this.on('remove', function(e){
176
+ if(!e.originalEvent){
177
+ $(evtDel).off(evt, fn);
178
+ }
179
+ });
180
+ return this;
181
+ };
182
+
183
+ var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
184
+ var elementData = function(elem, key, val){
185
+ elem = elem.jquery ? elem[0] : elem;
186
+ if(!elem){return val || {};}
187
+ var data = $.data(elem, dataID);
188
+ if(val !== undefined){
189
+ if(!data){
190
+ data = $.data(elem, dataID, {});
191
+ }
192
+ if(key){
193
+ data[key] = val;
194
+ }
195
+ }
196
+
197
+ return key ? data && data[key] : data;
198
+ };
199
+
200
+
201
+ [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
202
+ $.fn[data.name] = function(){
203
+ var elems = [];
204
+ this.each(function(){
205
+ var shadowData = elementData(this, 'shadowData');
206
+ var elem = shadowData && shadowData[data.prop] || this;
207
+ if($.inArray(elem, elems) == -1){
208
+ elems.push(elem);
209
+ }
210
+ });
211
+ return this.pushStack(elems);
212
+ };
213
+ });
214
+
215
+ //add support for $('video').trigger('play') in case extendNative is set to false
216
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
217
+ (function(oldTrigger){
218
+ $.event.trigger = function(event, data, elem, onlyHandlers){
219
+
220
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
221
+ return oldTrigger.apply(this, arguments);
222
+ }
223
+ var ret, isOrig, origName;
224
+ var origFn = elem[event];
225
+ var polyfilledFn = $.prop(elem, event);
226
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
227
+ if(changeFn){
228
+ origName = '__ws'+event;
229
+ isOrig = (event in elem) && has.call(elem, event);
230
+ elem[event] = polyfilledFn;
231
+ elem[origName] = origFn;
232
+ }
233
+
234
+ ret = oldTrigger.apply(this, arguments);
235
+ if (changeFn) {
236
+ if(isOrig){
237
+ elem[event] = origFn;
238
+ } else {
239
+ delete elem[event];
240
+ }
241
+ delete elem[origName];
242
+ }
243
+
244
+ return ret;
245
+ };
246
+ })($.event.trigger);
247
+ }
248
+
249
+ ['removeAttr', 'prop', 'attr'].forEach(function(type){
250
+ olds[type] = $[type];
251
+ $[type] = function(elem, name, value, pass, _argless){
252
+ var isVal = (pass == 'val');
253
+ var oldMethod = !isVal ? olds[type] : singleVal;
254
+ if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
255
+ return oldMethod(elem, name, value, pass, _argless);
256
+ }
257
+
258
+ var nodeName = (elem.nodeName || '').toLowerCase();
259
+ var desc = extendedProps[nodeName];
260
+ var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
261
+ var propMethod;
262
+ var oldValMethod;
263
+ var ret;
264
+
265
+
266
+ if(!desc){
267
+ desc = extendedProps['*'];
268
+ }
269
+ if(desc){
270
+ desc = desc[name];
271
+ }
272
+
273
+ if(desc){
274
+ propMethod = desc[curType];
275
+ }
276
+
277
+ if(propMethod){
278
+ if(name == 'value'){
279
+ oldValMethod = propMethod.isVal;
280
+ propMethod.isVal = isVal;
281
+ }
282
+ if(curType === 'removeAttr'){
283
+ return propMethod.value.call(elem);
284
+ } else if(value === undefined){
285
+ return (propMethod.get) ?
286
+ propMethod.get.call(elem) :
287
+ propMethod.value
288
+ ;
289
+ } else if(propMethod.set) {
290
+ if(type == 'attr' && value === true){
291
+ value = name;
292
+ }
293
+
294
+ ret = propMethod.set.call(elem, value);
295
+ }
296
+ if(name == 'value'){
297
+ propMethod.isVal = oldValMethod;
298
+ }
299
+ } else {
300
+ ret = oldMethod(elem, name, value, pass, _argless);
301
+ }
302
+ if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
303
+
304
+ var boolValue;
305
+ if(curType == 'removeAttr'){
306
+ boolValue = false;
307
+ } else if(curType == 'prop'){
308
+ boolValue = !!(value);
309
+ } else {
310
+ boolValue = true;
311
+ }
312
+
313
+ modifyProps[nodeName][name].forEach(function(fn){
314
+ if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
315
+ fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
316
+ }
317
+ });
318
+ }
319
+ return ret;
320
+ };
321
+
322
+ extendQ[type] = function(nodeName, prop, desc){
323
+
324
+ if(!extendedProps[nodeName]){
325
+ extendedProps[nodeName] = {};
326
+ }
327
+ if(!extendedProps[nodeName][prop]){
328
+ extendedProps[nodeName][prop] = {};
329
+ }
330
+ var oldDesc = extendedProps[nodeName][prop][type];
331
+ var getSup = function(propType, descriptor, oDesc){
332
+ var origProp;
333
+ if(descriptor && descriptor[propType]){
334
+ return descriptor[propType];
335
+ }
336
+ if(oDesc && oDesc[propType]){
337
+ return oDesc[propType];
338
+ }
339
+ if(type == 'prop' && prop == 'value'){
340
+ return function(value){
341
+ var elem = this;
342
+ return (desc.isVal) ?
343
+ singleVal(elem, prop, value, false, (arguments.length === 0)) :
344
+ olds[type](elem, prop, value)
345
+ ;
346
+ };
347
+ }
348
+ if(type == 'prop' && propType == 'value' && desc.value.apply){
349
+ origProp = '__ws'+prop;
350
+ hasPolyfillMethod[prop] = true;
351
+ return function(value){
352
+ var sup = this[origProp] || olds[type](this, prop);
353
+ if(sup && sup.apply){
354
+ sup = sup.apply(this, arguments);
355
+ }
356
+ return sup;
357
+ };
358
+ }
359
+ return function(value){
360
+ return olds[type](this, prop, value);
361
+ };
362
+ };
363
+ extendedProps[nodeName][prop][type] = desc;
364
+ if(desc.value === undefined){
365
+ if(!desc.set){
366
+ desc.set = desc.writeable ?
367
+ getSup('set', desc, oldDesc) :
368
+ (webshims.cfg.useStrict && prop == 'prop') ?
369
+ function(){throw(prop +' is readonly on '+ nodeName);} :
370
+ function(){webshims.info(prop +' is readonly on '+ nodeName);}
371
+ ;
372
+ }
373
+ if(!desc.get){
374
+ desc.get = getSup('get', desc, oldDesc);
375
+ }
376
+
377
+ }
378
+
379
+ ['value', 'get', 'set'].forEach(function(descProp){
380
+ if(desc[descProp]){
381
+ desc['_sup'+descProp] = getSup(descProp, oldDesc);
382
+ }
383
+ });
384
+ };
385
+
386
+ });
387
+
388
+ var extendNativeValue = (function(){
389
+ var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
390
+
391
+ //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
392
+ var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
393
+ return function(nodeName, prop, desc){
394
+ var elem , elemProto;
395
+ if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
396
+ var sup = elem[prop];
397
+ desc._supvalue = function(){
398
+ if(sup && sup.apply){
399
+ return sup.apply(this, arguments);
400
+ }
401
+ return sup;
402
+ };
403
+ elemProto[prop] = desc.value;
404
+ } else {
405
+ desc._supvalue = function(){
406
+ var data = elementData(this, 'propValue');
407
+ if(data && data[prop] && data[prop].apply){
408
+ return data[prop].apply(this, arguments);
409
+ }
410
+ return data && data[prop];
411
+ };
412
+ initProp.extendValue(nodeName, prop, desc.value);
413
+ }
414
+ desc.value._supvalue = desc._supvalue;
415
+ };
416
+ })();
417
+
418
+ var initProp = (function(){
419
+
420
+ var initProps = {};
421
+
422
+ webshims.addReady(function(context, contextElem){
423
+ var nodeNameCache = {};
424
+ var getElementsByName = function(name){
425
+ if(!nodeNameCache[name]){
426
+ nodeNameCache[name] = $(context.getElementsByTagName(name));
427
+ if(contextElem[0] && $.nodeName(contextElem[0], name)){
428
+ nodeNameCache[name] = nodeNameCache[name].add(contextElem);
429
+ }
430
+ }
431
+ };
432
+
433
+
434
+ $.each(initProps, function(name, fns){
435
+ getElementsByName(name);
436
+ if(!fns || !fns.forEach){
437
+ webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
438
+ return;
439
+ }
440
+ fns.forEach(function(fn){
441
+ nodeNameCache[name].each(fn);
442
+ });
443
+ });
444
+ nodeNameCache = null;
445
+ });
446
+
447
+ var tempCache;
448
+ var emptyQ = $([]);
449
+ var createNodeNameInit = function(nodeName, fn){
450
+ if(!initProps[nodeName]){
451
+ initProps[nodeName] = [fn];
452
+ } else {
453
+ initProps[nodeName].push(fn);
454
+ }
455
+ if($.isDOMReady){
456
+ (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
457
+ }
458
+ };
459
+
460
+ var elementExtends = {};
461
+ return {
462
+ createTmpCache: function(nodeName){
463
+ if($.isDOMReady){
464
+ tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
465
+ }
466
+ return tempCache || emptyQ;
467
+ },
468
+ flushTmpCache: function(){
469
+ tempCache = null;
470
+ },
471
+ content: function(nodeName, prop){
472
+ createNodeNameInit(nodeName, function(){
473
+ var val = $.attr(this, prop);
474
+ if(val != null){
475
+ $.attr(this, prop, val);
476
+ }
477
+ });
478
+ },
479
+ createElement: function(nodeName, fn){
480
+ createNodeNameInit(nodeName, fn);
481
+ },
482
+ extendValue: function(nodeName, prop, value){
483
+ createNodeNameInit(nodeName, function(){
484
+ $(this).each(function(){
485
+ var data = elementData(this, 'propValue', {});
486
+ data[prop] = this[prop];
487
+ this[prop] = value;
488
+ });
489
+ });
490
+ }
491
+ };
492
+ })();
493
+
494
+ var createPropDefault = function(descs, removeType){
495
+ if(descs.defaultValue === undefined){
496
+ descs.defaultValue = '';
497
+ }
498
+ if(!descs.removeAttr){
499
+ descs.removeAttr = {
500
+ value: function(){
501
+ descs[removeType || 'prop'].set.call(this, descs.defaultValue);
502
+ descs.removeAttr._supvalue.call(this);
503
+ }
504
+ };
505
+ }
506
+ if(!descs.attr){
507
+ descs.attr = {};
508
+ }
509
+ };
510
+
511
+ $.extend(webshims, {
512
+ getID: (function(){
513
+ var ID = new Date().getTime();
514
+ return function(elem){
515
+ elem = $(elem);
516
+ var id = elem.prop('id');
517
+ if(!id){
518
+ ID++;
519
+ id = 'ID-'+ ID;
520
+ elem.eq(0).prop('id', id);
521
+ }
522
+ return id;
523
+ };
524
+ })(),
525
+ implement: function(elem, type){
526
+ var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
527
+ if(data[type]){
528
+ webshims.warn(type +' already implemented for element #'+elem.id);
529
+ return false;
530
+ }
531
+ data[type] = true;
532
+ return true;
533
+ },
534
+ extendUNDEFProp: function(obj, props){
535
+ $.each(props, function(name, prop){
536
+ if( !(name in obj) ){
537
+ obj[name] = prop;
538
+ }
539
+ });
540
+ },
541
+ getOptions: (function(){
542
+ var normalName = /\-([a-z])/g;
543
+ var regs = {};
544
+ var nameRegs = {};
545
+ var regFn = function(f, upper){
546
+ return upper.toLowerCase();
547
+ };
548
+ var nameFn = function(f, dashed){
549
+ return dashed.toUpperCase();
550
+ };
551
+ return function(elem, name, bases, stringAllowed){
552
+ if(nameRegs[name]){
553
+ name = nameRegs[name];
554
+ } else {
555
+ nameRegs[name] = name.replace(normalName, nameFn);
556
+ name = nameRegs[name];
557
+ }
558
+ var data = elementData(elem, 'cfg'+name);
559
+ var dataName;
560
+ var cfg = {};
561
+
562
+ if(data){
563
+ return data;
564
+ }
565
+ data = $(elem).data();
566
+ if(data && typeof data[name] == 'string'){
567
+ if(stringAllowed){
568
+ return elementData(elem, 'cfg'+name, data[name]);
569
+ }
570
+ webshims.error('data-'+ name +' attribute has to be a valid JSON, was: '+ data[name]);
571
+ }
572
+ if(!bases){
573
+ bases = [true, {}];
574
+ } else if(!Array.isArray(bases)){
575
+ bases = [true, {}, bases];
576
+ } else {
577
+ bases.unshift(true, {});
578
+ }
579
+
580
+ if(data && typeof data[name] == 'object'){
581
+ bases.push(data[name]);
582
+ }
583
+
584
+ if(!regs[name]){
585
+ regs[name] = new RegExp('^'+ name +'([A-Z])');
586
+ }
587
+
588
+ for(dataName in data){
589
+ if(regs[name].test(dataName)){
590
+ cfg[dataName.replace(regs[name], regFn)] = data[dataName];
591
+ }
592
+ }
593
+ bases.push(cfg);
594
+ return elementData(elem, 'cfg'+name, $.extend.apply($, bases));
595
+ };
596
+ })(),
597
+ //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
598
+ createPropDefault: createPropDefault,
599
+ data: elementData,
600
+ moveToFirstEvent: function(elem, eventType, bindType){
601
+ var events = ($._data(elem, 'events') || {})[eventType];
602
+ var fn;
603
+
604
+ if(events && events.length > 1){
605
+ fn = events.pop();
606
+ if(!bindType){
607
+ bindType = 'bind';
608
+ }
609
+ if(bindType == 'bind' && events.delegateCount){
610
+ events.splice( events.delegateCount, 0, fn);
611
+ } else {
612
+ events.unshift( fn );
613
+ }
614
+
615
+
616
+ }
617
+ elem = null;
618
+ },
619
+ addShadowDom: (function(){
620
+ var resizeTimer;
621
+ var lastHeight;
622
+ var lastWidth;
623
+ var $window = $(window);
624
+ var docObserve = {
625
+ init: false,
626
+ runs: 0,
627
+ test: function(){
628
+ var height = docObserve.getHeight();
629
+ var width = docObserve.getWidth();
630
+
631
+ if(height != docObserve.height || width != docObserve.width){
632
+ docObserve.height = height;
633
+ docObserve.width = width;
634
+ docObserve.handler({type: 'docresize'});
635
+ docObserve.runs++;
636
+ if(docObserve.runs < 9){
637
+ setTimeout(docObserve.test, 90);
638
+ }
639
+ } else {
640
+ docObserve.runs = 0;
641
+ }
642
+ },
643
+ handler: (function(){
644
+ var trigger = function(){
645
+ $(document).triggerHandler('updateshadowdom');
646
+ };
647
+ return function(e){
648
+ clearTimeout(resizeTimer);
649
+ resizeTimer = setTimeout(function(){
650
+ if(e.type == 'resize'){
651
+ var width = $window.width();
652
+ var height = $window.width();
653
+
654
+ if(height == lastHeight && width == lastWidth){
655
+ return;
656
+ }
657
+ lastHeight = height;
658
+ lastWidth = width;
659
+
660
+ docObserve.height = docObserve.getHeight();
661
+ docObserve.width = docObserve.getWidth();
662
+ }
663
+
664
+ if(window.requestAnimationFrame){
665
+ requestAnimationFrame(trigger);
666
+ } else {
667
+ setTimeout(trigger, 0);
668
+ }
669
+
670
+ }, (e.type == 'resize' && !window.requestAnimationFrame) ? 50 : 9);
671
+ };
672
+ })(),
673
+ _create: function(){
674
+ $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
675
+ var body = document.body;
676
+ var doc = document.documentElement;
677
+ docObserve[type] = function (){
678
+ return Math.max(
679
+ body[ "scroll" + name ], doc[ "scroll" + name ],
680
+ body[ "offset" + name ], doc[ "offset" + name ],
681
+ doc[ "client" + name ]
682
+ );
683
+ };
684
+ });
685
+ },
686
+ start: function(){
687
+ if(!this.init && document.body){
688
+ this.init = true;
689
+ this._create();
690
+ this.height = docObserve.getHeight();
691
+ this.width = docObserve.getWidth();
692
+ setInterval(this.test, 999);
693
+ $(this.test);
694
+ if($.support.boxSizing == null){
695
+ $(function(){
696
+ if($.support.boxSizing){
697
+ docObserve.handler({type: 'boxsizing'});
698
+ }
699
+ });
700
+ }
701
+ webshims.ready('WINDOWLOAD', this.test);
702
+ $(document).on('updatelayout.webshim pageinit popupafteropen panelbeforeopen tabsactivate collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel', this.handler);
703
+ $(window).on('resize', this.handler);
704
+ }
705
+ }
706
+ };
707
+
708
+
709
+ webshims.docObserve = function(){
710
+ webshims.ready('DOM', function(){
711
+ docObserve.start();
712
+
713
+ });
714
+ };
715
+ return function(nativeElem, shadowElem, opts){
716
+ if(nativeElem && shadowElem){
717
+ opts = opts || {};
718
+ if(nativeElem.jquery){
719
+ nativeElem = nativeElem[0];
720
+ }
721
+ if(shadowElem.jquery){
722
+ shadowElem = shadowElem[0];
723
+ }
724
+ var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
725
+ var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
726
+ var shadowFocusElementData = {};
727
+ if(!opts.shadowFocusElement){
728
+ opts.shadowFocusElement = shadowElem;
729
+ } else if(opts.shadowFocusElement){
730
+ if(opts.shadowFocusElement.jquery){
731
+ opts.shadowFocusElement = opts.shadowFocusElement[0];
732
+ }
733
+ shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
734
+ }
735
+
736
+ $(nativeElem).on('remove', function(e){
737
+ if (!e.originalEvent) {
738
+ setTimeout(function(){
739
+ $(shadowElem).remove();
740
+ }, 4);
741
+ }
742
+ });
743
+
744
+ nativeData.hasShadow = shadowElem;
745
+ shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
746
+ shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
747
+ nativeElement: nativeElem,
748
+ shadowElement: shadowElem,
749
+ shadowFocusElement: opts.shadowFocusElement
750
+ };
751
+ if(opts.shadowChilds){
752
+ opts.shadowChilds.each(function(){
753
+ elementData(this, 'shadowData', shadowData.shadowData);
754
+ });
755
+ }
756
+
757
+ if(opts.data){
758
+ shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
759
+ }
760
+ opts = null;
761
+ }
762
+ webshims.docObserve();
763
+ };
764
+ })(),
765
+ propTypes: {
766
+ standard: function(descs, name){
767
+ createPropDefault(descs);
768
+ if(descs.prop){return;}
769
+ descs.prop = {
770
+ set: function(val){
771
+ descs.attr.set.call(this, ''+val);
772
+ },
773
+ get: function(){
774
+ return descs.attr.get.call(this) || descs.defaultValue;
775
+ }
776
+ };
777
+
778
+ },
779
+ "boolean": function(descs, name){
780
+
781
+ createPropDefault(descs);
782
+ if(descs.prop){return;}
783
+ descs.prop = {
784
+ set: function(val){
785
+ if(val){
786
+ descs.attr.set.call(this, "");
787
+ } else {
788
+ descs.removeAttr.value.call(this);
789
+ }
790
+ },
791
+ get: function(){
792
+ return descs.attr.get.call(this) != null;
793
+ }
794
+ };
795
+ },
796
+ "src": (function(){
797
+ var anchor = document.createElement('a');
798
+ anchor.style.display = "none";
799
+ return function(descs, name){
800
+
801
+ createPropDefault(descs);
802
+ if(descs.prop){return;}
803
+ descs.prop = {
804
+ set: function(val){
805
+ descs.attr.set.call(this, val);
806
+ },
807
+ get: function(){
808
+ var href = this.getAttribute(name);
809
+ var ret;
810
+ if(href == null){return '';}
811
+
812
+ anchor.setAttribute('href', href+'' );
813
+
814
+ if(!supportHrefNormalized){
815
+ try {
816
+ $(anchor).insertAfter(this);
817
+ ret = anchor.getAttribute('href', 4);
818
+ } catch(er){
819
+ ret = anchor.getAttribute('href', 4);
820
+ }
821
+ $(anchor).detach();
822
+ }
823
+ return ret || anchor.href;
824
+ }
825
+ };
826
+ };
827
+ })(),
828
+ enumarated: function(descs, name){
829
+
830
+ createPropDefault(descs);
831
+ if(descs.prop){return;}
832
+ descs.prop = {
833
+ set: function(val){
834
+ descs.attr.set.call(this, val);
835
+ },
836
+ get: function(){
837
+ var val = (descs.attr.get.call(this) || '').toLowerCase();
838
+ if(!val || descs.limitedTo.indexOf(val) == -1){
839
+ val = descs.defaultValue;
840
+ }
841
+ return val;
842
+ }
843
+ };
844
+ }
845
+
846
+ // ,unsignedLong: $.noop
847
+ // ,"doubble": $.noop
848
+ // ,"long": $.noop
849
+ // ,tokenlist: $.noop
850
+ // ,settableTokenlist: $.noop
851
+ },
852
+ reflectProperties: function(nodeNames, props){
853
+ if(typeof props == 'string'){
854
+ props = props.split(listReg);
855
+ }
856
+ props.forEach(function(prop){
857
+ webshims.defineNodeNamesProperty(nodeNames, prop, {
858
+ prop: {
859
+ set: function(val){
860
+ $.attr(this, prop, val);
861
+ },
862
+ get: function(){
863
+ return $.attr(this, prop) || '';
864
+ }
865
+ }
866
+ });
867
+ });
868
+ },
869
+ defineNodeNameProperty: function(nodeName, prop, descs){
870
+ havePolyfill[prop] = true;
871
+
872
+ if(descs.reflect){
873
+ if(descs.propType && !webshims.propTypes[descs.propType]){
874
+ webshims.error('could not finde propType '+ descs.propType);
875
+ } else {
876
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
877
+ }
878
+
879
+ }
880
+
881
+ ['prop', 'attr', 'removeAttr'].forEach(function(type){
882
+ var desc = descs[type];
883
+ if(desc){
884
+ if(type === 'prop'){
885
+ desc = $.extend({writeable: true}, desc);
886
+ } else {
887
+ desc = $.extend({}, desc, {writeable: true});
888
+ }
889
+
890
+ extendQ[type](nodeName, prop, desc);
891
+ if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
892
+ extendNativeValue(nodeName, prop, desc);
893
+ }
894
+ descs[type] = desc;
895
+ }
896
+ });
897
+ if(descs.initAttr){
898
+ initProp.content(nodeName, prop);
899
+ }
900
+ return descs;
901
+ },
902
+
903
+ defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
904
+ var olddesc;
905
+ for(var prop in descs){
906
+ if(!_noTmpCache && descs[prop].initAttr){
907
+ initProp.createTmpCache(name);
908
+ }
909
+ if(propType){
910
+ if(descs[prop][propType]){
911
+ //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
912
+ } else {
913
+ descs[prop][propType] = {};
914
+ ['value', 'set', 'get'].forEach(function(copyProp){
915
+ if(copyProp in descs[prop]){
916
+ descs[prop][propType][copyProp] = descs[prop][copyProp];
917
+ delete descs[prop][copyProp];
918
+ }
919
+ });
920
+ }
921
+ }
922
+ descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
923
+ }
924
+ if(!_noTmpCache){
925
+ initProp.flushTmpCache();
926
+ }
927
+ return descs;
928
+ },
929
+
930
+ createElement: function(nodeName, create, descs){
931
+ var ret;
932
+ if($.isFunction(create)){
933
+ create = {
934
+ after: create
935
+ };
936
+ }
937
+ initProp.createTmpCache(nodeName);
938
+ if(create.before){
939
+ initProp.createElement(nodeName, create.before);
940
+ }
941
+ if(descs){
942
+ ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
943
+ }
944
+ if(create.after){
945
+ initProp.createElement(nodeName, create.after);
946
+ }
947
+ initProp.flushTmpCache();
948
+ return ret;
949
+ },
950
+ onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
951
+ if(typeof nodeNames == 'string'){
952
+ nodeNames = nodeNames.split(listReg);
953
+ }
954
+ if($.isFunction(desc)){
955
+ desc = {set: desc};
956
+ }
957
+
958
+ nodeNames.forEach(function(name){
959
+ if(!modifyProps[name]){
960
+ modifyProps[name] = {};
961
+ }
962
+ if(typeof props == 'string'){
963
+ props = props.split(listReg);
964
+ }
965
+ if(desc.initAttr){
966
+ initProp.createTmpCache(name);
967
+ }
968
+ props.forEach(function(prop){
969
+ if(!modifyProps[name][prop]){
970
+ modifyProps[name][prop] = [];
971
+ havePolyfill[prop] = true;
972
+ }
973
+ if(desc.set){
974
+ if(only){
975
+ desc.set.only = only;
976
+ }
977
+ modifyProps[name][prop].push(desc.set);
978
+ }
979
+
980
+ if(desc.initAttr){
981
+ initProp.content(name, prop);
982
+ }
983
+ });
984
+ initProp.flushTmpCache();
985
+
986
+ });
987
+ },
988
+ defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
989
+ if(!descs){
990
+ descs = {};
991
+ }
992
+ if($.isFunction(descs)){
993
+ descs.set = descs;
994
+ }
995
+ webshims.defineNodeNamesProperty(elementNames, prop, {
996
+ attr: {
997
+ set: function(val){
998
+ if(descs.useContentAttribute){
999
+ webshims.contentAttr(this, prop, val);
1000
+ } else {
1001
+ this.setAttribute(prop, val);
1002
+ }
1003
+ if(descs.set){
1004
+ descs.set.call(this, true);
1005
+ }
1006
+ },
1007
+ get: function(){
1008
+ var ret = (descs.useContentAttribute) ? webshims.contentAttr(this, prop) : this.getAttribute(prop);
1009
+ return (ret == null) ? undefined : prop;
1010
+ }
1011
+ },
1012
+ removeAttr: {
1013
+ value: function(){
1014
+ this.removeAttribute(prop);
1015
+ if(descs.set){
1016
+ descs.set.call(this, false);
1017
+ }
1018
+ }
1019
+ },
1020
+ reflect: true,
1021
+ propType: 'boolean',
1022
+ initAttr: descs.initAttr || false
1023
+ });
1024
+ },
1025
+ contentAttr: function(elem, name, val){
1026
+ if(!elem.nodeName){return;}
1027
+ var attr;
1028
+ if(val === undefined){
1029
+ attr = (elem.attributes[name] || {});
1030
+ val = attr.specified ? attr.value : null;
1031
+ return (val == null) ? undefined : val;
1032
+ }
1033
+
1034
+ if(typeof val == 'boolean'){
1035
+ if(!val){
1036
+ elem.removeAttribute(name);
1037
+ } else {
1038
+ elem.setAttribute(name, name);
1039
+ }
1040
+ } else {
1041
+ elem.setAttribute(name, val);
1042
+ }
1043
+ },
1044
+
1045
+ activeLang: (function(){
1046
+ var curLang = [];
1047
+ var langDatas = [];
1048
+ var loading = {};
1049
+ var load = function(src, obj, loadingLang){
1050
+ obj._isLoading = true;
1051
+ if(loading[src]){
1052
+ loading[src].push(obj);
1053
+ } else {
1054
+ loading[src] = [obj];
1055
+ webshims.loader.loadScript(src, function(){
1056
+ if(loadingLang == curLang.join()){
1057
+ $.each(loading[src], function(i, obj){
1058
+ select(obj);
1059
+ });
1060
+ }
1061
+ delete loading[src];
1062
+ });
1063
+ }
1064
+ };
1065
+
1066
+ var select = function(obj){
1067
+ var oldLang = obj.__active;
1068
+ var selectLang = function(i, lang){
1069
+ obj._isLoading = false;
1070
+ if(obj[lang] || obj.availableLangs.indexOf(lang) != -1){
1071
+ if(obj[lang]){
1072
+ obj.__active = obj[lang];
1073
+ obj.__activeName = lang;
1074
+ } else {
1075
+ load(obj.langSrc+lang, obj, curLang.join());
1076
+ }
1077
+ return false;
1078
+ }
1079
+ };
1080
+ $.each(curLang, selectLang);
1081
+ if(!obj.__active){
1082
+ obj.__active = obj[''];
1083
+ obj.__activeName = '';
1084
+ }
1085
+ if(oldLang != obj.__active){
1086
+ $(obj).trigger('change');
1087
+ }
1088
+ };
1089
+ return function(lang){
1090
+ var shortLang;
1091
+ if(typeof lang == 'string'){
1092
+ if(curLang[0] != lang){
1093
+ curLang = [lang];
1094
+ shortLang = curLang[0].split('-')[0];
1095
+ if(shortLang && shortLang != lang){
1096
+ curLang.push(shortLang);
1097
+ }
1098
+ langDatas.forEach(select);
1099
+ }
1100
+ } else if(typeof lang == 'object'){
1101
+ if(!lang.__active){
1102
+ langDatas.push(lang);
1103
+ select(lang);
1104
+ }
1105
+ return lang.__active;
1106
+ }
1107
+ return curLang[0];
1108
+ };
1109
+ })()
1110
+ });
1111
+
1112
+ $.each({
1113
+ defineNodeNamesProperty: 'defineNodeNameProperty',
1114
+ defineNodeNamesProperties: 'defineNodeNameProperties',
1115
+ createElements: 'createElement'
1116
+ }, function(name, baseMethod){
1117
+ webshims[name] = function(names, a, b, c){
1118
+ if(typeof names == 'string'){
1119
+ names = names.split(listReg);
1120
+ }
1121
+ var retDesc = {};
1122
+ names.forEach(function(nodeName){
1123
+ retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
1124
+ });
1125
+ return retDesc;
1126
+ };
1127
+ });
1128
+
1129
+ webshims.isReady('webshimLocalization', true);
1130
+
1131
+ //html5a11y + hidden attribute
1132
+ (function(){
1133
+ if(('content' in document.createElement('template'))){return;}
1134
+
1135
+ $(function(){
1136
+ var main = $('main').attr({role: 'main'});
1137
+ if(main.length > 1){
1138
+ webshims.error('only one main element allowed in document');
1139
+ } else if(main.is('article *, section *')) {
1140
+ webshims.error('main not allowed inside of article/section elements');
1141
+ }
1142
+ });
1143
+
1144
+ if(('hidden' in document.createElement('a'))){
1145
+ return;
1146
+ }
1147
+
1148
+ webshims.defineNodeNamesBooleanProperty(['*'], 'hidden');
1149
+
1150
+ var elemMappings = {
1151
+ article: "article",
1152
+ aside: "complementary",
1153
+ section: "region",
1154
+ nav: "navigation",
1155
+ address: "contentinfo"
1156
+ };
1157
+ var addRole = function(elem, role){
1158
+ var hasRole = elem.getAttribute('role');
1159
+ if (!hasRole) {
1160
+ elem.setAttribute('role', role);
1161
+ }
1162
+ };
1163
+
1164
+
1165
+ $.webshims.addReady(function(context, contextElem){
1166
+ $.each(elemMappings, function(name, role){
1167
+ var elems = $(name, context).add(contextElem.filter(name));
1168
+ for (var i = 0, len = elems.length; i < len; i++) {
1169
+ addRole(elems[i], role);
1170
+ }
1171
+ });
1172
+ if (context === document) {
1173
+ var header = document.getElementsByTagName('header')[0];
1174
+ var footers = document.getElementsByTagName('footer');
1175
+ var footerLen = footers.length;
1176
+
1177
+ if (header && !$(header).closest('section, article')[0]) {
1178
+ addRole(header, 'banner');
1179
+ }
1180
+ if (!footerLen) {
1181
+ return;
1182
+ }
1183
+ var footer = footers[footerLen - 1];
1184
+ if (!$(footer).closest('section, article')[0]) {
1185
+ addRole(footer, 'contentinfo');
1186
+ }
1187
+ }
1188
+ });
1189
+
1190
+ })();
1191
+ });
1192
+ ;webshims.register('track', function($, webshims, window, document, undefined){
1193
+ "use strict";
1194
+ var mediaelement = webshims.mediaelement;
1195
+ var id = new Date().getTime();
1196
+ //descriptions are not really shown, but they are inserted into the dom
1197
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
1198
+ var dummyTrack = $('<track />');
1199
+ var supportTrackMod = Modernizr.ES5 && Modernizr.objectAccessor;
1200
+ var createEventTarget = function(obj){
1201
+ var eventList = {};
1202
+ obj.addEventListener = function(name, fn){
1203
+ if(eventList[name]){
1204
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
1205
+ }
1206
+ eventList[name] = fn;
1207
+
1208
+ };
1209
+ obj.removeEventListener = function(name, fn){
1210
+ if(eventList[name] && eventList[name] != fn){
1211
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
1212
+ }
1213
+ if(eventList[name]){
1214
+ delete eventList[name];
1215
+ }
1216
+ };
1217
+ return obj;
1218
+ };
1219
+
1220
+ var cueListProto = {
1221
+ getCueById: function(id){
1222
+ var cue = null;
1223
+ for(var i = 0, len = this.length; i < len; i++){
1224
+ if(this[i].id === id){
1225
+ cue = this[i];
1226
+ break;
1227
+ }
1228
+ }
1229
+ return cue;
1230
+ }
1231
+ };
1232
+ var numericModes = {
1233
+ 0: 'disabled',
1234
+ 1: 'hidden',
1235
+ 2: 'showing'
1236
+ };
1237
+
1238
+ var textTrackProto = {
1239
+ shimActiveCues: null,
1240
+ _shimActiveCues: null,
1241
+ activeCues: null,
1242
+ cues: null,
1243
+ kind: 'subtitles',
1244
+ label: '',
1245
+ language: '',
1246
+ id: '',
1247
+ mode: 'disabled',
1248
+ oncuechange: null,
1249
+ toString: function() {
1250
+ return "[object TextTrack]";
1251
+ },
1252
+ addCue: function(cue){
1253
+ if(!this.cues){
1254
+ this.cues = mediaelement.createCueList();
1255
+ } else {
1256
+ var lastCue = this.cues[this.cues.length-1];
1257
+ if(lastCue && lastCue.startTime > cue.startTime){
1258
+ webshims.error("cue startTime higher than previous cue's startTime");
1259
+ }
1260
+ }
1261
+ if(cue.track && cue.track.removeCue){
1262
+ cue.track.removeCue(cue);
1263
+ }
1264
+ cue.track = this;
1265
+ this.cues.push(cue);
1266
+ },
1267
+ //ToDo: make it more dynamic
1268
+ removeCue: function(cue){
1269
+ var cues = this.cues || [];
1270
+ var i = 0;
1271
+ var len = cues.length;
1272
+ if(cue.track != this){
1273
+ webshims.error("cue not part of track");
1274
+ return;
1275
+ }
1276
+ for(; i < len; i++){
1277
+ if(cues[i] === cue){
1278
+ cues.splice(i, 1);
1279
+ cue.track = null;
1280
+ break;
1281
+ }
1282
+ }
1283
+ if(cue.track){
1284
+ webshims.error("cue not part of track");
1285
+ return;
1286
+ }
1287
+ }/*,
1288
+ DISABLED: 'disabled',
1289
+ OFF: 'disabled',
1290
+ HIDDEN: 'hidden',
1291
+ SHOWING: 'showing',
1292
+ ERROR: 3,
1293
+ LOADED: 2,
1294
+ LOADING: 1,
1295
+ NONE: 0*/
1296
+ };
1297
+ var copyProps = ['kind', 'label', 'srclang'];
1298
+ var copyName = {srclang: 'language'};
1299
+
1300
+ var updateMediaTrackList = function(baseData, trackList){
1301
+ var removed = [];
1302
+ var added = [];
1303
+ var newTracks = [];
1304
+ var i, len;
1305
+ if(!baseData){
1306
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
1307
+ }
1308
+
1309
+ if(!trackList){
1310
+ baseData.blockTrackListUpdate = true;
1311
+ trackList = $.prop(this, 'textTracks');
1312
+ baseData.blockTrackListUpdate = false;
1313
+ }
1314
+
1315
+ clearTimeout(baseData.updateTrackListTimer);
1316
+
1317
+ $('track', this).each(function(){
1318
+ var track = $.prop(this, 'track');
1319
+ newTracks.push(track);
1320
+ if(trackList.indexOf(track) == -1){
1321
+ added.push(track);
1322
+ }
1323
+ });
1324
+
1325
+ if(baseData.scriptedTextTracks){
1326
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
1327
+ newTracks.push(baseData.scriptedTextTracks[i]);
1328
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
1329
+ added.push(baseData.scriptedTextTracks[i]);
1330
+ }
1331
+ }
1332
+ }
1333
+
1334
+ for(i = 0, len = trackList.length; i < len; i++){
1335
+ if(newTracks.indexOf(trackList[i]) == -1){
1336
+ removed.push(trackList[i]);
1337
+ }
1338
+ }
1339
+
1340
+ if(removed.length || added.length){
1341
+ trackList.splice(0);
1342
+
1343
+ for(i = 0, len = newTracks.length; i < len; i++){
1344
+ trackList.push(newTracks[i]);
1345
+ }
1346
+ for(i = 0, len = removed.length; i < len; i++){
1347
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
1348
+ }
1349
+ for(i = 0, len = added.length; i < len; i++){
1350
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
1351
+ }
1352
+ if(baseData.scriptedTextTracks || removed.length){
1353
+ $(this).triggerHandler('updatetrackdisplay');
1354
+ }
1355
+ }
1356
+ };
1357
+
1358
+ var refreshTrack = function(track, trackData){
1359
+ if(!trackData){
1360
+ trackData = webshims.data(track, 'trackData');
1361
+ }
1362
+
1363
+ if(trackData && !trackData.isTriggering){
1364
+ trackData.isTriggering = true;
1365
+ setTimeout(function(){
1366
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
1367
+ trackData.isTriggering = false;
1368
+ }, 1);
1369
+ }
1370
+ };
1371
+ var isDefaultTrack = (function(){
1372
+ var defaultKinds = {
1373
+ subtitles: {
1374
+ subtitles: 1,
1375
+ captions: 1
1376
+ },
1377
+ descriptions: {descriptions: 1},
1378
+ chapters: {chapters: 1}
1379
+ };
1380
+ defaultKinds.captions = defaultKinds.subtitles;
1381
+
1382
+ return function(track){
1383
+ var kind, firstDefaultTrack;
1384
+ var isDefault = $.prop(track, 'default');
1385
+ if(isDefault && (kind = $.prop(track, 'kind')) != 'metadata'){
1386
+ firstDefaultTrack = $(track)
1387
+ .parent()
1388
+ .find('track[default]')
1389
+ .filter(function(){
1390
+ return !!(defaultKinds[kind][$.prop(this, 'kind')]);
1391
+ })[0]
1392
+ ;
1393
+ if(firstDefaultTrack != track){
1394
+ isDefault = false;
1395
+ webshims.error('more than one default track of a specific kind detected. Fall back to default = false');
1396
+ }
1397
+ }
1398
+ return isDefault;
1399
+ };
1400
+ })();
1401
+ var emptyDiv = $('<div />')[0];
1402
+
1403
+ function VTTCue(startTime, endTime, text){
1404
+ if(arguments.length != 3){
1405
+ webshims.error("wrong arguments.length for VTTCue.constructor");
1406
+ }
1407
+
1408
+ this.startTime = startTime;
1409
+ this.endTime = endTime;
1410
+ this.text = text;
1411
+ this.onenter = null;
1412
+ this.onexit = null;
1413
+ this.pauseOnExit = false;
1414
+ this.track = null;
1415
+ this.id = null;
1416
+ this.getCueAsHTML = (function(){
1417
+ var lastText = "";
1418
+ var parsedText = "";
1419
+ var fragment;
1420
+
1421
+ return function(){
1422
+ var i, len;
1423
+ if(!fragment){
1424
+ fragment = document.createDocumentFragment();
1425
+ }
1426
+ if(lastText != this.text){
1427
+ lastText = this.text;
1428
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
1429
+ emptyDiv.innerHTML = parsedText;
1430
+
1431
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
1432
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
1433
+ }
1434
+ }
1435
+ return fragment.cloneNode(true);
1436
+ };
1437
+
1438
+ })();
1439
+ }
1440
+
1441
+ window.VTTCue = VTTCue;
1442
+ window.TextTrackCue = function(){
1443
+ webshims.error("Use VTTCue constructor instead of abstract TextTrackCue constructor.");
1444
+ VTTCue.apply(this, arguments);
1445
+ };
1446
+
1447
+ window.TextTrackCue.prototype = VTTCue.prototype;
1448
+
1449
+ mediaelement.createCueList = function(){
1450
+ return $.extend([], cueListProto);
1451
+ };
1452
+
1453
+ mediaelement.parseCueTextToHTML = (function(){
1454
+ var tagSplits = /(<\/?[^>]+>)/ig;
1455
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
1456
+ var regEnd = /\<\s*\//;
1457
+ var addToTemplate = function(localName, attribute, tag, html){
1458
+ var ret;
1459
+ if(regEnd.test(html)){
1460
+ ret = '</'+ localName +'>';
1461
+ } else {
1462
+ tag.splice(0, 1);
1463
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '&#34;')) +'">';
1464
+ }
1465
+ return ret;
1466
+ };
1467
+ var replacer = function(html){
1468
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
1469
+ if(tag[0]){
1470
+ tag[0] = tag[0].toLowerCase();
1471
+ if(allowedTags.test(tag[0])){
1472
+ if(tag[0] == 'c'){
1473
+ html = addToTemplate('span', 'class', tag, html);
1474
+ } else if(tag[0] == 'v'){
1475
+ html = addToTemplate('q', 'title', tag, html);
1476
+ }
1477
+ } else {
1478
+ html = "";
1479
+ }
1480
+ }
1481
+ return html;
1482
+ };
1483
+
1484
+ return function(cueText){
1485
+ return cueText.replace(tagSplits, replacer);
1486
+ };
1487
+ })();
1488
+
1489
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
1490
+ var loadEvents = 'play playing';
1491
+ var obj = trackData.track;
1492
+ var load = function(){
1493
+ var error, ajax, createAjax;
1494
+ var src = obj.mode != 'disabled' && ($.attr(track, 'src') && $.prop(track, 'src'));
1495
+
1496
+ if(src){
1497
+ $(mediaelem).off(loadEvents, load).off('updatetrackdisplay', load);
1498
+
1499
+ if(!trackData.readyState){
1500
+ error = function(){
1501
+ trackData.readyState = 3;
1502
+ obj.cues = null;
1503
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
1504
+ $(track).triggerHandler('error');
1505
+ };
1506
+ trackData.readyState = 1;
1507
+ try {
1508
+ obj.cues = mediaelement.createCueList();
1509
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
1510
+ createAjax = function(){
1511
+ ajax = $.ajax({
1512
+ dataType: 'text',
1513
+ url: src,
1514
+ success: function(text){
1515
+ if(ajax.getResponseHeader('content-type') != 'text/vtt'){
1516
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
1517
+ }
1518
+ mediaelement.parseCaptions(text, obj, function(cues){
1519
+ if(cues && 'length' in cues){
1520
+ trackData.readyState = 2;
1521
+ $(track).triggerHandler('load');
1522
+ $(mediaelem).triggerHandler('updatetrackdisplay');
1523
+ } else {
1524
+ error();
1525
+ }
1526
+ });
1527
+
1528
+ },
1529
+ error: error
1530
+ });
1531
+ };
1532
+ if($.ajax && $.ajaxSettings.xhr){
1533
+ createAjax();
1534
+ } else {
1535
+ webshims.ready('jajax', createAjax);
1536
+ webshims.loader.loadList(['jajax']);
1537
+ }
1538
+ } catch(er){
1539
+ error();
1540
+ webshims.error(er);
1541
+ }
1542
+ }
1543
+ }
1544
+ };
1545
+ trackData.readyState = 0;
1546
+ obj.shimActiveCues = null;
1547
+ obj._shimActiveCues = null;
1548
+ obj.activeCues = null;
1549
+ obj.cues = null;
1550
+
1551
+ $(mediaelem).on(loadEvents, load);
1552
+ if(_default){
1553
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
1554
+ webshims.ready('WINDOWLOAD', load);
1555
+ } else {
1556
+ webshims.ready('WINDOWLOAD', function(){
1557
+ $(mediaelem).on('updatetrackdisplay', load);
1558
+ });
1559
+ }
1560
+ };
1561
+
1562
+ mediaelement.createTextTrack = function(mediaelem, track){
1563
+ var obj, trackData;
1564
+ if(track.nodeName){
1565
+ trackData = webshims.data(track, 'trackData');
1566
+
1567
+ if(trackData){
1568
+ refreshTrack(track, trackData);
1569
+ obj = trackData.track;
1570
+ }
1571
+ }
1572
+
1573
+ if(!obj){
1574
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
1575
+
1576
+ if(!supportTrackMod){
1577
+ copyProps.forEach(function(copyProp){
1578
+ var prop = $.prop(track, copyProp);
1579
+ if(prop){
1580
+ obj[copyName[copyProp] || copyProp] = prop;
1581
+ }
1582
+ });
1583
+ }
1584
+
1585
+
1586
+ if(track.nodeName){
1587
+ if(supportTrackMod){
1588
+ copyProps.forEach(function(copyProp){
1589
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1590
+ get: function(){
1591
+ return $.prop(track, copyProp);
1592
+ }
1593
+ });
1594
+ });
1595
+ }
1596
+ obj.id = $(track).prop('id');
1597
+ trackData = webshims.data(track, 'trackData', {track: obj});
1598
+ mediaelement.loadTextTrack(mediaelem, track, trackData, isDefaultTrack(track));
1599
+ } else {
1600
+ if(supportTrackMod){
1601
+ copyProps.forEach(function(copyProp){
1602
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
1603
+ value: track[copyProp],
1604
+ writeable: false
1605
+ });
1606
+ });
1607
+ }
1608
+ obj.cues = mediaelement.createCueList();
1609
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
1610
+ obj.mode = 'hidden';
1611
+ obj.readyState = 2;
1612
+ }
1613
+ if(obj.kind == 'subtitles' && !obj.language){
1614
+ webshims.error('you must provide a language for track in subtitles state');
1615
+ }
1616
+ obj.__wsmode = obj.mode;
1617
+ }
1618
+
1619
+ return obj;
1620
+ };
1621
+
1622
+
1623
+ /*
1624
+ taken from:
1625
+ Captionator 0.5.1 [CaptionCrunch]
1626
+ Christopher Giffard, 2011
1627
+ Share and enjoy
1628
+
1629
+ https://github.com/cgiffard/Captionator
1630
+
1631
+ modified for webshims
1632
+ */
1633
+ mediaelement.parseCaptionChunk = (function(){
1634
+ // Set up timestamp parsers
1635
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
1636
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
1637
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
1638
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
1639
+
1640
+ return function(subtitleElement,objectCount){
1641
+
1642
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id, specialCueData;
1643
+ var timestampMatch, tmpCue;
1644
+
1645
+ // WebVTT Special Cue Logic
1646
+ if (WebVTTDEFAULTSCueParser.exec(subtitleElement)) {
1647
+ // cueDefaults = specialCueData.slice(2).join("");
1648
+ // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
1649
+ return null;
1650
+ } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
1651
+ return null;
1652
+ } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
1653
+ return null; // At this stage, we don't want to do anything with these.
1654
+ }
1655
+
1656
+ subtitleParts = subtitleElement.split(/\n/g);
1657
+
1658
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
1659
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
1660
+ subtitleParts.shift();
1661
+ }
1662
+
1663
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
1664
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
1665
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
1666
+ }
1667
+
1668
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
1669
+ var timestamp = subtitleParts[subtitlePartIndex];
1670
+
1671
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
1672
+
1673
+ // WebVTT
1674
+
1675
+ timeData = timestampMatch.slice(1);
1676
+
1677
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
1678
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
1679
+ parseInt((timeData[2]||0),10) + // Seconds
1680
+ parseFloat("0." + (timeData[3]||0)); // MS
1681
+
1682
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
1683
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
1684
+ parseInt((timeData[6]||0),10) + // Seconds
1685
+ parseFloat("0." + (timeData[7]||0)); // MS
1686
+ /*
1687
+ if (timeData[8]) {
1688
+ cueSettings = timeData[8];
1689
+ }
1690
+ */
1691
+ }
1692
+
1693
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
1694
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
1695
+ break;
1696
+ }
1697
+
1698
+ if (!timeIn && !timeOut) {
1699
+ // We didn't extract any time information. Assume the cue is invalid!
1700
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
1701
+ return null;
1702
+ }
1703
+ /*
1704
+ // Consolidate cue settings, convert defaults to object
1705
+ var compositeCueSettings =
1706
+ cueDefaults
1707
+ .reduce(function(previous,current,index,array){
1708
+ previous[current.split(":")[0]] = current.split(":")[1];
1709
+ return previous;
1710
+ },{});
1711
+
1712
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
1713
+ compositeCueSettings =
1714
+ cueSettings
1715
+ .split(/\s+/g)
1716
+ .filter(function(set) { return set && !!set.length; })
1717
+ // Convert array to a key/val object
1718
+ .reduce(function(previous,current,index,array){
1719
+ previous[current.split(":")[0]] = current.split(":")[1];
1720
+ return previous;
1721
+ },compositeCueSettings);
1722
+
1723
+ // Turn back into string like the VTTCue constructor expects
1724
+ cueSettings = "";
1725
+ for (var key in compositeCueSettings) {
1726
+ if (compositeCueSettings.hasOwnProperty(key)) {
1727
+ cueSettings += !!cueSettings.length ? " " : "";
1728
+ cueSettings += key + ":" + compositeCueSettings[key];
1729
+ }
1730
+ }
1731
+ */
1732
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
1733
+ html = subtitleParts.join("\n");
1734
+ tmpCue = new VTTCue(timeIn, timeOut, html);
1735
+ if(id){
1736
+ tmpCue.id = id;
1737
+ }
1738
+ return tmpCue;
1739
+ };
1740
+ })();
1741
+
1742
+ mediaelement.parseCaptions = function(captionData, track, complete) {
1743
+
1744
+ var cue, lazyProcess, regWevVTT, startDate, isWEBVTT;
1745
+
1746
+ mediaelement.createCueList();
1747
+ if (captionData) {
1748
+
1749
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
1750
+
1751
+ lazyProcess = function(i, len){
1752
+
1753
+ for(; i < len; i++){
1754
+ cue = captionData[i];
1755
+ if(regWevVTT.test(cue)){
1756
+ isWEBVTT = true;
1757
+ } else if(cue.replace(/\s*/ig,"").length){
1758
+ if(!isWEBVTT){
1759
+ webshims.error('please use WebVTT format. This is the standard');
1760
+ complete(null);
1761
+ break;
1762
+ }
1763
+ cue = mediaelement.parseCaptionChunk(cue, i);
1764
+ if(cue){
1765
+ track.addCue(cue);
1766
+ }
1767
+ }
1768
+ if(startDate < (new Date().getTime()) - 30){
1769
+ i++;
1770
+ setTimeout(function(){
1771
+ startDate = new Date().getTime();
1772
+ lazyProcess(i, len);
1773
+ }, 90);
1774
+
1775
+ break;
1776
+ }
1777
+ }
1778
+ if(i >= len){
1779
+ if(!isWEBVTT){
1780
+ webshims.error('please use WebVTT format. This is the standard');
1781
+ }
1782
+ complete(track.cues);
1783
+ }
1784
+ };
1785
+
1786
+ captionData = captionData.replace(/\r\n/g,"\n");
1787
+
1788
+ setTimeout(function(){
1789
+ captionData = captionData.replace(/\r/g,"\n");
1790
+ setTimeout(function(){
1791
+ startDate = new Date().getTime();
1792
+ captionData = captionData.split(/\n\n+/g);
1793
+ lazyProcess(0, captionData.length);
1794
+ }, 9);
1795
+ }, 9);
1796
+
1797
+ } else {
1798
+ webshims.error("Required parameter captionData not supplied.");
1799
+ }
1800
+ };
1801
+
1802
+
1803
+ mediaelement.createTrackList = function(mediaelem, baseData){
1804
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
1805
+ if(!baseData.textTracks){
1806
+ baseData.textTracks = [];
1807
+ webshims.defineProperties(baseData.textTracks, {
1808
+ onaddtrack: {value: null},
1809
+ onremovetrack: {value: null},
1810
+ onchange: {value: null},
1811
+ getTrackById: {
1812
+ value: function(id){
1813
+ var track = null;
1814
+ for(var i = 0; i < baseData.textTracks.length; i++){
1815
+ if(id == baseData.textTracks[i].id){
1816
+ track = baseData.textTracks[i];
1817
+ break;
1818
+ }
1819
+ }
1820
+ return track;
1821
+ }
1822
+ }
1823
+ });
1824
+ createEventTarget(baseData.textTracks);
1825
+ $(mediaelem).on('updatetrackdisplay', function(){
1826
+ var track;
1827
+ for(var i = 0; i < baseData.textTracks.length; i++){
1828
+ track = baseData.textTracks[i];
1829
+ if(track.__wsmode != track.mode){
1830
+ track.__wsmode = track.mode;
1831
+ $([ baseData.textTracks ]).triggerHandler('change');
1832
+ }
1833
+ }
1834
+ });
1835
+
1836
+ }
1837
+ return baseData.textTracks;
1838
+ };
1839
+
1840
+ if(!Modernizr.track){
1841
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
1842
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
1843
+
1844
+ webshims.defineNodeNameProperties('track', {
1845
+ src: {
1846
+ //attr: {},
1847
+ reflect: true,
1848
+ propType: 'src'
1849
+ }
1850
+ });
1851
+ }
1852
+
1853
+ webshims.defineNodeNameProperties('track', {
1854
+ kind: {
1855
+ attr: Modernizr.track ? {
1856
+ set: function(value){
1857
+ var trackData = webshims.data(this, 'trackData');
1858
+ this.setAttribute('data-kind', value);
1859
+ if(trackData){
1860
+ trackData.attrKind = value;
1861
+ }
1862
+ },
1863
+ get: function(){
1864
+ var trackData = webshims.data(this, 'trackData');
1865
+ if(trackData && ('attrKind' in trackData)){
1866
+ return trackData.attrKind;
1867
+ }
1868
+ return this.getAttribute('kind');
1869
+ }
1870
+ } : {},
1871
+ reflect: true,
1872
+ propType: 'enumarated',
1873
+ defaultValue: 'subtitles',
1874
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
1875
+ }
1876
+ });
1877
+
1878
+ $.each(copyProps, function(i, copyProp){
1879
+ var name = copyName[copyProp] || copyProp;
1880
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
1881
+ var trackData = webshims.data(this, 'trackData');
1882
+ var track = this;
1883
+ if(trackData){
1884
+ if(copyProp == 'kind'){
1885
+ refreshTrack(this, trackData);
1886
+ }
1887
+ if(!supportTrackMod){
1888
+ trackData.track[name] = $.prop(this, copyProp);
1889
+ }
1890
+ }
1891
+ });
1892
+ });
1893
+
1894
+
1895
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
1896
+ if(val){
1897
+ var data = webshims.data(this, 'trackData');
1898
+ var media;
1899
+ if(data){
1900
+ media = $(this).closest('video, audio');
1901
+ if(media[0]){
1902
+ mediaelement.loadTextTrack(media, this, data);
1903
+ }
1904
+ }
1905
+ }
1906
+
1907
+ });
1908
+
1909
+ //
1910
+
1911
+ webshims.defineNodeNamesProperties(['track'], {
1912
+ ERROR: {
1913
+ value: 3
1914
+ },
1915
+ LOADED: {
1916
+ value: 2
1917
+ },
1918
+ LOADING: {
1919
+ value: 1
1920
+ },
1921
+ NONE: {
1922
+ value: 0
1923
+ },
1924
+ readyState: {
1925
+ get: function(){
1926
+ return (webshims.data(this, 'trackData') || {readyState: 0}).readyState;
1927
+ },
1928
+ writeable: false
1929
+ },
1930
+ track: {
1931
+ get: function(){
1932
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
1933
+ },
1934
+ writeable: false
1935
+ }
1936
+ }, 'prop');
1937
+
1938
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
1939
+ textTracks: {
1940
+ get: function(){
1941
+ var media = this;
1942
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
1943
+ var tracks = mediaelement.createTrackList(media, baseData);
1944
+ if(!baseData.blockTrackListUpdate){
1945
+ updateMediaTrackList.call(media, baseData, tracks);
1946
+ }
1947
+ return tracks;
1948
+ },
1949
+ writeable: false
1950
+ },
1951
+ addTextTrack: {
1952
+ value: function(kind, label, lang){
1953
+ var textTrack = mediaelement.createTextTrack(this, {
1954
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
1955
+ label: label || '',
1956
+ srclang: lang || ''
1957
+ });
1958
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
1959
+ if (!baseData.scriptedTextTracks) {
1960
+ baseData.scriptedTextTracks = [];
1961
+ }
1962
+ baseData.scriptedTextTracks.push(textTrack);
1963
+ updateMediaTrackList.call(this);
1964
+ return textTrack;
1965
+ }
1966
+ }
1967
+ }, 'prop');
1968
+
1969
+ //wsmediareload
1970
+ var thUpdateList = function(e){
1971
+ if($(e.target).is('audio, video')){
1972
+ var baseData = webshims.data(e.target, 'mediaelementBase');
1973
+ if(baseData){
1974
+ clearTimeout(baseData.updateTrackListTimer);
1975
+ baseData.updateTrackListTimer = setTimeout(function(){
1976
+ updateMediaTrackList.call(e.target, baseData);
1977
+ }, 0);
1978
+ }
1979
+ }
1980
+ };
1981
+
1982
+ var getNativeReadyState = function(trackElem, textTrack){
1983
+ return textTrack.readyState || trackElem.readyState;
1984
+ };
1985
+ var stopOriginalEvent = function(e){
1986
+ if(e.originalEvent){
1987
+ e.stopImmediatePropagation();
1988
+ }
1989
+ };
1990
+ var hideNativeTracks = function(){
1991
+ if(webshims.implement(this, 'track')){
1992
+ var kind;
1993
+ var origTrack = this.track;
1994
+ if(origTrack){
1995
+
1996
+ if (!webshims.bugs.track && (origTrack.mode || getNativeReadyState(this, origTrack))) {
1997
+ $.prop(this, 'track').mode = numericModes[origTrack.mode] || origTrack.mode;
1998
+ }
1999
+ //disable track from showing + remove UI
2000
+ kind = $.prop(this, 'kind');
2001
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
2002
+ this.kind = 'metadata';
2003
+
2004
+ $(this).attr({kind: kind});
2005
+
2006
+ }
2007
+ $(this).on('load error', stopOriginalEvent);
2008
+ }
2009
+ };
2010
+
2011
+ webshims.addReady(function(context, insertedElement){
2012
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
2013
+ $('video, audio', context)
2014
+ .add(insertedMedia)
2015
+ .each(function(){
2016
+ updateMediaTrackList.call(this);
2017
+ })
2018
+ .on('emptied updatetracklist wsmediareload', thUpdateList)
2019
+ .each(function(){
2020
+ if(Modernizr.track){
2021
+ var shimedTextTracks = $.prop(this, 'textTracks');
2022
+ var origTextTracks = this.textTracks;
2023
+
2024
+ if(shimedTextTracks.length != origTextTracks.length){
2025
+ webshims.warn("textTracks couldn't be copied");
2026
+ }
2027
+
2028
+ $('track', this).each(hideNativeTracks);
2029
+ }
2030
+ })
2031
+ ;
2032
+
2033
+ insertedMedia.each(function(){
2034
+ var media = this;
2035
+ var baseData = webshims.data(media, 'mediaelementBase');
2036
+ if(baseData){
2037
+ clearTimeout(baseData.updateTrackListTimer);
2038
+ baseData.updateTrackListTimer = setTimeout(function(){
2039
+ updateMediaTrackList.call(media, baseData);
2040
+ }, 9);
2041
+ }
2042
+ });
2043
+ });
2044
+
2045
+ if(Modernizr.texttrackapi){
2046
+ $('video, audio').trigger('trackapichange');
2047
+ }
2048
+ });