webshims-rails 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +253 -261
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +534 -534
  4. data/vendor/assets/javascripts/webshims/extras/mousepress.js +60 -60
  5. data/vendor/assets/javascripts/webshims/minified/extras/custom-validity.js +1 -10
  6. data/vendor/assets/javascripts/webshims/minified/extras/modernizr-custom.js +1 -20
  7. data/vendor/assets/javascripts/webshims/minified/extras/mousepress.js +1 -2
  8. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +1 -30
  9. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/canvas2png.js +1 -42
  10. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.js +1 -28
  11. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/flashcanvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/proxy.php +0 -0
  13. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvas/save.php +0 -0
  14. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/canvas2png.js +1 -42
  15. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  16. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  17. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/flashcanvas.js +1 -31
  18. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/proxy.php +0 -0
  19. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/save.php +0 -0
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +1 -38
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +1 -80
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +1 -45
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +1 -44
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +1 -28
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/14.js +1 -19
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +1 -10
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +1 -58
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +1 -66
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +1 -62
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +1 -64
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +1 -73
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -42
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +1 -54
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -57
  35. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +1 -70
  36. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +1 -80
  37. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +1 -60
  38. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +1 -79
  39. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +1 -101
  40. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +1 -95
  41. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +1 -27
  42. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +1 -34
  43. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +1 -56
  44. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +1 -33
  45. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +1 -40
  46. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +1 -39
  47. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +1 -65
  48. data/vendor/assets/javascripts/webshims/minified/shims/details.js +1 -5
  49. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +1 -23
  50. data/vendor/assets/javascripts/webshims/minified/shims/es5.js +1 -15
  51. data/vendor/assets/javascripts/webshims/minified/shims/excanvas.js +1 -21
  52. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +1 -19
  53. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +1 -22
  54. data/vendor/assets/javascripts/webshims/minified/shims/form-message.js +1 -8
  55. data/vendor/assets/javascripts/webshims/minified/shims/form-native-extend.js +1 -7
  56. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +1 -10
  57. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +1 -23
  58. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +1 -46
  59. data/vendor/assets/javascripts/webshims/minified/shims/geolocation.js +1 -5
  60. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ar.js +1 -7
  61. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ch-ZN.js +1 -3
  62. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  63. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-el.js +1 -7
  64. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  65. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-es.js +1 -3
  66. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-fr.js +1 -3
  67. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-he.js +1 -6
  68. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hi.js +1 -6
  69. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-hu.js +1 -3
  70. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-it.js +1 -3
  71. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ja.js +1 -4
  72. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-nl.js +1 -3
  73. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-pt-PT.js +1 -3
  74. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-ru.js +1 -8
  75. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-sv.js +1 -3
  76. data/vendor/assets/javascripts/webshims/minified/shims/json-storage.js +1 -14
  77. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/license.txt +0 -0
  78. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/player.swf +0 -0
  79. data/vendor/assets/javascripts/webshims/minified/shims/jwplayer/readme.html +0 -0
  80. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +1 -16
  81. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +1 -23
  82. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -3
  83. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -26
  84. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +1 -14
  85. data/vendor/assets/javascripts/webshims/minified/shims/range-ui.js +1 -0
  86. data/vendor/assets/javascripts/webshims/minified/shims/styles/details-arrows.png +0 -0
  87. data/vendor/assets/javascripts/webshims/minified/shims/styles/forms.png +0 -0
  88. data/vendor/assets/javascripts/webshims/minified/shims/styles/polyfill-loader.gif +0 -0
  89. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +1 -689
  90. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  91. data/vendor/assets/javascripts/webshims/minified/shims/swf/jwwebshims.swf +0 -0
  92. data/vendor/assets/javascripts/webshims/minified/shims/swf/localStorage.swf +0 -0
  93. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +1 -9
  94. data/vendor/assets/javascripts/webshims/minified/shims/track.js +1 -21
  95. data/vendor/assets/javascripts/webshims/polyfiller.js +1188 -1191
  96. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvas/README +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  98. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  99. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  100. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  101. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  102. data/vendor/assets/javascripts/webshims/{minified/shims → shims}/FlashCanvasPro/README +82 -82
  103. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  104. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  109. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1752 -1754
  110. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3311 -3247
  111. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1631 -1633
  112. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1697 -1636
  113. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1098 -1100
  114. data/vendor/assets/javascripts/webshims/shims/combos/14.js +477 -476
  115. data/vendor/assets/javascripts/webshims/shims/combos/15.js +317 -316
  116. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2155 -2095
  117. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2320 -2259
  118. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1326 -1322
  119. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2238 -2239
  120. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2341 -2339
  121. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1558 -1493
  122. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1734 -1733
  123. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2361 -2295
  124. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2332 -2269
  125. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2836 -2775
  126. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1549 -1489
  127. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2156 -2095
  128. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3313 -3248
  129. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3022 -3020
  130. data/vendor/assets/javascripts/webshims/shims/combos/4.js +771 -770
  131. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1027 -1025
  132. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1709 -1706
  133. data/vendor/assets/javascripts/webshims/shims/combos/6.js +387 -386
  134. data/vendor/assets/javascripts/webshims/shims/combos/7.js +643 -641
  135. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1547 -1488
  136. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2508 -2445
  137. data/vendor/assets/javascripts/webshims/shims/details.js +148 -148
  138. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +949 -952
  139. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  140. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  141. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -606
  142. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -681
  143. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -164
  144. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  145. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  146. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +2 -2
  147. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1568 -1569
  148. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  149. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  150. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  151. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  152. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  153. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  154. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  155. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  156. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  157. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  158. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  159. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  160. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  161. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  162. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  163. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  164. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  165. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  166. data/vendor/assets/javascripts/webshims/shims/jwplayer/license.txt +0 -0
  167. data/vendor/assets/javascripts/webshims/shims/jwplayer/player.swf +0 -0
  168. data/vendor/assets/javascripts/webshims/shims/jwplayer/readme.html +0 -0
  169. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +597 -536
  170. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +891 -860
  171. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  172. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +960 -957
  173. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  174. data/vendor/assets/javascripts/webshims/shims/range-ui.js +66 -0
  175. data/vendor/assets/javascripts/webshims/shims/styles/details-arrows.png +0 -0
  176. data/vendor/assets/javascripts/webshims/shims/styles/forms.png +0 -0
  177. data/vendor/assets/javascripts/webshims/shims/styles/polyfill-loader.gif +0 -0
  178. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +697 -689
  179. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  180. data/vendor/assets/javascripts/webshims/shims/swf/jwwebshims.swf +0 -0
  181. data/vendor/assets/javascripts/webshims/shims/swf/localStorage.swf +0 -0
  182. data/vendor/assets/javascripts/webshims/shims/track-ui.js +0 -0
  183. data/vendor/assets/javascripts/webshims/shims/track.js +0 -0
  184. metadata +6 -4
