webshims-rails 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +41 -20
  4. data/vendor/assets/javascripts/webshims/shims/combos/10.js +212 -42
  5. data/vendor/assets/javascripts/webshims/shims/combos/11.js +196 -37
  6. data/vendor/assets/javascripts/webshims/shims/combos/12.js +82 -36
  7. data/vendor/assets/javascripts/webshims/shims/combos/13.js +82 -36
  8. data/vendor/assets/javascripts/webshims/shims/combos/14.js +17 -6
  9. data/vendor/assets/javascripts/webshims/shims/combos/15.js +234 -1247
  10. data/vendor/assets/javascripts/webshims/shims/combos/16.js +234 -1247
  11. data/vendor/assets/javascripts/webshims/shims/combos/17.js +202 -45
  12. data/vendor/assets/javascripts/webshims/shims/combos/18.js +202 -45
  13. data/vendor/assets/javascripts/webshims/shims/combos/19.js +16 -5
  14. data/vendor/assets/javascripts/webshims/shims/combos/2.js +51 -11
  15. data/vendor/assets/javascripts/webshims/shims/combos/20.js +16 -5
  16. data/vendor/assets/javascripts/webshims/shims/combos/21.js +82 -36
  17. data/vendor/assets/javascripts/webshims/shims/combos/22.js +82 -36
  18. data/vendor/assets/javascripts/webshims/shims/combos/24.js +1689 -997
  19. data/vendor/assets/javascripts/webshims/shims/combos/25.js +16 -5
  20. data/vendor/assets/javascripts/webshims/shims/combos/26.js +16 -5
  21. data/vendor/assets/javascripts/webshims/shims/combos/3.js +16 -5
  22. data/vendor/assets/javascripts/webshims/shims/combos/30.js +51 -11
  23. data/vendor/assets/javascripts/webshims/shims/combos/31.js +51 -11
  24. data/vendor/assets/javascripts/webshims/shims/combos/4.js +16 -5
  25. data/vendor/assets/javascripts/webshims/shims/combos/5.js +202 -45
  26. data/vendor/assets/javascripts/webshims/shims/combos/6.js +237 -51
  27. data/vendor/assets/javascripts/webshims/shims/combos/7.js +51 -11
  28. data/vendor/assets/javascripts/webshims/shims/combos/8.js +16 -5
  29. data/vendor/assets/javascripts/webshims/shims/combos/9.js +247 -48
  30. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +17 -5
  31. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +21 -3
  32. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +35 -6
  33. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +6 -8
  34. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +134 -24
  35. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +152 -1205
  36. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +1076 -0
  37. data/vendor/assets/javascripts/webshims/shims/form-validation.js +47 -20
  38. data/vendor/assets/javascripts/webshims/shims/form-validators.js +2 -2
  39. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-de.txt → formcfg-de.js} +3 -0
  41. data/vendor/assets/javascripts/webshims/shims/i18n/{formcfg-en.txt → formcfg-en.js} +5 -1
  42. data/vendor/assets/javascripts/webshims/shims/json-storage.js +1 -1
  43. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  44. data/vendor/assets/javascripts/webshims/shims/range-ui.js +62 -13
  45. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +610 -0
  46. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +10 -0
  47. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +743 -0
  48. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +1 -755
  49. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +0 -606
  50. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/track-ui.js +36 -23
  52. data/vendor/assets/javascripts/webshims/shims/track.js +82 -36
  53. metadata +8 -6
  54. data/vendor/assets/javascripts/webshims/shims/combos/28.js +0 -2196
  55. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -1167
