Code Duplication    Length = 361-372 lines in 2 locations

resources/assets/js/autocomplete.js 1 location

@@ 1-372 (lines=372) @@
1
$(document).ready(function() {
2
3
    /*
4
     * jQuery accessible and keyboard-enhanced autocomplete list
5
     * @version v1.6.0
6
     * Website: https://a11y.nicolas-hoffmann.net/autocomplet-list/
7
     * License MIT: https://github.com/nico3333fr/jquery-accessible-autocomplete-list-aria/blob/master/LICENSE
8
     */
9
    // loading combobox ------------------------------------------------------------------------------------------------------------
10
    // init
11
    var $js_combobox = $('.js-combobox'),
12
        $body = $('body'),
13
        // default_text_help = 'Use tabulation (or down) key to access and browse suggestions after input. Confirm your choice with enter key, or esc key to close suggestions box.',
14
        default_text_help = '',
15
        default_class_for_invisible_text = 'invisible',
16
        suggestion_single = 'There is ',
17
        suggestion_plural = 'There are ',
18
        suggestion_word = 'suggestion',
19
        suggestion_word_plural = 'suggestions',
20
        button_clear_title = 'clear this field',
21
        button_clear_text = 'X',
22
        case_sensitive = 'no',
23
        min_length = 0,
24
        limit_number_suggestions = 666,
25
        search_option = 'beginning', // or 'containing'
26
        see_more_text = 'See more results…',
27
        tablo_suggestions = [];
28
29
30
    function do_see_more_option() {
31
        var $output_content = $('#js-codeit');
32
        $output_content.html('You have to code a function or a redirection to display more results ;)');
33
    }
34
35
    if ($js_combobox.length) { // if there are at least one :)
36
37
        // init
38
        $js_combobox.each(function(index_combo) {
39
            var $this = $(this),
40
                $this_id = $this.attr('id'),
41
                $label_this = $('label[for="' + $this_id + '"]'),
42
                index_lisible = index_combo + 1,
43
                options = $this.data(),
44
                $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass + '-' : '',
45
                $combobox_help_text = typeof options.comboboxHelpText !== 'undefined' ? options.comboboxHelpText : default_text_help,
46
                $list_suggestions = $('#' + $this.attr('list')),
47
                $combobox_button_title = typeof options.comboboxButtonTitle !== 'undefined' ? options.comboboxButtonTitle : button_clear_title,
48
                $combobox_button_text = typeof options.comboboxButtonText !== 'undefined' ? options.comboboxButtonText : button_clear_text,
49
                $combobox_case_sensitive = typeof options.comboboxCaseSensitive !== 'undefined' ? options.comboboxCaseSensitive : case_sensitive,
50
                tablo_temp_suggestions = [];
51
52
            // input
53
            $this.attr({
54
                'data-number': index_lisible,
55
                'autocorrect': 'off',
56
                'autocapitalize': 'off',
57
                'spellcheck': 'false',
58
                'autocomplete': 'off',
59
                'aria-describedby': $combobox_prefix_class + 'help-text' + index_lisible,
60
                'aria-autocomplete': 'list',
61
                'data-lastval': '',
62
                'aria-owns': $combobox_prefix_class + 'suggest_' + index_lisible
63
            });
64
            // stock into tables
65
            $list_suggestions.find('option').each(function(index_option, index_element) {
66
                tablo_temp_suggestions.push(index_element.value);
67
            });
68
            if ($combobox_case_sensitive === 'no') {
69
                // order case tablo_temp_suggestions
70
                tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(function(a, b) {
71
                    a = a.toLowerCase();
72
                    b = b.toLowerCase();
73
                    if (a == b) {
74
                        return 0;
75
                    }
76
                    if (a > b) {
77
                        return 1;
78
                    }
79
                    return -1;
80
                });
81
            } else {
82
                tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort();
83
            }
84
85
            // wrap into a container
86
            $this.wrap('<div class="' + $combobox_prefix_class + 'container js-container" data-combobox-prefix-class="' + $combobox_prefix_class + '"></div>');
87
88
            var $combobox_container = $this.parent();
89
90
            // custom datalist/listbox linked to input
91
            $combobox_container.append('<div id="' + $combobox_prefix_class + 'suggest_' + index_lisible + '" class="js-suggest ' + $combobox_prefix_class + 'suggestions"><div role="listbox"></div></div>');
92
            $list_suggestions.remove();
93
94
            // status zone
95
            // $combobox_container.prepend('<div id="' + $combobox_prefix_class + 'suggestion-text' + index_lisible + '" class="js-suggestion-text ' + $combobox_prefix_class + 'suggestion-text ' + default_class_for_invisible_text + '" aria-live="assertive"></div>');
96
97
            // help text
98
            $combobox_container.prepend('<span id="' + $combobox_prefix_class + 'help-text' + index_lisible + '" class="' + $combobox_prefix_class + 'help-text ' + default_class_for_invisible_text + '">' + $combobox_help_text + '</span>');
99
100
            // label id
101
            $label_this.attr('id', 'label-id-' + $this_id);
102
103
            // button clear
104
            $this.after('<button class="js-clear-button ' + $combobox_prefix_class + 'clear-button" aria-label="' + $combobox_button_title + '" title="' + $combobox_button_title + '" aria-describedby="label-id-' + $this_id + '" type="button">' + $combobox_button_text + '</button>');
105
106
        });
107
108
109
        // listeners
110
        // keydown on field
111
        $body.on('keyup', '.js-combobox', function(event) {
112
                var $this = $(this),
113
                    options_combo = $this.data(),
114
                    $container = $this.parent(),
115
                    $form = $container.parents('form'),
116
                    options = $container.data(),
117
                    $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass : '', // no "-"" because already generated
118
                    $suggestions = $container.find('.js-suggest div'),
119
                    //$suggestion_list = $suggestions.find('.js-suggestion'),
120
                    $suggestions_text = $container.find('.js-suggestion-text'),
121
                    $combobox_suggestion_single = typeof options_combo.suggestionSingle !== 'undefined' ? options_combo.suggestionSingle : suggestion_single,
122
                    $combobox_suggestion_plural = typeof options_combo.suggestionPlural !== 'undefined' ? options_combo.suggestionPlural : suggestion_plural,
123
                    $combobox_suggestion_word = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWord : suggestion_word,
124
                    $combobox_suggestion_word_plural = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWordPlural : suggestion_word_plural,
125
                    combobox_min_length = typeof options_combo.comboboxMinLength !== 'undefined' ? Math.abs(options_combo.comboboxMinLength) : min_length,
126
                    $combobox_case_sensitive = typeof options_combo.comboboxCaseSensitive !== 'undefined' ? options_combo.comboboxCaseSensitive : case_sensitive,
127
                    combobox_limit_number_suggestions = typeof options_combo.comboboxLimitNumberSuggestions !== 'undefined' ? Math.abs(options_combo.comboboxLimitNumberSuggestions) : limit_number_suggestions,
128
                    $combobox_search_option = typeof options_combo.comboboxSearchOption !== 'undefined' ? options_combo.comboboxSearchOption : search_option,
129
                    $combobox_see_more_text = typeof options_combo.comboboxSeeMoreText !== 'undefined' ? options_combo.comboboxSeeMoreText : see_more_text,
130
                    index_table = $this.attr('data-number'),
131
                    value_to_search = $this.val(),
132
                    text_number_suggestions = '';
133
134
                if (event.keyCode === 13) {
135
                    $form.submit();
136
                } else {
137
138
                    if (event.keyCode !== 27) { // No Escape
139
140
                        $this.attr('data-lastval', value_to_search);
141
                        // search for text suggestion in the array tablo_suggestions[index_table]
142
                        var size_tablo = tablo_suggestions[index_table].length,
143
                            i = 0,
144
                            counter = 0;
145
146
                        $suggestions.empty();
147
148
                        if (value_to_search != '' && value_to_search.length >= combobox_min_length) {
149
                            while (i < size_tablo) {
150
                                if (counter < combobox_limit_number_suggestions) {
151
                                    if (
152
                                        (
153
                                            $combobox_search_option === 'containing' &&
154
                                            (
155
                                                ($combobox_case_sensitive === 'yes' && (tablo_suggestions[index_table][i].indexOf(value_to_search) >= 0)) ||
156
                                                ($combobox_case_sensitive === 'no' && (tablo_suggestions[index_table][i].toUpperCase().indexOf(value_to_search.toUpperCase()) >= 0))
157
                                            )
158
                                        ) ||
159
                                        (
160
                                            $combobox_search_option === 'beginning' &&
161
                                            (
162
                                                ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].substring(0, value_to_search.length) === value_to_search) ||
163
                                                ($combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].substring(0, value_to_search.length).toUpperCase() === value_to_search.toUpperCase())
164
                                            )
165
                                        )
166
                                    ) {
167
                                        $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + tablo_suggestions[index_table][i] + '</div>');
168
                                        counter++;
169
                                    }
170
                                }
171
                                i++;
172
                            }
173
                            if (counter >= combobox_limit_number_suggestions) {
174
                                $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion js-seemore ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + $combobox_see_more_text + '</div>');
175
                                counter++;
176
                            }
177
                            // update number of suggestions
178
                            if (counter > 1) {
179
                                text_number_suggestions = $combobox_suggestion_plural + counter + ' ' + $combobox_suggestion_word_plural + '.';
180
                            }
181
                            if (counter === 1) {
182
                                text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.';
183
                            }
184
                            if (counter === 0) {
185
                                text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.';
186
                            }
187
                            if (counter >= 0) {
188
                                var text_number_suggestions_default = $suggestions_text.text();
189
                                if (text_number_suggestions != text_number_suggestions_default) { // @Goestu trick to make it work on all AT
190
                                    var suggestions_to_add = $("<p>").text(text_number_suggestions);
191
                                    $suggestions_text.attr('aria-live', 'polite');
192
                                    $suggestions_text.empty();
193
                                    $suggestions_text.append(suggestions_to_add);
194
                                }
195
                            }
196
197
                        }
198
199
                    }
200
                }
