wai-website-theme 1.3.1 → 1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/_includes/different.html +2 -1
- data/_includes/external.html +2 -1
- data/_includes/header.html +2 -1
- data/_includes/menuitem.html +6 -2
- data/_includes/peoplelist.html +21 -0
- data/_includes/prevnext-navigation.html +56 -0
- data/_includes/{prevnext.html → prevnext-order.html} +9 -0
- data/_includes/translation-note-msg.html +5 -3
- data/_includes/video-player.html +2 -2
- data/_layouts/default.html +8 -1
- data/_layouts/news.html +7 -1
- data/_layouts/policy.html +7 -1
- data/_layouts/sidenav.html +8 -1
- data/_layouts/sidenavsidebar.html +8 -1
- data/assets/ableplayer/Gruntfile.js +2 -1
- data/assets/ableplayer/README.md +158 -85
- data/assets/ableplayer/build/ableplayer.dist.js +15445 -13823
- data/assets/ableplayer/build/ableplayer.js +15445 -13823
- data/assets/ableplayer/build/ableplayer.min.css +1 -2
- data/assets/ableplayer/build/ableplayer.min.js +3 -10
- data/assets/ableplayer/package-lock.json +944 -346
- data/assets/ableplayer/package.json +8 -8
- data/assets/ableplayer/scripts/ableplayer-base.js +515 -524
- data/assets/ableplayer/scripts/browser.js +158 -158
- data/assets/ableplayer/scripts/buildplayer.js +1750 -1682
- data/assets/ableplayer/scripts/caption.js +424 -401
- data/assets/ableplayer/scripts/chapters.js +259 -259
- data/assets/ableplayer/scripts/control.js +1831 -1594
- data/assets/ableplayer/scripts/description.js +333 -256
- data/assets/ableplayer/scripts/dialog.js +145 -145
- data/assets/ableplayer/scripts/dragdrop.js +746 -749
- data/assets/ableplayer/scripts/event.js +875 -696
- data/assets/ableplayer/scripts/initialize.js +819 -912
- data/assets/ableplayer/scripts/langs.js +979 -743
- data/assets/ableplayer/scripts/metadata.js +124 -124
- data/assets/ableplayer/scripts/misc.js +170 -137
- data/assets/ableplayer/scripts/preference.js +904 -904
- data/assets/ableplayer/scripts/search.js +172 -172
- data/assets/ableplayer/scripts/sign.js +82 -78
- data/assets/ableplayer/scripts/slider.js +449 -448
- data/assets/ableplayer/scripts/track.js +409 -309
- data/assets/ableplayer/scripts/transcript.js +684 -595
- data/assets/ableplayer/scripts/translation.js +63 -67
- data/assets/ableplayer/scripts/ttml2webvtt.js +85 -85
- data/assets/ableplayer/scripts/vimeo.js +448 -0
- data/assets/ableplayer/scripts/volume.js +395 -380
- data/assets/ableplayer/scripts/vts.js +1077 -1077
- data/assets/ableplayer/scripts/webvtt.js +766 -763
- data/assets/ableplayer/scripts/youtube.js +695 -478
- data/assets/ableplayer/styles/ableplayer.css +54 -46
- data/assets/ableplayer/translations/nl.js +54 -54
- data/assets/ableplayer/translations/pt-br.js +311 -0
- data/assets/ableplayer/translations/tr.js +311 -0
- data/assets/ableplayer/translations/zh-tw.js +1 -1
- data/assets/css/style.css +1 -1
- data/assets/css/style.css.map +1 -1
- data/assets/images/icons.svg +5 -5
- data/assets/scripts/main.js +7 -0
- data/assets/search/tipuesearch.js +3 -3
- metadata +8 -3
@@ -1,915 +1,822 @@
|
|
1
1
|
(function ($) {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
// Workaround for non-supporting browsers is to remove default attribute
|
822
|
-
// We're doing that too in track.js > setupCaptions()
|
823
|
-
var textTracks = this.$media.get(0).textTracks;
|
824
|
-
if (textTracks) {
|
825
|
-
var i = 0;
|
826
|
-
while (i < textTracks.length) {
|
827
|
-
textTracks[i].mode = 'disabled';
|
828
|
-
i += 1;
|
829
|
-
}
|
830
|
-
}
|
831
|
-
};
|
832
|
-
|
833
|
-
AblePlayer.prototype.getPlayer = function() {
|
834
|
-
|
835
|
-
// Determine which player to use, if any
|
836
|
-
// return 'html5', 'jw' or null
|
837
|
-
var i, sourceType, $newItem;
|
838
|
-
if (this.youTubeId) {
|
839
|
-
if (this.mediaType !== 'video') {
|
840
|
-
// attempting to play a YouTube video using an element other than <video>
|
841
|
-
return null;
|
842
|
-
}
|
843
|
-
else {
|
844
|
-
return 'youtube';
|
845
|
-
}
|
846
|
-
}
|
847
|
-
else if (this.testFallback ||
|
848
|
-
((this.isUserAgent('msie 7') || this.isUserAgent('msie 8') || this.isUserAgent('msie 9')) && this.mediaType === 'video') ||
|
849
|
-
(this.isIOS() && (this.isIOS(4) || this.isIOS(5) || this.isIOS(6)))
|
850
|
-
) {
|
851
|
-
// the user wants to test the fallback player, or
|
852
|
-
// the user is using an older version of IE or IOS,
|
853
|
-
// both of which had buggy implementation of HTML5 video
|
854
|
-
if (this.fallback === 'jw') {
|
855
|
-
if (this.jwCanPlay()) {
|
856
|
-
return 'jw';
|
857
|
-
}
|
858
|
-
else {
|
859
|
-
// JW Player is available as fallback, but can't play this source file
|
860
|
-
return null;
|
861
|
-
}
|
862
|
-
}
|
863
|
-
else {
|
864
|
-
// browser doesn't support HTML5 video and there is no fallback player
|
865
|
-
return null;
|
866
|
-
}
|
867
|
-
}
|
868
|
-
else if (this.media.canPlayType) {
|
869
|
-
return 'html5';
|
870
|
-
}
|
871
|
-
else {
|
872
|
-
// Browser does not support the available media file
|
873
|
-
return null;
|
874
|
-
}
|
875
|
-
};
|
876
|
-
|
877
|
-
AblePlayer.prototype.jwCanPlay = function() {
|
878
|
-
// Determine whether there are media files that JW supports
|
879
|
-
var i, sourceType, $firstItem;
|
880
|
-
|
881
|
-
if (this.$sources.length > 0) { // this media has one or more <source> elements
|
882
|
-
for (i = 0; i < this.$sources.length; i++) {
|
883
|
-
sourceType = this.$sources[i].getAttribute('type');
|
884
|
-
if ((this.mediaType === 'video' && sourceType === 'video/mp4') ||
|
885
|
-
(this.mediaType === 'audio' && sourceType === 'audio/mpeg')) {
|
886
|
-
// JW Player can play this
|
887
|
-
return true;
|
888
|
-
}
|
889
|
-
}
|
890
|
-
}
|
891
|
-
// still here? That means there's no source that JW can play
|
892
|
-
// check for an mp3 or mp4 in a able-playlist
|
893
|
-
// TODO: Implement this more efficiently
|
894
|
-
// Playlist is initialized later in setupInstancePlaylist()
|
895
|
-
// but we can't wait for that...
|
896
|
-
if ($('.able-playlist')) {
|
897
|
-
// there's at least one playlist on this page
|
898
|
-
// get the first item from the first playlist
|
899
|
-
// if JW Player can play that one, assume it can play all items in all playlists
|
900
|
-
$firstItem = $('.able-playlist').eq(0).find('li').eq(0);
|
901
|
-
if (this.mediaType === 'audio') {
|
902
|
-
if ($firstItem.attr('data-mp3')) {
|
903
|
-
return true;
|
904
|
-
}
|
905
|
-
else if (this.mediaType === 'video') {
|
906
|
-
if ($firstItem.attr('data-mp4')) {
|
907
|
-
return true;
|
908
|
-
}
|
909
|
-
}
|
910
|
-
}
|
911
|
-
}
|
912
|
-
return false;
|
913
|
-
};
|
2
|
+
// Set default variable values.
|
3
|
+
AblePlayer.prototype.setDefaults = function () {
|
4
|
+
|
5
|
+
this.playerCreated = false; // will set to true after recreatePlayer() is complete the first time
|
6
|
+
this.playing = false; // will change to true after 'playing' event is triggered
|
7
|
+
this.paused = true; // will always be the opposite of this.playing (available for convenience)
|
8
|
+
this.clickedPlay = false; // will change to true temporarily if user clicks 'play' (or pause)
|
9
|
+
this.fullscreen = false; // will change to true if player is in full screen mode
|
10
|
+
this.swappingSrc = false; // will change to true temporarily while media source is being swapped
|
11
|
+
this.initializing = false; // will change to true temporarily while initPlayer() is processing
|
12
|
+
this.cueingPlaylistItems = false; // will change to true temporarily while cueing next playlist item
|
13
|
+
this.okToPlay = false; // will change to true if conditions are acceptible for automatic playback after media loads
|
14
|
+
|
15
|
+
this.getUserAgent();
|
16
|
+
this.setIconColor();
|
17
|
+
this.setButtonImages();
|
18
|
+
};
|
19
|
+
|
20
|
+
AblePlayer.prototype.getRootPath = function() {
|
21
|
+
|
22
|
+
// returns Able Player root path (assumes ableplayer.js is in /build, one directory removed from root)
|
23
|
+
var scripts, i, scriptSrc, scriptFile, fullPath, ablePath, parentFolderIndex, rootPath;
|
24
|
+
scripts= document.getElementsByTagName('script');
|
25
|
+
for (i=0; i < scripts.length; i++) {
|
26
|
+
scriptSrc = scripts[i].src;
|
27
|
+
scriptFile = scriptSrc.substr(scriptSrc.lastIndexOf('/'));
|
28
|
+
if (scriptFile.indexOf('ableplayer') !== -1) {
|
29
|
+
// this is the ableplayerscript
|
30
|
+
fullPath = scriptSrc.split('?')[0]; // remove any ? params
|
31
|
+
break;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
ablePath= fullPath.split('/').slice(0, -1).join('/'); // remove last filename part of path
|
35
|
+
parentFolderIndex = ablePath.lastIndexOf('/');
|
36
|
+
rootPath = ablePath.substring(0, parentFolderIndex) + '/';
|
37
|
+
return rootPath;
|
38
|
+
}
|
39
|
+
|
40
|
+
AblePlayer.prototype.setIconColor = function() {
|
41
|
+
|
42
|
+
// determine the best color choice (white or black) for icons,
|
43
|
+
// given the background-color of their container elements
|
44
|
+
// Source for relative luminance formula:
|
45
|
+
// https://en.wikipedia.org/wiki/Relative_luminance
|
46
|
+
|
47
|
+
// We need to know the color *before* creating the element
|
48
|
+
// so the element doesn't exist yet when this function is called
|
49
|
+
// therefore, need to create a temporary element then remove it after color is determined
|
50
|
+
// Temp element must be added to the DOM or WebKit can't retrieve its CSS properties
|
51
|
+
|
52
|
+
var $elements, i, $el, bgColor, rgb, red, green, blue, luminance, iconColor;
|
53
|
+
|
54
|
+
$elements = ['controller', 'toolbar'];
|
55
|
+
for (i=0; i<$elements.length; i++) {
|
56
|
+
if ($elements[i] == 'controller') {
|
57
|
+
$el = $('<div>', {
|
58
|
+
'class': 'able-controller'
|
59
|
+
}).hide();
|
60
|
+
}
|
61
|
+
else if ($elements[i] === 'toolbar') {
|
62
|
+
$el = $('<div>', {
|
63
|
+
'class': 'able-window-toolbar'
|
64
|
+
}).hide();
|
65
|
+
}
|
66
|
+
$('body').append($el);
|
67
|
+
bgColor = $el.css('background-color');
|
68
|
+
// bgColor is a string in the form 'rgb(R, G, B)', perhaps with a 4th item for alpha;
|
69
|
+
// split the 3 or 4 channels into an array
|
70
|
+
rgb = bgColor.replace(/[^\d,]/g, '').split(',');
|
71
|
+
red = rgb[0];
|
72
|
+
green = rgb[1];
|
73
|
+
blue = rgb[2];
|
74
|
+
luminance = (0.2126 * red) + (0.7152 * green) + (0.0722 * blue);
|
75
|
+
// range is 1 - 255; therefore 125 is the tipping point
|
76
|
+
if (luminance < 125) { // background is dark
|
77
|
+
iconColor = 'white';
|
78
|
+
}
|
79
|
+
else { // background is light
|
80
|
+
iconColor = 'black';
|
81
|
+
}
|
82
|
+
if ($elements[i] === 'controller') {
|
83
|
+
this.iconColor = iconColor;
|
84
|
+
}
|
85
|
+
else if ($elements[i] === 'toolbar') {
|
86
|
+
this.toolbarIconColor = iconColor;
|
87
|
+
}
|
88
|
+
$el.remove();
|
89
|
+
}
|
90
|
+
};
|
91
|
+
|
92
|
+
AblePlayer.prototype.setButtonImages = function() {
|
93
|
+
|
94
|
+
// NOTE: volume button images are now set dynamically within volume.js
|
95
|
+
this.imgPath = this.rootPath + 'button-icons/' + this.iconColor + '/';
|
96
|
+
this.playButtonImg = this.imgPath + 'play.png';
|
97
|
+
this.pauseButtonImg = this.imgPath + 'pause.png';
|
98
|
+
|
99
|
+
this.restartButtonImg = this.imgPath + 'restart.png';
|
100
|
+
|
101
|
+
this.rewindButtonImg = this.imgPath + 'rewind.png';
|
102
|
+
this.forwardButtonImg = this.imgPath + 'forward.png';
|
103
|
+
|
104
|
+
this.previousButtonImg = this.imgPath + 'previous.png';
|
105
|
+
this.nextButtonImg = this.imgPath + 'next.png';
|
106
|
+
|
107
|
+
if (this.speedIcons === 'arrows') {
|
108
|
+
this.fasterButtonImg = this.imgPath + 'slower.png';
|
109
|
+
this.slowerButtonImg = this.imgPath + 'faster.png';
|
110
|
+
}
|
111
|
+
else if (this.speedIcons === 'animals') {
|
112
|
+
this.fasterButtonImg = this.imgPath + 'rabbit.png';
|
113
|
+
this.slowerButtonImg = this.imgPath + 'turtle.png';
|
114
|
+
}
|
115
|
+
|
116
|
+
this.captionsButtonImg = this.imgPath + 'captions.png';
|
117
|
+
this.chaptersButtonImg = this.imgPath + 'chapters.png';
|
118
|
+
this.signButtonImg = this.imgPath + 'sign.png';
|
119
|
+
this.transcriptButtonImg = this.imgPath + 'transcript.png';
|
120
|
+
this.descriptionsButtonImg = this.imgPath + 'descriptions.png';
|
121
|
+
|
122
|
+
this.fullscreenExpandButtonImg = this.imgPath + 'fullscreen-expand.png';
|
123
|
+
this.fullscreenCollapseButtonImg = this.imgPath + 'fullscreen-collapse.png';
|
124
|
+
|
125
|
+
this.prefsButtonImg = this.imgPath + 'preferences.png';
|
126
|
+
this.helpButtonImg = this.imgPath + 'help.png';
|
127
|
+
};
|
128
|
+
|
129
|
+
AblePlayer.prototype.getSvgData = function(button) {
|
130
|
+
|
131
|
+
// returns array of values for creating <svg> tag for specified button
|
132
|
+
// 0 = <svg> viewBox attribute
|
133
|
+
// 1 = <path> d (description) attribute
|
134
|
+
var svg = Array();
|
135
|
+
|
136
|
+
switch (button) {
|
137
|
+
|
138
|
+
case 'play':
|
139
|
+
svg[0] = '0 0 16 20';
|
140
|
+
svg[1] = 'M0 18.393v-16.429q0-0.29 0.184-0.402t0.441 0.033l14.821 8.237q0.257 0.145 0.257 0.346t-0.257 0.346l-14.821 8.237q-0.257 0.145-0.441 0.033t-0.184-0.402z';
|
141
|
+
break;
|
142
|
+
|
143
|
+
case 'pause':
|
144
|
+
svg[0] = '0 0 20 20';
|
145
|
+
svg[1] = 'M0 18.036v-15.714q0-0.29 0.212-0.502t0.502-0.212h5.714q0.29 0 0.502 0.212t0.212 0.502v15.714q0 0.29-0.212 0.502t-0.502 0.212h-5.714q-0.29 0-0.502-0.212t-0.212-0.502zM10 18.036v-15.714q0-0.29 0.212-0.502t0.502-0.212h5.714q0.29 0 0.502 0.212t0.212 0.502v15.714q0 0.29-0.212 0.502t-0.502 0.212h-5.714q-0.29 0-0.502-0.212t-0.212-0.502z';
|
146
|
+
break;
|
147
|
+
|
148
|
+
case 'stop':
|
149
|
+
svg[0] = '0 0 20 20';
|
150
|
+
svg[1] = 'M0 18.036v-15.714q0-0.29 0.212-0.502t0.502-0.212h15.714q0.29 0 0.502 0.212t0.212 0.502v15.714q0 0.29-0.212 0.502t-0.502 0.212h-15.714q-0.29 0-0.502-0.212t-0.212-0.502z';
|
151
|
+
break;
|
152
|
+
|
153
|
+
case 'restart':
|
154
|
+
svg[0] = '0 0 20 20';
|
155
|
+
svg[1] = 'M18 8h-6l2.243-2.243c-1.133-1.133-2.64-1.757-4.243-1.757s-3.109 0.624-4.243 1.757c-1.133 1.133-1.757 2.64-1.757 4.243s0.624 3.109 1.757 4.243c1.133 1.133 2.64 1.757 4.243 1.757s3.109-0.624 4.243-1.757c0.095-0.095 0.185-0.192 0.273-0.292l1.505 1.317c-1.466 1.674-3.62 2.732-6.020 2.732-4.418 0-8-3.582-8-8s3.582-8 8-8c2.209 0 4.209 0.896 5.656 2.344l2.344-2.344v6z';
|
156
|
+
break;
|
157
|
+
|
158
|
+
case 'rewind':
|
159
|
+
svg[0] = '0 0 20 20';
|
160
|
+
svg[1] = 'M11.25 3.125v6.25l6.25-6.25v13.75l-6.25-6.25v6.25l-6.875-6.875z';
|
161
|
+
break;
|
162
|
+
|
163
|
+
case 'forward':
|
164
|
+
svg[0] = '0 0 20 20';
|
165
|
+
svg[1] = 'M10 16.875v-6.25l-6.25 6.25v-13.75l6.25 6.25v-6.25l6.875 6.875z';
|
166
|
+
break;
|
167
|
+
|
168
|
+
case 'previous':
|
169
|
+
svg[0] = '0 0 20 20';
|
170
|
+
svg[1] = 'M5 17.5v-15h2.5v6.875l6.25-6.25v13.75l-6.25-6.25v6.875z';
|
171
|
+
break;
|
172
|
+
|
173
|
+
case 'next':
|
174
|
+
svg[0] = '0 0 20 20';
|
175
|
+
svg[1] = 'M15 2.5v15h-2.5v-6.875l-6.25 6.25v-13.75l6.25 6.25v-6.875z';
|
176
|
+
break;
|
177
|
+
|
178
|
+
case 'slower':
|
179
|
+
svg[0] = '0 0 20 20';
|
180
|
+
svg[1] = 'M0 7.321q0-0.29 0.212-0.502t0.502-0.212h10q0.29 0 0.502 0.212t0.212 0.502-0.212 0.502l-5 5q-0.212 0.212-0.502 0.212t-0.502-0.212l-5-5q-0.212-0.212-0.212-0.502z';
|
181
|
+
break;
|
182
|
+
|
183
|
+
case 'faster':
|
184
|
+
svg[0] = '0 0 11 20';
|
185
|
+
svg[1] = 'M0 12.411q0-0.29 0.212-0.502l5-5q0.212-0.212 0.502-0.212t0.502 0.212l5 5q0.212 0.212 0.212 0.502t-0.212 0.502-0.502 0.212h-10q-0.29 0-0.502-0.212t-0.212-0.502z';
|
186
|
+
break;
|
187
|
+
|
188
|
+
case 'turtle':
|
189
|
+
svg[0] = '0 0 20 20';
|
190
|
+
svg[1] = 'M17.212 3.846c-0.281-0.014-0.549 0.025-0.817 0.144-1.218 0.542-1.662 2.708-2.163 3.942-1.207 2.972-7.090 4.619-11.755 5.216-0.887 0.114-1.749 0.74-2.428 1.466 0.82-0.284 2.126-0.297 2.74 0.144 0.007 0.488-0.376 1.062-0.625 1.37-0.404 0.5-0.398 0.793 0.12 0.793 0.473 0 0.752 0.007 1.635 0 0.393-0.003 0.618-0.16 1.49-1.49 3.592 0.718 5.986-0.264 5.986-0.264s0.407 1.755 1.418 1.755h1.49c0.633 0 0.667-0.331 0.625-0.433-0.448-1.082-0.68-1.873-0.769-2.5-0.263-1.857 0.657-3.836 2.524-5.457 0.585 0.986 2.253 0.845 2.909-0.096s0.446-2.268-0.192-3.221c-0.49-0.732-1.345-1.327-2.188-1.37zM8.221 4.663c-0.722-0.016-1.536 0.111-2.5 0.409-4.211 1.302-4.177 4.951-3.51 5.745 0 0-0.955 0.479-0.409 1.274 0.448 0.652 3.139 0.191 5.409-0.529s4.226-1.793 5.312-2.692c0.948-0.785 0.551-2.106-0.505-1.947-0.494-0.98-1.632-2.212-3.798-2.26zM18.846 5.962c0.325 0 0.577 0.252 0.577 0.577s-0.252 0.577-0.577 0.577c-0.325 0-0.577-0.252-0.577-0.577s0.252-0.577 0.577-0.577z';
|
191
|
+
break;
|
192
|
+
|
193
|
+
case 'rabbit':
|
194
|
+
svg[0] = '0 0 20 20';
|
195
|
+
svg[1] = 'M10.817 0c-2.248 0-1.586 0.525-1.154 0.505 1.551-0.072 5.199 0.044 6.851 2.428 0 0-1.022-2.933-5.697-2.933zM10.529 0.769c-2.572 0-2.837 0.51-2.837 1.106 0 0.545 1.526 0.836 2.524 0.697 2.778-0.386 4.231-0.12 5.264 0.865-1.010 0.779-0.75 1.401-1.274 1.851-1.093 0.941-2.643-0.673-4.976-0.673-2.496 0-4.712 1.92-4.712 4.76-0.157-0.537-0.769-0.913-1.442-0.913-0.974 0-1.514 0.637-1.514 1.49 0 0.769 1.13 1.791 2.861 0.938 0.499 1.208 2.265 1.364 2.452 1.418 0.538 0.154 1.875 0.098 1.875 0.865 0 0.794-1.034 1.094-1.034 1.707 0 1.070 1.758 0.873 2.284 1.034 1.683 0.517 2.103 1.214 2.788 2.212 0.771 1.122 2.572 1.408 2.572 0.625 0-3.185-4.413-4.126-4.399-4.135 0.608-0.382 2.139-1.397 2.139-3.534 0-1.295-0.703-2.256-1.755-2.861 1.256 0.094 2.572 1.205 2.572 2.74 0 1.877-0.653 2.823-0.769 2.957 1.975-1.158 3.193-3.91 3.029-6.37 0.61 0.401 1.27 0.577 1.971 0.625 0.751 0.052 1.475-0.225 1.635-0.529 0.38-0.723 0.162-2.321-0.12-2.837-0.763-1.392-2.236-1.73-3.606-1.683-1.202-1.671-3.812-2.356-5.529-2.356zM1.37 3.077l-0.553 1.538h3.726c0.521-0.576 1.541-1.207 2.284-1.538h-5.457zM18.846 5.192c0.325 0 0.577 0.252 0.577 0.577s-0.252 0.577-0.577 0.577c-0.325 0-0.577-0.252-0.577-0.577s0.252-0.577 0.577-0.577zM0.553 5.385l-0.553 1.538h3.197c0.26-0.824 0.586-1.328 0.769-1.538h-3.413z';
|
196
|
+
break;
|
197
|
+
|
198
|
+
case 'ellipsis':
|
199
|
+
svg[0] = '0 0 20 20';
|
200
|
+
svg[1] = 'M10.001 7.8c-1.215 0-2.201 0.985-2.201 2.2s0.986 2.2 2.201 2.2c1.215 0 2.199-0.985 2.199-2.2s-0.984-2.2-2.199-2.2zM3.001 7.8c-1.215 0-2.201 0.985-2.201 2.2s0.986 2.2 2.201 2.2c1.215 0 2.199-0.986 2.199-2.2s-0.984-2.2-2.199-2.2zM17.001 7.8c-1.215 0-2.201 0.985-2.201 2.2s0.986 2.2 2.201 2.2c1.215 0 2.199-0.985 2.199-2.2s-0.984-2.2-2.199-2.2z';
|
201
|
+
break;
|
202
|
+
|
203
|
+
case 'pipe':
|
204
|
+
svg[0] = '0 0 20 20';
|
205
|
+
svg[1] = 'M10.15 0.179h0.623c0.069 0 0.127 0.114 0.127 0.253v19.494c0 0.139-0.057 0.253-0.127 0.253h-1.247c-0.069 0-0.126-0.114-0.126-0.253v-19.494c0-0.139 0.057-0.253 0.126-0.253h0.623z';
|
206
|
+
break;
|
207
|
+
|
208
|
+
case 'captions':
|
209
|
+
svg[0] = '0 0 20 20';
|
210
|
+
svg[1] = 'M0.033 3.624h19.933v12.956h-19.933v-12.956zM18.098 10.045c-0.025-2.264-0.124-3.251-0.743-3.948-0.112-0.151-0.322-0.236-0.496-0.344-0.606-0.386-3.465-0.526-6.782-0.526s-6.313 0.14-6.907 0.526c-0.185 0.108-0.396 0.193-0.519 0.344-0.607 0.697-0.693 1.684-0.731 3.948 0.037 2.265 0.124 3.252 0.731 3.949 0.124 0.161 0.335 0.236 0.519 0.344 0.594 0.396 3.59 0.526 6.907 0.547 3.317-0.022 6.176-0.151 6.782-0.547 0.174-0.108 0.384-0.183 0.496-0.344 0.619-0.697 0.717-1.684 0.743-3.949v0 0zM9.689 9.281c-0.168-1.77-1.253-2.813-3.196-2.813-1.773 0-3.168 1.387-3.168 3.617 0 2.239 1.271 3.636 3.372 3.636 1.676 0 2.851-1.071 3.035-2.852h-2.003c-0.079 0.661-0.397 1.168-1.068 1.168-1.059 0-1.253-0.91-1.253-1.876 0-1.33 0.442-2.010 1.174-2.010 0.653 0 1.068 0.412 1.13 1.129h1.977zM16.607 9.281c-0.167-1.77-1.252-2.813-3.194-2.813-1.773 0-3.168 1.387-3.168 3.617 0 2.239 1.271 3.636 3.372 3.636 1.676 0 2.851-1.071 3.035-2.852h-2.003c-0.079 0.661-0.397 1.168-1.068 1.168-1.059 0-1.253-0.91-1.253-1.876 0-1.33 0.441-2.010 1.174-2.010 0.653 0 1.068 0.412 1.13 1.129h1.976z';
|
211
|
+
break;
|
212
|
+
|
213
|
+
case 'descriptions':
|
214
|
+
svg[0] = '0 0 20 20';
|
215
|
+
svg[1] = 'M17.623 3.57h-1.555c1.754 1.736 2.763 4.106 2.763 6.572 0 2.191-0.788 4.286-2.189 5.943h1.484c1.247-1.704 1.945-3.792 1.945-5.943-0-2.418-0.886-4.754-2.447-6.572v0zM14.449 3.57h-1.55c1.749 1.736 2.757 4.106 2.757 6.572 0 2.191-0.788 4.286-2.187 5.943h1.476c1.258-1.704 1.951-3.792 1.951-5.943-0-2.418-0.884-4.754-2.447-6.572v0zM11.269 3.57h-1.542c1.752 1.736 2.752 4.106 2.752 6.572 0 2.191-0.791 4.286-2.181 5.943h1.473c1.258-1.704 1.945-3.792 1.945-5.943 0-2.418-0.876-4.754-2.447-6.572v0zM10.24 9.857c0 3.459-2.826 6.265-6.303 6.265v0.011h-3.867v-12.555h3.896c3.477 0 6.274 2.806 6.274 6.279v0zM6.944 9.857c0-1.842-1.492-3.338-3.349-3.338h-0.876v6.686h0.876c1.858 0 3.349-1.498 3.349-3.348v0z';
|
216
|
+
break;
|
217
|
+
|
218
|
+
case 'sign':
|
219
|
+
svg[0] = '0 0 20 20';
|
220
|
+
svg[1] = 'M10.954 10.307c0.378 0.302 0.569 1.202 0.564 1.193 0.697 0.221 1.136 0.682 1.136 0.682 1.070-0.596 1.094-0.326 1.558-0.682 0.383-0.263 0.366-0.344 0.567-1.048 0.187-0.572-0.476-0.518-1.021-1.558-0.95 0.358-1.463 0.196-1.784 0.167-0.145-0.020-0.12 0.562-1.021 1.247zM14.409 17.196c-0.133 0.182-0.196 0.218-0.363 0.454-0.28 0.361 0.076 0.906 0.253 0.82 0.206-0.076 0.341-0.488 0.567-0.623 0.115-0.061 0.422-0.513 0.709-0.82 0.211-0.238 0.363-0.344 0.564-0.594 0.341-0.422 0.412-0.744 0.709-1.193 0.184-0.236 0.312-0.307 0.481-0.594 0.886-1.679 0.628-2.432 1.475-3.629 0.26-0.353 0.552-0.442 0.964-0.653 0.383-2.793-0.888-4.356-0.879-4.361-1.067 0.623-1.644 0.879-2.751 0.82-0.417-0.005-0.636-0.182-1.048-0.145-0.385 0.015-0.582 0.159-0.964 0.29-0.589 0.182-0.91 0.344-1.529 0.535-0.393 0.11-0.643 0.115-1.050 0.255-0.348 0.147-0.182 0.029-0.427 0.312-0.317 0.348-0.238 0.623-0.535 1.222-0.371 0.785-0.326 0.891-0.115 0.987-0.14 0.402-0.174 0.672-0.14 1.107 0.039 0.331-0.101 0.562 0.255 0.825 0.483 0.361 1.499 1.205 1.757 1.217 0.39-0.012 1.521 0.029 2.096-0.368 0.13-0.081 0.167-0.162 0.056 0.145-0.022 0.037-1.433 1.136-1.585 1.131-1.794 0.056-1.193 0.157-1.303 0.115-0.091 0-0.955-1.055-1.477-0.682-0.196 0.12-0.287 0.236-0.363 0.452 0.066 0.137 0.383 0.358 0.675 0.54 0.422 0.27 0.461 0.552 0.881 0.653 0.513 0.115 1.060 0.039 1.387 0.081 0.125 0.034 1.256-0.297 1.961-0.675 0.65-0.336-0.898 0.648-1.276 1.131-1.141 0.358-0.82 0.373-1.362 0.483-0.503 0.115-0.479 0.086-0.822 0.196-0.356 0.086-0.648 0.572-0.312 0.825 0.201 0.167 0.827-0.066 1.445-0.086 0.275-0.005 1.391-0.518 1.644-0.653 0.633-0.339 1.099-0.81 1.472-1.077 0.518-0.361-0.584 0.991-1.050 1.558zM8.855 9.799c-0.378-0.312-0.569-1.212-0.564-1.217-0.697-0.206-1.136-0.667-1.136-0.653-1.070 0.582-1.099 0.312-1.558 0.653-0.388 0.277-0.366 0.363-0.567 1.045-0.187 0.594 0.471 0.535 1.021 1.561 0.95-0.344 1.463-0.182 1.784-0.142 0.145 0.010 0.12-0.572 1.021-1.247zM5.4 2.911c0.133-0.191 0.196-0.228 0.368-0.454 0.27-0.371-0.081-0.915-0.253-0.849-0.211 0.096-0.346 0.508-0.599 0.653-0.093 0.052-0.4 0.503-0.682 0.82-0.211 0.228-0.363 0.334-0.564 0.599-0.346 0.407-0.412 0.729-0.709 1.161-0.184 0.258-0.317 0.324-0.481 0.621-0.886 1.669-0.631 2.422-1.475 3.6-0.26 0.38-0.552 0.461-0.964 0.682-0.383 2.788 0.883 4.346 0.879 4.336 1.068-0.609 1.639-0.861 2.751-0.825 0.417 0.025 0.636 0.201 1.048 0.174 0.385-0.025 0.582-0.169 0.964-0.285 0.589-0.196 0.91-0.358 1.499-0.54 0.422-0.12 0.672-0.125 1.080-0.285 0.348-0.128 0.182-0.010 0.427-0.282 0.312-0.358 0.238-0.633 0.508-1.217 0.398-0.8 0.353-0.906 0.142-0.991 0.135-0.412 0.174-0.677 0.14-1.107-0.044-0.336 0.101-0.572-0.255-0.82-0.483-0.375-1.499-1.22-1.752-1.222-0.395 0.002-1.526-0.039-2.101 0.339-0.13 0.101-0.167 0.182-0.056-0.11 0.022-0.052 1.433-1.148 1.585-1.163 1.794-0.039 1.193-0.14 1.303-0.088 0.091-0.007 0.955 1.045 1.477 0.682 0.191-0.13 0.287-0.245 0.368-0.452-0.071-0.147-0.388-0.368-0.68-0.537-0.422-0.282-0.464-0.564-0.881-0.655-0.513-0.125-1.065-0.049-1.387-0.11-0.125-0.015-1.256 0.317-1.956 0.68-0.66 0.351 0.893-0.631 1.276-1.136 1.136-0.339 0.81-0.353 1.36-0.479 0.501-0.101 0.476-0.071 0.82-0.172 0.351-0.096 0.648-0.577 0.312-0.849-0.206-0.152-0.827 0.081-1.44 0.086-0.28 0.020-1.396 0.533-1.649 0.677-0.633 0.329-1.099 0.8-1.472 1.048-0.523 0.38 0.584-0.967 1.050-1.529z';
|
221
|
+
break;
|
222
|
+
|
223
|
+
case 'mute':
|
224
|
+
svg[0] = '0 0 20 20';
|
225
|
+
svg[1] = 'M7.839 1.536c0.501-0.501 0.911-0.331 0.911 0.378v16.172c0 0.709-0.41 0.879-0.911 0.378l-4.714-4.713h-3.125v-7.5h3.125l4.714-4.714zM18.75 12.093v1.657h-1.657l-2.093-2.093-2.093 2.093h-1.657v-1.657l2.093-2.093-2.093-2.093v-1.657h1.657l2.093 2.093 2.093-2.093h1.657v1.657l-2.093 2.093z';
|
226
|
+
break;
|
227
|
+
|
228
|
+
case 'volume-mute':
|
229
|
+
svg[0] = '0 0 20 20';
|
230
|
+
svg[1] = 'M10.723 14.473c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 1.584-1.584 1.584-4.161 0-5.745-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c2.315 2.315 2.315 6.082 0 8.397-0.183 0.183-0.423 0.275-0.663 0.275zM7.839 1.536c0.501-0.501 0.911-0.331 0.911 0.378v16.172c0 0.709-0.41 0.879-0.911 0.378l-4.714-4.713h-3.125v-7.5h3.125l4.714-4.714z';
|
231
|
+
break;
|
232
|
+
|
233
|
+
case 'volume-medium':
|
234
|
+
svg[0] = '0 0 20 20';
|
235
|
+
svg[1] = 'M14.053 16.241c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 2.559-2.559 2.559-6.722 0-9.281-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c1.594 1.594 2.471 3.712 2.471 5.966s-0.878 4.373-2.471 5.966c-0.183 0.183-0.423 0.275-0.663 0.275zM10.723 14.473c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 1.584-1.584 1.584-4.161 0-5.745-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c2.315 2.315 2.315 6.082 0 8.397-0.183 0.183-0.423 0.275-0.663 0.275zM7.839 1.536c0.501-0.501 0.911-0.331 0.911 0.378v16.172c0 0.709-0.41 0.879-0.911 0.378l-4.714-4.713h-3.125v-7.5h3.125l4.714-4.714z';
|
236
|
+
break;
|
237
|
+
|
238
|
+
case 'volume-loud':
|
239
|
+
svg[0] = '0 0 21 20';
|
240
|
+
svg[1] = 'M17.384 18.009c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 1.712-1.712 2.654-3.988 2.654-6.408s-0.943-4.696-2.654-6.408c-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c2.066 2.066 3.204 4.813 3.204 7.734s-1.138 5.668-3.204 7.734c-0.183 0.183-0.423 0.275-0.663 0.275zM14.053 16.241c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 2.559-2.559 2.559-6.722 0-9.281-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c1.594 1.594 2.471 3.712 2.471 5.966s-0.878 4.373-2.471 5.966c-0.183 0.183-0.423 0.275-0.663 0.275zM10.723 14.473c-0.24 0-0.48-0.092-0.663-0.275-0.366-0.366-0.366-0.96 0-1.326 1.584-1.584 1.584-4.161 0-5.745-0.366-0.366-0.366-0.96 0-1.326s0.96-0.366 1.326 0c2.315 2.315 2.315 6.082 0 8.397-0.183 0.183-0.423 0.275-0.663 0.275zM7.839 1.536c0.501-0.501 0.911-0.331 0.911 0.378v16.172c0 0.709-0.41 0.879-0.911 0.378l-4.714-4.713h-3.125v-7.5h3.125l4.714-4.714z';
|
241
|
+
break;
|
242
|
+
|
243
|
+
case 'chapters':
|
244
|
+
svg[0] = '0 0 20 20';
|
245
|
+
svg[1] = 'M5 2.5v17.5l6.25-6.25 6.25 6.25v-17.5zM15 0h-12.5v17.5l1.25-1.25v-15h11.25z';
|
246
|
+
break;
|
247
|
+
|
248
|
+
case 'transcript':
|
249
|
+
svg[0] = '0 0 20 20';
|
250
|
+
svg[1] = 'M0 19.107v-17.857q0-0.446 0.313-0.759t0.759-0.313h8.929v6.071q0 0.446 0.313 0.759t0.759 0.313h6.071v11.786q0 0.446-0.313 0.759t-0.759 0.312h-15q-0.446 0-0.759-0.313t-0.313-0.759zM4.286 15.536q0 0.156 0.1 0.257t0.257 0.1h7.857q0.156 0 0.257-0.1t0.1-0.257v-0.714q0-0.156-0.1-0.257t-0.257-0.1h-7.857q-0.156 0-0.257 0.1t-0.1 0.257v0.714zM4.286 12.679q0 0.156 0.1 0.257t0.257 0.1h7.857q0.156 0 0.257-0.1t0.1-0.257v-0.714q0-0.156-0.1-0.257t-0.257-0.1h-7.857q-0.156 0-0.257 0.1t-0.1 0.257v0.714zM4.286 9.821q0 0.156 0.1 0.257t0.257 0.1h7.857q0.156 0 0.257-0.1t0.1-0.257v-0.714q0-0.156-0.1-0.257t-0.257-0.1h-7.857q-0.156 0-0.257 0.1t-0.1 0.257v0.714zM11.429 5.893v-5.268q0.246 0.156 0.402 0.313l4.554 4.554q0.156 0.156 0.313 0.402h-5.268z';
|
251
|
+
break;
|
252
|
+
|
253
|
+
case 'preferences':
|
254
|
+
svg[0] = '0 0 20 20';
|
255
|
+
svg[1] = 'M18.238 11.919c-1.049-1.817-0.418-4.147 1.409-5.205l-1.965-3.404c-0.562 0.329-1.214 0.518-1.911 0.518-2.1 0-3.803-1.714-3.803-3.828h-3.931c0.005 0.653-0.158 1.314-0.507 1.919-1.049 1.818-3.382 2.436-5.212 1.382l-1.965 3.404c0.566 0.322 1.056 0.793 1.404 1.396 1.048 1.815 0.42 4.139-1.401 5.2l1.965 3.404c0.56-0.326 1.209-0.513 1.902-0.513 2.094 0 3.792 1.703 3.803 3.808h3.931c-0.002-0.646 0.162-1.3 0.507-1.899 1.048-1.815 3.375-2.433 5.203-1.387l1.965-3.404c-0.562-0.322-1.049-0.791-1.395-1.391zM10 14.049c-2.236 0-4.050-1.813-4.050-4.049s1.813-4.049 4.050-4.049 4.049 1.813 4.049 4.049c-0 2.237-1.813 4.049-4.049 4.049z';
|
256
|
+
break;
|
257
|
+
|
258
|
+
case 'close':
|
259
|
+
svg[0] = '0 0 16 20';
|
260
|
+
svg[1] = 'M1.228 14.933q0-0.446 0.312-0.759l3.281-3.281-3.281-3.281q-0.313-0.313-0.313-0.759t0.313-0.759l1.518-1.518q0.313-0.313 0.759-0.313t0.759 0.313l3.281 3.281 3.281-3.281q0.313-0.313 0.759-0.313t0.759 0.313l1.518 1.518q0.313 0.313 0.313 0.759t-0.313 0.759l-3.281 3.281 3.281 3.281q0.313 0.313 0.313 0.759t-0.313 0.759l-1.518 1.518q-0.313 0.313-0.759 0.313t-0.759-0.313l-3.281-3.281-3.281 3.281q-0.313 0.313-0.759 0.313t-0.759-0.313l-1.518-1.518q-0.313-0.313-0.313-0.759z';
|
261
|
+
break;
|
262
|
+
|
263
|
+
case 'fullscreen-expand':
|
264
|
+
svg[0] = '0 0 20 20';
|
265
|
+
svg[1] = 'M0 18.036v-5q0-0.29 0.212-0.502t0.502-0.212 0.502 0.212l1.607 1.607 3.705-3.705q0.112-0.112 0.257-0.112t0.257 0.112l1.272 1.272q0.112 0.112 0.112 0.257t-0.112 0.257l-3.705 3.705 1.607 1.607q0.212 0.212 0.212 0.502t-0.212 0.502-0.502 0.212h-5q-0.29 0-0.502-0.212t-0.212-0.502zM8.717 8.393q0-0.145 0.112-0.257l3.705-3.705-1.607-1.607q-0.212-0.212-0.212-0.502t0.212-0.502 0.502-0.212h5q0.29 0 0.502 0.212t0.212 0.502v5q0 0.29-0.212 0.502t-0.502 0.212-0.502-0.212l-1.607-1.607-3.705 3.705q-0.112 0.112-0.257 0.112t-0.257-0.112l-1.272-1.272q-0.112-0.112-0.112-0.257z';
|
266
|
+
break;
|
267
|
+
|
268
|
+
case 'fullscreen-collapse':
|
269
|
+
svg[0] = '0 0 20 20';
|
270
|
+
svg[1] = 'M0.145 16.964q0-0.145 0.112-0.257l3.705-3.705-1.607-1.607q-0.212-0.212-0.212-0.502t0.212-0.502 0.502-0.212h5q0.29 0 0.502 0.212t0.212 0.502v5q0 0.29-0.212 0.502t-0.502 0.212-0.502-0.212l-1.607-1.607-3.705 3.705q-0.112 0.112-0.257 0.112t-0.257-0.112l-1.272-1.272q-0.112-0.112-0.112-0.257zM8.571 9.464v-5q0-0.29 0.212-0.502t0.502-0.212 0.502 0.212l1.607 1.607 3.705-3.705q0.112-0.112 0.257-0.112t0.257 0.112l1.272 1.272q0.112 0.112 0.112 0.257t-0.112 0.257l-3.705 3.705 1.607 1.607q0.212 0.212 0.212 0.502t-0.212 0.502-0.502 0.212h-5q-0.29 0-0.502-0.212t-0.212-0.502z';
|
271
|
+
break;
|
272
|
+
|
273
|
+
case 'help':
|
274
|
+
svg[0] = '0 0 11 20';
|
275
|
+
svg[1] = 'M0.577 6.317q-0.028-0.167 0.061-0.313 1.786-2.969 5.179-2.969 0.893 0 1.797 0.346t1.629 0.926 1.183 1.423 0.458 1.769q0 0.603-0.173 1.127t-0.391 0.854-0.614 0.664-0.642 0.485-0.681 0.396q-0.458 0.257-0.765 0.725t-0.307 0.748q0 0.19-0.134 0.363t-0.313 0.173h-2.679q-0.167 0-0.285-0.206t-0.117-0.419v-0.502q0-0.926 0.725-1.747t1.596-1.211q0.658-0.301 0.938-0.625t0.279-0.848q0-0.469-0.519-0.826t-1.2-0.357q-0.725 0-1.205 0.324-0.391 0.279-1.194 1.283-0.145 0.179-0.346 0.179-0.134 0-0.279-0.089l-1.83-1.395q-0.145-0.112-0.173-0.279zM3.786 16.875v-2.679q0-0.179 0.134-0.313t0.313-0.134h2.679q0.179 0 0.313 0.134t0.134 0.313v2.679q0 0.179-0.134 0.313t-0.313 0.134h-2.679q-0.179 0-0.313-0.134t-0.134-0.313z';
|
276
|
+
break;
|
277
|
+
}
|
278
|
+
|
279
|
+
return svg;
|
280
|
+
};
|
281
|
+
|
282
|
+
// Initialize player based on data on page.
|
283
|
+
// This sets some variables, but does not modify anything. Safe to call multiple times.
|
284
|
+
// Can call again after updating this.media so long as new media element has the same ID.
|
285
|
+
AblePlayer.prototype.reinitialize = function () {
|
286
|
+
|
287
|
+
var deferred, promise, thisObj, errorMsg, srcFile;
|
288
|
+
|
289
|
+
deferred = new $.Deferred();
|
290
|
+
promise = deferred.promise();
|
291
|
+
thisObj = this;
|
292
|
+
|
293
|
+
// if F12 Developer Tools aren't open in IE (through 9, no longer a problen in IE10)
|
294
|
+
// console.log causes an error - can't use debug without a console to log messages to
|
295
|
+
if (! window.console) {
|
296
|
+
this.debug = false;
|
297
|
+
}
|
298
|
+
|
299
|
+
this.startedPlaying = false;
|
300
|
+
// TODO: Move this setting to cookie.
|
301
|
+
this.autoScrollTranscript = true;
|
302
|
+
//this.autoScrollTranscript = this.getCookie(autoScrollTranscript); // (doesn't work)
|
303
|
+
|
304
|
+
// Bootstrap from this.media possibly being an ID or other selector.
|
305
|
+
this.$media = $(this.media).first();
|
306
|
+
this.media = this.$media[0];
|
307
|
+
|
308
|
+
// Set media type to 'audio' or 'video'; this determines some of the behavior of player creation.
|
309
|
+
if (this.$media.is('audio')) {
|
310
|
+
this.mediaType = 'audio';
|
311
|
+
}
|
312
|
+
else if (this.$media.is('video')) {
|
313
|
+
this.mediaType = 'video';
|
314
|
+
}
|
315
|
+
else {
|
316
|
+
// Able Player was initialized with some element other than <video> or <audio>
|
317
|
+
this.provideFallback();
|
318
|
+
deferred.fail();
|
319
|
+
return promise;
|
320
|
+
}
|
321
|
+
|
322
|
+
this.$sources = this.$media.find('source');
|
323
|
+
|
324
|
+
this.player = this.getPlayer();
|
325
|
+
if (!this.player) {
|
326
|
+
// an error was generated in getPlayer()
|
327
|
+
this.provideFallback();
|
328
|
+
}
|
329
|
+
this.setIconType();
|
330
|
+
this.setDimensions();
|
331
|
+
|
332
|
+
deferred.resolve();
|
333
|
+
return promise;
|
334
|
+
};
|
335
|
+
|
336
|
+
AblePlayer.prototype.setDimensions = function() {
|
337
|
+
// if media element includes width and height attributes,
|
338
|
+
// use these to set the max-width and max-height of the player
|
339
|
+
if (this.$media.attr('width') && this.$media.attr('height')) {
|
340
|
+
this.playerMaxWidth = parseInt(this.$media.attr('width'), 10);
|
341
|
+
this.playerMaxHeight = parseInt(this.$media.attr('height'), 10);
|
342
|
+
}
|
343
|
+
else if (this.$media.attr('width')) {
|
344
|
+
// media element includes a width attribute, but not height
|
345
|
+
this.playerMaxWidth = parseInt(this.$media.attr('width'), 10);
|
346
|
+
}
|
347
|
+
else {
|
348
|
+
// set width to width of #player
|
349
|
+
// don't set height though; YouTube will automatically set that to match width
|
350
|
+
this.playerMaxWidth = this.$media.parent().width();
|
351
|
+
this.playerMaxHeight = this.getMatchingHeight(this.playerMaxWidth);
|
352
|
+
}
|
353
|
+
// override width and height attributes with in-line CSS to make video responsive
|
354
|
+
this.$media.css({
|
355
|
+
'width': '100%',
|
356
|
+
'height': 'auto'
|
357
|
+
});
|
358
|
+
};
|
359
|
+
|
360
|
+
AblePlayer.prototype.getMatchingHeight = function(width) {
|
361
|
+
|
362
|
+
// returns likely height for a video, given width
|
363
|
+
// These calculations assume 16:9 aspect ratio (the YouTube standard)
|
364
|
+
// Videos recorded in other resolutions will be sized to fit, with black bars on each side
|
365
|
+
// This function is only called if the <video> element does not have width and height attributes
|
366
|
+
|
367
|
+
var widths, heights, closestWidth, closestIndex, closestHeight, height;
|
368
|
+
|
369
|
+
widths = [ 3840, 2560, 1920, 1280, 854, 640, 426 ];
|
370
|
+
heights = [ 2160, 1440, 1080, 720, 480, 360, 240 ];
|
371
|
+
closestWidth = null;
|
372
|
+
closestIndex = null;
|
373
|
+
|
374
|
+
$.each(widths, function(index){
|
375
|
+
if (closestWidth == null || Math.abs(this - width) < Math.abs(closestWidth - width)) {
|
376
|
+
closestWidth = this;
|
377
|
+
closestIndex = index;
|
378
|
+
}
|
379
|
+
});
|
380
|
+
closestHeight = heights[closestIndex];
|
381
|
+
this.aspectRatio = closestWidth / closestHeight;
|
382
|
+
height = Math.round(width / this.aspectRatio);
|
383
|
+
return height;
|
384
|
+
};
|
385
|
+
|
386
|
+
AblePlayer.prototype.setIconType = function() {
|
387
|
+
|
388
|
+
// returns either "svg", "font" or "image" (in descending order of preference)
|
389
|
+
// Test for support of each type. If not supported, test the next type.
|
390
|
+
// last resort is image icons
|
391
|
+
|
392
|
+
var $tempButton, $testButton, controllerFont;
|
393
|
+
|
394
|
+
if (this.forceIconType) {
|
395
|
+
// use value specified in data-icon-type
|
396
|
+
return false;
|
397
|
+
}
|
398
|
+
|
399
|
+
// test for SVG support
|
400
|
+
// Test this method widely; failed as expected on IE8 and below
|
401
|
+
// https://stackoverflow.com/a/27568129/744281
|
402
|
+
if (!!(document.createElementNS && document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect)) {
|
403
|
+
// browser supports SVG
|
404
|
+
this.iconType = 'svg';
|
405
|
+
}
|
406
|
+
else {
|
407
|
+
// browser does NOT support SVG
|
408
|
+
// test whether browser can support icon fonts, and whether user has overriding the default style sheet
|
409
|
+
// which could cause problems with proper display of the icon fonts
|
410
|
+
if (window.getComputedStyle) {
|
411
|
+
|
412
|
+
// webkit doesn't return calculated styles unless element has been added to the DOM
|
413
|
+
// and is visible (note: visibly clipped is considered "visible")
|
414
|
+
// use playpauseButton for font-family test if it exists; otherwise must create a new temp button
|
415
|
+
if ($('span.icon-play').length) {
|
416
|
+
$testButton = $('span.icon-play');
|
417
|
+
}
|
418
|
+
else {
|
419
|
+
$tempButton = $('<span>',{
|
420
|
+
'class': 'icon-play able-clipped'
|
421
|
+
});
|
422
|
+
$('body').append($tempButton);
|
423
|
+
$testButton = $tempButton;
|
424
|
+
}
|
425
|
+
|
426
|
+
// the following retrieves the computed value of font-family
|
427
|
+
// tested in Firefox 45.x with "Allow pages to choose their own fonts" unchecked - works!
|
428
|
+
// tested in Chrome 49.x with Font Changer plugin - works!
|
429
|
+
// tested in IE with user-defined style sheet enables - works!
|
430
|
+
// It does NOT account for users who have "ignore font styles on web pages" checked in IE
|
431
|
+
// There is no known way to check for that ???
|
432
|
+
controllerFont = window.getComputedStyle($testButton.get(0), null).getPropertyValue('font-family');
|
433
|
+
if (typeof controllerFont !== 'undefined') {
|
434
|
+
if (controllerFont.indexOf('able') !== -1) {
|
435
|
+
this.iconType = 'font';
|
436
|
+
}
|
437
|
+
else {
|
438
|
+
this.iconType = 'image';
|
439
|
+
}
|
440
|
+
}
|
441
|
+
else {
|
442
|
+
// couldn't get computed font-family; use images to be safe
|
443
|
+
this.iconType = 'image';
|
444
|
+
}
|
445
|
+
}
|
446
|
+
else { // window.getComputedStyle is not supported (IE 8 and earlier)
|
447
|
+
// No known way to detect computed font
|
448
|
+
// The following retrieves the value from the style sheet, not the computed font
|
449
|
+
// controllerFont = $tempButton.get(0).currentStyle.fontFamily;
|
450
|
+
// It will therefore return "able", even if the user is overriding that with a custom style sheet
|
451
|
+
// To be safe, use images
|
452
|
+
this.iconType = 'image';
|
453
|
+
}
|
454
|
+
if (this.debug) {
|
455
|
+
console.log('Using ' + this.iconType + 's for player controls');
|
456
|
+
}
|
457
|
+
if (typeof $tempButton !== 'undefined') {
|
458
|
+
$tempButton.remove();
|
459
|
+
}
|
460
|
+
}
|
461
|
+
};
|
462
|
+
|
463
|
+
// Perform one-time setup for this instance of player; called after player is first initialized.
|
464
|
+
AblePlayer.prototype.setupInstance = function () {
|
465
|
+
|
466
|
+
var deferred = new $.Deferred();
|
467
|
+
var promise = deferred.promise();
|
468
|
+
|
469
|
+
if (this.$media.attr('id')) {
|
470
|
+
this.mediaId = this.$media.attr('id');
|
471
|
+
}
|
472
|
+
else {
|
473
|
+
// Ensure the base media element always has an ID.
|
474
|
+
this.mediaId = "ableMediaId_" + this.ableIndex;
|
475
|
+
this.$media.attr('id', this.mediaId);
|
476
|
+
}
|
477
|
+
deferred.resolve();
|
478
|
+
return promise;
|
479
|
+
};
|
480
|
+
|
481
|
+
AblePlayer.prototype.setupInstancePlaylist = function() {
|
482
|
+
|
483
|
+
// find a matching playlist and set this.hasPlaylist
|
484
|
+
// if there is one, also set this.$playlist, this.playlistIndex, & this.playlistEmbed
|
485
|
+
var thisObj = this;
|
486
|
+
|
487
|
+
this.hasPlaylist = false; // will change to true if a matching playlist is found
|
488
|
+
|
489
|
+
$('.able-playlist').each(function() {
|
490
|
+
if ($(this).data('player') === thisObj.mediaId) {
|
491
|
+
// this is the playlist for the current player
|
492
|
+
thisObj.hasPlaylist = true;
|
493
|
+
// If using an embedded player, we'll replace $playlist with the clone later.
|
494
|
+
thisObj.$playlist = $(this).find('li');
|
495
|
+
|
496
|
+
// check to see if list item has YouTube as its source
|
497
|
+
// if it does, inject a thumbnail from YouTube
|
498
|
+
var $youTubeVideos = $(this).find('li[data-youtube-id]');
|
499
|
+
$youTubeVideos.each(function() {
|
500
|
+
var youTubeId = $(this).attr('data-youtube-id');
|
501
|
+
var youTubePoster = thisObj.getYouTubePosterUrl(youTubeId,'120');
|
502
|
+
var $youTubeImg = $('<img>',{
|
503
|
+
'src': youTubePoster,
|
504
|
+
'alt': ''
|
505
|
+
});
|
506
|
+
$(this).find('button').prepend($youTubeImg);
|
507
|
+
});
|
508
|
+
|
509
|
+
// add accessibility to the list markup
|
510
|
+
$(this).find('li span').attr('aria-hidden','true');
|
511
|
+
thisObj.playlistIndex = 0;
|
512
|
+
var dataEmbedded = $(this).data('embedded');
|
513
|
+
if (typeof dataEmbedded !== 'undefined' && dataEmbedded !== false) {
|
514
|
+
// embed playlist within player
|
515
|
+
thisObj.playlistEmbed = true;
|
516
|
+
}
|
517
|
+
else {
|
518
|
+
thisObj.playlistEmbed = false;
|
519
|
+
}
|
520
|
+
}
|
521
|
+
});
|
522
|
+
|
523
|
+
if (this.hasPlaylist && this.loop) {
|
524
|
+
// browser will loop the current track in the playlist, rather than the playlist
|
525
|
+
// therefore, need to remove loop attribute from media element
|
526
|
+
// but keep this.loop as true and handle the playlist looping ourselves
|
527
|
+
this.media.removeAttribute('loop');
|
528
|
+
}
|
529
|
+
if (this.hasPlaylist && this.playlistEmbed) {
|
530
|
+
// Copy the playlist out of the dom, so we can reinject when we build the player.
|
531
|
+
var parent = this.$playlist.parent();
|
532
|
+
this.$playlistDom = parent.clone();
|
533
|
+
parent.remove();
|
534
|
+
}
|
535
|
+
if (this.hasPlaylist && this.$sources.length === 0) {
|
536
|
+
// no source elements were provided. Construct them from the first playlist item
|
537
|
+
this.cuePlaylistItem(0);
|
538
|
+
// redefine this.$sources now that media contains one or more <source> elements
|
539
|
+
this.$sources = this.$media.find('source');
|
540
|
+
}
|
541
|
+
|
542
|
+
};
|
543
|
+
|
544
|
+
AblePlayer.prototype.recreatePlayer = function () {
|
545
|
+
|
546
|
+
// Creates the appropriate player for the current source.
|
547
|
+
var thisObj, prefsGroups, i;
|
548
|
+
thisObj = this;
|
549
|
+
|
550
|
+
// TODO: Ensure when recreating player that we carry over the mediaId
|
551
|
+
if (!this.player) {
|
552
|
+
console.log("Can't create player; no appropriate player type detected.");
|
553
|
+
return;
|
554
|
+
}
|
555
|
+
if (!this.playerCreated) {
|
556
|
+
// only call these functions once
|
557
|
+
this.loadCurrentPreferences();
|
558
|
+
this.injectPlayerCode();
|
559
|
+
}
|
560
|
+
|
561
|
+
// call all remaining functions each time a new media instance is loaded
|
562
|
+
|
563
|
+
this.initSignLanguage();
|
564
|
+
|
565
|
+
// thisObj.initializing = true;
|
566
|
+
this.initPlayer().then(function() { // initPlayer success
|
567
|
+
// thisObj.initializing = false;
|
568
|
+
|
569
|
+
thisObj.setupTracks().then(function() {
|
570
|
+
|
571
|
+
thisObj.setupAltCaptions().then(function() {
|
572
|
+
|
573
|
+
thisObj.setupTranscript().then(function() {
|
574
|
+
|
575
|
+
if (thisObj.Volume) {
|
576
|
+
thisObj.setMute(false);
|
577
|
+
}
|
578
|
+
thisObj.setFullscreen(false);
|
579
|
+
thisObj.setVolume(thisObj.defaultVolume);
|
580
|
+
|
581
|
+
if (thisObj.transcriptType) {
|
582
|
+
thisObj.addTranscriptAreaEvents();
|
583
|
+
thisObj.updateTranscript();
|
584
|
+
}
|
585
|
+
if (thisObj.mediaType === 'video') {
|
586
|
+
thisObj.initDescription();
|
587
|
+
}
|
588
|
+
if (thisObj.captions.length) {
|
589
|
+
thisObj.initDefaultCaption();
|
590
|
+
}
|
591
|
+
|
592
|
+
// setMediaAttributes() sets textTrack.mode to 'disabled' for all tracks
|
593
|
+
// This tells browsers to ignore the text tracks so Able Player can handle them
|
594
|
+
// However, timing is critical as browsers - especially Safari - tend to ignore this request
|
595
|
+
// unless it's sent late in the intialization process.
|
596
|
+
// If browsers ignore the request, the result is redundant captions
|
597
|
+
thisObj.setMediaAttributes();
|
598
|
+
thisObj.addControls();
|
599
|
+
thisObj.addEventListeners();
|
600
|
+
|
601
|
+
// inject each of the hidden forms that will be accessed from the Preferences popup menu
|
602
|
+
prefsGroups = thisObj.getPreferencesGroups();
|
603
|
+
for (i = 0; i < prefsGroups.length; i++) {
|
604
|
+
thisObj.injectPrefsForm(prefsGroups[i]);
|
605
|
+
}
|
606
|
+
thisObj.setupPopups();
|
607
|
+
thisObj.updateCaption();
|
608
|
+
thisObj.injectVTS();
|
609
|
+
if (thisObj.chaptersDivLocation) {
|
610
|
+
thisObj.populateChaptersDiv();
|
611
|
+
}
|
612
|
+
thisObj.showSearchResults();
|
613
|
+
|
614
|
+
// Go ahead and load media, without user requesting it
|
615
|
+
// Normally, we wait until user clicks play, rather than unnecessarily consume their bandwidth
|
616
|
+
// Exceptions are if the video is intended to autostart or if running on iOS (a workaround for iOS issues)
|
617
|
+
// TODO: Confirm that this is still necessary with iOS (this would added early, & I don't remember what the issues were)
|
618
|
+
if (thisObj.player === 'html5' &&
|
619
|
+
(thisObj.isIOS() || thisObj.startTime > 0 || thisObj.autoplay || thisObj.okToPlay)) {
|
620
|
+
thisObj.$media[0].load();
|
621
|
+
}
|
622
|
+
// refreshControls is called twice building/initializing the player
|
623
|
+
// this is the second. Best to pause a bit before executing, to be sure all prior steps are complete
|
624
|
+
setTimeout(function() {
|
625
|
+
thisObj.refreshControls('init');
|
626
|
+
},100);
|
627
|
+
},
|
628
|
+
function() { // initPlayer fail
|
629
|
+
thisObj.provideFallback();
|
630
|
+
});
|
631
|
+
});
|
632
|
+
});
|
633
|
+
});
|
634
|
+
};
|
635
|
+
|
636
|
+
AblePlayer.prototype.initPlayer = function () {
|
637
|
+
|
638
|
+
var thisObj = this;
|
639
|
+
var playerPromise;
|
640
|
+
|
641
|
+
// First run player specific initialization.
|
642
|
+
if (this.player === 'html5') {
|
643
|
+
playerPromise = this.initHtml5Player();
|
644
|
+
}
|
645
|
+
else if (this.player === 'youtube') {
|
646
|
+
playerPromise = this.initYouTubePlayer();
|
647
|
+
}
|
648
|
+
else if (this.player === 'vimeo') {
|
649
|
+
playerPromise = this.initVimeoPlayer();
|
650
|
+
}
|
651
|
+
|
652
|
+
// After player specific initialization is done, run remaining general initialization.
|
653
|
+
var deferred = new $.Deferred();
|
654
|
+
var promise = deferred.promise();
|
655
|
+
playerPromise.done(
|
656
|
+
function () { // done/resolved
|
657
|
+
if (thisObj.useFixedSeekInterval === false) {
|
658
|
+
thisObj.setSeekInterval();
|
659
|
+
}
|
660
|
+
deferred.resolve();
|
661
|
+
}
|
662
|
+
).fail(function () { // failed
|
663
|
+
deferred.reject();
|
664
|
+
}
|
665
|
+
);
|
666
|
+
|
667
|
+
return promise;
|
668
|
+
};
|
669
|
+
|
670
|
+
AblePlayer.prototype.setSeekInterval = function () {
|
671
|
+
|
672
|
+
// this function is only called if this.useFixedSeekInterval is false
|
673
|
+
// if this.useChapterTimes, this is called as each new chapter is loaded
|
674
|
+
// otherwise, it's called once, as the player is initialized
|
675
|
+
var thisObj, duration;
|
676
|
+
thisObj = this;
|
677
|
+
this.seekInterval = this.defaultSeekInterval;
|
678
|
+
|
679
|
+
if (this.useChapterTimes) {
|
680
|
+
duration = this.chapterDuration;
|
681
|
+
}
|
682
|
+
else {
|
683
|
+
duration = this.duration;
|
684
|
+
}
|
685
|
+
if (typeof duration === 'undefined' || duration < 1) {
|
686
|
+
// no duration; just use default for now but keep trying until duration is available
|
687
|
+
this.seekIntervalCalculated = false;
|
688
|
+
return;
|
689
|
+
}
|
690
|
+
else {
|
691
|
+
if (duration <= 20) {
|
692
|
+
this.seekInterval = 5; // 4 steps max
|
693
|
+
}
|
694
|
+
else if (duration <= 30) {
|
695
|
+
this.seekInterval = 6; // 5 steps max
|
696
|
+
}
|
697
|
+
else if (duration <= 40) {
|
698
|
+
this.seekInterval = 8; // 5 steps max
|
699
|
+
}
|
700
|
+
else if (duration <= 100) {
|
701
|
+
this.seekInterval = 10; // 10 steps max
|
702
|
+
}
|
703
|
+
else {
|
704
|
+
// never more than 10 steps from start to end
|
705
|
+
this.seekInterval = (duration / 10);
|
706
|
+
}
|
707
|
+
this.seekIntervalCalculated = true;
|
708
|
+
}
|
709
|
+
};
|
710
|
+
|
711
|
+
AblePlayer.prototype.initDefaultCaption = function () {
|
712
|
+
|
713
|
+
var captions, i;
|
714
|
+
|
715
|
+
captions = this.captions;
|
716
|
+
|
717
|
+
if (captions.length > 0) {
|
718
|
+
for (i=0; i<captions.length; i++) {
|
719
|
+
if (captions[i].def === true) {
|
720
|
+
this.captionLang = captions[i].language;
|
721
|
+
this.selectedCaptions = captions[i];
|
722
|
+
}
|
723
|
+
}
|
724
|
+
if (typeof this.captionLang === 'undefined') {
|
725
|
+
// No caption track was flagged as default
|
726
|
+
// find and use a caption language that matches the player language
|
727
|
+
for (i=0; i<captions.length; i++) {
|
728
|
+
if (captions[i].language === this.lang) {
|
729
|
+
this.captionLang = captions[i].language;
|
730
|
+
this.selectedCaptions = captions[i];
|
731
|
+
}
|
732
|
+
}
|
733
|
+
}
|
734
|
+
if (typeof this.captionLang === 'undefined') {
|
735
|
+
// Still no matching caption track
|
736
|
+
// just use the first track
|
737
|
+
this.captionLang = captions[0].language;
|
738
|
+
this.selectedCaptions = captions[0];
|
739
|
+
}
|
740
|
+
if (typeof this.captionLang !== 'undefined') {
|
741
|
+
// reset transcript selected <option> to this.captionLang
|
742
|
+
if (this.$transcriptLanguageSelect) {
|
743
|
+
this.$transcriptLanguageSelect.find('option[lang=' + this.captionLang + ']').prop('selected',true);
|
744
|
+
}
|
745
|
+
// sync all other tracks to this same languge
|
746
|
+
this.syncTrackLanguages('init',this.captionLang);
|
747
|
+
}
|
748
|
+
}
|
749
|
+
};
|
750
|
+
|
751
|
+
AblePlayer.prototype.initHtml5Player = function () {
|
752
|
+
// Nothing special to do!
|
753
|
+
var deferred = new $.Deferred();
|
754
|
+
var promise = deferred.promise();
|
755
|
+
deferred.resolve();
|
756
|
+
return promise;
|
757
|
+
};
|
758
|
+
|
759
|
+
// Sets media/track/source attributes; is called whenever player is recreated since $media may have changed.
|
760
|
+
AblePlayer.prototype.setMediaAttributes = function () {
|
761
|
+
// Firefox puts videos in tab order; remove.
|
762
|
+
this.$media.attr('tabindex', -1);
|
763
|
+
|
764
|
+
// Keep native player from displaying captions/subtitles by setting textTrack.mode='disabled'
|
765
|
+
// https://dev.w3.org/html5/spec-author-view/video.html#text-track-mode
|
766
|
+
// This *should* work but historically hasn't been supported in all browsers
|
767
|
+
// Workaround for non-supporting browsers is to remove default attribute
|
768
|
+
// We're doing that too in track.js > setupCaptions()
|
769
|
+
var textTracks = this.$media.get(0).textTracks;
|
770
|
+
if (textTracks) {
|
771
|
+
var i = 0;
|
772
|
+
while (i < textTracks.length) {
|
773
|
+
textTracks[i].mode = 'disabled';
|
774
|
+
i += 1;
|
775
|
+
}
|
776
|
+
}
|
777
|
+
};
|
778
|
+
|
779
|
+
AblePlayer.prototype.getPlayer = function() {
|
780
|
+
|
781
|
+
// Determine which player to use, if any
|
782
|
+
// return 'html5', 'youtube', 'vimeo', or null
|
783
|
+
|
784
|
+
var i, sourceType, $newItem;
|
785
|
+
if (this.youTubeId) {
|
786
|
+
if (this.mediaType !== 'video') {
|
787
|
+
// attempting to play a YouTube video using an element other than <video>
|
788
|
+
return null;
|
789
|
+
}
|
790
|
+
else {
|
791
|
+
return 'youtube';
|
792
|
+
}
|
793
|
+
}
|
794
|
+
else if (this.vimeoId) {
|
795
|
+
if (this.mediaType !== 'video') {
|
796
|
+
// attempting to play a Vimeo video using an element other than <video>
|
797
|
+
return null;
|
798
|
+
}
|
799
|
+
else {
|
800
|
+
return 'vimeo';
|
801
|
+
}
|
802
|
+
|
803
|
+
}
|
804
|
+
else if (this.testFallback ||
|
805
|
+
((this.isUserAgent('msie 7') || this.isUserAgent('msie 8') || this.isUserAgent('msie 9')) && this.mediaType === 'video') ||
|
806
|
+
(this.isIOS() && (this.isIOS(4) || this.isIOS(5) || this.isIOS(6)))
|
807
|
+
) {
|
808
|
+
// the user wants to test the fallback player, or
|
809
|
+
// the user is using an older version of IE or IOS,
|
810
|
+
// both of which had buggy implementation of HTML5 video
|
811
|
+
return null;
|
812
|
+
}
|
813
|
+
else if (this.media.canPlayType) {
|
814
|
+
return 'html5';
|
815
|
+
}
|
816
|
+
else {
|
817
|
+
// Browser does not support the available media file
|
818
|
+
return null;
|
819
|
+
}
|
820
|
+
};
|
914
821
|
|
915
822
|
})(jQuery);
|