webshims-rails 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/extras/custom-validity.js +261 -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 -1
  6. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +24 -24
  7. data/vendor/assets/javascripts/webshims/minified/shims/FlashCanvasPro/README +82 -82
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +35 -34
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +79 -82
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +45 -44
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +43 -42
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +28 -27
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/15.js +4 -4
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +57 -59
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +64 -66
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +53 -54
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +64 -66
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/2.js +72 -73
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +42 -46
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/21.js +52 -50
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +55 -59
  22. data/vendor/assets/javascripts/webshims/minified/shims/combos/23.js +66 -64
  23. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +80 -82
  24. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +60 -59
  25. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +79 -81
  26. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +101 -104
  27. data/vendor/assets/javascripts/webshims/minified/shims/combos/3.js +94 -95
  28. data/vendor/assets/javascripts/webshims/minified/shims/combos/4.js +26 -29
  29. data/vendor/assets/javascripts/webshims/minified/shims/combos/5.js +33 -36
  30. data/vendor/assets/javascripts/webshims/minified/shims/combos/59.js +51 -54
  31. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +27 -28
  32. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +27 -28
  33. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +39 -38
  34. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +65 -68
  35. data/vendor/assets/javascripts/webshims/minified/shims/details.js +4 -4
  36. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +23 -22
  37. data/vendor/assets/javascripts/webshims/minified/shims/form-core.js +19 -22
  38. data/vendor/assets/javascripts/webshims/minified/shims/form-datalist.js +14 -14
  39. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +9 -9
  40. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +18 -19
  41. data/vendor/assets/javascripts/webshims/minified/shims/form-shim-extend.js +45 -43
  42. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-de.txt +33 -33
  43. data/vendor/assets/javascripts/webshims/minified/shims/i18n/errormessages-en.txt +34 -34
  44. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-core.js +12 -12
  45. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-jaris.js +23 -0
  46. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-native-fix.js +1 -1
  47. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +26 -30
  48. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-yt.js +3 -3
  49. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +689 -686
  50. data/vendor/assets/javascripts/webshims/minified/shims/swf/JarisFLVPlayer.swf +0 -0
  51. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  52. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -21
  53. data/vendor/assets/javascripts/webshims/polyfiller.js +1191 -1175
  54. data/vendor/assets/javascripts/webshims/shims/combos/1.js +1754 -1714
  55. data/vendor/assets/javascripts/webshims/shims/combos/10.js +3247 -3320
  56. data/vendor/assets/javascripts/webshims/shims/combos/11.js +1633 -1588
  57. data/vendor/assets/javascripts/webshims/shims/combos/12.js +1636 -1591
  58. data/vendor/assets/javascripts/webshims/shims/combos/13.js +1100 -1058
  59. data/vendor/assets/javascripts/webshims/shims/combos/14.js +476 -476
  60. data/vendor/assets/javascripts/webshims/shims/combos/15.js +316 -314
  61. data/vendor/assets/javascripts/webshims/shims/combos/16.js +2094 -2104
  62. data/vendor/assets/javascripts/webshims/shims/combos/17.js +2258 -2267
  63. data/vendor/assets/javascripts/webshims/shims/combos/18.js +1380 -1364
  64. data/vendor/assets/javascripts/webshims/shims/combos/19.js +2239 -2247
  65. data/vendor/assets/javascripts/webshims/shims/combos/2.js +2339 -2294
  66. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1493 -1606
  67. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1733 -1635
  68. data/vendor/assets/javascripts/webshims/shims/combos/22.js +2295 -2408
  69. data/vendor/assets/javascripts/webshims/shims/combos/23.js +2269 -2168
  70. data/vendor/assets/javascripts/webshims/shims/combos/24.js +2775 -2780
  71. data/vendor/assets/javascripts/webshims/shims/combos/25.js +1505 -1456
  72. data/vendor/assets/javascripts/webshims/shims/combos/26.js +2111 -2115
  73. data/vendor/assets/javascripts/webshims/shims/combos/27.js +3264 -3331
  74. data/vendor/assets/javascripts/webshims/shims/combos/3.js +3020 -2970
  75. data/vendor/assets/javascripts/webshims/shims/combos/4.js +770 -822
  76. data/vendor/assets/javascripts/webshims/shims/combos/5.js +1025 -1077
  77. data/vendor/assets/javascripts/webshims/shims/combos/59.js +1706 -1753
  78. data/vendor/assets/javascripts/webshims/shims/combos/6.js +444 -433
  79. data/vendor/assets/javascripts/webshims/shims/combos/7.js +699 -688
  80. data/vendor/assets/javascripts/webshims/shims/combos/8.js +1488 -1445
  81. data/vendor/assets/javascripts/webshims/shims/combos/9.js +2445 -2518
  82. data/vendor/assets/javascripts/webshims/shims/details.js +148 -146
  83. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +952 -912
  84. data/vendor/assets/javascripts/webshims/shims/es5.js +802 -802
  85. data/vendor/assets/javascripts/webshims/shims/excanvas.js +924 -924
  86. data/vendor/assets/javascripts/webshims/shims/form-core.js +606 -659
  87. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +681 -676
  88. data/vendor/assets/javascripts/webshims/shims/form-message.js +164 -163
  89. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +255 -255
  90. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +383 -383
  91. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +61 -50
  92. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +1569 -1472
  93. data/vendor/assets/javascripts/webshims/shims/geolocation.js +168 -168
  94. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ar.js +32 -32
  95. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ch-ZN.js +32 -32
  96. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-de.txt +33 -33
  97. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-el.js +32 -32
  98. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-en.txt +34 -34
  99. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-es.js +31 -31
  100. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-fr.js +32 -32
  101. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-he.js +32 -32
  102. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hi.js +32 -32
  103. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-hu.js +32 -32
  104. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-it.js +32 -32
  105. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ja.js +32 -32
  106. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-nl.js +32 -32
  107. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-pt-PT.js +32 -32
  108. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-ru.js +31 -31
  109. data/vendor/assets/javascripts/webshims/shims/i18n/errormessages-sv.js +32 -32
  110. data/vendor/assets/javascripts/webshims/shims/json-storage.js +308 -308
  111. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +536 -533
  112. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +861 -0
  113. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +98 -98
  114. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +957 -1073
  115. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +543 -543
  116. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +689 -686
  117. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  118. data/vendor/assets/javascripts/webshims/shims/track-ui.js +9 -8
  119. data/vendor/assets/javascripts/webshims/shims/track.js +17 -11
  120. metadata +6 -6
  121. data/vendor/assets/javascripts/webshims/minified/shims/form-native-fix.js +0 -7
  122. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/README +0 -62
  123. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/README +0 -82
  124. data/vendor/assets/javascripts/webshims/shims/form-native-fix.js +0 -261
@@ -1,677 +1,682 @@
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
-
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
+
677
682
  });