webshims-rails 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -10
  6. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +1 -20
  7. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +1 -2
  8. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +1 -30
  9. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +1 -42
  10. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +1 -28
  11. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -0
  13. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -0
  14. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +1 -42
  15. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  16. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +1 -31
  18. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -0
  19. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -0
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +1 -38
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -80
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +1 -45
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -44
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +1 -28
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +1 -19
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +1 -10
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -58
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -66
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +1 -62
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -64
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -73
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -42
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -54
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -57
  35. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -70
  36. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -80
  37. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -60
  38. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -79
  39. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -101
  40. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -95
  41. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -27
  42. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -34
  43. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -56
  44. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +1 -33
  45. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +1 -40
  46. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -39
  47. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -65
  48. data/vendor/assets/javascripts/webshims/minified/shims/details.js +1 -5
  49. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +1 -23
  50. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +1 -15
  51. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +1 -21
  52. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -19
  53. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +1 -22
  54. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -8
  55. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +1 -7
  56. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +1 -10
  57. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +1 -23
  58. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +1 -46
  59. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +1 -5
  60. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +1 -7
  61. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +1 -3
  62. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  63. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +1 -7
  64. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  65. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +1 -3
  66. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +1 -3
  67. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +1 -6
  68. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +1 -6
  69. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +1 -3
  70. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +1 -3
  71. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +1 -4
  72. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +1 -3
  73. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +1 -3
  74. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +1 -8
  75. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +1 -3
  76. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +1 -14
  77. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -0
  78. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  79. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -16
  81. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -23
  82. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -3
  83. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -26
  84. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +1 -14
  85. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +1 -0
  86. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +1 -689
  90. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  93. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +1 -9
  94. data/vendor/assets/javascripts/webshims/minified/shims/track.js +1 -21
  95. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1191
  96. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvas/README +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  98. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  100. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  101. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  102. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvasPro/README +82 -82
  103. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  104. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  109. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1754
  110. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3311 -3247
  111. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1633
  112. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1697 -1636
  113. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1100
  114. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -476
  115. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -316
  116. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2155 -2095
  117. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2320 -2259
  118. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1326 -1322
  119. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2238 -2239
  120. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2341 -2339
  121. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1558 -1493
  122. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1734 -1733
  123. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2361 -2295
  124. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2332 -2269
  125. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2836 -2775
  126. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1549 -1489
  127. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2156 -2095
  128. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3313 -3248
  129. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3022 -3020
  130. data/vendor/assets/javascripts/webshims/shims/combos/4.js +771 -770
  131. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1027 -1025
  132. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1709 -1706
  133. data/vendor/assets/javascripts/webshims/shims/combos/6.js +387 -386
  134. data/vendor/assets/javascripts/webshims/shims/combos/7.js +643 -641
  135. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1547 -1488
  136. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2508 -2445
  137. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  138. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -952
  139. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  140. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  141. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -606
  142. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  143. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -164
  144. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  145. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  146. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2 -2
  147. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1569
  148. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  149. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  150. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  151. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  152. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  153. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  154. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  155. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  156. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  157. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  158. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  159. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  160. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  161. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  162. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  163. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  164. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  165. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  168. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -0
  169. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +597 -536
  170. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -860
  171. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  172. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -957
  173. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  174. data/vendor/assets/javascripts/webshims/shims/range-ui.js +66 -0
  175. data/vendor/assets/javascripts/webshims/shims/styles/details-arrows.png +0 -0
  176. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  177. data/vendor/assets/javascripts/webshims/shims/styles/polyfill-loader.gif +0 -0
  178. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -689
  179. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  180. data/vendor/assets/javascripts/webshims/shims/swf/jwwebshims.swf +0 -0
  181. data/vendor/assets/javascripts/webshims/shims/swf/localStorage.swf +0 -0
  182. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  183. data/vendor/assets/javascripts/webshims/shims/track.js +0 -0
  184. metadata +6 -4
