webshims-rails 0.4.3 → 0.4.4

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