webshims-rails 1.10.3 → 1.10.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +96 -73
  4. data/vendor/assets/javascripts/webshims/shims/color-picker.js +2415 -0
  5. data/vendor/assets/javascripts/webshims/shims/combos/1.js +248 -745
  6. data/vendor/assets/javascripts/webshims/shims/combos/10.js +771 -1206
  7. data/vendor/assets/javascripts/webshims/shims/combos/11.js +679 -1201
  8. data/vendor/assets/javascripts/webshims/shims/combos/12.js +46 -65
  9. data/vendor/assets/javascripts/webshims/shims/combos/13.js +45 -64
  10. data/vendor/assets/javascripts/webshims/shims/combos/14.js +94 -7
  11. data/vendor/assets/javascripts/webshims/shims/combos/15.js +557 -1189
  12. data/vendor/assets/javascripts/webshims/shims/combos/16.js +598 -1249
  13. data/vendor/assets/javascripts/webshims/shims/combos/17.js +697 -1208
  14. data/vendor/assets/javascripts/webshims/shims/combos/18.js +697 -1208
  15. data/vendor/assets/javascripts/webshims/shims/combos/19.js +145 -78
  16. data/vendor/assets/javascripts/webshims/shims/combos/2.js +472 -1280
  17. data/vendor/assets/javascripts/webshims/shims/combos/20.js +144 -77
  18. data/vendor/assets/javascripts/webshims/shims/combos/21.js +14 -15
  19. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2 -2
  20. data/vendor/assets/javascripts/webshims/shims/combos/23.js +45 -64
  21. data/vendor/assets/javascripts/webshims/shims/combos/24.js +848 -0
  22. data/vendor/assets/javascripts/webshims/shims/combos/25.js +4373 -0
  23. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1516 -0
  24. data/vendor/assets/javascripts/webshims/shims/combos/27.js +884 -0
  25. data/vendor/assets/javascripts/webshims/shims/combos/28.js +2067 -0
  26. data/vendor/assets/javascripts/webshims/shims/combos/29.js +1156 -0
  27. data/vendor/assets/javascripts/webshims/shims/combos/3.js +313 -700
  28. data/vendor/assets/javascripts/webshims/shims/combos/30.js +1868 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/31.js +1663 -0
  30. data/vendor/assets/javascripts/webshims/shims/combos/4.js +111 -20
  31. data/vendor/assets/javascripts/webshims/shims/combos/5.js +747 -1321
  32. data/vendor/assets/javascripts/webshims/shims/combos/6.js +837 -1809
  33. data/vendor/assets/javascripts/webshims/shims/combos/7.js +435 -1239
  34. data/vendor/assets/javascripts/webshims/shims/combos/8.js +360 -766
  35. data/vendor/assets/javascripts/webshims/shims/combos/9.js +843 -1676
  36. data/vendor/assets/javascripts/webshims/shims/details.js +1 -1
  37. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +90 -3
  38. data/vendor/assets/javascripts/webshims/shims/filereader.js +386 -0
  39. data/vendor/assets/javascripts/webshims/shims/form-core.js +201 -680
  40. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +418 -0
  41. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +69 -467
  42. data/vendor/assets/javascripts/webshims/shims/form-message.js +21 -17
  43. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +19 -82
  44. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +17 -6
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +570 -1185
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +181 -28
  47. data/vendor/assets/javascripts/webshims/shims/form-validation.js +599 -0
  48. data/vendor/assets/javascripts/webshims/{extras/custom-validity.js → shims/form-validators.js} +33 -38
  49. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +865 -0
  50. data/vendor/assets/javascripts/webshims/shims/geolocation.js +2 -2
  51. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.txt +37 -34
  52. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.txt +88 -48
  53. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +74 -0
  54. data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +121 -0
  55. data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +47 -0
  56. data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
  57. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
  59. data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
  60. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Thumbs.db +0 -0
  61. data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
  62. data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
  63. data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
  65. data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
  66. data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
  67. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +257 -0
  68. data/vendor/assets/javascripts/webshims/shims/json-storage.js +4 -4
  69. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +44 -63
  70. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +10 -11
  71. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +2 -1
  72. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +5 -3
  73. data/vendor/assets/javascripts/webshims/shims/range-ui.js +110 -17
  74. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/styles/range-track.png +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +104 -21
  77. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +90 -16
  78. data/vendor/assets/javascripts/webshims/shims/styles/vertical-range.png +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/swf/filereader.swf +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/swfmini.js +1 -1
  81. data/vendor/assets/javascripts/webshims/shims/track-ui.js +35 -3
  82. data/vendor/assets/javascripts/webshims/shims/track.js +1 -1
  83. metadata +33 -3