201
202
            })
203
            .on('click', function(event) {
204
                var $target = $(event.target),
205
                    $suggestions_text = $('.js-suggestion-text:not(:empty)'), // if a suggestion text is not empty => suggestion opened somewhere
206
                    $container = $suggestions_text.parents('.js-container'),
207
                    $input_text = $container.find('.js-combobox'),
208
                    $suggestions = $container.find('.js-suggest div');
209
210
                // if click outside => close opened suggestions 
211
                if (!$target.is('.js-suggestion') && !$target.is('.js-combobox') && $suggestions_text.length) {
212
                    $input_text.val($input_text.attr('data-lastval'));
213
                    $suggestions.empty();
214
                    $suggestions_text.empty();
215
                }
216
            })
217
            // tab + down management for autocomplete (when list of suggestion)
218
            .on('keydown', '.js-combobox', function(event) {
219
                var $this = $(this),
220
                    $container = $this.parent(),
221
                    $input_text = $container.find('.js-combobox'),
222
                    $suggestions = $container.find('.js-suggest div'),
223
                    $suggestion_list = $suggestions.find('.js-suggestion'),
224
                    $suggestions_text = $container.find('.js-suggestion-text'),
225
                    $autorise_tab_options = typeof $this.attr('data-combobox-notab-options') !== 'undefined' ? false : true,
226
                    $first_suggestion = $suggestion_list.first();
227
228
                if ((!event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 40) { // tab (if authorised) or bottom
229
                    // See if there are suggestions, and yes => focus on first one
230
                    if ($suggestion_list.length) {
231
                        $input_text.val($first_suggestion.html());
232
                        $suggestion_list.first().focus();
233
                        event.preventDefault();
234
                    }
235
                }
236
                if (event.keyCode == 27 || ($autorise_tab_options === false && event.keyCode == 9)) { // esc or (tab/shift tab + notab option) = close
237
                    $input_text.val($input_text.attr('data-lastval'));
238
                    $suggestions.empty();
239
                    $suggestions_text.empty();
240
                    if (event.keyCode == 27) { // Esc prevented only, tab can go :)
241
                        event.preventDefault();
242
                        setTimeout(function() {
243
                            $input_text.focus();
244
                        }, 300); // timeout to avoid problem in suggestions display
245
                    }
246
                }
247
248
            })
249
            // tab + down management in list of suggestions
250
            .on('keydown', '.js-suggestion', function(event) {
251
                var $this = $(this),
252
                    $container = $this.parents('.js-container'),
253
                    $input_text = $container.find('.js-combobox'),
254
                    $autorise_tab_options = typeof $input_text.attr('data-combobox-notab-options') !== 'undefined' ? false : true,
255
                    $suggestions = $container.find('.js-suggest div'),
256
                    $suggestions_text = $container.find('.js-suggestion-text'),
257
                    $next_suggestion = $this.next(),
258
                    $previous_suggestion = $this.prev();
259
260
                if (event.keyCode == 27 || ($autorise_tab_options === false && event.keyCode == 9)) { // esc or (tab/shift tab + notab option) = close
261
                    if (event.keyCode == 27) { // Esc prevented only, tab can go :)
262
                        $input_text.val($input_text.attr('data-lastval'));
263
                        $suggestions.empty();
264
                        $suggestions_text.empty();
265
                        setTimeout(function() {
266
                            $input_text.focus();
267
                        }, 300); // timeout to avoid problem in suggestions display
268
                        event.preventDefault();
269
                    }
270
                    if ($autorise_tab_options === false && event.keyCode == 9) {
271
                        $suggestions.empty();
272
                        $suggestions_text.empty();
273
                        $input_text.focus();
274
                    }
275
                }
276
                if (event.keyCode == 13 || event.keyCode == 32) { // Enter or space
277
                    if ($this.hasClass('js-seemore')) {
278
                        $input_text.val($input_text.attr('data-lastval'));
279
                        $suggestions.empty();
280
                        $suggestions_text.empty();
281
                        setTimeout(function() {
282
                            $input_text.focus();
283
                        }, 300); // timeout to avoid problem in suggestions display
284
                        // go define the function you need when we click the see_more option
285
                        setTimeout(function() {
286
                            do_see_more_option();
287
                        }, 301); // timeout to avoid problem in suggestions display
288
                        event.preventDefault();
289
                    } else {
290
                        $input_text.val($this.html());
291
                        $input_text.attr('data-lastval', $this.html());
292
                        $suggestions.empty();
293
                        $suggestions_text.empty();
294
                        setTimeout(function() {
295
                            $input_text.focus();
296
                        }, 300); // timeout to avoid problem in suggestions display
297
                        event.preventDefault();
298
                    }
299
300
                }
301
                if ((!event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 40) { // tab (if authorised) or bottom
302
                    if ($next_suggestion.length) {
303
                        $input_text.val($next_suggestion.html());
304
                        $next_suggestion.focus();
305
                    } else {
306
                        $input_text.val($input_text.attr('data-lastval'));
307
                        if (!event.shiftKey && event.keyCode == 9) { // tab closes the list
308
                            var e = jQuery.Event("keydown");
309
                            e.which = 27; // # Some key code value
310
                            e.keyCode = 27;
311
                            $this.trigger(e);
312
                        } else {
313
                            setTimeout(function() {
314
                                $input_text.focus();
315
                            }, 300);
316
                        } // timeout to avoid problem in suggestions display
317
318
                    }
319
                    event.preventDefault();
320
                }
321
322
                if ((event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 38) { // top or Maj+tab (if authorised)
323
                    if ($previous_suggestion.length) {
324
                        $input_text.val($previous_suggestion.html());
325
                        $previous_suggestion.focus();
326
                    } else {
327
                        $input_text.val($input_text.attr('data-lastval')).focus();
328
                    }
329
                    event.preventDefault();
330
                }
331
            })
332
            // clear button
333
            .on('click', '.js-clear-button', function() {
334
                var $this = $(this),
335
                    $container = $this.parent(),
336
                    $input_text = $container.find('.js-combobox'),
337
                    $suggestions = $container.find('.js-suggest div'),
338
                    $suggestions_text = $container.find('.js-suggestion-text');
339
340
                $suggestions.empty();
341
                $suggestions_text.empty();
342
                $input_text.val('');
343
                $input_text.attr('data-lastval', '');
344
345
            })
346
            .on('click', '.js-suggestion', function() {
347
                var $this = $(this),
348
                    value = $this.html(),
349
                    $container = $this.parents('.js-container'),
350
                    $input_text = $container.find('.js-combobox'),
351
                    $suggestions = $container.find('.js-suggest div'),
352
                    $suggestions_text = $container.find('.js-suggestion-text');
353
354
                if ($this.hasClass('js-seemore')) {
355
                    $suggestions.empty();
356
                    $suggestions_text.empty();
357
                    $input_text.focus();
358
                    // go define the function you need when we click the see_more option
359
                    do_see_more_option();
360
                } else {
361
                    $input_text.val(value).focus();
362
                    $suggestions.empty();
363
                    $suggestions_text.empty();
364
                }
365
366
367
            });
368
369
370
    }
371
372
});