@@ -0,0 +1,1076 @@
1
+ webshims.register('form-shim-extend2', function($, webshims, window, document, undefined, options){
2
+ "use strict";
3
+ var emptyJ = $([]);
4
+ var getGroupElements = function(elem){
5
+ elem = $(elem);
6
+ var name;
7
+ var form;
8
+ var ret = emptyJ;
9
+ if(elem[0].type == 'radio'){
10
+ form = elem.prop('form');
11
+ name = elem[0].name;
12
+ if(!name){
13
+ ret = elem;
14
+ } else if(form){
15
+ ret = $(form[name]);
16
+ } else {
17
+ ret = $(document.getElementsByName(name)).filter(function(){
18
+ return !$.prop(this, 'form');
19
+ });
20
+ }
21
+ ret = ret.filter('[type="radio"]');
22
+ }
23
+ return ret;
24
+ };
25
+ //submitbubbles for IE6-IE8
26
+ var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
27
+ var addSubmitBubbles = function(form){
28
+ if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
29
+
30
+ $.event.add( form, 'submit._submit', function( event ) {
31
+ event._submit_bubble = true;
32
+ });
33
+
34
+ form._submit_attached = true;
35
+ }
36
+ };
37
+ if(!supportSubmitBubbles && $.event.special.submit){
38
+
39
+ $.event.special.submit.setup = function() {
40
+ // Only need this for delegated form submit events
41
+ if ( $.nodeName( this, "form" ) ) {
42
+ return false;
43
+ }
44
+
45
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
46
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
47
+ // Node name check avoids a VML-related crash in IE (#9807)
48
+ var elem = e.target,
49
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
50
+ addSubmitBubbles(form);
51
+
52
+ });
53
+ // return undefined since we don't need an event listener
54
+ };
55
+ }
56
+
57
+
58
+
59
+ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
60
+ set: function(value){
61
+ $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
62
+ },
63
+ initAttr: Modernizr.localstorage //only if we have aria-support
64
+ });
65
+
66
+ webshims.reflectProperties(['input'], ['pattern']);
67
+
68
+
69
+ if( !('maxLength' in document.createElement('textarea')) ){
70
+ var constrainMaxLength = (function(){
71
+ var timer;
72
+ var curLength = 0;
73
+ var lastElement = $([]);
74
+ var max = 1e9;
75
+ var constrainLength = function(){
76
+ var nowValue = lastElement.prop('value');
77
+ var nowLen = nowValue.length;
78
+ if(nowLen > curLength && nowLen > max){
79
+ nowLen = Math.max(curLength, max);
80
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
81
+ }
82
+ curLength = nowLen;
83
+ };
84
+ var remove = function(){
85
+ clearTimeout(timer);
86
+ lastElement.unbind('.maxlengthconstraint');
87
+ };
88
+ return function(element, maxLength){
89
+ remove();
90
+ if(maxLength > -1){
91
+ max = maxLength;
92
+ curLength = $.prop(element, 'value').length;
93
+ lastElement = $(element);
94
+ lastElement.on({
95
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
96
+ setTimeout(constrainLength, 0);
97
+ },
98
+ 'keyup.maxlengthconstraint': constrainLength,
99
+ 'blur.maxlengthconstraint': remove
100
+ });
101
+ timer = setInterval(constrainLength, 200);
102
+ }
103
+ };
104
+ })();
105
+
106
+ constrainMaxLength.update = function(element, maxLength){
107
+ if($(element).is(':focus')){
108
+ if(!maxLength){
109
+ maxLength = $.prop(element, 'maxlength');
110
+ }
111
+ constrainMaxLength(element, maxLength);
112
+ }
113
+ };
114
+
115
+ $(document).on('focusin', function(e){
116
+ var maxLength;
117
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
118
+ constrainMaxLength(e.target, maxLength);
119
+ }
120
+ });
121
+
122
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
123
+ attr: {
124
+ set: function(val){
125
+ this.setAttribute('maxlength', ''+val);
126
+ constrainMaxLength.update(this);
127
+ },
128
+ get: function(){
129
+ var ret = this.getAttribute('maxlength');
130
+ return ret == null ? undefined : ret;
131
+ }
132
+ },
133
+ prop: {
134
+ set: function(val){
135
+ if(isNumber(val)){
136
+ if(val < 0){
137
+ throw('INDEX_SIZE_ERR');
138
+ }
139
+ val = parseInt(val, 10);
140
+ this.setAttribute('maxlength', val);
141
+ constrainMaxLength.update(this, val);
142
+ return;
143
+ }
144
+ this.setAttribute('maxlength', '0');
145
+ constrainMaxLength.update(this, 0);
146
+ },
147
+ get: function(){
148
+ var val = this.getAttribute('maxlength');
149
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
150
+
151
+ }
152
+ }
153
+ });
154
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
155
+ prop: {
156
+ set: function(val){
157
+ $.prop(this, 'maxlength', val);
158
+ },
159
+ get: function(){
160
+ return $.prop(this, 'maxlength');
161
+ }
162
+ }
163
+ });
164
+ }
165
+
166
+ if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
167
+ webshims.defineNodeNameProperty('form', 'novalidate', {
168
+ attr: {
169
+ set: function(val){
170
+ this.setAttribute('novalidate', ''+val);
171
+ },
172
+ get: function(){
173
+ var ret = this.getAttribute('novalidate');
174
+ return ret == null ? undefined : ret;
175
+ }
176
+ }
177
+ });
178
+ }
179
+
180
+
181
+ if(Modernizr.formattribute === false || !Modernizr.fieldsetdisabled){
182
+ (function(){
183
+
184
+ (function(prop, undefined){
185
+ $.prop = function(elem, name, value){
186
+ var ret;
187
+ if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
188
+ ret = document.getElementsByName(name);
189
+ if(!ret || !ret.length){
190
+ ret = document.getElementById(name);
191
+ }
192
+ if(ret){
193
+ ret = $(ret).filter(function(){
194
+ return $.prop(this, 'form') == elem;
195
+ }).get();
196
+ if(ret.length){
197
+ return ret.length == 1 ? ret[0] : ret;
198
+ }
199
+ }
200
+ }
201
+ return prop.apply(this, arguments);
202
+ };
203
+ })($.prop, undefined);
204
+
205
+ var removeAddedElements = function(form){
206
+ var elements = $.data(form, 'webshimsAddedElements');
207
+ if(elements){
208
+ elements.remove();
209
+ $.removeData(form, 'webshimsAddedElements');
210
+ }
211
+ };
212
+
213
+
214
+ if(!Modernizr.formattribute){
215
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
216
+ prop: {
217
+ get: function(){
218
+ var form = webshims.contentAttr(this, 'form');
219
+ if(form){
220
+ form = document.getElementById(form);
221
+ if(form && !$.nodeName(form, 'form')){
222
+ form = null;
223
+ }
224
+ }
225
+ return form || this.form;
226
+ },
227
+ writeable: false
228
+ }
229
+ });
230
+
231
+
232
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
233
+ prop: {
234
+ get: function(){
235
+ var id = this.id;
236
+ var elements = $.makeArray(this.elements);
237
+ if(id){
238
+ elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
239
+ }
240
+ return elements;
241
+ },
242
+ writeable: false
243
+ }
244
+ });
245
+
246
+
247
+
248
+ $(function(){
249
+ var stopPropagation = function(e){
250
+ e.stopPropagation();
251
+ };
252
+ var submitters = {
253
+ image: 1,
254
+ submit: 1
255
+ };
256
+ $(document).on('submit', function(e){
257
+
258
+ if(!e.isDefaultPrevented()){
259
+ var form = e.target;
260
+ var id = form.id;
261
+ var elements;
262
+
263
+
264
+ if(id){
265
+ removeAddedElements(form);
266
+
267
+ elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
268
+ .filter(function(){
269
+ return !this.disabled && this.name && this.form != form;
270
+ })
271
+ .clone()
272
+ ;
273
+ if(elements.length){
274
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
275
+ setTimeout(function(){
276
+ removeAddedElements(form);
277
+ }, 9);
278
+ }
279
+ elements = null;
280
+ }
281
+ }
282
+ });
283
+
284
+
285
+ $(document).on('click', function(e){
286
+ if(submitters[e.target.type] && !e.isDefaultPrevented() && $(e.target).is('input[form], button[form]')){
287
+ var trueForm = $.prop(e.target, 'form');
288
+ var formIn = e.target.form;
289
+ var clone;
290
+ if(trueForm && trueForm != formIn){
291
+ clone = $(e.target)
292
+ .clone()
293
+ .removeAttr('form')
294
+ .addClass('webshims-visual-hide')
295
+ .on('click', stopPropagation)
296
+ .appendTo(trueForm)
297
+ ;
298
+ if(formIn){
299
+ e.preventDefault();
300
+ }
301
+ addSubmitBubbles(trueForm);
302
+ clone.trigger('click');
303
+ setTimeout(function(){
304
+ clone.remove();
305
+ clone = null;
306
+ }, 9);
307
+ }
308
+ }
309
+ });
310
+ });
311
+ }
312
+
313
+ if(!Modernizr.fieldsetdisabled){
314
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
315
+ prop: {
316
+ get: function(){
317
+ //add listed elements without keygen, object, output
318
+ return $('input, select, textarea, button, fieldset', this).get() || [];
319
+ },
320
+ writeable: false
321
+ }
322
+ });
323
+ }
324
+
325
+ if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
326
+ var rCRLF = /\r?\n/g,
327
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
328
+ rselectTextarea = /^(?:select|textarea)/i;
329
+ $.fn.serializeArray = function() {
330
+ return this.map(function(){
331
+ var elements = $.prop(this, 'elements');
332
+ return elements ? $.makeArray( elements ) : this;
333
+ })
334
+ .filter(function(){
335
+ return this.name && !this.disabled &&
336
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
337
+ rinput.test( this.type ) );
338
+ })
339
+ .map(function( i, elem ){
340
+ var val = $( this ).val();
341
+
342
+ return val == null ?
343
+ null :
344
+ $.isArray( val ) ?
345
+ $.map( val, function( val, i ){
346
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
347
+ }) :
348
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
349
+ }).get();
350
+ };
351
+ }
352
+
353
+ })();
354
+ }
355
+
356
+ if($('<input />').prop('labels') == null){
357
+ webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
358
+ prop: {
359
+ get: function(){
360
+ if(this.type == 'hidden'){return null;}
361
+ var id = this.id;
362
+ var labels = $(this)
363
+ .closest('label')
364
+ .filter(function(){
365
+ var hFor = (this.attributes['for'] || {});
366
+ return (!hFor.specified || hFor.value == id);
367
+ })
368
+ ;
369
+
370
+ if(id) {
371
+ labels = labels.add('label[for="'+ id +'"]');
372
+ }
373
+ return labels.get();
374
+ },
375
+ writeable: false
376
+ }
377
+ });
378
+ }
379
+
380
+ if(!('value' in document.createElement('progress'))){
381
+ (function(){
382
+
383
+ var nan = parseInt('NaN', 10);
384
+
385
+ var updateProgress = function(progress){
386
+ var position;
387
+
388
+
389
+ position = $.prop(progress, 'position');
390
+
391
+ $.attr(progress, 'data-position', position);
392
+ $('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
393
+ };
394
+ var desc = {
395
+ position: {
396
+ prop: {
397
+ get: function(){
398
+ var max;
399
+ //jQuery 1.8.x try's to normalize "0" to 0
400
+ var val = this.getAttribute('value');
401
+ var ret = -1;
402
+
403
+ val = val ? (val * 1) : nan;
404
+ if(!isNaN(val)){
405
+ max = $.prop(this, 'max');
406
+ ret = Math.max(Math.min(val / max, 1), 0);
407
+ if(updateProgress.isInChange){
408
+ $.attr(this, 'aria-valuenow', ret * 100);
409
+ if(updateProgress.isInChange == 'max'){
410
+ $.attr(this, 'aria-valuemax', max);
411
+ }
412
+ }
413
+ } else if(updateProgress.isInChange) {
414
+ $(this).removeAttr('aria-valuenow');
415
+ }
416
+ return ret;
417
+ },
418
+ writeable: false
419
+ }
420
+ }
421
+ };
422
+
423
+ $.each({value: 0, max: 1}, function(name, defValue){
424
+ var removeProp = (name == 'value' && !$.fn.finish);
425
+ desc[name] = {
426
+ attr: {
427
+ set: function(value){
428
+ var ret = desc[name].attr._supset.call(this, value);
429
+ updateProgress.isInChange = name;
430
+ updateProgress(this);
431
+ updateProgress.isInChange = false;
432
+ return ret;
433
+ }
434
+ },
435
+ removeAttr: {
436
+ value: function(){
437
+ this.removeAttribute(name);
438
+ if(removeProp){
439
+ try {
440
+ delete this.value;
441
+ } catch(er){}
442
+ }
443
+ updateProgress.isInChange = name;
444
+ updateProgress(this);
445
+ updateProgress.isInChange = false;
446
+ }
447
+ },
448
+ prop: {
449
+ get: function(){
450
+ var max;
451
+ var ret = (desc[name].attr.get.call(this) * 1);
452
+ if(ret < 0 || isNaN(ret)){
453
+ ret = defValue;
454
+ } else if(name == 'value'){
455
+ ret = Math.min(ret, $.prop(this, 'max'));
456
+ } else if(ret === 0){
457
+ ret = defValue;
458
+ }
459
+ return ret;
460
+ },
461
+ set: function(value){
462
+ value = value * 1;
463
+ if(isNaN(value)){
464
+ webshims.error('Floating-point value is not finite.');
465
+ }
466
+ return desc[name].attr.set.call(this, value);
467
+ }
468
+ }
469
+ };
470
+ });
471
+
472
+ webshims.createElement(
473
+ 'progress',
474
+ function(){
475
+ var labels = $(this)
476
+ .attr({role: 'progressbar', 'aria-valuemin': '0'})
477
+ .html('<span class="progress-value" />')
478
+ .jProp('labels')
479
+ .map(function(){
480
+ return webshims.getID(this);
481
+ })
482
+ .get()
483
+ ;
484
+ if(labels.length){
485
+ $.attr(this, 'aria-labelledby', labels.join(' '));
486
+ } else {
487
+ webshims.info("you should use label elements for your prgogress elements");
488
+ }
489
+
490
+ updateProgress.isInChange = 'max';
491
+ updateProgress(this);
492
+ updateProgress.isInChange = false;
493
+ },
494
+ desc
495
+ );
496
+
497
+ })();
498
+ }
499
+
500
+ try {
501
+ document.querySelector(':checked');
502
+ } catch(er){
503
+ (function(){
504
+ $('html').addClass('no-csschecked');
505
+ var checkInputs = {
506
+ radio: 1,
507
+ checkbox: 1
508
+ };
509
+ var selectChange = function(){
510
+ var options = this.options || [];
511
+ var i, len, option;
512
+ for(i = 0, len = options.length; i < len; i++){
513
+ option = $(options[i]);
514
+ option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
515
+ }
516
+ };
517
+ var checkChange = function(){
518
+ var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
519
+ var className = this.className || '';
520
+ var parent;
521
+
522
+ //IE8- has problems to update styles, we help
523
+ if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
524
+ $(this)[fn]('prop-checked');
525
+ if((parent = this.parentNode)){
526
+ parent.className = parent.className;
527
+ }
528
+ }
529
+ };
530
+
531
+
532
+ webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
533
+ webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
534
+ webshims.onNodeNamesPropertyModify('option', 'selected', function(){
535
+ $(this).closest('select').each(selectChange);
536
+ });
537
+ webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
538
+ var type = this.type;
539
+ if(type == 'radio' && boolVal){
540
+ getGroupElements(this).each(checkChange);
541
+ } else if(checkInputs[type]) {
542
+ $(this).each(checkChange);
543
+ }
544
+ });
545
+
546
+ $(document).on('change', function(e){
547
+
548
+ if(checkInputs[e.target.type]){
549
+ if(e.target.type == 'radio'){
550
+ getGroupElements(e.target).each(checkChange);
551
+ } else {
552
+ $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
553
+ }
554
+ } else if(e.target.nodeName.toLowerCase() == 'select'){
555
+ $(e.target).each(selectChange);
556
+ }
557
+ });
558
+
559
+ webshims.addReady(function(context, contextElem){
560
+ $('option, input', context)
561
+ .add(contextElem.filter('option, input'))
562
+ .each(function(){
563
+ var prop;
564
+ if(checkInputs[this.type]){
565
+ prop = 'checked';
566
+ } else if(this.nodeName.toLowerCase() == 'option'){
567
+ prop = 'selected';
568
+ }
569
+ if(prop){
570
+ $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
571
+ }
572
+
573
+ })
574
+ ;
575
+ });
576
+ })();
577
+ }
578
+
579
+ (function(){
580
+ var bustedPlaceholder;
581
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
582
+ if(Modernizr.input.placeholder && options.overridePlaceholder){
583
+ bustedPlaceholder = true;
584
+ }
585
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
586
+ (function(){
587
+ var ua = navigator.userAgent;
588
+
589
+ if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
590
+ $(window).on('orientationchange', (function(){
591
+ var timer;
592
+ var retVal = function(i, value){
593
+ return value;
594
+ };
595
+
596
+ var set = function(){
597
+ $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
598
+ };
599
+ return function(e){
600
+ clearTimeout(timer);
601
+ timer = setTimeout(set, 9);
602
+ };
603
+ })());
604
+ }
605
+ })();
606
+
607
+ //abort
608
+ return;
609
+ }
610
+
611
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
612
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
613
+ var polyfillElements = ['textarea'];
614
+ var debug = webshims.debug !== false;
615
+ if(!Modernizr.input.placeholder || bustedPlaceholder){
616
+ polyfillElements.push('input');
617
+ }
618
+
619
+ var setSelection = function(elem){
620
+ try {
621
+ if(elem.setSelectionRange){
622
+ elem.setSelectionRange(0, 0);
623
+ return true;
624
+ } else if(elem.createTextRange){
625
+ var range = elem.createTextRange();
626
+ range.collapse(true);
627
+ range.moveEnd('character', 0);
628
+ range.moveStart('character', 0);
629
+ range.select();
630
+ return true;
631
+ }
632
+ } catch(er){}
633
+ };
634
+
635
+ var hidePlaceholder = function(elem, data, value, _onFocus){
636
+ if(value === false){
637
+ value = $.prop(elem, 'value');
638
+ }
639
+
640
+ if(!isOver && elem.type != 'password'){
641
+ if(!value && _onFocus && setSelection(elem)){
642
+ var selectTimer = setTimeout(function(){
643
+ setSelection(elem);
644
+ }, 9);
645
+ $(elem)
646
+ .off('.placeholderremove')
647
+ .on({
648
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
649
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
650
+ elem.value = $.prop(elem, 'value');
651
+ data.box.removeClass('placeholder-visible');
652
+ clearTimeout(selectTimer);
653
+ $(elem).unbind('.placeholderremove');
654
+ },
655
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
656
+ setSelection(elem);
657
+ clearTimeout(selectTimer);
658
+ selectTimer = setTimeout(function(){
659
+ setSelection(elem);
660
+ }, 9);
661
+ },
662
+ 'blur.placeholderremove': function(){
663
+ clearTimeout(selectTimer);
664
+ $(elem).unbind('.placeholderremove');
665
+ }
666
+ })
667
+ ;
668
+ return;
669
+ } else if(!_onFocus && !value && elem.value){ //especially on submit
670
+ elem.value = value;
671
+ }
672
+ } else if(!value && _onFocus){
673
+ $(elem)
674
+ .off('.placeholderremove')
675
+ .on({
676
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
677
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
678
+ data.box.removeClass('placeholder-visible');
679
+ $(elem).unbind('.placeholderremove');
680
+ },
681
+ 'blur.placeholderremove': function(){
682
+ $(elem).unbind('.placeholderremove');
683
+ }
684
+ })
685
+ ;
686
+ return;
687
+ }
688
+ data.box.removeClass('placeholder-visible');
689
+ },
690
+ showPlaceholder = function(elem, data, placeholderTxt){
691
+ if(placeholderTxt === false){
692
+ placeholderTxt = $.prop(elem, 'placeholder');
693
+ }
694
+
695
+ if(!isOver && elem.type != 'password'){
696
+ elem.value = placeholderTxt;
697
+ }
698
+ data.box.addClass('placeholder-visible');
699
+ },
700
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
701
+ if(!data){
702
+ data = $.data(elem, 'placeHolder');
703
+ if(!data){return;}
704
+ }
705
+ var isVisible = $(elem).hasClass('placeholder-visible');
706
+ if(placeholderTxt === false){
707
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
708
+ }
709
+
710
+ $(elem).unbind('.placeholderremove');
711
+
712
+ if(value === false){
713
+ value = $.prop(elem, 'value');
714
+ }
715
+
716
+ if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
717
+ if(elem.type == 'password' || isOver || isVisible){
718
+ hidePlaceholder(elem, data, '', true);
719
+ }
720
+ return;
721
+ }
722
+
723
+ if(value){
724
+ hidePlaceholder(elem, data, value);
725
+ return;
726
+ }
727
+
728
+ if(placeholderTxt && !value){
729
+ showPlaceholder(elem, data, placeholderTxt);
730
+ } else {
731
+ hidePlaceholder(elem, data, value);
732
+ }
733
+ },
734
+ hasLabel = function(elem){
735
+ elem = $(elem);
736
+ return !!(elem.prop('title') || elem.attr('aria-labelledby') || elem.attr('aria-label') || elem.jProp('labels').length);
737
+ },
738
+ createPlaceholder = function(elem){
739
+ elem = $(elem);
740
+ return $( hasLabel(elem) ? '<span class="placeholder-text"></span>' : '<label for="'+ elem.prop('id') +'" class="placeholder-text"></label>');
741
+ },
742
+ pHolder = (function(){
743
+ var delReg = /\n|\r|\f|\t/g,
744
+ allowedPlaceholder = {
745
+ text: 1,
746
+ search: 1,
747
+ url: 1,
748
+ email: 1,
749
+ password: 1,
750
+ tel: 1,
751
+ number: 1
752
+ }
753
+ ;
754
+ if(webshims.modules["form-number-date-ui"].loaded){
755
+ delete allowedPlaceholder.number;
756
+ }
757
+
758
+ return {
759
+ create: function(elem){
760
+ var data = $.data(elem, 'placeHolder');
761
+ var form;
762
+ var responsiveElem;
763
+ if(data){return data;}
764
+ data = $.data(elem, 'placeHolder', {});
765
+
766
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
767
+ changePlaceholderVisibility(this, false, false, data, e.type );
768
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
769
+ });
770
+
771
+ if((form = $.prop(elem, 'form'))){
772
+ $(elem).onWSOff('reset.placeholder', function(e){
773
+ setTimeout(function(){
774
+ changePlaceholderVisibility(elem, false, false, data, e.type );
775
+ }, 0);
776
+ }, false, form);
777
+ }
778
+
779
+ if(elem.type == 'password' || isOver){
780
+ data.text = createPlaceholder(elem);
781
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
782
+ responsiveElem = true;
783
+ data.box = data.text;
784
+ } else {
785
+ data.box = $(elem)
786
+ .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
787
+ .parent()
788
+ ;
789
+ }
790
+ data.text
791
+ .insertAfter(elem)
792
+ .on('mousedown.placeholder', function(){
793
+ changePlaceholderVisibility(this, false, false, data, 'focus');
794
+ try {
795
+ setTimeout(function(){
796
+ elem.focus();
797
+ }, 0);
798
+ } catch(e){}
799
+ return false;
800
+ })
801
+ ;
802
+
803
+
804
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
805
+ var prop = $.css(elem, style);
806
+ if(data.text.css(style) != prop){
807
+ data.text.css(style, prop);
808
+ }
809
+ });
810
+ $.each(['Left', 'Top'], function(i, side){
811
+ 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);
812
+ data.text.css('padding'+ side, size);
813
+ });
814
+
815
+ $(elem)
816
+ .onWSOff('updateshadowdom', function(){
817
+ var height, width;
818
+ if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
819
+ data.text
820
+ .css({
821
+ width: width,
822
+ height: height
823
+ })
824
+ .css($(elem).position())
825
+ ;
826
+ }
827
+ }, true)
828
+ ;
829
+
830
+ } else {
831
+ var reset = function(e){
832
+ if($(elem).hasClass('placeholder-visible')){
833
+ hidePlaceholder(elem, data, '');
834
+
835
+ setTimeout(function(){
836
+ if(!e || e.type != 'submit' || e.isDefaultPrevented()){
837
+ changePlaceholderVisibility(elem, false, false, data );
838
+ }
839
+ }, 9);
840
+ }
841
+ };
842
+
843
+ $(elem).onWSOff('beforeunload', reset, false, window);
844
+ data.box = $(elem);
845
+ if(form){
846
+ $(elem).onWSOff('submit', reset, false, form);
847
+ }
848
+ }
849
+
850
+ return data;
851
+ },
852
+ update: function(elem, val){
853
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
854
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
855
+ webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
856
+ return;
857
+ }
858
+
859
+
860
+ var data = pHolder.create(elem);
861
+ if(data.text){
862
+ data.text.text(val);
863
+ }
864
+
865
+ changePlaceholderVisibility(elem, false, val, data);
866
+ }
867
+ };
868
+ })()
869
+ ;
870
+
871
+ $.webshims.publicMethods = {
872
+ pHolder: pHolder
873
+ };
874
+ polyfillElements.forEach(function(nodeName){
875
+ var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
876
+ attr: {
877
+ set: function(val){
878
+ var elem = this;
879
+ if(bustedPlaceholder){
880
+ webshims.data(elem, 'bustedPlaceholder', val);
881
+ elem.placeholder = '';
882
+ } else {
883
+ webshims.contentAttr(elem, 'placeholder', val);
884
+ }
885
+ pHolder.update(elem, val);
886
+ },
887
+ get: function(){
888
+ var placeholder;
889
+ if(bustedPlaceholder){
890
+ placeholder = webshims.data(this, 'bustedPlaceholder');
891
+ }
892
+ return placeholder || webshims.contentAttr(this, 'placeholder');
893
+ }
894
+ },
895
+ reflect: true,
896
+ initAttr: true
897
+ });
898
+ });
899
+
900
+
901
+ polyfillElements.forEach(function(name){
902
+ var placeholderValueDesc = {};
903
+ var desc;
904
+ ['attr', 'prop'].forEach(function(propType){
905
+ placeholderValueDesc[propType] = {
906
+ set: function(val){
907
+ var elem = this;
908
+ var placeholder;
909
+ if(bustedPlaceholder){
910
+ placeholder = webshims.data(elem, 'bustedPlaceholder');
911
+ }
912
+ if(!placeholder){
913
+ placeholder = webshims.contentAttr(elem, 'placeholder');
914
+ }
915
+ $.removeData(elem, 'cachedValidity');
916
+ var ret = desc[propType]._supset.call(elem, val);
917
+ if(placeholder && 'value' in elem){
918
+ changePlaceholderVisibility(elem, val, placeholder);
919
+ }
920
+ return ret;
921
+ },
922
+ get: function(){
923
+ var elem = this;
924
+ return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
925
+ }
926
+ };
927
+ });
928
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
929
+ });
930
+
931
+ })();
932
+
933
+ (function(){
934
+ var doc = document;
935
+ if( 'value' in document.createElement('output') ){return;}
936
+
937
+ webshims.defineNodeNameProperty('output', 'value', {
938
+ prop: {
939
+ set: function(value){
940
+ var setVal = $.data(this, 'outputShim');
941
+ if(!setVal){
942
+ setVal = outputCreate(this);
943
+ }
944
+ setVal(value);
945
+ },
946
+ get: function(){
947
+ return webshims.contentAttr(this, 'value') || $(this).text() || '';
948
+ }
949
+ }
950
+ });
951
+
952
+
953
+ webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
954
+ if(type == 'removeAttr'){return;}
955
+ var setVal = $.data(this, 'outputShim');
956
+ if(setVal){
957
+ setVal(value);
958
+ }
959
+ });
960
+
961
+ var outputCreate = function(elem){
962
+ if(elem.getAttribute('aria-live')){return;}
963
+ elem = $(elem);
964
+ var value = (elem.text() || '').trim();
965
+ var id = elem.prop('id');
966
+ var htmlFor = elem.attr('for');
967
+ var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
968
+ var form = shim[0].form || doc;
969
+ var setValue = function(val){
970
+ shim[0].value = val;
971
+ val = shim[0].value;
972
+ elem.text(val);
973
+ webshims.contentAttr(elem[0], 'value', val);
974
+ };
975
+
976
+ elem[0].defaultValue = value;
977
+ webshims.contentAttr(elem[0], 'value', value);
978
+
979
+ elem.attr({'aria-live': 'polite'});
980
+ if(id){
981
+ shim.attr('id', id);
982
+ elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
983
+ return webshims.getID(this);
984
+ }).get().join(' '));
985
+ }
986
+ if(htmlFor){
987
+ id = webshims.getID(elem);
988
+ htmlFor.split(' ').forEach(function(control){
989
+ control = document.getElementById(control);
990
+ if(control){
991
+ control.setAttribute('aria-controls', id);
992
+ }
993
+ });
994
+ }
995
+ elem.data('outputShim', setValue );
996
+ shim.data('outputShim', setValue );
997
+ return setValue;
998
+ };
999
+
1000
+ webshims.addReady(function(context, contextElem){
1001
+ $('output', context).add(contextElem.filter('output')).each(function(){
1002
+ outputCreate(this);
1003
+ });
1004
+ });
1005
+
1006
+ /*
1007
+ * Implements input event in all browsers
1008
+ */
1009
+ (function(){
1010
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
1011
+ noInputTypes = {
1012
+ radio: 1,
1013
+ checkbox: 1,
1014
+ submit: 1,
1015
+ button: 1,
1016
+ image: 1,
1017
+ reset: 1,
1018
+ file: 1
1019
+
1020
+ //pro forma
1021
+ ,color: 1
1022
+ //,range: 1
1023
+ },
1024
+ observe = function(input){
1025
+ var timer,
1026
+ lastVal = input.prop('value'),
1027
+ trigger = function(e){
1028
+ //input === null
1029
+ if(!input){return;}
1030
+ var newVal = input.prop('value');
1031
+ if(newVal !== lastVal){
1032
+ lastVal = newVal;
1033
+ if(!e || !noInputTriggerEvts[e.type]){
1034
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1035
+ }
1036
+ }
1037
+ },
1038
+ extraTimer,
1039
+ extraTest = function(){
1040
+ clearTimeout(extraTimer);
1041
+ extraTimer = setTimeout(trigger, 9);
1042
+ },
1043
+ unbind = function(){
1044
+ input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
1045
+ clearInterval(timer);
1046
+ setTimeout(function(){
1047
+ trigger();
1048
+ input = null;
1049
+ }, 1);
1050
+
1051
+ }
1052
+ ;
1053
+
1054
+ clearInterval(timer);
1055
+ timer = setInterval(trigger, 200);
1056
+ extraTest();
1057
+ input.on({
1058
+ 'keyup keypress keydown paste cut': extraTest,
1059
+ focusout: unbind,
1060
+ 'input updateInput change': trigger
1061
+ });
1062
+ }
1063
+ ;
1064
+
1065
+ $(doc)
1066
+ .on('focusin', function(e){
1067
+ if( e.target && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
1068
+ observe($(e.target));
1069
+ }
1070
+ })
1071
+ ;
1072
+ })();
1073
+ })();
1074
+
1075
+
1076
+ });