webshims-rails 1.12.5 → 1.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +111 -132
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +40 -37
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +217 -36
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +151 -29
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +70 -93
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +70 -93
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +90 -13
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +202 -59
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +208 -70
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +151 -29
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +155 -30
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +79 -20
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +109 -47
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +79 -20
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +80 -87
  18. data/vendor/assets/javascripts/webshims/shims/combos/22.js +66 -83
  19. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -10
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +79 -20
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +66 -7
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +100 -25
  23. data/vendor/assets/javascripts/webshims/shims/combos/3.js +192 -47
  24. data/vendor/assets/javascripts/webshims/shims/combos/30.js +193 -49
  25. data/vendor/assets/javascripts/webshims/shims/combos/31.js +103 -36
  26. data/vendor/assets/javascripts/webshims/shims/combos/32.js +5 -3
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +1 -2
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2048 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +156 -20
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +151 -29
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +152 -31
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +199 -60
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +197 -58
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +218 -38
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +1004 -0
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +1283 -0
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +204 -1248
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +66 -7
  39. data/vendor/assets/javascripts/webshims/shims/es5.js +4 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-combat.js +3 -3
  41. data/vendor/assets/javascripts/webshims/shims/form-core.js +36 -27
  42. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +1 -2
  43. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +137 -0
  44. data/vendor/assets/javascripts/webshims/shims/form-message.js +90 -13
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +129 -15
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +9 -10
  47. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +886 -985
  48. data/vendor/assets/javascripts/webshims/shims/form-validation.js +78 -174
  49. data/vendor/assets/javascripts/webshims/shims/form-validators.js +39 -26
  50. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +45 -17
  51. data/vendor/assets/javascripts/webshims/shims/geolocation.js +10 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/b.js +71 -246
  53. data/vendor/assets/javascripts/webshims/shims/jme/c.js +133 -1002
  54. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +62 -23
  55. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +73 -10
  56. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +1117 -0
  57. data/vendor/assets/javascripts/webshims/shims/jme/p.js +603 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +5 -2
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -10
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -1
  61. data/vendor/assets/javascripts/webshims/shims/range-ui.js +22 -14
  62. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +29 -344
  63. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +362 -0
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +6 -483
  65. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +488 -0
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +2 -0
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +10 -2
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +6 -2
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +8 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +66 -83
  72. metadata +12 -5
  73. data/vendor/assets/javascripts/webshims/shims/$ajax.js +0 -862
  74. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2087
@@ -1,31 +1,17 @@
1
- webshims.register('jme', function($, webshims, window, doc, undefined, options){
1
+ webshims.register('jme', function($, webshims, window, doc, undefined){
2
2
  "use strict";
3
3
  var props = {};
4
-
5
4
  var fns = {};
6
- var allowPreload = false;
7
- $(window).on('load', function(){
8
- allowPreload = true;
9
- var scrollTimer;
10
- var allow = function(){
11
- allowPreload = true;
12
- };
13
- $(window).on('scroll', function(){
14
- allowPreload = false;
15
- clearTimeout(scrollTimer);
16
- scrollTimer = setTimeout(allow, 999);
17
- });
18
- });
5
+ var slice = Array.prototype.slice;
19
6
 
7
+ var options = $.extend({selector: '.mediaplayer'}, webshims.cfg.mediaelement.jme);
8
+ webshims.cfg.mediaelement.jme = options;
20
9
 
21
10
 
22
11
  $.jme = {
23
- version: '2.0.9',
24
- classNS: '',
25
- options: {},
26
12
  plugins: {},
27
13
  data: function(elem, name, value){
28
- var data = $(elem).data(ns+'jme') || $.data(elem, ns+'jme', {});
14
+ var data = $(elem).data('jme') || $.data(elem, 'jme', {});
29
15
  if(value === undefined){
30
16
  return (name) ? data[name] : data;
31
17
  } else {
@@ -40,6 +26,14 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
40
26
  if(!plugin.className){
41
27
  plugin.className = name;
42
28
  }
29
+
30
+ options[name] = $.extend(plugin.options || {}, options[name]);
31
+
32
+ if(options[name] && options[name].text){
33
+ plugin.text = options[name].text;
34
+ } else if(options.i18n && options.i18n[name]){
35
+ plugin.text = options.i18n[name];
36
+ }
43
37
  },
44
38
  defineMethod: function(name, fn){
45
39
  fns[name] = fn;
@@ -79,18 +73,6 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
79
73
  $.jme.data(elem, name, setValue);
80
74
  }
81
75
  }
82
- },
83
- setText: function(name, text){
84
- var obj = name;
85
- if(name && text){
86
- obj = {};
87
- obj[name] = text;
88
- }
89
- $.each(obj, function(name, text){
90
- if($.jme.plugins[name]){
91
- $.jme.plugins[name].text = text;
92
- }
93
- });
94
76
  }
95
77
  };
96
78
 
@@ -99,7 +81,7 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
99
81
  };
100
82
 
101
83
  $.fn.jmeFn = function(fn){
102
- var args = Array.prototype.slice.call( arguments, 1 );
84
+ var args = slice.call( arguments, 1 );
103
85
  var ret;
104
86
  this.each(function(){
105
87
  ret = (fns[fn] || $.prop(this, fn)).apply(this, args);
@@ -109,23 +91,21 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
109
91
  });
110
92
  return (ret !== undefined) ? ret : this;
111
93
  };
94
+ var idlStates = {
95
+ emptied: 1,
96
+ pause: 1
97
+ };
98
+ var unwaitingEvents = {
99
+ canplay: 1, canplaythrough: 1
100
+ };
112
101
 
113
102
 
114
- options = $.extend({selector: '.mediaplayer'}, webshims.cfg.mediaelement.jme);
115
- webshims.cfg.mediaelement.jme = options;
116
103
  var baseSelector = options.selector;
117
- var pluginSelectors = [];
118
- var ns = '';
119
-
120
104
 
121
105
  $.jme.initJME = function(context, insertedElement){
122
106
  $(baseSelector, context).add(insertedElement.filter(baseSelector)).jmePlayer();
123
107
  };
124
108
 
125
- var idlStates = {
126
- emptied: 1,
127
- pause: 1
128
- };
129
109
 
130
110
  $.jme.getDOMList = function(attr){
131
111
  var list = [];
@@ -146,81 +126,26 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
146
126
  return list;
147
127
  };
148
128
 
149
- webshims.ready('dom-support', function(){
150
- if($('<input />').prop('labels')){return;}
151
- webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
152
- prop: {
153
- get: function(){
154
- var labels = [];
155
- var id = this.id;
156
- if(id){
157
- labels = $('label[for="'+ id +'"]');
158
- }
159
- if(!labels[0]) {
160
- labels = $(this).closest('label', this.form);
161
- }
162
- return labels.get();
163
- },
164
- writeable: false
165
- }
166
- });
167
- });
168
-
169
129
 