public/js/autocomplete.js 1 location

@@ 69-429 (lines=361) @@
66
/******/ ({
67
68
/***/ "./resources/assets/js/autocomplete.js":
69
/***/ (function(module, exports) {
70
71
$(document).ready(function () {
72
73
    /*
74
     * jQuery accessible and keyboard-enhanced autocomplete list
75
     * @version v1.6.0
76
     * Website: https://a11y.nicolas-hoffmann.net/autocomplet-list/
77
     * License MIT: https://github.com/nico3333fr/jquery-accessible-autocomplete-list-aria/blob/master/LICENSE
78
     */
79
    // loading combobox ------------------------------------------------------------------------------------------------------------
80
    // init
81
    var $js_combobox = $('.js-combobox'),
82
        $body = $('body'),
83
84
    // default_text_help = 'Use tabulation (or down) key to access and browse suggestions after input. Confirm your choice with enter key, or esc key to close suggestions box.',
85
    default_text_help = '',
86
        default_class_for_invisible_text = 'invisible',
87
        suggestion_single = 'There is ',
88
        suggestion_plural = 'There are ',
89
        suggestion_word = 'suggestion',
90
        suggestion_word_plural = 'suggestions',
91
        button_clear_title = 'clear this field',
92
        button_clear_text = 'X',
93
        case_sensitive = 'no',
94
        min_length = 0,
95
        limit_number_suggestions = 666,
96
        search_option = 'beginning',
97
        // or 'containing'
98
    see_more_text = 'See more results…',
99
        tablo_suggestions = [];
100
101
    function do_see_more_option() {
102
        var $output_content = $('#js-codeit');
103
        $output_content.html('You have to code a function or a redirection to display more results ;)');
104
    }
105
106
    if ($js_combobox.length) {
107
        // if there are at least one :)
108
109
        // init
110
        $js_combobox.each(function (index_combo) {
111
            var $this = $(this),
112
                $this_id = $this.attr('id'),
113
                $label_this = $('label[for="' + $this_id + '"]'),
114
                index_lisible = index_combo + 1,
115
                options = $this.data(),
116
                $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass + '-' : '',
117
                $combobox_help_text = typeof options.comboboxHelpText !== 'undefined' ? options.comboboxHelpText : default_text_help,
118
                $list_suggestions = $('#' + $this.attr('list')),
119
                $combobox_button_title = typeof options.comboboxButtonTitle !== 'undefined' ? options.comboboxButtonTitle : button_clear_title,
120
                $combobox_button_text = typeof options.comboboxButtonText !== 'undefined' ? options.comboboxButtonText : button_clear_text,
121
                $combobox_case_sensitive = typeof options.comboboxCaseSensitive !== 'undefined' ? options.comboboxCaseSensitive : case_sensitive,
122
                tablo_temp_suggestions = [];
123
124
            // input
125
            $this.attr({
126
                'data-number': index_lisible,
127
                'autocorrect': 'off',
128
                'autocapitalize': 'off',
129
                'spellcheck': 'false',
130
                'autocomplete': 'off',
131
                'aria-describedby': $combobox_prefix_class + 'help-text' + index_lisible,
132
                'aria-autocomplete': 'list',
133
                'data-lastval': '',
134
                'aria-owns': $combobox_prefix_class + 'suggest_' + index_lisible
135
            });
136
            // stock into tables
137
            $list_suggestions.find('option').each(function (index_option, index_element) {
138
                tablo_temp_suggestions.push(index_element.value);
139
            });
140
            if ($combobox_case_sensitive === 'no') {
141
                // order case tablo_temp_suggestions
142
                tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(function (a, b) {
143
                    a = a.toLowerCase();
144
                    b = b.toLowerCase();
145
                    if (a == b) {
146
                        return 0;
147
                    }
148
                    if (a > b) {
149
                        return 1;
150
                    }
151
                    return -1;
152
                });
153
            } else {
154
                tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort();
155
            }
156
157
            // wrap into a container
158
            $this.wrap('<div class="' + $combobox_prefix_class + 'container js-container" data-combobox-prefix-class="' + $combobox_prefix_class + '"></div>');
159
160
            var $combobox_container = $this.parent();
161
162
            // custom datalist/listbox linked to input
163
            $combobox_container.append('<div id="' + $combobox_prefix_class + 'suggest_' + index_lisible + '" class="js-suggest ' + $combobox_prefix_class + 'suggestions"><div role="listbox"></div></div>');
164
            $list_suggestions.remove();
165
166
            // status zone
167
            // $combobox_container.prepend('<div id="' + $combobox_prefix_class + 'suggestion-text' + index_lisible + '" class="js-suggestion-text ' + $combobox_prefix_class + 'suggestion-text ' + default_class_for_invisible_text + '" aria-live="assertive"></div>');
168
169
            // help text
170
            $combobox_container.prepend('<span id="' + $combobox_prefix_class + 'help-text' + index_lisible + '" class="' + $combobox_prefix_class + 'help-text ' + default_class_for_invisible_text + '">' + $combobox_help_text + '</span>');
171
172
            // label id
173
            $label_this.attr('id', 'label-id-' + $this_id);
174
175
            // button clear
176
            $this.after('<button class="js-clear-button ' + $combobox_prefix_class + 'clear-button" aria-label="' + $combobox_button_title + '" title="' + $combobox_button_title + '" aria-describedby="label-id-' + $this_id + '" type="button">' + $combobox_button_text + '</button>');
177
        });
178
179
        // listeners
180
        // keydown on field
181
        $body.on('keyup', '.js-combobox', function (event) {
182
            var $this = $(this),
183
                options_combo = $this.data(),
184
                $container = $this.parent(),
185
                $form = $container.parents('form'),
186
                options = $container.data(),
187
                $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass : '',
188
                // no "-"" because already generated
189
            $suggestions = $container.find('.js-suggest div'),
190
191
            //$suggestion_list = $suggestions.find('.js-suggestion'),
192
            $suggestions_text = $container.find('.js-suggestion-text'),
193
                $combobox_suggestion_single = typeof options_combo.suggestionSingle !== 'undefined' ? options_combo.suggestionSingle : suggestion_single,
194
                $combobox_suggestion_plural = typeof options_combo.suggestionPlural !== 'undefined' ? options_combo.suggestionPlural : suggestion_plural,
195
                $combobox_suggestion_word = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWord : suggestion_word,
196
                $combobox_suggestion_word_plural = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWordPlural : suggestion_word_plural,
197
                combobox_min_length = typeof options_combo.comboboxMinLength !== 'undefined' ? Math.abs(options_combo.comboboxMinLength) : min_length,
198
                $combobox_case_sensitive = typeof options_combo.comboboxCaseSensitive !== 'undefined' ? options_combo.comboboxCaseSensitive : case_sensitive,
199
                combobox_limit_number_suggestions = typeof options_combo.comboboxLimitNumberSuggestions !== 'undefined' ? Math.abs(options_combo.comboboxLimitNumberSuggestions) : limit_number_suggestions,
200
                $combobox_search_option = typeof options_combo.comboboxSearchOption !== 'undefined' ? options_combo.comboboxSearchOption : search_option,
201
                $combobox_see_more_text = typeof options_combo.comboboxSeeMoreText !== 'undefined' ? options_combo.comboboxSeeMoreText : see_more_text,
202
                index_table = $this.attr('data-number'),
203
                value_to_search = $this.val(),
204
                text_number_suggestions = '';
205
206
            if (event.keyCode === 13) {
207
                $form.submit();
208
            } else {
209
210
                if (event.keyCode !== 27) {
211
                    // No Escape
212
213
                    $this.attr('data-lastval', value_to_search);
214
                    // search for text suggestion in the array tablo_suggestions[index_table]
215
                    var size_tablo = tablo_suggestions[index_table].length,
216
                        i = 0,
217
                        counter = 0;
218
219
                    $suggestions.empty();
220
221
                    if (value_to_search != '' && value_to_search.length >= combobox_min_length) {
222
                        while (i < size_tablo) {
223
                            if (counter < combobox_limit_number_suggestions) {
224
                                if ($combobox_search_option === 'containing' && ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].indexOf(value_to_search) >= 0 || $combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].toUpperCase().indexOf(value_to_search.toUpperCase()) >= 0) || $combobox_search_option === 'beginning' && ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].substring(0, value_to_search.length) === value_to_search || $combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].substring(0, value_to_search.length).toUpperCase() === value_to_search.toUpperCase())) {
225
                                    $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + tablo_suggestions[index_table][i] + '</div>');
226
                                    counter++;
227
                                }
228
                            }
229
                            i++;
230
                        }
231
                        if (counter >= combobox_limit_number_suggestions) {
232
                            $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion js-seemore ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + $combobox_see_more_text + '</div>');
233
                            counter++;
234
                        }
235
                        // update number of suggestions
236
                        if (counter > 1) {
237
                            text_number_suggestions = $combobox_suggestion_plural + counter + ' ' + $combobox_suggestion_word_plural + '.';
238
                        }
239
                        if (counter === 1) {
240
                            text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.';
241
                        }
242
                        if (counter === 0) {
243
                            text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.';
244
                        }
245
                        if (counter >= 0) {
246
                            var text_number_suggestions_default = $suggestions_text.text();
247
                            if (text_number_suggestions != text_number_suggestions_default) {
248
                                // @Goestu trick to make it work on all AT
249
                                var suggestions_to_add = $("<p>").text(text_number_suggestions);
250
                                $suggestions_text.attr('aria-live', 'polite');
251
                                $suggestions_text.empty();
252
                                $suggestions_text.append(suggestions_to_add);
253
                            }
254
                        }
255
                    }
256
                }
257
            }
258
        }).on('click', function (event) {
259
            var $target = $(event.target),
260
                $suggestions_text = $('.js-suggestion-text:not(:empty)'),
261
                // if a suggestion text is not empty => suggestion opened somewhere
262
            $container = $suggestions_text.parents('.js-container'),
263
                $input_text = $container.find('.js-combobox'),
264
                $suggestions = $container.find('.js-suggest div');
265
266
            // if click outside => close opened suggestions 
267
            if (!$target.is('.js-suggestion') && !$target.is('.js-combobox') && $suggestions_text.length) {
268
                $input_text.val($input_text.attr('data-lastval'));
269
                $suggestions.empty();
270
                $suggestions_text.empty();
271
            }
272
        })
