webshims-rails 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
  4. data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
  5. data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
  6. data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
  7. data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
  8. data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
  9. data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
  10. data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
  11. data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
  12. data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
  13. data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
  14. data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
  15. data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
  18. data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
  21. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
  22. data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
  23. data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
  24. data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
  25. data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
  26. data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
  27. data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
  28. data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
  29. data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
  30. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
  31. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
  34. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
  35. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
  36. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
  37. data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
  38. data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
  42. data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
  43. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  44. data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
  45. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
  46. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
  47. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
  48. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
  49. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
  50. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
  52. data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
  53. metadata +8 -6
  54. data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
  55. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -1,5 +1,5 @@
1
1
  (function($){
2
- if(Modernizr.track && Modernizr.texttrackapi && document.addEventListener){
2
+ if(Modernizr.texttrackapi && document.addEventListener){
3
3
  var trackOptions = webshims.cfg.track;
4
4
  var trackListener = function(e){
5
5
  $(e.target).filter('track').each(changeApi);
@@ -224,8 +224,8 @@ webshims.register('track-ui', function($, webshims, window, document, undefined)
224
224
  (function(){
225
225
  var block;
226
226
  var triggerDisplayUpdate = function(elem){
227
+ block = true;
227
228
  setTimeout(function(){
228
- block = true;
229
229
  $(elem).triggerHandler('updatetrackdisplay');
230
230
  block = false;
231
231
  }, 9);
@@ -297,15 +297,21 @@ webshims.register('track-ui', function($, webshims, window, document, undefined)
297
297
  };
298
298
  var onUpdate = function(e){
299
299
  clearTimeout(updateTimer);
300
- if(e && e.type == 'timeupdate'){
301
- getDisplayCues();
300
+ if(e){
301
+ if(e.type == 'timeupdate'){
302
+ getDisplayCues();
303
+ }
302
304
  updateTimer2 = setTimeout(onUpdate, 90);
303
305
  } else {
304
306
  updateTimer = setTimeout(getDisplayCues, 9);
305
307
  }
306
308
  };
307
309
  var addTrackView = function(){
308
-
310
+ if(!trackList) {
311
+ trackList = elem.prop('textTracks');
312
+ }
313
+ //as soon as change on trackList is implemented in all browsers we do not need to have 'updatetrackdisplay' anymore
314
+ $( [trackList] ).on('change', onUpdate);
309
315
  elem
310
316
  .off('.trackview')
311
317
  .on('play.trackview timeupdate.trackview updatetrackdisplay.trackview', onUpdate)
@@ -323,25 +329,32 @@ webshims.register('track-ui', function($, webshims, window, document, undefined)
323
329
  if(!usesNativeTrack()){
324
330
  addTrackView();
325
331
  } else {
326
- elem.on('mediaelementapichange trackapichange', function(){
327
- if(!usesNativeTrack() || elem.is('.nonnative-api-active')){
328
- addTrackView();
329
- } else {
330
- clearTimeout(updateTimer);
331
- clearTimeout(updateTimer2);
332
-
333
- trackList = elem.prop('textTracks');
334
- baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
332
+
333
+ if(elem.is('.nonnative-api-active')){
334
+ addTrackView();
335
+ }
336
+ elem
337
+ .on('mediaelementapichange trackapichange', function(){
335
338
 
336
- $.each(trackList, function(i, track){
337
- if(track._shimActiveCues){
338
- delete track._shimActiveCues;
339
- }
340
- });
341
- trackDisplay.hide(baseData);
342
- elem.unbind('.trackview');
343
- }
344
- });
339
+ if(!usesNativeTrack() || elem.is('.nonnative-api-active')){
340
+ addTrackView();
341
+ } else {
342
+ clearTimeout(updateTimer);
343
+ clearTimeout(updateTimer2);
344
+
345
+ trackList = elem.prop('textTracks');
346
+ baseData = webshims.data(elem[0], 'mediaelementBase') || webshims.data(elem[0], 'mediaelementBase', {});
347
+
348
+ $.each(trackList, function(i, track){
349
+ if(track._shimActiveCues){
350
+ delete track._shimActiveCues;
351
+ }
352
+ });
353
+ trackDisplay.hide(baseData);
354
+ elem.unbind('.trackview');
355
+ }
356
+ })
357
+ ;
345
358
  }
346
359
  })
347
360
  ;
@@ -56,8 +56,8 @@ webshims.register('track', function($, webshims, window, document, undefined){
56
56
  kind: 'subtitles',
57
57
  label: '',
58
58
  language: '',
59
+ id: '',
59
60
  mode: 'disabled',
60
- readyState: 0,
61
61
  oncuechange: null,
62
62
  toString: function() {
63
63
  return "[object TextTrack]";
@@ -97,7 +97,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
97
97
  webshims.error("cue not part of track");
98
98
  return;
99
99
  }
100
- },
100
+ }/*,
101
101
  DISABLED: 'disabled',
102
102
  OFF: 'disabled',
103
103
  HIDDEN: 'hidden',
@@ -105,7 +105,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
105
105
  ERROR: 3,
106
106
  LOADED: 2,
107
107
  LOADING: 1,
108
- NONE: 0
108
+ NONE: 0*/
109
109
  };
110
110
  var copyProps = ['kind', 'label', 'srclang'];
111
111
  var copyName = {srclang: 'language'};
@@ -174,21 +174,47 @@ webshims.register('track', function($, webshims, window, document, undefined){
174
174
  if(!trackData){
175
175
  trackData = webshims.data(track, 'trackData');
176
176
  }
177
+
177
178
  if(trackData && !trackData.isTriggering){
178
179
  trackData.isTriggering = true;
179
180
  setTimeout(function(){
180
- if(!(trackData.track || {}).readyState){
181
- $(track).triggerHandler('checktrackmode');
182
- } else {
183
- $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
184
- }
181
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
185
182
  trackData.isTriggering = false;
186
183
  }, 1);
187
184
  }
188
185
  };
189
-
186
+ var isDefaultTrack = (function(){
187
+ var defaultKinds = {
188
+ subtitles: {
189
+ subtitles: 1,
190
+ captions: 1
191
+ },
192
+ descriptions: {descriptions: 1},
193
+ chapters: {chapters: 1}
194
+ };
195
+ defaultKinds.captions = defaultKinds.subtitles;
196
+
197
+ return function(track){
198
+ var kind, firstDefaultTrack;
199
+ var isDefault = $.prop(track, 'default');
200
+ if(isDefault && (kind = $.prop(track, 'kind')) != 'metadata'){
201
+ firstDefaultTrack = $(track)
202
+ .parent()
203
+ .find('track[default]')
204
+ .filter(function(){
205
+ return !!(defaultKinds[kind][$.prop(this, 'kind')]);
206
+ })[0]
207
+ ;
208
+ if(firstDefaultTrack != track){
209
+ isDefault = false;
210
+ webshims.error('more than one default track of a specific kind detected. Fall back to default = false');
211
+ }
212
+ }
213
+ return isDefault;
214
+ };
215
+ })();
190
216
  var emptyDiv = $('<div />')[0];
191
- window.TextTrackCue = function(startTime, endTime, text){
217
+ var TextTrackCue = function(startTime, endTime, text){
192
218
  if(arguments.length != 3){
193
219
  webshims.error("wrong arguments.length for TextTrackCue.constructor");
194
220
  }
@@ -197,13 +223,11 @@ webshims.register('track', function($, webshims, window, document, undefined){
197
223
  this.endTime = endTime;
198
224
  this.text = text;
199
225
 
200
- this.id = "";
201
- this.pauseOnExit = false;
202
226
 
203
227
  createEventTarget(this);
204
228
  };
205
229
 
206
- window.TextTrackCue.prototype = {
230
+ TextTrackCue.prototype = {
207
231
 
208
232
  onenter: null,
209
233
  onexit: null,
@@ -245,6 +269,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
245
269
  // align: 'middle'
246
270
  };
247
271
 
272
+ window.TextTrackCue = TextTrackCue;
248
273
 
249
274
 
250
275
 
@@ -290,23 +315,20 @@ webshims.register('track', function($, webshims, window, document, undefined){
290
315
  })();
291
316
 
292
317
  mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
293
- var loadEvents = 'play playing timeupdate updatetrackdisplay';
318
+ var loadEvents = 'play playing updatetrackdisplay';
294
319
  var obj = trackData.track;
295
320
  var load = function(){
296
- var src = $.prop(track, 'src');
297
- var error;
298
- var ajax;
299
- if(obj.mode != 'disabled' && src && $.attr(track, 'src')){
321
+ var error, ajax, src;
322
+ if(obj.mode != 'disabled' && $.attr(track, 'src') && (src = $.prop(track, 'src'))){
300
323
  $(mediaelem).unbind(loadEvents, load);
301
- $(track).unbind('checktrackmode', load);
302
- if(!obj.readyState){
324
+ if(!trackData.readyState){
303
325
  error = function(){
304
- obj.readyState = 3;
326
+ trackData.readyState = 3;
305
327
  obj.cues = null;
306
328
  obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
307
329
  $(track).triggerHandler('error');
308
330
  };
309
- obj.readyState = 1;
331
+ trackData.readyState = 1;
310
332
  try {
311
333
  obj.cues = mediaelement.createCueList();
312
334
  obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
@@ -319,7 +341,7 @@ webshims.register('track', function($, webshims, window, document, undefined){
319
341
  }
320
342
  mediaelement.parseCaptions(text, obj, function(cues){
321
343
  if(cues && 'length' in cues){
322
- obj.readyState = 2;
344
+ trackData.readyState = 2;
323
345
  $(track).triggerHandler('load');
324
346
  $(mediaelem).triggerHandler('updatetrackdisplay');
325
347
  } else {
@@ -332,20 +354,18 @@ webshims.register('track', function($, webshims, window, document, undefined){
332
354
  });
333
355
  } catch(er){
334
356
  error();
335
- webshims.warn(er);
357
+ webshims.error(er);
336
358
  }
337
359
  }
338
360
  }
339
361
  };
340
- obj.readyState = 0;
362
+ trackData.readyState = 0;
341
363
  obj.shimActiveCues = null;
342
364
  obj._shimActiveCues = null;
343
365
  obj.activeCues = null;
344
366
  obj.cues = null;
345
367
  $(mediaelem).unbind(loadEvents, load);
346
- $(track).unbind('checktrackmode', load);
347
368
  $(mediaelem).on(loadEvents, load);
348
- $(track).on('checktrackmode', load);
349
369
  if(_default){
350
370
  obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
351
371
  load();
@@ -387,9 +407,9 @@ webshims.register('track', function($, webshims, window, document, undefined){
387
407
  });
388
408
  });
389
409
  }
390
-
410
+ obj.id = $(track).prop('id');
391
411
  trackData = webshims.data(track, 'trackData', {track: obj});
392
- mediaelement.loadTextTrack(mediaelem, track, trackData, ($.prop(track, 'default') && $(track).siblings('track[default]')[ADDBACK]()[0] == track));
412
+ mediaelement.loadTextTrack(mediaelem, track, trackData, isDefaultTrack(track));
393
413
  } else {
394
414
  if(supportTrackMod){
395
415
  copyProps.forEach(function(copyProp){
@@ -404,7 +424,12 @@ webshims.register('track', function($, webshims, window, document, undefined){
404
424
  obj.mode = 'hidden';
405
425
  obj.readyState = 2;
406
426
  }
427
+ if(obj.kind == 'subtitles' && !obj.language){
428
+ webshims.error('you must provide a language for track in subtitles state');
429
+ }
430
+ obj.__wsmode = obj.mode;
407
431
  }
432
+
408
433
  return obj;
409
434
  };
410
435
 
@@ -597,9 +622,33 @@ modified for webshims
597
622
  baseData.textTracks = [];
598
623
  webshims.defineProperties(baseData.textTracks, {
599
624
  onaddtrack: {value: null},
600
- onremovetrack: {value: null}
625
+ onremovetrack: {value: null},
626
+ onchange: {value: null},
627
+ getTrackById: {
628
+ value: function(id){
629
+ var track = null;
630
+ for(var i = 0; i < baseData.textTracks.length; i++){
631
+ if(id == baseData.textTracks[i].id){
632
+ track = baseData.textTracks[i];
633
+ break;
634
+ }
635
+ }
636
+ return track;
637
+ }
638
+ }
601
639
  });
602
640
  createEventTarget(baseData.textTracks);
641
+ $(mediaelem).on('updatetrackdisplay', function(){
642
+ var track;
643
+ for(var i = 0; i < baseData.textTracks.length; i++){
644
+ track = baseData.textTracks[i];
645
+ if(track.__wsmode != track.mode){
646
+ track.__wsmode = track.mode;
647
+ $([ baseData.textTracks ]).triggerHandler('change');
648
+ }
649
+ }
650
+ });
651
+
603
652
  }
604
653
  return baseData.textTracks;
605
654
  };
@@ -654,10 +703,6 @@ modified for webshims
654
703
  if(!supportTrackMod){
655
704
  trackData.track[name] = $.prop(this, copyProp);
656
705
  }
657
- clearTimeout(trackData.changedTrackPropTimer);
658
- trackData.changedTrackPropTimer = setTimeout(function(){
659
- $(track).trigger('updatesubtitlestate');
660
- }, 1);
661
706
  }
662
707
  });
663
708
  });
@@ -694,7 +739,8 @@ modified for webshims
694
739
  },
695
740
  readyState: {
696
741
  get: function(){
697
- return ($.prop(this, 'track') || {readyState: 0}).readyState;
742
+
743
+ return (webshims.data(this, 'trackData') || {readyState: 0}).readyState;
698
744
  },
699
745
  writeable: false
700
746
  },
@@ -812,7 +858,7 @@ modified for webshims
812
858
  });
813
859
  });
814
860
 
815
- if(Modernizr.track){
861
+ if(Modernizr.texttrackapi){
816
862
  $('video, audio').trigger('trackapichange');
817
863
  }
818
864
  });
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webshims-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.1
4
+ version: 1.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Reese
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-22 00:00:00.000000000 Z
11
+ date: 2013-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -74,8 +74,6 @@ files:
74
74
  - vendor/assets/javascripts/webshims/shims/combos/25.js
75
75
  - vendor/assets/javascripts/webshims/shims/combos/26.js
76
76
  - vendor/assets/javascripts/webshims/shims/combos/27.js
77
- - vendor/assets/javascripts/webshims/shims/combos/28.js
78
- - vendor/assets/javascripts/webshims/shims/combos/29.js
79
77
  - vendor/assets/javascripts/webshims/shims/combos/3.js
80
78
  - vendor/assets/javascripts/webshims/shims/combos/30.js
81
79
  - vendor/assets/javascripts/webshims/shims/combos/31.js
@@ -98,15 +96,16 @@ files:
98
96
  - vendor/assets/javascripts/webshims/shims/form-number-date-api.js
99
97
  - vendor/assets/javascripts/webshims/shims/form-number-date-ui.js
100
98
  - vendor/assets/javascripts/webshims/shims/form-shim-extend.js
99
+ - vendor/assets/javascripts/webshims/shims/form-shim-extend2.js
101
100
  - vendor/assets/javascripts/webshims/shims/form-validation.js
102
101
  - vendor/assets/javascripts/webshims/shims/form-validators.js
103
102
  - vendor/assets/javascripts/webshims/shims/forms-picker.js
104
103
  - vendor/assets/javascripts/webshims/shims/geolocation.js
105
104
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-ar.js
106
105
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-ch-ZN.js
107
- - vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.txt
106
+ - vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js
108
107
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-el.js
109
- - vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.txt
108
+ - vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js
110
109
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-es.js
111
110
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-fr.js
112
111
  - vendor/assets/javascripts/webshims/shims/i18n/formcfg-he.js
@@ -143,9 +142,12 @@ files:
143
142
  - vendor/assets/javascripts/webshims/shims/range-ui.js
144
143
  - vendor/assets/javascripts/webshims/shims/styles/config.rb
145
144
  - vendor/assets/javascripts/webshims/shims/styles/details-arrows.png
145
+ - vendor/assets/javascripts/webshims/shims/styles/forms-ext.css
146
146
  - vendor/assets/javascripts/webshims/shims/styles/forms.png
147
147
  - vendor/assets/javascripts/webshims/shims/styles/polyfill-loader.gif
148
148
  - vendor/assets/javascripts/webshims/shims/styles/range-track.png
149
+ - vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss
150
+ - vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss
149
151
  - vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss
150
152
  - vendor/assets/javascripts/webshims/shims/styles/shim.css
151
153
  - vendor/assets/javascripts/webshims/shims/styles/vertical-range.png
@@ -1,2196 +0,0 @@
1
- //DOM-Extension helper
2
- webshims.register('dom-extend', function($, webshims, window, document, undefined){
3
- "use strict";
4
- var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
5
- var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
6
- webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
7
-
8
- if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
9
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
10
- }
11
-
12
- if(!$.parseHTML){
13
- webshims.error("Webshims needs jQuery 1.8+ to work properly. Please update your jQuery version or downgrade webshims.");
14
- }
15
-
16
- if (!webshims.cfg.no$Switch) {
17
- var switch$ = function(){
18
- if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
19
- webshims.error("jQuery was included more than once. Make sure to include it only once or try the $.noConflict(extreme) feature! Webshims and other Plugins might not work properly. Or set webshims.cfg.no$Switch to 'true'.");
20
- if (window.$) {
21
- window.$ = webshims.$;
22
- }
23
- window.jQuery = webshims.$;
24
- }
25
- if(webshims.M != Modernizr){
26
- webshims.error("Modernizr was included more than once. Make sure to include it only once! Webshims and other scripts might not work properly.");
27
- for(var i in Modernizr){
28
- if(!(i in webshims.M)){
29
- webshims.M[i] = Modernizr[i];
30
- }
31
- }
32
- Modernizr = webshims.M;
33
- }
34
- };
35
- switch$();
36
- setTimeout(switch$, 90);
37
- webshims.ready('DOM', switch$);
38
- $(switch$);
39
- webshims.ready('WINDOWLOAD', switch$);
40
-
41
- }
42
- // (function(){
43
- // var hostNames = {
44
- // 'afarkas.github.io': 1,
45
- // localhost: 1,
46
- // '127.0.0.1': 1
47
- // };
48
- //
49
- // if( webshims.debug && (hostNames[location.hostname] || location.protocol == 'file:') ){
50
- // var list = $('<ul class="webshims-debug-list" />');
51
- // webshims.errorLog.push = function(message){
52
- // list.appendTo('body');
53
- // $('<li style="display: none;">'+ message +'</li>')
54
- // .appendTo(list)
55
- // .slideDown()
56
- // .delay(3000)
57
- // .slideUp(function(){
58
- // $(this).remove();
59
- // if(!$('li', list).length){
60
- // list.detach();
61
- // }
62
- // })
63
- // ;
64
- // };
65
- // $.each(webshims.errorLog, function(i, message){
66
- // webshims.errorLog.push(message);
67
- // });
68
- // }
69
- // })();
70
-
71
- //shortcus
72
- var modules = webshims.modules;
73
- var listReg = /\s*,\s*/;
74
-
75
- //proxying attribute
76
- var olds = {};
77
- var havePolyfill = {};
78
- var extendedProps = {};
79
- var extendQ = {};
80
- var modifyProps = {};
81
-
82
- var oldVal = $.fn.val;
83
- var singleVal = function(elem, name, val, pass, _argless){
84
- return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
85
- };
86
-
87
- //jquery mobile and jquery ui
88
- if(!$.widget){
89
- (function(){
90
- var _cleanData = $.cleanData;
91
- $.cleanData = function( elems ) {
92
- if(!$.widget){
93
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
94
- try {
95
- $( elem ).triggerHandler( "remove" );
96
- // http://bugs.jquery.com/ticket/8235
97
- } catch( e ) {}
98
- }
99
- }
100
- _cleanData( elems );
101
- };
102
- })();
103
- }
104
-
105
-
106
- $.fn.val = function(val){
107
- var elem = this[0];
108
- if(arguments.length && val == null){
109
- val = '';
110
- }
111
- if(!arguments.length){
112
- if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
113
- return $.prop(elem, 'value', val, 'val', true);
114
- }
115
- if($.isArray(val)){
116
- return oldVal.apply(this, arguments);
117
- }
118
- var isFunction = $.isFunction(val);
119
- return this.each(function(i){
120
- elem = this;
121
- if(elem.nodeType === 1){
122
- if(isFunction){
123
- var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
124
- if(genVal == null){
125
- genVal = '';
126
- }
127
- $.prop(elem, 'value', genVal, 'val') ;
128
- } else {
129
- $.prop(elem, 'value', val, 'val');
130
- }
131
- }
132
- });
133
- };
134
- $.fn.onTrigger = function(evt, fn){
135
- return this.on(evt, fn).each(fn);
136
- };
137
-
138
- $.fn.onWSOff = function(evt, fn, trigger, evtDel){
139
- if(!evtDel){
140
- evtDel = document;
141
- }
142
- $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
143
- this.on('remove', function(e){
144
- if(!e.originalEvent){
145
- $(evtDel).off(evt, fn);
146
- }
147
- });
148
- return this;
149
- };
150
-
151
- var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000));
152
- var elementData = function(elem, key, val){
153
- elem = elem.jquery ? elem[0] : elem;
154
- if(!elem){return val || {};}
155
- var data = $.data(elem, dataID);
156
- if(val !== undefined){
157
- if(!data){
158
- data = $.data(elem, dataID, {});
159
- }
160
- if(key){
161
- data[key] = val;
162
- }
163
- }
164
-
165
- return key ? data && data[key] : data;
166
- };
167
-
168
-
169
- [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
170
- $.fn[data.name] = function(){
171
- var elems = [];
172
- this.each(function(){
173
- var shadowData = elementData(this, 'shadowData');
174
- var elem = shadowData && shadowData[data.prop] || this;
175
- if($.inArray(elem, elems) == -1){
176
- elems.push(elem);
177
- }
178
- });
179
- return this.pushStack(elems);
180
- };
181
- });
182
-
183
-
184
- ['removeAttr', 'prop', 'attr'].forEach(function(type){
185
- olds[type] = $[type];
186
- $[type] = function(elem, name, value, pass, _argless){
187
- var isVal = (pass == 'val');
188
- var oldMethod = !isVal ? olds[type] : singleVal;
189
- if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
190
- return oldMethod(elem, name, value, pass, _argless);
191
- }
192
-
193
- var nodeName = (elem.nodeName || '').toLowerCase();
194
- var desc = extendedProps[nodeName];
195
- var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
196
- var propMethod;
197
- var oldValMethod;
198
- var ret;
199
-
200
-
201
- if(!desc){
202
- desc = extendedProps['*'];
203
- }
204
- if(desc){
205
- desc = desc[name];
206
- }
207
-
208
- if(desc){
209
- propMethod = desc[curType];
210
- }
211
-
212
- if(propMethod){
213
- if(name == 'value'){
214
- oldValMethod = propMethod.isVal;
215
- propMethod.isVal = isVal;
216
- }
217
- if(curType === 'removeAttr'){
218
- return propMethod.value.call(elem);
219
- } else if(value === undefined){
220
- return (propMethod.get) ?
221
- propMethod.get.call(elem) :
222
- propMethod.value
223
- ;
224
- } else if(propMethod.set) {
225
- if(type == 'attr' && value === true){
226
- value = name;
227
- }
228
-
229
- ret = propMethod.set.call(elem, value);
230
- }
231
- if(name == 'value'){
232
- propMethod.isVal = oldValMethod;
233
- }
234
- } else {
235
- ret = oldMethod(elem, name, value, pass, _argless);
236
- }
237
- if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
238
-
239
- var boolValue;
240
- if(curType == 'removeAttr'){
241
- boolValue = false;
242
- } else if(curType == 'prop'){
243
- boolValue = !!(value);
244
- } else {
245
- boolValue = true;
246
- }
247
-
248
- modifyProps[nodeName][name].forEach(function(fn){
249
- if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
250
- fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
251
- }
252
- });
253
- }
254
- return ret;
255
- };
256
-
257
- extendQ[type] = function(nodeName, prop, desc){
258
-
259
- if(!extendedProps[nodeName]){
260
- extendedProps[nodeName] = {};
261
- }
262
- if(!extendedProps[nodeName][prop]){
263
- extendedProps[nodeName][prop] = {};
264
- }
265
- var oldDesc = extendedProps[nodeName][prop][type];
266
- var getSup = function(propType, descriptor, oDesc){
267
- if(descriptor && descriptor[propType]){
268
- return descriptor[propType];
269
- }
270
- if(oDesc && oDesc[propType]){
271
- return oDesc[propType];
272
- }
273
- if(type == 'prop' && prop == 'value'){
274
- return function(value){
275
- var elem = this;
276
- return (desc.isVal) ?
277
- singleVal(elem, prop, value, false, (arguments.length === 0)) :
278
- olds[type](elem, prop, value)
279
- ;
280
- };
281
- }
282
- if(type == 'prop' && propType == 'value' && desc.value.apply){
283
- return function(value){
284
- var sup = olds[type](this, prop);
285
- if(sup && sup.apply){
286
- sup = sup.apply(this, arguments);
287
- }
288
- return sup;
289
- };
290
- }
291
- return function(value){
292
- return olds[type](this, prop, value);
293
- };
294
- };
295
- extendedProps[nodeName][prop][type] = desc;
296
- if(desc.value === undefined){
297
- if(!desc.set){
298
- desc.set = desc.writeable ?
299
- getSup('set', desc, oldDesc) :
300
- (webshims.cfg.useStrict && prop == 'prop') ?
301
- function(){throw(prop +' is readonly on '+ nodeName);} :
302
- function(){webshims.info(prop +' is readonly on '+ nodeName);}
303
- ;
304
- }
305
- if(!desc.get){
306
- desc.get = getSup('get', desc, oldDesc);
307
- }
308
-
309
- }
310
-
311
- ['value', 'get', 'set'].forEach(function(descProp){
312
- if(desc[descProp]){
313
- desc['_sup'+descProp] = getSup(descProp, oldDesc);
314
- }
315
- });
316
- };
317
-
318
- });
319
-
320
- var extendNativeValue = (function(){
321
- var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
322
- var has = Object.prototype.hasOwnProperty;
323
- //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
324
- var isExtendNativeSave = Modernizr.advancedObjectProperties && Modernizr.objectAccessor;
325
- return function(nodeName, prop, desc){
326
- var elem , elemProto;
327
- if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
328
- var sup = elem[prop];
329
- desc._supvalue = function(){
330
- if(sup && sup.apply){
331
- return sup.apply(this, arguments);
332
- }
333
- return sup;
334
- };
335
- elemProto[prop] = desc.value;
336
- } else {
337
- desc._supvalue = function(){
338
- var data = elementData(this, 'propValue');
339
- if(data && data[prop] && data[prop].apply){
340
- return data[prop].apply(this, arguments);
341
- }
342
- return data && data[prop];
343
- };
344
- initProp.extendValue(nodeName, prop, desc.value);
345
- }
346
- desc.value._supvalue = desc._supvalue;
347
- };
348
- })();
349
-
350
- var initProp = (function(){
351
-
352
- var initProps = {};
353
-
354
- webshims.addReady(function(context, contextElem){
355
- var nodeNameCache = {};
356
- var getElementsByName = function(name){
357
- if(!nodeNameCache[name]){
358
- nodeNameCache[name] = $(context.getElementsByTagName(name));
359
- if(contextElem[0] && $.nodeName(contextElem[0], name)){
360
- nodeNameCache[name] = nodeNameCache[name].add(contextElem);
361
- }
362
- }
363
- };
364
-
365
-
366
- $.each(initProps, function(name, fns){
367
- getElementsByName(name);
368
- if(!fns || !fns.forEach){
369
- webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
370
- return;
371
- }
372
- fns.forEach(function(fn){
373
- nodeNameCache[name].each(fn);
374
- });
375
- });
376
- nodeNameCache = null;
377
- });
378
-
379
- var tempCache;
380
- var emptyQ = $([]);
381
- var createNodeNameInit = function(nodeName, fn){
382
- if(!initProps[nodeName]){
383
- initProps[nodeName] = [fn];
384
- } else {
385
- initProps[nodeName].push(fn);
386
- }
387
- if($.isDOMReady){
388
- (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
389
- }
390
- };
391
-
392
- var elementExtends = {};
393
- return {
394
- createTmpCache: function(nodeName){
395
- if($.isDOMReady){
396
- tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
397
- }
398
- return tempCache || emptyQ;
399
- },
400
- flushTmpCache: function(){
401
- tempCache = null;
402
- },
403
- content: function(nodeName, prop){
404
- createNodeNameInit(nodeName, function(){
405
- var val = $.attr(this, prop);
406
- if(val != null){
407
- $.attr(this, prop, val);
408
- }
409
- });
410
- },
411
- createElement: function(nodeName, fn){
412
- createNodeNameInit(nodeName, fn);
413
- },
414
- extendValue: function(nodeName, prop, value){
415
- createNodeNameInit(nodeName, function(){
416
- $(this).each(function(){
417
- var data = elementData(this, 'propValue', {});
418
- data[prop] = this[prop];
419
- this[prop] = value;
420
- });
421
- });
422
- }
423
- };
424
- })();
425
-
426
- var createPropDefault = function(descs, removeType){
427
- if(descs.defaultValue === undefined){
428
- descs.defaultValue = '';
429
- }
430
- if(!descs.removeAttr){
431
- descs.removeAttr = {
432
- value: function(){
433
- descs[removeType || 'prop'].set.call(this, descs.defaultValue);
434
- descs.removeAttr._supvalue.call(this);
435
- }
436
- };
437
- }
438
- if(!descs.attr){
439
- descs.attr = {};
440
- }
441
- };
442
-
443
- $.extend(webshims, {
444
-
445
- getID: (function(){
446
- var ID = new Date().getTime();
447
- return function(elem){
448
- elem = $(elem);
449
- var id = elem.prop('id');
450
- if(!id){
451
- ID++;
452
- id = 'ID-'+ ID;
453
- elem.eq(0).prop('id', id);
454
- }
455
- return id;
456
- };
457
- })(),
458
- implement: function(elem, type){
459
- var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
460
- if(data[type]){
461
- webshims.warn(type +' already implemented for element #'+elem.id);
462
- return false;
463
- }
464
- data[type] = true;
465
- return true;
466
- },
467
- extendUNDEFProp: function(obj, props){
468
- $.each(props, function(name, prop){
469
- if( !(name in obj) ){
470
- obj[name] = prop;
471
- }
472
- });
473
- },
474
- //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
475
- createPropDefault: createPropDefault,
476
- data: elementData,
477
- moveToFirstEvent: function(elem, eventType, bindType){
478
- var events = ($._data(elem, 'events') || {})[eventType];
479
- var fn;
480
-
481
- if(events && events.length > 1){
482
- fn = events.pop();
483
- if(!bindType){
484
- bindType = 'bind';
485
- }
486
- if(bindType == 'bind' && events.delegateCount){
487
- events.splice( events.delegateCount, 0, fn);
488
- } else {
489
- events.unshift( fn );
490
- }
491
-
492
-
493
- }
494
- elem = null;
495
- },
496
- addShadowDom: (function(){
497
- var resizeTimer;
498
- var lastHeight;
499
- var lastWidth;
500
-
501
- var docObserve = {
502
- init: false,
503
- runs: 0,
504
- test: function(){
505
- var height = docObserve.getHeight();
506
- var width = docObserve.getWidth();
507
-
508
- if(height != docObserve.height || width != docObserve.width){
509
- docObserve.height = height;
510
- docObserve.width = width;
511
- docObserve.handler({type: 'docresize'});
512
- docObserve.runs++;
513
- if(docObserve.runs < 9){
514
- setTimeout(docObserve.test, 90);
515
- }
516
- } else {
517
- docObserve.runs = 0;
518
- }
519
- },
520
- handler: function(e){
521
- clearTimeout(resizeTimer);
522
- resizeTimer = setTimeout(function(){
523
- if(e.type == 'resize'){
524
- var width = $(window).width();
525
- var height = $(window).width();
526
- if(height == lastHeight && width == lastWidth){
527
- return;
528
- }
529
- lastHeight = height;
530
- lastWidth = width;
531
-
532
- docObserve.height = docObserve.getHeight();
533
- docObserve.width = docObserve.getWidth();
534
-
535
- }
536
- $(document).triggerHandler('updateshadowdom');
537
- }, (e.type == 'resize') ? 50 : 9);
538
- },
539
- _create: function(){
540
- $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
541
- var body = document.body;
542
- var doc = document.documentElement;
543
- docObserve[type] = function(){
544
- return Math.max(
545
- body[ "scroll" + name ], doc[ "scroll" + name ],
546
- body[ "offset" + name ], doc[ "offset" + name ],
547
- doc[ "client" + name ]
548
- );
549
- };
550
- });
551
- },
552
- start: function(){
553
- if(!this.init && document.body){
554
- this.init = true;
555
- this._create();
556
- this.height = docObserve.getHeight();
557
- this.width = docObserve.getWidth();
558
- setInterval(this.test, 600);
559
- $(this.test);
560
- webshims.ready('WINDOWLOAD', this.test);
561
- $(document).on('updatelayout', this.handler);
562
- $(window).bind('resize', this.handler);
563
- (function(){
564
- var oldAnimate = $.fn.animate;
565
- var animationTimer;
566
-
567
- $.fn.animate = function(){
568
- clearTimeout(animationTimer);
569
- animationTimer = setTimeout(function(){
570
- docObserve.test();
571
- }, 99);
572
-
573
- return oldAnimate.apply(this, arguments);
574
- };
575
- })();
576
- }
577
- }
578
- };
579
-
580
-
581
- webshims.docObserve = function(){
582
- webshims.ready('DOM', function(){
583
- docObserve.start();
584
- });
585
- };
586
- return function(nativeElem, shadowElem, opts){
587
- if(nativeElem && shadowElem){
588
- opts = opts || {};
589
- if(nativeElem.jquery){
590
- nativeElem = nativeElem[0];
591
- }
592
- if(shadowElem.jquery){
593
- shadowElem = shadowElem[0];
594
- }
595
- var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
596
- var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
597
- var shadowFocusElementData = {};
598
- if(!opts.shadowFocusElement){
599
- opts.shadowFocusElement = shadowElem;
600
- } else if(opts.shadowFocusElement){
601
- if(opts.shadowFocusElement.jquery){
602
- opts.shadowFocusElement = opts.shadowFocusElement[0];
603
- }
604
- shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
605
- }
606
-
607
- $(nativeElem).on('remove', function(e){
608
- if (!e.originalEvent) {
609
- setTimeout(function(){
610
- $(shadowElem).remove();
611
- }, 4);
612
- }
613
- });
614
-
615
- nativeData.hasShadow = shadowElem;
616
- shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
617
- shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
618
- nativeElement: nativeElem,
619
- shadowElement: shadowElem,
620
- shadowFocusElement: opts.shadowFocusElement
621
- };
622
- if(opts.shadowChilds){
623
- opts.shadowChilds.each(function(){
624
- elementData(this, 'shadowData', shadowData.shadowData);
625
- });
626
- }
627
-
628
- if(opts.data){
629
- shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
630
- }
631
- opts = null;
632
- }
633
- webshims.docObserve();
634
- };
635
- })(),
636
- propTypes: {
637
- standard: function(descs, name){
638
- createPropDefault(descs);
639
- if(descs.prop){return;}
640
- descs.prop = {
641
- set: function(val){
642
- descs.attr.set.call(this, ''+val);
643
- },
644
- get: function(){
645
- return descs.attr.get.call(this) || descs.defaultValue;
646
- }
647
- };
648
-
649
- },
650
- "boolean": function(descs, name){
651
-
652
- createPropDefault(descs);
653
- if(descs.prop){return;}
654
- descs.prop = {
655
- set: function(val){
656
- if(val){
657
- descs.attr.set.call(this, "");
658
- } else {
659
- descs.removeAttr.value.call(this);
660
- }
661
- },
662
- get: function(){
663
- return descs.attr.get.call(this) != null;
664
- }
665
- };
666
- },
667
- "src": (function(){
668
- var anchor = document.createElement('a');
669
- anchor.style.display = "none";
670
- return function(descs, name){
671
-
672
- createPropDefault(descs);
673
- if(descs.prop){return;}
674
- descs.prop = {
675
- set: function(val){
676
- descs.attr.set.call(this, val);
677
- },
678
- get: function(){
679
- var href = this.getAttribute(name);
680
- var ret;
681
- if(href == null){return '';}
682
-
683
- anchor.setAttribute('href', href+'' );
684
-
685
- if(!supportHrefNormalized){
686
- try {
687
- $(anchor).insertAfter(this);
688
- ret = anchor.getAttribute('href', 4);
689
- } catch(er){
690
- ret = anchor.getAttribute('href', 4);
691
- }
692
- $(anchor).detach();
693
- }
694
- return ret || anchor.href;
695
- }
696
- };
697
- };
698
- })(),
699
- enumarated: function(descs, name){
700
-
701
- createPropDefault(descs);
702
- if(descs.prop){return;}
703
- descs.prop = {
704
- set: function(val){
705
- descs.attr.set.call(this, val);
706
- },
707
- get: function(){
708
- var val = (descs.attr.get.call(this) || '').toLowerCase();
709
- if(!val || descs.limitedTo.indexOf(val) == -1){
710
- val = descs.defaultValue;
711
- }
712
- return val;
713
- }
714
- };
715
- }
716
-
717
- // ,unsignedLong: $.noop
718
- // ,"doubble": $.noop
719
- // ,"long": $.noop
720
- // ,tokenlist: $.noop
721
- // ,settableTokenlist: $.noop
722
- },
723
- reflectProperties: function(nodeNames, props){
724
- if(typeof props == 'string'){
725
- props = props.split(listReg);
726
- }
727
- props.forEach(function(prop){
728
- webshims.defineNodeNamesProperty(nodeNames, prop, {
729
- prop: {
730
- set: function(val){
731
- $.attr(this, prop, val);
732
- },
733
- get: function(){
734
- return $.attr(this, prop) || '';
735
- }
736
- }
737
- });
738
- });
739
- },
740
- defineNodeNameProperty: function(nodeName, prop, descs){
741
- havePolyfill[prop] = true;
742
-
743
- if(descs.reflect){
744
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
745
- }
746
-
747
- ['prop', 'attr', 'removeAttr'].forEach(function(type){
748
- var desc = descs[type];
749
- if(desc){
750
- if(type === 'prop'){
751
- desc = $.extend({writeable: true}, desc);
752
- } else {
753
- desc = $.extend({}, desc, {writeable: true});
754
- }
755
-
756
- extendQ[type](nodeName, prop, desc);
757
- if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
758
- extendNativeValue(nodeName, prop, desc);
759
- }
760
- descs[type] = desc;
761
- }
762
- });
763
- if(descs.initAttr){
764
- initProp.content(nodeName, prop);
765
- }
766
- return descs;
767
- },
768
-
769
- defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
770
- var olddesc;
771
- for(var prop in descs){
772
- if(!_noTmpCache && descs[prop].initAttr){
773
- initProp.createTmpCache(name);
774
- }
775
- if(propType){
776
- if(descs[prop][propType]){
777
- //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
778
- } else {
779
- descs[prop][propType] = {};
780
- ['value', 'set', 'get'].forEach(function(copyProp){
781
- if(copyProp in descs[prop]){
782
- descs[prop][propType][copyProp] = descs[prop][copyProp];
783
- delete descs[prop][copyProp];
784
- }
785
- });
786
- }
787
- }
788
- descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
789
- }
790
- if(!_noTmpCache){
791
- initProp.flushTmpCache();
792
- }
793
- return descs;
794
- },
795
-
796
- createElement: function(nodeName, create, descs){
797
- var ret;
798
- if($.isFunction(create)){
799
- create = {
800
- after: create
801
- };
802
- }
803
- initProp.createTmpCache(nodeName);
804
- if(create.before){
805
- initProp.createElement(nodeName, create.before);
806
- }
807
- if(descs){
808
- ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
809
- }
810
- if(create.after){
811
- initProp.createElement(nodeName, create.after);
812
- }
813
- initProp.flushTmpCache();
814
- return ret;
815
- },
816
- onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
817
- if(typeof nodeNames == 'string'){
818
- nodeNames = nodeNames.split(listReg);
819
- }
820
- if($.isFunction(desc)){
821
- desc = {set: desc};
822
- }
823
-
824
- nodeNames.forEach(function(name){
825
- if(!modifyProps[name]){
826
- modifyProps[name] = {};
827
- }
828
- if(typeof props == 'string'){
829
- props = props.split(listReg);
830
- }
831
- if(desc.initAttr){
832
- initProp.createTmpCache(name);
833
- }
834
- props.forEach(function(prop){
835
- if(!modifyProps[name][prop]){
836
- modifyProps[name][prop] = [];
837
- havePolyfill[prop] = true;
838
- }
839
- if(desc.set){
840
- if(only){
841
- desc.set.only = only;
842
- }
843
- modifyProps[name][prop].push(desc.set);
844
- }
845
-
846
- if(desc.initAttr){
847
- initProp.content(name, prop);
848
- }
849
- });
850
- initProp.flushTmpCache();
851
-
852
- });
853
- },
854
- defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
855
- if(!descs){
856
- descs = {};
857
- }
858
- if($.isFunction(descs)){
859
- descs.set = descs;
860
- }
861
- webshims.defineNodeNamesProperty(elementNames, prop, {
862
- attr: {
863
- set: function(val){
864
- this.setAttribute(prop, val);
865
- if(descs.set){
866
- descs.set.call(this, true);
867
- }
868
- },
869
- get: function(){
870
- var ret = this.getAttribute(prop);
871
- return (ret == null) ? undefined : prop;
872
- }
873
- },
874
- removeAttr: {
875
- value: function(){
876
- this.removeAttribute(prop);
877
- if(descs.set){
878
- descs.set.call(this, false);
879
- }
880
- }
881
- },
882
- reflect: true,
883
- propType: 'boolean',
884
- initAttr: descs.initAttr || false
885
- });
886
- },
887
- contentAttr: function(elem, name, val){
888
- if(!elem.nodeName){return;}
889
- var attr;
890
- if(val === undefined){
891
- attr = (elem.attributes[name] || {});
892
- val = attr.specified ? attr.value : null;
893
- return (val == null) ? undefined : val;
894
- }
895
-
896
- if(typeof val == 'boolean'){
897
- if(!val){
898
- elem.removeAttribute(name);
899
- } else {
900
- elem.setAttribute(name, name);
901
- }
902
- } else {
903
- elem.setAttribute(name, val);
904
- }
905
- },
906
-
907
- // set current Lang:
908
- // - webshims.activeLang(lang:string);
909
- // get current lang
910
- // - webshims.activeLang();
911
- // get current lang
912
- // webshims.activeLang({
913
- // register: moduleName:string,
914
- // callback: callback:function
915
- // });
916
- // get/set including remoteLang
917
- // - webshims.activeLang({
918
- // module: moduleName:string,
919
- // callback: callback:function,
920
- // langObj: languageObj:array/object
921
- // });
922
- activeLang: (function(){
923
- var callbacks = [];
924
- var registeredCallbacks = {};
925
- var currentLang;
926
- var shortLang;
927
- var notLocal = /:\/\/|^\.*\//;
928
- var loadRemoteLang = function(data, lang, options){
929
- var langSrc;
930
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
931
- data.loading = true;
932
- langSrc = options.langSrc;
933
- if(!notLocal.test(langSrc)){
934
- langSrc = webshims.cfg.basePath+langSrc;
935
- }
936
- webshims.loader.loadScript(langSrc+lang+'.js', function(){
937
- if(data.langObj[lang]){
938
- data.loading = false;
939
- callLang(data, true);
940
- } else {
941
- $(function(){
942
- if(data.langObj[lang]){
943
- callLang(data, true);
944
- }
945
- data.loading = false;
946
- });
947
- }
948
- });
949
- return true;
950
- }
951
- return false;
952
- };
953
- var callRegister = function(module){
954
- if(registeredCallbacks[module]){
955
- registeredCallbacks[module].forEach(function(data){
956
- data.callback(currentLang, shortLang, '');
957
- });
958
- }
959
- };
960
- var callLang = function(data, _noLoop){
961
- if(data.activeLang != currentLang && data.activeLang !== shortLang){
962
- var options = modules[data.module].options;
963
- if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){
964
- data.activeLang = currentLang;
965
- data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang);
966
- callRegister(data.module);
967
- } else if( !_noLoop &&
968
- !loadRemoteLang(data, currentLang, options) &&
969
- !loadRemoteLang(data, shortLang, options) &&
970
- data.langObj[''] && data.activeLang !== '' ) {
971
- data.activeLang = '';
972
- data.callback(data.langObj[''], currentLang);
973
- callRegister(data.module);
974
- }
975
- }
976
- };
977
-
978
-
979
- var activeLang = function(lang){
980
-
981
- if(typeof lang == 'string' && lang !== currentLang){
982
- currentLang = lang;
983
- shortLang = currentLang.split('-')[0];
984
- if(currentLang == shortLang){
985
- shortLang = false;
986
- }
987
- $.each(callbacks, function(i, data){
988
- callLang(data);
989
- });
990
- } else if(typeof lang == 'object'){
991
-
992
- if(lang.register){
993
- if(!registeredCallbacks[lang.register]){
994
- registeredCallbacks[lang.register] = [];
995
- }
996
- registeredCallbacks[lang.register].push(lang);
997
- lang.callback(currentLang, shortLang, '');
998
- } else {
999
- if(!lang.activeLang){
1000
- lang.activeLang = '';
1001
- }
1002
- callbacks.push(lang);
1003
- callLang(lang);
1004
- }
1005
- }
1006
- return currentLang;
1007
- };
1008
-
1009
- return activeLang;
1010
- })()
1011
- });
1012
-
1013
- $.each({
1014
- defineNodeNamesProperty: 'defineNodeNameProperty',
1015
- defineNodeNamesProperties: 'defineNodeNameProperties',
1016
- createElements: 'createElement'
1017
- }, function(name, baseMethod){
1018
- webshims[name] = function(names, a, b, c){
1019
- if(typeof names == 'string'){
1020
- names = names.split(listReg);
1021
- }
1022
- var retDesc = {};
1023
- names.forEach(function(nodeName){
1024
- retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
1025
- });
1026
- return retDesc;
1027
- };
1028
- });
1029
-
1030
- webshims.isReady('webshimLocalization', true);
1031
- });
1032
- //html5a11y
1033
- (function($, document){
1034
- if(!$.webshims.assumeARIA || ('content' in document.createElement('template'))){return;}
1035
-
1036
- $(function(){
1037
- var main = $('main').attr({role: 'main'});
1038
- if(main.length > 1){
1039
- webshims.error('only one main element allowed in document');
1040
- } else if(main.is('article *, section *')) {
1041
- webshims.error('main not allowed inside of article/section elements');
1042
- }
1043
- });
1044
-
1045
- if(('hidden' in document.createElement('a'))){
1046
- return;
1047
- }
1048
-
1049
- var elemMappings = {
1050
- article: "article",
1051
- aside: "complementary",
1052
- section: "region",
1053
- nav: "navigation",
1054
- address: "contentinfo"
1055
- };
1056
- var addRole = function(elem, role){
1057
- var hasRole = elem.getAttribute('role');
1058
- if (!hasRole) {
1059
- elem.setAttribute('role', role);
1060
- }
1061
- };
1062
-
1063
-
1064
- $.webshims.addReady(function(context, contextElem){
1065
- $.each(elemMappings, function(name, role){
1066
- var elems = $(name, context).add(contextElem.filter(name));
1067
- for (var i = 0, len = elems.length; i < len; i++) {
1068
- addRole(elems[i], role);
1069
- }
1070
- });
1071
- if (context === document) {
1072
- var header = document.getElementsByTagName('header')[0];
1073
- var footers = document.getElementsByTagName('footer');
1074
- var footerLen = footers.length;
1075
-
1076
- if (header && !$(header).closest('section, article')[0]) {
1077
- addRole(header, 'banner');
1078
- }
1079
- if (!footerLen) {
1080
- return;
1081
- }
1082
- var footer = footers[footerLen - 1];
1083
- if (!$(footer).closest('section, article')[0]) {
1084
- addRole(footer, 'contentinfo');
1085
- }
1086
- }
1087
- });
1088
-
1089
- })(webshims.$, document);
1090
-
1091
- webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){
1092
- "use strict";
1093
-
1094
- var mediaelement = webshims.mediaelement;
1095
- var swfmini = window.swfmini;
1096
- var hasNative = Modernizr.audio && Modernizr.video;
1097
- var hasFlash = swfmini.hasFlashPlayerVersion('9.0.115');
1098
- var loadedSwf = 0;
1099
- var needsLoadPreload = 'ActiveXObject' in window && hasNative;
1100
- var getProps = {
1101
- paused: true,
1102
- ended: false,
1103
- currentSrc: '',
1104
- duration: window.NaN,
1105
- readyState: 0,
1106
- networkState: 0,
1107
- videoHeight: 0,
1108
- videoWidth: 0,
1109
- seeking: false,
1110
- error: null,
1111
- buffered: {
1112
- start: function(index){
1113
- if(index){
1114
- webshims.error('buffered index size error');
1115
- return;
1116
- }
1117
- return 0;
1118
- },
1119
- end: function(index){
1120
- if(index){
1121
- webshims.error('buffered index size error');
1122
- return;
1123
- }
1124
- return 0;
1125
- },
1126
- length: 0
1127
- }
1128
- };
1129
- var getPropKeys = Object.keys(getProps);
1130
-
1131
- var getSetProps = {
1132
- currentTime: 0,
1133
- volume: 1,
1134
- muted: false
1135
- };
1136
- var getSetPropKeys = Object.keys(getSetProps);
1137
-
1138
- var playerStateObj = $.extend({
1139
- isActive: 'html5',
1140
- activating: 'html5',
1141
- wasSwfReady: false,
1142
- _bufferedEnd: 0,
1143
- _bufferedStart: 0,
1144
- currentTime: 0,
1145
- _ppFlag: undefined,
1146
- _calledMeta: false,
1147
- lastDuration: 0
1148
- }, getProps, getSetProps);
1149
-
1150
- var idRep = /^jarisplayer-/;
1151
- var getSwfDataFromID = function(id){
1152
-
1153
- var elem = document.getElementById(id.replace(idRep, ''));
1154
- if(!elem){return;}
1155
- var data = webshims.data(elem, 'mediaelement');
1156
- return data.isActive == 'third' ? data : null;
1157
- };
1158
-
1159
-
1160
- var getSwfDataFromElem = function(elem){
1161
- try {
1162
- (elem.nodeName);
1163
- } catch(er){
1164
- return null;
1165
- }
1166
- var data = webshims.data(elem, 'mediaelement');
1167
- return (data && data.isActive== 'third') ? data : null;
1168
- };
1169
-
1170
- var trigger = function(elem, evt){
1171
- evt = $.Event(evt);
1172
- evt.preventDefault();
1173
- $.event.trigger(evt, undefined, elem);
1174
- };
1175
-
1176
- var playerSwfPath = options.playerPath || webshims.cfg.basePath + "swf/" + (options.playerName || 'JarisFLVPlayer.swf');
1177
-
1178
- webshims.extendUNDEFProp(options.params, {
1179
- allowscriptaccess: 'always',
1180
- allowfullscreen: 'true',
1181
- wmode: 'transparent',
1182
- allowNetworking: 'all'
1183
- });
1184
- webshims.extendUNDEFProp(options.vars, {
1185
- controltype: '1',
1186
- jsapi: '1'
1187
- });
1188
- webshims.extendUNDEFProp(options.attrs, {
1189
- bgcolor: '#000000'
1190
- });
1191
-
1192
- var setReadyState = function(readyState, data){
1193
- if(readyState < 3){
1194
- clearTimeout(data._canplaythroughTimer);
1195
- }
1196
- if(readyState >= 3 && data.readyState < 3){
1197
- data.readyState = readyState;
1198
- trigger(data._elem, 'canplay');
1199
- if(!data.paused){
1200
- trigger(data._elem, 'playing');
1201
- }
1202
- clearTimeout(data._canplaythroughTimer);
1203
- data._canplaythroughTimer = setTimeout(function(){
1204
- setReadyState(4, data);
1205
- }, 4000);
1206
- }
1207
- if(readyState >= 4 && data.readyState < 4){
1208
- data.readyState = readyState;
1209
- trigger(data._elem, 'canplaythrough');
1210
- }
1211
- data.readyState = readyState;
1212
- };
1213
- var callSeeked = function(data){
1214
- if(data.seeking && Math.abs(data.currentTime - data._lastSeektime) < 2){
1215
- data.seeking = false;
1216
- $(data._elem).triggerHandler('seeked');
1217
- }
1218
- };
1219
-
1220
-
1221
- mediaelement.jarisEvent = {};
1222
- var localConnectionTimer;
1223
- var onEvent = {
1224
- onPlayPause: function(jaris, data, override){
1225
- var playing, type;
1226
- if(override == null){
1227
- try {
1228
- playing = data.api.api_get("isPlaying");
1229
- } catch(e){}
1230
- } else {
1231
- playing = override;
1232
- }
1233
- if(playing == data.paused){
1234
-
1235
- data.paused = !playing;
1236
- type = data.paused ? 'pause' : 'play';
1237
- data._ppFlag = true;
1238
- trigger(data._elem, type);
1239
- if(data.readyState < 3){
1240
- setReadyState(3, data);
1241
- }
1242
- if(!data.paused){
1243
- trigger(data._elem, 'playing');
1244
- }
1245
- }
1246
- },
1247
- onSeek: function(jaris, data){
1248
- data._lastSeektime = jaris.seekTime;
1249
-
1250
- data.seeking = true;
1251
- $(data._elem).triggerHandler('seeking');
1252
- clearTimeout(data._seekedTimer);
1253
- data._seekedTimer = setTimeout(function(){
1254
- callSeeked(data);
1255
- data.seeking = false;
1256
- }, 300);
1257
- },
1258
- onConnectionFailed: function(){
1259
- webshims.error('media error');
1260
- },
1261
- onNotBuffering: function(jaris, data){
1262
- setReadyState(3, data);
1263
- },
1264
- onDataInitialized: function(jaris, data){
1265
-
1266
- var oldDur = data.duration;
1267
- var durDelta;
1268
- data.duration = jaris.duration;
1269
- if(oldDur == data.duration || isNaN(data.duration)){return;}
1270
-
1271
- if(data._calledMeta && ((durDelta = Math.abs(data.lastDuration - data.duration)) < 2)){return;}
1272
-
1273
-
1274
-
1275
- data.videoHeight = jaris.height;
1276
- data.videoWidth = jaris.width;
1277
-
1278
- if(!data.networkState){
1279
- data.networkState = 2;
1280
- }
1281
- if(data.readyState < 1){
1282
- setReadyState(1, data);
1283
- }
1284
- clearTimeout(data._durationChangeTimer);
1285
- if(data._calledMeta && data.duration){
1286
- data._durationChangeTimer = setTimeout(function(){
1287
- data.lastDuration = data.duration;
1288
- trigger(data._elem, 'durationchange');
1289
- }, durDelta > 50 ? 0 : durDelta > 9 ? 9 : 99);
1290
- } else {
1291
- data.lastDuration = data.duration;
1292
- if(data.duration){
1293
- trigger(data._elem, 'durationchange');
1294
- }
1295
- if(!data._calledMeta){
1296
- trigger(data._elem, 'loadedmetadata');
1297
- }
1298
- }
1299
- data._calledMeta = true;
1300
- },
1301
- onBuffering: function(jaris, data){
1302
- if(data.ended){
1303
- data.ended = false;
1304
- }
1305
- setReadyState(1, data);
1306
- trigger(data._elem, 'waiting');
1307
- },
1308
- onTimeUpdate: function(jaris, data){
1309
- if(data.ended){
1310
- data.ended = false;
1311
- }
1312
- if(data.readyState < 3){
1313
- setReadyState(3, data);
1314
- trigger(data._elem, 'playing');
1315
- }
1316
- if(data.seeking){
1317
- callSeeked(data);
1318
- }
1319
- trigger(data._elem, 'timeupdate');
1320
- },
1321
- onProgress: function(jaris, data){
1322
- if(data.ended){
1323
- data.ended = false;
1324
- }
1325
- if(!data.duration || isNaN(data.duration)){
1326
- return;
1327
- }
1328
- var percentage = jaris.loaded / jaris.total;
1329
- if(percentage > 0.02 && percentage < 0.2){
1330
- setReadyState(3, data);
1331
- } else if(percentage > 0.2){
1332
- if(percentage > 0.99){
1333
- data.networkState = 1;
1334
- }
1335
- setReadyState(4, data);
1336
- }
1337
- if(data._bufferedEnd && (data._bufferedEnd > percentage)){
1338
- data._bufferedStart = data.currentTime || 0;
1339
- }
1340
-
1341
- data._bufferedEnd = percentage;
1342
- data.buffered.length = 1;
1343
-
1344
- $.event.trigger('progress', undefined, data._elem, true);
1345
- },
1346
- onPlaybackFinished: function(jaris, data){
1347
- if(data.readyState < 4){
1348
- setReadyState(4, data);
1349
- }
1350
- data.ended = true;
1351
- trigger(data._elem, 'ended');
1352
- },
1353
- onVolumeChange: function(jaris, data){
1354
- if(data.volume != jaris.volume || data.muted != jaris.mute){
1355
- data.volume = jaris.volume;
1356
- data.muted = jaris.mute;
1357
- trigger(data._elem, 'volumechange');
1358
- }
1359
- },
1360
- ready: (function(){
1361
- var testAPI = function(data){
1362
- var passed = true;
1363
-
1364
- try {
1365
- data.api.api_get('volume');
1366
- } catch(er){
1367
- passed = false;
1368
- }
1369
- return passed;
1370
- };
1371
-
1372
- return function(jaris, data){
1373
- var i = 0;
1374
-
1375
- var doneFn = function(){
1376
- if(i > 9){
1377
- data.tryedReframeing = 0;
1378
- return;
1379
- }
1380
- i++;
1381
-
1382
- data.tryedReframeing++;
1383
- if(testAPI(data)){
1384
- data.wasSwfReady = true;
1385
- data.tryedReframeing = 0;
1386
- startAutoPlay(data);
1387
- workActionQueue(data);
1388
- } else if(data.tryedReframeing < 6) {
1389
- if(data.tryedReframeing < 3){
1390
- data.reframeTimer = setTimeout(doneFn, 9);
1391
- data.shadowElem.css({overflow: 'visible'});
1392
- setTimeout(function(){
1393
- data.shadowElem.css({overflow: 'hidden'});
1394
- }, 1);
1395
- } else {
1396
- data.shadowElem.css({overflow: 'hidden'});
1397
- $(data._elem).mediaLoad();
1398
- }
1399
- } else {
1400
- clearTimeout(data.reframeTimer);
1401
- webshims.error("reframing error");
1402
- }
1403
- };
1404
- if(!data || !data.api){return;}
1405
- if(!data.tryedReframeing){
1406
- data.tryedReframeing = 0;
1407
- }
1408
- clearTimeout(localConnectionTimer);
1409
- clearTimeout(data.reframeTimer);
1410
- data.shadowElem.removeClass('flashblocker-assumed');
1411
-
1412
- if(!i){
1413
- doneFn();
1414
- } else {
1415
- data.reframeTimer = setTimeout(doneFn, 9);
1416
- }
1417
-
1418
- };
1419
- })()
1420
- };
1421
-
1422
- onEvent.onMute = onEvent.onVolumeChange;
1423
-
1424
-
1425
- var workActionQueue = function(data){
1426
- var actionLen = data.actionQueue.length;
1427
- var i = 0;
1428
- var operation;
1429
-
1430
- if(actionLen && data.isActive == 'third'){
1431
- while(data.actionQueue.length && actionLen > i){
1432
- i++;
1433
- operation = data.actionQueue.shift();
1434
- try{
1435
- data.api[operation.fn].apply(data.api, operation.args);
1436
- } catch(er){
1437
- webshims.warn(er);
1438
- }
1439
- }
1440
- }
1441
- if(data.actionQueue.length){
1442
- data.actionQueue = [];
1443
- }
1444
- };
1445
- var startAutoPlay = function(data){
1446
- if(!data){return;}
1447
- if( (data._ppFlag === undefined && ($.prop(data._elem, 'autoplay')) || !data.paused)){
1448
- setTimeout(function(){
1449
- if(data.isActive == 'third' && (data._ppFlag === undefined || !data.paused)){
1450
-
1451
- try {
1452
- $(data._elem).play();
1453
- data._ppFlag = true;
1454
- } catch(er){}
1455
- }
1456
- }, 1);
1457
- }
1458
-
1459
- if(data.muted){
1460
- $.prop(data._elem, 'muted', true);
1461
- }
1462
- if(data.volume != 1){
1463
- $.prop(data._elem, 'volume', data.volume);
1464
- }
1465
- };
1466
-
1467
-
1468
- var addMediaToStopEvents = $.noop;
1469
- if(hasNative){
1470
- var stopEvents = {
1471
- play: 1,
1472
- playing: 1
1473
- };
1474
- var hideEvtArray = ['play', 'pause', 'playing', 'canplay', 'progress', 'waiting', 'ended', 'loadedmetadata', 'durationchange', 'emptied'];
1475
- var hidevents = hideEvtArray.map(function(evt){
1476
- return evt +'.webshimspolyfill';
1477
- }).join(' ');
1478
-
1479
- var hidePlayerEvents = function(event){
1480
- var data = webshims.data(event.target, 'mediaelement');
1481
- if(!data){return;}
1482
- var isNativeHTML5 = ( event.originalEvent && event.originalEvent.type === event.type );
1483
- if( isNativeHTML5 == (data.activating == 'third') ){
1484
- event.stopImmediatePropagation();
1485
-
1486
- if(stopEvents[event.type]){
1487
- if(data.isActive != data.activating){
1488
- $(event.target).pause();
1489
- } else if(isNativeHTML5){
1490
- ($.prop(event.target, 'pause')._supvalue || $.noop).apply(event.target);
1491
- }
1492
- }
1493
- }
1494
- };
1495
-
1496
- addMediaToStopEvents = function(elem){
1497
- $(elem)
1498
- .off(hidevents)
1499
- .on(hidevents, hidePlayerEvents)
1500
- ;
1501
- hideEvtArray.forEach(function(evt){
1502
- webshims.moveToFirstEvent(elem, evt);
1503
- });
1504
- };
1505
- addMediaToStopEvents(document);
1506
- }
1507
-
1508
-
1509
- mediaelement.setActive = function(elem, type, data){
1510
- if(!data){
1511
- data = webshims.data(elem, 'mediaelement');
1512
- }
1513
- if(!data || data.isActive == type){return;}
1514
- if(type != 'html5' && type != 'third'){
1515
- webshims.warn('wrong type for mediaelement activating: '+ type);
1516
- }
1517
- var shadowData = webshims.data(elem, 'shadowData');
1518
- data.activating = type;
1519
- $(elem).pause();
1520
- data.isActive = type;
1521
- if(type == 'third'){
1522
- shadowData.shadowElement = shadowData.shadowFocusElement = data.shadowElem[0];
1523
- $(elem).addClass('swf-api-active nonnative-api-active').hide().getShadowElement().show();
1524
- } else {
1525
- $(elem).removeClass('swf-api-active nonnative-api-active').show().getShadowElement().hide();
1526
- shadowData.shadowElement = shadowData.shadowFocusElement = false;
1527
- }
1528
- $(elem).trigger('mediaelementapichange');
1529
- };
1530
-
1531
-
1532
-
1533
- var resetSwfProps = (function(){
1534
- var resetProtoProps = ['_calledMeta', 'lastDuration', '_bufferedEnd', '_bufferedStart', '_ppFlag', 'currentSrc', 'currentTime', 'duration', 'ended', 'networkState', 'paused', 'seeking', 'videoHeight', 'videoWidth'];
1535
- var len = resetProtoProps.length;
1536
- return function(data){
1537
-
1538
- if(!data){return;}
1539
- clearTimeout(data._seekedTimer);
1540
- var lenI = len;
1541
- var networkState = data.networkState;
1542
- setReadyState(0, data);
1543
- clearTimeout(data._durationChangeTimer);
1544
- while(--lenI > -1){
1545
- delete data[resetProtoProps[lenI]];
1546
- }
1547
- data.actionQueue = [];
1548
- data.buffered.length = 0;
1549
- if(networkState){
1550
- trigger(data._elem, 'emptied');
1551
- }
1552
- };
1553
- })();
1554
-
1555
-
1556
- var transformDimension = (function(){
1557
- var dimCache = {};
1558
- var getRealDims = function(data){
1559
- var ret, poster, img;
1560
- if(dimCache[data.currentSrc]){
1561
- ret = dimCache[data.currentSrc];
1562
- } else if(data.videoHeight && data.videoWidth){
1563
- dimCache[data.currentSrc] = {
1564
- width: data.videoWidth,
1565
- height: data.videoHeight
1566
- };
1567
- ret = dimCache[data.currentSrc];
1568
- } else if((poster = $.attr(data._elem, 'poster'))){
1569
- ret = dimCache[poster];
1570
- if(!ret){
1571
- img = document.createElement('img');
1572
- img.onload = function(){
1573
- dimCache[poster] = {
1574
- width: this.width,
1575
- height: this.height
1576
- };
1577
-
1578
- if(dimCache[poster].height && dimCache[poster].width){
1579
- setElementDimension(data, $.prop(data._elem, 'controls'));
1580
- } else {
1581
- delete dimCache[poster];
1582
- }
1583
- };
1584
- img.src = poster;
1585
- if(img.complete){
1586
- img.onload();
1587
- }
1588
- }
1589
- }
1590
- return ret || {width: 300, height: data._elemNodeName == 'video' ? 150 : 50};
1591
- };
1592
- return function(data){
1593
- var realDims, ratio;
1594
- var ret = data.elemDimensions;
1595
-
1596
- if(ret.width == 'auto' || ret.height == 'auto'){
1597
- ret = $.extend({}, data.elemDimensions);
1598
- realDims = getRealDims(data);
1599
- ratio = realDims.width / realDims.height;
1600
-
1601
- if(ret.width == 'auto' && ret.height == 'auto'){
1602
- ret = realDims;
1603
- } else if(ret.width == 'auto'){
1604
- data.shadowElem.css({height: ret.height});
1605
- ret.width = data.shadowElem.height() * ratio;
1606
- } else {
1607
- data.shadowElem.css({width: ret.width});
1608
- ret.height = data.shadowElem.width() / ratio;
1609
- }
1610
- }
1611
- return ret;
1612
- };
1613
- })();
1614
- var setElementDimension = function(data, hasControls){
1615
- var dims;
1616
- var elem = data._elem;
1617
- var box = data.shadowElem;
1618
- $(elem)[hasControls ? 'addClass' : 'removeClass']('webshims-controls');
1619
-
1620
- if(data.isActive == 'third'){
1621
- if(data._elemNodeName == 'audio' && !hasControls){
1622
- box.css({width: 0, height: 0});
1623
- } else {
1624
- data.elemDimensions = {
1625
- width: elem.style.width || $.attr(elem, 'width') || $(elem).width(),
1626
- height: elem.style.height || $.attr(elem, 'height') || $(elem).height()
1627
- };
1628
- dims = transformDimension(data);
1629
- dims.minWidth = elem.style.minWidth;
1630
- dims.minHeight = elem.style.minHeight;
1631
- box.css(dims);
1632
- }
1633
- }
1634
- };
1635
-
1636
- var bufferSrc = (function(){
1637
- var preloads = {
1638
- '': 1,
1639
- 'auto': 1
1640
- };
1641
- return function(elem){
1642
- var preload = $.attr(elem, 'preload');
1643
- if(preload == null || preload == 'none' || $.prop(elem, 'autoplay')){
1644
- return false;
1645
- }
1646
- preload = $.prop(elem, 'preload');
1647
- return !!(preloads[preload] || (preload == 'metadata' && $(elem).is('.preload-in-doubt, video:not([poster])')));
1648
- };
1649
- })();
1650
-
1651
- var regs = {
1652
- A: /&amp;/g,
1653
- a: /&/g,
1654
- e: /\=/g,
1655
- q: /\?/g
1656
- },
1657
- replaceVar = function(val){
1658
- return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
1659
- };
1660
-
1661
- if('matchMedia' in window){
1662
- var allowMediaSorting = false;
1663
- try {
1664
- allowMediaSorting = window.matchMedia('only all').matches;
1665
- } catch(er){}
1666
- if(allowMediaSorting){
1667
- mediaelement.sortMedia = function(src1, src2){
1668
- try {
1669
- src1 = !src1.media || matchMedia( src1.media ).matches;
1670
- src2 = !src2.media || matchMedia( src2.media ).matches;
1671
- } catch(er){
1672
- return 0;
1673
- }
1674
- return src1 == src2 ?
1675
- 0 :
1676
- src1 ? -1
1677
- : 1;
1678
- };
1679
- }
1680
- }
1681
-
1682
- mediaelement.createSWF = function( elem, canPlaySrc, data ){
1683
- if(!hasFlash){
1684
- setTimeout(function(){
1685
- $(elem).mediaLoad(); //<- this should produce a mediaerror
1686
- }, 1);
1687
- return;
1688
- }
1689
-
1690
- if(loadedSwf < 1){
1691
- loadedSwf = 1;
1692
- } else {
1693
- loadedSwf++;
1694
- }
1695
- if(!data){
1696
- data = webshims.data(elem, 'mediaelement');
1697
- }
1698
-
1699
- if($.attr(elem, 'height') || $.attr(elem, 'width')){
1700
- webshims.warn("width or height content attributes used. Webshims prefers the usage of CSS (computed styles or inline styles) to detect size of a video/audio. It's really more powerfull.");
1701
- }
1702
-
1703
- var isRtmp = canPlaySrc.type == 'audio/rtmp' || canPlaySrc.type == 'video/rtmp';
1704
- var vars = $.extend({}, options.vars, {
1705
- poster: replaceVar($.attr(elem, 'poster') && $.prop(elem, 'poster') || ''),
1706
- source: replaceVar(canPlaySrc.streamId || canPlaySrc.srcProp),
1707
- server: replaceVar(canPlaySrc.server || '')
1708
- });
1709
- var elemVars = $(elem).data('vars') || {};
1710
-
1711
-
1712
-
1713
- var hasControls = $.prop(elem, 'controls');
1714
- var elemId = 'jarisplayer-'+ webshims.getID(elem);
1715
-
1716
- var params = $.extend(
1717
- {},
1718
- options.params,
1719
- $(elem).data('params')
1720
- );
1721
- var elemNodeName = elem.nodeName.toLowerCase();
1722
- var attrs = $.extend(
1723
- {},
1724
- options.attrs,
1725
- {
1726
- name: elemId,
1727
- id: elemId
1728
- },
1729
- $(elem).data('attrs')
1730
- );
1731
- var setDimension = function(){
1732
- if(data.isActive == 'third'){
1733
- setElementDimension(data, $.prop(elem, 'controls'));
1734
- }
1735
- };
1736
-
1737
- var box;
1738
-
1739
- if(data && data.swfCreated){
1740
- mediaelement.setActive(elem, 'third', data);
1741
-
1742
- data.currentSrc = canPlaySrc.srcProp;
1743
-
1744
- data.shadowElem.html('<div id="'+ elemId +'">');
1745
-
1746
- data.api = false;
1747
- data.actionQueue = [];
1748
- box = data.shadowElem;
1749
- resetSwfProps(data);
1750
- } else {
1751
- box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>')
1752
- .css({
1753
- position: 'relative',
1754
- overflow: 'hidden'
1755
- })
1756
- ;
1757
- data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
1758
- actionQueue: {
1759
- value: []
1760
- },
1761
- shadowElem: {
1762
- value: box
1763
- },
1764
- _elemNodeName: {
1765
- value: elemNodeName
1766
- },
1767
- _elem: {
1768
- value: elem
1769
- },
1770
- currentSrc: {
1771
- value: canPlaySrc.srcProp
1772
- },
1773
- swfCreated: {
1774
- value: true
1775
- },
1776
- id: {
1777
- value: elemId.replace(/-/g, '')
1778
- },
1779
- buffered: {
1780
- value: {
1781
- start: function(index){
1782
- if(index >= data.buffered.length){
1783
- webshims.error('buffered index size error');
1784
- return;
1785
- }
1786
- return 0;
1787
- },
1788
- end: function(index){
1789
- if(index >= data.buffered.length){
1790
- webshims.error('buffered index size error');
1791
- return;
1792
- }
1793
- return ( (data.duration - data._bufferedStart) * data._bufferedEnd) + data._bufferedStart;
1794
- },
1795
- length: 0
1796
- }
1797
- }
1798
- }));
1799
-
1800
-
1801
-
1802
- box.insertBefore(elem);
1803
-
1804
- if(hasNative){
1805
- $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
1806
- }
1807
-
1808
- webshims.addShadowDom(elem, box);
1809
- if(!webshims.data(elem, 'mediaelement')){
1810
- webshims.data(elem, 'mediaelement', data);
1811
- }
1812
- addMediaToStopEvents(elem);
1813
-
1814
- mediaelement.setActive(elem, 'third', data);
1815
-
1816
- setElementDimension(data, hasControls);
1817
-
1818
- $(elem)
1819
- .on({
1820
- 'updatemediaelementdimensions loadedmetadata emptied': setDimension,
1821
- 'remove': function(e){
1822
- if(!e.originalEvent && mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem == elem){
1823
- delete mediaelement.jarisEvent[data.id];
1824
- clearTimeout(localConnectionTimer);
1825
- clearTimeout(data.flashBlock);
1826
- }
1827
- }
1828
- })
1829
- .onWSOff('updateshadowdom', setDimension)
1830
- ;
1831
- }
1832
-
1833
-
1834
- if(!mediaelement.jarisEvent[data.id] || mediaelement.jarisEvent[data.id].elem != elem){
1835
- mediaelement.jarisEvent[data.id] = function(jaris){
1836
-
1837
- if(jaris.type == 'ready'){
1838
- var onReady = function(){
1839
- if(data.api){
1840
- if(bufferSrc(elem)){
1841
- data.api.api_preload();
1842
- }
1843
- onEvent.ready(jaris, data);
1844
- }
1845
- };
1846
- if(data.api){
1847
- onReady();
1848
- } else {
1849
- setTimeout(onReady, 9);
1850
- }
1851
- } else {
1852
- data.currentTime = jaris.position;
1853
-
1854
- if(data.api){
1855
- if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
1856
- onEvent.onDataInitialized(jaris, data);
1857
- }
1858
-
1859
- if(!data._ppFlag && jaris.type != 'onPlayPause'){
1860
- onEvent.onPlayPause(jaris, data);
1861
- }
1862
-
1863
- if(onEvent[jaris.type]){
1864
- onEvent[jaris.type](jaris, data);
1865
- }
1866
- }
1867
- data.duration = jaris.duration;
1868
- }
1869
- };
1870
- mediaelement.jarisEvent[data.id].elem = elem;
1871
- }
1872
-
1873
- $.extend(vars,
1874
- {
1875
- id: elemId,
1876
- evtId: data.id,
1877
- controls: ''+hasControls,
1878
- autostart: 'false',
1879
- nodename: elemNodeName
1880
- },
1881
- elemVars
1882
- );
1883
-
1884
- if(isRtmp){
1885
- vars.streamtype = 'rtmp';
1886
- } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
1887
- vars.type = 'audio';
1888
- vars.streamtype = 'file';
1889
- } else if(canPlaySrc.type == 'video/youtube'){
1890
- vars.streamtype = 'youtube';
1891
- }
1892
- options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
1893
- clearTimeout(data.flashBlock);
1894
-
1895
- swfmini.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.115", false, vars, params, attrs, function(swfData){
1896
- if(swfData.success){
1897
- var fBlocker = function(){
1898
- if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
1899
- box.addClass('flashblocker-assumed');
1900
- $(elem).trigger('flashblocker');
1901
- webshims.warn("flashblocker assumed");
1902
- }
1903
- $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
1904
- };
1905
- data.api = swfData.ref;
1906
-
1907
- if(!hasControls){
1908
- $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
1909
- }
1910
-
1911
- data.flashBlock = setTimeout(fBlocker, 99);
1912
-
1913
- if(!localConnectionTimer){
1914
- clearTimeout(localConnectionTimer);
1915
- localConnectionTimer = setTimeout(function(){
1916
- fBlocker();
1917
- var flash = $(swfData.ref);
1918
- if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
1919
- webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
1920
- } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
1921
- webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
1922
- }
1923
- flash = null;
1924
- }, 8000);
1925
- }
1926
- }
1927
- });
1928
-
1929
- };
1930
-
1931
-
1932
- var queueSwfMethod = function(elem, fn, args, data){
1933
- data = data || getSwfDataFromElem(elem);
1934
-
1935
- if(data){
1936
- if(data.api && data.api[fn]){
1937
- data.api[fn].apply(data.api, args || []);
1938
- } else {
1939
- //todo add to queue
1940
- data.actionQueue.push({fn: fn, args: args});
1941
-
1942
- if(data.actionQueue.length > 10){
1943
- setTimeout(function(){
1944
- if(data.actionQueue.length > 5){
1945
- data.actionQueue.shift();
1946
- }
1947
- }, 99);
1948
- }
1949
- }
1950
- return data;
1951
- }
1952
- return false;
1953
- };
1954
-
1955
- ['audio', 'video'].forEach(function(nodeName){
1956
- var descs = {};
1957
- var mediaSup;
1958
- var createGetProp = function(key){
1959
- if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
1960
-
1961
- descs[key] = {
1962
- get: function(){
1963
- var data = getSwfDataFromElem(this);
1964
- if(data){
1965
- return data[key];
1966
- } else if(hasNative && mediaSup[key].prop._supget) {
1967
- return mediaSup[key].prop._supget.apply(this);
1968
- } else {
1969
- return playerStateObj[key];
1970
- }
1971
- },
1972
- writeable: false
1973
- };
1974
- };
1975
- var createGetSetProp = function(key, setFn){
1976
- createGetProp(key);
1977
- delete descs[key].writeable;
1978
- descs[key].set = setFn;
1979
- };
1980
-
1981
- createGetSetProp('seeking');
1982
-
1983
- createGetSetProp('volume', function(v){
1984
- var data = getSwfDataFromElem(this);
1985
- if(data){
1986
- v *= 1;
1987
- if(!isNaN(v)){
1988
-
1989
- if(v < 0 || v > 1){
1990
- webshims.error('volume greater or less than allowed '+ (v / 100));
1991
- }
1992
-
1993
- queueSwfMethod(this, 'api_volume', [v], data);
1994
-
1995
-
1996
- if(data.volume != v){
1997
- data.volume = v;
1998
- trigger(data._elem, 'volumechange');
1999
- }
2000
- data = null;
2001
- }
2002
- } else if(mediaSup.volume.prop._supset) {
2003
- return mediaSup.volume.prop._supset.apply(this, arguments);
2004
- }
2005
- });
2006
-
2007
- createGetSetProp('muted', function(m){
2008
- var data = getSwfDataFromElem(this);
2009
- if(data){
2010
- m = !!m;
2011
- queueSwfMethod(this, 'api_muted', [m], data);
2012
- if(data.muted != m){
2013
- data.muted = m;
2014
- trigger(data._elem, 'volumechange');
2015
- }
2016
- data = null;
2017
- } else if(mediaSup.muted.prop._supset) {
2018
- return mediaSup.muted.prop._supset.apply(this, arguments);
2019
- }
2020
- });
2021
-
2022
-
2023
- createGetSetProp('currentTime', function(t){
2024
- var data = getSwfDataFromElem(this);
2025
- if(data){
2026
- t *= 1;
2027
- if (!isNaN(t)) {
2028
- queueSwfMethod(this, 'api_seek', [t], data);
2029
- }
2030
-
2031
- } else if(mediaSup.currentTime.prop._supset) {
2032
- return mediaSup.currentTime.prop._supset.apply(this, arguments);
2033
- }
2034
- });
2035
-
2036
- ['play', 'pause'].forEach(function(fn){
2037
- descs[fn] = {
2038
- value: function(){
2039
- var data = getSwfDataFromElem(this);
2040
- if(data){
2041
- if(data.stopPlayPause){
2042
- clearTimeout(data.stopPlayPause);
2043
- }
2044
- queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
2045
-
2046
- data._ppFlag = true;
2047
- if(data.paused != (fn != 'play')){
2048
- data.paused = fn != 'play';
2049
- trigger(data._elem, fn);
2050
- }
2051
- } else if(mediaSup[fn].prop._supvalue) {
2052
- return mediaSup[fn].prop._supvalue.apply(this, arguments);
2053
- }
2054
- }
2055
- };
2056
- });
2057
-
2058
- getPropKeys.forEach(createGetProp);
2059
-
2060
- webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
2061
- var data = getSwfDataFromElem(this);
2062
- $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
2063
-
2064
- if(data){
2065
- if(nodeName == 'audio'){
2066
- setElementDimension(data, boolProp);
2067
- }
2068
- queueSwfMethod(this, 'api_controls', [boolProp], data);
2069
- }
2070
- });
2071
-
2072
-
2073
- webshims.onNodeNamesPropertyModify(nodeName, 'preload', function(val){
2074
- var data, baseData, elem;
2075
-
2076
-
2077
- if(bufferSrc(this)){
2078
- data = getSwfDataFromElem(this);
2079
- if(data){
2080
- queueSwfMethod(this, 'api_preload', [], data);
2081
- } else if(needsLoadPreload && this.paused && !this.error && !$.data(this, 'mediaerror') && !this.readyState && !this.networkState && !this.autoplay && $(this).is(':not(.nonnative-api-active)')){
2082
- elem = this;
2083
- baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2084
- clearTimeout(baseData.loadTimer);
2085
- baseData.loadTimer = setTimeout(function(){
2086
- $(elem).mediaLoad();
2087
- }, 9);
2088
- }
2089
- }
2090
- });
2091
-
2092
- mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
2093
-
2094
- if(!Modernizr.mediaDefaultMuted){
2095
- webshims.defineNodeNameProperties(nodeName, {
2096
- defaultMuted: {
2097
- get: function(){
2098
- return $.attr(this, 'muted') != null;
2099
- },
2100
- set: function(val){
2101
- if(val){
2102
- $.attr(this, 'muted', '');
2103
- } else {
2104
- $(this).removeAttr('muted');
2105
- }
2106
- }
2107
- }
2108
- }, 'prop');
2109
- }
2110
- });
2111
-
2112
-
2113
- if(hasFlash && $.cleanData){
2114
- var oldClean = $.cleanData;
2115
- var flashNames = {
2116
- object: 1,
2117
- OBJECT: 1
2118
- };
2119
-
2120
- $.cleanData = function(elems){
2121
- var i, len, prop;
2122
- if(elems && (len = elems.length) && loadedSwf){
2123
-
2124
- for(i = 0; i < len; i++){
2125
- if(flashNames[elems[i].nodeName] && 'api_pause' in elems[i]){
2126
- loadedSwf--;
2127
- try {
2128
- elems[i].api_pause();
2129
- } catch(er){}
2130
- }
2131
- }
2132
-
2133
- }
2134
- return oldClean.apply(this, arguments);
2135
- };
2136
- }
2137
-
2138
- if(!hasNative){
2139
-
2140
- ['poster', 'src'].forEach(function(prop){
2141
- webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
2142
- //attr: {},
2143
- reflect: true,
2144
- propType: 'src'
2145
- });
2146
- });
2147
-
2148
- webshims.defineNodeNamesProperty(['audio', 'video'], 'preload', {
2149
- reflect: true,
2150
- propType: 'enumarated',
2151
- defaultValue: '',
2152
- limitedTo: ['', 'auto', 'metadata', 'none']
2153
- });
2154
-
2155
- webshims.reflectProperties('source', ['type', 'media']);
2156
-
2157
-
2158
- ['autoplay', 'controls'].forEach(function(name){
2159
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
2160
- });
2161
-
2162
- webshims.defineNodeNamesProperties(['audio', 'video'], {
2163
- HAVE_CURRENT_DATA: {
2164
- value: 2
2165
- },
2166
- HAVE_ENOUGH_DATA: {
2167
- value: 4
2168
- },
2169
- HAVE_FUTURE_DATA: {
2170
- value: 3
2171
- },
2172
- HAVE_METADATA: {
2173
- value: 1
2174
- },
2175
- HAVE_NOTHING: {
2176
- value: 0
2177
- },
2178
- NETWORK_EMPTY: {
2179
- value: 0
2180
- },
2181
- NETWORK_IDLE: {
2182
- value: 1
2183
- },
2184
- NETWORK_LOADING: {
2185
- value: 2
2186
- },
2187
- NETWORK_NO_SOURCE: {
2188
- value: 3
2189
- }
2190
-
2191
- }, 'prop');
2192
- } else if(!('media' in document.createElement('source'))){
2193
- webshims.reflectProperties('source', ['media']);
2194
- }
2195
-
2196
- });