webshims-rails 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
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
- });