webshims-rails 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
- });