@@ -0,0 +1,1156 @@
1
+ webshims.register('track', function($, webshims, window, document, undefined){
2
+ "use strict";
3
+ var mediaelement = webshims.mediaelement;
4
+ var id = new Date().getTime();
5
+ var ADDBACK = $.fn.addBack ? 'addBack' : 'andSelf';
6
+ //descriptions are not really shown, but they are inserted into the dom
7
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
8
+ var notImplemented = function(){
9
+ webshims.error('not implemented yet');
10
+ };
11
+ var dummyTrack = $('<track />');
12
+ var supportTrackMod = Modernizr.ES5 && Modernizr.objectAccessor;
13
+ var createEventTarget = function(obj){
14
+ var eventList = {};
15
+ obj.addEventListener = function(name, fn){
16
+ if(eventList[name]){
17
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
18
+ }
19
+ eventList[name] = fn;
20
+
21
+ };
22
+ obj.removeEventListener = function(name, fn){
23
+ if(eventList[name] && eventList[name] != fn){
24
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
25
+ }
26
+ if(eventList[name]){
27
+ delete eventList[name];
28
+ }
29
+ };
30
+ return obj;
31
+ };
32
+
33
+ var cueListProto = {
34
+ getCueById: function(id){
35
+ var cue = null;
36
+ for(var i = 0, len = this.length; i < len; i++){
37
+ if(this[i].id === id){
38
+ cue = this[i];
39
+ break;
40
+ }
41
+ }
42
+ return cue;
43
+ }
44
+ };
45
+ var numericModes = {
46
+ 0: 'disabled',
47
+ 1: 'hidden',
48
+ 2: 'showing'
49
+ };
50
+
51
+ var textTrackProto = {
52
+ shimActiveCues: null,
53
+ _shimActiveCues: null,
54
+ activeCues: null,
55
+ cues: null,
56
+ kind: 'subtitles',
57
+ label: '',
58
+ language: '',
59
+ mode: 'disabled',
60
+ readyState: 0,
61
+ oncuechange: null,
62
+ toString: function() {
63
+ return "[object TextTrack]";
64
+ },
65
+ addCue: function(cue){
66
+ if(!this.cues){
67
+ this.cues = mediaelement.createCueList();
68
+ } else {
69
+ var lastCue = this.cues[this.cues.length-1];
70
+ if(lastCue && lastCue.startTime > cue.startTime){
71
+ webshims.error("cue startTime higher than previous cue's startTime");
72
+ }
73
+ }
74
+ if(cue.track && cue.track.removeCue){
75
+ cue.track.removeCue(cue);
76
+ }
77
+ cue.track = this;
78
+ this.cues.push(cue);
79
+ },
80
+ //ToDo: make it more dynamic
81
+ removeCue: function(cue){
82
+ var cues = this.cues || [];
83
+ var i = 0;
84
+ var len = cues.length;
85
+ if(cue.track != this){
86
+ webshims.error("cue not part of track");
87
+ return;
88
+ }
89
+ for(; i < len; i++){
90
+ if(cues[i] === cue){
91
+ cues.splice(i, 1);
92
+ cue.track = null;
93
+ break;
94
+ }
95
+ }
96
+ if(cue.track){
97
+ webshims.error("cue not part of track");
98
+ return;
99
+ }
100
+ },
101
+ DISABLED: 'disabled',
102
+ OFF: 'disabled',
103
+ HIDDEN: 'hidden',
104
+ SHOWING: 'showing',
105
+ ERROR: 3,
106
+ LOADED: 2,
107
+ LOADING: 1,
108
+ NONE: 0
109
+ };
110
+ var copyProps = ['kind', 'label', 'srclang'];
111
+ var copyName = {srclang: 'language'};
112
+
113
+ var owns = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
114
+
115
+ var updateMediaTrackList = function(baseData, trackList){
116
+ var removed = [];
117
+ var added = [];
118
+ var newTracks = [];
119
+ var i, len;
120
+ if(!baseData){
121
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
122
+ }
123
+
124
+ if(!trackList){
125
+ baseData.blockTrackListUpdate = true;
126
+ trackList = $.prop(this, 'textTracks');
127
+ baseData.blockTrackListUpdate = false;
128
+ }
129
+
130
+ clearTimeout(baseData.updateTrackListTimer);
131
+
132
+ $('track', this).each(function(){
133
+ var track = $.prop(this, 'track');
134
+ newTracks.push(track);
135
+ if(trackList.indexOf(track) == -1){
136
+ added.push(track);
137
+ }
138
+ });
139
+
140
+ if(baseData.scriptedTextTracks){
141
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
142
+ newTracks.push(baseData.scriptedTextTracks[i]);
143
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
144
+ added.push(baseData.scriptedTextTracks[i]);
145
+ }
146
+ }
147
+ }
148
+
149
+ for(i = 0, len = trackList.length; i < len; i++){
150
+ if(newTracks.indexOf(trackList[i]) == -1){
151
+ removed.push(trackList[i]);
152
+ }
153
+ }
154
+
155
+ if(removed.length || added.length){
156
+ trackList.splice(0);
157
+
158
+ for(i = 0, len = newTracks.length; i < len; i++){
159
+ trackList.push(newTracks[i]);
160
+ }
161
+ for(i = 0, len = removed.length; i < len; i++){
162
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
163
+ }
164
+ for(i = 0, len = added.length; i < len; i++){
165
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
166
+ }
167
+ if(baseData.scriptedTextTracks || removed.length){
168
+ $(this).triggerHandler('updatetrackdisplay');
169
+ }
170
+ }
171
+ };
172
+
173
+ var refreshTrack = function(track, trackData){
174
+ if(!trackData){
175
+ trackData = webshims.data(track, 'trackData');
176
+ }
177
+ if(trackData && !trackData.isTriggering){
178
+ trackData.isTriggering = true;
179
+ setTimeout(function(){
180
+ if(!(trackData.track || {}).readyState){
181
+ $(track).triggerHandler('checktrackmode');
182
+ } else {
183
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
184
+ }
185
+ trackData.isTriggering = false;
186
+ }, 1);
187
+ }
188
+ };
189
+
190
+ var emptyDiv = $('<div />')[0];
191
+ window.TextTrackCue = function(startTime, endTime, text){
192
+ if(arguments.length != 3){
193
+ webshims.error("wrong arguments.length for TextTrackCue.constructor");
194
+ }
195
+
196
+ this.startTime = startTime;
197
+ this.endTime = endTime;
198
+ this.text = text;
199
+
200
+ this.id = "";
201
+ this.pauseOnExit = false;
202
+
203
+ createEventTarget(this);
204
+ };
205
+
206
+ window.TextTrackCue.prototype = {
207
+
208
+ onenter: null,
209
+ onexit: null,
210
+ pauseOnExit: false,
211
+ getCueAsHTML: function(){
212
+ var lastText = "";
213
+ var parsedText = "";
214
+ var fragment = document.createDocumentFragment();
215
+ var fn;
216
+ if(!owns(this, 'getCueAsHTML')){
217
+ fn = this.getCueAsHTML = function(){
218
+ var i, len;
219
+ if(lastText != this.text){
220
+ lastText = this.text;
221
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
222
+ emptyDiv.innerHTML = parsedText;
223
+
224
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
225
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
226
+ }
227
+ }
228
+ return fragment.cloneNode(true);
229
+ };
230
+
231
+ }
232
+ return fn ? fn.apply(this, arguments) : fragment.cloneNode(true);
233
+ },
234
+ track: null,
235
+
236
+
237
+ id: ''
238
+ //todo-->
239
+ // ,
240
+ // snapToLines: true,
241
+ // line: 'auto',
242
+ // size: 100,
243
+ // position: 50,
244
+ // vertical: '',
245
+ // align: 'middle'
246
+ };
247
+
248
+
249
+
250
+
251
+
252
+ mediaelement.createCueList = function(){
253
+ return $.extend([], cueListProto);
254
+ };
255
+
256
+ mediaelement.parseCueTextToHTML = (function(){
257
+ var tagSplits = /(<\/?[^>]+>)/ig;
258
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
259
+ var regEnd = /\<\s*\//;
260
+ var addToTemplate = function(localName, attribute, tag, html){
261
+ var ret;
262
+ if(regEnd.test(html)){
263
+ ret = '</'+ localName +'>';
264
+ } else {
265
+ tag.splice(0, 1);
266
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '&#34;')) +'">';
267
+ }
268
+ return ret;
269
+ };
270
+ var replacer = function(html){
271
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
272
+ if(tag[0]){
273
+ tag[0] = tag[0].toLowerCase();
274
+ if(allowedTags.test(tag[0])){
275
+ if(tag[0] == 'c'){
276
+ html = addToTemplate('span', 'class', tag, html);
277
+ } else if(tag[0] == 'v'){
278
+ html = addToTemplate('q', 'title', tag, html);
279
+ }
280
+ } else {
281
+ html = "";
282
+ }
283
+ }
284
+ return html;
285
+ };
286
+
287
+ return function(cueText){
288
+ return cueText.replace(tagSplits, replacer);
289
+ };
290
+ })();
291
+
292
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
293
+ var loadEvents = 'play playing timeupdate updatetrackdisplay';
294
+ var obj = trackData.track;
295
+ var load = function(){
296
+ var src = $.prop(track, 'src');
297
+ var error;
298
+ var ajax;
299
+ if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
300
+ $(mediaelem).unbind(loadEvents, load);
301
+ $(track).unbind('checktrackmode', load);
302
+ if(!obj.readyState){
303
+ error = function(){
304
+ obj.readyState = 3;
305
+ obj.cues = null;
306
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
307
+ $(track).triggerHandler('error');
308
+ };
309
+ obj.readyState = 1;
310
+ try {
311
+ obj.cues = mediaelement.createCueList();
312
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
313
+ ajax = $.ajax({
314
+ dataType: 'text',
315
+ url: src,
316
+ success: function(text){
317
+ if(ajax.getResponseHeader('content-type') != 'text/vtt'){
318
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
319
+ }
320
+ mediaelement.parseCaptions(text, obj, function(cues){
321
+ if(cues && 'length' in cues){
322
+ obj.readyState = 2;
323
+ $(track).triggerHandler('load');
324
+ $(mediaelem).triggerHandler('updatetrackdisplay');
325
+ } else {
326
+ error();
327
+ }
328
+ });
329
+
330
+ },
331
+ error: error
332
+ });
333
+ } catch(er){
334
+ error();
335
+ webshims.warn(er);
336
+ }
337
+ }
338
+ }
339
+ };
340
+ obj.readyState = 0;
341
+ obj.shimActiveCues = null;
342
+ obj._shimActiveCues = null;
343
+ obj.activeCues = null;
344
+ obj.cues = null;
345
+ $(mediaelem).unbind(loadEvents, load);
346
+ $(track).unbind('checktrackmode', load);
347
+ $(mediaelem).on(loadEvents, load);
348
+ $(track).on('checktrackmode', load);
349
+ if(_default){
350
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
351
+ load();
352
+ }
353
+ };
354
+
355
+ mediaelement.createTextTrack = function(mediaelem, track){
356
+ var obj, trackData;
357
+ if(track.nodeName){
358
+ trackData = webshims.data(track, 'trackData');
359
+
360
+ if(trackData){
361
+ refreshTrack(track, trackData);
362
+ obj = trackData.track;
363
+ }
364
+ }
365
+
366
+ if(!obj){
367
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
368
+
369
+ if(!supportTrackMod){
370
+ copyProps.forEach(function(copyProp){
371
+ var prop = $.prop(track, copyProp);
372
+ if(prop){
373
+ obj[copyName[copyProp] || copyProp] = prop;
374
+ }
375
+ });
376
+ }
377
+
378
+
379
+ if(track.nodeName){
380
+
381
+ if(supportTrackMod){
382
+ copyProps.forEach(function(copyProp){
383
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
384
+ get: function(){
385
+ return $.prop(track, copyProp);
386
+ }
387
+ });
388
+ });
389
+ }
390
+
391
+ trackData = webshims.data(track, 'trackData', {track: obj});
392
+ mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
393
+ } else {
394
+ if(supportTrackMod){
395
+ copyProps.forEach(function(copyProp){
396
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
397
+ value: track[copyProp],
398
+ writeable: false
399
+ });
400
+ });
401
+ }
402
+ obj.cues = mediaelement.createCueList();
403
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
404
+ obj.mode = 'hidden';
405
+ obj.readyState = 2;
406
+ }
407
+ }
408
+ return obj;
409
+ };
410
+
411
+
412
+ /*
413
+ taken from:
414
+ Captionator 0.5.1 [CaptionCrunch]
415
+ Christopher Giffard, 2011
416
+ Share and enjoy
417
+
418
+ https://github.com/cgiffard/Captionator
419
+
420
+ modified for webshims
421
+ */
422
+ mediaelement.parseCaptionChunk = (function(){
423
+ // Set up timestamp parsers
424
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
425
+ var GoogleTimestampParser = /^([\d\.]+)\s+\+([\d\.]+)\s*(.*)/;
426
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
427
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
428
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
429
+
430
+ return function(subtitleElement,objectCount){
431
+ var cueDefaults = [];
432
+
433
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, cueSettings = "", id, specialCueData;
434
+ var timestampMatch, tmpCue;
435
+
436
+ // WebVTT Special Cue Logic
437
+ if ((specialCueData = WebVTTDEFAULTSCueParser.exec(subtitleElement))) {
438
+ // cueDefaults = specialCueData.slice(2).join("");
439
+ // cueDefaults = cueDefaults.split(/\s+/g).filter(function(def) { return def && !!def.length; });
440
+ return null;
441
+ } else if ((specialCueData = WebVTTSTYLECueParser.exec(subtitleElement))) {
442
+ return null;
443
+ } else if ((specialCueData = WebVTTCOMMENTCueParser.exec(subtitleElement))) {
444
+ return null; // At this stage, we don't want to do anything with these.
445
+ }
446
+
447
+ subtitleParts = subtitleElement.split(/\n/g);
448
+
449
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
450
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
451
+ subtitleParts.shift();
452
+ }
453
+
454
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
455
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
456
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
457
+ }
458
+
459
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
460
+ var timestamp = subtitleParts[subtitlePartIndex];
461
+
462
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp))) {
463
+
464
+ // WebVTT
465
+
466
+ timeData = timestampMatch.slice(1);
467
+
468
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
469
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
470
+ parseInt((timeData[2]||0),10) + // Seconds
471
+ parseFloat("0." + (timeData[3]||0)); // MS
472
+
473
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
474
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
475
+ parseInt((timeData[6]||0),10) + // Seconds
476
+ parseFloat("0." + (timeData[7]||0)); // MS
477
+ /*
478
+ if (timeData[8]) {
479
+ cueSettings = timeData[8];
480
+ }
481
+ */
482
+ }
483
+
484
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
485
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
486
+ break;
487
+ }
488
+
489
+ if (!timeIn && !timeOut) {
490
+ // We didn't extract any time information. Assume the cue is invalid!
491
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
492
+ return null;
493
+ }
494
+ /*
495
+ // Consolidate cue settings, convert defaults to object
496
+ var compositeCueSettings =
497
+ cueDefaults
498
+ .reduce(function(previous,current,index,array){
499
+ previous[current.split(":")[0]] = current.split(":")[1];
500
+ return previous;
501
+ },{});
502
+
503
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
504
+ compositeCueSettings =
505
+ cueSettings
506
+ .split(/\s+/g)
507
+ .filter(function(set) { return set && !!set.length; })
508
+ // Convert array to a key/val object
509
+ .reduce(function(previous,current,index,array){
510
+ previous[current.split(":")[0]] = current.split(":")[1];
511
+ return previous;
512
+ },compositeCueSettings);
513
+
514
+ // Turn back into string like the TextTrackCue constructor expects
515
+ cueSettings = "";
516
+ for (var key in compositeCueSettings) {
517
+ if (compositeCueSettings.hasOwnProperty(key)) {
518
+ cueSettings += !!cueSettings.length ? " " : "";
519
+ cueSettings += key + ":" + compositeCueSettings[key];
520
+ }
521
+ }
522
+ */
523
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
524
+ html = subtitleParts.join("\n");
525
+ tmpCue = new TextTrackCue(timeIn, timeOut, html);
526
+ if(id){
527
+ tmpCue.id = id;
528
+ }
529
+ return tmpCue;
530
+ };
531
+ })();
532
+
533
+ mediaelement.parseCaptions = function(captionData, track, complete) {
534
+ var subtitles = mediaelement.createCueList();
535
+ var cue, lazyProcess, regWevVTT;
536
+ var startDate;
537
+ var isWEBVTT;
538
+ if (captionData) {
539
+
540
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
541
+
542
+ lazyProcess = function(i, len){
543
+
544
+ for(; i < len; i++){
545
+ cue = captionData[i];
546
+ if(regWevVTT.test(cue)){
547
+ isWEBVTT = true;
548
+ } else if(cue.replace(/\s*/ig,"").length){
549
+ if(!isWEBVTT){
550
+ webshims.error('please use WebVTT format. This is the standard');
551
+ complete(null);
552
+ break;
553
+ }
554
+ cue = mediaelement.parseCaptionChunk(cue, i);
555
+ if(cue){
556
+ track.addCue(cue);
557
+ }
558
+ }
559
+ if(startDate < (new Date().getTime()) - 30){
560
+ i++;
561
+ setTimeout(function(){
562
+ startDate = new Date().getTime();
563
+ lazyProcess(i, len);
564
+ }, 90);
565
+
566
+ break;
567
+ }
568
+ }
569
+ if(i >= len){
570
+ if(!isWEBVTT){
571
+ webshims.error('please use WebVTT format. This is the standard');
572
+ }
573
+ complete(track.cues);
574
+ }
575
+ };
576
+
577
+ captionData = captionData.replace(/\r\n/g,"\n");
578
+
579
+ setTimeout(function(){
580
+ captionData = captionData.replace(/\r/g,"\n");
581
+ setTimeout(function(){
582
+ startDate = new Date().getTime();
583
+ captionData = captionData.split(/\n\n+/g);
584
+ lazyProcess(0, captionData.length);
585
+ }, 9);
586
+ }, 9);
587
+
588
+ } else {
589
+ webshims.error("Required parameter captionData not supplied.");
590
+ }
591
+ };
592
+
593
+
594
+ mediaelement.createTrackList = function(mediaelem, baseData){
595
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
596
+ if(!baseData.textTracks){
597
+ baseData.textTracks = [];
598
+ webshims.defineProperties(baseData.textTracks, {
599
+ onaddtrack: {value: null},
600
+ onremovetrack: {value: null}
601
+ });
602
+ createEventTarget(baseData.textTracks);
603
+ }
604
+ return baseData.textTracks;
605
+ };
606
+
607
+ if(!Modernizr.track){
608
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
609
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
610
+
611
+ webshims.defineNodeNameProperties('track', {
612
+ src: {
613
+ //attr: {},
614
+ reflect: true,
615
+ propType: 'src'
616
+ }
617
+ });
618
+ }
619
+
620
+ webshims.defineNodeNameProperties('track', {
621
+ kind: {
622
+ attr: Modernizr.track ? {
623
+ set: function(value){
624
+ var trackData = webshims.data(this, 'trackData');
625
+ this.setAttribute('data-kind', value);
626
+ if(trackData){
627
+ trackData.attrKind = value;
628
+ }
629
+ },
630
+ get: function(){
631
+ var trackData = webshims.data(this, 'trackData');
632
+ if(trackData && ('attrKind' in trackData)){
633
+ return trackData.attrKind;
634
+ }
635
+ return this.getAttribute('kind');
636
+ }
637
+ } : {},
638
+ reflect: true,
639
+ propType: 'enumarated',
640
+ defaultValue: 'subtitles',
641
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
642
+ }
643
+ });
644
+
645
+ $.each(copyProps, function(i, copyProp){
646
+ var name = copyName[copyProp] || copyProp;
647
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
648
+ var trackData = webshims.data(this, 'trackData');
649
+ var track = this;
650
+ if(trackData){
651
+ if(copyProp == 'kind'){
652
+ refreshTrack(this, trackData);
653
+ }
654
+ if(!supportTrackMod){
655
+ trackData.track[name] = $.prop(this, copyProp);
656
+ }
657
+ clearTimeout(trackData.changedTrackPropTimer);
658
+ trackData.changedTrackPropTimer = setTimeout(function(){
659
+ $(track).trigger('updatesubtitlestate');
660
+ }, 1);
661
+ }
662
+ });
663
+ });
664
+
665
+
666
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
667
+ if(val){
668
+ var data = webshims.data(this, 'trackData');
669
+ var media;
670
+ if(data){
671
+ media = $(this).closest('video, audio');
672
+ if(media[0]){
673
+ mediaelement.loadTextTrack(media, this, data);
674
+ }
675
+ }
676
+ }
677
+
678
+ });
679
+
680
+ //
681
+
682
+ webshims.defineNodeNamesProperties(['track'], {
683
+ ERROR: {
684
+ value: 3
685
+ },
686
+ LOADED: {
687
+ value: 2
688
+ },
689
+ LOADING: {
690
+ value: 1
691
+ },
692
+ NONE: {
693
+ value: 0
694
+ },
695
+ readyState: {
696
+ get: function(){
697
+ return ($.prop(this, 'track') || {readyState: 0}).readyState;
698
+ },
699
+ writeable: false
700
+ },
701
+ track: {
702
+ get: function(){
703
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
704
+ },
705
+ writeable: false
706
+ }
707
+ }, 'prop');
708
+
709
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
710
+ textTracks: {
711
+ get: function(){
712
+ var media = this;
713
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
714
+ var tracks = mediaelement.createTrackList(media, baseData);
715
+ if(!baseData.blockTrackListUpdate){
716
+ updateMediaTrackList.call(media, baseData, tracks);
717
+ }
718
+ return tracks;
719
+ },
720
+ writeable: false
721
+ },
722
+ addTextTrack: {
723
+ value: function(kind, label, lang){
724
+ var textTrack = mediaelement.createTextTrack(this, {
725
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
726
+ label: label || '',
727
+ srclang: lang || ''
728
+ });
729
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
730
+ if (!baseData.scriptedTextTracks) {
731
+ baseData.scriptedTextTracks = [];
732
+ }
733
+ baseData.scriptedTextTracks.push(textTrack);
734
+ updateMediaTrackList.call(this);
735
+ return textTrack;
736
+ }
737
+ }
738
+ }, 'prop');
739
+
740
+
741
+ $(document).on('emptied ended updatetracklist', function(e){
742
+ if($(e.target).is('audio, video')){
743
+ var baseData = webshims.data(e.target, 'mediaelementBase');
744
+ if(baseData){
745
+ clearTimeout(baseData.updateTrackListTimer);
746
+ baseData.updateTrackListTimer = setTimeout(function(){
747
+ updateMediaTrackList.call(e.target, baseData);
748
+ }, 0);
749
+ }
750
+ }
751
+ });
752
+
753
+ var getNativeReadyState = function(trackElem, textTrack){
754
+ return textTrack.readyState || trackElem.readyState;
755
+ };
756
+ var stopOriginalEvent = function(e){
757
+ if(e.originalEvent){
758
+ e.stopImmediatePropagation();
759
+ }
760
+ };
761
+ var startTrackImplementation = function(){
762
+ if(webshims.implement(this, 'track')){
763
+ var shimedTrack = $.prop(this, 'track');
764
+ var origTrack = this.track;
765
+ var kind;
766
+ var readyState;
767
+ if(origTrack){
768
+ kind = $.prop(this, 'kind');
769
+ readyState = getNativeReadyState(this, origTrack);
770
+ if (origTrack.mode || readyState) {
771
+ shimedTrack.mode = numericModes[origTrack.mode] || origTrack.mode;
772
+ }
773
+ //disable track from showing + remove UI
774
+ if(kind != 'descriptions'){
775
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
776
+ this.kind = 'metadata';
777
+ $(this).attr({kind: kind});
778
+ }
779
+
780
+ }
781
+ $(this).on('load error', stopOriginalEvent);
782
+ }
783
+ };
784
+ webshims.addReady(function(context, insertedElement){
785
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
786
+ $('video, audio', context)
787
+ .add(insertedMedia)
788
+ .each(function(){
789
+ updateMediaTrackList.call(this);
790
+ })
791
+ .each(function(){
792
+ if(Modernizr.track){
793
+ var shimedTextTracks = $.prop(this, 'textTracks');
794
+ var origTextTracks = this.textTracks;
795
+ if(shimedTextTracks.length != origTextTracks.length){
796
+ webshims.error("textTracks couldn't be copied");
797
+ }
798
+
799
+ $('track', this).each(startTrackImplementation);
800
+ }
801
+ })
802
+ ;
803
+ insertedMedia.each(function(){
804
+ var media = this;
805
+ var baseData = webshims.data(media, 'mediaelementBase');
806
+ if(baseData){
807
+ clearTimeout(baseData.updateTrackListTimer);
808
+ baseData.updateTrackListTimer = setTimeout(function(){
809
+ updateMediaTrackList.call(media, baseData);
810
+ }, 9);
811
+ }
812
+ });
813
+ });
814
+
815
+ if(Modernizr.track){
816
+ $('video, audio').trigger('trackapichange');
817
+ }
818
+ });
819
+ (function($){
820
+ if(Modernizr.track && Modernizr.texttrackapi && document.addEventListener){
821
+ var trackOptions = webshims.cfg.track;
822
+ var trackListener = function(e){
823
+ $(e.target).filter('track').each(changeApi);
824
+ };
825
+ var trackBugs = webshims.bugs.track;
826
+ var changeApi = function(){
827
+ if(trackBugs || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
828
+ trackOptions.override = true;
829
+ webshims.reTest('track');
830
+ document.removeEventListener('error', trackListener, true);
831
+ if(this && $.nodeName(this, 'track')){
832
+ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
833
+ } else {
834
+ webshims.info("track support was overwritten. due to bad browser support");
835
+ }
836
+ return false;
837
+ }
838
+ };
839
+ var detectTrackError = function(){
840
+ document.addEventListener('error', trackListener, true);
841
+ if(trackBugs){
842
+ changeApi();
843
+ } else {
844
+ $('track').each(changeApi);
845
+ }
846
+ };
847
+ if(!trackOptions.override){
848
+ detectTrackError();
849
+ }
850
+ }
851
+ })(jQuery)
852
+ webshims.register('track-ui', function($, webshims, window, document, undefined){
853
+ "use strict";
854
+ var options = webshims.cfg.track;
855
+ var enterE = {type: 'enter'};
856
+ var exitE = {type: 'exit'};
857
+ //descriptions are not really shown, but they are inserted into the dom
858
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
859
+ var mediaelement = webshims.mediaelement;
860
+ var usesNativeTrack = function(){
861
+ return !options.override && Modernizr.track;
862
+ };
863
+
864
+ var trackDisplay = {
865
+ update: function(baseData, media){
866
+ if(!baseData.activeCues.length){
867
+ this.hide(baseData);
868
+ } else {
869
+ if(!compareArray(baseData.displayedActiveCues, baseData.activeCues)){
870
+ baseData.displayedActiveCues = baseData.activeCues;
871
+ if(!baseData.trackDisplay){
872
+ baseData.trackDisplay = $('<div class="cue-display"><span class="description-cues" aria-live="assertive" /></div>').insertAfter(media);
873
+ this.addEvents(baseData, media);
874
+ webshims.docObserve();
875
+ }
876
+
877
+ if(baseData.hasDirtyTrackDisplay){
878
+ media.triggerHandler('forceupdatetrackdisplay');
879
+ }
880
+ this.showCues(baseData);
881
+ }
882
+ }
883
+ },
884
+ showCues: function(baseData){
885
+ var element = $('<span class="cue-wrapper" />');
886
+ $.each(baseData.displayedActiveCues, function(i, cue){
887
+ var id = (cue.id) ? 'id="cue-id-'+cue.id +'"' : '';
888
+ var cueHTML = $('<span class="cue-line"><span '+ id+ ' class="cue" /></span>').find('span').html(cue.getCueAsHTML()).end();
889
+ if(cue.track.kind == 'descriptions'){
890
+ setTimeout(function(){
891
+ $('span.description-cues', baseData.trackDisplay).html(cueHTML);
892
+ }, 0);
893
+ } else {
894
+ element.prepend(cueHTML);
895
+ }
896
+ });
897
+ $('span.cue-wrapper', baseData.trackDisplay).remove();
898
+ baseData.trackDisplay.append(element);
899
+ },
900
+ addEvents: function(baseData, media){
901
+ if(options.positionDisplay){
902
+ var timer;
903
+ var positionDisplay = function(_force){
904
+ if(baseData.displayedActiveCues.length || _force === true){
905
+ baseData.trackDisplay.css({display: 'none'});
906
+ var uiElement = media.getShadowElement();
907
+ var offsetElement = uiElement.offsetParent();
908
+ var uiHeight = uiElement.innerHeight();
909
+ var uiWidth = uiElement.innerWidth();
910
+ var position = uiElement.position();
911
+ var displaySize = uiHeight * uiWidth;
912
+ baseData.trackDisplay.css({
913
+ left: position.left,
914
+ width: uiWidth,
915
+ height: uiHeight - 45,
916
+ top: position.top,
917
+ display: 'block'
918
+ });
919
+
920
+ baseData.trackDisplay.css('fontSize', Math.max(Math.round(uiHeight / 30), 7));
921
+ baseData.hasDirtyTrackDisplay = false;
922
+ } else {
923
+ baseData.hasDirtyTrackDisplay = true;
924
+ }
925
+ };
926
+ var delayed = function(e){
927
+ clearTimeout(timer);
928
+ timer = setTimeout(positionDisplay, 0);
929
+ };
930
+ var forceUpdate = function(){
931
+ positionDisplay(true);
932
+ };
933
+ media.on('playerdimensionchange mediaelementapichange updatetrackdisplay updatemediaelementdimensions swfstageresize', delayed);
934
+ media.on('forceupdatetrackdisplay', forceUpdate).onWSOff('updateshadowdom', delayed);
935
+ forceUpdate();
936
+ }
937
+ },
938
+ hide: function(baseData){
939
+ if(baseData.trackDisplay && baseData.displayedActiveCues.length){
940
+ baseData.displayedActiveCues = [];
941
+ $('span.cue-wrapper', baseData.trackDisplay).remove();
942
+ $('span.description-cues', baseData.trackDisplay).empty();
943
+ }
944
+ }
945
+ };
946
+
947
+ function compareArray(a1, a2){
948
+ var ret = true;
949
+ var i = 0;
950
+ var len = a1.length;
951
+ if(len != a2.length){
952
+ ret = false;
953
+ } else {
954
+ for(; i < len; i++){
955
+ if(a1[i] != a2[i]){
956
+ ret = false;
957
+ break;
958
+ }
959
+ }
960
+ }
961
+ return ret;
962
+ }
963
+
964
+ $.extend($.event.customEvent, {
965
+ updatetrackdisplay: true,
966
+ forceupdatetrackdisplay: true
967
+ });
968
+
969
+ mediaelement.trackDisplay = trackDisplay;
970
+
971
+ if(!mediaelement.createCueList){
972
+
973
+ var cueListProto = {
974
+ getCueById: function(id){
975
+ var cue = null;
976
+ for(var i = 0, len = this.length; i < len; i++){
977
+ if(this[i].id === id){
978
+ cue = this[i];
979
+ break;
980
+ }
981
+ }
982
+ return cue;
983
+ }
984
+ };
985
+
986
+ mediaelement.createCueList = function(){
987
+ return $.extend([], cueListProto);
988
+ };
989
+ }
990
+
991
+ mediaelement.getActiveCue = function(track, media, time, baseData){
992
+ if(!track._lastFoundCue){
993
+ track._lastFoundCue = {index: 0, time: 0};
994
+ }
995
+
996
+ if(Modernizr.track && !options.override && !track._shimActiveCues){
997
+ track._shimActiveCues = mediaelement.createCueList();
998
+ }
999
+
1000
+ var i = 0;
1001
+ var len;
1002
+ var cue;
1003
+
1004
+ for(; i < track.shimActiveCues.length; i++){
1005
+ cue = track.shimActiveCues[i];
1006
+ if(cue.startTime > time || cue.endTime < time){
1007
+ track.shimActiveCues.splice(i, 1);
1008
+ i--;
1009
+ if(cue.pauseOnExit){
1010
+ $(media).pause();
1011
+ }
1012
+ $(track).triggerHandler('cuechange');
1013
+ $(cue).triggerHandler('exit');
1014
+ } else if(track.mode == 'showing' && showTracks[track.kind] && $.inArray(cue, baseData.activeCues) == -1){
1015
+ baseData.activeCues.push(cue);
1016
+ }
1017
+ }
1018
+
1019
+
1020
+ len = track.cues.length;
1021
+ i = track._lastFoundCue.time < time ? track._lastFoundCue.index : 0;
1022
+
1023
+ for(; i < len; i++){
1024
+ cue = track.cues[i];
1025
+
1026
+ if(cue.startTime <= time && cue.endTime >= time && $.inArray(cue, track.shimActiveCues) == -1){
1027
+ track.shimActiveCues.push(cue);
1028
+ if(track.mode == 'showing' && showTracks[track.kind]){
1029
+ baseData.activeCues.push(cue);
1030
+ }
1031
+ $(track).triggerHandler('cuechange');
1032
+ $(cue).triggerHandler('enter');
1033
+
1034
+ track._lastFoundCue.time = time;
1035
+ track._lastFoundCue.index = i;
1036
+
1037
+
1038
+ }
1039
+ if(cue.startTime > time){
1040
+ break;
1041
+ }
1042
+ }
1043
+ };
1044
+
1045
+ if(usesNativeTrack()){
1046
+ (function(){
1047
+ var block;
1048
+ var triggerDisplayUpdate = function(elem){
1049
+ setTimeout(function(){
1050
+ block = true;
1051
+ $(elem).triggerHandler('updatetrackdisplay');
1052
+ block = false;
1053
+ }, 9);
1054
+ };
1055
+
1056
+ var createUpdateFn = function(nodeName, prop, type){
1057
+ var superType = '_sup'+type;
1058
+ var desc = {prop: {}};
1059
+ var superDesc;
1060
+ desc.prop[type] = function(){
1061
+ if(!block && usesNativeTrack()){
1062
+ triggerDisplayUpdate($(this).closest('audio, video'));
1063
+ }
1064
+ return superDesc.prop[superType].apply(this, arguments);
1065
+ };
1066
+ superDesc = webshims.defineNodeNameProperty(nodeName, prop, desc);
1067
+ };
1068
+
1069
+ createUpdateFn('track', 'track', 'get');
1070
+
1071
+ ['audio', 'video'].forEach(function(nodeName){
1072
+ createUpdateFn(nodeName, 'textTracks', 'get');
1073
+ createUpdateFn('nodeName', 'addTextTrack', 'value');
1074
+ });
1075
+ })();
1076
+ }
1077
+
1078
+ webshims.addReady(function(context, insertedElement){
1079
+ $('video, audio', context)
1080
+ .add(insertedElement.filter('video, audio'))
1081
+ .filter(function(){
1082
+ return webshims.implement(this, 'trackui');
1083
+ })
1084
+ .each(function(){
1085
+ var elem = $(this);
1086
+
1087
+ var getDisplayCues = function(e){
1088
+ var track;
1089
+ var time;
1090
+
1091
+ if(!trackList || !baseData){
1092
+ trackList = elem.prop('textTracks');
1093
+ baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
1094
+ if(!baseData.displayedActiveCues){
1095
+ baseData.displayedActiveCues = [];
1096
+ }
1097
+ }
1098
+
1099
+ if (!trackList){return;}
1100
+ time = elem.prop('currentTime');
1101
+
1102
+ if(!time && time !== 0){return;}
1103
+ baseData.activeCues = [];
1104
+ for(var i = 0, len = trackList.length; i < len; i++){
1105
+ track = trackList[i];
1106
+ if(track.mode != 'disabled' && track.cues && track.cues.length){
1107
+ mediaelement.getActiveCue(track, elem, time, baseData);
1108
+ }
1109
+ }
1110
+
1111
+ trackDisplay.update(baseData, elem);
1112
+
1113
+ };
1114
+ var onUpdate = function(e){
1115
+ clearTimeout(updateTimer);
1116
+ if(e && e.type == 'timeupdate'){
1117
+ getDisplayCues();
1118
+ setTimeout(onUpdate, 90);
1119
+ } else {
1120
+ updateTimer = setTimeout(getDisplayCues, 9);
1121
+ }
1122
+ };
1123
+
1124
+ var addTrackView = function(){
1125
+
1126
+ elem
1127
+ .off('.trackview')
1128
+ .on('play.trackview timeupdate.trackview updatetrackdisplay.trackview', onUpdate)
1129
+ ;
1130
+ };
1131
+ var baseData, trackList, updateTimer;
1132
+
1133
+ if(!usesNativeTrack()){
1134
+ addTrackView();
1135
+ } else {
1136
+ elem.on('mediaelementapichange trackapichange', function(){
1137
+ if(!usesNativeTrack() || elem.is('.nonnative-api-active')){
1138
+ addTrackView();
1139
+ } else {
1140
+ trackList = elem.prop('textTracks');
1141
+ baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
1142
+
1143
+ $.each(trackList, function(i, track){
1144
+ if(track._shimActiveCues){
1145
+ delete track._shimActiveCues;
1146
+ }
1147
+ });
1148
+ trackDisplay.hide(baseData);
1149
+ elem.unbind('.trackview');
1150
+ }
1151
+ });
1152
+ }
1153
+ })
1154
+ ;
1155
+ });
1156
+ });