273
        // tab + down management for autocomplete (when list of suggestion)
274
        .on('keydown', '.js-combobox', function (event) {
275
            var $this = $(this),
276
                $container = $this.parent(),
277
                $input_text = $container.find('.js-combobox'),
278
                $suggestions = $container.find('.js-suggest div'),
279
                $suggestion_list = $suggestions.find('.js-suggestion'),
280
                $suggestions_text = $container.find('.js-suggestion-text'),
281
                $autorise_tab_options = typeof $this.attr('data-combobox-notab-options') !== 'undefined' ? false : true,
282
                $first_suggestion = $suggestion_list.first();
283
284
            if (!event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 40) {
285
                // tab (if authorised) or bottom
286
                // See if there are suggestions, and yes => focus on first one
287
                if ($suggestion_list.length) {
288
                    $input_text.val($first_suggestion.html());
289
                    $suggestion_list.first().focus();
290
                    event.preventDefault();
291
                }
292
            }
293
            if (event.keyCode == 27 || $autorise_tab_options === false && event.keyCode == 9) {
294
                // esc or (tab/shift tab + notab option) = close
295
                $input_text.val($input_text.attr('data-lastval'));
296
                $suggestions.empty();
297
                $suggestions_text.empty();
298
                if (event.keyCode == 27) {
299
                    // Esc prevented only, tab can go :)
300
                    event.preventDefault();
301
                    setTimeout(function () {
302
                        $input_text.focus();
303
                    }, 300); // timeout to avoid problem in suggestions display
304
                }
305
            }
306
        })