@@ -1,682 +1,682 @@
1
- jQuery.webshims.register('form-datalist', function($, webshims, window, document, undefined){
2
- "use strict";
3
- var doc = document;
4
-
5
- /*
6
- * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
7
- */
8
- webshims.propTypes.element = function(descs){
9
- webshims.createPropDefault(descs, 'attr');
10
- if(descs.prop){return;}
11
- descs.prop = {
12
- get: function(){
13
- var elem = descs.attr.get.call(this);
14
- if(elem){
15
- elem = document.getElementById(elem);
16
- if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
17
- elem = null;
18
- }
19
- }
20
- return elem || null;
21
- },
22
- writeable: false
23
- };
24
- };
25
-
26
-
27
- /*
28
- * Implements datalist element and list attribute
29
- */
30
-
31
- (function(){
32
- var formsCFG = $.webshims.cfg.forms;
33
- var listSupport = Modernizr.input.list;
34
- if(listSupport && !formsCFG.customDatalist){return;}
35
-
36
- var initializeDatalist = function(){
37
-
38
-
39
- if(!listSupport){
40
- webshims.defineNodeNameProperty('datalist', 'options', {
41
- prop: {
42
- writeable: false,
43
- get: function(){
44
- var elem = this;
45
- var select = $('select', elem);
46
- var options;
47
- if(select[0]){
48
- options = select[0].options;
49
- } else {
50
- options = $('option', elem).get();
51
- if(options.length){
52
- webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
53
- }
54
- }
55
- return options;
56
- }
57
- }
58
- });
59
- }
60
-
61
- var inputListProto = {
62
- //override autocomplete
63
- autocomplete: {
64
- attr: {
65
- get: function(){
66
- var elem = this;
67
- var data = $.data(elem, 'datalistWidget');
68
- if(data){
69
- return data._autocomplete;
70
- }
71
- return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
72
- },
73
- set: function(value){
74
- var elem = this;
75
- var data = $.data(elem, 'datalistWidget');
76
- if(data){
77
- data._autocomplete = value;
78
- if(value == 'off'){
79
- data.hideList();
80
- }
81
- } else {
82
- if('autocomplete' in elem){
83
- elem.autocomplete = value;
84
- } else {
85
- elem.setAttribute('autocomplete', value);
86
- }
87
- }
88
- }
89
- }
90
- }
91
- };
92
-
93
- // if(formsCFG.customDatalist && (!listSupport || !('selectedOption') in $('<input />')[0])){
94
- // //currently not supported x-browser (FF4 has not implemented and is not polyfilled )
95
- // inputListProto.selectedOption = {
96
- // prop: {
97
- // writeable: false,
98
- // get: function(){
99
- // var elem = this;
100
- // var list = $.prop(elem, 'list');
101
- // var ret = null;
102
- // var value, options;
103
- // if(!list){return ret;}
104
- // value = $.prop(elem, 'value');
105
- // if(!value){return ret;}
106
- // options = $.prop(list, 'options');
107
- // if(!options.length){return ret;}
108
- // $.each(options, function(i, option){
109
- // if(value == $.prop(option, 'value')){
110
- // ret = option;
111
- // return false;
112
- // }
113
- // });
114
- // return ret;
115
- // }
116
- // }
117
- // };
118
- // }
119
-
120
- if(!listSupport){
121
- inputListProto['list'] = {
122
- attr: {
123
- get: function(){
124
- var val = webshims.contentAttr(this, 'list');
125
- return (val == null) ? undefined : val;
126
- },
127
- set: function(value){
128
- var elem = this;
129
- webshims.contentAttr(elem, 'list', value);
130
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
131
- }
132
- },
133
- initAttr: true,
134
- reflect: true,
135
- propType: 'element',
136
- propNodeName: 'datalist'
137
- };
138
- } else {
139
- //options only return options, if option-elements are rooted: but this makes this part of HTML5 less backwards compatible
140
- if(!($('<datalist><select><option></option></select></datalist>').prop('options') || []).length ){
141
- webshims.defineNodeNameProperty('datalist', 'options', {
142
- prop: {
143
- writeable: false,
144
- get: function(){
145
- var options = this.options || [];
146
- if(!options.length){
147
- var elem = this;
148
- var select = $('select', elem);
149
- if(select[0] && select[0].options && select[0].options.length){
150
- options = select[0].options;
151
- }
152
- }
153
- return options;
154
- }
155
- }
156
- });
157
- }
158
- inputListProto['list'] = {
159
- attr: {
160
- get: function(){
161
- var val = webshims.contentAttr(this, 'list');
162
- if(val != null){
163
- this.removeAttribute('list');
164
- } else {
165
- val = $.data(this, 'datalistListAttr');
166
- }
167
-
168
- return (val == null) ? undefined : val;
169
- },
170
- set: function(value){
171
- var elem = this;
172
- $.data(elem, 'datalistListAttr', value);
173
- webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
174
- }
175
- },
176
- initAttr: true,
177
- reflect: true,
178
- propType: 'element',
179
- propNodeName: 'datalist'
180
- };
181
- }
182
-
183
-
184
- webshims.defineNodeNameProperties('input', inputListProto);
185
-
186
- if($.event.customEvent){
187
- $.event.customEvent.updateDatalist = true;
188
- $.event.customEvent.updateInput = true;
189
- $.event.customEvent.datalistselect = true;
190
- }
191
- webshims.addReady(function(context, contextElem){
192
- contextElem
193
- .filter('datalist > select, datalist, datalist > option, datalist > select > option')
194
- .closest('datalist')
195
- .triggerHandler('updateDatalist')
196
- ;
197
-
198
- });
199
-
200
-
201
- };
202
-
203
-
204
- /*
205
- * ShadowList
206
- */
207
- var listidIndex = 0;
208
-
209
- var noDatalistSupport = {
210
- submit: 1,
211
- button: 1,
212
- reset: 1,
213
- hidden: 1,
214
-
215
- //ToDo
216
- range: 1,
217
- date: 1
218
- };
219
- var lteie6 = ($.browser.msie && parseInt($.browser.version, 10) < 7);
220
- var globStoredOptions = {};
221
- var getStoredOptions = function(name){
222
- if(!name){return [];}
223
- if(globStoredOptions[name]){
224
- return globStoredOptions[name];
225
- }
226
- var data;
227
- try {
228
- data = JSON.parse(localStorage.getItem('storedDatalistOptions'+name));
229
- } catch(e){}
230
- globStoredOptions[name] = data || [];
231
- return data || [];
232
- };
233
- var storeOptions = function(name, val){
234
- if(!name){return;}
235
- val = val || [];
236
- try {
237
- localStorage.setItem( 'storedDatalistOptions'+name, JSON.stringify(val) );
238
- } catch(e){}
239
- };
240
-
241
- var getText = function(elem){
242
- return (elem.textContent || elem.innerText || $.text([ elem ]) || '');
243
- };
244
-
245
- var shadowListProto = {
246
- _create: function(opts){
247
-
248
- if(noDatalistSupport[$.prop(opts.input, 'type')]){return;}
249
- var datalist = opts.datalist;
250
- var data = $.data(opts.input, 'datalistWidget');
251
- if(datalist && data && data.datalist !== datalist){
252
- data.datalist = datalist;
253
- data.id = opts.id;
254
-
255
- data.shadowList.prop('className', 'datalist-polyfill '+ (data.datalist.className || '') + ' '+ data.datalist.id +'-shadowdom');
256
- if(formsCFG.positionDatalist){
257
- data.shadowList.insertAfter(opts.input);
258
- } else {
259
- data.shadowList.appendTo('body');
260
- }
261
- $(data.datalist)
262
- .off('updateDatalist.datalistWidget')
263
- .on('updateDatalist.datalistWidget', $.proxy(data, '_resetListCached'))
264
- ;
265
- data._resetListCached();
266
- return;
267
- } else if(!datalist){
268
- if(data){
269
- data.destroy();
270
- }
271
- return;
272
- } else if(data && data.datalist === datalist){
273
- return;
274
- }
275
- listidIndex++;
276
- var that = this;
277
- this.hideList = $.proxy(that, 'hideList');
278
- this.timedHide = function(){
279
- clearTimeout(that.hideTimer);
280
- that.hideTimer = setTimeout(that.hideList, 9);
281
- };
282
- this.datalist = datalist;
283
- this.id = opts.id;
284
- this.hasViewableData = true;
285
- this._autocomplete = $.attr(opts.input, 'autocomplete');
286
- $.data(opts.input, 'datalistWidget', this);
287
- this.shadowList = $('<div class="datalist-polyfill '+ (this.datalist.className || '') + ' '+ this.datalist.id +'-shadowdom' +'" />');
288
-
289
- if(formsCFG.positionDatalist || $(opts.input).hasClass('position-datalist')){
290
- this.shadowList.insertAfter(opts.input);
291
- } else {
292
- this.shadowList.appendTo('body');
293
- }
294
-
295
- this.index = -1;
296
- this.input = opts.input;
297
- this.arrayOptions = [];
298
-
299
- this.shadowList
300
- .delegate('li', 'mouseenter.datalistWidget mousedown.datalistWidget click.datalistWidget', function(e){
301
- var items = $('li:not(.hidden-item)', that.shadowList);
302
- var select = (e.type == 'mousedown' || e.type == 'click');
303
- that.markItem(items.index(e.currentTarget), select, items);
304
- if(e.type == 'click'){
305
- that.hideList();
306
- if(formsCFG.customDatalist){
307
- $(opts.input).trigger('datalistselect');
308
- }
309
- }
310
- return (e.type != 'mousedown');
311
- })
312
- .on('focusout', this.timedHide)
313
- ;
314
-
315
- opts.input.setAttribute('autocomplete', 'off');
316
-
317
- $(opts.input)
318
- .attr({
319
- //role: 'combobox',
320
- 'aria-haspopup': 'true'
321
- })
322
- .on({
323
- 'input.datalistWidget': function(){
324
- if(!that.triggeredByDatalist){
325
- that.changedValue = false;
326
- that.showHideOptions();
327
- }
328
- },
329
- 'keydown.datalistWidget': function(e){
330
- var keyCode = e.keyCode;
331
- var activeItem;
332
- var items;
333
- if(keyCode == 40 && !that.showList()){
334
- that.markItem(that.index + 1, true);
335
- return false;
336
- }
337
-
338
- if(!that.isListVisible){return;}
339
-
340
-
341
- if(keyCode == 38){
342
- that.markItem(that.index - 1, true);
343
- return false;
344
- }
345
- if(!e.shiftKey && (keyCode == 33 || keyCode == 36)){
346
- that.markItem(0, true);
347
- return false;
348
- }
349
- if(!e.shiftKey && (keyCode == 34 || keyCode == 35)){
350
- items = $('li:not(.hidden-item)', that.shadowList);
351
- that.markItem(items.length - 1, true, items);
352
- return false;
353
- }
354
- if(keyCode == 13 || keyCode == 27){
355
- if (keyCode == 13){
356
- activeItem = $('li.active-item:not(.hidden-item)', that.shadowList);
357
- that.changeValue( $('li.active-item:not(.hidden-item)', that.shadowList) );
358
- }
359
- that.hideList();
360
- if(formsCFG.customDatalist && activeItem && activeItem[0]){
361
- $(opts.input).trigger('datalistselect');
362
- }
363
- return false;
364
- }
365
- },
366
- 'focus.datalistWidget': function(){
367
- if($(this).hasClass('list-focus')){
368
- that.showList();
369
- }
370
- },
371
- 'mousedown.datalistWidget': function(){
372
- if($(this).is(':focus')){
373
- that.showList();
374
- }
375
- },
376
- 'blur.datalistWidget': this.timedHide
377
- })
378
- ;
379
-
380
-
381
- $(this.datalist)
382
- .off('updateDatalist.datalistWidget')
383
- .on('updateDatalist.datalistWidget', $.proxy(this, '_resetListCached'))
384
- ;
385
-
386
- this._resetListCached();
387
-
388
- if(opts.input.form && (opts.input.name || opts.input.id)){
389
- $(opts.input.form).on('submit.datalistWidget'+opts.input.id, function(){
390
- if(!$(opts.input).hasClass('no-datalist-cache') && that._autocomplete != 'off'){
391
- var val = $.prop(opts.input, 'value');
392
- var name = (opts.input.name || opts.input.id) + $.prop(opts.input, 'type');
393
- if(!that.storedOptions){
394
- that.storedOptions = getStoredOptions( name );
395
- }
396
- if(val && that.storedOptions.indexOf(val) == -1){
397
- that.storedOptions.push(val);
398
- storeOptions(name, that.storedOptions );
399
- }
400
- }
401
- });
402
- }
403
- $(window).on('unload.datalist'+this.id+' beforeunload.datalist'+this.id, function(){
404
- that.destroy();
405
- });
406
- },
407
- destroy: function(){
408
- var autocomplete = $.attr(this.input, 'autocomplete');
409
- $(this.input)
410
- .off('.datalistWidget')
411
- .removeData('datalistWidget')
412
- ;
413
- this.shadowList.remove();
414
- $(document).off('.datalist'+this.id);
415
- $(window).off('.datalist'+this.id);
416
- if(this.input.form && this.input.id){
417
- $(this.input.form).off('submit.datalistWidget'+this.input.id);
418
- }
419
- this.input.removeAttribute('aria-haspopup');
420
- if(autocomplete === undefined){
421
- this.input.removeAttribute('autocomplete');
422
- } else {
423
- $(this.input).attr('autocomplete', autocomplete);
424
- }
425
- },
426
- _resetListCached: function(e){
427
- var that = this;
428
- var forceShow;
429
- this.needsUpdate = true;
430
- this.lastUpdatedValue = false;
431
- this.lastUnfoundValue = '';
432
-
433
- if(!this.updateTimer){
434
- if(window.QUnit || (forceShow = (e && document.activeElement == that.input))){
435
- that.updateListOptions(forceShow);
436
- } else {
437
- webshims.ready('WINDOWLOAD', function(){
438
- that.updateTimer = setTimeout(function(){
439
- that.updateListOptions();
440
- that = null;
441
- listidIndex = 1;
442
- }, 200 + (100 * listidIndex));
443
- });
444
- }
445
- }
446
- },
447
- maskHTML: function(str){
448
- return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
449
- },
450
- updateListOptions: function(_forceShow){
451
- this.needsUpdate = false;
452
- clearTimeout(this.updateTimer);
453
- this.updateTimer = false;
454
- this.shadowList
455
- .css({
456
- fontSize: $.css(this.input, 'fontSize'),
457
- fontFamily: $.css(this.input, 'fontFamily')
458
- })
459
- ;
460
- this.searchStart = formsCFG.customDatalist && $(this.input).hasClass('search-start');
461
-
462
- var list = [];
463
-
464
- var values = [];
465
- var allOptions = [];
466
- var rElem, rItem, rOptions, rI, rLen, item;
467
- for(rOptions = $.prop(this.datalist, 'options'), rI = 0, rLen = rOptions.length; rI < rLen; rI++){
468
- rElem = rOptions[rI];
469
- if(rElem.disabled){return;}
470
- rItem = {
471
- value: $(rElem).val() || '',
472
- text: $.trim($.attr(rElem, 'label') || getText(rElem)),
473
- className: rElem.className || '',
474
- style: $.attr(rElem, 'style') || ''
475
- };
476
- if(!rItem.text){
477
- rItem.text = rItem.value;
478
- } else if(rItem.text != rItem.value){
479
- rItem.className += ' different-label-value';
480
- }
481
- values[rI] = rItem.value;
482
- allOptions[rI] = rItem;
483
- }
484
-
485
- if(!this.storedOptions){
486
- this.storedOptions = ($(this.input).hasClass('no-datalist-cache') || this._autocomplete == 'off') ? [] : getStoredOptions((this.input.name || this.input.id) + $.prop(this.input, 'type'));
487
- }
488
-
489
- this.storedOptions.forEach(function(val, i){
490
- if(values.indexOf(val) == -1){
491
- allOptions.push({value: val, text: val, className: 'stored-suggest', style: ''});
492
- }
493
- });
494
-
495
- for(rI = 0, rLen = allOptions.length; rI < rLen; rI++){
496
- item = allOptions[rI];
497
- list[rI] = '<li class="'+ item.className +'" style="'+ item.style +'" tabindex="-1" role="listitem"><span class="option-label">'+ this.maskHTML(item.text) +'</span> <span class="option-value">'+ this.maskHTML(item.value) +'</span></li>';
498
- }
499
-
500
- this.arrayOptions = allOptions;
501
- this.shadowList.html('<div class="datalist-outer-box"><div class="datalist-box"><ul role="list">'+ list.join("\n") +'</ul></div></div>');
502
-
503
- if($.fn.bgIframe && lteie6){
504
- this.shadowList.bgIframe();
505
- }
506
-
507
- if(_forceShow || this.isListVisible){
508
- this.showHideOptions();
509
- }
510
- },
511
- showHideOptions: function(_fromShowList){
512
- var value = $.prop(this.input, 'value').toLowerCase();
513
- //first check prevent infinite loop, second creates simple lazy optimization
514
- if(value === this.lastUpdatedValue || (this.lastUnfoundValue && value.indexOf(this.lastUnfoundValue) === 0)){
515
- return;
516
- }
517
-
518
- this.lastUpdatedValue = value;
519
- var found = false;
520
- var startSearch = this.searchStart;
521
- var lis = $('li', this.shadowList);
522
- if(value){
523
- this.arrayOptions.forEach(function(item, i){
524
- var search;
525
- if(!('lowerText' in item)){
526
- if(item.text != item.value){
527
- item.lowerText = item.value.toLowerCase() + item.text.toLowerCase();
528
- } else {
529
- item.lowerText = item.text.toLowerCase();
530
- }
531
- }
532
- search = item.lowerText.indexOf(value);
533
- search = startSearch ? !search : search !== -1;
534
- if(search){
535
- $(lis[i]).removeClass('hidden-item');
536
- found = true;
537
- } else {
538
- $(lis[i]).addClass('hidden-item');
539
- }
540
- });
541
- } else if(lis.length) {
542
- lis.removeClass('hidden-item');
543
- found = true;
544
- }
545
-
546
- this.hasViewableData = found;
547
- if(!_fromShowList && found){
548
- this.showList();
549
- }
550
- if(!found){
551
- this.lastUnfoundValue = value;
552
- this.hideList();
553
- }
554
- },
555
- setPos: function(){
556
- this.shadowList.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0});
557
- var css = (formsCFG.positionDatalist) ? $(this.input).position() : webshims.getRelOffset(this.shadowList, this.input);
558
- css.top += $(this.input).outerHeight();
559
- css.width = $(this.input).outerWidth() - (parseInt(this.shadowList.css('borderLeftWidth'), 10) || 0) - (parseInt(this.shadowList.css('borderRightWidth'), 10) || 0);
560
- this.shadowList.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(css);
561
- return css;
562
- },
563
- showList: function(){
564
- if(this.isListVisible){return false;}
565
- if(this.needsUpdate){
566
- this.updateListOptions();
567
- }
568
- this.showHideOptions(true);
569
- if(!this.hasViewableData){return false;}
570
- this.isListVisible = true;
571
- var that = this;
572
-
573
- that.setPos();
574
- that.shadowList.addClass('datalist-visible').find('li.active-item').removeClass('active-item');
575
-
576
- $(window).unbind('.datalist'+that.id);
577
- $(document)
578
- .off('.datalist'+that.id)
579
- .on('mousedown.datalist'+that.id +' focusin.datalist'+that.id, function(e){
580
- if(e.target === that.input || that.shadowList[0] === e.target || $.contains( that.shadowList[0], e.target )){
581
- clearTimeout(that.hideTimer);
582
- setTimeout(function(){
583
- clearTimeout(that.hideTimer);
584
- }, 9);
585
- } else {
586
- that.timedHide();
587
- }
588
- })
589
- .on('updateshadowdom.datalist'+that.id, function(){
590
- that.setPos();
591
- })
592
- ;
593
- return true;
594
- },
595
- hideList: function(){
596
- if(!this.isListVisible){return false;}
597
- var that = this;
598
- var triggerChange = function(e){
599
- if(that.changedValue){
600
- $(that.input).trigger('change');
601
- }
602
- that.changedValue = false;
603
- };
604
-
605
- that.shadowList.removeClass('datalist-visible list-item-active');
606
- that.index = -1;
607
- that.isListVisible = false;
608
- if(that.changedValue){
609
- that.triggeredByDatalist = true;
610
- webshims.triggerInlineForm && webshims.triggerInlineForm(that.input, 'input');
611
- if($(that.input).is(':focus')){
612
- $(that.input).one('blur', triggerChange);
613
- } else {
614
- triggerChange();
615
- }
616
- that.triggeredByDatalist = false;
617
- }
618
- $(document).unbind('.datalist'+that.id);
619
- $(window)
620
- .off('.datalist'+that.id)
621
- .one('resize.datalist'+that.id, function(){
622
- that.shadowList.css({top: 0, left: 0});
623
- })
624
- ;
625
- return true;
626
- },
627
- scrollIntoView: function(elem){
628
- var ul = $('ul', this.shadowList);
629
- var div = $('div.datalist-box', this.shadowList);
630
- var elemPos = elem.position();
631
- var containerHeight;
632
- elemPos.top -= (parseInt(ul.css('paddingTop'), 10) || 0) + (parseInt(ul.css('marginTop'), 10) || 0) + (parseInt(ul.css('borderTopWidth'), 10) || 0);
633
- if(elemPos.top < 0){
634
- div.scrollTop( div.scrollTop() + elemPos.top - 2);
635
- return;
636
- }
637
- elemPos.top += elem.outerHeight();
638
- containerHeight = div.height();
639
- if(elemPos.top > containerHeight){
640
- div.scrollTop( div.scrollTop() + (elemPos.top - containerHeight) + 2);
641
- }
642
- },
643
- changeValue: function(activeItem){
644
- if(!activeItem[0]){return;}
645
- var newValue = $('span.option-value', activeItem).text();
646
- var oldValue = $.prop(this.input, 'value');
647
- if(newValue != oldValue){
648
- $(this.input)
649
- .prop('value', newValue)
650
- .triggerHandler('updateInput')
651
- ;
652
- this.changedValue = true;
653
- }
654
- },
655
- markItem: function(index, doValue, items){
656
- var activeItem;
657
- var goesUp;
658
-
659
- items = items || $('li:not(.hidden-item)', this.shadowList);
660
- if(!items.length){return;}
661
- if(index < 0){
662
- index = items.length - 1;
663
- } else if(index >= items.length){
664
- index = 0;
665
- }
666
- items.removeClass('active-item');
667
- this.shadowList.addClass('list-item-active');
668
- activeItem = items.filter(':eq('+ index +')').addClass('active-item');
669
-
670
- if(doValue){
671
- this.changeValue(activeItem);
672
- this.scrollIntoView(activeItem);
673
- }
674
- this.index = index;
675
- }
676
- };
677
-
678
- //init datalist update
679
- initializeDatalist();
680
- })();
681
-
1
+ jQuery.webshims.register('form-datalist', function($, webshims, window, document, undefined){
2
+ "use strict";
3
+ var doc = document;
4
+
5
+ /*
6
+ * implement propType "element" currently only used for list-attribute (will be moved to dom-extend, if needed)
7
+ */
8
+ webshims.propTypes.element = function(descs){
9
+ webshims.createPropDefault(descs, 'attr');
10
+ if(descs.prop){return;}
11
+ descs.prop = {
12
+ get: function(){
13
+ var elem = descs.attr.get.call(this);
14
+ if(elem){
15
+ elem = document.getElementById(elem);
16
+ if(elem && descs.propNodeName && !$.nodeName(elem, descs.propNodeName)){
17
+ elem = null;
18
+ }
19
+ }
20
+ return elem || null;
21
+ },
22
+ writeable: false
23
+ };
24
+ };
25
+
26
+
27
+ /*
28
+ * Implements datalist element and list attribute
29
+ */
30
+
31
+ (function(){
32
+ var formsCFG = $.webshims.cfg.forms;
33
+ var listSupport = Modernizr.input.list;
34
+ if(listSupport && !formsCFG.customDatalist){return;}
35
+
36
+ var initializeDatalist = function(){
37
+
38
+
39
+ if(!listSupport){
40
+ webshims.defineNodeNameProperty('datalist', 'options', {
41
+ prop: {
42
+ writeable: false,
43
+ get: function(){
44
+ var elem = this;
45
+ var select = $('select', elem);
46
+ var options;
47
+ if(select[0]){
48
+ options = select[0].options;
49
+ } else {
50
+ options = $('option', elem).get();
51
+ if(options.length){
52
+ webshims.warn('you should wrap your option-elements for a datalist in a select element to support IE and other old browsers.');
53
+ }
54
+ }
55
+ return options;
56
+ }
57
+ }
58
+ });
59
+ }
60
+
61
+ var inputListProto = {
62
+ //override autocomplete
63
+ autocomplete: {
64
+ attr: {
65
+ get: function(){
66
+ var elem = this;
67
+ var data = $.data(elem, 'datalistWidget');
68
+ if(data){
69
+ return data._autocomplete;
70
+ }
71
+ return ('autocomplete' in elem) ? elem.autocomplete : elem.getAttribute('autocomplete');
72
+ },
73
+ set: function(value){
74
+ var elem = this;
75
+ var data = $.data(elem, 'datalistWidget');
76
+ if(data){
77
+ data._autocomplete = value;
78
+ if(value == 'off'){
79
+ data.hideList();
80
+ }
81
+ } else {
82
+ if('autocomplete' in elem){
83
+ elem.autocomplete = value;
84
+ } else {
85
+ elem.setAttribute('autocomplete', value);
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ };
92
+
93
+ // if(formsCFG.customDatalist && (!listSupport || !('selectedOption') in $('<input />')[0])){
94
+ // //currently not supported x-browser (FF4 has not implemented and is not polyfilled )
95
+ // inputListProto.selectedOption = {
96
+ // prop: {
97
+ // writeable: false,
98
+ // get: function(){
99
+ // var elem = this;
100
+ // var list = $.prop(elem, 'list');
101
+ // var ret = null;
102
+ // var value, options;
103
+ // if(!list){return ret;}
104
+ // value = $.prop(elem, 'value');
105
+ // if(!value){return ret;}
106
+ // options = $.prop(list, 'options');
107
+ // if(!options.length){return ret;}
108
+ // $.each(options, function(i, option){
109
+ // if(value == $.prop(option, 'value')){
110
+ // ret = option;
111
+ // return false;
112
+ // }
113
+ // });
114
+ // return ret;
115
+ // }
116
+ // }
117
+ // };
118
+ // }
119
+
120
+ if(!listSupport){
121
+ inputListProto['list'] = {
122
+ attr: {
123
+ get: function(){
124
+ var val = webshims.contentAttr(this, 'list');
125
+ return (val == null) ? undefined : val;
126
+ },
127
+ set: function(value){
128
+ var elem = this;
129
+ webshims.contentAttr(elem, 'list', value);
130
+ webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
131
+ }
132
+ },
133
+ initAttr: true,
134
+ reflect: true,
135
+ propType: 'element',
136
+ propNodeName: 'datalist'
137
+ };
138
+ } else {
139
+ //options only return options, if option-elements are rooted: but this makes this part of HTML5 less backwards compatible
140
+ if(!($('<datalist><select><option></option></select></datalist>').prop('options') || []).length ){
141
+ webshims.defineNodeNameProperty('datalist', 'options', {
142
+ prop: {
143
+ writeable: false,
144
+ get: function(){
145
+ var options = this.options || [];
146
+ if(!options.length){
147
+ var elem = this;
148
+ var select = $('select', elem);
149
+ if(select[0] && select[0].options && select[0].options.length){
150
+ options = select[0].options;
151
+ }
152
+ }
153
+ return options;
154
+ }
155
+ }
156
+ });
157
+ }
158
+ inputListProto['list'] = {
159
+ attr: {
160
+ get: function(){
161
+ var val = webshims.contentAttr(this, 'list');
162
+ if(val != null){
163
+ this.removeAttribute('list');
164
+ } else {
165
+ val = $.data(this, 'datalistListAttr');
166
+ }
167
+
168
+ return (val == null) ? undefined : val;
169
+ },
170
+ set: function(value){
171
+ var elem = this;
172
+ $.data(elem, 'datalistListAttr', value);
173
+ webshims.objectCreate(shadowListProto, undefined, {input: elem, id: value, datalist: $.prop(elem, 'list')});
174
+ }
175
+ },
176
+ initAttr: true,
177
+ reflect: true,
178
+ propType: 'element',
179
+ propNodeName: 'datalist'
180
+ };
181
+ }
182
+
183
+
184
+ webshims.defineNodeNameProperties('input', inputListProto);
185
+
186
+ if($.event.customEvent){
187
+ $.event.customEvent.updateDatalist = true;
188
+ $.event.customEvent.updateInput = true;
189
+ $.event.customEvent.datalistselect = true;
190
+ }
191
+ webshims.addReady(function(context, contextElem){
192
+ contextElem
193
+ .filter('datalist > select, datalist, datalist > option, datalist > select > option')
194
+ .closest('datalist')
195
+ .triggerHandler('updateDatalist')
196
+ ;
197
+
198
+ });
199
+
200
+
201
+ };
202
+
203
+
204
+ /*
205
+ * ShadowList
206
+ */
207
+ var listidIndex = 0;
208
+
209
+ var noDatalistSupport = {
210
+ submit: 1,
211
+ button: 1,
212
+ reset: 1,
213
+ hidden: 1,
214
+
215
+ //ToDo
216
+ range: 1,
217
+ date: 1
218
+ };
219
+ var lteie6 = ($.browser.msie && parseInt($.browser.version, 10) < 7);
220
+ var globStoredOptions = {};
221
+ var getStoredOptions = function(name){
222
+ if(!name){return [];}
223
+ if(globStoredOptions[name]){
224
+ return globStoredOptions[name];
225
+ }
226
+ var data;
227
+ try {
228
+ data = JSON.parse(localStorage.getItem('storedDatalistOptions'+name));
229
+ } catch(e){}
230
+ globStoredOptions[name] = data || [];
231
+ return data || [];
232
+ };
233
+ var storeOptions = function(name, val){
234
+ if(!name){return;}
235
+ val = val || [];
236
+ try {
237
+ localStorage.setItem( 'storedDatalistOptions'+name, JSON.stringify(val) );
238
+ } catch(e){}
239
+ };
240
+
241
+ var getText = function(elem){
242
+ return (elem.textContent || elem.innerText || $.text([ elem ]) || '');
243
+ };
244
+
245
+ var shadowListProto = {
246
+ _create: function(opts){
247
+
248
+ if(noDatalistSupport[$.prop(opts.input, 'type')]){return;}
249
+ var datalist = opts.datalist;
250
+ var data = $.data(opts.input, 'datalistWidget');
251
+ if(datalist && data && data.datalist !== datalist){
252
+ data.datalist = datalist;
253
+ data.id = opts.id;
254
+
255
+ data.shadowList.prop('className', 'datalist-polyfill '+ (data.datalist.className || '') + ' '+ data.datalist.id +'-shadowdom');
256
+ if(formsCFG.positionDatalist){
257
+ data.shadowList.insertAfter(opts.input);
258
+ } else {
259
+ data.shadowList.appendTo('body');
260
+ }
261
+ $(data.datalist)
262
+ .off('updateDatalist.datalistWidget')
263
+ .on('updateDatalist.datalistWidget', $.proxy(data, '_resetListCached'))
264
+ ;
265
+ data._resetListCached();
266
+ return;
267
+ } else if(!datalist){
268
+ if(data){
269
+ data.destroy();
270
+ }
271
+ return;
272
+ } else if(data && data.datalist === datalist){
273
+ return;
274
+ }
275
+ listidIndex++;
276
+ var that = this;
277
+ this.hideList = $.proxy(that, 'hideList');
278
+ this.timedHide = function(){
279
+ clearTimeout(that.hideTimer);
280
+ that.hideTimer = setTimeout(that.hideList, 9);
281
+ };
282
+ this.datalist = datalist;
283
+ this.id = opts.id;
284
+ this.hasViewableData = true;
285
+ this._autocomplete = $.attr(opts.input, 'autocomplete');
286
+ $.data(opts.input, 'datalistWidget', this);
287
+ this.shadowList = $('<div class="datalist-polyfill '+ (this.datalist.className || '') + ' '+ this.datalist.id +'-shadowdom' +'" />');
288
+
289
+ if(formsCFG.positionDatalist || $(opts.input).hasClass('position-datalist')){
290
+ this.shadowList.insertAfter(opts.input);
291
+ } else {
292
+ this.shadowList.appendTo('body');
293
+ }
294
+
295
+ this.index = -1;
296
+ this.input = opts.input;
297
+ this.arrayOptions = [];
298
+
299
+ this.shadowList
300
+ .delegate('li', 'mouseenter.datalistWidget mousedown.datalistWidget click.datalistWidget', function(e){
301
+ var items = $('li:not(.hidden-item)', that.shadowList);
302
+ var select = (e.type == 'mousedown' || e.type == 'click');
303
+ that.markItem(items.index(e.currentTarget), select, items);
304
+ if(e.type == 'click'){
305
+ that.hideList();
306
+ if(formsCFG.customDatalist){
307
+ $(opts.input).trigger('datalistselect');
308
+ }
309
+ }
310
+ return (e.type != 'mousedown');
311
+ })
312
+ .on('focusout', this.timedHide)
313
+ ;
314
+
315
+ opts.input.setAttribute('autocomplete', 'off');
316
+
317
+ $(opts.input)
318
+ .attr({
319
+ //role: 'combobox',
320
+ 'aria-haspopup': 'true'
321
+ })
322
+ .on({
323
+ 'input.datalistWidget': function(){
324
+ if(!that.triggeredByDatalist){
325
+ that.changedValue = false;
326
+ that.showHideOptions();
327
+ }
328
+ },
329
+ 'keydown.datalistWidget': function(e){
330
+ var keyCode = e.keyCode;
331
+ var activeItem;
332
+ var items;
333
+ if(keyCode == 40 && !that.showList()){
334
+ that.markItem(that.index + 1, true);
335
+ return false;
336
+ }
337
+
338
+ if(!that.isListVisible){return;}
339
+
340
+
341
+ if(keyCode == 38){
342
+ that.markItem(that.index - 1, true);
343
+ return false;
344
+ }
345
+ if(!e.shiftKey && (keyCode == 33 || keyCode == 36)){
346
+ that.markItem(0, true);
347
+ return false;
348
+ }
349
+ if(!e.shiftKey && (keyCode == 34 || keyCode == 35)){
350
+ items = $('li:not(.hidden-item)', that.shadowList);
351
+ that.markItem(items.length - 1, true, items);
352
+ return false;
353
+ }
354
+ if(keyCode == 13 || keyCode == 27){
355
+ if (keyCode == 13){
356
+ activeItem = $('li.active-item:not(.hidden-item)', that.shadowList);
357
+ that.changeValue( $('li.active-item:not(.hidden-item)', that.shadowList) );
358
+ }
359
+ that.hideList();
360
+ if(formsCFG.customDatalist && activeItem && activeItem[0]){
361
+ $(opts.input).trigger('datalistselect');
362
+ }
363
+ return false;
364
+ }
365
+ },
366
+ 'focus.datalistWidget': function(){
367
+ if($(this).hasClass('list-focus')){
368
+ that.showList();
369
+ }
370
+ },
371
+ 'mousedown.datalistWidget': function(){
372
+ if($(this).is(':focus')){
373
+ that.showList();
374
+ }
375
+ },
376
+ 'blur.datalistWidget': this.timedHide
377
+ })
378
+ ;
379
+
380
+
381
+ $(this.datalist)
382
+ .off('updateDatalist.datalistWidget')
383
+ .on('updateDatalist.datalistWidget', $.proxy(this, '_resetListCached'))
384
+ ;
385
+
386
+ this._resetListCached();
387
+
388
+ if(opts.input.form && (opts.input.name || opts.input.id)){
389
+ $(opts.input.form).on('submit.datalistWidget'+opts.input.id, function(){
390
+ if(!$(opts.input).hasClass('no-datalist-cache') && that._autocomplete != 'off'){
391
+ var val = $.prop(opts.input, 'value');
392
+ var name = (opts.input.name || opts.input.id) + $.prop(opts.input, 'type');
393
+ if(!that.storedOptions){
394
+ that.storedOptions = getStoredOptions( name );
395
+ }
396
+ if(val && that.storedOptions.indexOf(val) == -1){
397
+ that.storedOptions.push(val);
398
+ storeOptions(name, that.storedOptions );
399
+ }
400
+ }
401
+ });
402
+ }
403
+ $(window).on('unload.datalist'+this.id+' beforeunload.datalist'+this.id, function(){
404
+ that.destroy();
405
+ });
406
+ },
407
+ destroy: function(){
408
+ var autocomplete = $.attr(this.input, 'autocomplete');
409
+ $(this.input)
410
+ .off('.datalistWidget')
411
+ .removeData('datalistWidget')
412
+ ;
413
+ this.shadowList.remove();
414
+ $(document).off('.datalist'+this.id);
415
+ $(window).off('.datalist'+this.id);
416
+ if(this.input.form && this.input.id){
417
+ $(this.input.form).off('submit.datalistWidget'+this.input.id);
418
+ }
419
+ this.input.removeAttribute('aria-haspopup');
420
+ if(autocomplete === undefined){
421
+ this.input.removeAttribute('autocomplete');
422
+ } else {
423
+ $(this.input).attr('autocomplete', autocomplete);
424
+ }
425
+ },
426
+ _resetListCached: function(e){
427
+ var that = this;
428
+ var forceShow;
429
+ this.needsUpdate = true;
430
+ this.lastUpdatedValue = false;
431
+ this.lastUnfoundValue = '';
432
+
433
+ if(!this.updateTimer){
434
+ if(window.QUnit || (forceShow = (e && document.activeElement == that.input))){
435
+ that.updateListOptions(forceShow);
436
+ } else {
437
+ webshims.ready('WINDOWLOAD', function(){
438
+ that.updateTimer = setTimeout(function(){
439
+ that.updateListOptions();
440
+ that = null;
441
+ listidIndex = 1;
442
+ }, 200 + (100 * listidIndex));
443
+ });
444
+ }
445
+ }
446
+ },
447
+ maskHTML: function(str){
448
+ return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
449
+ },
450
+ updateListOptions: function(_forceShow){
451
+ this.needsUpdate = false;
452
+ clearTimeout(this.updateTimer);
453
+ this.updateTimer = false;
454
+ this.shadowList
455
+ .css({
456
+ fontSize: $.css(this.input, 'fontSize'),
457
+ fontFamily: $.css(this.input, 'fontFamily')
458
+ })
459
+ ;
460
+ this.searchStart = formsCFG.customDatalist && $(this.input).hasClass('search-start');
461
+
462
+ var list = [];
463
+
464
+ var values = [];
465
+ var allOptions = [];
466
+ var rElem, rItem, rOptions, rI, rLen, item;
467
+ for(rOptions = $.prop(this.datalist, 'options'), rI = 0, rLen = rOptions.length; rI < rLen; rI++){
468
+ rElem = rOptions[rI];
469
+ if(rElem.disabled){return;}
470
+ rItem = {
471
+ value: $(rElem).val() || '',
472
+ text: $.trim($.attr(rElem, 'label') || getText(rElem)),
473
+ className: rElem.className || '',
474
+ style: $.attr(rElem, 'style') || ''
475
+ };
476
+ if(!rItem.text){
477
+ rItem.text = rItem.value;
478
+ } else if(rItem.text != rItem.value){
479
+ rItem.className += ' different-label-value';
480
+ }
481
+ values[rI] = rItem.value;
482
+ allOptions[rI] = rItem;
483
+ }
484
+
485
+ if(!this.storedOptions){
486
+ this.storedOptions = ($(this.input).hasClass('no-datalist-cache') || this._autocomplete == 'off') ? [] : getStoredOptions((this.input.name || this.input.id) + $.prop(this.input, 'type'));
487
+ }
488
+
489
+ this.storedOptions.forEach(function(val, i){
490
+ if(values.indexOf(val) == -1){
491
+ allOptions.push({value: val, text: val, className: 'stored-suggest', style: ''});
492
+ }
493
+ });
494
+
495
+ for(rI = 0, rLen = allOptions.length; rI < rLen; rI++){
496
+ item = allOptions[rI];
497
+ list[rI] = '<li class="'+ item.className +'" style="'+ item.style +'" tabindex="-1" role="listitem"><span class="option-label">'+ this.maskHTML(item.text) +'</span> <span class="option-value">'+ this.maskHTML(item.value) +'</span></li>';
498
+ }
499
+
500
+ this.arrayOptions = allOptions;
501
+ this.shadowList.html('<div class="datalist-outer-box"><div class="datalist-box"><ul role="list">'+ list.join("\n") +'</ul></div></div>');
502
+
503
+ if($.fn.bgIframe && lteie6){
504
+ this.shadowList.bgIframe();
505
+ }
506
+
507
+ if(_forceShow || this.isListVisible){
508
+ this.showHideOptions();
509
+ }
510
+ },
511
+ showHideOptions: function(_fromShowList){
512
+ var value = $.prop(this.input, 'value').toLowerCase();
513
+ //first check prevent infinite loop, second creates simple lazy optimization
514
+ if(value === this.lastUpdatedValue || (this.lastUnfoundValue && value.indexOf(this.lastUnfoundValue) === 0)){
515
+ return;
516
+ }
517
+
518
+ this.lastUpdatedValue = value;
519
+ var found = false;
520
+ var startSearch = this.searchStart;
521
+ var lis = $('li', this.shadowList);
522
+ if(value){
523
+ this.arrayOptions.forEach(function(item, i){
524
+ var search;
525
+ if(!('lowerText' in item)){
526
+ if(item.text != item.value){
527
+ item.lowerText = item.value.toLowerCase() + item.text.toLowerCase();
528
+ } else {
529
+ item.lowerText = item.text.toLowerCase();
530
+ }
531
+ }
532
+ search = item.lowerText.indexOf(value);
533
+ search = startSearch ? !search : search !== -1;
534
+ if(search){
535
+ $(lis[i]).removeClass('hidden-item');
536
+ found = true;
537
+ } else {
538
+ $(lis[i]).addClass('hidden-item');
539
+ }
540
+ });
541
+ } else if(lis.length) {
542
+ lis.removeClass('hidden-item');
543
+ found = true;
544
+ }
545
+
546
+ this.hasViewableData = found;
547
+ if(!_fromShowList && found){
548
+ this.showList();
549
+ }
550
+ if(!found){
551
+ this.lastUnfoundValue = value;
552
+ this.hideList();
553
+ }
554
+ },
555
+ setPos: function(){
556
+ this.shadowList.css({marginTop: 0, marginLeft: 0, marginRight: 0, marginBottom: 0});
557
+ var css = (formsCFG.positionDatalist) ? $(this.input).position() : webshims.getRelOffset(this.shadowList, this.input);
558
+ css.top += $(this.input).outerHeight();
559
+ css.width = $(this.input).outerWidth() - (parseInt(this.shadowList.css('borderLeftWidth'), 10) || 0) - (parseInt(this.shadowList.css('borderRightWidth'), 10) || 0);
560
+ this.shadowList.css({marginTop: '', marginLeft: '', marginRight: '', marginBottom: ''}).css(css);
561
+ return css;
562
+ },
563
+ showList: function(){
564
+ if(this.isListVisible){return false;}
565
+ if(this.needsUpdate){
566
+ this.updateListOptions();
567
+ }
568
+ this.showHideOptions(true);
569
+ if(!this.hasViewableData){return false;}
570
+ this.isListVisible = true;
571
+ var that = this;
572
+
573
+ that.setPos();
574
+ that.shadowList.addClass('datalist-visible').find('li.active-item').removeClass('active-item');
575
+
576
+ $(window).unbind('.datalist'+that.id);
577
+ $(document)
578
+ .off('.datalist'+that.id)
579
+ .on('mousedown.datalist'+that.id +' focusin.datalist'+that.id, function(e){
580
+ if(e.target === that.input || that.shadowList[0] === e.target || $.contains( that.shadowList[0], e.target )){
581
+ clearTimeout(that.hideTimer);
582
+ setTimeout(function(){
583
+ clearTimeout(that.hideTimer);
584
+ }, 9);
585
+ } else {
586
+ that.timedHide();
587
+ }
588
+ })
589
+ .on('updateshadowdom.datalist'+that.id, function(){
590
+ that.setPos();
591
+ })
592
+ ;
593
+ return true;
594
+ },
595
+ hideList: function(){
596
+ if(!this.isListVisible){return false;}
597
+ var that = this;
598
+ var triggerChange = function(e){
599
+ if(that.changedValue){
600
+ $(that.input).trigger('change');
601
+ }
602
+ that.changedValue = false;
603
+ };
604
+
605
+ that.shadowList.removeClass('datalist-visible list-item-active');
606
+ that.index = -1;
607
+ that.isListVisible = false;
608
+ if(that.changedValue){
609
+ that.triggeredByDatalist = true;
610
+ webshims.triggerInlineForm && webshims.triggerInlineForm(that.input, 'input');
611
+ if($(that.input).is(':focus')){
612
+ $(that.input).one('blur', triggerChange);
613
+ } else {
614
+ triggerChange();
615
+ }
616
+ that.triggeredByDatalist = false;
617
+ }
618
+ $(document).unbind('.datalist'+that.id);
619
+ $(window)
620
+ .off('.datalist'+that.id)
621
+ .one('resize.datalist'+that.id, function(){
622
+ that.shadowList.css({top: 0, left: 0});
623
+ })
624
+ ;
625
+ return true;
626
+ },
627
+ scrollIntoView: function(elem){
628
+ var ul = $('ul', this.shadowList);
629
+ var div = $('div.datalist-box', this.shadowList);
630
+ var elemPos = elem.position();
631
+ var containerHeight;
632
+ elemPos.top -= (parseInt(ul.css('paddingTop'), 10) || 0) + (parseInt(ul.css('marginTop'), 10) || 0) + (parseInt(ul.css('borderTopWidth'), 10) || 0);
633
+ if(elemPos.top < 0){
634
+ div.scrollTop( div.scrollTop() + elemPos.top - 2);
635
+ return;
636
+ }
637
+ elemPos.top += elem.outerHeight();
638
+ containerHeight = div.height();
639
+ if(elemPos.top > containerHeight){
640
+ div.scrollTop( div.scrollTop() + (elemPos.top - containerHeight) + 2);
641
+ }
642
+ },
643
+ changeValue: function(activeItem){
644
+ if(!activeItem[0]){return;}
645
+ var newValue = $('span.option-value', activeItem).text();
646
+ var oldValue = $.prop(this.input, 'value');
647
+ if(newValue != oldValue){
648
+ $(this.input)
649
+ .prop('value', newValue)
650
+ .triggerHandler('updateInput')
651
+ ;
652
+ this.changedValue = true;
653
+ }
654
+ },
655
+ markItem: function(index, doValue, items){
656
+ var activeItem;
657
+ var goesUp;
658
+
659
+ items = items || $('li:not(.hidden-item)', this.shadowList);
660
+ if(!items.length){return;}
661
+ if(index < 0){
662
+ index = items.length - 1;
663
+ } else if(index >= items.length){
664
+ index = 0;
665
+ }
666
+ items.removeClass('active-item');
667
+ this.shadowList.addClass('list-item-active');
668
+ activeItem = items.filter(':eq('+ index +')').addClass('active-item');
669
+
670
+ if(doValue){
671
+ this.changeValue(activeItem);
672
+ this.scrollIntoView(activeItem);
673
+ }
674
+ this.index = index;
675
+ }
676
+ };
677
+
678
+ //init datalist update
679
+ initializeDatalist();
680
+ })();
681
+
682
682
  });