webshims-rails 0.3 → 0.4

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