307
        // tab + down management in list of suggestions
308
        .on('keydown', '.js-suggestion', function (event) {
309
            var $this = $(this),
310
                $container = $this.parents('.js-container'),
311
                $input_text = $container.find('.js-combobox'),
312
                $autorise_tab_options = typeof $input_text.attr('data-combobox-notab-options') !== 'undefined' ? false : true,
313
                $suggestions = $container.find('.js-suggest div'),
314
                $suggestions_text = $container.find('.js-suggestion-text'),
315
                $next_suggestion = $this.next(),
316
                $previous_suggestion = $this.prev();
317
318
            if (event.keyCode == 27 || $autorise_tab_options === false && event.keyCode == 9) {
319
                // esc or (tab/shift tab + notab option) = close
320
                if (event.keyCode == 27) {
321
                    // Esc prevented only, tab can go :)
322
                    $input_text.val($input_text.attr('data-lastval'));
323
                    $suggestions.empty();
324
                    $suggestions_text.empty();
325
                    setTimeout(function () {
326
                        $input_text.focus();
327
                    }, 300); // timeout to avoid problem in suggestions display
328
                    event.preventDefault();
329
                }
330
                if ($autorise_tab_options === false && event.keyCode == 9) {
331
                    $suggestions.empty();
332
                    $suggestions_text.empty();
333
                    $input_text.focus();
334
                }
335
            }
336
            if (event.keyCode == 13 || event.keyCode == 32) {
337
                // Enter or space
338
                if ($this.hasClass('js-seemore')) {
339
                    $input_text.val($input_text.attr('data-lastval'));
340
                    $suggestions.empty();
341
                    $suggestions_text.empty();
342
                    setTimeout(function () {
343
                        $input_text.focus();
344
                    }, 300); // timeout to avoid problem in suggestions display
345
                    // go define the function you need when we click the see_more option
346
                    setTimeout(function () {
347
                        do_see_more_option();
348
                    }, 301); // timeout to avoid problem in suggestions display
349
                    event.preventDefault();
350
                } else {
351
                    $input_text.val($this.html());
352
                    $input_text.attr('data-lastval', $this.html());
353
                    $suggestions.empty();
354
                    $suggestions_text.empty();
355
                    setTimeout(function () {
356
                        $input_text.focus();
357
                    }, 300); // timeout to avoid problem in suggestions display
358
                    event.preventDefault();
359
                }
360
            }
361
            if (!event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 40) {
362
                // tab (if authorised) or bottom
363
                if ($next_suggestion.length) {
364
                    $input_text.val($next_suggestion.html());
365
                    $next_suggestion.focus();
366
                } else {
367
                    $input_text.val($input_text.attr('data-lastval'));
368
                    if (!event.shiftKey && event.keyCode == 9) {
369
                        // tab closes the list
370
                        var e = jQuery.Event("keydown");
371
                        e.which = 27; // # Some key code value
372
                        e.keyCode = 27;
373
                        $this.trigger(e);
374
                    } else {
375
                        setTimeout(function () {
376
                            $input_text.focus();
377
                        }, 300);
378
                    } // timeout to avoid problem in suggestions display
379
                }
380
                event.preventDefault();
381
            }
382
383
            if (event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 38) {
384
                // top or Maj+tab (if authorised)
385
                if ($previous_suggestion.length) {
386
                    $input_text.val($previous_suggestion.html());
387
                    $previous_suggestion.focus();
388
                } else {
389
                    $input_text.val($input_text.attr('data-lastval')).focus();
390
                }
391
                event.preventDefault();
392
            }
393
        })
