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
@@ -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