webshims-rails 1.14.4 → 1.14.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Rakefile +58 -0
  4. data/lib/webshims-rails/version.rb +2 -2
  5. data/vendor/assets/javascripts/webshims/polyfiller.js +45 -26
  6. data/vendor/assets/javascripts/webshims/shims/combos/1.js +18 -5
  7. data/vendor/assets/javascripts/webshims/shims/combos/10.js +26 -22
  8. data/vendor/assets/javascripts/webshims/shims/combos/11.js +24 -21
  9. data/vendor/assets/javascripts/webshims/shims/combos/12.js +4 -0
  10. data/vendor/assets/javascripts/webshims/shims/combos/13.js +4 -0
  11. data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -1
  12. data/vendor/assets/javascripts/webshims/shims/combos/15.js +17 -7
  13. data/vendor/assets/javascripts/webshims/shims/combos/16.js +21 -7
  14. data/vendor/assets/javascripts/webshims/shims/combos/17.js +24 -22
  15. data/vendor/assets/javascripts/webshims/shims/combos/18.js +122 -97
  16. data/vendor/assets/javascripts/webshims/shims/combos/2.js +20 -6
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +4 -3
  18. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -0
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +7 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +1 -1
  21. data/vendor/assets/javascripts/webshims/shims/combos/27.js +29 -9
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +1 -2
  23. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1
  24. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -6
  25. data/vendor/assets/javascripts/webshims/shims/combos/30.js +16 -6
  26. data/vendor/assets/javascripts/webshims/shims/combos/31.js +16 -6
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -1
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2 -1
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +2 -1
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +24 -22
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +24 -22
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +20 -6
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +20 -6
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +26 -22
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +0 -24
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +22 -25
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +22 -25
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +2 -1
  39. data/vendor/assets/javascripts/webshims/shims/filereader.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-core.js +14 -5
  41. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +8 -4
  42. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -1
  43. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +24 -21
  44. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1 -1
  45. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +28 -8
  46. data/vendor/assets/javascripts/webshims/shims/form-validation.js +17 -20
  47. data/vendor/assets/javascripts/webshims/shims/form-validators.js +17 -10
  48. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +3 -3
  49. data/vendor/assets/javascripts/webshims/shims/jme/base.js +0 -24
  50. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +23 -9
  51. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +21 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +13 -4
  53. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols.js +22 -1
  54. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -0
  55. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -3
  56. data/vendor/assets/javascripts/webshims/shims/picture.js +122 -97
  57. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +470 -452
  58. data/vendor/assets/javascripts/webshims/shims/sizzle.js +35 -27
  59. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +10 -2
  60. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +1 -1
  61. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +10 -0
  62. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +4 -2
  63. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +1 -1
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +6 -24
  65. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +15 -21
  66. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +5 -19
  67. data/vendor/assets/javascripts/webshims/shims/track-ui.js +2 -2
  68. metadata +2 -3
  69. data/vendor/assets/javascripts/webshims/shims/promise.js +0 -684
@@ -111,7 +111,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
111
111
  shadowType = shadowElem.prop('type');
112
112
  }