394
        // clear button
395
        .on('click', '.js-clear-button', function () {
396
            var $this = $(this),
397
                $container = $this.parent(),
398
                $input_text = $container.find('.js-combobox'),
399
                $suggestions = $container.find('.js-suggest div'),
400
                $suggestions_text = $container.find('.js-suggestion-text');
401
402
            $suggestions.empty();
403
            $suggestions_text.empty();
404
            $input_text.val('');
405
            $input_text.attr('data-lastval', '');
406
        }).on('click', '.js-suggestion', function () {
407
            var $this = $(this),
408
                value = $this.html(),
409
                $container = $this.parents('.js-container'),
410
                $input_text = $container.find('.js-combobox'),
411
                $suggestions = $container.find('.js-suggest div'),
412
                $suggestions_text = $container.find('.js-suggestion-text');
413
414
            if ($this.hasClass('js-seemore')) {
415
                $suggestions.empty();
416
                $suggestions_text.empty();
417
                $input_text.focus();
418
                // go define the function you need when we click the see_more option
419
                do_see_more_option();
420
            } else {
421
                $input_text.val(value).focus();
422
                $suggestions.empty();
423
                $suggestions_text.empty();
424
            }
425
        });
426
    }
427
});
428
429
/***/ }),
430
431
/***/ 2:
432
/***/ (function(module, exports, __webpack_require__) {