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

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