@@ -1,2269 +1,2332 @@
1
- (function($, Modernizr, webshims){
2
- "use strict";
3
- var hasNative = Modernizr.audio && Modernizr.video;
4
- var supportsLoop = false;
5
- var options = webshims.cfg.mediaelement;
6
- var bugs = webshims.bugs;
7
- var swfType = options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris'
8
- var loadSwf = function(){
9
- webshims.ready(swfType, function(){
10
- if(!webshims.mediaelement.createSWF){
11
- webshims.mediaelement.loadSwf = true;
12
- webshims.reTest([swfType], hasNative);
13
- }
14
- });
15
- };
16
- var hasSwf;
17
- if(hasNative){
18
- var videoElem = document.createElement('video');
19
- Modernizr.videoBuffered = ('buffered' in videoElem);
20
- supportsLoop = ('loop' in videoElem);
21
-
22
- webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
23
-
24
- if(!Modernizr.videoBuffered){
25
- webshims.addPolyfill('mediaelement-native-fix', {
26
- f: 'mediaelement',
27
- test: Modernizr.videoBuffered,
28
- d: ['dom-support']
29
- });
30
-
31
- webshims.reTest('mediaelement-native-fix');
32
- }
33
- }
34
-
35
- if(hasNative && !options.preferFlash){
36
- var switchOptions = function(e){
37
- var parent = e.target.parentNode;
38
- if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
39
- webshims.ready('DOM mediaelement', function(){
40
- if(hasSwf){
41
- loadSwf();
42
- }
43
- webshims.ready('WINDOWLOAD '+swfType, function(){
44
- setTimeout(function(){
45
- if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
46
- options.preferFlash = true;
47
- document.removeEventListener('error', switchOptions, true);
48
- $('audio, video').mediaLoad();
49
- webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
50
- } else if(!hasSwf){
51
- document.removeEventListener('error', switchOptions, true);
52
- }
53
- }, 20);
54
- });
55
- });
56
- }
57
- };
58
- document.addEventListener('error', switchOptions, true);
59
- $('audio, video').each(function(){
60
- if(this.error){
61
- switchOptions({target: this});
62
- }
63
- });
64
- }
65
-
66
- bugs.track = false;
67
-
68
- if(Modernizr.track){
69
- (function(){
70
-
71
- if(!bugs.track){
72
- bugs.track = typeof $('<track />')[0].readyState != 'number';
73
- }
74
-
75
- if(!bugs.track){
76
- try {
77
- new TextTrackCue(2, 3, '');
78
- } catch(e){
79
- bugs.track = true;
80
- }
81
- }
82
-
83
- var trackOptions = webshims.cfg.track;
84
- var trackListener = function(e){
85
- $(e.target).filter('track').each(changeApi);
86
- };
87
- var changeApi = function(){
88
- if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
89
- trackOptions.override = true;
90
- webshims.reTest('track');
91
- document.removeEventListener('error', trackListener, true);
92
- if(this && $.nodeName(this, 'track')){
93
- webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
94
- } else {
95
- webshims.info("track support was overwritten. due to bad browser support");
96
- }
97
- }
98
- };
99
- var detectTrackError = function(){
100
- document.addEventListener('error', trackListener, true);
101
-
102
- if(bugs.track){
103
- changeApi();
104
- } else {
105
- $('track').each(changeApi);
106
- }
107
- };
108
- if(!trackOptions.override){
109
- if(webshims.isReady('track')){
110
- detectTrackError();
111
- } else {
112
- $(detectTrackError);
113
- }
114
- }
115
- })();
116
-
117
- }
118
-
119
- webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
120
- hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
121
-
122
- var mediaelement = webshims.mediaelement;
123
-
124
- var getSrcObj = function(elem, nodeName){
125
- elem = $(elem);
126
- var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
127
- if(!src.src){return src;}
128
- var tmp = elem.attr('type');
129
- if(tmp){
130
- src.type = tmp;
131
- src.container = $.trim(tmp.split(';')[0]);
132
- } else {
133
- if(!nodeName){
134
- nodeName = elem[0].nodeName.toLowerCase();
135
- if(nodeName == 'source'){
136
- nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
137
- }
138
- }
139
- tmp = mediaelement.getTypeForSrc(src.src, nodeName );
140
-
141
- if(tmp){
142
- src.type = tmp;
143
- src.container = tmp;
144
- }
145
- }
146
- tmp = elem.attr('media');
147
- if(tmp){
148
- src.media = tmp;
149
- }
150
- return src;
151
- };
152
-
153
-
154
-
155
- var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
156
-
157
- var loadYt = (function(){
158
- var loaded;
159
- return function(){
160
- if(loaded || !hasYt){return;}
161
- loaded = true;
162
- webshims.loader.loadScript("https://www.youtube.com/player_api");
163
- $(function(){
164
- webshims.polyfill("mediaelement-yt");
165
- });
166
- };
167
- })();
168
- var loadThird = function(){
169
- if(hasSwf){
170
- loadSwf();
171
- } else {
172
- loadYt();
173
- }
174
- };
175
-
176
- webshims.addPolyfill('mediaelement-yt', {
177
- test: !hasYt,
178
- d: ['dom-support']
179
- });
180
-
181
- mediaelement.mimeTypes = {
182
- audio: {
183
- //ogm shouldn´t be used!
184
- 'audio/ogg': ['ogg','oga', 'ogm'],
185
- 'audio/ogg;codecs="opus"': 'opus',
186
- 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
187
- 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
188
- 'audio/wav': ['wav'],
189
- 'audio/3gpp': ['3gp','3gpp'],
190
- 'audio/webm': ['webm'],
191
- 'audio/fla': ['flv', 'f4a', 'fla'],
192
- 'application/x-mpegURL': ['m3u8', 'm3u']
193
- },
194
- video: {
195
- //ogm shouldn´t be used!
196
- 'video/ogg': ['ogg','ogv', 'ogm'],
197
- 'video/mpeg': ['mpg','mpeg','mpe'],
198
- 'video/mp4': ['mp4','mpg4', 'm4v'],
199
- 'video/quicktime': ['mov','qt'],
200
- 'video/x-msvideo': ['avi'],
201
- 'video/x-ms-asf': ['asf', 'asx'],
202
- 'video/flv': ['flv', 'f4v'],
203
- 'video/3gpp': ['3gp','3gpp'],
204
- 'video/webm': ['webm'],
205
- 'application/x-mpegURL': ['m3u8', 'm3u'],
206
- 'video/MP2T': ['ts']
207
- }
208
- }
209
- ;
210
-
211
- mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
212
-
213
- mediaelement.getTypeForSrc = function(src, nodeName){
214
- if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
215
- return 'video/youtube';
216
- }
217
- src = src.split('?')[0].split('.');
218
- src = src[src.length - 1];
219
- var mt;
220
-
221
- $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
222
- if(exts.indexOf(src) !== -1){
223
- mt = mimeType;
224
- return false;
225
- }
226
- });
227
- return mt;
228
- };
229
-
230
-
231
- mediaelement.srces = function(mediaElem, srces){
232
- mediaElem = $(mediaElem);
233
- if(!srces){
234
- srces = [];
235
- var nodeName = mediaElem[0].nodeName.toLowerCase();
236
- var src = getSrcObj(mediaElem, nodeName);
237
-
238
- if(!src.src){
239
-
240
- $('source', mediaElem).each(function(){
241
- src = getSrcObj(this, nodeName);
242
- if(src.src){srces.push(src);}
243
- });
244
- } else {
245
- srces.push(src);
246
- }
247
- return srces;
248
- } else {
249
- mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
250
- if(!$.isArray(srces)){
251
- srces = [srces];
252
- }
253
- srces.forEach(function(src){
254
- var source = document.createElement('source');
255
- if(typeof src == 'string'){
256
- src = {src: src};
257
- }
258
- source.setAttribute('src', src.src);
259
- if(src.type){
260
- source.setAttribute('type', src.type);
261
- }
262
- if(src.media){
263
- source.setAttribute('media', src.media);
264
- }
265
- mediaElem.append(source);
266
- });
267
-
268
- }
269
- };
270
-
271
-
272
- $.fn.loadMediaSrc = function(srces, poster){
273
- return this.each(function(){
274
- if(poster !== undefined){
275
- $(this).removeAttr('poster');
276
- if(poster){
277
- $.attr(this, 'poster', poster);
278
- }
279
- }
280
- mediaelement.srces(this, srces);
281
- $(this).mediaLoad();
282
- });
283
- };
284
-
285
- mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'jwplayer/jwplayer', 'video/youtube'];
286
-
287
- mediaelement.canThirdPlaySrces = function(mediaElem, srces){
288
- var ret = '';
289
- if(hasSwf || hasYt){
290
- mediaElem = $(mediaElem);
291
- srces = srces || mediaelement.srces(mediaElem);
292
- $.each(srces, function(i, src){
293
- if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
294
- ret = src;
295
- return false;
296
- }
297
- });
298
-
299
- }
300
-
301
- return ret;
302
- };
303
-
304
- var nativeCanPlayType = {};
305
- mediaelement.canNativePlaySrces = function(mediaElem, srces){
306
- var ret = '';
307
- if(hasNative){
308
- mediaElem = $(mediaElem);
309
- var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
310
- if(!nativeCanPlayType[nodeName]){return ret;}
311
- srces = srces || mediaelement.srces(mediaElem);
312
-
313
- $.each(srces, function(i, src){
314
- if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
315
- ret = src;
316
- return false;
317
- }
318
- });
319
- }
320
- return ret;
321
- };
322
-
323
- mediaelement.setError = function(elem, message){
324
- if(!message){
325
- message = "can't play sources";
326
- }
327
-
328
- $(elem).pause().data('mediaerror', message);
329
- webshims.warn('mediaelementError: '+ message);
330
- setTimeout(function(){
331
- if($(elem).data('mediaerror')){
332
- $(elem).trigger('mediaerror');
333
- }
334
- }, 1);
335
- };
336
-
337
- var handleThird = (function(){
338
- var requested;
339
- return function( mediaElem, ret, data ){
340
- webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
341
- if(mediaelement.createSWF){
342
- mediaelement.createSWF( mediaElem, ret, data );
343
- } else if(!requested) {
344
- requested = true;
345
- loadThird();
346
- //readd to ready
347
- handleThird( mediaElem, ret, data );
348
- }
349
- });
350
- if(!requested && hasYt && !mediaelement.createSWF){
351
- loadYt();
352
- }
353
- };
354
- })();
355
-
356
- var stepSources = function(elem, data, useSwf, _srces, _noLoop){
357
- var ret;
358
- if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
359
- ret = mediaelement.canThirdPlaySrces(elem, _srces);
360
- if(!ret){
361
- if(_noLoop){
362
- mediaelement.setError(elem, false);
363
- } else {
364
- stepSources(elem, data, false, _srces, true);
365
- }
366
- } else {
367
- handleThird(elem, ret, data);
368
- }
369
- } else {
370
- ret = mediaelement.canNativePlaySrces(elem, _srces);
371
- if(!ret){
372
- if(_noLoop){
373
- mediaelement.setError(elem, false);
374
- if(data && data.isActive == 'third') {
375
- mediaelement.setActive(elem, 'html5', data);
376
- }
377
- } else {
378
- stepSources(elem, data, true, _srces, true);
379
- }
380
- } else if(data && data.isActive == 'third') {
381
- mediaelement.setActive(elem, 'html5', data);
382
- }
383
- }
384
- };
385
- var stopParent = /^(?:embed|object|datalist)$/i;
386
- var selectSource = function(elem, data){
387
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
388
- var _srces = mediaelement.srces(elem);
389
- var parent = elem.parentNode;
390
-
391
- clearTimeout(baseData.loadTimer);
392
- $.data(elem, 'mediaerror', false);
393
-
394
- if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
395
- data = data || webshims.data(elem, 'mediaelement');
396
- stepSources(elem, data, options.preferFlash || undefined, _srces);
397
- };
398
-
399
-
400
- $(document).on('ended', function(e){
401
- var data = webshims.data(e.target, 'mediaelement');
402
- if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
403
- setTimeout(function(){
404
- if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
405
- $(e.target).prop('currentTime', 0).play();
406
- }, 1);
407
-
408
- });
409
- if(!supportsLoop){
410
- webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
411
- }
412
-
413
- ['audio', 'video'].forEach(function(nodeName){
414
- var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
415
- prop: {
416
- value: function(){
417
- var data = webshims.data(this, 'mediaelement');
418
- selectSource(this, data);
419
- if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
420
- supLoad.prop._supvalue.apply(this, arguments);
421
- }
422
- }
423
- }
424
- });
425
- nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
426
- prop: {
427
- value: function(type){
428
- var ret = '';
429
- if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
430
- ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
431
- if(ret == 'no'){
432
- ret = '';
433
- }
434
- }
435
- if(!ret && hasSwf){
436
- type = $.trim((type || '').split(';')[0]);
437
- if(mediaelement.swfMimeTypes.indexOf(type) != -1){
438
- ret = 'maybe';
439
- }
440
- }
441
- return ret;
442
- }
443
- }
444
- });
445
- });
446
- webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
447
- set: function(){
448
- var elem = this;
449
- var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
450
- clearTimeout(baseData.loadTimer);
451
- baseData.loadTimer = setTimeout(function(){
452
- selectSource(elem);
453
- elem = null;
454
- }, 9);
455
- }
456
- });
457
-
458
- var initMediaElements = function(){
459
-
460
- webshims.addReady(function(context, insertedElement){
461
- $('video, audio', context)
462
- .add(insertedElement.filter('video, audio'))
463
- .each(function(){
464
- if($.browser.msie && webshims.browserVersion > 8 && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])')){
465
- $(this).prop('preload', 'metadata').mediaLoad();
466
- } else {
467
- selectSource(this);
468
- }
469
-
470
-
471
-
472
- if(hasNative){
473
- var bufferTimer;
474
- var lastBuffered;
475
- var elem = this;
476
- var getBufferedString = function(){
477
- var buffered = $.prop(elem, 'buffered');
478
- if(!buffered){return;}
479
- var bufferString = "";
480
- for(var i = 0, len = buffered.length; i < len;i++){
481
- bufferString += buffered.end(i);
482
- }
483
- return bufferString;
484
- };
485
- var testBuffer = function(){
486
- var buffered = getBufferedString();
487
- if(buffered != lastBuffered){
488
- lastBuffered = buffered;
489
- $(elem).triggerHandler('progress');
490
- }
491
- };
492
-
493
- $(this)
494
- .on({
495
- 'play loadstart progress': function(e){
496
- if(e.type == 'progress'){
497
- lastBuffered = getBufferedString();
498
- }
499
- clearTimeout(bufferTimer);
500
- bufferTimer = setTimeout(testBuffer, 999);
501
- },
502
- 'emptied stalled mediaerror abort suspend': function(e){
503
- if(e.type == 'emptied'){
504
- lastBuffered = false;
505
- }
506
- clearTimeout(bufferTimer);
507
- }
508
- })
509
- ;
510
- }
511
-
512
- })
513
- ;
514
- });
515
- };
516
-
517
- if(Modernizr.track && !bugs.track){
518
- webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
519
- get: function(){
520
- return this._shimActiveCues || this.activeCues;
521
- }
522
- });
523
- }
524
- //set native implementation ready, before swf api is retested
525
- if(hasNative){
526
- webshims.isReady('mediaelement-core', true);
527
- initMediaElements();
528
- webshims.ready('WINDOWLOAD mediaelement', loadThird);
529
- } else {
530
- webshims.ready(swfType, initMediaElements);
531
- }
532
- $(function(){
533
- webshims.loader.loadList(['track-ui']);
534
- });
535
-
536
- });
537
- })(jQuery, Modernizr, jQuery.webshims);jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
538
- "use strict";
539
- var validityMessages = webshims.validityMessages;
540
-
541
- var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
542
-
543
- validityMessages['en'] = $.extend(true, {
544
- typeMismatch: {
545
- email: 'Please enter an email address.',
546
- url: 'Please enter a URL.',
547
- number: 'Please enter a number.',
548
- date: 'Please enter a date.',
549
- time: 'Please enter a time.',
550
- range: 'Invalid input.',
551
- "datetime-local": 'Please enter a datetime.'
552
- },
553
- rangeUnderflow: {
554
- defaultMessage: 'Value must be greater than or equal to {%min}.'
555
- },
556
- rangeOverflow: {
557
- defaultMessage: 'Value must be less than or equal to {%max}.'
558
- },
559
- stepMismatch: 'Invalid input.',
560
- tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
561
-
562
- patternMismatch: 'Invalid input. {%title}',
563
- valueMissing: {
564
- defaultMessage: 'Please fill out this field.',
565
- checkbox: 'Please check this box if you want to proceed.'
566
- }
567
- }, (validityMessages['en'] || validityMessages['en-US'] || {}));
568
-
569
-
570
- ['select', 'radio'].forEach(function(type){
571
- validityMessages['en'].valueMissing[type] = 'Please select an option.';
572
- });
573
-
574
- ['date', 'time', 'datetime-local'].forEach(function(type){
575
- validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
576
- });
577
- ['date', 'time', 'datetime-local'].forEach(function(type){
578
- validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
579
- });
580
-
581
- validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
582
- validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
583
-
584
- validityMessages['de'] = $.extend(true, {
585
- typeMismatch: {
586
- email: '{%value} ist keine zulässige E-Mail-Adresse',
587
- url: '{%value} ist keine zulässige Webadresse',
588
- number: '{%value} ist keine Nummer!',
589
- date: '{%value} ist kein Datum',
590
- time: '{%value} ist keine Uhrzeit',
591
- range: '{%value} ist keine Nummer!',
592
- "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
593
- },
594
- rangeUnderflow: {
595
- defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
596
- },
597
- rangeOverflow: {
598
- defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
599
- },
600
- stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
601
- tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
602
- patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
603
- valueMissing: {
604
- defaultMessage: 'Bitte geben Sie einen Wert ein',
605
- checkbox: 'Bitte aktivieren Sie das Kästchen'
606
- }
607
- }, (validityMessages['de'] || {}));
608
-
609
- ['select', 'radio'].forEach(function(type){
610
- validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
611
- });
612
-
613
- ['date', 'time', 'datetime-local'].forEach(function(type){
614
- validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
615
- });
616
- ['date', 'time', 'datetime-local'].forEach(function(type){
617
- validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
618
- });
619
-
620
- var currentValidationMessage = validityMessages[''];
621
-
622
-
623
- webshims.createValidationMessage = function(elem, name){
624
- var message = currentValidationMessage[name];
625
- if(message && typeof message !== 'string'){
626
- message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
627
- }
628
- if(message){
629
- ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
630
- if(message.indexOf('{%'+attr) === -1){return;}
631
- var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
632
- if(name == 'patternMismatch' && attr == 'title' && !val){
633
- webshims.error('no title for patternMismatch provided. Always add a title attribute.');
634
- }
635
- message = message.replace('{%'+ attr +'}', val);
636
- if('value' == attr){
637
- message = message.replace('{%valueLen}', val.length);
638
- }
639
- });
640
- }
641
- return message || '';
642
- };
643
-
644
-
645
- if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
646
- implementProperties.push('validationMessage');
647
- }
648
-
649
- webshims.activeLang({
650
- langObj: validityMessages,
651
- module: 'form-core',
652
- callback: function(langObj){
653
- currentValidationMessage = langObj;
654
- }
655
- });
656
-
657
- implementProperties.forEach(function(messageProp){
658
- webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
659
- prop: {
660
- value: '',
661
- writeable: false
662
- }
663
- });
664
- ['input', 'select', 'textarea'].forEach(function(nodeName){
665
- var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
666
- prop: {
667
- get: function(){
668
- var elem = this;
669
- var message = '';
670
- if(!$.prop(elem, 'willValidate')){
671
- return message;
672
- }
673
-
674
- var validity = $.prop(elem, 'validity') || {valid: 1};
675
-
676
- if(validity.valid){return message;}
677
- message = webshims.getContentValidationMessage(elem, validity);
678
-
679
- if(message){return message;}
680
-
681
- if(validity.customError && elem.nodeName){
682
- message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
683
- if(message){return message;}
684
- }
685
- $.each(validity, function(name, prop){
686
- if(name == 'valid' || !prop){return;}
687
-
688
- message = webshims.createValidationMessage(elem, name);
689
- if(message){
690
- return false;
691
- }
692
- });
693
- return message || '';
694
- },
695
- writeable: false
696
- }
697
- });
698
- });
699
-
700
- });
701
- });if(!Modernizr.formvalidation || jQuery.webshims.bugs.bustedValidity){
702
- jQuery.webshims.register('form-extend', function($, webshims, window, document){
703
- "use strict";
704
- webshims.inputTypes = webshims.inputTypes || {};
705
- //some helper-functions
706
- var cfg = webshims.cfg.forms;
707
- var isSubmit;
708
-
709
- var isNumber = function(string){
710
- return (typeof string == 'number' || (string && string == string * 1));
711
- },
712
- typeModels = webshims.inputTypes,
713
- checkTypes = {
714
- radio: 1,
715
- checkbox: 1
716
- },
717
- getType = function(elem){
718
- return (elem.getAttribute('type') || elem.type || '').toLowerCase();
719
- }
720
- ;
721
-
722
- //API to add new input types
723
- webshims.addInputType = function(type, obj){
724
- typeModels[type] = obj;
725
- };
726
-
727
- //contsrain-validation-api
728
- var validityPrototype = {
729
- customError: false,
730
-
731
- typeMismatch: false,
732
- rangeUnderflow: false,
733
- rangeOverflow: false,
734
- stepMismatch: false,
735
- tooLong: false,
736
- patternMismatch: false,
737
- valueMissing: false,
738
-
739
- valid: true
740
- };
741
-
742
- var isPlaceholderOptionSelected = function(select){
743
- if(select.type == 'select-one' && select.size < 2){
744
- var option = $('> option:first-child', select);
745
- return !!option.prop('selected');
746
- }
747
- return false;
748
- };
749
-
750
- var validityRules = {
751
- valueMissing: function(input, val, cache){
752
- if(!input.prop('required')){return false;}
753
- var ret = false;
754
- if(!('type' in cache)){
755
- cache.type = getType(input[0]);
756
- }
757
- if(cache.nodeName == 'select'){
758
- ret = (!val && (input[0].selectedIndex < 0 || isPlaceholderOptionSelected(input[0]) ));
759
- } else if(checkTypes[cache.type]){
760
- ret = (cache.type == 'checkbox') ? !input.is(':checked') : !webshims.modules["form-core"].getGroupElements(input).filter(':checked')[0];
761
- } else {
762
- ret = !(val);
763
- }
764
- return ret;
765
- },
766
- tooLong: function(){
767
- return false;
768
- },
769
- typeMismatch: function (input, val, cache){
770
- if(val === '' || cache.nodeName == 'select'){return false;}
771
- var ret = false;
772
- if(!('type' in cache)){
773
- cache.type = getType(input[0]);
774
- }
775
-
776
- if(typeModels[cache.type] && typeModels[cache.type].mismatch){
777
- ret = typeModels[cache.type].mismatch(val, input);
778
- } else if('validity' in input[0]){
779
- ret = input[0].validity.typeMismatch;
780
- }
781
- return ret;
782
- },
783
- patternMismatch: function(input, val, cache) {
784
- if(val === '' || cache.nodeName == 'select'){return false;}
785
- var pattern = input.attr('pattern');
786
- if(!pattern){return false;}
787
- try {
788
- pattern = new RegExp('^(?:' + pattern + ')$');
789
- } catch(er){
790
- webshims.error('invalid pattern value: "'+ pattern +'" | '+ er);
791
- pattern = false;
792
- }
793
- if(!pattern){return false;}
794
- return !(pattern.test(val));
795
- }
796
- }
797
- ;
798
-
799
- webshims.addValidityRule = function(type, fn){
800
- validityRules[type] = fn;
801
- };
802
-
803
- $.event.special.invalid = {
804
- add: function(){
805
- $.event.special.invalid.setup.call(this.form || this);
806
- },
807
- setup: function(){
808
- var form = this.form || this;
809
- if( $.data(form, 'invalidEventShim') ){
810
- form = null;
811
- return;
812
- }
813
- $(form)
814
- .data('invalidEventShim', true)
815
- .on('submit', $.event.special.invalid.handler)
816
- ;
817
- webshims.moveToFirstEvent(form, 'submit');
818
- if(webshims.bugs.bustedValidity && $.nodeName(form, 'form')){
819
- (function(){
820
- var noValidate = form.getAttribute('novalidate');
821
- form.setAttribute('novalidate', 'novalidate');
822
- webshims.data(form, 'bustedNoValidate', (noValidate == null) ? null : noValidate);
823
- })();
824
- }
825
- form = null;
826
- },
827
- teardown: $.noop,
828
- handler: function(e, d){
829
-
830
- if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
831
-
832
- isSubmit = true;
833
- e.testedValidity = true;
834
- var notValid = !($(e.target).checkValidity());
835
- if(notValid){
836
- e.stopImmediatePropagation();
837
- isSubmit = false;
838
- return false;
839
- }
840
- isSubmit = false;
841
- }
842
- };
843
-
844
- var addSubmitBubbles = function(form){
845
- if (!$.support.submitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
846
-
847
- $.event.add( form, 'submit._submit', function( event ) {
848
- event._submit_bubble = true;
849
- });
850
-
851
- form._submit_attached = true;
852
- }
853
- };
854
- if(!$.support.submitBubbles && $.event.special.submit){
855
- $.event.special.submit.setup = function() {
856
- // Only need this for delegated form submit events
857
- if ( $.nodeName( this, "form" ) ) {
858
- return false;
859
- }
860
-
861
- // Lazy-add a submit handler when a descendant form may potentially be submitted
862
- $.event.add( this, "click._submit keypress._submit", function( e ) {
863
- // Node name check avoids a VML-related crash in IE (#9807)
864
- var elem = e.target,
865
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
866
- addSubmitBubbles(form);
867
-
868
- });
869
- // return undefined since we don't need an event listener
870
- };
871
- }
872
-
873
- $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
874
- var submitSetup = $.event.special.submit.setup;
875
- $.extend($.event.special.submit, {
876
- setup: function(){
877
- if($.nodeName(this, 'form')){
878
- $(this).on('invalid', $.noop);
879
- } else {
880
- $('form', this).on('invalid', $.noop);
881
- }
882
- return submitSetup.apply(this, arguments);
883
- }
884
- });
885
-
886
- $(window).on('invalid', $.noop);
887
-
888
-
889
- webshims.addInputType('email', {
890
- mismatch: (function(){
891
- //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
892
- var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+-\/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
893
- return function(val){
894
- return !test.test(val);
895
- };
896
- })()
897
- });
898
-
899
- webshims.addInputType('url', {
900
- mismatch: (function(){
901
- //taken from scott gonzales
902
- var test = cfg.urlReg || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
903
- return function(val){
904
- return !test.test(val);
905
- };
906
- })()
907
- });
908
-
909
- webshims.defineNodeNameProperty('input', 'type', {
910
- prop: {
911
- get: function(){
912
- var elem = this;
913
- var type = (elem.getAttribute('type') || '').toLowerCase();
914
- return (webshims.inputTypes[type]) ? type : elem.type;
915
- }
916
- }
917
- });
918
-
919
- // IDLs for constrain validation API
920
- //ToDo: add object to this list
921
- webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
922
- checkValidity: {
923
- value: function(){return true;}
924
- },
925
- willValidate: {
926
- value: false
927
- },
928
- setCustomValidity: {
929
- value: $.noop
930
- },
931
- validity: {
932
- writeable: false,
933
- get: function(){
934
- return $.extend({}, validityPrototype);
935
- }
936
- }
937
- }, 'prop');
938
-
939
- var baseCheckValidity = function(elem){
940
- var e,
941
- v = $.prop(elem, 'validity')
942
- ;
943
- if(v){
944
- $.data(elem, 'cachedValidity', v);
945
- } else {
946
- return true;
947
- }
948
- if( !v.valid ){
949
- e = $.Event('invalid');
950
- var jElm = $(elem).trigger(e);
951
- if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
952
- webshims.validityAlert.showFor(jElm);
953
- baseCheckValidity.unhandledInvalids = true;
954
- }
955
- }
956
- $.removeData(elem, 'cachedValidity');
957
- return v.valid;
958
- };
959
- var rsubmittable = /^(?:select|textarea|input)/i;
960
- webshims.defineNodeNameProperty('form', 'checkValidity', {
961
- prop: {
962
- value: function(){
963
-
964
- var ret = true,
965
- elems = $($.prop(this, 'elements')).filter(function(){
966
- if(!rsubmittable.test(this.nodeName)){return false;}
967
- var shadowData = webshims.data(this, 'shadowData');
968
- return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
969
- })
970
- ;
971
-
972
- baseCheckValidity.unhandledInvalids = false;
973
- for(var i = 0, len = elems.length; i < len; i++){
974
- if( !baseCheckValidity(elems[i]) ){
975
- ret = false;
976
- }
977
- }
978
- return ret;
979
- }
980
- }
981
- });
982
-
983
- webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
984
- checkValidity: {
985
- value: function(){
986
- baseCheckValidity.unhandledInvalids = false;
987
- return baseCheckValidity($(this).getNativeElement()[0]);
988
- }
989
- },
990
- setCustomValidity: {
991
- value: function(error){
992
- $.removeData(this, 'cachedValidity');
993
- webshims.data(this, 'customvalidationMessage', ''+error);
994
- }
995
- },
996
- willValidate: {
997
- writeable: false,
998
- get: (function(){
999
- var types = {
1000
- button: 1,
1001
- reset: 1,
1002
- hidden: 1,
1003
- image: 1
1004
- }
1005
- ;
1006
- return function(){
1007
- var elem = $(this).getNativeElement()[0];
1008
- //elem.name && <- we don't use to make it easier for developers
1009
- return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
1010
- };
1011
- })()
1012
- },
1013
- validity: {
1014
- writeable: false,
1015
- get: function(){
1016
- var jElm = $(this).getNativeElement();
1017
- var elem = jElm[0];
1018
- var validityState = $.data(elem, 'cachedValidity');
1019
- if(validityState){
1020
- return validityState;
1021
- }
1022
- validityState = $.extend({}, validityPrototype);
1023
-
1024
- if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
1025
- return validityState;
1026
- }
1027
- var val = jElm.val(),
1028
- cache = {nodeName: elem.nodeName.toLowerCase()}
1029
- ;
1030
-
1031
- validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
1032
- if( validityState.customError ){
1033
- validityState.valid = false;
1034
- }
1035
-
1036
- $.each(validityRules, function(rule, fn){
1037
- if (fn(jElm, val, cache)) {
1038
- validityState[rule] = true;
1039
- validityState.valid = false;
1040
- }
1041
- });
1042
- $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
1043
- jElm = null;
1044
- elem = null;
1045
- return validityState;
1046
- }
1047
- }
1048
- }, 'prop');
1049
-
1050
- webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
1051
- set: function(value){
1052
- $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
1053
- },
1054
- initAttr: (!$.browser.msie || webshims.browserVersion > 7)//only if we have aria-support
1055
- });
1056
-
1057
- webshims.reflectProperties(['input'], ['pattern']);
1058
-
1059
-
1060
- if( !('maxLength' in document.createElement('textarea')) ){
1061
- var constrainMaxLength = (function(){
1062
- var timer;
1063
- var curLength = 0;
1064
- var lastElement = $([]);
1065
- var max = 1e9;
1066
- var constrainLength = function(){
1067
- var nowValue = lastElement.prop('value');
1068
- var nowLen = nowValue.length;
1069
- if(nowLen > curLength && nowLen > max){
1070
- nowLen = Math.max(curLength, max);
1071
- lastElement.prop('value', nowValue.substr(0, nowLen ));
1072
- }
1073
- curLength = nowLen;
1074
- };
1075
- var remove = function(){
1076
- clearTimeout(timer);
1077
- lastElement.unbind('.maxlengthconstraint');
1078
- };
1079
- return function(element, maxLength){
1080
- remove();
1081
- if(maxLength > -1){
1082
- max = maxLength;
1083
- curLength = $.prop(element, 'value').length;
1084
- lastElement = $(element);
1085
- lastElement.on({
1086
- 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
1087
- setTimeout(constrainLength, 0);
1088
- },
1089
- 'keyup.maxlengthconstraint': constrainLength,
1090
- 'blur.maxlengthconstraint': remove
1091
- });
1092
- timer = setInterval(constrainLength, 200);
1093
- }
1094
- };
1095
- })();
1096
-
1097
- constrainMaxLength.update = function(element, maxLength){
1098
- if($(element).is(':focus')){
1099
- if(!maxLength){
1100
- maxLength = $.prop(element, 'maxlength');
1101
- }
1102
- constrainMaxLength(element, maxLength);
1103
- }
1104
- };
1105
-
1106
- $(document).on('focusin', function(e){
1107
- var maxLength;
1108
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
1109
- constrainMaxLength(e.target, maxLength);
1110
- }
1111
- });
1112
-
1113
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
1114
- attr: {
1115
- set: function(val){
1116
- this.setAttribute('maxlength', ''+val);
1117
- constrainMaxLength.update(this);
1118
- },
1119
- get: function(){
1120
- var ret = this.getAttribute('maxlength');
1121
- return ret == null ? undefined : ret;
1122
- }
1123
- },
1124
- prop: {
1125
- set: function(val){
1126
- if(isNumber(val)){
1127
- if(val < 0){
1128
- throw('INDEX_SIZE_ERR');
1129
- }
1130
- val = parseInt(val, 10);
1131
- this.setAttribute('maxlength', val);
1132
- constrainMaxLength.update(this, val);
1133
- return;
1134
- }
1135
- this.setAttribute('maxlength', '0');
1136
- constrainMaxLength.update(this, 0);
1137
- },
1138
- get: function(){
1139
- var val = this.getAttribute('maxlength');
1140
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
1141
-
1142
- }
1143
- }
1144
- });
1145
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
1146
- prop: {
1147
- set: function(val){
1148
- $.prop(this, 'maxlength', val);
1149
- },
1150
- get: function(){
1151
- return $.prop(this, 'maxlength');
1152
- }
1153
- }
1154
- });
1155
- }
1156
-
1157
-
1158
-
1159
- var submitterTypes = {submit: 1, button: 1, image: 1};
1160
- var formSubmitterDescriptors = {};
1161
- [
1162
- {
1163
- name: "enctype",
1164
- limitedTo: {
1165
- "application/x-www-form-urlencoded": 1,
1166
- "multipart/form-data": 1,
1167
- "text/plain": 1
1168
- },
1169
- defaultProp: "application/x-www-form-urlencoded",
1170
- proptype: "enum"
1171
- },
1172
- {
1173
- name: "method",
1174
- limitedTo: {
1175
- "get": 1,
1176
- "post": 1
1177
- },
1178
- defaultProp: "get",
1179
- proptype: "enum"
1180
- },
1181
- {
1182
- name: "action",
1183
- proptype: "url"
1184
- },
1185
- {
1186
- name: "target"
1187
- },
1188
- {
1189
- name: "novalidate",
1190
- propName: "noValidate",
1191
- proptype: "boolean"
1192
- }
1193
- ].forEach(function(desc){
1194
- var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
1195
- return f.toUpperCase();
1196
- });
1197
- var attrName = 'form'+ desc.name;
1198
- var formName = desc.name;
1199
- var eventName = 'click.webshimssubmittermutate'+formName;
1200
-
1201
- var changeSubmitter = function(){
1202
- var elem = this;
1203
- if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
1204
- var form = $.prop(elem, 'form');
1205
- if(!form){return;}
1206
- var attr = $.attr(elem, attrName);
1207
- if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
1208
-
1209
- var oldAttr = $.attr(form, formName);
1210
-
1211
- $.attr(form, formName, attr);
1212
- setTimeout(function(){
1213
- if(oldAttr != null){
1214
- $.attr(form, formName, oldAttr);
1215
- } else {
1216
- try {
1217
- $(form).removeAttr(formName);
1218
- } catch(er){
1219
- form.removeAttribute(formName);
1220
- }
1221
- }
1222
- }, 9);
1223
- }
1224
- };
1225
-
1226
-
1227
-
1228
- switch(desc.proptype) {
1229
- case "url":
1230
- var urlForm = document.createElement('form');
1231
- formSubmitterDescriptors[propName] = {
1232
- prop: {
1233
- set: function(value){
1234
- $.attr(this, attrName, value);
1235
- },
1236
- get: function(){
1237
- var value = $.attr(this, attrName);
1238
- if(value == null){return '';}
1239
- urlForm.setAttribute('action', value);
1240
- return urlForm.action;
1241
- }
1242
- }
1243
- };
1244
- break;
1245
- case "boolean":
1246
- formSubmitterDescriptors[propName] = {
1247
- prop: {
1248
- set: function(val){
1249
- val = !!val;
1250
- if(val){
1251
- $.attr(this, 'formnovalidate', 'formnovalidate');
1252
- } else {
1253
- $(this).removeAttr('formnovalidate');
1254
- }
1255
- },
1256
- get: function(){
1257
- return $.attr(this, 'formnovalidate') != null;
1258
- }
1259
- }
1260
- };
1261
- break;
1262
- case "enum":
1263
- formSubmitterDescriptors[propName] = {
1264
- prop: {
1265
- set: function(value){
1266
- $.attr(this, attrName, value);
1267
- },
1268
- get: function(){
1269
- var value = $.attr(this, attrName);
1270
- return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
1271
- }
1272
- }
1273
- };
1274
- break;
1275
- default:
1276
- formSubmitterDescriptors[propName] = {
1277
- prop: {
1278
- set: function(value){
1279
- $.attr(this, attrName, value);
1280
- },
1281
- get: function(){
1282
- var value = $.attr(this, attrName);
1283
- return (value != null) ? value : "";
1284
- }
1285
- }
1286
- };
1287
- }
1288
-
1289
-
1290
- if(!formSubmitterDescriptors[attrName]){
1291
- formSubmitterDescriptors[attrName] = {};
1292
- }
1293
- formSubmitterDescriptors[attrName].attr = {
1294
- set: function(value){
1295
- formSubmitterDescriptors[attrName].attr._supset.call(this, value);
1296
- $(this).unbind(eventName).on(eventName, changeSubmitter);
1297
- },
1298
- get: function(){
1299
- return formSubmitterDescriptors[attrName].attr._supget.call(this);
1300
- }
1301
- };
1302
- formSubmitterDescriptors[attrName].initAttr = true;
1303
- formSubmitterDescriptors[attrName].removeAttr = {
1304
- value: function(){
1305
- $(this).unbind(eventName);
1306
- formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
1307
- }
1308
- };
1309
- });
1310
-
1311
- webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
1312
-
1313
-
1314
- if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
1315
- webshims.defineNodeNameProperty('form', 'novalidate', {
1316
- attr: {
1317
- set: function(val){
1318
- this.setAttribute('novalidate', ''+val);
1319
- },
1320
- get: function(){
1321
- var ret = this.getAttribute('novalidate');
1322
- return ret == null ? undefined : ret;
1323
- }
1324
- }
1325
- });
1326
- } else if(webshims.bugs.bustedValidity){
1327
-
1328
- webshims.defineNodeNameProperty('form', 'novalidate', {
1329
- attr: {
1330
- set: function(val){
1331
- webshims.data(this, 'bustedNoValidate', ''+val);
1332
- },
1333
- get: function(){
1334
- var ret = webshims.data(this, 'bustedNoValidate');
1335
- return ret == null ? undefined : ret;
1336
- }
1337
- },
1338
- removeAttr: {
1339
- value: function(){
1340
- webshims.data(this, 'bustedNoValidate', null);
1341
- }
1342
- }
1343
- });
1344
-
1345
- $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
1346
- validityRules[name] = function(elem){
1347
- return (elem[0].validity || {})[name] || false;
1348
- };
1349
- });
1350
-
1351
- }
1352
-
1353
- webshims.defineNodeNameProperty('form', 'noValidate', {
1354
- prop: {
1355
- set: function(val){
1356
- val = !!val;
1357
- if(val){
1358
- $.attr(this, 'novalidate', 'novalidate');
1359
- } else {
1360
- $(this).removeAttr('novalidate');
1361
- }
1362
- },
1363
- get: function(){
1364
- return $.attr(this, 'novalidate') != null;
1365
- }
1366
- }
1367
- });
1368
-
1369
- if($.browser.webkit && Modernizr.inputtypes.date){
1370
- (function(){
1371
-
1372
- var noInputTriggerEvts = {updateInput: 1, input: 1},
1373
- fixInputTypes = {
1374
- date: 1,
1375
- time: 1,
1376
- "datetime-local": 1
1377
- },
1378
- noFocusEvents = {
1379
- focusout: 1,
1380
- blur: 1
1381
- },
1382
- changeEvts = {
1383
- updateInput: 1,
1384
- change: 1
1385
- },
1386
- observe = function(input){
1387
- var timer,
1388
- focusedin = true,
1389
- lastInputVal = input.prop('value'),
1390
- lastChangeVal = lastInputVal,
1391
- trigger = function(e){
1392
- //input === null
1393
- if(!input){return;}
1394
- var newVal = input.prop('value');
1395
-
1396
- if(newVal !== lastInputVal){
1397
- lastInputVal = newVal;
1398
- if(!e || !noInputTriggerEvts[e.type]){
1399
- input.trigger('input');
1400
- }
1401
- }
1402
- if(e && changeEvts[e.type]){
1403
- lastChangeVal = newVal;
1404
- }
1405
- if(!focusedin && newVal !== lastChangeVal){
1406
- input.trigger('change');
1407
- }
1408
- },
1409
- extraTimer,
1410
- extraTest = function(){
1411
- clearTimeout(extraTimer);
1412
- extraTimer = setTimeout(trigger, 9);
1413
- },
1414
- unbind = function(e){
1415
- clearInterval(timer);
1416
- setTimeout(function(){
1417
- if(e && noFocusEvents[e.type]){
1418
- focusedin = false;
1419
- }
1420
- if(input){
1421
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
1422
- trigger();
1423
- }
1424
- input = null;
1425
- }, 1);
1426
-
1427
- }
1428
- ;
1429
-
1430
- clearInterval(timer);
1431
- timer = setInterval(trigger, 160);
1432
- extraTest();
1433
- input
1434
- .off({
1435
- 'focusout blur': unbind,
1436
- 'input change updateInput': trigger
1437
- })
1438
- .on({
1439
- 'focusout blur': unbind,
1440
- 'input updateInput change': trigger
1441
- })
1442
- ;
1443
- }
1444
- ;
1445
- if($.event.customEvent){
1446
- $.event.customEvent.updateInput = true;
1447
- }
1448
-
1449
- (function(){
1450
-
1451
- var correctValue = function(elem){
1452
- var i = 1;
1453
- var len = 3;
1454
- var abort, val;
1455
- if(elem.type == 'date' && (isSubmit || !$(elem).is(':focus'))){
1456
- val = elem.value;
1457
- if(val && val.length < 10 && (val = val.split('-')) && val.length == len){
1458
- for(; i < len; i++){
1459
- if(val[i].length == 1){
1460
- val[i] = '0'+val[i];
1461
- } else if(val[i].length != 2){
1462
- abort = true;
1463
- break;
1464
- }
1465
- }
1466
- if(!abort){
1467
- val = val.join('-');
1468
- $.prop(elem, 'value', val);
1469
- return val;
1470
- }
1471
- }
1472
- }
1473
- };
1474
- var inputCheckValidityDesc, formCheckValidityDesc, inputValueDesc, inputValidityDesc;
1475
-
1476
- inputCheckValidityDesc = webshims.defineNodeNameProperty('input', 'checkValidity', {
1477
- prop: {
1478
- value: function(){
1479
- correctValue(this);
1480
- return inputCheckValidityDesc.prop._supvalue.apply(this, arguments);
1481
- }
1482
- }
1483
- });
1484
-
1485
- formCheckValidityDesc = webshims.defineNodeNameProperty('form', 'checkValidity', {
1486
- prop: {
1487
- value: function(){
1488
- $('input', this).each(function(){
1489
- correctValue(this);
1490
- });
1491
- return formCheckValidityDesc.prop._supvalue.apply(this, arguments);
1492
- }
1493
- }
1494
- });
1495
-
1496
- inputValueDesc = webshims.defineNodeNameProperty('input', 'value', {
1497
- prop: {
1498
- set: function(){
1499
- return inputValueDesc.prop._supset.apply(this, arguments);
1500
- },
1501
- get: function(){
1502
- return correctValue(this) || inputValueDesc.prop._supget.apply(this, arguments);
1503
- }
1504
- }
1505
- });
1506
-
1507
- inputValidityDesc = webshims.defineNodeNameProperty('input', 'validity', {
1508
- prop: {
1509
- writeable: false,
1510
- get: function(){
1511
- correctValue(this);
1512
- return inputValidityDesc.prop._supget.apply(this, arguments);
1513
- }
1514
- }
1515
- });
1516
-
1517
- $(document).on('change', function(e){
1518
- isChangeSubmit = true;
1519
- correctValue(e.target);
1520
- isChangeSubmit = false;
1521
- });
1522
-
1523
- })();
1524
-
1525
- $(document)
1526
- .on('focusin', function(e){
1527
- if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
1528
- observe($(e.target));
1529
- }
1530
- })
1531
- ;
1532
-
1533
-
1534
- })();
1535
- }
1536
-
1537
- webshims.addReady(function(context, contextElem){
1538
- //start constrain-validation
1539
- var focusElem;
1540
- $('form', context)
1541
- .add(contextElem.filter('form'))
1542
- .bind('invalid', $.noop)
1543
- ;
1544
-
1545
- try {
1546
- if(context == document && !('form' in (document.activeElement || {}))) {
1547
- focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
1548
- if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
1549
- focusElem.focus();
1550
- }
1551
- }
1552
- }
1553
- catch (er) {}
1554
-
1555
- });
1556
-
1557
- if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
1558
- (function(){
1559
- (function(prop, undefined){
1560
- $.prop = function(elem, name, value){
1561
- var ret;
1562
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
1563
- ret = document.getElementsByName(name);
1564
- if(!ret || !ret.length){
1565
- ret = document.getElementById(name);
1566
- }
1567
- if(ret){
1568
- ret = $(ret).filter(function(){
1569
- return $.prop(this, 'form') == elem;
1570
- }).get();
1571
- if(ret.length){
1572
- return ret.length == 1 ? ret[0] : ret;
1573
- }
1574
- }
1575
- }
1576
- return prop.apply(this, arguments);
1577
- };
1578
- })($.prop, undefined);
1579
- var removeAddedElements = function(form){
1580
- var elements = $.data(form, 'webshimsAddedElements');
1581
- if(elements){
1582
- elements.remove();
1583
- $.removeData(form, 'webshimsAddedElements');
1584
- }
1585
- };
1586
- var rCRLF = /\r?\n/g,
1587
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
1588
- rselectTextarea = /^(?:select|textarea)/i;
1589
-
1590
- if(!Modernizr.formattribute){
1591
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
1592
- prop: {
1593
- get: function(){
1594
- var form = webshims.contentAttr(this, 'form');
1595
- if(form){
1596
- form = document.getElementById(form);
1597
- if(form && !$.nodeName(form, 'form')){
1598
- form = null;
1599
- }
1600
- }
1601
- return form || this.form;
1602
- },
1603
- writeable: false
1604
- }
1605
- });
1606
-
1607
-
1608
- webshims.defineNodeNamesProperty(['form'], 'elements', {
1609
- prop: {
1610
- get: function(){
1611
- var id = this.id;
1612
- var elements = $.makeArray(this.elements);
1613
- if(id){
1614
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
1615
- }
1616
- return elements;
1617
- },
1618
- writeable: false
1619
- }
1620
- });
1621
-
1622
-
1623
-
1624
- $(function(){
1625
- var stopPropagation = function(e){
1626
- e.stopPropagation();
1627
- };
1628
- $(document).on('submit', function(e){
1629
-
1630
- if(!e.isDefaultPrevented()){
1631
- var form = e.target;
1632
- var id = form.id;
1633
- var elements;
1634
-
1635
-
1636
- if(id){
1637
- removeAddedElements(form);
1638
-
1639
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
1640
- .filter(function(){
1641
- return !this.disabled && this.name && this.form != form;
1642
- })
1643
- .clone()
1644
- ;
1645
- if(elements.length){
1646
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
1647
- setTimeout(function(){
1648
- removeAddedElements(form);
1649
- }, 9);
1650
- }
1651
- elements = null;
1652
- }
1653
- }
1654
- });
1655
-
1656
- $(document).on('click', function(e){
1657
- if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
1658
- var trueForm = $.prop(e.target, 'form');
1659
- var formIn = e.target.form;
1660
- var clone;
1661
- if(trueForm && trueForm != formIn){
1662
- clone = $(e.target)
1663
- .clone()
1664
- .removeAttr('form')
1665
- .addClass('webshims-visual-hide')
1666
- .on('click', stopPropagation)
1667
- .appendTo(trueForm)
1668
- ;
1669
- if(formIn){
1670
- e.preventDefault();
1671
- }
1672
- addSubmitBubbles(trueForm);
1673
- clone.trigger('click');
1674
- setTimeout(function(){
1675
- clone.remove();
1676
- clone = null;
1677
- }, 9);
1678
- }
1679
- }
1680
- });
1681
- });
1682
- }
1683
-
1684
- if(!Modernizr.fieldsetdisabled){
1685
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
1686
- prop: {
1687
- get: function(){
1688
- //add listed elements without keygen, object, output
1689
- return $('input, select, textarea, button, fieldset', this).get() || [];
1690
- },
1691
- writeable: false
1692
- }
1693
- });
1694
- }
1695
-
1696
- $.fn.serializeArray = function() {
1697
- return this.map(function(){
1698
- var elements = $.prop(this, 'elements');
1699
- return elements ? $.makeArray( elements ) : this;
1700
- })
1701
- .filter(function(){
1702
- return this.name && !this.disabled &&
1703
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
1704
- rinput.test( this.type ) );
1705
- })
1706
- .map(function( i, elem ){
1707
- var val = $( this ).val();
1708
-
1709
- return val == null ?
1710
- null :
1711
- $.isArray( val ) ?
1712
- $.map( val, function( val, i ){
1713
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1714
- }) :
1715
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1716
- }).get();
1717
- };
1718
-
1719
- })();
1720
- }
1721
-
1722
- try {
1723
- document.querySelector(':checked');
1724
- } catch(er){
1725
- (function(){
1726
- var checkInputs = {
1727
- radio: 1,
1728
- checkbox: 1
1729
- };
1730
- var selectChange = function(){
1731
- var options = this.options || [];
1732
- var i, len, option;
1733
- for(i = 0, len = options.length; i < len; i++){
1734
- option = $(options[i]);
1735
- option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
1736
- }
1737
- };
1738
- var checkChange = function(){
1739
- var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
1740
- var className = this.className || '';
1741
- var parent;
1742
-
1743
- //IE8- has problems to update styles, we help
1744
- if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
1745
- $(this)[fn]('prop-checked');
1746
- if((parent = this.parentNode)){
1747
- parent.className = parent.className;
1748
- }
1749
- }
1750
- };
1751
-
1752
-
1753
- webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
1754
- webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
1755
- webshims.onNodeNamesPropertyModify('option', 'selected', function(){
1756
- $(this).closest('select').each(selectChange);
1757
- });
1758
- webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
1759
- var type = this.type;
1760
- if(type == 'radio' && boolVal){
1761
- webshims.modules["form-core"].getGroupElements(this).each(checkChange);
1762
- } else if(checkInputs[type]) {
1763
- $(this).each(checkChange);
1764
- }
1765
- });
1766
-
1767
- $(document).on('change', function(e){
1768
-
1769
- if(checkInputs[e.target.type]){
1770
- if(e.target.type == 'radio'){
1771
- webshims.modules["form-core"].getGroupElements(e.target).each(checkChange);
1772
- } else {
1773
- $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
1774
- }
1775
- } else if(e.target.nodeName.toLowerCase() == 'select'){
1776
- $(e.target).each(selectChange);
1777
- }
1778
- });
1779
-
1780
- webshims.addReady(function(context, contextElem){
1781
- $('option, input', context)
1782
- .add(contextElem.filter('option, input'))
1783
- .each(function(){
1784
- var prop;
1785
- if(checkInputs[this.type]){
1786
- prop = 'checked';
1787
- } else if(this.nodeName.toLowerCase() == 'option'){
1788
- prop = 'selected';
1789
- }
1790
- if(prop){
1791
- $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
1792
- }
1793
-
1794
- })
1795
- ;
1796
- });
1797
- })();
1798
- }
1799
-
1800
- (function(){
1801
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1802
- var bustedTextarea = $.browser.webkit && Modernizr.textareaPlaceholder && webshims.browserVersion < 535;
1803
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedTextarea){return;}
1804
-
1805
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
1806
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1807
- var polyfillElements = ['textarea'];
1808
- if(!Modernizr.input.placeholder){
1809
- polyfillElements.push('input');
1810
- }
1811
-
1812
- var setSelection = function(elem){
1813
- try {
1814
- if(elem.setSelectionRange){
1815
- elem.setSelectionRange(0, 0);
1816
- return true;
1817
- } else if(elem.createTextRange){
1818
- var range = elem.createTextRange();
1819
- range.collapse(true);
1820
- range.moveEnd('character', 0);
1821
- range.moveStart('character', 0);
1822
- range.select();
1823
- return true;
1824
- }
1825
- } catch(er){}
1826
- };
1827
-
1828
- var hidePlaceholder = function(elem, data, value, _onFocus){
1829
- if(value === false){
1830
- value = $.prop(elem, 'value');
1831
- }
1832
- if(!isOver && elem.type != 'password'){
1833
- if(!value && _onFocus && setSelection(elem)){
1834
- var selectTimer = setTimeout(function(){
1835
- setSelection(elem);
1836
- }, 9);
1837
- $(elem)
1838
- .off('.placeholderremove')
1839
- .on({
1840
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1841
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1842
- elem.value = $.prop(elem, 'value');
1843
- data.box.removeClass('placeholder-visible');
1844
- clearTimeout(selectTimer);
1845
- $(elem).unbind('.placeholderremove');
1846
- },
1847
- 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
1848
- setSelection(elem);
1849
- clearTimeout(selectTimer);
1850
- selectTimer = setTimeout(function(){
1851
- setSelection(elem);
1852
- }, 9);
1853
- },
1854
- 'blur.placeholderremove': function(){
1855
- clearTimeout(selectTimer);
1856
- $(elem).unbind('.placeholderremove');
1857
- }
1858
- })
1859
- ;
1860
- return;
1861
- }
1862
- elem.value = value;
1863
- } else if(!value && _onFocus){
1864
- $(elem)
1865
- .off('.placeholderremove')
1866
- .on({
1867
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1868
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1869
- data.box.removeClass('placeholder-visible');
1870
- $(elem).unbind('.placeholderremove');
1871
- },
1872
- 'blur.placeholderremove': function(){
1873
- $(elem).unbind('.placeholderremove');
1874
- }
1875
- })
1876
- ;
1877
- return;
1878
- }
1879
- data.box.removeClass('placeholder-visible');
1880
- },
1881
- showPlaceholder = function(elem, data, placeholderTxt){
1882
- if(placeholderTxt === false){
1883
- placeholderTxt = $.prop(elem, 'placeholder');
1884
- }
1885
-
1886
- if(!isOver && elem.type != 'password'){
1887
- elem.value = placeholderTxt;
1888
- }
1889
- data.box.addClass('placeholder-visible');
1890
- },
1891
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
1892
- if(!data){
1893
- data = $.data(elem, 'placeHolder');
1894
- if(!data){return;}
1895
- }
1896
- $(elem).unbind('.placeholderremove');
1897
- if(type == 'focus' || (!type && $(elem).is(':focus'))){
1898
- if(elem.type == 'password' || isOver || $(elem).hasClass('placeholder-visible')){
1899
- hidePlaceholder(elem, data, '', true);
1900
- }
1901
- return;
1902
- }
1903
- if(value === false){
1904
- value = $.prop(elem, 'value');
1905
- }
1906
- if(value){
1907
- hidePlaceholder(elem, data, value);
1908
- return;
1909
- }
1910
- if(placeholderTxt === false){
1911
- placeholderTxt = $.attr(elem, 'placeholder') || '';
1912
- }
1913
- if(placeholderTxt && !value){
1914
- showPlaceholder(elem, data, placeholderTxt);
1915
- } else {
1916
- hidePlaceholder(elem, data, value);
1917
- }
1918
- },
1919
- createPlaceholder = function(elem){
1920
- elem = $(elem);
1921
- var id = elem.prop('id'),
1922
- hasLabel = !!(elem.prop('title') || elem.attr('aria-labelledby'))
1923
- ;
1924
- if(!hasLabel && id){
1925
- hasLabel = !!( $('label[for="'+ id +'"]', elem[0].form)[0] );
1926
- }
1927
- if(!hasLabel){
1928
- if(!id){
1929
- id = $.webshims.getID(elem);
1930
- }
1931
- hasLabel = !!($('label #'+ id)[0]);
1932
- }
1933
- return $( hasLabel ? '<span class="placeholder-text"></span>' : '<label for="'+ id +'" class="placeholder-text"></label>');
1934
- },
1935
- pHolder = (function(){
1936
- var delReg = /\n|\r|\f|\t/g,
1937
- allowedPlaceholder = {
1938
- text: 1,
1939
- search: 1,
1940
- url: 1,
1941
- email: 1,
1942
- password: 1,
1943
- tel: 1
1944
- }
1945
- ;
1946
-
1947
- return {
1948
- create: function(elem){
1949
- var data = $.data(elem, 'placeHolder');
1950
- var form;
1951
- var responsiveElem;
1952
- if(data){return data;}
1953
- data = $.data(elem, 'placeHolder', {});
1954
-
1955
- $(elem).on('focus.placeholder blur.placeholder', function(e){
1956
- changePlaceholderVisibility(this, false, false, data, e.type );
1957
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
1958
- });
1959
-
1960
- if((form = $.prop(elem, 'form'))){
1961
- $(form).on('reset.placeholder', function(e){
1962
- setTimeout(function(){
1963
- changePlaceholderVisibility(elem, false, false, data, e.type );
1964
- }, 0);
1965
- });
1966
- }
1967
-
1968
- if(elem.type == 'password' || isOver){
1969
- data.text = createPlaceholder(elem);
1970
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1971
- responsiveElem = true;
1972
- data.box = data.text;
1973
- } else {
1974
- data.box = $(elem)
1975
- .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1976
- .parent()
1977
- ;
1978
- }
1979
- data.text
1980
- .insertAfter(elem)
1981
- .on('mousedown.placeholder', function(){
1982
- changePlaceholderVisibility(this, false, false, data, 'focus');
1983
- try {
1984
- setTimeout(function(){
1985
- elem.focus();
1986
- }, 0);
1987
- } catch(e){}
1988
- return false;
1989
- })
1990
- ;
1991
-
1992
-
1993
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1994
- var prop = $.css(elem, style);
1995
- if(data.text.css(style) != prop){
1996
- data.text.css(style, prop);
1997
- }
1998
- });
1999
- $.each(['Left', 'Top'], function(i, side){
2000
- var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0);
2001
- data.text.css('padding'+ side, size);
2002
- });
2003
-
2004
- $(elem)
2005
- .on('updateshadowdom', function(){
2006
- var height, width;
2007
- if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
2008
- data.text
2009
- .css({
2010
- width: width,
2011
- height: height
2012
- })
2013
- .css($(elem).position())
2014
- ;
2015
- }
2016
- })
2017
- .triggerHandler('updateshadowdom')
2018
- ;
2019
-
2020
- } else {
2021
- var reset = function(e){
2022
- if($(elem).hasClass('placeholder-visible')){
2023
- hidePlaceholder(elem, data, '');
2024
- if(e && e.type == 'submit'){
2025
- setTimeout(function(){
2026
- if(e.isDefaultPrevented()){
2027
- changePlaceholderVisibility(elem, false, false, data );
2028
- }
2029
- }, 9);
2030
- }
2031
- }
2032
- };
2033
-
2034
- $(window).on('beforeunload', reset);
2035
- data.box = $(elem);
2036
- if(form){
2037
- $(form).submit(reset);
2038
- }
2039
- }
2040
-
2041
- return data;
2042
- },
2043
- update: function(elem, val){
2044
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
2045
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
2046
- webshims.error('placeholder not allowed on input[type="'+type+'"]');
2047
- if(type == 'date'){
2048
- webshims.error('but you can use data-placeholder for input[type="date"]');
2049
- }
2050
- return;
2051
- }
2052
-
2053
-
2054
- var data = pHolder.create(elem);
2055
- if(data.text){
2056
- data.text.text(val);
2057
- }
2058
-
2059
- changePlaceholderVisibility(elem, false, val, data);
2060
- }
2061
- };
2062
- })()
2063
- ;
2064
-
2065
- $.webshims.publicMethods = {
2066
- pHolder: pHolder
2067
- };
2068
- polyfillElements.forEach(function(nodeName){
2069
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
2070
- attr: {
2071
- set: function(val){
2072
- var elem = this;
2073
- if(bustedTextarea){
2074
- webshims.data(elem, 'textareaPlaceholder', val);
2075
- elem.placeholder = '';
2076
- } else {
2077
- webshims.contentAttr(elem, 'placeholder', val);
2078
- }
2079
- pHolder.update(elem, val);
2080
- },
2081
- get: function(){
2082
- var ret = (bustedTextarea) ? webshims.data(this, 'textareaPlaceholder') : '';
2083
- return ret || webshims.contentAttr(this, 'placeholder');
2084
- }
2085
- },
2086
- reflect: true,
2087
- initAttr: true
2088
- });
2089
- });
2090
-
2091
-
2092
- polyfillElements.forEach(function(name){
2093
- var placeholderValueDesc = {};
2094
- var desc;
2095
- ['attr', 'prop'].forEach(function(propType){
2096
- placeholderValueDesc[propType] = {
2097
- set: function(val){
2098
- var elem = this;
2099
- var placeholder;
2100
- if(bustedTextarea){
2101
- placeholder = webshims.data(elem, 'textareaPlaceholder');
2102
- }
2103
- if(!placeholder){
2104
- placeholder = webshims.contentAttr(elem, 'placeholder');
2105
- }
2106
- $.removeData(elem, 'cachedValidity');
2107
- var ret = desc[propType]._supset.call(elem, val);
2108
- if(placeholder && 'value' in elem){
2109
- changePlaceholderVisibility(elem, val, placeholder);
2110
- }
2111
- return ret;
2112
- },
2113
- get: function(){
2114
- var elem = this;
2115
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
2116
- }
2117
- };
2118
- });
2119
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
2120
- });
2121
-
2122
- })();
2123
-
2124
- (function(){
2125
- var doc = document;
2126
- if( 'value' in document.createElement('output') ){return;}
2127
-
2128
- webshims.defineNodeNameProperty('output', 'value', {
2129
- prop: {
2130
- set: function(value){
2131
- var setVal = $.data(this, 'outputShim');
2132
- if(!setVal){
2133
- setVal = outputCreate(this);
2134
- }
2135
- setVal(value);
2136
- },
2137
- get: function(){
2138
- return webshims.contentAttr(this, 'value') || $(this).text() || '';
2139
- }
2140
- }
2141
- });
2142
-
2143
-
2144
- webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
2145
- if(type == 'removeAttr'){return;}
2146
- var setVal = $.data(this, 'outputShim');
2147
- if(setVal){
2148
- setVal(value);
2149
- }
2150
- });
2151
-
2152
- var outputCreate = function(elem){
2153
- if(elem.getAttribute('aria-live')){return;}
2154
- elem = $(elem);
2155
- var value = (elem.text() || '').trim();
2156
- var id = elem.attr('id');
2157
- var htmlFor = elem.attr('for');
2158
- var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
2159
- var form = shim[0].form || doc;
2160
- var setValue = function(val){
2161
- shim[0].value = val;
2162
- val = shim[0].value;
2163
- elem.text(val);
2164
- webshims.contentAttr(elem[0], 'value', val);
2165
- };
2166
-
2167
- elem[0].defaultValue = value;
2168
- webshims.contentAttr(elem[0], 'value', value);
2169
-
2170
- elem.attr({'aria-live': 'polite'});
2171
- if(id){
2172
- shim.attr('id', id);
2173
- elem.attr('aria-labelledby', webshims.getID($('label[for="'+id+'"]', form)));
2174
- }
2175
- if(htmlFor){
2176
- id = webshims.getID(elem);
2177
- htmlFor.split(' ').forEach(function(control){
2178
- control = document.getElementById(control);
2179
- if(control){
2180
- control.setAttribute('aria-controls', id);
2181
- }
2182
- });
2183
- }
2184
- elem.data('outputShim', setValue );
2185
- shim.data('outputShim', setValue );
2186
- return setValue;
2187
- };
2188
-
2189
- webshims.addReady(function(context, contextElem){
2190
- $('output', context).add(contextElem.filter('output')).each(function(){
2191
- outputCreate(this);
2192
- });
2193
- });
2194
-
2195
- /*
2196
- * Implements input event in all browsers
2197
- */
2198
- (function(){
2199
- var noInputTriggerEvts = {updateInput: 1, input: 1},
2200
- noInputTypes = {
2201
- radio: 1,
2202
- checkbox: 1,
2203
- submit: 1,
2204
- button: 1,
2205
- image: 1,
2206
- reset: 1,
2207
- file: 1
2208
-
2209
- //pro forma
2210
- ,color: 1
2211
- //,range: 1
2212
- },
2213
- observe = function(input){
2214
- var timer,
2215
- lastVal = input.prop('value'),
2216
- trigger = function(e){
2217
- //input === null
2218
- if(!input){return;}
2219
- var newVal = input.prop('value');
2220
-
2221
- if(newVal !== lastVal){
2222
- lastVal = newVal;
2223
- if(!e || !noInputTriggerEvts[e.type]){
2224
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
2225
- }
2226
- }
2227
- },
2228
- extraTimer,
2229
- extraTest = function(){
2230
- clearTimeout(extraTimer);
2231
- extraTimer = setTimeout(trigger, 9);
2232
- },
2233
- unbind = function(){
2234
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
2235
- clearInterval(timer);
2236
- setTimeout(function(){
2237
- trigger();
2238
- input = null;
2239
- }, 1);
2240
-
2241
- }
2242
- ;
2243
-
2244
- clearInterval(timer);
2245
- timer = setInterval(trigger, 99);
2246
- extraTest();
2247
- input.on({
2248
- 'keyup keypress keydown paste cut': extraTest,
2249
- focusout: unbind,
2250
- 'input updateInput change': trigger
2251
- });
2252
- }
2253
- ;
2254
- if($.event.customEvent){
2255
- $.event.customEvent.updateInput = true;
2256
- }
2257
-
2258
- $(doc)
2259
- .on('focusin', function(e){
2260
- if( e.target && e.target.type && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] ){
2261
- observe($(e.target));
2262
- }
2263
- })
2264
- ;
2265
- })();
2266
- })();
2267
-
2268
- }); //webshims.ready end
2269
- }//end formvalidation
1
+ if(!Modernizr.formvalidation || jQuery.webshims.bugs.bustedValidity){
2
+ jQuery.webshims.register('form-shim-extend', function($, webshims, window, document){
3
+ "use strict";
4
+ webshims.inputTypes = webshims.inputTypes || {};
5
+ //some helper-functions
6
+ var cfg = webshims.cfg.forms;
7
+ var isSubmit;
8
+
9
+ var isNumber = function(string){
10
+ return (typeof string == 'number' || (string && string == string * 1));
11
+ },
12
+ typeModels = webshims.inputTypes,
13
+ checkTypes = {
14
+ radio: 1,
15
+ checkbox: 1
16
+ },
17
+ getType = function(elem){
18
+ return (elem.getAttribute('type') || elem.type || '').toLowerCase();
19
+ }
20
+ ;
21
+
22
+ //API to add new input types
23
+ webshims.addInputType = function(type, obj){
24
+ typeModels[type] = obj;
25
+ };
26
+
27
+ //contsrain-validation-api
28
+ var validityPrototype = {
29
+ customError: false,
30
+
31
+ typeMismatch: false,
32
+ rangeUnderflow: false,
33
+ rangeOverflow: false,
34
+ stepMismatch: false,
35
+ tooLong: false,
36
+ patternMismatch: false,
37
+ valueMissing: false,
38
+
39
+ valid: true
40
+ };
41
+
42
+ var isPlaceholderOptionSelected = function(select){
43
+ if(select.type == 'select-one' && select.size < 2){
44
+ var option = $('> option:first-child', select);
45
+ return !!option.prop('selected');
46
+ }
47
+ return false;
48
+ };
49
+
50
+ var validityRules = {
51
+ valueMissing: function(input, val, cache){
52
+ if(!input.prop('required')){return false;}
53
+ var ret = false;
54
+ if(!('type' in cache)){
55
+ cache.type = getType(input[0]);
56
+ }
57
+ if(cache.nodeName == 'select'){
58
+ ret = (!val && (input[0].selectedIndex < 0 || isPlaceholderOptionSelected(input[0]) ));
59
+ } else if(checkTypes[cache.type]){
60
+ ret = (cache.type == 'checkbox') ? !input.is(':checked') : !webshims.modules["form-core"].getGroupElements(input).filter(':checked')[0];
61
+ } else {
62
+ ret = !(val);
63
+ }
64
+ return ret;
65
+ },
66
+ tooLong: function(){
67
+ return false;
68
+ },
69
+ typeMismatch: function (input, val, cache){
70
+ if(val === '' || cache.nodeName == 'select'){return false;}
71
+ var ret = false;
72
+ if(!('type' in cache)){
73
+ cache.type = getType(input[0]);
74
+ }
75
+
76
+ if(typeModels[cache.type] && typeModels[cache.type].mismatch){
77
+ ret = typeModels[cache.type].mismatch(val, input);
78
+ } else if('validity' in input[0]){
79
+ ret = input[0].validity.typeMismatch;
80
+ }
81
+ return ret;
82
+ },
83
+ patternMismatch: function(input, val, cache) {
84
+ if(val === '' || cache.nodeName == 'select'){return false;}
85
+ var pattern = input.attr('pattern');
86
+ if(!pattern){return false;}
87
+ try {
88
+ pattern = new RegExp('^(?:' + pattern + ')$');
89
+ } catch(er){
90
+ webshims.error('invalid pattern value: "'+ pattern +'" | '+ er);
91
+ pattern = false;
92
+ }
93
+ if(!pattern){return false;}
94
+ return !(pattern.test(val));
95
+ }
96
+ }
97
+ ;
98
+
99
+ webshims.addValidityRule = function(type, fn){
100
+ validityRules[type] = fn;
101
+ };
102
+
103
+ $.event.special.invalid = {
104
+ add: function(){
105
+ $.event.special.invalid.setup.call(this.form || this);
106
+ },
107
+ setup: function(){
108
+ var form = this.form || this;
109
+ if( $.data(form, 'invalidEventShim') ){
110
+ form = null;
111
+ return;
112
+ }
113
+ $(form)
114
+ .data('invalidEventShim', true)
115
+ .on('submit', $.event.special.invalid.handler)
116
+ ;
117
+ webshims.moveToFirstEvent(form, 'submit');
118
+ if(webshims.bugs.bustedValidity && $.nodeName(form, 'form')){
119
+ (function(){
120
+ var noValidate = form.getAttribute('novalidate');
121
+ form.setAttribute('novalidate', 'novalidate');
122
+ webshims.data(form, 'bustedNoValidate', (noValidate == null) ? null : noValidate);
123
+ })();
124
+ }
125
+ form = null;
126
+ },
127
+ teardown: $.noop,
128
+ handler: function(e, d){
129
+
130
+ if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;}
131
+
132
+ isSubmit = true;
133
+ e.testedValidity = true;
134
+ var notValid = !($(e.target).checkValidity());
135
+ if(notValid){
136
+ e.stopImmediatePropagation();
137
+ isSubmit = false;
138
+ return false;
139
+ }
140
+ isSubmit = false;
141
+ }
142
+ };
143
+
144
+ var addSubmitBubbles = function(form){
145
+ if (!$.support.submitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
146
+
147
+ $.event.add( form, 'submit._submit', function( event ) {
148
+ event._submit_bubble = true;
149
+ });
150
+
151
+ form._submit_attached = true;
152
+ }
153
+ };
154
+ if(!$.support.submitBubbles && $.event.special.submit){
155
+ $.event.special.submit.setup = function() {
156
+ // Only need this for delegated form submit events
157
+ if ( $.nodeName( this, "form" ) ) {
158
+ return false;
159
+ }
160
+
161
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
162
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
163
+ // Node name check avoids a VML-related crash in IE (#9807)
164
+ var elem = e.target,
165
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
166
+ addSubmitBubbles(form);
167
+
168
+ });
169
+ // return undefined since we don't need an event listener
170
+ };
171
+ }
172
+
173
+ $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
174
+ var submitSetup = $.event.special.submit.setup;
175
+ $.extend($.event.special.submit, {
176
+ setup: function(){
177
+ if($.nodeName(this, 'form')){
178
+ $(this).on('invalid', $.noop);
179
+ } else {
180
+ $('form', this).on('invalid', $.noop);
181
+ }
182
+ return submitSetup.apply(this, arguments);
183
+ }
184
+ });
185
+
186
+ $(window).on('invalid', $.noop);
187
+
188
+
189
+ webshims.addInputType('email', {
190
+ mismatch: (function(){
191
+ //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
192
+ var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+-\/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
193
+ return function(val){
194
+ return !test.test(val);
195
+ };
196
+ })()
197
+ });
198
+
199
+ webshims.addInputType('url', {
200
+ mismatch: (function(){
201
+ //taken from scott gonzales
202
+ var test = cfg.urlReg || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
203
+ return function(val){
204
+ return !test.test(val);
205
+ };
206
+ })()
207
+ });
208
+
209
+ webshims.defineNodeNameProperty('input', 'type', {
210
+ prop: {
211
+ get: function(){
212
+ var elem = this;
213
+ var type = (elem.getAttribute('type') || '').toLowerCase();
214
+ return (webshims.inputTypes[type]) ? type : elem.type;
215
+ }
216
+ }
217
+ });
218
+
219
+ // IDLs for constrain validation API
220
+ //ToDo: add object to this list
221
+ webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], {
222
+ checkValidity: {
223
+ value: function(){return true;}
224
+ },
225
+ willValidate: {
226
+ value: false
227
+ },
228
+ setCustomValidity: {
229
+ value: $.noop
230
+ },
231
+ validity: {
232
+ writeable: false,
233
+ get: function(){
234
+ return $.extend({}, validityPrototype);
235
+ }
236
+ }
237
+ }, 'prop');
238
+
239
+ var baseCheckValidity = function(elem){
240
+ var e,
241
+ v = $.prop(elem, 'validity')
242
+ ;
243
+ if(v){
244
+ $.data(elem, 'cachedValidity', v);
245
+ } else {
246
+ return true;
247
+ }
248
+ if( !v.valid ){
249
+ e = $.Event('invalid');
250
+ var jElm = $(elem).trigger(e);
251
+ if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){
252
+ webshims.validityAlert.showFor(jElm);
253
+ baseCheckValidity.unhandledInvalids = true;
254
+ }
255
+ }
256
+ $.removeData(elem, 'cachedValidity');
257
+ return v.valid;
258
+ };
259
+ var rsubmittable = /^(?:select|textarea|input)/i;
260
+ webshims.defineNodeNameProperty('form', 'checkValidity', {
261
+ prop: {
262
+ value: function(){
263
+
264
+ var ret = true,
265
+ elems = $($.prop(this, 'elements')).filter(function(){
266
+ if(!rsubmittable.test(this.nodeName)){return false;}
267
+ var shadowData = webshims.data(this, 'shadowData');
268
+ return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this;
269
+ })
270
+ ;
271
+
272
+ baseCheckValidity.unhandledInvalids = false;
273
+ for(var i = 0, len = elems.length; i < len; i++){
274
+ if( !baseCheckValidity(elems[i]) ){
275
+ ret = false;
276
+ }
277
+ }
278
+ return ret;
279
+ }
280
+ }
281
+ });
282
+
283
+ webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], {
284
+ checkValidity: {
285
+ value: function(){
286
+ baseCheckValidity.unhandledInvalids = false;
287
+ return baseCheckValidity($(this).getNativeElement()[0]);
288
+ }
289
+ },
290
+ setCustomValidity: {
291
+ value: function(error){
292
+ $.removeData(this, 'cachedValidity');
293
+ webshims.data(this, 'customvalidationMessage', ''+error);
294
+ }
295
+ },
296
+ willValidate: {
297
+ writeable: false,
298
+ get: (function(){
299
+ var types = {
300
+ button: 1,
301
+ reset: 1,
302
+ hidden: 1,
303
+ image: 1
304
+ }
305
+ ;
306
+ return function(){
307
+ var elem = $(this).getNativeElement()[0];
308
+ //elem.name && <- we don't use to make it easier for developers
309
+ return !!(!elem.disabled && !elem.readOnly && !types[elem.type] );
310
+ };
311
+ })()
312
+ },
313
+ validity: {
314
+ writeable: false,
315
+ get: function(){
316
+ var jElm = $(this).getNativeElement();
317
+ var elem = jElm[0];
318
+ var validityState = $.data(elem, 'cachedValidity');
319
+ if(validityState){
320
+ return validityState;
321
+ }
322
+ validityState = $.extend({}, validityPrototype);
323
+
324
+ if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){
325
+ return validityState;
326
+ }
327
+ var val = jElm.val(),
328
+ cache = {nodeName: elem.nodeName.toLowerCase()}
329
+ ;
330
+
331
+ validityState.customError = !!(webshims.data(elem, 'customvalidationMessage'));
332
+ if( validityState.customError ){
333
+ validityState.valid = false;
334
+ }
335
+
336
+ $.each(validityRules, function(rule, fn){
337
+ if (fn(jElm, val, cache)) {
338
+ validityState[rule] = true;
339
+ validityState.valid = false;
340
+ }
341
+ });
342
+ $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true');
343
+ jElm = null;
344
+ elem = null;
345
+ return validityState;
346
+ }
347
+ }
348
+ }, 'prop');
349
+
350
+ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
351
+ set: function(value){
352
+ $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
353
+ },
354
+ initAttr: (!$.browser.msie || webshims.browserVersion > 7)//only if we have aria-support
355
+ });
356
+
357
+ webshims.reflectProperties(['input'], ['pattern']);
358
+
359
+
360
+ if( !('maxLength' in document.createElement('textarea')) ){
361
+ var constrainMaxLength = (function(){
362
+ var timer;
363
+ var curLength = 0;
364
+ var lastElement = $([]);
365
+ var max = 1e9;
366
+ var constrainLength = function(){
367
+ var nowValue = lastElement.prop('value');
368
+ var nowLen = nowValue.length;
369
+ if(nowLen > curLength && nowLen > max){
370
+ nowLen = Math.max(curLength, max);
371
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
372
+ }
373
+ curLength = nowLen;
374
+ };
375
+ var remove = function(){
376
+ clearTimeout(timer);
377
+ lastElement.unbind('.maxlengthconstraint');
378
+ };
379
+ return function(element, maxLength){
380
+ remove();
381
+ if(maxLength > -1){
382
+ max = maxLength;
383
+ curLength = $.prop(element, 'value').length;
384
+ lastElement = $(element);
385
+ lastElement.on({
386
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
387
+ setTimeout(constrainLength, 0);
388
+ },
389
+ 'keyup.maxlengthconstraint': constrainLength,
390
+ 'blur.maxlengthconstraint': remove
391
+ });
392
+ timer = setInterval(constrainLength, 200);
393
+ }
394
+ };
395
+ })();
396
+
397
+ constrainMaxLength.update = function(element, maxLength){
398
+ if($(element).is(':focus')){
399
+ if(!maxLength){
400
+ maxLength = $.prop(element, 'maxlength');
401
+ }
402
+ constrainMaxLength(element, maxLength);
403
+ }
404
+ };
405
+
406
+ $(document).on('focusin', function(e){
407
+ var maxLength;
408
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
409
+ constrainMaxLength(e.target, maxLength);
410
+ }
411
+ });
412
+
413
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
414
+ attr: {
415
+ set: function(val){
416
+ this.setAttribute('maxlength', ''+val);
417
+ constrainMaxLength.update(this);
418
+ },
419
+ get: function(){
420
+ var ret = this.getAttribute('maxlength');
421
+ return ret == null ? undefined : ret;
422
+ }
423
+ },
424
+ prop: {
425
+ set: function(val){
426
+ if(isNumber(val)){
427
+ if(val < 0){
428
+ throw('INDEX_SIZE_ERR');
429
+ }
430
+ val = parseInt(val, 10);
431
+ this.setAttribute('maxlength', val);
432
+ constrainMaxLength.update(this, val);
433
+ return;
434
+ }
435
+ this.setAttribute('maxlength', '0');
436
+ constrainMaxLength.update(this, 0);
437
+ },
438
+ get: function(){
439
+ var val = this.getAttribute('maxlength');
440
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
441
+
442
+ }
443
+ }
444
+ });
445
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
446
+ prop: {
447
+ set: function(val){
448
+ $.prop(this, 'maxlength', val);
449
+ },
450
+ get: function(){
451
+ return $.prop(this, 'maxlength');
452
+ }
453
+ }
454
+ });
455
+ }
456
+
457
+
458
+
459
+ var submitterTypes = {submit: 1, button: 1, image: 1};
460
+ var formSubmitterDescriptors = {};
461
+ [
462
+ {
463
+ name: "enctype",
464
+ limitedTo: {
465
+ "application/x-www-form-urlencoded": 1,
466
+ "multipart/form-data": 1,
467
+ "text/plain": 1
468
+ },
469
+ defaultProp: "application/x-www-form-urlencoded",
470
+ proptype: "enum"
471
+ },
472
+ {
473
+ name: "method",
474
+ limitedTo: {
475
+ "get": 1,
476
+ "post": 1
477
+ },
478
+ defaultProp: "get",
479
+ proptype: "enum"
480
+ },
481
+ {
482
+ name: "action",
483
+ proptype: "url"
484
+ },
485
+ {
486
+ name: "target"
487
+ },
488
+ {
489
+ name: "novalidate",
490
+ propName: "noValidate",
491
+ proptype: "boolean"
492
+ }
493
+ ].forEach(function(desc){
494
+ var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){
495
+ return f.toUpperCase();
496
+ });
497
+ var attrName = 'form'+ desc.name;
498
+ var formName = desc.name;
499
+ var eventName = 'click.webshimssubmittermutate'+formName;
500
+
501
+ var changeSubmitter = function(){
502
+ var elem = this;
503
+ if( !('form' in elem) || !submitterTypes[elem.type] ){return;}
504
+ var form = $.prop(elem, 'form');
505
+ if(!form){return;}
506
+ var attr = $.attr(elem, attrName);
507
+ if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){
508
+
509
+ var oldAttr = $.attr(form, formName);
510
+
511
+ $.attr(form, formName, attr);
512
+ setTimeout(function(){
513
+ if(oldAttr != null){
514
+ $.attr(form, formName, oldAttr);
515
+ } else {
516
+ try {
517
+ $(form).removeAttr(formName);
518
+ } catch(er){
519
+ form.removeAttribute(formName);
520
+ }
521
+ }
522
+ }, 9);
523
+ }
524
+ };
525
+
526
+
527
+
528
+ switch(desc.proptype) {
529
+ case "url":
530
+ var urlForm = document.createElement('form');
531
+ formSubmitterDescriptors[propName] = {
532
+ prop: {
533
+ set: function(value){
534
+ $.attr(this, attrName, value);
535
+ },
536
+ get: function(){
537
+ var value = $.attr(this, attrName);
538
+ if(value == null){return '';}
539
+ urlForm.setAttribute('action', value);
540
+ return urlForm.action;
541
+ }
542
+ }
543
+ };
544
+ break;
545
+ case "boolean":
546
+ formSubmitterDescriptors[propName] = {
547
+ prop: {
548
+ set: function(val){
549
+ val = !!val;
550
+ if(val){
551
+ $.attr(this, 'formnovalidate', 'formnovalidate');
552
+ } else {
553
+ $(this).removeAttr('formnovalidate');
554
+ }
555
+ },
556
+ get: function(){
557
+ return $.attr(this, 'formnovalidate') != null;
558
+ }
559
+ }
560
+ };
561
+ break;
562
+ case "enum":
563
+ formSubmitterDescriptors[propName] = {
564
+ prop: {
565
+ set: function(value){
566
+ $.attr(this, attrName, value);
567
+ },
568
+ get: function(){
569
+ var value = $.attr(this, attrName);
570
+ return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value;
571
+ }
572
+ }
573
+ };
574
+ break;
575
+ default:
576
+ formSubmitterDescriptors[propName] = {
577
+ prop: {
578
+ set: function(value){
579
+ $.attr(this, attrName, value);
580
+ },
581
+ get: function(){
582
+ var value = $.attr(this, attrName);
583
+ return (value != null) ? value : "";
584
+ }
585
+ }
586
+ };
587
+ }
588
+
589
+
590
+ if(!formSubmitterDescriptors[attrName]){
591
+ formSubmitterDescriptors[attrName] = {};
592
+ }
593
+ formSubmitterDescriptors[attrName].attr = {
594
+ set: function(value){
595
+ formSubmitterDescriptors[attrName].attr._supset.call(this, value);
596
+ $(this).unbind(eventName).on(eventName, changeSubmitter);
597
+ },
598
+ get: function(){
599
+ return formSubmitterDescriptors[attrName].attr._supget.call(this);
600
+ }
601
+ };
602
+ formSubmitterDescriptors[attrName].initAttr = true;
603
+ formSubmitterDescriptors[attrName].removeAttr = {
604
+ value: function(){
605
+ $(this).unbind(eventName);
606
+ formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this);
607
+ }
608
+ };
609
+ });
610
+
611
+ webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
612
+
613
+
614
+ if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
615
+ webshims.defineNodeNameProperty('form', 'novalidate', {
616
+ attr: {
617
+ set: function(val){
618
+ this.setAttribute('novalidate', ''+val);
619
+ },
620
+ get: function(){
621
+ var ret = this.getAttribute('novalidate');
622
+ return ret == null ? undefined : ret;
623
+ }
624
+ }
625
+ });
626
+ } else if(webshims.bugs.bustedValidity){
627
+
628
+ webshims.defineNodeNameProperty('form', 'novalidate', {
629
+ attr: {
630
+ set: function(val){
631
+ webshims.data(this, 'bustedNoValidate', ''+val);
632
+ },
633
+ get: function(){
634
+ var ret = webshims.data(this, 'bustedNoValidate');
635
+ return ret == null ? undefined : ret;
636
+ }
637
+ },
638
+ removeAttr: {
639
+ value: function(){
640
+ webshims.data(this, 'bustedNoValidate', null);
641
+ }
642
+ }
643
+ });
644
+
645
+ $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
646
+ validityRules[name] = function(elem){
647
+ return (elem[0].validity || {})[name] || false;
648
+ };
649
+ });
650
+
651
+ }
652
+
653
+ webshims.defineNodeNameProperty('form', 'noValidate', {
654
+ prop: {
655
+ set: function(val){
656
+ val = !!val;
657
+ if(val){
658
+ $.attr(this, 'novalidate', 'novalidate');
659
+ } else {
660
+ $(this).removeAttr('novalidate');
661
+ }
662
+ },
663
+ get: function(){
664
+ return $.attr(this, 'novalidate') != null;
665
+ }
666
+ }
667
+ });
668
+
669
+ if($.browser.webkit && Modernizr.inputtypes.date){
670
+ (function(){
671
+
672
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
673
+ fixInputTypes = {
674
+ date: 1,
675
+ time: 1,
676
+ "datetime-local": 1
677
+ },
678
+ noFocusEvents = {
679
+ focusout: 1,
680
+ blur: 1
681
+ },
682
+ changeEvts = {
683
+ updateInput: 1,
684
+ change: 1
685
+ },
686
+ observe = function(input){
687
+ var timer,
688
+ focusedin = true,
689
+ lastInputVal = input.prop('value'),
690
+ lastChangeVal = lastInputVal,
691
+ trigger = function(e){
692
+ //input === null
693
+ if(!input){return;}
694
+ var newVal = input.prop('value');
695
+
696
+ if(newVal !== lastInputVal){
697
+ lastInputVal = newVal;
698
+ if(!e || !noInputTriggerEvts[e.type]){
699
+ input.trigger('input');
700
+ }
701
+ }
702
+ if(e && changeEvts[e.type]){
703
+ lastChangeVal = newVal;
704
+ }
705
+ if(!focusedin && newVal !== lastChangeVal){
706
+ input.trigger('change');
707
+ }
708
+ },
709
+ extraTimer,
710
+ extraTest = function(){
711
+ clearTimeout(extraTimer);
712
+ extraTimer = setTimeout(trigger, 9);
713
+ },
714
+ unbind = function(e){
715
+ clearInterval(timer);
716
+ setTimeout(function(){
717
+ if(e && noFocusEvents[e.type]){
718
+ focusedin = false;
719
+ }
720
+ if(input){
721
+ input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
722
+ trigger();
723
+ }
724
+ input = null;
725
+ }, 1);
726
+
727
+ }
728
+ ;
729
+
730
+ clearInterval(timer);
731
+ timer = setInterval(trigger, 160);
732
+ extraTest();
733
+ input
734
+ .off({
735
+ 'focusout blur': unbind,
736
+ 'input change updateInput': trigger
737
+ })
738
+ .on({
739
+ 'focusout blur': unbind,
740
+ 'input updateInput change': trigger
741
+ })
742
+ ;
743
+ }
744
+ ;
745
+ if($.event.customEvent){
746
+ $.event.customEvent.updateInput = true;
747
+ }
748
+
749
+ (function(){
750
+
751
+ var correctValue = function(elem){
752
+ var i = 1;
753
+ var len = 3;
754
+ var abort, val;
755
+ if(elem.type == 'date' && (isSubmit || !$(elem).is(':focus'))){
756
+ val = elem.value;
757
+ if(val && val.length < 10 && (val = val.split('-')) && val.length == len){
758
+ for(; i < len; i++){
759
+ if(val[i].length == 1){
760
+ val[i] = '0'+val[i];
761
+ } else if(val[i].length != 2){
762
+ abort = true;
763
+ break;
764
+ }
765
+ }
766
+ if(!abort){
767
+ val = val.join('-');
768
+ $.prop(elem, 'value', val);
769
+ return val;
770
+ }
771
+ }
772
+ }
773
+ };
774
+ var inputCheckValidityDesc, formCheckValidityDesc, inputValueDesc, inputValidityDesc;
775
+
776
+ inputCheckValidityDesc = webshims.defineNodeNameProperty('input', 'checkValidity', {
777
+ prop: {
778
+ value: function(){
779
+ correctValue(this);
780
+ return inputCheckValidityDesc.prop._supvalue.apply(this, arguments);
781
+ }
782
+ }
783
+ });
784
+
785
+ formCheckValidityDesc = webshims.defineNodeNameProperty('form', 'checkValidity', {
786
+ prop: {
787
+ value: function(){
788
+ $('input', this).each(function(){
789
+ correctValue(this);
790
+ });
791
+ return formCheckValidityDesc.prop._supvalue.apply(this, arguments);
792
+ }
793
+ }
794
+ });
795
+
796
+ inputValueDesc = webshims.defineNodeNameProperty('input', 'value', {
797
+ prop: {
798
+ set: function(){
799
+ return inputValueDesc.prop._supset.apply(this, arguments);
800
+ },
801
+ get: function(){
802
+ return correctValue(this) || inputValueDesc.prop._supget.apply(this, arguments);
803
+ }
804
+ }
805
+ });
806
+
807
+ inputValidityDesc = webshims.defineNodeNameProperty('input', 'validity', {
808
+ prop: {
809
+ writeable: false,
810
+ get: function(){
811
+ correctValue(this);
812
+ return inputValidityDesc.prop._supget.apply(this, arguments);
813
+ }
814
+ }
815
+ });
816
+
817
+ $(document).on('change', function(e){
818
+ correctValue(e.target);
819
+ });
820
+
821
+ })();
822
+
823
+ $(document)
824
+ .on('focusin', function(e){
825
+ if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
826
+ observe($(e.target));
827
+ }
828
+ })
829
+ ;
830
+
831
+
832
+ })();
833
+ }
834
+
835
+ webshims.addReady(function(context, contextElem){
836
+ //start constrain-validation
837
+ var focusElem;
838
+ $('form', context)
839
+ .add(contextElem.filter('form'))
840
+ .bind('invalid', $.noop)
841
+ ;
842
+
843
+ try {
844
+ if(context == document && !('form' in (document.activeElement || {}))) {
845
+ focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
846
+ if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
847
+ focusElem.focus();
848
+ }
849
+ }
850
+ }
851
+ catch (er) {}
852
+
853
+ });
854
+
855
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
856
+ (function(){
857
+ (function(prop, undefined){
858
+ $.prop = function(elem, name, value){
859
+ var ret;
860
+ if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
861
+ ret = document.getElementsByName(name);
862
+ if(!ret || !ret.length){
863
+ ret = document.getElementById(name);
864
+ }
865
+ if(ret){
866
+ ret = $(ret).filter(function(){
867
+ return $.prop(this, 'form') == elem;
868
+ }).get();
869
+ if(ret.length){
870
+ return ret.length == 1 ? ret[0] : ret;
871
+ }
872
+ }
873
+ }
874
+ return prop.apply(this, arguments);
875
+ };
876
+ })($.prop, undefined);
877
+ var removeAddedElements = function(form){
878
+ var elements = $.data(form, 'webshimsAddedElements');
879
+ if(elements){
880
+ elements.remove();
881
+ $.removeData(form, 'webshimsAddedElements');
882
+ }
883
+ };
884
+ var rCRLF = /\r?\n/g,
885
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
886
+ rselectTextarea = /^(?:select|textarea)/i;
887
+
888
+ if(!Modernizr.formattribute){
889
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
890
+ prop: {
891
+ get: function(){
892
+ var form = webshims.contentAttr(this, 'form');
893
+ if(form){
894
+ form = document.getElementById(form);
895
+ if(form && !$.nodeName(form, 'form')){
896
+ form = null;
897
+ }
898
+ }
899
+ return form || this.form;
900
+ },
901
+ writeable: false
902
+ }
903
+ });
904
+
905
+
906
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
907
+ prop: {
908
+ get: function(){
909
+ var id = this.id;
910
+ var elements = $.makeArray(this.elements);
911
+ if(id){
912
+ elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
913
+ }
914
+ return elements;
915
+ },
916
+ writeable: false
917
+ }
918
+ });
919
+
920
+
921
+
922
+ $(function(){
923
+ var stopPropagation = function(e){
924
+ e.stopPropagation();
925
+ };
926
+ $(document).on('submit', function(e){
927
+
928
+ if(!e.isDefaultPrevented()){
929
+ var form = e.target;
930
+ var id = form.id;
931
+ var elements;
932
+
933
+
934
+ if(id){
935
+ removeAddedElements(form);
936
+
937
+ elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
938
+ .filter(function(){
939
+ return !this.disabled && this.name && this.form != form;
940
+ })
941
+ .clone()
942
+ ;
943
+ if(elements.length){
944
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
945
+ setTimeout(function(){
946
+ removeAddedElements(form);
947
+ }, 9);
948
+ }
949
+ elements = null;
950
+ }
951
+ }
952
+ });
953
+
954
+ $(document).on('click', function(e){
955
+ if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
956
+ var trueForm = $.prop(e.target, 'form');
957
+ var formIn = e.target.form;
958
+ var clone;
959
+ if(trueForm && trueForm != formIn){
960
+ clone = $(e.target)
961
+ .clone()
962
+ .removeAttr('form')
963
+ .addClass('webshims-visual-hide')
964
+ .on('click', stopPropagation)
965
+ .appendTo(trueForm)
966
+ ;
967
+ if(formIn){
968
+ e.preventDefault();
969
+ }
970
+ addSubmitBubbles(trueForm);
971
+ clone.trigger('click');
972
+ setTimeout(function(){
973
+ clone.remove();
974
+ clone = null;
975
+ }, 9);
976
+ }
977
+ }
978
+ });
979
+ });
980
+ }
981
+
982
+ if(!Modernizr.fieldsetdisabled){
983
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
984
+ prop: {
985
+ get: function(){
986
+ //add listed elements without keygen, object, output
987
+ return $('input, select, textarea, button, fieldset', this).get() || [];
988
+ },
989
+ writeable: false
990
+ }
991
+ });
992
+ }
993
+
994
+ $.fn.serializeArray = function() {
995
+ return this.map(function(){
996
+ var elements = $.prop(this, 'elements');
997
+ return elements ? $.makeArray( elements ) : this;
998
+ })
999
+ .filter(function(){
1000
+ return this.name && !this.disabled &&
1001
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
1002
+ rinput.test( this.type ) );
1003
+ })
1004
+ .map(function( i, elem ){
1005
+ var val = $( this ).val();
1006
+
1007
+ return val == null ?
1008
+ null :
1009
+ $.isArray( val ) ?
1010
+ $.map( val, function( val, i ){
1011
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1012
+ }) :
1013
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
1014
+ }).get();
1015
+ };
1016
+
1017
+ })();
1018
+ }
1019
+
1020
+ try {
1021
+ document.querySelector(':checked');
1022
+ } catch(er){
1023
+ (function(){
1024
+ var checkInputs = {
1025
+ radio: 1,
1026
+ checkbox: 1
1027
+ };
1028
+ var selectChange = function(){
1029
+ var options = this.options || [];
1030
+ var i, len, option;
1031
+ for(i = 0, len = options.length; i < len; i++){
1032
+ option = $(options[i]);
1033
+ option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
1034
+ }
1035
+ };
1036
+ var checkChange = function(){
1037
+ var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
1038
+ var className = this.className || '';
1039
+ var parent;
1040
+
1041
+ //IE8- has problems to update styles, we help
1042
+ if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
1043
+ $(this)[fn]('prop-checked');
1044
+ if((parent = this.parentNode)){
1045
+ parent.className = parent.className;
1046
+ }
1047
+ }
1048
+ };
1049
+
1050
+
1051
+ webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
1052
+ webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
1053
+ webshims.onNodeNamesPropertyModify('option', 'selected', function(){
1054
+ $(this).closest('select').each(selectChange);
1055
+ });
1056
+ webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
1057
+ var type = this.type;
1058
+ if(type == 'radio' && boolVal){
1059
+ webshims.modules["form-core"].getGroupElements(this).each(checkChange);
1060
+ } else if(checkInputs[type]) {
1061
+ $(this).each(checkChange);
1062
+ }
1063
+ });
1064
+
1065
+ $(document).on('change', function(e){
1066
+
1067
+ if(checkInputs[e.target.type]){
1068
+ if(e.target.type == 'radio'){
1069
+ webshims.modules["form-core"].getGroupElements(e.target).each(checkChange);
1070
+ } else {
1071
+ $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
1072
+ }
1073
+ } else if(e.target.nodeName.toLowerCase() == 'select'){
1074
+ $(e.target).each(selectChange);
1075
+ }
1076
+ });
1077
+
1078
+ webshims.addReady(function(context, contextElem){
1079
+ $('option, input', context)
1080
+ .add(contextElem.filter('option, input'))
1081
+ .each(function(){
1082
+ var prop;
1083
+ if(checkInputs[this.type]){
1084
+ prop = 'checked';
1085
+ } else if(this.nodeName.toLowerCase() == 'option'){
1086
+ prop = 'selected';
1087
+ }
1088
+ if(prop){
1089
+ $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
1090
+ }
1091
+
1092
+ })
1093
+ ;
1094
+ });
1095
+ })();
1096
+ }
1097
+
1098
+ (function(){
1099
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
1100
+ var bustedTextarea = $.browser.webkit && Modernizr.textareaPlaceholder && webshims.browserVersion < 535;
1101
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedTextarea){return;}
1102
+
1103
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
1104
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
1105
+ var polyfillElements = ['textarea'];
1106
+ if(!Modernizr.input.placeholder){
1107
+ polyfillElements.push('input');
1108
+ }
1109
+
1110
+ var setSelection = function(elem){
1111
+ try {
1112
+ if(elem.setSelectionRange){
1113
+ elem.setSelectionRange(0, 0);
1114
+ return true;
1115
+ } else if(elem.createTextRange){
1116
+ var range = elem.createTextRange();
1117
+ range.collapse(true);
1118
+ range.moveEnd('character', 0);
1119
+ range.moveStart('character', 0);
1120
+ range.select();
1121
+ return true;
1122
+ }
1123
+ } catch(er){}
1124
+ };
1125
+
1126
+ var hidePlaceholder = function(elem, data, value, _onFocus){
1127
+ if(value === false){
1128
+ value = $.prop(elem, 'value');
1129
+ }
1130
+ if(!isOver && elem.type != 'password'){
1131
+ if(!value && _onFocus && setSelection(elem)){
1132
+ var selectTimer = setTimeout(function(){
1133
+ setSelection(elem);
1134
+ }, 9);
1135
+ $(elem)
1136
+ .off('.placeholderremove')
1137
+ .on({
1138
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1139
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1140
+ elem.value = $.prop(elem, 'value');
1141
+ data.box.removeClass('placeholder-visible');
1142
+ clearTimeout(selectTimer);
1143
+ $(elem).unbind('.placeholderremove');
1144
+ },
1145
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
1146
+ setSelection(elem);
1147
+ clearTimeout(selectTimer);
1148
+ selectTimer = setTimeout(function(){
1149
+ setSelection(elem);
1150
+ }, 9);
1151
+ },
1152
+ 'blur.placeholderremove': function(){
1153
+ clearTimeout(selectTimer);
1154
+ $(elem).unbind('.placeholderremove');
1155
+ }
1156
+ })
1157
+ ;
1158
+ return;
1159
+ }
1160
+ elem.value = value;
1161
+ } else if(!value && _onFocus){
1162
+ $(elem)
1163
+ .off('.placeholderremove')
1164
+ .on({
1165
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
1166
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
1167
+ data.box.removeClass('placeholder-visible');
1168
+ $(elem).unbind('.placeholderremove');
1169
+ },
1170
+ 'blur.placeholderremove': function(){
1171
+ $(elem).unbind('.placeholderremove');
1172
+ }
1173
+ })
1174
+ ;
1175
+ return;
1176
+ }
1177
+ data.box.removeClass('placeholder-visible');
1178
+ },
1179
+ showPlaceholder = function(elem, data, placeholderTxt){
1180
+ if(placeholderTxt === false){
1181
+ placeholderTxt = $.prop(elem, 'placeholder');
1182
+ }
1183
+
1184
+ if(!isOver && elem.type != 'password'){
1185
+ elem.value = placeholderTxt;
1186
+ }
1187
+ data.box.addClass('placeholder-visible');
1188
+ },
1189
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
1190
+ if(!data){
1191
+ data = $.data(elem, 'placeHolder');
1192
+ if(!data){return;}
1193
+ }
1194
+ $(elem).unbind('.placeholderremove');
1195
+ if(type == 'focus' || (!type && $(elem).is(':focus'))){
1196
+ if(elem.type == 'password' || isOver || $(elem).hasClass('placeholder-visible')){
1197
+ hidePlaceholder(elem, data, '', true);
1198
+ }
1199
+ return;
1200
+ }
1201
+ if(value === false){
1202
+ value = $.prop(elem, 'value');
1203
+ }
1204
+ if(value){
1205
+ hidePlaceholder(elem, data, value);
1206
+ return;
1207
+ }
1208
+ if(placeholderTxt === false){
1209
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
1210
+ }
1211
+ if(placeholderTxt && !value){
1212
+ showPlaceholder(elem, data, placeholderTxt);
1213
+ } else {
1214
+ hidePlaceholder(elem, data, value);
1215
+ }
1216
+ },
1217
+ createPlaceholder = function(elem){
1218
+ elem = $(elem);
1219
+ var id = elem.prop('id'),
1220
+ hasLabel = !!(elem.prop('title') || elem.attr('aria-labelledby'))
1221
+ ;
1222
+ if(!hasLabel && id){
1223
+ hasLabel = !!( $('label[for="'+ id +'"]', elem[0].form)[0] );
1224
+ }
1225
+ if(!hasLabel){
1226
+ if(!id){
1227
+ id = $.webshims.getID(elem);
1228
+ }
1229
+ hasLabel = !!($('label #'+ id)[0]);
1230
+ }
1231
+ return $( hasLabel ? '<span class="placeholder-text"></span>' : '<label for="'+ id +'" class="placeholder-text"></label>');
1232
+ },
1233
+ pHolder = (function(){
1234
+ var delReg = /\n|\r|\f|\t/g,
1235
+ allowedPlaceholder = {
1236
+ text: 1,
1237
+ search: 1,
1238
+ url: 1,
1239
+ email: 1,
1240
+ password: 1,
1241
+ tel: 1,
1242
+ number: 1
1243
+ }
1244
+ ;
1245
+
1246
+ return {
1247
+ create: function(elem){
1248
+ var data = $.data(elem, 'placeHolder');
1249
+ var form;
1250
+ var responsiveElem;
1251
+ if(data){return data;}
1252
+ data = $.data(elem, 'placeHolder', {});
1253
+
1254
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
1255
+ changePlaceholderVisibility(this, false, false, data, e.type );
1256
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
1257
+ });
1258
+
1259
+ if((form = $.prop(elem, 'form'))){
1260
+ $(form).on('reset.placeholder', function(e){
1261
+ setTimeout(function(){
1262
+ changePlaceholderVisibility(elem, false, false, data, e.type );
1263
+ }, 0);
1264
+ });
1265
+ }
1266
+
1267
+ if(elem.type == 'password' || isOver){
1268
+ data.text = createPlaceholder(elem);
1269
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
1270
+ responsiveElem = true;
1271
+ data.box = data.text;
1272
+ } else {
1273
+ data.box = $(elem)
1274
+ .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
1275
+ .parent()
1276
+ ;
1277
+ }
1278
+ data.text
1279
+ .insertAfter(elem)
1280
+ .on('mousedown.placeholder', function(){
1281
+ changePlaceholderVisibility(this, false, false, data, 'focus');
1282
+ try {
1283
+ setTimeout(function(){
1284
+ elem.focus();
1285
+ }, 0);
1286
+ } catch(e){}
1287
+ return false;
1288
+ })
1289
+ ;
1290
+
1291
+
1292
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
1293
+ var prop = $.css(elem, style);
1294
+ if(data.text.css(style) != prop){
1295
+ data.text.css(style, prop);
1296
+ }
1297
+ });
1298
+ $.each(['Left', 'Top'], function(i, side){
1299
+ var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0);
1300
+ data.text.css('padding'+ side, size);
1301
+ });
1302
+
1303
+ $(elem)
1304
+ .on('updateshadowdom', function(){
1305
+ var height, width;
1306
+ if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
1307
+ data.text
1308
+ .css({
1309
+ width: width,
1310
+ height: height
1311
+ })
1312
+ .css($(elem).position())
1313
+ ;
1314
+ }
1315
+ })
1316
+ .triggerHandler('updateshadowdom')
1317
+ ;
1318
+
1319
+ } else {
1320
+ var reset = function(e){
1321
+ if($(elem).hasClass('placeholder-visible')){
1322
+ hidePlaceholder(elem, data, '');
1323
+ if(e && e.type == 'submit'){
1324
+ setTimeout(function(){
1325
+ if(e.isDefaultPrevented()){
1326
+ changePlaceholderVisibility(elem, false, false, data );
1327
+ }
1328
+ }, 9);
1329
+ }
1330
+ }
1331
+ };
1332
+
1333
+ $(window).on('beforeunload', reset);
1334
+ data.box = $(elem);
1335
+ if(form){
1336
+ $(form).submit(reset);
1337
+ }
1338
+ }
1339
+
1340
+ return data;
1341
+ },
1342
+ update: function(elem, val){
1343
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
1344
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
1345
+ webshims.error('placeholder not allowed on input[type="'+type+'"]');
1346
+ if(type == 'date'){
1347
+ webshims.error('but you can use data-placeholder for input[type="date"]');
1348
+ }
1349
+ return;
1350
+ }
1351
+
1352
+
1353
+ var data = pHolder.create(elem);
1354
+ if(data.text){
1355
+ data.text.text(val);
1356
+ }
1357
+
1358
+ changePlaceholderVisibility(elem, false, val, data);
1359
+ }
1360
+ };
1361
+ })()
1362
+ ;
1363
+
1364
+ $.webshims.publicMethods = {
1365
+ pHolder: pHolder
1366
+ };
1367
+ polyfillElements.forEach(function(nodeName){
1368
+ var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1369
+ attr: {
1370
+ set: function(val){
1371
+ var elem = this;
1372
+ if(bustedTextarea){
1373
+ webshims.data(elem, 'textareaPlaceholder', val);
1374
+ elem.placeholder = '';
1375
+ } else {
1376
+ webshims.contentAttr(elem, 'placeholder', val);
1377
+ }
1378
+ pHolder.update(elem, val);
1379
+ },
1380
+ get: function(){
1381
+ var ret = (bustedTextarea) ? webshims.data(this, 'textareaPlaceholder') : '';
1382
+ return ret || webshims.contentAttr(this, 'placeholder');
1383
+ }
1384
+ },
1385
+ reflect: true,
1386
+ initAttr: true
1387
+ });
1388
+ });
1389
+
1390
+
1391
+ polyfillElements.forEach(function(name){
1392
+ var placeholderValueDesc = {};
1393
+ var desc;
1394
+ ['attr', 'prop'].forEach(function(propType){
1395
+ placeholderValueDesc[propType] = {
1396
+ set: function(val){
1397
+ var elem = this;
1398
+ var placeholder;
1399
+ if(bustedTextarea){
1400
+ placeholder = webshims.data(elem, 'textareaPlaceholder');
1401
+ }
1402
+ if(!placeholder){
1403
+ placeholder = webshims.contentAttr(elem, 'placeholder');
1404
+ }
1405
+ $.removeData(elem, 'cachedValidity');
1406
+ var ret = desc[propType]._supset.call(elem, val);
1407
+ if(placeholder && 'value' in elem){
1408
+ changePlaceholderVisibility(elem, val, placeholder);
1409
+ }
1410
+ return ret;
1411
+ },
1412
+ get: function(){
1413
+ var elem = this;
1414
+ return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
1415
+ }
1416
+ };
1417
+ });
1418
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1419
+ });
1420
+
1421
+ })();
1422
+
1423
+ (function(){
1424
+ var doc = document;
1425
+ if( 'value' in document.createElement('output') ){return;}
1426
+
1427
+ webshims.defineNodeNameProperty('output', 'value', {
1428
+ prop: {
1429
+ set: function(value){
1430
+ var setVal = $.data(this, 'outputShim');
1431
+ if(!setVal){
1432
+ setVal = outputCreate(this);
1433
+ }
1434
+ setVal(value);
1435
+ },
1436
+ get: function(){
1437
+ return webshims.contentAttr(this, 'value') || $(this).text() || '';
1438
+ }
1439
+ }
1440
+ });
1441
+
1442
+
1443
+ webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1444
+ if(type == 'removeAttr'){return;}
1445
+ var setVal = $.data(this, 'outputShim');
1446
+ if(setVal){
1447
+ setVal(value);
1448
+ }
1449
+ });
1450
+
1451
+ var outputCreate = function(elem){
1452
+ if(elem.getAttribute('aria-live')){return;}
1453
+ elem = $(elem);
1454
+ var value = (elem.text() || '').trim();
1455
+ var id = elem.attr('id');
1456
+ var htmlFor = elem.attr('for');
1457
+ var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1458
+ var form = shim[0].form || doc;
1459
+ var setValue = function(val){
1460
+ shim[0].value = val;
1461
+ val = shim[0].value;
1462
+ elem.text(val);
1463
+ webshims.contentAttr(elem[0], 'value', val);
1464
+ };
1465
+
1466
+ elem[0].defaultValue = value;
1467
+ webshims.contentAttr(elem[0], 'value', value);
1468
+
1469
+ elem.attr({'aria-live': 'polite'});
1470
+ if(id){
1471
+ shim.attr('id', id);
1472
+ elem.attr('aria-labelledby', webshims.getID($('label[for="'+id+'"]', form)));
1473
+ }
1474
+ if(htmlFor){
1475
+ id = webshims.getID(elem);
1476
+ htmlFor.split(' ').forEach(function(control){
1477
+ control = document.getElementById(control);
1478
+ if(control){
1479
+ control.setAttribute('aria-controls', id);
1480
+ }
1481
+ });
1482
+ }
1483
+ elem.data('outputShim', setValue );
1484
+ shim.data('outputShim', setValue );
1485
+ return setValue;
1486
+ };
1487
+
1488
+ webshims.addReady(function(context, contextElem){
1489
+ $('output', context).add(contextElem.filter('output')).each(function(){
1490
+ outputCreate(this);
1491
+ });
1492
+ });
1493
+
1494
+ /*
1495
+ * Implements input event in all browsers
1496
+ */
1497
+ (function(){
1498
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
1499
+ noInputTypes = {
1500
+ radio: 1,
1501
+ checkbox: 1,
1502
+ submit: 1,
1503
+ button: 1,
1504
+ image: 1,
1505
+ reset: 1,
1506
+ file: 1
1507
+
1508
+ //pro forma
1509
+ ,color: 1
1510
+ //,range: 1
1511
+ },
1512
+ observe = function(input){
1513
+ var timer,
1514
+ lastVal = input.prop('value'),
1515
+ trigger = function(e){
1516
+ //input === null
1517
+ if(!input){return;}
1518
+ var newVal = input.prop('value');
1519
+
1520
+ if(newVal !== lastVal){
1521
+ lastVal = newVal;
1522
+ if(!e || !noInputTriggerEvts[e.type]){
1523
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1524
+ }
1525
+ }
1526
+ },
1527
+ extraTimer,
1528
+ extraTest = function(){
1529
+ clearTimeout(extraTimer);
1530
+ extraTimer = setTimeout(trigger, 9);
1531
+ },
1532
+ unbind = function(){
1533
+ input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1534
+ clearInterval(timer);
1535
+ setTimeout(function(){
1536
+ trigger();
1537
+ input = null;
1538
+ }, 1);
1539
+
1540
+ }
1541
+ ;
1542
+
1543
+ clearInterval(timer);
1544
+ timer = setInterval(trigger, 99);
1545
+ extraTest();
1546
+ input.on({
1547
+ 'keyup keypress keydown paste cut': extraTest,
1548
+ focusout: unbind,
1549
+ 'input updateInput change': trigger
1550
+ });
1551
+ }
1552
+ ;
1553
+ if($.event.customEvent){
1554
+ $.event.customEvent.updateInput = true;
1555
+ }
1556
+
1557
+ $(doc)
1558
+ .on('focusin', function(e){
1559
+ if( e.target && e.target.type && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] ){
1560
+ observe($(e.target));
1561
+ }
1562
+ })
1563
+ ;
1564
+ })();
1565
+ })();
1566
+
1567
+ }); //webshims.ready end
1568
+ }//end formvalidation
1569
+
1570
+ jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){
1571
+ "use strict";
1572
+ var validityMessages = webshims.validityMessages;
1573
+
1574
+ var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : [];
1575
+
1576
+ validityMessages['en'] = $.extend(true, {
1577
+ typeMismatch: {
1578
+ email: 'Please enter an email address.',
1579
+ url: 'Please enter a URL.',
1580
+ number: 'Please enter a number.',
1581
+ date: 'Please enter a date.',
1582
+ time: 'Please enter a time.',
1583
+ range: 'Invalid input.',
1584
+ "datetime-local": 'Please enter a datetime.'
1585
+ },
1586
+ rangeUnderflow: {
1587
+ defaultMessage: 'Value must be greater than or equal to {%min}.'
1588
+ },
1589
+ rangeOverflow: {
1590
+ defaultMessage: 'Value must be less than or equal to {%max}.'
1591
+ },
1592
+ stepMismatch: 'Invalid input.',
1593
+ tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.',
1594
+
1595
+ patternMismatch: 'Invalid input. {%title}',
1596
+ valueMissing: {
1597
+ defaultMessage: 'Please fill out this field.',
1598
+ checkbox: 'Please check this box if you want to proceed.'
1599
+ }
1600
+ }, (validityMessages['en'] || validityMessages['en-US'] || {}));
1601
+
1602
+
1603
+ ['select', 'radio'].forEach(function(type){
1604
+ validityMessages['en'].valueMissing[type] = 'Please select an option.';
1605
+ });
1606
+
1607
+ ['date', 'time', 'datetime-local'].forEach(function(type){
1608
+ validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.';
1609
+ });
1610
+ ['date', 'time', 'datetime-local'].forEach(function(type){
1611
+ validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.';
1612
+ });
1613
+
1614
+ validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en'];
1615
+ validityMessages[''] = validityMessages[''] || validityMessages['en-US'];
1616
+
1617
+ validityMessages['de'] = $.extend(true, {
1618
+ typeMismatch: {
1619
+ email: '{%value} ist keine zulässige E-Mail-Adresse',
1620
+ url: '{%value} ist keine zulässige Webadresse',
1621
+ number: '{%value} ist keine Nummer!',
1622
+ date: '{%value} ist kein Datum',
1623
+ time: '{%value} ist keine Uhrzeit',
1624
+ range: '{%value} ist keine Nummer!',
1625
+ "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.'
1626
+ },
1627
+ rangeUnderflow: {
1628
+ defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.'
1629
+ },
1630
+ rangeOverflow: {
1631
+ defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.'
1632
+ },
1633
+ stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}',
1634
+ tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.',
1635
+ patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}',
1636
+ valueMissing: {
1637
+ defaultMessage: 'Bitte geben Sie einen Wert ein',
1638
+ checkbox: 'Bitte aktivieren Sie das Kästchen'
1639
+ }
1640
+ }, (validityMessages['de'] || {}));
1641
+
1642
+ ['select', 'radio'].forEach(function(type){
1643
+ validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus';
1644
+ });
1645
+
1646
+ ['date', 'time', 'datetime-local'].forEach(function(type){
1647
+ validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.';
1648
+ });
1649
+ ['date', 'time', 'datetime-local'].forEach(function(type){
1650
+ validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.';
1651
+ });
1652
+
1653
+ var currentValidationMessage = validityMessages[''];
1654
+
1655
+
1656
+ webshims.createValidationMessage = function(elem, name){
1657
+ var message = currentValidationMessage[name];
1658
+ if(message && typeof message !== 'string'){
1659
+ message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ];
1660
+ }
1661
+ if(message){
1662
+ ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){
1663
+ if(message.indexOf('{%'+attr) === -1){return;}
1664
+ var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || '';
1665
+ if(name == 'patternMismatch' && attr == 'title' && !val){
1666
+ webshims.error('no title for patternMismatch provided. Always add a title attribute.');
1667
+ }
1668
+ message = message.replace('{%'+ attr +'}', val);
1669
+ if('value' == attr){
1670
+ message = message.replace('{%valueLen}', val.length);
1671
+ }
1672
+ });
1673
+ }
1674
+ return message || '';
1675
+ };
1676
+
1677
+
1678
+ if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){
1679
+ implementProperties.push('validationMessage');
1680
+ }
1681
+
1682
+ webshims.activeLang({
1683
+ langObj: validityMessages,
1684
+ module: 'form-core',
1685
+ callback: function(langObj){
1686
+ currentValidationMessage = langObj;
1687
+ }
1688
+ });
1689
+
1690
+ implementProperties.forEach(function(messageProp){
1691
+ webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, {
1692
+ prop: {
1693
+ value: '',
1694
+ writeable: false
1695
+ }
1696
+ });
1697
+ ['input', 'select', 'textarea'].forEach(function(nodeName){
1698
+ var desc = webshims.defineNodeNameProperty(nodeName, messageProp, {
1699
+ prop: {
1700
+ get: function(){
1701
+ var elem = this;
1702
+ var message = '';
1703
+ if(!$.prop(elem, 'willValidate')){
1704
+ return message;
1705
+ }
1706
+
1707
+ var validity = $.prop(elem, 'validity') || {valid: 1};
1708
+
1709
+ if(validity.valid){return message;}
1710
+ message = webshims.getContentValidationMessage(elem, validity);
1711
+
1712
+ if(message){return message;}
1713
+
1714
+ if(validity.customError && elem.nodeName){
1715
+ message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage');
1716
+ if(message){return message;}
1717
+ }
1718
+ $.each(validity, function(name, prop){
1719
+ if(name == 'valid' || !prop){return;}
1720
+
1721
+ message = webshims.createValidationMessage(elem, name);
1722
+ if(message){
1723
+ return false;
1724
+ }
1725
+ });
1726
+ return message || '';
1727
+ },
1728
+ writeable: false
1729
+ }
1730
+ });
1731
+ });
1732
+
1733
+ });
1734
+ });
1735
+ (function($, Modernizr, webshims){
1736
+ "use strict";
1737
+ var hasNative = Modernizr.audio && Modernizr.video;
1738
+ var supportsLoop = false;
1739
+ var bugs = webshims.bugs;
1740
+
1741
+ var loadSwf = function(){
1742
+ webshims.ready(swfType, function(){
1743
+ if(!webshims.mediaelement.createSWF){
1744
+ webshims.mediaelement.loadSwf = true;
1745
+ webshims.reTest([swfType], hasNative);
1746
+ }
1747
+ });
1748
+ };
1749
+ var options = webshims.cfg.mediaelement;
1750
+ var swfType = options && options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris';
1751
+ var hasSwf;
1752
+ if(!options){
1753
+ webshims.error("mediaelement wasn't implemented but loaded");
1754
+ return;
1755
+ }
1756
+ if(hasNative){
1757
+ var videoElem = document.createElement('video');
1758
+ Modernizr.videoBuffered = ('buffered' in videoElem);
1759
+ supportsLoop = ('loop' in videoElem);
1760
+
1761
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
1762
+
1763
+ if(!Modernizr.videoBuffered){
1764
+ webshims.addPolyfill('mediaelement-native-fix', {
1765
+ f: 'mediaelement',
1766
+ test: Modernizr.videoBuffered,
1767
+ d: ['dom-support']
1768
+ });
1769
+
1770
+ webshims.reTest('mediaelement-native-fix');
1771
+ }
1772
+ }
1773
+
1774
+ if(hasNative && !options.preferFlash){
1775
+ var switchOptions = function(e){
1776
+ var parent = e.target.parentNode;
1777
+ if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){
1778
+ webshims.ready('DOM mediaelement', function(){
1779
+ if(hasSwf){
1780
+ loadSwf();
1781
+ }
1782
+ webshims.ready('WINDOWLOAD '+swfType, function(){
1783
+ setTimeout(function(){
1784
+ if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){
1785
+ options.preferFlash = true;
1786
+ document.removeEventListener('error', switchOptions, true);
1787
+ $('audio, video').mediaLoad();
1788
+ webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src);
1789
+ } else if(!hasSwf){
1790
+ document.removeEventListener('error', switchOptions, true);
1791
+ }
1792
+ }, 20);
1793
+ });
1794
+ });
1795
+ }
1796
+ };
1797
+ document.addEventListener('error', switchOptions, true);
1798
+ $('audio, video').each(function(){
1799
+ if(this.error){
1800
+ switchOptions({target: this});
1801
+ }
1802
+ });
1803
+ }
1804
+
1805
+
1806
+ if(Modernizr.track && !bugs.track){
1807
+ (function(){
1808
+
1809
+ if(!bugs.track){
1810
+ bugs.track = typeof $('<track />')[0].readyState != 'number';
1811
+ }
1812
+
1813
+ if(!bugs.track){
1814
+ try {
1815
+ new TextTrackCue(2, 3, '');
1816
+ } catch(e){
1817
+ bugs.track = true;
1818
+ }
1819
+ }
1820
+
1821
+ var trackOptions = webshims.cfg.track;
1822
+ var trackListener = function(e){
1823
+ $(e.target).filter('track').each(changeApi);
1824
+ };
1825
+ var changeApi = function(){
1826
+ if(bugs.track || (!trackOptions.override && $.prop(this, 'readyState') == 3)){
1827
+ trackOptions.override = true;
1828
+ webshims.reTest('track');
1829
+ document.removeEventListener('error', trackListener, true);
1830
+ if(this && $.nodeName(this, 'track')){
1831
+ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type");
1832
+ } else {
1833
+ webshims.info("track support was overwritten. due to bad browser support");
1834
+ }
1835
+ }
1836
+ };
1837
+ var detectTrackError = function(){
1838
+ document.addEventListener('error', trackListener, true);
1839
+
1840
+ if(bugs.track){
1841
+ changeApi();
1842
+ } else {
1843
+ $('track').each(changeApi);
1844
+ }
1845
+ };
1846
+ if(!trackOptions.override){
1847
+ if(webshims.isReady('track')){
1848
+ detectTrackError();
1849
+ } else {
1850
+ $(detectTrackError);
1851
+ }
1852
+ }
1853
+ })();
1854
+
1855
+ }
1856
+
1857
+ webshims.register('mediaelement-core', function($, webshims, window, document, undefined){
1858
+ hasSwf = swfobject.hasFlashPlayerVersion('9.0.115');
1859
+ $('html').addClass(hasSwf ? 'swf' : 'no-swf');
1860
+ var mediaelement = webshims.mediaelement;
1861
+ mediaelement.parseRtmp = function(data){
1862
+ var src = data.src.split('://');
1863
+ var paths = src[1].split('/');
1864
+ var i, len, found;
1865
+ data.server = src[0]+'://'+paths[0]+'/';
1866
+ data.streamId = [];
1867
+ for(i = 1, len = paths.length; i < len; i++){
1868
+ if(!found && paths[i].indexOf(':') !== -1){
1869
+ paths[i] = paths[i].split(':')[1];
1870
+ found = true;
1871
+ }
1872
+ if(!found){
1873
+ data.server += paths[i]+'/';
1874
+ } else {
1875
+ data.streamId.push(paths[i]);
1876
+ }
1877
+ }
1878
+ if(!data.streamId.length){
1879
+ webshims.error('Could not parse rtmp url');
1880
+ }
1881
+ data.streamId = data.streamId.join('/');
1882
+ console.log(data)
1883
+ };
1884
+ var getSrcObj = function(elem, nodeName){
1885
+ elem = $(elem);
1886
+ var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
1887
+ var tmp;
1888
+
1889
+ if(!src.src){return src;}
1890
+
1891
+ tmp = elem.attr('data-server');
1892
+ if(tmp != null){
1893
+ src.server = tmp;
1894
+ }
1895
+
1896
+ tmp = elem.attr('type');
1897
+ if(tmp){
1898
+ src.type = tmp;
1899
+ src.container = $.trim(tmp.split(';')[0]);
1900
+ } else {
1901
+ if(!nodeName){
1902
+ nodeName = elem[0].nodeName.toLowerCase();
1903
+ if(nodeName == 'source'){
1904
+ nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
1905
+ }
1906
+ }
1907
+ if(src.server){
1908
+ src.type = nodeName+'/rtmp';
1909
+ src.container = nodeName+'/rtmp';
1910
+ } else {
1911
+
1912
+ tmp = mediaelement.getTypeForSrc( src.src, nodeName, src );
1913
+
1914
+ if(tmp){
1915
+ src.type = tmp;
1916
+ src.container = tmp;
1917
+ }
1918
+ }
1919
+ }
1920
+ tmp = elem.attr('media');
1921
+ if(tmp){
1922
+ src.media = tmp;
1923
+ }
1924
+ if(src.type == 'audio/rtmp' || src.type == 'video/rtmp'){
1925
+ if(src.server){
1926
+ src.streamId = src.src;
1927
+ } else {
1928
+ mediaelement.parseRtmp(src);
1929
+ }
1930
+ }
1931
+ return src;
1932
+ };
1933
+
1934
+
1935
+
1936
+ var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
1937
+
1938
+ var loadTrackUi = function(){
1939
+ if(loadTrackUi.loaded){return;}
1940
+ loadTrackUi.loaded = true;
1941
+ $(function(){
1942
+ webshims.loader.loadList(['track-ui']);
1943
+ });
1944
+ };
1945
+ var loadYt = (function(){
1946
+ var loaded;
1947
+ return function(){
1948
+ if(loaded || !hasYt){return;}
1949
+ loaded = true;
1950
+ webshims.loader.loadScript("https://www.youtube.com/player_api");
1951
+ $(function(){
1952
+ webshims.polyfill("mediaelement-yt");
1953
+ });
1954
+ };
1955
+ })();
1956
+ var loadThird = function(){
1957
+ if(hasSwf){
1958
+ loadSwf();
1959
+ } else {
1960
+ loadYt();
1961
+ }
1962
+ };
1963
+
1964
+ webshims.addPolyfill('mediaelement-yt', {
1965
+ test: !hasYt,
1966
+ d: ['dom-support']
1967
+ });
1968
+
1969
+ mediaelement.mimeTypes = {
1970
+ audio: {
1971
+ //ogm shouldn´t be used!
1972
+ 'audio/ogg': ['ogg','oga', 'ogm'],
1973
+ 'audio/ogg;codecs="opus"': 'opus',
1974
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
1975
+ 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
1976
+ 'audio/wav': ['wav'],
1977
+ 'audio/3gpp': ['3gp','3gpp'],
1978
+ 'audio/webm': ['webm'],
1979
+ 'audio/fla': ['flv', 'f4a', 'fla'],
1980
+ 'application/x-mpegURL': ['m3u8', 'm3u']
1981
+ },
1982
+ video: {
1983
+ //ogm shouldn´t be used!
1984
+ 'video/ogg': ['ogg','ogv', 'ogm'],
1985
+ 'video/mpeg': ['mpg','mpeg','mpe'],
1986
+ 'video/mp4': ['mp4','mpg4', 'm4v'],
1987
+ 'video/quicktime': ['mov','qt'],
1988
+ 'video/x-msvideo': ['avi'],
1989
+ 'video/x-ms-asf': ['asf', 'asx'],
1990
+ 'video/flv': ['flv', 'f4v'],
1991
+ 'video/3gpp': ['3gp','3gpp'],
1992
+ 'video/webm': ['webm'],
1993
+ 'application/x-mpegURL': ['m3u8', 'm3u'],
1994
+ 'video/MP2T': ['ts']
1995
+ }
1996
+ }
1997
+ ;
1998
+
1999
+ mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
2000
+
2001
+ mediaelement.getTypeForSrc = function(src, nodeName, data){
2002
+ if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
2003
+ return 'video/youtube';
2004
+ }
2005
+ if(src.indexOf('rtmp') === 0){
2006
+ return nodeName+'/rtmp';
2007
+ }
2008
+ src = src.split('?')[0].split('.');
2009
+ src = src[src.length - 1];
2010
+ var mt;
2011
+
2012
+ $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
2013
+ if(exts.indexOf(src) !== -1){
2014
+ mt = mimeType;
2015
+ return false;
2016
+ }
2017
+ });
2018
+ return mt;
2019
+ };
2020
+
2021
+
2022
+ mediaelement.srces = function(mediaElem, srces){
2023
+ mediaElem = $(mediaElem);
2024
+ if(!srces){
2025
+ srces = [];
2026
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
2027
+ var src = getSrcObj(mediaElem, nodeName);
2028
+
2029
+ if(!src.src){
2030
+
2031
+ $('source', mediaElem).each(function(){
2032
+ src = getSrcObj(this, nodeName);
2033
+ if(src.src){srces.push(src);}
2034
+ });
2035
+ } else {
2036
+ srces.push(src);
2037
+ }
2038
+ return srces;
2039
+ } else {
2040
+ mediaElem.removeAttr('src').removeAttr('type').find('source').remove();
2041
+ if(!$.isArray(srces)){
2042
+ srces = [srces];
2043
+ }
2044
+ srces.forEach(function(src){
2045
+ var source = document.createElement('source');
2046
+ if(typeof src == 'string'){
2047
+ src = {src: src};
2048
+ }
2049
+ source.setAttribute('src', src.src);
2050
+ if(src.type){
2051
+ source.setAttribute('type', src.type);
2052
+ }
2053
+ if(src.media){
2054
+ source.setAttribute('media', src.media);
2055
+ }
2056
+ mediaElem.append(source);
2057
+ });
2058
+
2059
+ }
2060
+ };
2061
+
2062
+
2063
+ $.fn.loadMediaSrc = function(srces, poster){
2064
+ return this.each(function(){
2065
+ if(poster !== undefined){
2066
+ $(this).removeAttr('poster');
2067
+ if(poster){
2068
+ $.attr(this, 'poster', poster);
2069
+ }
2070
+ }
2071
+ mediaelement.srces(this, srces);
2072
+ $(this).mediaLoad();
2073
+ });
2074
+ };
2075
+
2076
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'jwplayer/jwplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
2077
+
2078
+ mediaelement.canThirdPlaySrces = function(mediaElem, srces){
2079
+ var ret = '';
2080
+ if(hasSwf || hasYt){
2081
+ mediaElem = $(mediaElem);
2082
+ srces = srces || mediaelement.srces(mediaElem);
2083
+ $.each(srces, function(i, src){
2084
+ if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
2085
+ ret = src;
2086
+ return false;
2087
+ }
2088
+ });
2089
+
2090
+ }
2091
+
2092
+ return ret;
2093
+ };
2094
+
2095
+ var nativeCanPlayType = {};
2096
+ mediaelement.canNativePlaySrces = function(mediaElem, srces){
2097
+ var ret = '';
2098
+ if(hasNative){
2099
+ mediaElem = $(mediaElem);
2100
+ var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
2101
+ if(!nativeCanPlayType[nodeName]){return ret;}
2102
+ srces = srces || mediaelement.srces(mediaElem);
2103
+
2104
+ $.each(srces, function(i, src){
2105
+ if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){
2106
+ ret = src;
2107
+ return false;
2108
+ }
2109
+ });
2110
+ }
2111
+ return ret;
2112
+ };
2113
+
2114
+ mediaelement.setError = function(elem, message){
2115
+ if(!message){
2116
+ message = "can't play sources";
2117
+ }
2118
+
2119
+ $(elem).pause().data('mediaerror', message);
2120
+ webshims.warn('mediaelementError: '+ message);
2121
+ setTimeout(function(){
2122
+ if($(elem).data('mediaerror')){
2123
+ $(elem).trigger('mediaerror');
2124
+ }
2125
+ }, 1);
2126
+ };
2127
+
2128
+ var handleThird = (function(){
2129
+ var requested;
2130
+ return function( mediaElem, ret, data ){
2131
+ if(!requested){
2132
+ loadTrackUi();
2133
+ }
2134
+ webshims.ready(hasSwf ? swfType : 'mediaelement-yt', function(){
2135
+ if(mediaelement.createSWF){
2136
+ mediaelement.createSWF( mediaElem, ret, data );
2137
+ } else if(!requested) {
2138
+ requested = true;
2139
+ loadThird();
2140
+ //readd to ready
2141
+ handleThird( mediaElem, ret, data );
2142
+ }
2143
+ });
2144
+ if(!requested && hasYt && !mediaelement.createSWF){
2145
+ loadYt();
2146
+ }
2147
+ };
2148
+ })();
2149
+
2150
+ var stepSources = function(elem, data, useSwf, _srces, _noLoop){
2151
+ var ret;
2152
+ if(useSwf || (useSwf !== false && data && data.isActive == 'third')){
2153
+ ret = mediaelement.canThirdPlaySrces(elem, _srces);
2154
+ if(!ret){
2155
+ if(_noLoop){
2156
+ mediaelement.setError(elem, false);
2157
+ } else {
2158
+ stepSources(elem, data, false, _srces, true);
2159
+ }
2160
+ } else {
2161
+ handleThird(elem, ret, data);
2162
+ }
2163
+ } else {
2164
+ ret = mediaelement.canNativePlaySrces(elem, _srces);
2165
+ if(!ret){
2166
+ if(_noLoop){
2167
+ mediaelement.setError(elem, false);
2168
+ if(data && data.isActive == 'third') {
2169
+ mediaelement.setActive(elem, 'html5', data);
2170
+ }
2171
+ } else {
2172
+ stepSources(elem, data, true, _srces, true);
2173
+ }
2174
+ } else if(data && data.isActive == 'third') {
2175
+ mediaelement.setActive(elem, 'html5', data);
2176
+ }
2177
+ }
2178
+ };
2179
+ var stopParent = /^(?:embed|object|datalist)$/i;
2180
+ var selectSource = function(elem, data){
2181
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2182
+ var _srces = mediaelement.srces(elem);
2183
+ var parent = elem.parentNode;
2184
+
2185
+ clearTimeout(baseData.loadTimer);
2186
+ $.data(elem, 'mediaerror', false);
2187
+
2188
+ if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
2189
+ data = data || webshims.data(elem, 'mediaelement');
2190
+ stepSources(elem, data, options.preferFlash || undefined, _srces);
2191
+ };
2192
+
2193
+
2194
+ $(document).on('ended', function(e){
2195
+ var data = webshims.data(e.target, 'mediaelement');
2196
+ if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
2197
+ setTimeout(function(){
2198
+ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
2199
+ $(e.target).prop('currentTime', 0).play();
2200
+ }, 1);
2201
+
2202
+ });
2203
+ if(!supportsLoop){
2204
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
2205
+ }
2206
+
2207
+ ['audio', 'video'].forEach(function(nodeName){
2208
+ var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
2209
+ prop: {
2210
+ value: function(){
2211
+ var data = webshims.data(this, 'mediaelement');
2212
+ selectSource(this, data);
2213
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
2214
+ supLoad.prop._supvalue.apply(this, arguments);
2215
+ }
2216
+ }
2217
+ }
2218
+ });
2219
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
2220
+ prop: {
2221
+ value: function(type){
2222
+ var ret = '';
2223
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
2224
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
2225
+ if(ret == 'no'){
2226
+ ret = '';
2227
+ }
2228
+ }
2229
+ if(!ret && hasSwf){
2230
+ type = $.trim((type || '').split(';')[0]);
2231
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
2232
+ ret = 'maybe';
2233
+ }
2234
+ }
2235
+ return ret;
2236
+ }
2237
+ }
2238
+ });
2239
+ });
2240
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
2241
+ set: function(){
2242
+ var elem = this;
2243
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
2244
+ clearTimeout(baseData.loadTimer);
2245
+ baseData.loadTimer = setTimeout(function(){
2246
+ selectSource(elem);
2247
+ elem = null;
2248
+ }, 9);
2249
+ }
2250
+ });
2251
+
2252
+ var initMediaElements = function(){
2253
+
2254
+ webshims.addReady(function(context, insertedElement){
2255
+ var media = $('video, audio', context)
2256
+ .add(insertedElement.filter('video, audio'))
2257
+ .each(function(){
2258
+ if($.browser.msie && webshims.browserVersion > 8 && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])')){
2259
+ $(this).prop('preload', 'metadata').mediaLoad();
2260
+ } else {
2261
+ selectSource(this);
2262
+ }
2263
+
2264
+
2265
+
2266
+ if(hasNative){
2267
+ var bufferTimer;
2268
+ var lastBuffered;
2269
+ var elem = this;
2270
+ var getBufferedString = function(){
2271
+ var buffered = $.prop(elem, 'buffered');
2272
+ if(!buffered){return;}
2273
+ var bufferString = "";
2274
+ for(var i = 0, len = buffered.length; i < len;i++){
2275
+ bufferString += buffered.end(i);
2276
+ }
2277
+ return bufferString;
2278
+ };
2279
+ var testBuffer = function(){
2280
+ var buffered = getBufferedString();
2281
+ if(buffered != lastBuffered){
2282
+ lastBuffered = buffered;
2283
+ $(elem).triggerHandler('progress');
2284
+ }
2285
+ };
2286
+
2287
+ $(this)
2288
+ .on({
2289
+ 'play loadstart progress': function(e){
2290
+ if(e.type == 'progress'){
2291
+ lastBuffered = getBufferedString();
2292
+ }
2293
+ clearTimeout(bufferTimer);
2294
+ bufferTimer = setTimeout(testBuffer, 999);
2295
+ },
2296
+ 'emptied stalled mediaerror abort suspend': function(e){
2297
+ if(e.type == 'emptied'){
2298
+ lastBuffered = false;
2299
+ }
2300
+ clearTimeout(bufferTimer);
2301
+ }
2302
+ })
2303
+ ;
2304
+ }
2305
+
2306
+ })
2307
+ ;
2308
+ if(!loadTrackUi.loaded && $('track', media).length){
2309
+ loadTrackUi();
2310
+ }
2311
+ media = null;
2312
+ });
2313
+ };
2314
+
2315
+ if(Modernizr.track && !bugs.track){
2316
+ webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', {
2317
+ get: function(){
2318
+ return this._shimActiveCues || this.activeCues;
2319
+ }
2320
+ });
2321
+ }
2322
+ //set native implementation ready, before swf api is retested
2323
+ if(hasNative){
2324
+ webshims.isReady('mediaelement-core', true);
2325
+ initMediaElements();
2326
+ webshims.ready('WINDOWLOAD mediaelement', loadThird);
2327
+ } else {
2328
+ webshims.ready(swfType, initMediaElements);
2329
+ }
2330
+ webshims.ready('WINDOWLOAD mediaelement', loadTrackUi);
2331
+ });
2332
+ })(jQuery, Modernizr, jQuery.webshims);