webshims-rails 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
  4. data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
  5. data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
  6. data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
  7. data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
  8. data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
  9. data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
  10. data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
  11. data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
  12. data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
  13. data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
  14. data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
  15. data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
  18. data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
  21. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
  22. data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
  23. data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
  24. data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
  25. data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
  26. data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
  27. data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
  28. data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
  29. data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
  30. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
  31. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
  34. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
  35. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
  36. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
  37. data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
  38. data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
  42. data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
  43. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  44. data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
  45. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
  46. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
  47. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
  48. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
  49. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
  50. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
  52. data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
  53. metadata +8 -6
  54. data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
  55. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -1,1167 +0,0 @@
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
- })(webshims.$)
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.texttrackapi;
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
-
965
- mediaelement.trackDisplay = trackDisplay;
966
-
967
- if(!mediaelement.createCueList){
968
-
969
- var cueListProto = {
970
- getCueById: function(id){
971
- var cue = null;
972
- for(var i = 0, len = this.length; i < len; i++){
973
- if(this[i].id === id){
974
- cue = this[i];
975
- break;
976
- }
977
- }
978
- return cue;
979
- }
980
- };
981
-
982
- mediaelement.createCueList = function(){
983
- return $.extend([], cueListProto);
984
- };
985
- }
986
-
987
- mediaelement.getActiveCue = function(track, media, time, baseData){
988
- if(!track._lastFoundCue){
989
- track._lastFoundCue = {index: 0, time: 0};
990
- }
991
-
992
- if(Modernizr.texttrackapi && !options.override && !track._shimActiveCues){
993
- track._shimActiveCues = mediaelement.createCueList();
994
- }
995
-
996
- var i = 0;
997
- var len;
998
- var cue;
999
-
1000
- for(; i < track.shimActiveCues.length; i++){
1001
- cue = track.shimActiveCues[i];
1002
- if(cue.startTime > time || cue.endTime < time){
1003
- track.shimActiveCues.splice(i, 1);
1004
- i--;
1005
- if(cue.pauseOnExit){
1006
- $(media).pause();
1007
- }
1008
- $(track).triggerHandler('cuechange');
1009
- $(cue).triggerHandler('exit');
1010
- } else if(track.mode == 'showing' && showTracks[track.kind] && $.inArray(cue, baseData.activeCues) == -1){
1011
- baseData.activeCues.push(cue);
1012
- }
1013
- }
1014
-
1015
-
1016
- len = track.cues.length;
1017
- i = track._lastFoundCue.time < time ? track._lastFoundCue.index : 0;
1018
-
1019
- for(; i < len; i++){
1020
- cue = track.cues[i];
1021
-
1022
- if(cue.startTime <= time && cue.endTime >= time && $.inArray(cue, track.shimActiveCues) == -1){
1023
- track.shimActiveCues.push(cue);
1024
- if(track.mode == 'showing' && showTracks[track.kind]){
1025
- baseData.activeCues.push(cue);
1026
- }
1027
- $(track).triggerHandler('cuechange');
1028
- $(cue).triggerHandler('enter');
1029
-
1030
- track._lastFoundCue.time = time;
1031
- track._lastFoundCue.index = i;
1032
-
1033
-
1034
- }
1035
- if(cue.startTime > time){
1036
- break;
1037
- }
1038
- }
1039
- };
1040
-
1041
- if(usesNativeTrack()){
1042
- (function(){
1043
- var block;
1044
- var triggerDisplayUpdate = function(elem){
1045
- setTimeout(function(){
1046
- block = true;
1047
- $(elem).triggerHandler('updatetrackdisplay');
1048
- block = false;
1049
- }, 9);
1050
- };
1051
-
1052
- var createUpdateFn = function(nodeName, prop, type){
1053
- var superType = '_sup'+type;
1054
- var desc = {prop: {}};
1055
- var superDesc;
1056
- desc.prop[type] = function(){
1057
- if(!block && usesNativeTrack()){
1058
- triggerDisplayUpdate($(this).closest('audio, video'));
1059
- }
1060
- return superDesc.prop[superType].apply(this, arguments);
1061
- };
1062
- superDesc = webshims.defineNodeNameProperty(nodeName, prop, desc);
1063
- };
1064
-
1065
- createUpdateFn('track', 'track', 'get');
1066
-
1067
- ['audio', 'video'].forEach(function(nodeName){
1068
- createUpdateFn(nodeName, 'textTracks', 'get');
1069
- createUpdateFn('nodeName', 'addTextTrack', 'value');
1070
- });
1071
- })();
1072
- $.propHooks.activeCues = {
1073
- get: function(obj, value){
1074
- return obj._shimActiveCues || obj.activeCues;
1075
- }
1076
- };
1077
- }
1078
-
1079
- webshims.addReady(function(context, insertedElement){
1080
- $('video, audio', context)
1081
- .add(insertedElement.filter('video, audio'))
1082
- .filter(function(){
1083
- return webshims.implement(this, 'trackui');
1084
- })
1085
- .each(function(){
1086
- var baseData, trackList, updateTimer, updateTimer2;
1087
-
1088
- var elem = $(this);
1089
- var getDisplayCues = function(e){
1090
- var track;
1091
- var time;
1092
-
1093
- if(!trackList || !baseData){
1094
- trackList = elem.prop('textTracks');
1095
- baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
1096
- if(!baseData.displayedActiveCues){
1097
- baseData.displayedActiveCues = [];
1098
- }
1099
- }
1100
-
1101
- if (!trackList){return;}
1102
- time = elem.prop('currentTime');
1103
-
1104
- if(!time && time !== 0){return;}
1105
- baseData.activeCues = [];
1106
- for(var i = 0, len = trackList.length; i < len; i++){
1107
- track = trackList[i];
1108
- if(track.mode != 'disabled' && track.cues && track.cues.length){
1109
- mediaelement.getActiveCue(track, elem, time, baseData);
1110
- }
1111
- }
1112
-
1113
- trackDisplay.update(baseData, elem);
1114
-
1115
- };
1116
- var onUpdate = function(e){
1117
- clearTimeout(updateTimer);
1118
- if(e && e.type == 'timeupdate'){
1119
- getDisplayCues();
1120
- updateTimer2 = setTimeout(onUpdate, 90);
1121
- } else {
1122
- updateTimer = setTimeout(getDisplayCues, 9);
1123
- }
1124
- };
1125
- var addTrackView = function(){
1126
-
1127
- elem
1128
- .off('.trackview')
1129
- .on('play.trackview timeupdate.trackview updatetrackdisplay.trackview', onUpdate)
1130
- ;
1131
- };
1132
-
1133
- elem.on('remove', function(e){
1134
- if(!e.originalEvent && baseData && baseData.trackDisplay){
1135
- setTimeout(function(){
1136
- baseData.trackDisplay.remove();
1137
- }, 4);
1138
- }
1139
- });
1140
-
1141
- if(!usesNativeTrack()){
1142
- addTrackView();
1143
- } else {
1144
- elem.on('mediaelementapichange trackapichange', function(){
1145
- if(!usesNativeTrack() || elem.is('.nonnative-api-active')){
1146
- addTrackView();
1147
- } else {
1148
- clearTimeout(updateTimer);
1149
- clearTimeout(updateTimer2);
1150
-
1151
- trackList = elem.prop('textTracks');
1152
- baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
1153
-
1154
- $.each(trackList, function(i, track){
1155
- if(track._shimActiveCues){
1156
- delete track._shimActiveCues;
1157
- }
1158
- });
1159
- trackDisplay.hide(baseData);
1160
- elem.unbind('.trackview');
1161
- }
1162
- });
1163
- }
1164
- })
1165
- ;
1166
- });
1167
- });