webshims-rails 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/lib/webshims-rails.rb +1 -1
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/readme.textile +5 -3
  4. data/vendor/assets/javascripts/webshims/dev/extras/custom-validity.js +261 -0
  5. data/vendor/assets/javascripts/webshims/dev/extras/modernizr-custom.js +535 -0
  6. data/vendor/assets/javascripts/webshims/dev/extras/mousepress.js +60 -0
  7. data/vendor/assets/javascripts/webshims/dev/polyfiller.js +1171 -0
  8. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/README +62 -0
  9. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/canvas2png.js +42 -0
  10. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.js +28 -0
  11. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/proxy.php +73 -0
  13. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvas/save.php +49 -0
  14. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/README +82 -0
  15. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/canvas2png.js +42 -0
  16. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  18. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/flashcanvas.js +31 -0
  19. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/proxy.php +73 -0
  20. data/vendor/assets/javascripts/webshims/dev/shims/FlashCanvasPro/save.php +49 -0
  21. data/vendor/assets/javascripts/webshims/dev/shims/combos/1.js +1710 -0
  22. data/vendor/assets/javascripts/webshims/dev/shims/combos/10.js +3317 -0
  23. data/vendor/assets/javascripts/webshims/dev/shims/combos/11.js +1585 -0
  24. data/vendor/assets/javascripts/webshims/dev/shims/combos/12.js +1587 -0
  25. data/vendor/assets/javascripts/webshims/dev/shims/combos/13.js +1054 -0
  26. data/vendor/assets/javascripts/webshims/dev/shims/combos/14.js +476 -0
  27. data/vendor/assets/javascripts/webshims/dev/shims/combos/15.js +314 -0
  28. data/vendor/assets/javascripts/webshims/dev/shims/combos/16.js +2101 -0
  29. data/vendor/assets/javascripts/webshims/dev/shims/combos/17.js +2264 -0
  30. data/vendor/assets/javascripts/webshims/dev/shims/combos/18.js +2161 -0
  31. data/vendor/assets/javascripts/webshims/dev/shims/combos/19.js +2244 -0
  32. data/vendor/assets/javascripts/webshims/dev/shims/combos/2.js +2294 -0
  33. data/vendor/assets/javascripts/webshims/dev/shims/combos/20.js +1607 -0
  34. data/vendor/assets/javascripts/webshims/dev/shims/combos/21.js +1635 -0
  35. data/vendor/assets/javascripts/webshims/dev/shims/combos/22.js +2409 -0
  36. data/vendor/assets/javascripts/webshims/dev/shims/combos/23.js +2168 -0
  37. data/vendor/assets/javascripts/webshims/dev/shims/combos/24.js +2777 -0
  38. data/vendor/assets/javascripts/webshims/dev/shims/combos/25.js +2204 -0
  39. data/vendor/assets/javascripts/webshims/dev/shims/combos/26.js +2863 -0
  40. data/vendor/assets/javascripts/webshims/dev/shims/combos/27.js +4079 -0
  41. data/vendor/assets/javascripts/webshims/dev/shims/combos/3.js +2971 -0
  42. data/vendor/assets/javascripts/webshims/dev/shims/combos/4.js +823 -0
  43. data/vendor/assets/javascripts/webshims/dev/shims/combos/5.js +1078 -0
  44. data/vendor/assets/javascripts/webshims/dev/shims/combos/59.js +1754 -0
  45. data/vendor/assets/javascripts/webshims/dev/shims/combos/6.js +1230 -0
  46. data/vendor/assets/javascripts/webshims/dev/shims/combos/7.js +1485 -0
  47. data/vendor/assets/javascripts/webshims/dev/shims/combos/8.js +1442 -0
  48. data/vendor/assets/javascripts/webshims/dev/shims/combos/9.js +2515 -0
  49. data/vendor/assets/javascripts/webshims/dev/shims/details.js +146 -0
  50. data/vendor/assets/javascripts/webshims/dev/shims/dom-extend.js +908 -0
  51. data/vendor/assets/javascripts/webshims/dev/shims/es5.js +802 -0
  52. data/vendor/assets/javascripts/webshims/dev/shims/excanvas.js +924 -0
  53. data/vendor/assets/javascripts/webshims/dev/shims/form-core.js +660 -0
  54. data/vendor/assets/javascripts/webshims/dev/shims/form-datalist.js +677 -0
  55. data/vendor/assets/javascripts/webshims/dev/shims/form-message.js +164 -0
  56. data/vendor/assets/javascripts/webshims/dev/shims/form-native-extend.js +256 -0
  57. data/vendor/assets/javascripts/webshims/dev/shims/form-native-fix.js +261 -0
  58. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-api.js +384 -0
  59. data/vendor/assets/javascripts/webshims/dev/shims/form-number-date-ui.js +847 -0
  60. data/vendor/assets/javascripts/webshims/dev/shims/form-shim-extend.js +1472 -0
  61. data/vendor/assets/javascripts/webshims/dev/shims/geolocation.js +168 -0
  62. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ar.js +32 -0
  63. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ch-ZN.js +32 -0
  64. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-de.txt +33 -0
  65. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-el.js +32 -0
  66. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-en.txt +34 -0
  67. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-es.js +32 -0
  68. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-fr.js +32 -0
  69. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-he.js +32 -0
  70. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hi.js +32 -0
  71. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-hu.js +32 -0
  72. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-it.js +32 -0
  73. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ja.js +32 -0
  74. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-nl.js +32 -0
  75. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-pt-PT.js +32 -0
  76. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-ru.js +32 -0
  77. data/vendor/assets/javascripts/webshims/dev/shims/i18n/errormessages-sv.js +32 -0
  78. data/vendor/assets/javascripts/webshims/dev/shims/json-storage.js +308 -0
  79. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/license.txt +1 -0
  80. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/player.swf +0 -0
  81. data/vendor/assets/javascripts/webshims/dev/shims/jwplayer/readme.html +87 -0
  82. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-core.js +534 -0
  83. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-native-fix.js +99 -0
  84. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-swf.js +1074 -0
  85. data/vendor/assets/javascripts/webshims/dev/shims/mediaelement-yt.js +543 -0
  86. data/vendor/assets/javascripts/webshims/dev/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/dev/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/dev/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/dev/shims/styles/shim.css +677 -0
  90. data/vendor/assets/javascripts/webshims/dev/shims/swf/jwwebshims.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/dev/shims/swf/localStorage.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/dev/shims/track-ui.js +292 -0
  93. data/vendor/assets/javascripts/webshims/dev/shims/track.js +763 -0
  94. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +20 -20
  95. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +29 -29
  96. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +37 -33
  97. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +83 -76
  98. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +44 -42
  99. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -38
  100. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -25
  101. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +60 -55
  102. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +68 -64
  103. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +60 -59
  104. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +66 -64
  105. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +74 -69
  106. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +46 -43
  107. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -47
  108. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +61 -57
  109. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +68 -60
  110. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +82 -77
  111. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +58 -0
  112. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +80 -0
  113. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -0
  114. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +96 -91
  115. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +30 -31
  116. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +37 -39
  117. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +59 -61
  118. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +31 -29
  119. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +38 -37
  120. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +38 -33
  121. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +68 -63
  122. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +22 -20
  123. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +15 -14
  124. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +22 -22
  125. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +22 -22
  126. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +8 -9
  127. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +7 -8
  128. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +23 -21
  129. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +44 -33
  130. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +3 -0
  131. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  132. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +86 -86
  133. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +16 -13
  134. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +30 -30
  135. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +14 -0
  136. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +71 -10
  137. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -0
  138. data/vendor/assets/javascripts/webshims/minified/shims/track.js +20 -0
  139. metadata +101 -5
  140. data/vendor/assets/javascripts/webshims/minified/shims/form-output.js +0 -5
@@ -0,0 +1,2168 @@
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