170
130
  $.jme.getButtonText = function(button, classes){
171
-
172
- var btnTextElem = $('span.jme-text, +label span.jme-text', button);
173
- var btnLabelElem = button.prop('labels');
174
-
175
- btnLabelElem = (btnLabelElem && btnLabelElem[0]) ? $(btnLabelElem).eq(0) : false;
176
-
177
- if(!btnTextElem[0]){
178
- btnTextElem = btnLabelElem || button;
179
- }
180
-
181
- var txt = btnTextElem.text().split('/');
182
- var title = button.prop('title').split('/');
183
-
184
131
  var isCheckbox;
185
- var doText;
186
- var doTitle;
187
132
  var lastState;
188
133
  var txtChangeFn = function(state){
189
134
  if(lastState === state){return;}
190
135
  lastState = state;
191
- if(doText){
192
- btnTextElem.text(txt[state || 0]);
193
- }
194
- if(doTitle){
195
- button.prop('title', txt[state || 0]);
196
- if (btnLabelElem) {
197
- btnLabelElem.prop('title', txt[state || 0]);
198
- }
199
- }
200
136
 
201
- if(classes){
202
- button
203
- .removeClass(classes[(state) ? 0 : 1])
204
- .addClass(classes[state])
205
- ;
206
- }
137
+
138
+ button
139
+ .removeClass(classes[(state) ? 0 : 1])
140
+ .addClass(classes[state])
141
+ ;
142
+
207
143
  if(isCheckbox){
208
144
  button.prop('checked', !!state);
209
145
  (button.data('checkboxradio') || {refresh: $.noop}).refresh();
210
146
  }
211
147
  };
212
148
 
213
- if(txt.length == 2){
214
- txt[0] = txt[0].trim();
215
- txt[1] = txt[1].trim();
216
- doText = true;
217
- }
218
- if(title.length == 2){
219
- title[0] = title[0].trim();
220
- title[1] = title[1].trim();
221
- doTitle = true;
222
- }
223
-
224
149
  if (button.is('[type="checkbox"], [type="radio"]')){
225
150
  button.prop('checked', function(){
226
151
  return this.defaultChecked;
@@ -242,8 +167,8 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
242
167
  $.jme.data(this, $.extend(true, {}, opts));
243
168
  }
244
169
 
245
- var mediaUpdateFn, init, canPlay, removeCanPlay, canplayTimer, needPreload, playerSize;
246
- var media = $('audio, video', this).filter(':first');
170
+ var mediaUpdateFn, canPlay, removeCanPlay, canplayTimer, lastState, stopEmptiedEvent;
171
+ var media = $('audio, video', this).eq(0);
247
172
  var base = $(this);
248
173
 
249
174
  var jmeData = $.jme.data(this);
@@ -254,24 +179,29 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
254
179
  mediaData.player = base;
255
180
  mediaData.media = media;
256
181
  if(!jmeData.media){
257
- init = true;
258
- needPreload = !media.prop('autoplay');
259
182
 
260
183
  removeCanPlay = function(){
261
184
  media.off('canplay', canPlay);
262
185
  clearTimeout(canplayTimer);
263
186
  };
264
187
  canPlay = function(){
265
- var state = ($.prop(this, 'paused')) ? 'idle' : 'playing';
188
+ var state = (media.prop('paused')) ? 'idle' : 'playing';
266
189
  base.attr('data-state', state);
267
190
  };
268
191
  mediaUpdateFn = function(e){
269
192
  var state = e.type;
270
193
  var readyState;
271
194
  var paused;
272
-
273
195
  removeCanPlay();
274
196
 
197
+ if(unwaitingEvents[state] && lastState != 'waiting'){
198
+ return;
199
+ }
200
+
201
+ if(stopEmptiedEvent && state == 'emptied'){
202
+ return;
203
+ }
204
+
275
205
  if(state == 'ended' || $.prop(this, 'ended')){
276
206
  state = 'ended';
277
207
  } else if(state == 'waiting'){
@@ -304,51 +234,45 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
304
234
  if(state == 'idle' && base._seekpause){
305
235
  state = false;
306
236
  }
237
+
307
238
  if(state){
239
+ lastState = state;
308
240
  base.attr('data-state', state);
309
241
  }
310
242
  };
311
243
 
312
- playerSize = (function(){
313
- var lastSize;
314
- var sizes = [
315
- {size: 380, name: 'x-small'},
316
- {size: 490, name: 'small'},
317
- {size: 756, name: 'medium'},
318
- {size: 1024, name: 'large'}
319
- ];
320
-
321
- var len = sizes.length;
322
- return function(){
323
- var size = 'x-large';
324
- var i = 0;
325
- var width = base.outerWidth();
326
- for(; i < len; i++){
327
- if(sizes[i].size >= width){
328
- size = sizes[i].name;
329
- break;
330
- }
331
- }
332
- if(lastSize != size){
333
- lastSize = size;
334
- base.attr('data-playersize', size);
335
- }
336
- };
337
- })();
244
+
338
245
  jmeData.media = media;
339
246
  jmeData.player = base;
340
247
  media
341
- .on('ended', function(){
342
- removeCanPlay();
343
- media.jmeFn('pause');
344
- if(!media.prop('autoplay') && !media.prop('loop') && !media.hasClass('no-reload')){
345
- media.jmeFn('load');
346
- }
347
- })
248
+ .on('ended emptied play', (function(){
249
+ var timer;
250
+ var releaseEmptied = function(){
251
+ stopEmptiedEvent = false;
252
+ };
253
+ var ended = function(){
254
+ removeCanPlay();
255
+ media.jmeFn('pause');
256
+ if(!options.noReload && media.prop('ended') && media.prop('paused') && !media.prop('autoplay') && !media.prop('loop') && !media.hasClass('no-reload')){
257
+ stopEmptiedEvent = true;
258
+ media.jmeFn('load');
259
+ base.attr('data-state', 'ended');
260
+ setTimeout(releaseEmptied);
261
+
262
+ }
263
+ };
264
+ return function(e){
265
+
266
+ clearTimeout(timer);
267
+ if(e.type == 'ended' && !options.noReload && !media.prop('autoplay') && !media.prop('loop') && !media.hasClass('no-reload')){
268
+ timer = setTimeout(ended);
269
+ }
270
+ };
271
+ })())
348
272
  .on('emptied waiting canplay canplaythrough playing ended pause mediaerror', mediaUpdateFn)
349
273
  .on('volumechange updateJMEState', function(){
350
274
  var volume = $.prop(this, 'volume');
351
- base[!volume || $.prop(this, 'muted') ? 'addClass' : 'removeClass'](ns +'state-muted');
275
+ base[!volume || $.prop(this, 'muted') ? 'addClass' : 'removeClass']('state-muted');
352
276
 
353
277
  if(volume < 0.01){
354
278
  volume = 'no';
@@ -361,30 +285,8 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
361
285
  }
362
286
  base.attr('data-volume', volume);
363
287
  })
364
- .on('emptied', function(e){
365
- if(e.type == 'emptied'){
366
- needPreload = !media.prop('autoplay');
367
- }
368
- })
369
288
  ;
370
289
 
371
- base
372
- .on({
373
- useractive: function(){
374
- base.attr('data-useractivity', 'true');
375
- }
376
- })
377
- .on('userinactive', {idletime: 3500}, function(){
378
- base.attr('data-useractivity', 'false');
379
- })
380
- .triggerHandler('userinactive')
381
- ;
382
-
383
- playerSize();
384
- webshims.ready('dom-support', function(){
385
- base.onWSOff('updateshadowdom', playerSize);
386
- webshims.addShadowDom();
387
- });
388
290
  if(mediaUpdateFn){
389
291
  media.on('updateJMEState', mediaUpdateFn).triggerHandler('updateJMEState');
390
292
  }
@@ -472,8 +374,9 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
472
374
  var options = $.jme.data(this);
473
375
  options.player = data.player;
474
376
  options.media = data.media;
475
- if(options.rendered){return;}
476
- options.rendered = true;
377
+ if(options._rendered){return;}
378
+ options._rendered = true;
379
+
477
380
  if(plugin.options){
478
381
  $.each(plugin.options, function(option, value){
479
382
  if(!(option in options)){
@@ -493,114 +396,20 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
493
396
  });
494
397
 
495
398
 
496
-
497
-
498
- (function(){
499
- var activity = {
500
- add: function(elem, cfg, name){
501
- var data = $.data(elem, 'jmeuseractivity') || $.data(elem, 'jmeuseractivity', {idletime: 2500, idle: true, trigger: {}}),
502
- jElm = $(elem),
503
- setInactive = function(){
504
- if(!data.idle){
505
- data.idle = true;
506
- if ( data.trigger.userinactive ) {
507
- jElm.trigger('userinactive');
508
- }
509
- }
510
- },
511
- x, y,
512
- setActive = function(e){
513
- if(!e || (e.type === 'mousemove' && e.pageX === x && e.pageY === y)){return;}
514
- if(e.type === 'mousemove'){
515
- x = e.pageX;
516
- y = e.pageY;
517
- }
518
- if(data.idleTimer){
519
- clearTimeout(data.idleTimer);
520
- }
521
- data.idleTimer = setTimeout(setInactive, data.idletime);
522
- if(data.idle){
523
- data.idle = false;
524
- if( data.trigger.useractive ){
525
- jElm.trigger('useractive');
526
- }
527
- }
528
- }
529
- ;
530
-
531
- data.idletime = (cfg || {}).idletime || data.idletime;
532
- if(cfg && 'idle' in cfg){
533
- data.idle = cfg.idle;
534
- }
535
- data.trigger[name] = true;
536
-
537
- if(!data.bound){
538
- jElm
539
- .on('mouseleave.jmeuseractivity', setInactive)
540
- .on('mousemove.jmeuseractivity focusin.jmeuseractivity mouseenter.jmeuseractivity keydown.jmeuseractivity keyup.jmeuseractivity mousedown.jmeuseractivity', setActive)
541
- ;
542
- data.bound = true;
543
- }
544
- if(!data.idle){
545
- setActive({type: 'initunidled'});
546
- }
547
- },
548
- remove: function(elem, name){
549
- var data = $.data(elem, 'jmeuseractivity') || $.data(elem, 'jmeuseractivity', {idletime: 2500, idle: true, trigger: {}});
550
- data.trigger[name] = false;
551
- if(!data.trigger.useractive && !data.trigger.userinactive){
552
- $(elem).off('.jmeuseractivity');
553
- data.bound = false;
554
- }
555
- }
556
- };
557
- $.each(['useractive', 'userinactive'], function(i, name){
558
- $.event.special[name] = {
559
- setup: function(cfg){
560
- activity.add(this, cfg, name);
561
- },
562
- teardown: function(){
563
- activity.remove(this, name);
564
- }
565
- };
566
- });
567
- })();
568
-
569
-
570
- webshims.ready('mediaelement', function(){
571
- webshims.addReady($.jme.initJME);
572
- });
399
+ webshims.addReady($.jme.initJME);
400
+ webshims._polyfill(['mediaelement']);
573
401
  });
574
-
575
-
576
-
577
- ;webshims.register('mediacontrols', function($, webshims, window, doc, undefined, options){
402
+ ;webshims.register('mediacontrols', function($, webshims, window){
578
403
  "use strict";
579
404
  var pseudoClasses = 'pseudoClasses';
580
- var baseSelector = webshims.cfg.mediaelement.jme.selector;
581
-
582
- var playStates = {
583
- play: 1,
584
- playing: 1
585
- };
586
-
587
- var pauseStates = {
588
- pause: 1,
589
- ended: 1
590
- };
591
405
 
592
- var loadRange = function(){
593
- webshims.loader.loadList(['range-ui']);
594
- };
595
- var onSliderReady = function(fn){
596
- loadRange();
597
- webshims.ready('range-ui', fn);
598
- };
406
+ var options = webshims.cfg.mediaelement.jme;
407
+ var baseSelector = options.selector;
599
408
 
600
409
  var btnStructure = '<button class="{%class%}" type="button" aria-label="{%text%}"></button>';
601
- var defaultStructure = '<div class="{%class%}"></div>';
602
- var slideStructure = '<div class="{%class%}"></div>';
603
- var ns = $.jme.classNS;
410
+ var slideStructure = '<div class="{%class%} media-range"></div>';
411
+ var timeStructure = '<div class="{%class%}">00:00</div>';
412
+
604
413
  var noVolumeClass = (function(){
605
414
  var audio;
606
415
  var ret = '';
@@ -612,37 +421,131 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
612
421
  return ret;
613
422
  })();
614
423
 
424
+ var getBarHtml = (function(){
425
+ var cache = {};
426
+ var regTemplate = /\{\{(.+?)\}\}/igm;
427
+
428
+ return function(template, invalidCache){
429
+ if(!template){
430
+ template = options.barTemplate;
431
+ }
432
+ if(!cache[template] || invalidCache){
433
+ cache[template] = template.replace(regTemplate, function(match, matchName){
434
+ var plugin = $.jme.plugins[matchName];
435
+ if(plugin && plugin.structure){
436
+ return plugin.structure.replace('{%class%}', matchName).replace('{%text%}', plugin.text || '');
437
+ }
438
+ return match;
439
+ });
440
+ }
441
+
442
+ return cache[template] || '';
443
+ };
444
+ })();
445
+
446
+ var loadLazy = function(){
447
+ if(!loadLazy.loaded){
448
+ loadLazy.loaded = true;
449
+ webshims.loader.loadList(['mediacontrols-lazy', 'range-ui']);
450
+ }
451
+ };
452
+ var lazyLoadPlugin = function(fn){
453
+ if(!fn){
454
+ fn = '_create';
455
+ }
456
+ var rfn = function(c, media){
457
+ var obj = this;
458
+ var args = arguments;
459
+ loadLazy();
460
+ webshims.ready('mediacontrols-lazy', function(){
461
+ if(rfn != obj[fn] && $.data(media[0])){
462
+ return obj[fn].apply(obj, args);
463
+ } else {
464
+ webshims.error('stop too much recursion');
465
+ }
466
+ });
467
+ };
468
+ return rfn;
469
+ };
615
470
 
471
+ if(!options.barTemplate){
472
+ options.barTemplate = '<div class="play-pause-container">{{play-pause}}</div><div class="playlist-container"><div class="playlist-box">{{playlist-prev}}{{playlist-next}}</div></div><div class="currenttime-container">{{currenttime-display}}</div><div class="progress-container">{{time-slider}}</div><div class="duration-container">{{duration-display}}</div><div class="mute-container">{{mute-unmute}}</div><div class="volume-container">{{volume-slider}}</div><div class="subtitle-container"><div class="subtitle-controls">{{captions}}</div></div><div class="fullscreen-container">{{fullscreen}}</div>';
473
+ }
474
+ if(!options.barStructure){
475
+ options.barStructure = '<div class="jme-media-overlay"></div><div class="jme-controlbar'+ noVolumeClass +'" tabindex="-1"><div class="jme-cb-box"></div></div>';
476
+ }
616
477
 
478
+ webshims.loader.addModule('mediacontrols-lazy', {
479
+ src: 'jme/mediacontrols-lazy'
480
+ });
481
+
482
+ var userActivity = {
483
+ _create: lazyLoadPlugin()
484
+ };
485
+ $.jme.plugins.useractivity = userActivity;
617
486
 
618
487
  $.jme.defineProp('controlbar', {
619
488
  set: function(elem, value){
620
489
  value = !!value;
490
+ var controls, playerSize;
621
491
  var data = $.jme.data(elem);
622
492
  var controlBar = $('div.jme-mediaoverlay, div.jme-controlbar', data.player);
623
- var mediaControls = $.jme.plugins["media-controls"] ;
624
493
  var structure = '';
625
- var controls;
626
494
  if(value && !controlBar[0]){
627
495
  if(data._controlbar){
628
496
  data._controlbar.appendTo(data.player);
629
497
  } else {
630
498
  data.media.prop('controls', false);
631
- $.each(mediaControls.pluginOrder, function(i, name){
632
- var plugin = $.jme.plugins[name];
633
- if(plugin && plugin.structure){
634
- structure += plugin.structure.replace('{%class%}', ns+name).replace('{%text%}', plugin.text || '');
635
- } else if(name){
636
- structure += name;
637
- }
638
- });
639
- data._controlbar = $( mediaControls.barStructure );
640
- controlBar = data._controlbar.find('div.jme-cb-box').addClass(ns+'media-controls');
641
- controls = data._controlbar.filter('.jme-media-overlay').addClass(ns+'play-pause');
499
+
500
+ structure = getBarHtml();
501
+ data._controlbar = $( options.barStructure );
502
+ controlBar = data._controlbar.find('div.jme-cb-box').addClass('media-controls');
503
+ controls = data._controlbar.filter('.jme-media-overlay').addClass('play-pause');
642
504
  controls = controls.add( controlBar );
643
- controls = controls.add( $(structure).appendTo(controlBar) );
505
+ $(structure).appendTo(controlBar);
644
506
  data._controlbar.appendTo(data.player);
645
507
  data.player.jmeFn('addControls', controls);
508
+
509
+ playerSize = (function(){
510
+ var lastSize;
511
+ var sizes = [
512
+ {size: 290, name: 'xx-small'},
513
+ {size: 380, name: 'x-small'},
514
+ {size: 490, name: 'small'},
515
+ {size: 756, name: 'medium'},
516
+ {size: 1024, name: 'large'}
517
+ ];
518
+
519
+ var len = sizes.length;
520
+ return function(){
521
+ var size = 'x-large';
522
+ var i = 0;
523
+ var width = data.player.outerWidth();
524
+ var fSize = Math.max(parseInt(data.player.css('fontSize'), 10) || 16, 13);
525
+
526
+ width = width * (16 / fSize);
527
+ for(; i < len; i++){
528
+ if(sizes[i].size >= width){
529
+ size = sizes[i].name;
530
+ break;
531
+ }
532
+ }
533
+
534
+ if(lastSize != size){
535
+ lastSize = size;
536
+ data.player.attr('data-playersize', size);
537
+ }
538
+ };
539
+ })();
540
+
541
+
542
+ userActivity._create(data.player, data.media, data.player);
543
+
544
+ playerSize();
545
+ webshims.ready('dom-support', function(){
546
+ data.player.onWSOff('updateshadowdom', playerSize);
547
+ webshims.addShadowDom();
548
+ });
646
549
  }
647
550
 
648
551
  } else if(!value) {
@@ -654,426 +557,36 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
654
557
  }
655
558
  });
656
559
 
657
- $.jme.defineMethod('updateControlbar', function(){
658
- var timeSlider = $('.'+ $.jme.classNS +'time-slider', this);
659
- if(timeSlider[0] && timeSlider.css('position') !== 'absolute'){
660
- var width;
661
- var elemWidths = 0;
662
-
663
- width = Math.floor(timeSlider.parent().width()) - 0.2;
664
- timeSlider
665
- .siblings()
666
- .each(function(){
667
- if(this !== timeSlider[0] && $.css(this, 'position') !== 'absolute' && $.css(this, 'display') !== 'none'){
668
- elemWidths += Math.ceil($(this).outerWidth(true)) + 0.1;
669
- }
670
- })
671
- ;
672
- timeSlider.width(Math.floor(width - elemWidths - Math.ceil(timeSlider.outerWidth(true) - timeSlider.width()) - 0.3));
673
- }
674
- });
675
-
676
- $.jme.registerPlugin('media-controls', {
677
- options: {
678
- calculateTimerange: false
679
- },
680
- pluginOrder: ['<div class="play-pause-container">', 'play-pause', '</div>', '<div class="currenttime-container">', 'currenttime-display', '</div>', '<div class="progress-container">', 'time-slider', '</div>', '<div class="duration-container">', 'duration-display', '</div>', '<div class="mute-container">', 'mute-unmute', '</div>', '<div class="volume-container">', 'volume-slider', '</div>', '<div class="subtitle-container">', '<div class="subtitle-controls">', 'captions', '</div>', '</div>', '<div class="fullscreen-container">', 'fullscreen', '</div>'],
681
- barStructure: '<div class="jme-media-overlay"></div><div class="jme-controlbar'+ noVolumeClass +'" tabindex="-1"><div class="jme-cb-box"></div></div>',
682
- _create: function(control, media, base, options){
683
- var timer;
684
- var update = function(){
685
- clearTimeout(timer);
686
- control.jmeFn('updateControlbar');
687
- timer = setTimeout(function(){
688
- control.jmeFn('updateControlbar');
689
- }, 9);
690
- };
691
- if(options.calculateTimerange){
692
- setTimeout(function(){
693
- media.on('loadedmetadata volumechange play pause ended emptied', update);
694
- base.on('updatetimeformat controlsadded controlschanged playerdimensionchange', update);
695
- $(window).on('resize emchange', update);
696
- }, 1);
697
- update();
698
- }
699
- }
700
- });
701
-
702
560
  $.jme.registerPlugin('play-pause', {
703
- pseudoClasses: {
704
- play: 'state-paused',
705
- pause: 'state-playing'
706
- },
561
+
707
562
  structure: btnStructure,
708
563
  text: 'play / pause',
709
- _create: function(control, media){
710
- var textFn = $.jme.getButtonText(control, [this[pseudoClasses].play, this[pseudoClasses].pause]);
711
-
712
- media
713
- .on('play playing ended pause updateJMEState', function(e){
714
- var state = e.type;
715
- if(playStates[state]){
716
- state = 1;
717
- } else if(pauseStates[state]) {
718
- state = 0;
719
- } else {
720
- state = (media.jmeProp('isPlaying') )? 1 : 0;
721
- }
722
- textFn(state);
723
- })
724
- .triggerHandler('updateJMEState')
725
- ;
726
- control.on((control.is('select')) ? 'change' : 'click', function(e){
727
- media.jmeFn('togglePlay');
728
- e.stopPropagation();
729
- });
730
-
731
- }
564
+ _create: lazyLoadPlugin()
732
565
  });
733
566
 
734
567
  $.jme.registerPlugin('mute-unmute', {
735
- pseudoClasses: {
736
- mute: 'state-mute',
737
- unmute: 'state-unmute'
738
- },
568
+
739
569
  structure: btnStructure,
740
570
  text: 'mute / unmute',
741
- _create: function(control, media, base){
742
- var textFn = $.jme.getButtonText(control, [this[pseudoClasses].mute, this[pseudoClasses].unmute]);
743
- media
744
- .on('volumechange updateJMEState', function(e){
745
- textFn(media.prop('muted') ? 1 : 0);
746
- })
747
- .triggerHandler('updateJMEState')
748
- ;
749
-
750
- control.on((control.is('select')) ? 'change' : 'click', function(e){
751
- media.prop('muted', !media.prop('muted'));
752
- e.stopPropagation();
753
- });
754
-
755
- }
571
+ _create: lazyLoadPlugin()
756
572
  });
757
573
 
758
- function createGetSetHandler(fns){
759
- var throttleTimer;
760
- var blocked;
761
-
762
- if(fns.release === true){
763
- fns.release = fns.set;
764
- }
765
- var getSetHelper = {
766
- start: function(){
767
- if(!blocked){
768
- blocked = true;
769
- if(fns.start){
770
- fns.start();
771
- }
772
- }
773
- },
774
- release: function(){
775
- if(blocked){
776
- blocked = false;
777
-
778
- if(fns.release){
779
- fns.release();
780
- }
781
- }
782
- },
783
- get: function(){
784
- if(blocked){return;}
785
- return fns.get.apply(this, arguments);
786
- },
787
- set: function(){
788
-
789
- var that = this;
790
- var args = arguments;
791
- getSetHelper.start();
792
- clearTimeout(throttleTimer);
793
- throttleTimer = setTimeout(function(){
794
- fns.set.apply(that, args);
795
- }, 33);
796
- }
797
- };
798
- getSetHelper.fns = fns;
799
- return getSetHelper;
800
- }
801
574
 
802
575
  $.jme.registerPlugin('volume-slider', {
803
576
  structure: slideStructure,
804
577
 
805
- _create: function(control, media, base){
806
-
807
- var createFn = function(){
808
- var api, volume;
809
-
810
- volume = createGetSetHandler({
811
- get: function(){
812
- var volume = media.prop('volume');
813
- if(volume !== undefined){
814
- api.value(volume);
815
- }
816
- },
817
- set: function(){
818
- media.prop({
819
- muted: false,
820
- volume: api.options.value
821
- });
822
- },
823
- release: true
824
- });
825
-
826
- api = control
827
- .rangeUI({
828
- min: 0,
829
- max: 1,
830
- //animate: true,
831
- step: 'any',
832
- input: volume.set,
833
- change: volume.release,
834
- baseClass: 'media-range'
835
- })
836
- .data('rangeUi')
837
- ;
838
- media.on('volumechange', volume.get);
839
- };
840
-
841
- onSliderReady(createFn);
842
- }
578
+ _create: lazyLoadPlugin()
843
579
  });
844
580
 
845
581
  $.jme.registerPlugin('time-slider', {
846
582
  structure: slideStructure,
847
- pseudoClasses: {
848
- no: 'no-duration'
849
- },
583
+
850
584
  options: {
851
585
  format: ['mm', 'ss']
852
586
  },
853
- _create: function(control, media, base){
854
-
855
- var module = this;
856
-
857
- var createFn = function(){
858
- var time, durationChange, api, timeShow, wasPaused;
859
- var hasDuration = $.jme.classNS+'has-duration';
860
- var duration = media.prop('duration');
861
-
862
- time = createGetSetHandler({
863
- get: function(){
864
- var time = media.prop('currentTime');
865
- if(!isNaN(time)){
866
- try {
867
- api.value(time);
868
- } catch(er){}
869
- }
870
-
871
- },
872
- set: function(){
873
- try {
874
- media.prop('currentTime', api.options.value).triggerHandler('timechanged', [api.options.value]);
875
- } catch(er){}
876
- },
877
- start: function(){
878
- if(wasPaused == null){
879
- wasPaused = media.prop('paused');
880
- if(!wasPaused){
881
- base._seekpause = true;
882
- media.pause();
883
- } else {
884
- base._seekpause = false;
885
- }
886
- }
887
- },
888
- release: function(){
889
- time.fns.set();
890
- if(wasPaused === false){
891
- media.play();
892
- }
893
- if('_seekpause' in base){
894
- delete base._seekpause;
895
- }
896
- wasPaused = null;
897
- }
898
- });
899
-
900
- durationChange = function(){
901
- duration = media.prop('duration');
902
- hasDuration = duration && isFinite(duration) && !isNaN(duration);
903
- if(hasDuration){
904
- api.disabled(false);
905
- api.max(duration);
906
-
907
- base.removeClass(module[pseudoClasses].no);
908
- } else {
909
- api.disabled(true);
910
- api.max(Number.MAX_VALUE);
911
- base.addClass(module[pseudoClasses].no);
912
- }
913
- };
914
-
915
- api = control
916
- .rangeUI({
917
- min: 0,
918
- value: media.prop('currentTime') || 0,
919
- step: 'any',
920
- input: time.set,
921
- change: time.release,
922
- textValue: function(val){
923
- return media.jmeFn('formatTime', val);
924
- },
925
- baseClass: 'media-range'
926
- })
927
- .data('rangeUi')
928
- ;
929
-
930
- timeShow = $('<span class="'+ $.jme.classNS +'time-select" />').appendTo(control);
931
-
932
- control
933
- .on({
934
- 'mouseenter': function(e){
935
- if(hasDuration){
936
- var widgetLeft = (control.offset() || {left: 0}).left;
937
- var widgetWidth = control.innerWidth();
938
- var posLeft = function(x){
939
- var perc = (x - widgetLeft) / widgetWidth * 100;
940
- timeShow
941
- .html(media.jmeFn('formatTime', duration * perc / 100))
942
- .css({left: perc+'%'})
943
- ;
944
- };
945
-
946
- posLeft(e.pageX);
947
- timeShow.addClass($.jme.classNS +'show-time-select');
948
- control
949
- .off('.jmetimeselect')
950
- .on('mousemove.jmetimeselect', function(e){
951
- posLeft(e.pageX);
952
- })
953
- ;
954
- }
955
- },
956
- mouseleave: function(){
957
- timeShow.removeClass($.jme.classNS +'show-time-select');
958
- control.off('.jmetimeselect');
959
- }
960
- })
961
- ;
962
-
963
-
964
- media.on({
965
- timeupdate: time.get,
966
- emptied: function(){
967
- durationChange();
968
- api.value(0);
969
- },
970
- durationchange: durationChange
971
- });
972
-
973
- base.jmeFn('addControls', $('<div class="'+ $.jme.classNS +'buffer-progress" />').prependTo(control) );
974
- durationChange();
975
- };
976
-
977
- onSliderReady(createFn);
978
- }
979
- });
980
-
981
-
982
- $.jme.defineMethod('concerningRange', function(type, time){
983
- var elem = this;
984
- var ret = {start: 0, end: 0};
985
- if(!type){
986
- type = 'buffered';
987
- }
988
- type = $.prop(elem, type);
989
-
990
- if(time == null){
991
- time = $.prop(elem, 'currentTime');
992
- }
993
- if(!type || !('length' in type)){return ret;}
994
- for(var i = 0, len = type.length; i < len; i++){
995
- ret.start = type.start(i);
996
- ret.end = type.end(i);
997
- if(ret.start <= time && ret.end >= time){
998
- break;
999
- }
1000
- }
1001
- return ret;
1002
- });
1003
-
1004
- $.jme.defineProp('progress', {
1005
- get: function(elem){
1006
- var data = $.jme.data(elem);
1007
- if(!data.media){return 0;}
1008
- var progress = data.media.jmeFn('concerningRange').end / data.media.prop('duration') * 100;
1009
- if(progress > 99.4){
1010
- progress = 100;
1011
- }
1012
- return progress || 0;
1013
- },
1014
- readonly: true
1015
- });
1016
-
1017
- $.jme.registerPlugin('buffer-progress', {
1018
- _create: function(control, media, base, options){
1019
- var indicator = $('<div class="'+ $.jme.classNS +'buffer-progress-indicator" />').appendTo(control);
1020
- var drawBufferProgress = function(){
1021
- var progress = media.jmeProp('progress');
1022
-
1023
-
1024
- if(options.progress !== progress){
1025
- options.progress = progress;
1026
- indicator.css('width', progress +'%');
1027
- }
1028
- };
1029
- media.on({
1030
- progress: drawBufferProgress,
1031
- emptied: function(){
1032
- indicator.css('width', 0);
1033
- options.progress = 0;
1034
- },
1035
- playing: drawBufferProgress
1036
- });
1037
- drawBufferProgress();
1038
- }
587
+ _create: lazyLoadPlugin()
1039
588
  });
1040
589
 
1041
- var times = {
1042
- hh: 60000,
1043
- mm: 60,
1044
- ss: 1,
1045
- ms: 1/1000
1046
- };
1047
- var formatTime = function(sec, format){
1048
- var data;
1049
- if(!format){
1050
- format = ['mm', 'ss'];
1051
- }
1052
- if(sec == null){
1053
- data = $.jme.data(this);
1054
- sec = $.prop(data.media, 'duration');
1055
- }
1056
- if(!sec){
1057
- sec = 0;
1058
- }
1059
- var formated = [];
1060
- var frac;
1061
- for(var i = 0, len = format.length; i < len; i++){
1062
- if(format[i] == 'ms' && i == len -1 ){
1063
- frac = Math.round( (sec / times[format[i]]) / 10);
1064
- } else {
1065
- frac = parseInt(sec / times[format[i]], 10);
1066
- sec = sec % times[format[i]];
1067
- }
1068
- if(frac < 10){
1069
- frac = '0'+frac;
1070
- }
1071
- formated.push( frac );
1072
- }
1073
-
1074
- return formated.join(':');
1075
- };
1076
- $.jme.defineMethod('formatTime', formatTime);
1077
590
 
1078
591
  $.jme.defineProp('format', {
1079
592
  set: function(elem, format){
@@ -1089,24 +602,11 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
1089
602
  });
1090
603
 
1091
604
  $.jme.registerPlugin('duration-display', {
1092
- structure: defaultStructure,
605
+ structure: timeStructure,
1093
606
  options: {
1094
607
  format: "mm:ss"
1095
608
  },
1096
- _create: function(control, media, base, options){
1097
- if(typeof options.format == 'string'){
1098
- options.format = options.format.split(':');
1099
- }
1100
- var showDuration = function(){
1101
- control.html(formatTime(media.prop('duration'), options.format));
1102
- };
1103
- media.on('durationchange emptied', showDuration);
1104
-
1105
- control
1106
- .on('updatetimeformat', showDuration)
1107
- .jmeProp('format', options.format)
1108
- ;
1109
- }
609
+ _create: lazyLoadPlugin()
1110
610
  });
1111
611
 
1112
612
  $.jme.defineProp('countdown', {
@@ -1121,33 +621,12 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
1121
621
  });
1122
622
 
1123
623
  $.jme.registerPlugin('currenttime-display', {
1124
- structure: defaultStructure,
624
+ structure: timeStructure,
1125
625
  options: {
1126
626
  format: "mm:ss",
1127
627
  countdown: false
1128
628
  },
1129
- _create: function(control, media, base, options){
1130
- if(typeof options.format == 'string'){
1131
- options.format = options.format.split(':');
1132
- }
1133
-
1134
- var showTime = function(e){
1135
- var currentTime = media.prop('currentTime');
1136
- if(options.countdown){
1137
- currentTime = (media.prop('duration') || 0) - currentTime;
1138
- if(currentTime < 0.7){
1139
- currentTime = 0;
1140
- }
1141
- }
1142
- control.html(formatTime(currentTime, options.format));
1143
- };
1144
- media.on('timeupdate emptied durationchange', showTime);
1145
-
1146
- control
1147
- .on('updatetimeformat', showTime)
1148
- .jmeProp('format', options.format)
1149
- ;
1150
- }
629
+ _create: lazyLoadPlugin()
1151
630
  });
1152
631
 
1153
632
 
@@ -1164,561 +643,38 @@ webshims.register('jme', function($, webshims, window, doc, undefined, options){
1164
643
  structure: '<div />',
1165
644
  options: {
1166
645
  },
1167
- _create: function(control, media, base, options){
1168
-
1169
- /* Empty span element used for vertical centering in IE7 - thanks to Bruno Fassino.
1170
- * @see http://www.brunildo.org/test/img_center.html
1171
- */
1172
- var updatePoster = function(){
1173
- var poster = media.prop('poster');
1174
- if(poster){
1175
- control.html('<span></span><img src="'+ poster +'" class="'+ $.jme.classNS +'poster-image" />');
1176
- } else {
1177
- control.empty();
1178
- }
1179
- };
1180
- media.on('emptied', updatePoster);
1181
- updatePoster();
1182
- }
1183
- });
1184
-
1185
- //taken from http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/
1186
- $.jme.fullscreen = (function() {
1187
- var parentData;
1188
- var frameData;
1189
- var doc = document.documentElement;
1190
-
1191
- var fullScreenApi = {
1192
- supportsFullScreen: Modernizr.prefixed('fullscreenEnabled', document, false) || Modernizr.prefixed('fullScreenEnabled', document, false),
1193
- isFullScreen: function() { return false; },
1194
- requestFullScreen: function(elem){
1195
- var tmpData;
1196
- parentData = [];
1197
- $(elem).parentsUntil('body').each(function(){
1198
- var pos = $.css(this, 'position');
1199
- var left = this.scrollLeft;
1200
- var top = this.scrollTop;
1201
- var changed;
1202
- tmpData = {elemStyle: this.style, elem: this};
1203
- if(pos !== 'static'){
1204
- changed = true;
1205
- tmpData.pos = tmpData.elemStyle.position;
1206
- this.style.position = 'static';
1207
- }
1208
- if(left){
1209
- changed = true;
1210
- tmpData.left = left;
1211
- }
1212
- if(top){
1213
- changed = true;
1214
- tmpData.top = top;
1215
- }
1216
- if(changed){
1217
- parentData.push(tmpData);
1218
- }
1219
- });
1220
- frameData = false;
1221
- try {
1222
- frameData = {elemStyle: frameElement.style, elem: frameElement, css: {}};
1223
- frameData.css.position = frameData.elemStyle.position;
1224
- frameData.elemStyle.position = 'fixed';
1225
- $.each(['top', 'left', 'right', 'bottom'], function(i, name){
1226
- frameData.css[name] = frameData.elemStyle[name];
1227
- frameData.elemStyle[name] = '0px';
1228
- });
1229
- $.each(['height', 'width'], function(i, name){
1230
- frameData.css[name] = frameData.elemStyle[name];
1231
- frameData.elemStyle[name] = '100%';
1232
- });
1233
- } catch(er){
1234
- frameData = false;
1235
- }
1236
-
1237
- tmpData = null;
1238
- },
1239
- cancelFullScreen: function(){
1240
- if(parentData){
1241
- $.each(parentData, function(i, data){
1242
- if('pos' in data){
1243
- data.elemStyle.position = data.pos;
1244
- }
1245
- if(data.left){
1246
- data.elem.scrollLeft = data.left;
1247
- }
1248
- if(data.top){
1249
- data.elem.scrollTop = data.top;
1250
- }
1251
- data = null;
1252
- });
1253
- parentData = [];
1254
- }
1255
- if(frameData){
1256
- $.each(frameData.css, function(name, value){
1257
- frameData.elemStyle[name] = value;
1258
- });
1259
- frameData = false;
1260
- }
1261
- },
1262
- eventName: 'fullscreenchange',
1263
- exitName: 'exitFullscreen',
1264
- requestName: 'requestFullscreen',
1265
- elementName: 'fullscreenElement',
1266
- enabledName: ''
1267
- };
1268
-
1269
- fullScreenApi.cancelFullWindow = fullScreenApi.cancelFullScreen;
1270
- fullScreenApi.requestFullWindow = fullScreenApi.requestFullScreen;
1271
-
1272
- // update methods to do something useful
1273
- if (fullScreenApi.supportsFullScreen) {
1274
- fullScreenApi.enabledName = fullScreenApi.supportsFullScreen;
1275
- fullScreenApi.exitName = Modernizr.prefixed("exitFullscreen", document, false) || Modernizr.prefixed("cancelFullScreen", document, false);
1276
- fullScreenApi.elementName = Modernizr.prefixed("fullscreenElement", document, false) || Modernizr.prefixed("fullScreenElement", document, false);
1277
- fullScreenApi.supportsFullScreen = !!fullScreenApi.supportsFullScreen;
1278
- if(fullScreenApi.elementName != 'fullscreenElement' || fullScreenApi.exitName != 'exitFullscreen' || fullScreenApi.enabledName != 'fullscreenEnabled'){
1279
- $.each(Modernizr._domPrefixes, function(i, prefix){
1280
- var requestName = prefix+'RequestFullscreen';
1281
- if((requestName in doc) || ((requestName = prefix+'RequestFullScreen') && (requestName in doc))){
1282
- fullScreenApi.eventName = prefix + 'fullscreenchange';
1283
- fullScreenApi.requestName = requestName;
1284
- return false;
1285
- }
1286
- });
1287
- }
1288
-
1289
- fullScreenApi.isFullScreen = function() {
1290
- return document[fullScreenApi.elementName];
1291
- };
1292
- fullScreenApi.requestFullScreen = function(el) {
1293
- return el[fullScreenApi.requestName]();
1294
- };
1295
- fullScreenApi.cancelFullScreen = function() {
1296
- return document[fullScreenApi.exitName]();
1297
- };
1298
- }
1299
-
1300
- if(!window.Modernizr || !('fullscreen' in Modernizr)){
1301
- $('html').addClass(fullScreenApi.supportsFullScreen ? 'fullscreen' : 'no-fullscreen');
1302
- }
1303
-
1304
- if(window.parent != window){
1305
- (function(){
1306
- try{
1307
- var frame = window.frameElement;
1308
- if (fullScreenApi.supportsFullScreen) {
1309
- if('allowfullscreen' in frame && !frame.allowfullscreen) {
1310
- frame.allowfullscreen = true;
1311
- } else {
1312
- if(frame.getAttribute('webkitallowfullscreen') == null){
1313
- frame.setAttribute('webkitallowfullscreen', '');
1314
- }
1315
- if(frame.getAttribute('allowfullscreen') == null){
1316
- frame.setAttribute('allowfullscreen', 'allowfullscreen');
1317
- }
1318
- }
1319
- }
1320
- } catch(er){
1321
- if(!fullScreenApi.supportsFullScreen){
1322
- $('html').addClass('no-fullwindow');
1323
- }
1324
- }
1325
- })();
1326
-
1327
- }
1328
-
1329
-
1330
- return fullScreenApi;
1331
- })();
1332
-
1333
- $.jme.defineProp('fullscreen', {
1334
- set: function(elem, value){
1335
- var data = $.jme.data(elem);
1336
-
1337
- if((!data || !data.player) && !$(elem).hasClass($.jme.classNS+'player-fullscreen')){return 'noDataSet';}
1338
- if(value){
1339
- if(data.player.hasClass($.jme.classNS+'player-fullscreen')){return 'noDataSet';}
1340
-
1341
- data.scrollPos = {
1342
- top: $(window).scrollTop(),
1343
- left: $(window).scrollLeft()
1344
- };
1345
-
1346
- $(document)
1347
- .off('.jmefullscreen')
1348
- .on('keydown.jmefullscreen', function(e){
1349
- if(e.keyCode == 27){
1350
- data.player.jmeProp('fullscreen', false);
1351
- return false;
1352
- }
1353
- if(e.keyCode === 32 && !('form' in e.target)){
1354
- data.media.jmeFn('togglePlay');
1355
- return false;
1356
- }
1357
- })
1358
- ;
1359
-
1360
-
1361
- if(value == 'fullwindow'){
1362
- $.jme.fullscreen.requestFullWindow(data.player[0]);
1363
- } else {
1364
- try {
1365
- $.jme.fullscreen.requestFullScreen(data.player[0]);
1366
- } catch(er){}
1367
- }
1368
-
1369
-
1370
- $('html').addClass($.jme.classNS+'has-media-fullscreen');
1371
-
1372
- data.player.addClass($.jme.classNS+'player-fullscreen');
1373
-
1374
- data.media.addClass($.jme.classNS+'media-fullscreen');
1375
-
1376
- $('button.play-pause', data.player).focus();
1377
-
1378
- if($.jme.fullscreen.supportsFullScreen){
1379
- $(document)
1380
- .on($.jme.fullscreen.eventName+'.jmefullscreen', function(e){
1381
- var fullScreenElem = $.jme.fullscreen.isFullScreen();
1382
- if(fullScreenElem && elem == fullScreenElem){
1383
- data.media.trigger('playerdimensionchange', ['fullscreen']);
1384
- } else {
1385
- data.player.jmeProp('fullscreen', false);
1386
- }
1387
- })
1388
- ;
1389
-
1390
- }
1391
- data.media.trigger('playerdimensionchange', ['fullwindow']);
1392
-
1393
- } else {
1394
- if(data.player && !data.player.hasClass($.jme.classNS+'player-fullscreen')){return 'noDataSet';}
1395
- $(document).off('.jmefullscreen');
1396
- $('html').removeClass($.jme.classNS+'has-media-fullscreen');
1397
- if(data.player && data.media){
1398
- data.player.removeClass($.jme.classNS+'player-fullscreen');
1399
- data.media.removeClass($.jme.classNS+'media-fullscreen');
1400
- }
1401
- if($.jme.fullscreen.isFullScreen()){
1402
- try {
1403
- $.jme.fullscreen.cancelFullScreen();
1404
- } catch(er){}
1405
- } else {
1406
- $.jme.fullscreen.cancelFullWindow();
1407
- }
1408
-
1409
- if(data.scrollPos){
1410
- $(window).scrollTop(data.scrollPos.top);
1411
- $(window).scrollLeft(data.scrollPos.left);
1412
- delete data.scrollPos;
1413
- }
1414
- if(data.media){
1415
- data.media.trigger('playerdimensionchange');
1416
- }
1417
- }
1418
- return 'noDataSet';
1419
- },
1420
- get: function(elem){
1421
- var data = $.jme.data(elem);
1422
- if(!data || !data.player){return;}
1423
- var fs = data.player.hasClass($.jme.classNS+'player-fullscreen');
1424
- if(!fs){return false;}
1425
- return $.jme.fullscreen.isFullScreen() || 'fullwindow';
1426
- }
646
+ _create: lazyLoadPlugin()
1427
647
  });
1428
648
 
1429
- $.jme.defineProp('autoplayfs');
1430
649
 
1431
650
  $.jme.registerPlugin('fullscreen', {
1432
- pseudoClasses: {
1433
- enter: 'state-enterfullscreen',
1434
- exit: 'state-exitfullscreen'
1435
- },
651
+
1436
652
  options: {
1437
653
  fullscreen: true,
1438
654
  autoplayfs: false
1439
655
  },
1440
656
  structure: btnStructure,
1441
657
  text: 'enter fullscreen / exit fullscreen',
1442
- _create: function(control, media, base){
1443
- var textFn = $.jme.getButtonText(control, [this[pseudoClasses].enter, this[pseudoClasses].exit]);
1444
- var updateControl = function(){
1445
- textFn(base.hasClass($.jme.classNS+'player-fullscreen') ? 1 : 0);
1446
- };
1447
- var options = this.options;
1448
- var addDoubbleClick = function(){
1449
- $(base.data('jme').controlElements)
1450
- .filter('.jme-media-overlay')
1451
- .off('.dblfullscreen')
1452
- .on('dblclick.dblfullscreen', function(e){
1453
- base.jmeProp('fullscreen', !base.jmeProp('fullscreen'));
1454
- })
1455
- ;
1456
- };
1457
-
1458
- base.on('controlsadded', addDoubbleClick);
1459
-
1460
- base.on('playerdimensionchange', updateControl);
1461
-
1462
- control.on((control.is('select')) ? 'change' : 'click', function(){
1463
- var value = base.hasClass($.jme.classNS+'player-fullscreen') ? false : options.fullscreen;
1464
- base.jmeProp('fullscreen', value);
1465
- if(value && options.autoplayfs){
1466
- media.jmeFn('play');
1467
- }
1468
- });
1469
- addDoubbleClick();
1470
- updateControl();
1471
- }
658
+ _create: lazyLoadPlugin()
1472
659
  });
1473
660
 
1474
661
 
1475
- $.jme.ButtonMenu = function(button, menu, clickHandler){
1476
-
1477
- this.button = $(button).attr({'aria-haspopup': 'true'});
1478
-
1479
- this.clickHandler = clickHandler;
1480
-
1481
- this.toggle = $.proxy(this, 'toggle');
1482
- this.keyIndex = $.proxy(this, 'keyIndex');
1483
- this._buttonClick = $.proxy(this, '_buttonClick');
1484
-
1485
-
1486
- this.addMenu(menu);
1487
- this._closeFocusOut();
1488
- this.button.on('click', this.toggle);
1489
-
1490
- };
1491
-
1492
- $.jme.ButtonMenu.prototype = {
1493
- addMenu: function(menu){
1494
- if(this.menu){
1495
- this.menu.remove();
1496
- }
1497
- this.menu = $(menu);
1498
- this.buttons = $('button', this.menu);
1499
- this.menu.insertAfter(this.button);
1500
- this.menu
1501
- .on('keydown', this.keyIndex)
1502
- .delegate('button', 'click', this._buttonClick)
1503
- ;
1504
- },
1505
- _closeFocusOut: function(){
1506
- var that = this;
1507
- var timer;
1508
- var stopFocusOut = function(){
1509
- clearTimeout(timer);
1510
- setTimeout(function(){
1511
- clearTimeout(timer);
1512
- }, 9);
1513
- };
1514
- this.menu
1515
- .parent()
1516
- .on('focusin', stopFocusOut)
1517
- .on('mousedown', stopFocusOut)
1518
- .on('focusout', function(e){
1519
- timer = setTimeout(function(){
1520
- that.hide();
1521
- }, 40);
1522
- })
1523
- ;
1524
- },
1525
- _buttonClick: function(e){
1526
- this.clickHandler(this.buttons.index(e.currentTarget), e.currentTarget);
1527
- this.hide();
1528
- },
1529
- keyIndex: function(e){
1530
- var dir = (e.keyCode == 40) ? 1 : (e.keyCode == 38) ? -1 : 0;
1531
- if(dir){
1532
- var buttons = this.buttons.not(':disabled');
1533
- var activeButton = buttons.filter(':focus');
1534
-
1535
- activeButton = buttons[buttons.index(activeButton) + dir] || buttons.filter(dir > 0 ? ':first' : ':last');
1536
- activeButton.focus();
1537
- e.preventDefault();
1538
- }
1539
- },
1540
- show: function(){
1541
- if(this.isVisible){return;}
1542
- var buttons = this.buttons.not(':disabled');
1543
- this.isVisible = true;
1544
- this.menu.addClass('visible-menu');
1545
- try {
1546
- this.activeElement = document.activeElement || this.button[0];
1547
- } catch(er){
1548
- this.activeElement = this.button[0];
1549
- }
1550
-
1551
- setTimeout(function(){
1552
- $(buttons.filter('[aria-checked="true"]')[0] || buttons[0]).focus();
1553
- }, 60);
1554
- },
1555
- toggle: function(){
1556
- this[this.isVisible ? 'hide' : 'show']();
1557
- },
1558
- hide: function(){
1559
- if(!this.isVisible){return;}
1560
- this.isVisible = false;
1561
- this.menu.removeClass('visible-menu');
1562
- if(this.activeElement){
1563
- try {
1564
- this.activeElement.focus();
1565
- } catch(er){}
1566
- }
1567
- this.activeElement = false;
1568
- }
1569
- };
1570
-
1571
- var showKinds = {subtitles: 1, caption: 1};
1572
- var getTrackMenu = function(tracks){
1573
- var items = $.map(tracks, function(track){
1574
- var className = (track.kind == 'caption') ? 'caption-type' : 'subtitle-type';
1575
- var lang = track.language;
1576
- lang = (lang) ? ' <span class="track-lang">'+ lang +'</span>' : '';
1577
- return '<li class="'+ className +'" role="presentation"><button role="menuitemcheckbox">'+ track.label + lang +'</button></li>';
1578
- })
1579
- ;
1580
- return '<div><ul>' + items.join('') +'</ul></div>';
1581
- };
1582
-
1583
-
1584
662
  $.jme.registerPlugin('captions', {
1585
- pseudoClasses: {
1586
- menu: 'subtitle-menu'
1587
- },
1588
663
  structure: btnStructure,
1589
664
  text: 'subtitles',
1590
- _create: function(control, media, base, options){
1591
- var that = this;
1592
-
665
+ _create: function(control, media, base){
1593
666
  var trackElems = media.find('track');
1594
- var checkbox = $(control).clone().attr({role: 'checkbox'}).insertBefore(control);
1595
-
667
+ control.wsclonedcheckbox = $(control).clone().attr({role: 'checkbox'}).insertBefore(control);
1596
668
  base.attr('data-tracks', trackElems.length > 1 ? 'many' : trackElems.length);
1597
669
  control.attr('aria-haspopup', 'true');
1598
-
1599
- webshims.ready('track', function(){
1600
- var menuObj, throttledUpdateMode;
1601
- var tracks = [];
1602
- var textTracks = media.prop('textTracks');
1603
-
1604
- var throttledUpdate = (function(){
1605
- var timer;
1606
- var triggerTimer;
1607
- return function(e){
1608
- clearTimeout(timer);
1609
- clearTimeout(triggerTimer);
1610
- if(e.type == 'updatesubtitlestate'){
1611
- triggerTimer = setTimeout(function(){
1612
- media.trigger('updatetracklist');
1613
- }, 0);
1614
- }
1615
- timer = setTimeout(updateTrackMenu, 19);
1616
- };
1617
- })();
1618
-
1619
- function createSubtitleMenu(menu){
1620
- var menuClick;
1621
-
1622
- if(!menuObj){
1623
- menuClick = function(index, button){
1624
- if($.attr(button, 'aria-checked') == 'true'){
1625
- tracks[index].mode = 'disabled';
1626
- } else {
1627
- $.each(tracks, function(i, track){
1628
- track.mode = (i == index) ? 'showing' : 'disabled';
1629
- });
1630
- }
1631
- media.prop('textTracks');
1632
- updateMode();
1633
- };
1634
-
1635
- menuObj = new $.jme.ButtonMenu(control, menu, menuClick);
1636
- checkbox.on('click', function(){
1637
- menuClick(0, this);
1638
- return false;
1639
- });
1640
- } else {
1641
- menuObj.addMenu(menu);
1642
- }
1643
-
1644
- updateMode();
1645
- }
1646
-
1647
- function updateMode(){
1648
- $('button', menuObj.menu).each(function(i){
1649
- var checked = (tracks[i].mode == 'showing') ? 'true' : 'false';
1650
- if(!i){
1651
- checkbox.attr('aria-checked', checked);
1652
- }
1653
- $.attr(this, 'aria-checked', checked);
1654
- });
1655
- }
1656
-
1657
- function updateTrackMenu(){
1658
- tracks = [];
1659
- $.each(textTracks, function(i, track){
1660
- if(showKinds[track.kind] && track.readyState != 3){
1661
- tracks.push(track);
1662
- }
1663
- });
1664
-
1665
- base.attr('data-tracks', tracks.length > 1 ? 'many' : tracks.length);
1666
-
1667
- if(tracks.length){
1668
- createSubtitleMenu('<div class="'+that[pseudoClasses].menu +'" >'+ (getTrackMenu(tracks)) +'</div>');
1669
-
1670
- $('span.jme-text, +label span.jme-text', checkbox).text((tracks[0].label || ' ') + (tracks[0].lang || ''));
1671
-
1672
- if(!base.hasClass(that[pseudoClasses].hasTrack) || base.hasClass(that[pseudoClasses].noTrack)){
1673
- control.prop('disabled', false);
1674
- base.triggerHandler('controlschanged');
1675
- }
1676
-
1677
- } else if(!base.hasClass(that[pseudoClasses].noTrack) || base.hasClass(that[pseudoClasses].hasTrack)){
1678
- control.prop('disabled', true);
1679
- base
1680
- .triggerHandler('controlschanged')
1681
- ;
1682
- }
1683
- }
1684
-
1685
- if(!textTracks){
1686
- textTracks = [];
1687
- updateTrackMenu();
1688
- } else {
1689
- throttledUpdateMode = (function(){
1690
- var timer;
1691
- return function(){
1692
- clearTimeout(timer);
1693
- timer = setTimeout(updateMode, 20);
1694
- };
1695
- })();
1696
-
1697
- updateTrackMenu();
1698
-
1699
- $([textTracks])
1700
- .on('addtrack removetrack', throttledUpdate)
1701
- .on('change', throttledUpdateMode)
1702
- ;
1703
-
1704
- base.on('updatesubtitlestate', throttledUpdate);
1705
- media.on('updatetrackdisplay', throttledUpdateMode);
1706
- }
1707
-
1708
- });
1709
- }
1710
- });
1711
-
1712
- $('.mediaplayer').each(function(){
1713
- if(($.data(this, 'jme')|| {}).controlbar){
1714
- $(this).jmeProp('controlbar', true);
670
+ lazyLoadPlugin().apply(this, arguments);
1715
671
  }
1716
672
  });
1717
673
 
1718
- webshims.ready('mediaelement', function(){
674
+ webshims.ready(webshims.cfg.mediaelement.plugins.concat(['mediaelement']), function(){
1719
675
  webshims.addReady(function(context, insertedElement){
1720
676
  $(baseSelector, context).add(insertedElement.filter(baseSelector)).jmeProp('controlbar', true);
1721
677
  });
1722
678
  });
1723
- webshims.ready('WINDOWLOAD', loadRange);
679
+ webshims.ready('WINDOWLOAD', loadLazy);
1724
680
  });