113
113
  if(
114
- (chromeBugs && (e.type == 'change' || webkitVersion < 537.36) && noFocusWidgets[shadowType] && $(e.target).is(':focus')) ||
114
+ (chromeBugs && (e.type == 'change' || webkitVersion < 537.36) && noFocusWidgets[shadowType] && $.find.matchesSelector(e.target, ':focus')) ||
115
115
  (e.type == 'focusout' && elem.type == 'radio' && isInGroup(elem.name))
116
116
  ){
117
117
  return;
@@ -438,9 +438,9 @@ webshims.register('form-validation', function($, webshims, window, document, und
438
438
  this.lastElement = $(element).getShadowFocusElement();
439
439
  if(!this.prepared || !this.options.prepareFor){
440
440
  if(opts.appendTo == 'element' || (opts.inline && opts.appendTo == 'auto')){
441
- parentElem = element.parent();
441
+ parentElem = visual.parent();
442
442
  } else if(opts.appendTo == 'auto'){
443
- parentElem = this._getAutoAppendElement(element);
443
+ parentElem = this._getAutoAppendElement(visual);
444
444
  } else {
445
445
  parentElem = $(opts.appendTo);
446
446
  }
@@ -679,7 +679,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
679
679
  var ret = $(elem).data('errortype');
680
680
  if(!ret){
681
681
  $.each(fields, function(errorName, cNames){
682
- if($(elem).is(cNames)){
682
+ if($.find.matchesSelector(elem, cNames)){
683
683
  ret = errorName;
684
684
  return false;
685
685
  }
@@ -724,7 +724,8 @@ webshims.register('form-validation', function($, webshims, window, document, und
724
724
  };
725
725
  })(),
726
726
  initIvalContentMessage: function(elem){
727
- if($(elem).jProp('form').is(iVal.sel)){
727
+ var form;
728
+ if(iVal.sel && (form = $.prop(elem, 'form')) && $.find.matchesSelector(form, iVal.sel)){
728
729
  this.get(elem);
729
730
  }
730
731
  },
@@ -794,7 +795,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
794
795
  switchValidityClass({type: 'input', target: input});
795
796
  };
796
797
  $(input)
797
- .filter('input:not([type="checkbox"]):not([type="radio"])')
798
+ .filter('input:not([type="checkbox"]):not([type="radio"]), textarea')
798
799
  .off('.recheckinvalid')
799
800
  .on('input.recheckinvalid', function(){
800
801
  clearTimeout(timer);
@@ -840,7 +841,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
840
841
  this.hideError(elem, true).removeClass(successWrapperClass);
841
842
  },
842
843
  toggle: function(elem){
843
- if($(elem).is(':invalid')){
844
+ if($.find.matchesSelector(elem, ':invalid')){
844
845
  this.showError(elem);
845
846
  } else {
846
847
  this.hideError(elem);
@@ -851,25 +852,21 @@ webshims.register('form-validation', function($, webshims, window, document, und
851
852
  $(document.body)
852
853
  .on({
853
854
  'changedvaliditystate': function(e){
854
- if(iVal.sel){
855
- var form = $(e.target).jProp('form');
856
- if(form.is(iVal.sel)){
857
- webshims.errorbox.toggle(e.target);
858
- }
855
+ var form;
856
+ if(iVal.sel && (form = $.prop(e.target, 'form')) && $.find.matchesSelector(form, iVal.sel)){
857
+ webshims.errorbox.toggle(e.target);
859
858
  }
860
859
  },
861
860
  'resetvalidityui.webshims': function(e){
862
- if (iVal.sel) {
863
- var form = $(e.target).jProp('form');
864
- if (form.is(iVal.sel)) {
865
- webshims.errorbox.reset(e.target);
866
- }
861
+ var form;
862
+ if(iVal.sel && (form = $.prop(e.target, 'form')) && $.find.matchesSelector(form, iVal.sel)){
863
+ webshims.errorbox.reset(e.target);
867
864
  }
868
865
  },
869
866
  firstinvalid: function(e){
867
+ var form;
870
868
  if(iVal.sel && iVal.handleBubble){
871
- var form = $(e.target).jProp('form');
872
- if(form.is(iVal.sel)){
869
+ if(iVal.sel && (form = $.prop(e.target, 'form')) && $.find.matchesSelector(form, iVal.sel)){
873
870
  e.preventDefault();
874
871
  if(iVal.handleBubble != 'none'){
875
872
  webshims.validityAlert.showFor( e.target, false, false, iVal.handleBubble == 'hide' );
@@ -878,7 +875,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
878
875
  }
879
876
  },
880
877
  submit: function(e){
881
- if(iVal.sel && iVal.submitCheck && $(e.target).is(iVal.sel) && $.prop(e.target, 'noValidate') && !$(e.target).checkValidity()){
878
+ if(iVal.sel && iVal.submitCheck && $.find.matchesSelector(e.target, iVal.sel) && $.prop(e.target, 'noValidate') && !$(e.target).checkValidity()){
882
879
  e.stopImmediatePropagation();
883
880
  return false;
884
881
  }
@@ -1,6 +1,11 @@
1
1
  webshims.register('form-validators', function($, webshims, window, document, undefined, options){
2
2
  "use strict";
3
- var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
3
+
4
+ var iValClasses;
5
+ webshims.ready('form-validation', function(){
6
+ iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
7
+ });
8
+
4
9
  (function(){
5
10
  if(webshims.refreshCustomValidityRules){
6
11
  webshims.error("form-validators already included. please remove custom-validity.js");
@@ -30,7 +35,7 @@ var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
30
35
  elem = elements[id].elem;
31
36
  if(elem != noTest && elements[id].val != (val = elem.value)){
32
37
  elements[id].val = val;
33
- if($(elem).hasClass(iValClasses)){
38
+ if(iValClasses && $.find.matchesSelector(elem, iValClasses)){
34
39
  $(elem).trigger('updatevalidation.webshims');
35
40
  } else {
36
41
  testValidityRules(elem);
@@ -337,7 +342,7 @@ var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
337
342
  val = !val;
338
343
  }
339
344
  $.prop( elem, data.prop, val);
340
- if(e){
345
+ if(iValClasses && e){
341
346
  $(elem).getShadowElement().filter(iValClasses).trigger('updatevalidation.webshims');
342
347
  }
343
348
  };
@@ -377,11 +382,13 @@ var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
377
382
  } else {
378
383
  $(data.masterElement).on('change', function(){
379
384
  webshims.refreshCustomValidityRules(elem);
380
- $(elem)
381
- .getShadowElement()
382
- .filter(iValClasses)
383
- .trigger('updatevalidation.webshims')
384
- ;
385
+ if(iValClasses){
386
+ $(elem)
387
+ .getShadowElement()
388
+ .filter(iValClasses)
389
+ .trigger('updatevalidation.webshims')
390
+ ;
391
+ }
385
392
  });
386
393
  }
387
394
  }
@@ -416,7 +423,7 @@ var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
416
423
  }
417
424
 
418
425
  data.ajaxvalidate.depends.on('change', function(){
419
- if($(this).is(':valid')){
426
+ if($.find.matchesSelector(this, ':valid')){
420
427
  webshims.refreshCustomValidityRules(elem);
421
428
  }
422
429
  });
@@ -479,7 +486,7 @@ var iValClasses = '.'+ options.iVal.errorClass +', .'+options.iVal.successClass;
479
486
  data = {};
480
487
  data[$.prop(elem, 'name') || $.prop(elem, 'id')] = $(elem).val();
481
488
  opts.depends.each(function(){
482
- if($(this).is(':invalid')){
489
+ if($.find.matchesSelector(this, ':invalid')){
483
490
  data = false;
484
491
  return false;
485
492
  }
@@ -1495,7 +1495,7 @@ webshims.register('forms-picker', function($, webshims, window, document, undefi
1495
1495
  data._commonDateInit = true;
1496
1496
  var o = data.options;
1497
1497
  var actionfn = function(e){
1498
- if(!$(this).is('.othermonth') || $(this).css('cursor') == 'pointer'){
1498
+ if(!$(this).hasClass('othermonth') || $(this).css('cursor') == 'pointer'){
1499
1499
  popover.actionFn({
1500
1500
  'data-action': $.attr(this, 'data-action'),
1501
1501
  value: $(this).val() || $.attr(this, 'value')
@@ -1550,13 +1550,13 @@ webshims.register('forms-picker', function($, webshims, window, document, undefi
1550
1550
 
1551
1551
  $('button', popover.buttonRow).each(function(){
1552
1552
  var text;
1553
- if($(this).is('.ws-empty')){
1553
+ if($(this).hasClass('ws-empty')){
1554
1554
  text = curCfg.date.clear;
1555
1555
  if(!text){
1556
1556
  text = formcfg[''].date.clear || 'clear';
1557
1557
  webshims.warn("could not get clear text from form cfg");
1558
1558
  }
1559
- } else if($(this).is('.ws-current')){
1559
+ } else if($(this).hasClass('ws-current')){
1560
1560
  text = (curCfg[data.type] || {}).currentText;
1561
1561
  if(!text){
1562
1562
  text = (formcfg[''][[data.type]] || {}).currentText || (curCfg.date || {}).currentText || 'current';
@@ -276,30 +276,6 @@ webshims.register('jmebase', function($, webshims, window, doc, undefined){
276
276
  jmeData.media = media;
277
277
  jmeData.player = base;
278
278
  media
279
- .on('ended emptied play', (function(){
280
- var timer;
281
- var releaseEmptied = function(){
282
- stopEmptiedEvent = false;
283
- };
284
- var ended = function(){
285
- removeCanPlay();
286
- media.jmeFn('pause');
287
- if(!options.noReload && media.prop('ended') && media.prop('paused') && !media.prop('autoplay') && !media.prop('loop') && !media.hasClass('no-reload')){
288
- stopEmptiedEvent = true;
289
- media.jmeFn('load');
290
- base.attr('data-state', 'ended');
291
- setTimeout(releaseEmptied);
292
-
293
- }
294
- };
295
- return function(e){
296
-
297
- clearTimeout(timer);
298
- if(e.type == 'ended' && !options.noReload && !media.prop('autoplay') && !media.prop('loop') && !media.hasClass('no-reload')){
299
- timer = setTimeout(ended);
300
- }
301
- };
302
- })())
303
279
  .on('emptied waiting canplay canplaythrough playing ended pause mediaerror', mediaUpdateFn)
304
280
  .on('volumechange updateJMEState', function(){
305
281
  var volume = $.prop(this, 'volume');
@@ -1,5 +1,5 @@
1
1
  /* thx to http://icomoon.io */
2
- .mediaplayer[data-state="waiting"] > .jme-media-overlay, .mediaplayer .fullscreen, .mediaplayer .fullscreen.state-exitfullscreen, .mediaplayer .mediaconfigmenu, .mediaplayer[data-state="idle"] > .jme-media-overlay, .mediaplayer button.play-pause, .mediaplayer button.play-pause.state-playing, .mediaplayer .mute-unmute, .mediaplayer[data-volume="medium"] .mute-unmute, .mediaplayer[data-volume="low"] .mute-unmute, .mediaplayer[data-volume="no"] .mute-unmute, .mediaplayer .state-unmute.mute-unmute, .mediaplayer .captions, .mediaplayer .subtitle-menu button[aria-checked="true"], .mediaplayer .subtitle-menu button, .mediaplayer .playlist-next, .mediaplayer .playlist-prev, .mediaplayer .chapters, .mediaplayer[data-state="ended"] > .jme-media-overlay {
2
+ .mediaplayer[data-state="waiting"] > .jme-media-overlay, .mediaplayer .fullscreen, .mediaplayer .fullscreen.state-exitfullscreen, .mediaplayer .mediaconfigmenu, .mediaplayer.initial-state > .jme-media-overlay, .mediaplayer button.play-pause, .mediaplayer button.play-pause.state-playing, .mediaplayer .mute-unmute, .mediaplayer[data-volume="medium"] .mute-unmute, .mediaplayer[data-volume="low"] .mute-unmute, .mediaplayer[data-volume="no"] .mute-unmute, .mediaplayer .state-unmute.mute-unmute, .mediaplayer .captions, .mediaplayer .subtitle-menu button[aria-checked="true"], .mediaplayer .subtitle-menu button, .mediaplayer .playlist-next, .mediaplayer .playlist-prev, .mediaplayer .chapters, .mediaplayer.ended-state > .jme-media-overlay {
3
3
  font-family: 'jme';
4
4
  speak: none;
5
5
  font-style: normal;
@@ -29,7 +29,7 @@
29
29
  content: "\e606";
30
30
  }
31
31
 
32
- .mediaplayer[data-state="idle"] > .jme-media-overlay:before {
32
+ .mediaplayer.initial-state > .jme-media-overlay:before {
33
33
  content: "\e608";
34
34
  }
35
35
 
@@ -85,7 +85,7 @@
85
85
  content: "\e615";
86
86
  }
87
87
 
88
- .mediaplayer[data-state="ended"] > .jme-media-overlay:before {
88
+ .mediaplayer.ended-state > .jme-media-overlay:before {
89
89
  content: "\e601";
90
90
  }
91
91
 
@@ -99,6 +99,15 @@
99
99
  font-weight: normal;
100
100
  font-style: normal;
101
101
  }
102
+ @-webkit-keyframes jmespin {
103
+ 0% {
104
+ -webkit-transform: rotate(0deg);
105
+ }
106
+
107
+ 100% {
108
+ -webkit-transform: rotate(360deg);
109
+ }
110
+ }
102
111
  @keyframes jmespin {
103
112
  0% {
104
113
  -webkit-transform: rotate(0deg);
@@ -264,17 +273,17 @@
264
273
  .mediaplayer[data-state="idle"] {
265
274
  cursor: pointer;
266
275
  }
267
- .mediaplayer[data-state="idle"] > .jme-media-overlay {
276
+ .mediaplayer.initial-state > .jme-media-overlay {
268
277
  background-position: 1px 1px;
269
278
  }
270
- .mediaplayer[data-state="idle"].has-ytposter.no-backgroundsize > .jme-media-overlay:before {
279
+ .mediaplayer.initial-state.has-ytposter.no-backgroundsize > .jme-media-overlay:before {
271
280
  content: "";
272
281
  background-position: 2px 2px;
273
282
  }
274
- .mediaplayer[data-state="ended"] {
283
+ .mediaplayer.ended-state {
275
284
  cursor: pointer;
276
285
  }
277
- .mediaplayer[data-state="ended"] > .jme-media-overlay {
286
+ .mediaplayer.ended-state > .jme-media-overlay {
278
287
  background-position: 3px 3px;
279
288
  }
280
289
  .mediaplayer[data-state="waiting"] {
@@ -284,6 +293,10 @@
284
293
  background-position: 4px 4px;
285
294
  }
286
295
  .mediaplayer[data-state="waiting"] > .jme-media-overlay:before {
296
+ -webkit-animation-name: jmespin;
297
+ -webkit-animation-iteration-count: infinite;
298
+ -webkit-animation-duration: 1100ms;
299
+ -webkit-animation-timing-function: linear;
287
300
  animation-name: jmespin;
288
301
  animation-iteration-count: infinite;
289
302
  animation-duration: 1100ms;
@@ -308,9 +321,10 @@
308
321
  left: 0;
309
322
  right: 0;
310
323
  bottom: 0;
311
- background: #000 no-repeat center / contain;
324
+ background: #000 no-repeat center;
325
+ background-size: contain;
312
326
  }
313
- .mediaplayer.initial-state .ws-poster {
327
+ .mediaplayer.initial-state .ws-poster, .mediaplayer.ended-state .ws-poster {
314
328
  display: block;
315
329
  }
316
330
  .mediaplayer.no-poster .ws-poster, .mediaplayer.no-backgroundsize div.ws-poster {
@@ -30,6 +30,15 @@ $browser-context: 16; // Default
30
30
  @return #{$pixels/$context}em
31
31
  }
32
32
 
33
+ @-webkit-keyframes jmespin {
34
+ 0% {
35
+ -webkit-transform: rotate(0deg);
36
+ }
37
+
38
+ 100% {
39
+ -webkit-transform: rotate(360deg);
40
+ }
41
+ }
33
42
 
34
43
  @keyframes jmespin {
35
44
  0% {
@@ -186,7 +195,9 @@ $browser-context: 16; // Default
186
195
 
187
196
  &[data-state="idle"] {
188
197
  cursor: pointer;
198
+ }
189
199
 
200
+ &.initial-state {
190
201
  > .jme-media-overlay {
191
202
  @extend %icon-play-circle;
192
203
  background-position: 1px 1px;
@@ -198,7 +209,7 @@ $browser-context: 16; // Default
198
209
  }
199
210
  }
200
211
 
201
- &[data-state="ended"] {
212
+ &.ended-state {
202
213
  cursor: pointer;
203
214
  > .jme-media-overlay {
204
215
  @extend %icon-loop;
@@ -213,6 +224,11 @@ $browser-context: 16; // Default
213
224
  background-position: 4px 4px;
214
225
 
215
226
  &:before {
227
+ -webkit-animation-name: jmespin;
228
+ -webkit-animation-iteration-count: infinite;
229
+ -webkit-animation-duration: 1100ms;
230
+ -webkit-animation-timing-function: linear;
231
+
216
232
  animation-name: jmespin;
217
233
  animation-iteration-count: infinite;
218
234
  animation-duration: 1100ms;
@@ -243,10 +259,12 @@ $browser-context: 16; // Default
243
259
  left: 0;
244
260
  right: 0;
245
261
  bottom: 0;
246
- background: #000 no-repeat center / contain;
262
+ background: #000 no-repeat center;
263
+ background-size: contain;
247
264
  }
248
265
 
249
- &.initial-state .ws-poster {
266
+ &.initial-state .ws-poster,
267
+ &.ended-state .ws-poster {
250
268
  display: block;
251
269
  }
252
270
 
@@ -353,6 +353,7 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
353
353
  delete base._seekpause;
354
354
  }
355
355
  wasPaused = null;
356
+ media.triggerHandler('updateprogress');
356
357
  }
357
358
  });
358
359
 
@@ -1316,10 +1317,11 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
1316
1317
 
1317
1318
  $.jme.registerPlugin('buffer-progress', {
1318
1319
  _create: function(control, media, base, options){
1320
+ var progressTimer;
1319
1321
  var indicator = $('<div class="buffer-progress-indicator" />').appendTo(control);
1320
1322
  var drawBufferProgress = function(){
1321
1323
  var progress = media.jmeProp('progress');
1322
-
1324
+ clearTimeout(progressTimer);
1323
1325
 
1324
1326
  if(options.progress !== progress){
1325
1327
  options.progress = progress;
@@ -1332,7 +1334,14 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
1332
1334
  indicator.css('width', 0);
1333
1335
  options.progress = 0;
1334
1336
  },
1335
- playing: drawBufferProgress
1337
+ playing: drawBufferProgress,
1338
+ 'seeked seeking updateprogress': function(e){
1339
+ clearTimeout(progressTimer);
1340
+ if(e.type != 'seeking'){
1341
+ progressTimer = setTimeout(drawBufferProgress, 100);
1342
+ }
1343
+ }
1344
+
1336
1345
  });
1337
1346
  drawBufferProgress();
1338
1347
  }
@@ -1418,8 +1427,8 @@ webshims.register('mediacontrols-lazy', function($, webshims, window, doc, undef
1418
1427
  var buttons = this.buttons.not(':disabled');
1419
1428
  var activeButton = buttons.filter(':focus');
1420
1429
 
1421
- activeButton = buttons[buttons.index(activeButton) + dir] || buttons.filter(dir > 0 ? ':first' : ':last');
1422
- activeButton.trigger('focus');
1430
+ activeButton = (activeButton[0] && buttons[buttons.index(activeButton) + dir]) || buttons[dir > 0 ? 'first' : 'last']();
1431
+ $(activeButton).trigger('focus');
1423
1432
  e.preventDefault();
1424
1433
  }
1425
1434
  },
@@ -151,17 +151,33 @@ webshims.register('mediacontrols', function($, webshims, window){
151
151
  var regYt = /youtube\.com\/[watch\?|v\/]+/i;
152
152
 
153
153
  var isInitial = data.media.prop('paused');
154
+ var isEnded = data.media.prop('ended');
154
155
  if(isInitial){
155
156
  data.player.addClass('initial-state');
156
157
  }
158
+ if(isEnded){
159
+ data.player.addClass('ended-state');
160
+ }
157
161
  if(!('backgroundSize' in $poster[0].style)){
158
162
  data.player.addClass('no-backgroundsize');
159
163
  }
160
- data.media.on('playing waiting seeked seeking', function(){
164
+ data.media.on('play playing waiting seeked seeking', function(e){
165
+
161
166
  if(isInitial){
162
167
  isInitial = false;
163
168
  data.player.removeClass('initial-state');
164
169
  }
170
+
171
+ if(isEnded){
172
+ isEnded = false;
173
+ data.player.removeClass('ended-state');
174
+ }
175
+ });
176
+ data.media.on('ended', function(){
177
+ if(!isEnded && !data.media.prop('loop') && data.media.prop('ended')){
178
+ isEnded = true;
179
+ data.player.addClass('ended-state');
180
+ }
165
181
  });
166
182
  return function(){
167
183
  var poster = data.media.attr('poster');
@@ -193,6 +209,11 @@ webshims.register('mediacontrols', function($, webshims, window){
193
209
  isInitial = true;
194
210
  }
195
211
 
212
+ if(isEnded){
213
+ isEnded = false;
214
+ data.player.removeClass('ended-state');
215
+ }
216
+
196
217
  if(lastYoutubeState !== hasYt){
197
218
  lastYoutubeState = hasYt;
198
219
  data.player[hasYt ? 'addClass' : 'removeClass']('has-ytposter');