webshims-rails 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -809,7 +809,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
809
809
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
810
810
 
811
811
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
812
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
812
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
813
813
  }
814
814
 
815
815
  if(!$.parseHTML){
@@ -1362,7 +1362,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1362
1362
  $(this.test);
1363
1363
  webshims.ready('WINDOWLOAD', this.test);
1364
1364
  $(document).on('updatelayout', this.handler);
1365
- $(window).bind('resize', this.handler);
1365
+ $(window).on('resize', this.handler);
1366
1366
  (function(){
1367
1367
  var oldAnimate = $.fn.animate;
1368
1368
  var animationTimer;
@@ -1384,6 +1384,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1384
1384
  webshims.docObserve = function(){
1385
1385
  webshims.ready('DOM', function(){
1386
1386
  docObserve.start();
1387
+ if($.support.boxSizing == null){
1388
+ $(function(){
1389
+ if($.support.boxSizing){
1390
+ docObserve.handler({type: 'boxsizing'});
1391
+ }
1392
+ });
1393
+ }
1387
1394
  });
1388
1395
  };
1389
1396
  return function(nativeElem, shadowElem, opts){
@@ -1544,7 +1551,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1544
1551
  havePolyfill[prop] = true;
1545
1552
 
1546
1553
  if(descs.reflect){
1547
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
1554
+ if(descs.propType && !webshims.propTypes[descs.propType]){
1555
+ webshims.error('could not finde propType '+ descs.propType);
1556
+ } else {
1557
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
1558
+ }
1559
+
1548
1560
  }
1549
1561
 
1550
1562
  ['prop', 'attr', 'removeAttr'].forEach(function(type){
@@ -1730,7 +1742,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1730
1742
  var notLocal = /:\/\/|^\.*\//;
1731
1743
  var loadRemoteLang = function(data, lang, options){
1732
1744
  var langSrc;
1733
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
1745
+ if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
1734
1746
  data.loading = true;
1735
1747
  langSrc = options.langSrc;
1736
1748
  if(!notLocal.test(langSrc)){
@@ -1891,7 +1903,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1891
1903
 
1892
1904
  })(webshims.$, document);
1893
1905
 
1894
-
1895
1906
  //JSON
1896
1907
  (function(){
1897
1908
  if('JSON'in window && JSON.stringify && JSON.parse){return;}
@@ -1904,7 +1915,7 @@ if(!this.JSON){this.JSON={};}(function(){function f(n){return n<10?'0'+n:n;}if(t
1904
1915
  //using window.name for sessionStorage and cookies for localStorage
1905
1916
 
1906
1917
  (function () {
1907
- var $ = jQuery;
1918
+ var $ = webshims.$ || jQuery;
1908
1919
  if ('localStorage' in window && 'sessionStorage' in window) {
1909
1920
  $.webshims.isReady('json-storage', true);
1910
1921
  return;
@@ -6,7 +6,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
6
6
  webshims.assumeARIA = supportGetSetAttribute || Modernizr.canvas || Modernizr.video || Modernizr.boxsizing;
7
7
 
8
8
  if($('<input type="email" />').attr('type') == 'text' || $('<form />').attr('novalidate') === "" || ('required' in $('<input />')[0].attributes)){
9
- webshims.error("IE browser modes are busted in IE10. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
9
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
10
10
  }
11
11
 
12
12
  if(!$.parseHTML){
@@ -559,7 +559,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
559
559
  $(this.test);
560
560
  webshims.ready('WINDOWLOAD', this.test);
561
561
  $(document).on('updatelayout', this.handler);
562
- $(window).bind('resize', this.handler);
562
+ $(window).on('resize', this.handler);
563
563
  (function(){
564
564
  var oldAnimate = $.fn.animate;
565
565
  var animationTimer;
@@ -581,6 +581,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
581
581
  webshims.docObserve = function(){
582
582
  webshims.ready('DOM', function(){
583
583
  docObserve.start();
584
+ if($.support.boxSizing == null){
585
+ $(function(){
586
+ if($.support.boxSizing){
587
+ docObserve.handler({type: 'boxsizing'});
588
+ }
589
+ });
590
+ }
584
591
  });
585
592
  };
586
593
  return function(nativeElem, shadowElem, opts){
@@ -741,7 +748,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
741
748
  havePolyfill[prop] = true;
742
749
 
743
750
  if(descs.reflect){
744
- webshims.propTypes[descs.propType || 'standard'](descs, prop);
751
+ if(descs.propType && !webshims.propTypes[descs.propType]){
752
+ webshims.error('could not finde propType '+ descs.propType);
753
+ } else {
754
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
755
+ }
756
+
745
757
  }
746
758
 
747
759
  ['prop', 'attr', 'removeAttr'].forEach(function(type){
@@ -927,7 +939,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
927
939
  var notLocal = /:\/\/|^\.*\//;
928
940
  var loadRemoteLang = function(data, lang, options){
929
941
  var langSrc;
930
- if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){
942
+ if(lang && options && $.inArray(lang, options.availableLangs || options.availabeLangs || []) !== -1){
931
943
  data.loading = true;
932
944
  langSrc = options.langSrc;
933
945
  if(!notLocal.test(langSrc)){
@@ -1087,7 +1099,6 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine
1087
1099
  });
1088
1100
 
1089
1101
  })(webshims.$, document);
1090
-
1091
1102
  webshims.register('form-core', function($, webshims, window, document, undefined, options){
1092
1103
  "use strict";
1093
1104
 
@@ -1301,7 +1312,6 @@ webshims.register('form-core', function($, webshims, window, document, undefined
1301
1312
 
1302
1313
  });
1303
1314
 
1304
- if(!Modernizr.formvalidation || webshims.bugs.bustedValidity){
1305
1315
  webshims.register('form-shim-extend', function($, webshims, window, document, undefined, options){
1306
1316
  "use strict";
1307
1317
  webshims.inputTypes = webshims.inputTypes || {};
@@ -1396,7 +1406,7 @@ var isPlaceholderOptionSelected = function(select){
1396
1406
  }
1397
1407
  return false;
1398
1408
  };
1399
- var modules = webshims.modules;
1409
+
1400
1410
  var emptyJ = $([]);
1401
1411
  var getGroupElements = function(elem){
1402
1412
  elem = $(elem);
@@ -1516,36 +1526,6 @@ $.event.special.invalid = {
1516
1526
  }
1517
1527
  };
1518
1528
 
1519
- var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
1520
- var addSubmitBubbles = function(form){
1521
- if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
1522
-
1523
- $.event.add( form, 'submit._submit', function( event ) {
1524
- event._submit_bubble = true;
1525
- });
1526
-
1527
- form._submit_attached = true;
1528
- }
1529
- };
1530
- if(!supportSubmitBubbles && $.event.special.submit){
1531
- $.event.special.submit.setup = function() {
1532
- // Only need this for delegated form submit events
1533
- if ( $.nodeName( this, "form" ) ) {
1534
- return false;
1535
- }
1536
-
1537
- // Lazy-add a submit handler when a descendant form may potentially be submitted
1538
- $.event.add( this, "click._submit keypress._submit", function( e ) {
1539
- // Node name check avoids a VML-related crash in IE (#9807)
1540
- var elem = e.target,
1541
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
1542
- addSubmitBubbles(form);
1543
-
1544
- });
1545
- // return undefined since we don't need an event listener
1546
- };
1547
- }
1548
-
1549
1529
  $.event.special.submit = $.event.special.submit || {setup: function(){return false;}};
1550
1530
  var submitSetup = $.event.special.submit.setup;
1551
1531
  $.extend($.event.special.submit, {
@@ -1558,24 +1538,27 @@ $.extend($.event.special.submit, {
1558
1538
  return submitSetup.apply(this, arguments);
1559
1539
  }
1560
1540
  });
1561
-
1562
- $(window).on('invalid', $.noop);
1541
+ webshims.ready('form-shim-extend2 WINDOWLOAD', function(){
1542
+ $(window).on('invalid', $.noop);
1543
+ });
1563
1544
 
1564
1545
 
1565
1546
  webshims.addInputType('email', {
1566
1547
  mismatch: (function(){
1567
1548
  //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
1568
1549
  var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
1569
- return function(val){
1570
- // optional punycode support: https://github.com/bestiejs/punycode.js
1571
- if(window.punycode && punycode.toASCII){
1572
- try {
1573
- if( test.test(punycode.toASCII(val)) ){
1574
- return false;
1575
- }
1576
- } catch(er){}
1550
+ var splitReg = /\s*,\s*/g;
1551
+ return function(val, input){
1552
+ var ret = false;
1553
+ val = $(input).prop('multiple') ? val.split(splitReg) : [val];
1554
+
1555
+ for(var i = 0; i < val.length; i++){
1556
+ if(!test.test(val[i])){
1557
+ ret = true;
1558
+ break;
1559
+ }
1577
1560
  }
1578
- return !test.test(val);
1561
+ return ret;
1579
1562
  };
1580
1563
  })()
1581
1564
  });
@@ -1737,106 +1720,184 @@ webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'requir
1737
1720
  },
1738
1721
  initAttr: Modernizr.localstorage //only if we have aria-support
1739
1722
  });
1723
+ webshims.defineNodeNamesBooleanProperty(['input'], 'multiple');
1740
1724
 
1741
- webshims.reflectProperties(['input'], ['pattern']);
1742
-
1743
-
1744
- if( !('maxLength' in document.createElement('textarea')) ){
1745
- var constrainMaxLength = (function(){
1746
- var timer;
1747
- var curLength = 0;
1748
- var lastElement = $([]);
1749
- var max = 1e9;
1750
- var constrainLength = function(){
1751
- var nowValue = lastElement.prop('value');
1752
- var nowLen = nowValue.length;
1753
- if(nowLen > curLength && nowLen > max){
1754
- nowLen = Math.max(curLength, max);
1755
- lastElement.prop('value', nowValue.substr(0, nowLen ));
1756
- }
1757
- curLength = nowLen;
1758
- };
1759
- var remove = function(){
1760
- clearTimeout(timer);
1761
- lastElement.unbind('.maxlengthconstraint');
1762
- };
1763
- return function(element, maxLength){
1764
- remove();
1765
- if(maxLength > -1){
1766
- max = maxLength;
1767
- curLength = $.prop(element, 'value').length;
1768
- lastElement = $(element);
1769
- lastElement.on({
1770
- 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
1771
- setTimeout(constrainLength, 0);
1772
- },
1773
- 'keyup.maxlengthconstraint': constrainLength,
1774
- 'blur.maxlengthconstraint': remove
1775
- });
1776
- timer = setInterval(constrainLength, 200);
1777
- }
1778
- };
1779
- })();
1780
-
1781
- constrainMaxLength.update = function(element, maxLength){
1782
- if($(element).is(':focus')){
1783
- if(!maxLength){
1784
- maxLength = $.prop(element, 'maxlength');
1785
- }
1786
- constrainMaxLength(element, maxLength);
1787
- }
1788
- };
1789
-
1790
- $(document).on('focusin', function(e){
1791
- var maxLength;
1792
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
1793
- constrainMaxLength(e.target, maxLength);
1794
- }
1795
- });
1725
+ if(webshims.bugs.bustedValidity){
1796
1726
 
1797
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
1727
+ webshims.defineNodeNameProperty('form', 'novalidate', {
1798
1728
  attr: {
1799
1729
  set: function(val){
1800
- this.setAttribute('maxlength', ''+val);
1801
- constrainMaxLength.update(this);
1730
+ webshims.data(this, 'bustedNoValidate', ''+val);
1802
1731
  },
1803
1732
  get: function(){
1804
- var ret = this.getAttribute('maxlength');
1733
+ var ret = webshims.data(this, 'bustedNoValidate');
1805
1734
  return ret == null ? undefined : ret;
1806
1735
  }
1807
1736
  },
1808
- prop: {
1809
- set: function(val){
1810
- if(isNumber(val)){
1811
- if(val < 0){
1812
- throw('INDEX_SIZE_ERR');
1813
- }
1814
- val = parseInt(val, 10);
1815
- this.setAttribute('maxlength', val);
1816
- constrainMaxLength.update(this, val);
1817
- return;
1818
- }
1819
- this.setAttribute('maxlength', '0');
1820
- constrainMaxLength.update(this, 0);
1737
+ removeAttr: {
1738
+ value: function(){
1739
+ webshims.data(this, 'bustedNoValidate', null);
1740
+ }
1741
+ }
1742
+ });
1743
+
1744
+ $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
1745
+ validityRules[name] = function(elem){
1746
+ return (elem[0].validity || {})[name] || false;
1747
+ };
1748
+ });
1749
+
1750
+ }
1751
+
1752
+ webshims.defineNodeNameProperty('form', 'noValidate', {
1753
+ prop: {
1754
+ set: function(val){
1755
+ val = !!val;
1756
+ if(val){
1757
+ $.attr(this, 'novalidate', 'novalidate');
1758
+ } else {
1759
+ $(this).removeAttr('novalidate');
1760
+ }
1761
+ },
1762
+ get: function(){
1763
+ return $.attr(this, 'novalidate') != null;
1764
+ }
1765
+ }
1766
+ });
1767
+
1768
+ if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
1769
+ (function(){
1770
+
1771
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
1772
+ fixInputTypes = {
1773
+ date: 1,
1774
+ time: 1,
1775
+ month: 1,
1776
+ week: 1,
1777
+ "datetime-local": 1
1821
1778
  },
1822
- get: function(){
1823
- var val = this.getAttribute('maxlength');
1824
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
1779
+ noFocusEvents = {
1780
+ focusout: 1,
1781
+ blur: 1
1782
+ },
1783
+ changeEvts = {
1784
+ updateInput: 1,
1785
+ change: 1
1786
+ },
1787
+ observe = function(input){
1788
+ var timer,
1789
+ focusedin = true,
1790
+ lastInputVal = input.prop('value'),
1791
+ lastChangeVal = lastInputVal,
1792
+ trigger = function(e){
1793
+ //input === null
1794
+ if(!input){return;}
1795
+ var newVal = input.prop('value');
1796
+
1797
+ if(newVal !== lastInputVal){
1798
+ lastInputVal = newVal;
1799
+ if(!e || !noInputTriggerEvts[e.type]){
1800
+ input.trigger('input');
1801
+ }
1802
+ }
1803
+ if(e && changeEvts[e.type]){
1804
+ lastChangeVal = newVal;
1805
+ }
1806
+ if(!focusedin && newVal !== lastChangeVal){
1807
+ input.trigger('change');
1808
+ }
1809
+ },
1810
+ extraTimer,
1811
+ extraTest = function(){
1812
+ clearTimeout(extraTimer);
1813
+ extraTimer = setTimeout(trigger, 9);
1814
+ },
1815
+ unbind = function(e){
1816
+ clearInterval(timer);
1817
+ setTimeout(function(){
1818
+ if(e && noFocusEvents[e.type]){
1819
+ focusedin = false;
1820
+ }
1821
+ if(input){
1822
+ input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
1823
+ trigger();
1824
+ }
1825
+ input = null;
1826
+ }, 1);
1827
+
1828
+ }
1829
+ ;
1825
1830
 
1831
+ clearInterval(timer);
1832
+ timer = setInterval(trigger, 160);
1833
+ extraTest();
1834
+ input
1835
+ .off({
1836
+ 'focusout blur': unbind,
1837
+ 'input change updateInput': trigger
1838
+ })
1839
+ .on({
1840
+ 'focusout blur': unbind,
1841
+ 'input updateInput change': trigger
1842
+ })
1843
+ ;
1844
+ }
1845
+ ;
1846
+
1847
+
1848
+ $(document)
1849
+ .on('focusin', function(e){
1850
+ if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
1851
+ observe($(e.target));
1852
+ }
1853
+ })
1854
+ ;
1855
+
1856
+
1857
+ })();
1858
+ }
1859
+
1860
+ webshims.addReady(function(context, contextElem){
1861
+ //start constrain-validation
1862
+ var focusElem;
1863
+ $('form', context)
1864
+ .add(contextElem.filter('form'))
1865
+ .bind('invalid', $.noop)
1866
+ ;
1867
+
1868
+ try {
1869
+ if(context == document && !('form' in (document.activeElement || {}))) {
1870
+ focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
1871
+ if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
1872
+ focusElem.focus();
1826
1873
  }
1827
1874
  }
1828
- });
1829
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
1875
+ }
1876
+ catch (er) {}
1877
+
1878
+ });
1879
+
1880
+ if(!Modernizr.input.list){
1881
+ webshims.defineNodeNameProperty('datalist', 'options', {
1830
1882
  prop: {
1831
- set: function(val){
1832
- $.prop(this, 'maxlength', val);
1833
- },
1883
+ writeable: false,
1834
1884
  get: function(){
1835
- return $.prop(this, 'maxlength');
1885
+ var elem = this;
1886
+ var select = $('select', elem);
1887
+ var options;
1888
+ if(select[0]){
1889
+ options = $.makeArray(select[0].options || []);
1890
+ } else {
1891
+ options = $('option', elem).get();
1892
+ if(options.length){
1893
+ webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
1894
+ }
1895
+ }
1896
+ return options;
1836
1897
  }
1837
1898
  }
1838
1899
  });
1839
- }
1900
+ }
1840
1901
 
1841
1902
 
1842
1903
 
@@ -1994,1119 +2055,16 @@ switch(desc.proptype) {
1994
2055
 
1995
2056
  webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors);
1996
2057
 
2058
+ }); //webshims.ready end
1997
2059
 
1998
- if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
1999
- webshims.defineNodeNameProperty('form', 'novalidate', {
2000
- attr: {
2001
- set: function(val){
2002
- this.setAttribute('novalidate', ''+val);
2003
- },
2004
- get: function(){
2005
- var ret = this.getAttribute('novalidate');
2006
- return ret == null ? undefined : ret;
2007
- }
2008
- }
2009
- });
2010
- } else if(webshims.bugs.bustedValidity){
2011
-
2012
- webshims.defineNodeNameProperty('form', 'novalidate', {
2013
- attr: {
2014
- set: function(val){
2015
- webshims.data(this, 'bustedNoValidate', ''+val);
2016
- },
2017
- get: function(){
2018
- var ret = webshims.data(this, 'bustedNoValidate');
2019
- return ret == null ? undefined : ret;
2020
- }
2021
- },
2022
- removeAttr: {
2023
- value: function(){
2024
- webshims.data(this, 'bustedNoValidate', null);
2025
- }
2026
- }
2027
- });
2060
+ webshims.register('form-message', function($, webshims, window, document, undefined, options){
2061
+ "use strict";
2062
+ if(options.lazyCustomMessages){
2063
+ options.customMessages = true;
2064
+ }
2065
+ var validityMessages = webshims.validityMessages;
2028
2066
 
2029
- $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){
2030
- validityRules[name] = function(elem){
2031
- return (elem[0].validity || {})[name] || false;
2032
- };
2033
- });
2034
-
2035
- }
2036
-
2037
- webshims.defineNodeNameProperty('form', 'noValidate', {
2038
- prop: {
2039
- set: function(val){
2040
- val = !!val;
2041
- if(val){
2042
- $.attr(this, 'novalidate', 'novalidate');
2043
- } else {
2044
- $(this).removeAttr('novalidate');
2045
- }
2046
- },
2047
- get: function(){
2048
- return $.attr(this, 'novalidate') != null;
2049
- }
2050
- }
2051
- });
2052
-
2053
- if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){
2054
- (function(){
2055
-
2056
- var noInputTriggerEvts = {updateInput: 1, input: 1},
2057
- fixInputTypes = {
2058
- date: 1,
2059
- time: 1,
2060
- month: 1,
2061
- week: 1,
2062
- "datetime-local": 1
2063
- },
2064
- noFocusEvents = {
2065
- focusout: 1,
2066
- blur: 1
2067
- },
2068
- changeEvts = {
2069
- updateInput: 1,
2070
- change: 1
2071
- },
2072
- observe = function(input){
2073
- var timer,
2074
- focusedin = true,
2075
- lastInputVal = input.prop('value'),
2076
- lastChangeVal = lastInputVal,
2077
- trigger = function(e){
2078
- //input === null
2079
- if(!input){return;}
2080
- var newVal = input.prop('value');
2081
-
2082
- if(newVal !== lastInputVal){
2083
- lastInputVal = newVal;
2084
- if(!e || !noInputTriggerEvts[e.type]){
2085
- input.trigger('input');
2086
- }
2087
- }
2088
- if(e && changeEvts[e.type]){
2089
- lastChangeVal = newVal;
2090
- }
2091
- if(!focusedin && newVal !== lastChangeVal){
2092
- input.trigger('change');
2093
- }
2094
- },
2095
- extraTimer,
2096
- extraTest = function(){
2097
- clearTimeout(extraTimer);
2098
- extraTimer = setTimeout(trigger, 9);
2099
- },
2100
- unbind = function(e){
2101
- clearInterval(timer);
2102
- setTimeout(function(){
2103
- if(e && noFocusEvents[e.type]){
2104
- focusedin = false;
2105
- }
2106
- if(input){
2107
- input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger);
2108
- trigger();
2109
- }
2110
- input = null;
2111
- }, 1);
2112
-
2113
- }
2114
- ;
2115
-
2116
- clearInterval(timer);
2117
- timer = setInterval(trigger, 160);
2118
- extraTest();
2119
- input
2120
- .off({
2121
- 'focusout blur': unbind,
2122
- 'input change updateInput': trigger
2123
- })
2124
- .on({
2125
- 'focusout blur': unbind,
2126
- 'input updateInput change': trigger
2127
- })
2128
- ;
2129
- }
2130
- ;
2131
-
2132
-
2133
- $(document)
2134
- .on('focusin', function(e){
2135
- if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){
2136
- observe($(e.target));
2137
- }
2138
- })
2139
- ;
2140
-
2141
-
2142
- })();
2143
- }
2144
-
2145
- webshims.addReady(function(context, contextElem){
2146
- //start constrain-validation
2147
- var focusElem;
2148
- $('form', context)
2149
- .add(contextElem.filter('form'))
2150
- .bind('invalid', $.noop)
2151
- ;
2152
-
2153
- try {
2154
- if(context == document && !('form' in (document.activeElement || {}))) {
2155
- focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0];
2156
- if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) {
2157
- focusElem.focus();
2158
- }
2159
- }
2160
- }
2161
- catch (er) {}
2162
-
2163
- });
2164
-
2165
- if(!Modernizr.input.list){
2166
- webshims.defineNodeNameProperty('datalist', 'options', {
2167
- prop: {
2168
- writeable: false,
2169
- get: function(){
2170
- var elem = this;
2171
- var select = $('select', elem);
2172
- var options;
2173
- if(select[0]){
2174
- options = select[0].options;
2175
- } else {
2176
- options = $('option', elem).get();
2177
- if(options.length){
2178
- webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
2179
- }
2180
- }
2181
- return options;
2182
- }
2183
- }
2184
- });
2185
-
2186
- webshims.ready('form-datalist', function(){
2187
- webshims.defineNodeNameProperties('input', {
2188
- list: {
2189
- attr: {
2190
- get: function(){
2191
- var val = webshims.contentAttr(this, 'list');
2192
- return (val == null) ? undefined : val;
2193
- },
2194
- set: function(value){
2195
- var elem = this;
2196
- webshims.contentAttr(elem, 'list', value);
2197
- webshims.objectCreate(options.shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
2198
- $(elem).triggerHandler('listdatalistchange');
2199
- }
2200
- },
2201
- initAttr: true,
2202
- reflect: true,
2203
- propType: 'element',
2204
- propNodeName: 'datalist'
2205
- }
2206
- });
2207
- });
2208
-
2209
- }
2210
-
2211
- if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){
2212
- (function(){
2213
- (function(prop, undefined){
2214
- $.prop = function(elem, name, value){
2215
- var ret;
2216
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
2217
- ret = document.getElementsByName(name);
2218
- if(!ret || !ret.length){
2219
- ret = document.getElementById(name);
2220
- }
2221
- if(ret){
2222
- ret = $(ret).filter(function(){
2223
- return $.prop(this, 'form') == elem;
2224
- }).get();
2225
- if(ret.length){
2226
- return ret.length == 1 ? ret[0] : ret;
2227
- }
2228
- }
2229
- }
2230
- return prop.apply(this, arguments);
2231
- };
2232
- })($.prop, undefined);
2233
- var removeAddedElements = function(form){
2234
- var elements = $.data(form, 'webshimsAddedElements');
2235
- if(elements){
2236
- elements.remove();
2237
- $.removeData(form, 'webshimsAddedElements');
2238
- }
2239
- };
2240
-
2241
-
2242
- if(!Modernizr.formattribute){
2243
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
2244
- prop: {
2245
- get: function(){
2246
- var form = webshims.contentAttr(this, 'form');
2247
- if(form){
2248
- form = document.getElementById(form);
2249
- if(form && !$.nodeName(form, 'form')){
2250
- form = null;
2251
- }
2252
- }
2253
- return form || this.form;
2254
- },
2255
- writeable: false
2256
- }
2257
- });
2258
-
2259
-
2260
- webshims.defineNodeNamesProperty(['form'], 'elements', {
2261
- prop: {
2262
- get: function(){
2263
- var id = this.id;
2264
- var elements = $.makeArray(this.elements);
2265
- if(id){
2266
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
2267
- }
2268
- return elements;
2269
- },
2270
- writeable: false
2271
- }
2272
- });
2273
-
2274
-
2275
-
2276
- $(function(){
2277
- var stopPropagation = function(e){
2278
- e.stopPropagation();
2279
- };
2280
- $(document).on('submit', function(e){
2281
-
2282
- if(!e.isDefaultPrevented()){
2283
- var form = e.target;
2284
- var id = form.id;
2285
- var elements;
2286
-
2287
-
2288
- if(id){
2289
- removeAddedElements(form);
2290
-
2291
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
2292
- .filter(function(){
2293
- return !this.disabled && this.name && this.form != form;
2294
- })
2295
- .clone()
2296
- ;
2297
- if(elements.length){
2298
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
2299
- setTimeout(function(){
2300
- removeAddedElements(form);
2301
- }, 9);
2302
- }
2303
- elements = null;
2304
- }
2305
- }
2306
- });
2307
-
2308
- $(document).on('click', function(e){
2309
- if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){
2310
- var trueForm = $.prop(e.target, 'form');
2311
- var formIn = e.target.form;
2312
- var clone;
2313
- if(trueForm && trueForm != formIn){
2314
- clone = $(e.target)
2315
- .clone()
2316
- .removeAttr('form')
2317
- .addClass('webshims-visual-hide')
2318
- .on('click', stopPropagation)
2319
- .appendTo(trueForm)
2320
- ;
2321
- if(formIn){
2322
- e.preventDefault();
2323
- }
2324
- addSubmitBubbles(trueForm);
2325
- clone.trigger('click');
2326
- setTimeout(function(){
2327
- clone.remove();
2328
- clone = null;
2329
- }, 9);
2330
- }
2331
- }
2332
- });
2333
- });
2334
- }
2335
-
2336
- if(!Modernizr.fieldsetdisabled){
2337
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
2338
- prop: {
2339
- get: function(){
2340
- //add listed elements without keygen, object, output
2341
- return $('input, select, textarea, button, fieldset', this).get() || [];
2342
- },
2343
- writeable: false
2344
- }
2345
- });
2346
- }
2347
-
2348
- if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
2349
- var rCRLF = /\r?\n/g,
2350
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
2351
- rselectTextarea = /^(?:select|textarea)/i;
2352
- $.fn.serializeArray = function() {
2353
- return this.map(function(){
2354
- var elements = $.prop(this, 'elements');
2355
- return elements ? $.makeArray( elements ) : this;
2356
- })
2357
- .filter(function(){
2358
- return this.name && !this.disabled &&
2359
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
2360
- rinput.test( this.type ) );
2361
- })
2362
- .map(function( i, elem ){
2363
- var val = $( this ).val();
2364
-
2365
- return val == null ?
2366
- null :
2367
- $.isArray( val ) ?
2368
- $.map( val, function( val, i ){
2369
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
2370
- }) :
2371
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
2372
- }).get();
2373
- };
2374
- }
2375
-
2376
- })();
2377
- }
2378
-
2379
- if($('<input />').prop('labels') == null){
2380
- webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
2381
- prop: {
2382
- get: function(){
2383
- if(this.type == 'hidden'){return null;}
2384
- var id = this.id;
2385
- var labels = $(this)
2386
- .closest('label')
2387
- .filter(function(){
2388
- var hFor = (this.attributes['for'] || {});
2389
- return (!hFor.specified || hFor.value == id);
2390
- })
2391
- ;
2392
-
2393
- if(id) {
2394
- labels = labels.add('label[for="'+ id +'"]');
2395
- }
2396
- return labels.get();
2397
- },
2398
- writeable: false
2399
- }
2400
- });
2401
- }
2402
-
2403
- if(!('value' in document.createElement('progress'))){
2404
- (function(){
2405
-
2406
- var nan = parseInt('NaN', 10);
2407
-
2408
- var updateProgress = function(progress){
2409
- var position;
2410
-
2411
-
2412
- position = $.prop(progress, 'position');
2413
-
2414
- $.attr(progress, 'data-position', position);
2415
- $('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
2416
- };
2417
- var desc = {
2418
- position: {
2419
- prop: {
2420
- get: function(){
2421
- var max;
2422
- //jQuery 1.8.x try's to normalize "0" to 0
2423
- var val = this.getAttribute('value');
2424
- var ret = -1;
2425
-
2426
- val = val ? (val * 1) : nan;
2427
- if(!isNaN(val)){
2428
- max = $.prop(this, 'max');
2429
- ret = Math.max(Math.min(val / max, 1), 0);
2430
- if(updateProgress.isInChange){
2431
- $.attr(this, 'aria-valuenow', ret * 100);
2432
- if(updateProgress.isInChange == 'max'){
2433
- $.attr(this, 'aria-valuemax', max);
2434
- }
2435
- }
2436
- } else if(updateProgress.isInChange) {
2437
- $(this).removeAttr('aria-valuenow');
2438
- }
2439
- return ret;
2440
- },
2441
- writeable: false
2442
- }
2443
- }
2444
- };
2445
-
2446
- $.each({value: 0, max: 1}, function(name, defValue){
2447
- var removeProp = (name == 'value' && !$.fn.finish);
2448
- desc[name] = {
2449
- attr: {
2450
- set: function(value){
2451
- var ret = desc[name].attr._supset.call(this, value);
2452
- updateProgress.isInChange = name;
2453
- updateProgress(this);
2454
- updateProgress.isInChange = false;
2455
- return ret;
2456
- }
2457
- },
2458
- removeAttr: {
2459
- value: function(){
2460
- this.removeAttribute(name);
2461
- if(removeProp){
2462
- try {
2463
- delete this.value;
2464
- } catch(er){}
2465
- }
2466
- updateProgress.isInChange = name;
2467
- updateProgress(this);
2468
- updateProgress.isInChange = false;
2469
- }
2470
- },
2471
- prop: {
2472
- get: function(){
2473
- var max;
2474
- var ret = (desc[name].attr.get.call(this) * 1);
2475
- if(ret < 0 || isNaN(ret)){
2476
- ret = defValue;
2477
- } else if(name == 'value'){
2478
- ret = Math.min(ret, $.prop(this, 'max'));
2479
- } else if(ret === 0){
2480
- ret = defValue;
2481
- }
2482
- return ret;
2483
- },
2484
- set: function(value){
2485
- value = value * 1;
2486
- if(isNaN(value)){
2487
- webshims.error('Floating-point value is not finite.');
2488
- }
2489
- return desc[name].attr.set.call(this, value);
2490
- }
2491
- }
2492
- };
2493
- });
2494
-
2495
- webshims.createElement(
2496
- 'progress',
2497
- function(){
2498
- var labels = $(this)
2499
- .attr({role: 'progressbar', 'aria-valuemin': '0'})
2500
- .html('<span class="progress-value" />')
2501
- .jProp('labels')
2502
- .map(function(){
2503
- return webshims.getID(this);
2504
- })
2505
- .get()
2506
- ;
2507
- if(labels.length){
2508
- $.attr(this, 'aria-labelledby', labels.join(' '));
2509
- } else {
2510
- webshims.info("you should use label elements for your prgogress elements");
2511
- }
2512
-
2513
- updateProgress.isInChange = 'max';
2514
- updateProgress(this);
2515
- updateProgress.isInChange = false;
2516
- },
2517
- desc
2518
- );
2519
-
2520
- })();
2521
- }
2522
-
2523
- try {
2524
- document.querySelector(':checked');
2525
- } catch(er){
2526
- (function(){
2527
- $('html').addClass('no-csschecked');
2528
- var checkInputs = {
2529
- radio: 1,
2530
- checkbox: 1
2531
- };
2532
- var selectChange = function(){
2533
- var options = this.options || [];
2534
- var i, len, option;
2535
- for(i = 0, len = options.length; i < len; i++){
2536
- option = $(options[i]);
2537
- option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
2538
- }
2539
- };
2540
- var checkChange = function(){
2541
- var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
2542
- var className = this.className || '';
2543
- var parent;
2544
-
2545
- //IE8- has problems to update styles, we help
2546
- if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
2547
- $(this)[fn]('prop-checked');
2548
- if((parent = this.parentNode)){
2549
- parent.className = parent.className;
2550
- }
2551
- }
2552
- };
2553
-
2554
-
2555
- webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
2556
- webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
2557
- webshims.onNodeNamesPropertyModify('option', 'selected', function(){
2558
- $(this).closest('select').each(selectChange);
2559
- });
2560
- webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
2561
- var type = this.type;
2562
- if(type == 'radio' && boolVal){
2563
- getGroupElements(this).each(checkChange);
2564
- } else if(checkInputs[type]) {
2565
- $(this).each(checkChange);
2566
- }
2567
- });
2568
-
2569
- $(document).on('change', function(e){
2570
-
2571
- if(checkInputs[e.target.type]){
2572
- if(e.target.type == 'radio'){
2573
- getGroupElements(e.target).each(checkChange);
2574
- } else {
2575
- $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
2576
- }
2577
- } else if(e.target.nodeName.toLowerCase() == 'select'){
2578
- $(e.target).each(selectChange);
2579
- }
2580
- });
2581
-
2582
- webshims.addReady(function(context, contextElem){
2583
- $('option, input', context)
2584
- .add(contextElem.filter('option, input'))
2585
- .each(function(){
2586
- var prop;
2587
- if(checkInputs[this.type]){
2588
- prop = 'checked';
2589
- } else if(this.nodeName.toLowerCase() == 'option'){
2590
- prop = 'selected';
2591
- }
2592
- if(prop){
2593
- $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
2594
- }
2595
-
2596
- })
2597
- ;
2598
- });
2599
- })();
2600
- }
2601
-
2602
- (function(){
2603
- var bustedPlaceholder;
2604
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
2605
- if(Modernizr.input.placeholder && options.overridePlaceholder){
2606
- bustedPlaceholder = true;
2607
- }
2608
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
2609
- (function(){
2610
- var ua = navigator.userAgent;
2611
-
2612
- if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
2613
- $(window).on('orientationchange', (function(){
2614
- var timer;
2615
- var retVal = function(i, value){
2616
- return value;
2617
- };
2618
-
2619
- var set = function(){
2620
- $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
2621
- };
2622
- return function(e){
2623
- clearTimeout(timer);
2624
- timer = setTimeout(set, 9);
2625
- };
2626
- })());
2627
- }
2628
- })();
2629
-
2630
- //abort
2631
- return;
2632
- }
2633
-
2634
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
2635
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
2636
- var polyfillElements = ['textarea'];
2637
- var debug = webshims.debug !== false;
2638
- if(!Modernizr.input.placeholder || bustedPlaceholder){
2639
- polyfillElements.push('input');
2640
- }
2641
-
2642
- var setSelection = function(elem){
2643
- try {
2644
- if(elem.setSelectionRange){
2645
- elem.setSelectionRange(0, 0);
2646
- return true;
2647
- } else if(elem.createTextRange){
2648
- var range = elem.createTextRange();
2649
- range.collapse(true);
2650
- range.moveEnd('character', 0);
2651
- range.moveStart('character', 0);
2652
- range.select();
2653
- return true;
2654
- }
2655
- } catch(er){}
2656
- };
2657
-
2658
- var hidePlaceholder = function(elem, data, value, _onFocus){
2659
- if(value === false){
2660
- value = $.prop(elem, 'value');
2661
- }
2662
-
2663
- if(!isOver && elem.type != 'password'){
2664
- if(!value && _onFocus && setSelection(elem)){
2665
- var selectTimer = setTimeout(function(){
2666
- setSelection(elem);
2667
- }, 9);
2668
- $(elem)
2669
- .off('.placeholderremove')
2670
- .on({
2671
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
2672
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
2673
- elem.value = $.prop(elem, 'value');
2674
- data.box.removeClass('placeholder-visible');
2675
- clearTimeout(selectTimer);
2676
- $(elem).unbind('.placeholderremove');
2677
- },
2678
- 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
2679
- setSelection(elem);
2680
- clearTimeout(selectTimer);
2681
- selectTimer = setTimeout(function(){
2682
- setSelection(elem);
2683
- }, 9);
2684
- },
2685
- 'blur.placeholderremove': function(){
2686
- clearTimeout(selectTimer);
2687
- $(elem).unbind('.placeholderremove');
2688
- }
2689
- })
2690
- ;
2691
- return;
2692
- } else if(!_onFocus && !value && elem.value){ //especially on submit
2693
- elem.value = value;
2694
- }
2695
- } else if(!value && _onFocus){
2696
- $(elem)
2697
- .off('.placeholderremove')
2698
- .on({
2699
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
2700
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
2701
- data.box.removeClass('placeholder-visible');
2702
- $(elem).unbind('.placeholderremove');
2703
- },
2704
- 'blur.placeholderremove': function(){
2705
- $(elem).unbind('.placeholderremove');
2706
- }
2707
- })
2708
- ;
2709
- return;
2710
- }
2711
- data.box.removeClass('placeholder-visible');
2712
- },
2713
- showPlaceholder = function(elem, data, placeholderTxt){
2714
- if(placeholderTxt === false){
2715
- placeholderTxt = $.prop(elem, 'placeholder');
2716
- }
2717
-
2718
- if(!isOver && elem.type != 'password'){
2719
- elem.value = placeholderTxt;
2720
- }
2721
- data.box.addClass('placeholder-visible');
2722
- },
2723
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
2724
- if(!data){
2725
- data = $.data(elem, 'placeHolder');
2726
- if(!data){return;}
2727
- }
2728
- var isVisible = $(elem).hasClass('placeholder-visible');
2729
- if(placeholderTxt === false){
2730
- placeholderTxt = $.attr(elem, 'placeholder') || '';
2731
- }
2732
-
2733
- $(elem).unbind('.placeholderremove');
2734
-
2735
- if(value === false){
2736
- value = $.prop(elem, 'value');
2737
- }
2738
-
2739
- if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
2740
- if(elem.type == 'password' || isOver || isVisible){
2741
- hidePlaceholder(elem, data, '', true);
2742
- }
2743
- return;
2744
- }
2745
-
2746
- if(value){
2747
- hidePlaceholder(elem, data, value);
2748
- return;
2749
- }
2750
-
2751
- if(placeholderTxt && !value){
2752
- showPlaceholder(elem, data, placeholderTxt);
2753
- } else {
2754
- hidePlaceholder(elem, data, value);
2755
- }
2756
- },
2757
- hasLabel = function(elem){
2758
- elem = $(elem);
2759
- return !!(elem.prop('title') || elem.attr('aria-labelledby') || elem.attr('aria-label') || elem.jProp('labels').length);
2760
- },
2761
- createPlaceholder = function(elem){
2762
- elem = $(elem);
2763
- return $( hasLabel(elem) ? '<span class="placeholder-text"></span>' : '<label for="'+ elem.prop('id') +'" class="placeholder-text"></label>');
2764
- },
2765
- pHolder = (function(){
2766
- var delReg = /\n|\r|\f|\t/g,
2767
- allowedPlaceholder = {
2768
- text: 1,
2769
- search: 1,
2770
- url: 1,
2771
- email: 1,
2772
- password: 1,
2773
- tel: 1,
2774
- number: 1
2775
- }
2776
- ;
2777
-
2778
- if(modules["form-number-date-ui"].loaded){
2779
- delete allowedPlaceholder.number;
2780
- }
2781
-
2782
- return {
2783
- create: function(elem){
2784
- var data = $.data(elem, 'placeHolder');
2785
- var form;
2786
- var responsiveElem;
2787
- if(data){return data;}
2788
- data = $.data(elem, 'placeHolder', {});
2789
-
2790
- $(elem).on('focus.placeholder blur.placeholder', function(e){
2791
- changePlaceholderVisibility(this, false, false, data, e.type );
2792
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
2793
- });
2794
-
2795
- if((form = $.prop(elem, 'form'))){
2796
- $(elem).onWSOff('reset.placeholder', function(e){
2797
- setTimeout(function(){
2798
- changePlaceholderVisibility(elem, false, false, data, e.type );
2799
- }, 0);
2800
- }, false, form);
2801
- }
2802
-
2803
- if(elem.type == 'password' || isOver){
2804
- data.text = createPlaceholder(elem);
2805
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
2806
- responsiveElem = true;
2807
- data.box = data.text;
2808
- } else {
2809
- data.box = $(elem)
2810
- .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
2811
- .parent()
2812
- ;
2813
- }
2814
- data.text
2815
- .insertAfter(elem)
2816
- .on('mousedown.placeholder', function(){
2817
- changePlaceholderVisibility(this, false, false, data, 'focus');
2818
- try {
2819
- setTimeout(function(){
2820
- elem.focus();
2821
- }, 0);
2822
- } catch(e){}
2823
- return false;
2824
- })
2825
- ;
2826
-
2827
-
2828
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
2829
- var prop = $.css(elem, style);
2830
- if(data.text.css(style) != prop){
2831
- data.text.css(style, prop);
2832
- }
2833
- });
2834
- $.each(['Left', 'Top'], function(i, side){
2835
- 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);
2836
- data.text.css('padding'+ side, size);
2837
- });
2838
-
2839
- $(elem)
2840
- .onWSOff('updateshadowdom', function(){
2841
- var height, width;
2842
- if((width = elem.offsetWidth) || (height = elem.offsetHeight)){
2843
- data.text
2844
- .css({
2845
- width: width,
2846
- height: height
2847
- })
2848
- .css($(elem).position())
2849
- ;
2850
- }
2851
- }, true)
2852
- ;
2853
-
2854
- } else {
2855
- var reset = function(e){
2856
- if($(elem).hasClass('placeholder-visible')){
2857
- hidePlaceholder(elem, data, '');
2858
-
2859
- setTimeout(function(){
2860
- if(!e || e.type != 'submit' || e.isDefaultPrevented()){
2861
- changePlaceholderVisibility(elem, false, false, data );
2862
- }
2863
- }, 9);
2864
- }
2865
- };
2866
-
2867
- $(elem).onWSOff('beforeunload', reset, false, window);
2868
- data.box = $(elem);
2869
- if(form){
2870
- $(elem).onWSOff('submit', reset, false, form);
2871
- }
2872
- }
2873
-
2874
- return data;
2875
- },
2876
- update: function(elem, val){
2877
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
2878
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
2879
- webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
2880
- return;
2881
- }
2882
-
2883
-
2884
- var data = pHolder.create(elem);
2885
- if(data.text){
2886
- data.text.text(val);
2887
- }
2888
-
2889
- changePlaceholderVisibility(elem, false, val, data);
2890
- }
2891
- };
2892
- })()
2893
- ;
2894
-
2895
- $.webshims.publicMethods = {
2896
- pHolder: pHolder
2897
- };
2898
- polyfillElements.forEach(function(nodeName){
2899
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
2900
- attr: {
2901
- set: function(val){
2902
- var elem = this;
2903
- if(bustedPlaceholder){
2904
- webshims.data(elem, 'bustedPlaceholder', val);
2905
- elem.placeholder = '';
2906
- } else {
2907
- webshims.contentAttr(elem, 'placeholder', val);
2908
- }
2909
- pHolder.update(elem, val);
2910
- },
2911
- get: function(){
2912
- var placeholder;
2913
- if(bustedPlaceholder){
2914
- placeholder = webshims.data(this, 'bustedPlaceholder');
2915
- }
2916
- return placeholder || webshims.contentAttr(this, 'placeholder');
2917
- }
2918
- },
2919
- reflect: true,
2920
- initAttr: true
2921
- });
2922
- });
2923
-
2924
-
2925
- polyfillElements.forEach(function(name){
2926
- var placeholderValueDesc = {};
2927
- var desc;
2928
- ['attr', 'prop'].forEach(function(propType){
2929
- placeholderValueDesc[propType] = {
2930
- set: function(val){
2931
- var elem = this;
2932
- var placeholder;
2933
- if(bustedPlaceholder){
2934
- placeholder = webshims.data(elem, 'bustedPlaceholder');
2935
- }
2936
- if(!placeholder){
2937
- placeholder = webshims.contentAttr(elem, 'placeholder');
2938
- }
2939
- $.removeData(elem, 'cachedValidity');
2940
- var ret = desc[propType]._supset.call(elem, val);
2941
- if(placeholder && 'value' in elem){
2942
- changePlaceholderVisibility(elem, val, placeholder);
2943
- }
2944
- return ret;
2945
- },
2946
- get: function(){
2947
- var elem = this;
2948
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
2949
- }
2950
- };
2951
- });
2952
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
2953
- });
2954
-
2955
- })();
2956
-
2957
- (function(){
2958
- var doc = document;
2959
- if( 'value' in document.createElement('output') ){return;}
2960
-
2961
- webshims.defineNodeNameProperty('output', 'value', {
2962
- prop: {
2963
- set: function(value){
2964
- var setVal = $.data(this, 'outputShim');
2965
- if(!setVal){
2966
- setVal = outputCreate(this);
2967
- }
2968
- setVal(value);
2969
- },
2970
- get: function(){
2971
- return webshims.contentAttr(this, 'value') || $(this).text() || '';
2972
- }
2973
- }
2974
- });
2975
-
2976
-
2977
- webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
2978
- if(type == 'removeAttr'){return;}
2979
- var setVal = $.data(this, 'outputShim');
2980
- if(setVal){
2981
- setVal(value);
2982
- }
2983
- });
2984
-
2985
- var outputCreate = function(elem){
2986
- if(elem.getAttribute('aria-live')){return;}
2987
- elem = $(elem);
2988
- var value = (elem.text() || '').trim();
2989
- var id = elem.prop('id');
2990
- var htmlFor = elem.attr('for');
2991
- var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
2992
- var form = shim[0].form || doc;
2993
- var setValue = function(val){
2994
- shim[0].value = val;
2995
- val = shim[0].value;
2996
- elem.text(val);
2997
- webshims.contentAttr(elem[0], 'value', val);
2998
- };
2999
-
3000
- elem[0].defaultValue = value;
3001
- webshims.contentAttr(elem[0], 'value', value);
3002
-
3003
- elem.attr({'aria-live': 'polite'});
3004
- if(id){
3005
- shim.attr('id', id);
3006
- elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
3007
- return webshims.getID(this);
3008
- }).get().join(' '));
3009
- }
3010
- if(htmlFor){
3011
- id = webshims.getID(elem);
3012
- htmlFor.split(' ').forEach(function(control){
3013
- control = document.getElementById(control);
3014
- if(control){
3015
- control.setAttribute('aria-controls', id);
3016
- }
3017
- });
3018
- }
3019
- elem.data('outputShim', setValue );
3020
- shim.data('outputShim', setValue );
3021
- return setValue;
3022
- };
3023
-
3024
- webshims.addReady(function(context, contextElem){
3025
- $('output', context).add(contextElem.filter('output')).each(function(){
3026
- outputCreate(this);
3027
- });
3028
- });
3029
-
3030
- /*
3031
- * Implements input event in all browsers
3032
- */
3033
- (function(){
3034
- var noInputTriggerEvts = {updateInput: 1, input: 1},
3035
- noInputTypes = {
3036
- radio: 1,
3037
- checkbox: 1,
3038
- submit: 1,
3039
- button: 1,
3040
- image: 1,
3041
- reset: 1,
3042
- file: 1
3043
-
3044
- //pro forma
3045
- ,color: 1
3046
- //,range: 1
3047
- },
3048
- observe = function(input){
3049
- var timer,
3050
- lastVal = input.prop('value'),
3051
- trigger = function(e){
3052
- //input === null
3053
- if(!input){return;}
3054
- var newVal = input.prop('value');
3055
- if(newVal !== lastVal){
3056
- lastVal = newVal;
3057
- if(!e || !noInputTriggerEvts[e.type]){
3058
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
3059
- }
3060
- }
3061
- },
3062
- extraTimer,
3063
- extraTest = function(){
3064
- clearTimeout(extraTimer);
3065
- extraTimer = setTimeout(trigger, 9);
3066
- },
3067
- unbind = function(){
3068
- input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger);
3069
- clearInterval(timer);
3070
- setTimeout(function(){
3071
- trigger();
3072
- input = null;
3073
- }, 1);
3074
-
3075
- }
3076
- ;
3077
-
3078
- clearInterval(timer);
3079
- timer = setInterval(trigger, 200);
3080
- extraTest();
3081
- input.on({
3082
- 'keyup keypress keydown paste cut': extraTest,
3083
- focusout: unbind,
3084
- 'input updateInput change': trigger
3085
- });
3086
- }
3087
- ;
3088
-
3089
- $(doc)
3090
- .on('focusin', function(e){
3091
- if( e.target && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
3092
- observe($(e.target));
3093
- }
3094
- })
3095
- ;
3096
- })();
3097
- })();
3098
-
3099
- }); //webshims.ready end
3100
- }//end formvalidation
3101
-
3102
- webshims.register('form-message', function($, webshims, window, document, undefined, options){
3103
- "use strict";
3104
- if(options.lazyCustomMessages){
3105
- options.customMessages = true;
3106
- }
3107
- var validityMessages = webshims.validityMessages;
3108
-
3109
- var implementProperties = options.customMessages ? ['customValidationMessage'] : [];
2067
+ var implementProperties = options.customMessages ? ['customValidationMessage'] : [];
3110
2068
 
3111
2069
  validityMessages.en = $.extend(true, {
3112
2070
  typeMismatch: {
@@ -3367,12 +2325,12 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3367
2325
  /*
3368
2326
  * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
3369
2327
  */
3370
- webshims.propTypes.element = function(descs){
2328
+ webshims.propTypes.element = function(descs, name){
3371
2329
  webshims.createPropDefault(descs, 'attr');
3372
2330
  if(descs.prop){return;}
3373
2331
  descs.prop = {
3374
2332
  get: function(){
3375
- var elem = $.attr(this, 'list');
2333
+ var elem = $.attr(this, name);
3376
2334
  if(elem){
3377
2335
  elem = document.getElementById(elem);
3378
2336
  if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
@@ -3396,7 +2354,15 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3396
2354
  if(listSupport && !formsCFG.customDatalist){return;}
3397
2355
 
3398
2356
  var initializeDatalist = function(){
3399
-
2357
+
2358
+ var updateDatlistAndOptions = function(){
2359
+ var id;
2360
+ if(!$.data(this, 'datalistWidgetData') && (id = $.prop(this, 'id'))){
2361
+ $('input[list="'+ id +'"], input[data-wslist="'+ id +'"]').eq(0).attr('list', id);
2362
+ } else {
2363
+ $(this).triggerHandler('updateDatalist');
2364
+ }
2365
+ };
3400
2366
 
3401
2367
  var inputListProto = {
3402
2368
  //override autocomplete
@@ -3474,6 +2440,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3474
2440
  id: value,
3475
2441
  datalist: $.prop(elem, 'list')
3476
2442
  });
2443
+ elem.setAttribute('data-wslist', value);
3477
2444
  } else {
3478
2445
  elem.setAttribute('list', value);
3479
2446
  }
@@ -3485,6 +2452,27 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3485
2452
  propType: 'element',
3486
2453
  propNodeName: 'datalist'
3487
2454
  };
2455
+ } else {
2456
+ webshims.defineNodeNameProperties('input', {
2457
+ list: {
2458
+ attr: {
2459
+ get: function(){
2460
+ var val = webshims.contentAttr(this, 'list');
2461
+ return (val == null) ? undefined : val;
2462
+ },
2463
+ set: function(value){
2464
+ var elem = this;
2465
+ webshims.contentAttr(elem, 'list', value);
2466
+ webshims.objectCreate(options.shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
2467
+ $(elem).triggerHandler('listdatalistchange');
2468
+ }
2469
+ },
2470
+ initAttr: true,
2471
+ reflect: true,
2472
+ propType: 'element',
2473
+ propNodeName: 'datalist'
2474
+ }
2475
+ });
3488
2476
  }
3489
2477
 
3490
2478
  webshims.defineNodeNameProperties('input', inputListProto);
@@ -3493,9 +2481,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3493
2481
  contextElem
3494
2482
  .filter('datalist > select, datalist, datalist > option, datalist > select > option')
3495
2483
  .closest('datalist')
3496
- .each(function(){
3497
- $(this).triggerHandler('updateDatalist');
3498
- })
2484
+ .each(updateDatlistAndOptions)
3499
2485
  ;
3500
2486
  });
3501
2487
  };
@@ -3540,6 +2526,7 @@ webshims.register('form-datalist', function($, webshims, window, document, undef
3540
2526
  this.hasViewableData = true;
3541
2527
  this._autocomplete = $.attr(opts.input, 'autocomplete');
3542
2528
  $.data(opts.input, 'datalistWidget', this);
2529
+ $.data(datalist, 'datalistWidgetData', this);
3543
2530
 
3544
2531
  lazyLoad('WINDOWLOAD');
3545
2532