PageSourceSearch

https://vesti.dp.ua/wp-content/plugins/liqpay_wordpress/js/jquery.dataTables.yadcf.js?ver=7.1.2

js vesti.dp.ua collected 2026-09-24 21:43:15 UTC 248,104 bytes, 4,355 lines download raw bytes

1/*!
2* Yet Another DataTables Column Filter - (yadcf)
3*
4* File:        jquery.dataTables.yadcf.js
5* Version:     0.9.1
6*
7* Author:      Daniel Reznick
8* Info:        https://github.com/vedmack/yadcf
9* Contact:     [email protected]
10* Twitter:     @danielreznick
11* Q&A          http://stackoverflow.com/questions/tagged/yadcf
12*
13* Copyright 2015 Daniel Reznick, all rights reserved.
14* Copyright 2015 Released under the MIT License
15*
16* This source file is distributed in the hope that it will be useful, but
17* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
19*/
20/*
21* Parameters:
22*
23*
24* -------------
25* column_number
26                Required:           true
27                Type:               int
28                Description:        The number of the column to which the filter will be applied
29* filter_type
30                Required:           false
31                Type:               String
32                Default value:      'select'
33                Possible values:    select / multi_select / auto_complete / text / date / range_number / range_number_slider / range_date / custom_func / multi_select_custom_func
34                Description:        The type of the filter to be used in the column
35* custom_func
36                Required:           true (when filter_type is custom_func / multi_select_custom_func)
37                Type:               function
38                Default value:      undefined
39                Description:        should be pointing to a function with the following signature myCustomFilterFunction(filterVal, columnVal, rowValues, stateVal) , where `filterVal` is the value from the select box,
40                                    `columnVal` is the value from the relevant row column, `rowValues` is an array that holds the values of the entire row and `stateVal` which holds the current state of the table row DOM
41                                    , stateVal is perfect to handle situations in which you placing radiobuttons / checkbox inside table column. This function should return true if the row matches your condition and the row should be displayed) and false otherwise
42                Note:               When using multi_select_custom_func as filter_type filterVal will hold an array of selected values from the multi select element
43* data
44                Required:           false
45                Type:               Array (of string or objects)
46                Description:        When the need of predefined data for filter is needed just use an array of strings ["value1","value2"....] (supported in select / multi_select / auto_complete filters) or
47                                    array of objects [{value: 'Some Data 1', label: 'One'}, {value: 'Some Data 3', label: 'Three'}] (supported in select / multi_select filters)
48                Note:               that when filter_type is custom_func / multi_select_custom_func this array will populate the custom filter select element
49* data_as_is
50                Required:           false
51                Type:               boolean
52                Default value:      false
53                Description:        When set to true, the value of the data attribute will be fed into the filter as is (without any modification/decoration).
54                                    Perfect to use when you want to define your own <option></option> for the filter
55                Note:               Currently supported by the select / multi_select filters
56* append_data_to_table_data
57                Required:           false
58                Type:               String
59                Default value:      undefined
60                Possible values:    before / sorted
61                Description:        Use 'before' to place your data array before the values that yadcf grabs from the table
62                                    use 'sorted' to place the data array sorted along with the values that yadcf grabs from the table
63                Note:               'sorted' option will have affect only if you data is an array of primitives (not objects)
64* column_data_type
65                Required:           false
66                Type:               String
67                Default value:      'text'
68                Possible values:    text / html / rendered_html
69                Description:        The type of data in column , use "html" when you have some html code in the column (support parsing of multiple elements per cell),
70                                    use rendered_html when you are using render function of columnDefs or similar, that produces a html code, note that both types rendered_html and html have a fallback for simple text parsing
71* text_data_delimiter
72                Required:           false
73                Type:               String
74                Description:        Delimiter that seperates text in table column, for example text_data_delimiter: ","
75* html_data_type
76                Required:           false
77                Type:               String
78                Default value:      'text'
79                Possible values:    text / value / id / selector
80                Description:        When using "html" for column_data_type argument you can choose how exactly to parse your html element/s in column , for example use "text" for the following <sp
80an class="someClass">Some text</span>
81                Special notes:      when using selector you must provide a valid selector string for the html_data_selector property
82* html_data_selector
83                Required:           false
84                Type:               String
85                Default value:      undefined
86                Possible values:    any valid selector string, for example 'li:eq(1)'
87                Description:        allows for advanced text value selection within the html located in the td element
88                Special notes:      know that the selector string "begin is search" from (and not outside) the first element of the html inside the td
89                                    (supported by range_number_slider / select / auto_complete)
90* html5_data
91                Required:           false
92                Type:               String
93                Default value:      undefined
94                Possible values:    data-filter / data-search / anything that is supported by datatables
95                Description:        Allows to filter based on data-filter / data-search attributes of the <td> element, read more: http://www.datatables.net/examples/advanced_init/html5-data-attributes.html
96* filter_container_id
97                Required:           false
98                Type:               String
99                Description:        In case that user don't want to place the filter in column header , he can pass an id of the desired container for the column filter
100* filter_container_selector
101                Required:           false
102                Type:               String
103                Description:        In case that user don't want to place the filter in column header , he can pass a (jquery) selector of the desired container for the column filter
104* filter_default_label
105                Required:           false
106                Type:               String / Array of string in case of range_number filter (first entry is for the first input and the second entry is for the second input
107                Default value:      'Select value'
108                Description:        The label that will appear in the select menu filter when no value is selected from the filter
109* omit_default_label
110                Required:           false
111                Type:               boolean
112                Default value:      false
113                Description:        Prevent yadcf from adding "default_label" (Select value / Select values)
114                Note                Currently supported in select / multi_select / custom_func / multi_select_custom_func
115* filter_reset_button_text
116                Required:           false
117                Type:               String / boolean
118                Default value:      'x'
119                Description:        The text that will appear inside the reset button next to the select drop down (set this to false (boolean) in order to hide it from that column filter)
120* enable_auto_complete (this attribute is deprecated , and will become obsolete in the future , so you better start using filter_type: "auto_complete")
121                Required:           false
122                Type:               boolean
123                Default value:      false
124                Description:        Turns the filter into an autocomplete input - make use of the jQuery UI Autocomplete widget (with some enhancements)
125* sort_as
126                Required:           false
127                Type:               String
128                Default value:      'alpha'
129                Possible values:    alpha / num / alphaNum / none
130                Description:        Defines how the values in the filter will be sorted, alphabetically / numerically / alphanumeric / custom / not sorted at all (none is useful to preserve
131                                    the order of the data attribute as is)
132                Note:               When custom value is set you must provide a custom sorting function for the sort_as_custom_func property
133* sort_as_custom_func
134                Required:           false
135                Type:               function
136                Default value:      undefined
137                Description:        Allows to provide a custom sorting function for the filter elements
138* sort_order
139                Required:           false
140                Type:               String
141                Default value:      'asc'
142                Possible values:    asc / desc
143                Description:        Defines the order in which the values in the filter will be sorted, ascending or descending
144* date_format
145                Required:           false
146                Type:               String
147                Default value:      'mm/dd/yyyy'
148                Possible values:    mm/dd/yyyy / dd/mm/yyyy / hh:mm (when using datepicker_type: 'bootstrap-datetimepicker')
149                Description:        Defines the format in which the date values are being parsed into Date object
150                Note:               You can replace the / separator with other one , for example mm-dd-yy
151* moment_date_format
152                Required:           false
153                Type:               String
154                Default value:      undefined
155                Possible values:    Any format accepted by momentjs
156                Description:        Defines the format in which the date values are being parsed into Date object by momentjs library
157                Note:               Currently relevant only when using datepicker_type: 'bootstrap-datetimepicker')
158* ignore_char
159                Required:           false
160                Type:               String
161                Description:        Tells the range_number and range_number_slide to ignore specific char while filtering (that char can used as number separator)
162                Note:               Use double escape for regex chars , e.g \\$ , also you can use multiple ignore chars with | , e.g '_|\\.|\\$'
163* filter_match_mode
164                Required:           false
165                Type:               String
166                Default value:      contains
167                Possible values:    contains / exact / startsWith / regex
168                Description:        Allows to control the matching mode of the filter (supported in select / auto_complete / text filters)
169* exclude
170                Required:           false
171                Type:               boolean
172                Default value:      undefined
173                Description:        Adds a checkbox next to the filter that allows to do a "not/exclude" filtering (acts the same  all filter_match_mode)
174                Note:               Currently available for the text filter
175* exclude_label
176                Required:           false
177                Type:               String
178                Default value:      'exclude'
179                Description:        The label that will appear above the exclude checkbox
180* select_type
181                Required:           false
182                Type:               String
183                Default value:      undefined
184                Possible values:    chosen / select2 / custom_select
185                Description:        Turns the simple select element into Chosen / Select2 (make use of the Chosen / Select2 select jQuery plugins)
186                Note:               When using custom_select , make sure to call the initSelectPluginCustomTriggers,
187                                    before calling yadcf constructor / init function
188* select_type_options
189                Required:           false
190                Type:               Object
191                Default value:      {}
192                Description:        This parameter will be passed "as is" to the Chosen/Select2 plugin constructor
193* filter_plugin_options
194                Required:           false
195                Type:               Object
196                Default value:      undefined
197                Description:        This parameter will be passed to the jQuery Autocomplete / jQuery Slider / Bootstrap Datetimepicker
198* case_insensitive
199                Required:           false
200                Type:               boolean
201                Default value:      true
202                Description:        Do case-insensitive filtering (supported in select / auto_complete / text filters)
203* filter_delay
204                Required:           false
205                Type:               integer
206                Default value:      undefined
207                Description:        Delay filter execution for a XXX milliseconds - filter will fire XXX milliseconds after the last keyup.
208                Special notes:      Currently supported in text / range_number / range_date filters / range_number_slider
209* datepicker_type
210                Required:           false
211                Type:               String
212                Default value:      'jquery-ui'
213                Possible values:    'jquery-ui' / 'bootstrap-datetimepicker'
214                Description:        You can choose datapicker library from defined in special notes
215                Special notes:      Currently supported only jQueryUI datepicker (datepicker) and Bootstrap datepicker (eonasdan-bootstrap-datetimepicker)
216                                    Bootstrap datepicker depends moment library. This plugin depends moment too.
217* style_class
218                Required:           false
219                Type:               String
220                Description:        Allows adding additional class/classes to filter - available for the following filters:
221                                    select / multi_select / text / custom_func / multi_select_custom_func
222* reset_button_style_class
223                Required:           false
224                Type:               String
225                Description:        Allows adding additional class/classes to filter reset button
226* Global Parameters (per table rather than per column)
227*
228* Usage example yadcf.init(oTable,[{column_number : 0}, {column_number: 3}],{cumulative_filtering: true});
229* -------------
230* externally_triggered
231                Required:           false
232                Type:               boolean
233                Default value:      false
234                Description:        Filters will filter only when yadcf.exFilterExternallyTriggered(table_arg) is called
235                Special notes:      Useful when you want to build some form with filters and you want to trigger the filter when that form
236                                    "submit" button is clicked (instead of filtering per filter input change)
237* cumulative_filtering
238                Required:           false
239                Type:               boolean
240                Default value:      false
241                Description:        Change the default behaviour of the filters so its options will be populated from the filtered rows (remaining
242                                    table data after filtering) only, unlike the normal behaviour in which the options of the filters are from all the table data
243* filters_position
244                Required:           false
245                Type:               String
246                Default value:      header
247                Possible values:    'header' / 'footer'
248                Description:        Filters can be placed in the header (thead) or in the footer (tfoot) of the table,
249                Note:               When 'footer' you must provide a valid tfoot elemet in your table
250* filters_tr_index
251                Required:           false
252                Type:               integer
253                Default value:      undefined
254                Description:        Allow to control the index of the <tr> inside the thead of the table, e.g when one <tr> is used for headers/sort and
255                                    another <tr> is used for filters
256*
257*
258*
259*
260* External API functions:
261*
262*
263* -------------
264* exFilterColumn
265                Description:        Allows to trigger filter/s externally/programmatically (support ALL filter types!!!) , perfect for showing table with pre filtered columns
266                Arguments:          table_arg: (variable of the datatable),
267                                    array of pairs: column number String/Object with from and to, filter_value (the actual string value that we want to filter by)
268                Usage example:      yadcf.exFilterColumn(oTable, [[0, 'Some Data 2']]); //pre filter one column
269                                    yadcf.exFilterColumn(oTable, [[0, 'Some Data 1'], [1, {from: 111, to: 1110}], [2, {from: "", to: "11/25/2014"}]]); //pre filter several columns
270                                    yadcf.exFilterColumn(oTable, [[0, ['Some Data 1','Some Data 2']]]); // for pre filtering multi select filter you should use array with values (or an array with single value)
271* exGetColumnFilterVal
272                Description:        Allows to retrieve  column current filtered value (support ALL filter types!!!)
273                Arguments:          table_arg: (variable of the datatable),
274                                    column number:  column number from which we want the value
275                Usage example:      yadcf.exGetColumnFilterVal(oTable,1);
276                Return value:       String (for simple filter) / Object (for range filter) with from and to properties / Array of str
276ings for multi_select filter
277* exResetAllFilters
278                Description:        Allows to reset all filters externally/programmatically (support ALL filter types!!!) , perfect for adding a "reset all" button to your page!
279                Arguments:          table_arg: (variable of the datatable)
280                                    noRedraw:   (boolean) , use it if you don't want your table to be reloaded after the filter reset,
281                                                for example if you planning to call exFilterColumn function right after the exResetAllFilters (to avoid two AJAX requests)
282                Usage example:      yadcf.exResetAllFilters(oTable);
283* exResetFilters
284                Description:        Allows to reset specific filters externally/programmatically (support ALL filter types!!!) , can be used for resetting one or more filters
285                Arguments:          table_arg: (variable of the datatable)
286                                    array with columns numbers
287                                    noRedraw:   (boolean) , use it if you don't want your table to be reloaded after the filter reset,
288                                                for example if you planning to call exFilterColumn function right after the exResetFilters (to avoid two AJAX requests)
289                Usage example:      yadcf.exResetAllFilters(oTable, [1,2]);
290* initSelectPluginCustomTriggers
291                Description:        Allows to set any select jquery plugin initialize and refresh functions. jQuery selector will be passed to the user defined function to initialize and refresh the plugin.
292                                    Great for integrating any jquey select plugin  (Selectize / MultiSelect / etc)
293                Arguments:          initFunc  : function which will initialize the plugin
294                                    refreshFunc : function that will refresh the plugin.
295                                    destroyFunc : function that will destroy the plugin (upon table destroy even trigger).
296                Usage example:      yadcf.initSelectPluginCustomTriggers(function($filterSelector){$filterSelector.multiselect({});}, function($filterSelector){$filterSelector.multiselect("refresh")}, , function($filterSelector){$filterSelector.multiselect("destroy")});
297* exFilterExternallyTriggered
298                Description:        Triggers all the available filters, should be used only when the externally_triggered option used
299                Arguments:          table_arg: (variable of the datatable)
300                Usage example:      yadcf.exResetAllFilters(table_arg);
301*
302*
303*
304* Server-side processing API (see more on showcase):
305*
306* From server to client:
307* In order to populate the filters with data from server (select / auto_complete / range_number_slider (min and max values), you should add to your current json respond the following properties:
308* lets say for first column you add yadcf_data_0 filled with array of values, for column second column yadcf_data_1 and so on...
309*
310* From client to server:
311* Read the filtered value like this (for first column) req.getParameter("columns[0][search][value]"); <- java code , php/.Net/etc you just need to get it from the request
312* Range filter value will arrive delimited by  -yadcf_delim- , so just split it into an array or something like this: String[] minMax = sSearch_0.split("-yadcf_delim-");
313*
314*
315*
316*
317*
318* Working with filters for multiple tables:
319*
320*
321* -------------
322* initMultipleTables
323                Description:        Allows to create filter that will affect multiple tables / multiple column(s) in multiple tables
324                Arguments:          Array of tables,
325                                    Array of objects with properties for each filter
326                Usage example:      yadcf.initMultipleTables([oTable, oTable2], [{
327                                        column_number: [0, 1], filter_container_id: 'multi-table-filter-0', filter_default_label: 'Filter all tables columns 1 and 2!'
328                                    },
329                                    {
330                                        column_number: [2], filter_container_id: 'multi-table-filter-1', filter_default_label: 'Filter all tables column 3!'
331                                    }]);
332                Valid properties:   filter_type: 'text' (default) / 'select' / 'multi_select',
333                                    column_number: not required (in that case the filter will be global)
334                                                   can be either number(single column filter) or array of numbers(multiple columns filter)
335                                    filter_container_id: '' (required),
336                Note:               All the usual properties of yadcf should be supported in initMultipleTables too!
337* initMultipleColumns
338                Description:        Allows to create filter that will affect multiple column(s) in in a particular table
339                Arguments:          Table variable,
340                                    Array of objects with properties for each filter
341                Usage example:      yadcf.initMultipleColumns(oTable, [{
342                                        column_number: [0, 1], filter_container_id: 'multi-table-filter-0', filter_default_label: 'Filter columns 1 and 2!'
343                                    },
344                                    {
345                                        column_number: [2, 3], filter_container_id: 'multi-table-filter-1', filter_default_label: 'Filter column 3 and 4!'
346                                    }]);
347                Valid properties:   filter_type: 'text' (default) / 'select' / 'multi_select',
348                                    column_number: not required (in that case the filter will be global)
349                                                   can be either number(single column filter) or array of numbers(multiple columns filter)
350                                    filter_container_id: '' (required),
351                Note:               All the usual properties of yadcf should be supported in initMultipleColumns too!
352*/
353(function (root, factory) {
354    if (typeof define === 'function' && define.amd) {
355        define(['jquery'], factory);
356    } else if (typeof module === 'object' && module.exports) {
357        module.exports = factory(require('jquery'));
358    } else {
359        root.yadcf = factory(root.jQuery);
360    }
361}(this, function($) {
362    var yadcf = (function () {
363
364        'use strict';
365
366        var tablesDT = {},
367            oTables = {},
368            oTablesIndex = {},
369            options = {},
370            plugins = {},
371            exFilterColumnQueue = [],
372            yadcfDelay,
373            reA = /[^a-zA-Z]/g,
374            reN = /[^0-9]/g,
375            selectElementCustomInitFunc,
376            selectElementCustomRefreshFunc,
377            selectElementCustomDestroyFunc,
378            placeholderLang = {
379                'select': 'Select value',
380                'select_multi': 'Select values',
381                'filter': 'Type to filter',
382                'range': ['From', 'To'],
383                'date': 'Select a date'
384            },
385            settingsMap = {};
386
387        //From ColReorder (SpryMedia Ltd (www.sprymedia.co.uk))
388        function getSettingsObjFromTable(dt) {
389            var oDTSettings;
390            if ($.fn.dataTable.Api) {
391                oDTSettings = new $.fn.dataTable.Api(dt).settings()[0];
392            } else if (dt.fnSettings) {// 1.9 compatibility
393                // DataTables object, convert to the settings object
394                oDTSettings = dt.fnSettings();
395            } else if (typeof dt === 'string') {// jQuery selector
396                if ($.fn.dataTable.fnIsDataTable($(dt)[0])) {
397                    oDTSettings = $(dt).eq(0).dataTable().fnSettings();
398                }
399            } else if (dt.nodeName && dt.nodeName.toLowerCase() === 'table') {
400                // Table node
401                if ($.fn.dataTable.fnIsDataTable(dt.nodeName)) {
402                    oDTSettings = $(dt.nodeName).dataTable().fnSettings();
403                }
404            } else if (dt instanceof jQuery) {
405                // jQuery object
406                if ($.fn.dataTable.fnIsDataTable(dt[0])) {
407                    oDTSettings = dt.eq(0).dataTable().fnSettings();
408                }
409            } else {
410                // DataTables settings object
411                oDTSettings = dt;
412            }
413            return oDTSettings;
414        }
415
416        function arraySwapValueWithIndex(pArray) {
417            var tmp = [],
418                i;
419            for (i = 0; i < pArray.length; i++) {
420                tmp[pArray[i]] = i;
421            }
422            return tmp;
423        }
424
425        function arraySwapValueWithIndex2(pArray) {
426            var tmp = [],
427                i;
428            for (i = 0; i < pArray.length; i++) {
429                tmp[pArray[i]._ColReorder_iOrigCol] = i;
430            }
431            return tmp;
432        }
433
434        function initColReorder2(settingsDt, table_selector_jq_friendly) {
435            if (settingsDt.oSavedState != undefined && settingsDt.oSavedState.ColReorder !== undefined) {
436                if (plugins[table_selector_jq_friendly] === undefined) {
437                    plugins[table_selector_jq_friendly] = {};
438                    plugins[table_selector_jq_friendly].ColReorder = arraySwapValueWithIndex(settingsDt.oSavedState.ColReorder);
439                }
440            } else if (settingsDt.aoColumns[0]._ColReorder_iOrigCol !== undefined) {
441                if (plugins[table_selector_jq_friendly] === undefined) {
442                    plugins[table_selector_jq_friendly] = {};
443                    plugins[table_selector_jq_friendly].ColReorder = arraySwapValueWithIndex2(settingsDt.aoColumns);
444                }
445            }
446        }
447
448        function initColReorderFromEvent(table_selector_jq_friendly) {
449            plugins[table_selector_jq_friendly] = undefined;
450        }
451
452        function columnsArrayToString(column_number) {
453            var column_number_obj = {};
454            if (column_number !== undefined) {
455                if (column_number instanceof Array) {
456                    column_number_obj.column_number_str = column_number.join('_');
457                } else {
458                    column_number_obj.column_number_str = column_number;
459                    column_number = [];
460                    column_number.push(column_number_obj.column_number_str);
461                }
462            } else {
463                column_number_obj.column_number_str = 'global';
464            }
465            column_number_obj.column_number = column_number;
466            return column_number_obj;
467        }
468
469        function getOptions(selector) {
470            return options[selector];
471        }
472
473        function eventTargetFixUp(pEvent) {
474            if (pEvent.target === undefined) {
475                pEvent.target = pEvent.srcElement;
476            }
477            return pEvent;
478        }
479
480        function dot2obj(tmpObj, dot_refs) {
481            var i = 0;
482            dot_refs = dot_refs.split(".");
483            for (i = 0; i < dot_refs.length; i++) {
484                tmpObj = tmpObj[dot_refs[i]];
485            }
486            return tmpObj;
487        }
488
489        function setOptions(selector_arg, options_arg, params) {
490            var tmpOptions = {},
491                i,
492                j,
493                col_num_as_int,
494                default_options = {
495                    filter_type : "select",
496                    enable_auto_complete : false,
497                    sort_as : "alpha",
498                    sort_order : "asc",
499                    date_format : "mm/dd/yyyy",
500                    ignore_char : undefined,
501                    filter_match_mode : "contains",
502                    select_type : undefined,
503                    select_type_options : {},
504                    case_insensitive : true,
505                    column_data_type: 'text',
506                    html_data_type: 'text',
507                    exclude_label: 'exclude',
508                    style_class: '',
509                    reset_button_style_class: '',
510                    datepicker_type: 'jquery-ui',
511                    range_data_type: 'single',
512                    range_data_type_delim: '-',
513                    omit_default_label: false
514                },
515                adaptContainerCssClassImpl = function (dummy) { return ''; };
516
517            $.extend(true, default_options, params);
518
519            if (options_arg.length === undefined) {
520                options[selector_arg] = options_arg;
521                return;
522            }
523            for (i = 0; i < options_arg.length; i++) {
524                if (options_arg[i].date_format !== undefined && options_arg[i].moment_date_format === undefined) {
525                    options_arg[i].moment_date_format = options_arg[i].date_format;
526                }
527                if (options_arg[i].select_type === 'select2') {
528                    default_options.select_type_options = {
529                        adaptContainerCssClass: adaptContainerCssClassImpl
530                    };
531                }
532                //no individual reset button for externally_triggered mode
533                if (default_options.externally_triggered === true) {
534                    options_arg[i].filter_reset_button_text = false;
535                }
536                //validate custom function required attributes
537                if (options_arg[i].filter_type !== undefined && options_arg[i].filter_type.indexOf('custom_func') !== -1) {
538                    if (options_arg[i].custom_func === undefined) {
539                        console.log('Error: You are trying to use filter_type: "custom_func / multi_select_custom_func" for column ' + options_arg[i].column_number + ' but there is no such custom_func attribute provided (custom_func: \"function reference goes here...\")');
540                        return;
541                    }
542                }
543                col_num_as_int = +options_arg[i].column_number;
544                if (isNaN(col_num_as_int)) {
545                    tmpOptions[options_arg[i].column_number_str] = $.extend(true, {}, default_options, options_arg[i]);
546                } else {
547                    tmpOptions[col_num_as_int] = $.extend(true, {}, default_options, options_arg[i]);
548                }
549            }
550            options[selector_arg] = tmpOptions;
551        }
552
553        //taken and modified from DataTables 1.10.0-beta.2 source
554        function yadcfVersionCheck(version) {
555            var aThis = $.fn.dataTable.ext.sVersion.split('.'),
556                aThat = version.split('.'),
557                iThis,
558                iThat,
559                i,
560                iLen;
561
562            for (i = 0, iLen = aThat.length; i < iLen; i++) {
563                iThis = parseInt(aThis[i], 10) || 0;
564                iThat = parseInt(aThat[i], 10) || 0;
565
566                // Parts are the same, keep comparing
567                if (iThis === iThat) {
568                    continue;
569                }
570
571                // Parts are different, return immediately
572                return iThis > iThat;
573            }
574
575            return true;
576        }
577
578        function calculateColumnNumber(column_number, pTable) {
579            var col_num_visible_iter,
580                col_num_visible = column_number;
581            for (col_num_visible_iter = 0; col_num_visible_iter < pTable.fnSettings().aoColumns.length && col_num_visible_iter < column_number; col_num_visible_iter++) {
582                if (pTable.fnSettings().aoColumns[col_num_visible_iter].bVisible === false) {
583                    col_num_visible++;
584                }
585            }
586            return col_num_visible;
587        }
588
589        function resetIApiIndex() {
590            $.fn.dataTableExt.iApiIndex = 0;
591
592        }
593
594        function escapeRegExp(string) {
595            return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
596        }
597
598        function escapeRegExpInArray(arr) {
599            var i;
600            for (i = 0; i < arr.length; i++) {
601                arr[i] = arr[i].replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
602            }
603            return arr;
604        }
605
606        function replaceAll(string, find, replace) {
607            return string.replace(new RegExp(escapeRegExp(find), 'g'), replace);
608        }
609
610        function getTableId(obj) {
611            var tableId;
612            if (obj.table !== undefined) {
613                tableId = obj.table().node().id;
614            } else {
615                tableId = getSettingsObjFromTable(obj).sTableId;
616            }
617            return tableId;
618        }
619
620        function generateTableSelectorJQFriendly2(obj) {
621            var tmpStr;
622            if (obj.oInstance !== undefined && obj.oInstance.selector !== undefined) {
623                tmpStr = obj.oInstance.selector;
624            } else if (obj.selector !== undefined) {
625                tmpStr = obj.selector;
626            } else {
627                tmpStr = obj.table().node().id;
628            }
629            tmpStr = replaceAll(tmpStr, ".", "-");
630            tmpStr = replaceAll(tmpStr, ' ', '');
631            return tmpStr.replace(":", "-").replace("(", "").replace(")", "").replace("#", "-");
632        }
633
634        function generateTableSelectorJQFriendlyNew(tmpStr) {
635            tmpStr = replaceAll(tmpStr, ":", "-");
636            tmpStr = replaceAll(tmpStr, "(", "");
637            tmpStr = replaceAll(tmpStr, ")", "");
638            tmpStr = replaceAll(tmpStr, ",", "");
639            tmpStr = replaceAll(tmpStr, ".", "-");
640            tmpStr = replaceAll(tmpStr, "#", "-");
641            tmpStr = replaceAll(tmpStr, ' ', '');
642            return tmpStr;
643        }
644
645        yadcfDelay = (function () {
646            var timer = 0;
647            return function (callback, ms, param) {
648                clearTimeout(timer);
649                timer = setTimeout(function () {
650                    callback(param);
651                }, ms);
652                return timer;
653            };
654        }());
655
656        function initializeSelectPlugin(selectType, $selectObject, select_type_options) {
657            if (selectType === 'chosen') {
658                $selectObject.chosen(select_type_options);
659                $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
660            } else if (selectType === 'select2') {
661                $selectObject.select2(select_type_options);
662                if ($selectObject.next().hasClass('select2-container')) {
663                    $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
664                }
665            } else if (selectType === 'custom_select') {
666                selectElementCustomInitFunc($selectObject);
667                $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
668            }
669        }
670
671        function refreshSelectPlugin(columnObj, $selectObject, val) {
672            var selectType = columnObj.select_type,
673                select_type_options = columnObj.select_type_options;
674            if (selectType === 'chosen') {
675                $selectObject.trigger("chosen:updated");
676            } else if (selectType === 'select2') {
677                $selectObject.select2(select_type_options);
678                $selectObject.val(val);
679            } else if (selectType === 'custom_select') {
680                selectElementCustomRefreshFunc($selectObject);
681            }
682        }
683
684        function initSelectPluginCustomTriggers(initFunc, refreshFunc, destroyFunc) {
685            selectElementCustomInitFunc = initFunc;
686            selectElementCustomRefreshFunc = refreshFunc;
687            selectElementCustomDestroyFunc = destroyFunc;
688        }
689
690        //Used by exFilterColumn for translating readable search value into proper search string for datatables filtering
691        function yadcfMatchFilterString(table_arg, column_number, selected_value, filter_match_mode, multiple, exclude) {
692            var case_insensitive = yadcf.getOptions(table_arg.selector)[column_number].case_insensitive,
693                ret_val;
694
695            if (selected_value === '') {
696                return '';
697            }
698
699            table_arg.fnSettings().aoPreSearchCols[column_number].bSmart = false;
700            table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true;
701            table_arg.fnSettings().aoPreSearchCols[column_number].bCaseInsensitive = case_insensitive;
702
703            if (multiple === undefined || multiple === false) {
704                if (exclude !== true) {
705                    if (filter_match_mode === "contains") {
706                        table_arg.fnSettings().aoPreSearchCols[column_number].bSmart = true;
707                        table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = false;
708                        ret_val = selected_value;
709                    } else if (filter_match_mode === "exact") {
710                        ret_val = "^" + selected_value + "$";
711                    } else if (filter_match_mode === "startsWith") {
712                        ret_val = "^" + selected_value;
713                    } else if (filter_match_mode === "regex") {
714                        ret_val = selected_value;
715                    }
716                } else {
717                    ret_val = "^((?!" + selected_value + ").)*$";
718                }
719            } else {
720                if (filter_match_mode !== 'regex') {
721                    selected_value = escapeRegExpInArray(selected_value);
722                }
723                if (filter_match_mode === "contains") {
724                    ret_val = selected_value.join("|");
725                } else if (filter_match_mode === "exact") {
726                    ret_val = "^(" + selected_value.join("|") + ")$";
727                } else if (filter_match_mode === "startsWith") {
728                    ret_val = "^(" + selected_value.join("|") + ")";
729                } else if (filter_match_mode === "regex") {
730                    ret_val = selected_value;
731                }
732            }
733            return ret_val;
734        }
735
736        function yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number, exclude) {
737            var case_insensitive = yadcf.getOptions(oTable.selector)[column_number].case_insensitive;
738            if (exclude !== true) {
739                if (filter_match_mode === "contains") {
740                    oTable.fnFilter(selected_value, column_number, false, true, true, case_insensitive);
741                } else if (filter_match_mode === "exact") {
742                    selected_value = escapeRegExp(selected_value);
743                    oTable.fnFilter("^" + selected_value + "$", column_number, true, false, true, case_insensitive);
744                } else if (filter_match_mode === "startsWith") {
745                    selected_value = escapeRegExp(selected_value);
746                    oTable.fnFilter("^" + selected_value, column_number, true, false, true, case_insensitive);
747                } else if (filter_match_mode === "regex") {
748                    try {
749                        //validate regex, only call fnFilter if valid
750                        new RegExp(selected_value);
751                    } catch (error) {
752                        return;
753                    }
754                    oTable.fnFilter(selected_value, column_number, true, false, true, case_insensitive);
755                }
756            } else {
757                oTable.fnFilter("^((?!" + selected_value + ").)*$", column_number, true, false, true, case_insensitive);
758            }
759        }
760        function yadcfParseMatchFilter(tmpStr, filter_match_mode) {
761            var retVal;
762            if (filter_match_mode === "contains") {
763                retVal = tmpStr;
764            } else if (filter_match_mode === "exact") {
765                retVal = tmpStr.substring(1, tmpStr.length - 1);
766                retVal = retVal.replace(/([\\])/g, '');
767            } else if (filter_match_mode === "startsWith") {
768                retVal = tmpStr.substring(1, tmpStr.length);
769                retVal = retVal.replace(/([\\])/g, '');
770            } else if (filter_match_mode === "regex") {
771                retVal = tmpStr;
772            }
773            return retVal;
774        }
775
776        function doFilterCustomDateFunc(arg, table_selector_jq_friendly, column_number) {
777            var oTable = oTables[table_selector_jq_friendly],
778                yadcfState,
779                columnObj = getOptions(oTable.selector)[column_number];
780
781            if (arg === 'clear' && exGetColumnFilterVal(oTable, column_number) === '') {
782                return;
783            }
784
785            if (arg.value !== undefined && arg.value !== "-1") {
786                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
787            } else {
788                //wehn arg === 'clear' or arg.value === '-1'
789                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val('-1').focus();
790                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
791                refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), '-1');
792            }
793
794            if (!oTable.fnSettings().oLoadedState) {
795                oTable.fnSettings().oLoadedState = {};
796                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
797            }
798            if (oTable.fnSettings().oFeatures.bStateSave === true) {
799                if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
800                    oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
801                        {
802                            'from' : arg.value
803                        };
804                } else {
805                    yadcfState = {};
806                    yadcfState[table_selector_jq_friendly] = [];
807                    yadcfState[table_selector_jq_friendly][column_number] = {
808                        'from' : arg.value
809                    };
810                    oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
811                }
812                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
813            }
814
815            oTable.fnDraw();
816        }
817
818        function calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly) {
819            var column_number_filter;
820            if ((settingsDt.oSavedState != undefined && settingsDt.oSavedState.ColReorder !== undefined) ||
821                settingsDt._colReorder != undefined ||
822                (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
823                initColReorder2(settingsDt, table_selector_jq_friendly);
824                column_number_filter = plugins[table_selector_jq_friendly].ColReorder[column_number];
825            } else {
826                column_number_filter = column_number;
827            }
828            return column_number_filter;
829        }
830
831        function doFilter(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
832            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
833
834            var oTable = oTables[table_selector_jq_friendly],
835                selected_value,
836                column_number_filter,
837                columnObj,
838                settingsDt = getSettingsObjFromTable(oTable);
839
840            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
841
842            columnObj = getOptions(oTable.selector)[column_number];
843            if (arg === "clear") {
844                if (exGetColumnFilterVal(oTable, column_number) === '') {
845                    return;
846                }
847                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("-1").focus();
848                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
849                $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", "-1");
850                oTable.fnFilter("", column_number_filter);
851                resetIApiIndex();
852
853                refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), '-1');
854                return;
855            }
856
857            $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
858
859            $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value);
860
861            selected_value = $.trim($(arg).find('option:selected').val());
862
863            if (arg.value !== "-1") {
864                yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number_filter);
865            } else {
866                oTable.fnFilter("", column_number_filter);
867                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
868            }
869            resetIApiIndex();
870        }
871
872        function doFilterMultiSelect(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
873            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
874            var oTable = oTables[table_selector_jq_friendly],
875                selected_values = $(arg).val(),
876                selected_values_trimmed = [],
877                i,
878                stringForSearch,
879                column_number_filter,
880                settingsDt = getSettingsObjFromTable(oTable);
881
882            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
883            $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", selected_values);
884
885            if (selected_values !== null) {
886                for (i = selected_values.length - 1; i >= 0; i--) {
887                    if (selected_values[i] === "-1") {
888                        selected_values.splice(i, 1);
889                        break;
890                    }
891                }
892                for (i = 0; i < selected_values.length; i++) {
893                    selected_values_trimmed.push($.trim(selected_values[i]));
894                }
895                if (selected_values_trimmed.length !== 0) {
896                    if (filter_match_mode !== "regex") {
897                        stringForSearch = selected_values_trimmed.join('narutouzomaki');
898                        stringForSearch = stringForSearch.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
899                        stringForSearch = stringForSearch.split('narutouzomaki').join('|');
900                        if (filter_match_mode === "contains") {
901                            oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
902                        } else if (filter_match_mode === "exact") {
903                            oTable.fnFilter("^(" + stringForSearch + ")$", column_number_filter, true, false, true);
904                        } else if (filter_match_mode === "startsWith") {
905                            oTable.fnFilter("^(" + stringForSearch + ")", column_number_filter, true, false, true);
906                        }
907                    } else {
908                        stringForSearch = selected_values_trimmed.join('|');
909                        oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
910                    }
911                } else {
912                    oTable.fnFilter("", column_number_filter);
913                }
914            } else {
915                oTable.fnFilter("", column_number_filter);
916            }
917            resetIApiIndex();
918        }
919
920        function yadcfParseMatchFilterMultiSelect(tmpStr, filter_match_mode) {
921            var retVal;
922            if (filter_match_mode === "contains") {
923                retVal = tmpStr;
924            } else if (filter_match_mode === "exact") {
925                retVal = tmpStr.substring(1, tmpStr.length - 1);
926                retVal = retVal.substring(1, retVal.length - 1);
927            } else if (filter_match_mode === "startsWith") {
928                retVal = tmpStr.substring(1, tmpStr.length);
929                retVal = retVal.substring(1, retVal.length - 1);
930            } else if (filter_match_mode === "regex") {
931                retVal = tmpStr;
932            }
933            return retVal;
934        }
935
936        function doFilterAutocomplete(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
937            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
938            var oTable = oTables[table_selector_jq_friendly],
939                column_number_filter,
940                settingsDt = getSettingsObjFromTable(oTable);
941
942            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
943
944            if (arg === "clear") {
945                if (exGetColumnFilterVal(oTable, column_number) === '') {
946                    return;
947                }
948                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus();
949                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
950                $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
951                oTable.fnFilter("", column_number_filter);
952                resetIApiIndex();
953                return;
954            }
955
956            $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
957
958            $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value);
959
960            yadcfMatchFilter(oTable, arg.value, filter_match_mode, column_number_filter);
961
962            resetIApiIndex();
963        }
964
965        function autocompleteSelect(event, ui) {
966            event = eventTargetFixUp(event);
967            var table_column = event.target.id.replace("yadcf-filter-", ""),
968                dashIndex = table_column.lastIndexOf("-"),
969                table_selector_jq_friendly = table_column.substring(0, dashIndex),
970                col_num = parseInt(table_column.substring(dashIndex + 1), 10),
971                filter_match_mode = $(event.target).attr("filter_match_mode");
972            doFilterAutocomplete(ui.item, table_selector_jq_friendly, col_num, filter_match_mode);
973        }
974
975        function sortNumAsc(a, b) {
976            return a - b;
977        }
978
979        function sortNumDesc(a, b) {
980            return b - a;
981        }
982
983        function findMinInArray(array, columnObj) {
984            var narray = [], i, num;
985            for (i = 0; i < array.length; i++) {
986                if (array[i] !== null) {
987                    if (columnObj.ignore_char !== undefined) {
988                        array[i] = array[i].toString().replace(columnObj.ignore_char, "");
989                    }
990                    if (columnObj.range_data_type === 'single') {
991                        num = +array[i];
992                    } else {
993                        num = array[i].split(columnObj.range_data_type_delim);
994                        num = num[0];
995                    }
996                    if (!isNaN(num)) {
997                        narray.push(num);
998                    }
999                }
1000            }
1001            return Math.min.apply(Math, narray);
1002        }
1003
1004        function findMaxInArray(array, columnObj) {
1005            var narray = [], i, num;
1006            for (i = 0; i < array.length; i++) {
1007                if (array[i] !== null) {
1008                    if (columnObj.ignore_char !== undefined) {
1009                        array[i] = array[i].toString().replace(columnObj.ignore_char, "");
1010                    }
1011                    if (columnObj.range_data_type === 'single') {
1012                        num = +array[i];
1013                    } else {
1014                        num = array[i].split(columnObj.range_data_type_delim);
1015                        num = num[1];
1016                    }
1017                    if (!isNaN(num)) {
1018                        narray.push(num);
1019                    }
1020                }
1021            }
1022            return Math.max.apply(Math, narray);
1023        }
1024
1025        function addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, ignore_char, sliderMaxMin) {
1026
1027            $.fn.dataTableExt.afnFiltering.push(
1028                function (settingsDt, aData, iDataIndex, rowData) {
1029                    var min,
1030                        max,
1031                        val,
1032                        retVal = false,
1033                        table_selector_jq_friendly_local = table_selector_jq_friendly,
1034                        current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1035                        ignore_char_local = ignore_char,
1036                        column_data_type,
1037                        html_data_type,
1038                        i,
1039                        columnObjKey,
1040                        columnObj,
1041                        column_number_filter,
1042                        valFrom,
1043                        valTo;
1044
1045                    if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) {
1046                        return true;
1047                    }
1048                    columnObj = getOptions(settingsDt.oInstance.selector)[col_num];
1049                    if (columnObj.filter_type === 'range_number_slider') {
1050                        min = $('#' + fromId).text();
1051                        max = $('#' + toId).text();
1052                    } else {
1053                        min = $('#' + fromId).val();
1054                        max = $('#' + toId).val();
1055                    }
1056
1057                    column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1058
1059                    if (rowData !== undefined) {
1060                        aData = rowData;
1061                        if (columnObj.column_number_data !== undefined) {
1062                            column_number_filter = columnObj.column_number_data;
1063                            val = dot2obj(aData, column_number_filter);
1064                        } else {
1065                            val = aData[column_number_filter];
1066                        }
1067                    } else {
1068                        val = aData[column_number_filter];
1069                    }
1070                    if (!isFinite(min) || !isFinite(max)) {
1071                        return true;
1072                    }
1073                    column_data_type = columnObj.column_data_type;
1074                    html_data_type = columnObj.html_data_type;
1075
1076                    if (column_data_type === "html" || column_data_type === "rendered_html") {
1077                        if (html_data_type === undefined) {
1078                            html_data_type = "text";
1079                        }
1080                        if ($(val).length !== 0) {
1081                            switch (html_data_type) {
1082                                case "text":
1083                                    val = $(val).text();
1084                                    break;
1085                                case "value":
1086                                    val = $(val).val();
1087                                    break;
1088                                case "id":
1089                                    val = val.id;
1090                                    break;
1091                                case "selector":
1092                                    val = $(val).find(columnObj.html_data_selector).text();
1093                                    break;
1094                            }
1095                        }
1096                    } else {
1097                        if (typeof val === 'object') {
1098                            if (columnObj.html5_data !== undefined) {
1099                                val = val['@' + columnObj.html5_data];
1100                            }
1101                        }
1102                    }
1103                    if (ignore_char_local !== undefined) {
1104                        min = min.replace(ignore_char_local, "");
1105                        max = max.replace(ignore_char_local, "");
1106                        if (val) {
1107                            val = val.toString().replace(ignore_char_local, "");
1108                        } else {
1109                            val = "";
1110                        }
1111                    }
1112                    //omit empty rows when filtering
1113                    if (columnObj.filter_type === 'range_number_slider') {
1114                        if (val === '' && ((+min) !== sliderMaxMin.min || (+max) !== sliderMaxMin.max)) {
1115                            return false;
1116                        }
1117                    } else {
1118                        if (val === '' && (min !== '' || max !== '')) {
1119                            return false;
1120                        }
1121                    }
1122                    min = (min !== "") ? (+min) : min;
1123                    max = (max !== "") ? (+max) : max;
1124                    if (columnObj.range_data_type === 'single') {
1125                        val = (val !== "") ? (+val) : val;
1126                        if (min === "" && max === "") {
1127                            retVal = true;
1128                        } else if (min === "" && val <= max) {
1129                            retVal = true;
1130                        } else if (min <= val && "" === max) {
1131                            retVal = true;
1132                        } else if (min <= val && val <= max) {
1133                            retVal = true;
1134                        } else if (val === '' || isNaN(val)) {
1135                            retVal = true;
1136                        }
1137                    } else if (columnObj.range_data_type === 'range') {
1138                        val = val.split(columnObj.range_data_type_delim);
1139                        valFrom = (val[0] !== "") ? (+val[0]) : val[0];
1140                        valTo = (val[1] !== "") ? (+val[1]) : val[1];
1141                        if (min === "" && max === "") {
1142                            retVal = true;
1143                        } else if (min === "" && valTo <= max) {
1144                            retVal = true;
1145                        } else if (min <= valFrom && "" === max) {
1146                            retVal = true;
1147                        } else if (min <= valFrom && valTo <= max) {
1148                            retVal = true;
1149                        } else if ((valFrom === '' || isNaN(valFrom)) && (valTo === '' || isNaN(valTo))) {
1150                            retVal = true;
1151                        }
1152                    }
1153                    return retVal;
1154                }
1155            );
1156        }
1157
1158        function addCustomFunctionFilterCapability(table_selector_jq_friendly, filterId, col_num) {
1159
1160            $.fn.dataTableExt.afnFiltering.push(
1161                function (settingsDt, aData, iDataIndex, stateVal) {
1162                    var filterVal = $('#' + filterId).val(),
1163                        columnVal,
1164                        retVal = false,
1165                        table_selector_jq_friendly_local = table_selector_jq_friendly,
1166                        current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1167                        custom_func,
1168                        column_number_filter;
1169
1170                    if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly || filterVal === '-1') {
1171                        return true;
1172                    }
1173
1174                    column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1175
1176                    columnVal = aData[column_number_filter] === "-" ? 0 : aData[column_number_filter];
1177
1178                    custom_func = getOptions(settingsDt.oInstance.selector)[col_num].custom_func;
1179
1180                    retVal = custom_func(filterVal, columnVal, aData, stateVal);
1181
1182                    return retVal;
1183                }
1184            );
1185        }
1186        function addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, date_format) {
1187
1188            $.fn.dataTableExt.afnFiltering.push(
1189                function (settingsDt, aData, iDataIndex, rowData) {
1190                    var min = document.getElementById(fromId) !== null ? document.getElementById(fromId).value : "",
1191                        max = document.getElementById(toId) !== null ? document.getElementById(toId).value : "",
1192                        val,
1193                        retVal = false,
1194                        table_selector_jq_friendly_local = table_selector_jq_friendly,
1195                        current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1196                        column_data_type,
1197                        html_data_type,
1198                        i,
1199                        columnObjKey,
1200                        columnObj,
1201                        column_number_filter,
1202                        min_time,
1203                        max_time,
1204                        dataRenderFunc;
1205
1206                    if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) {
1207                        return true;
1208                    }
1209                    columnObj = getOptions(settingsDt.oInstance.selector)[col_num];
1210
1211                    column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1212                    if (typeof columnObj.column_number_data === 'function' || typeof columnObj.column_number_render === 'function') {
1213                        dataRenderFunc = true;
1214                    }
1215                    if (rowData !== undefined && dataRenderFunc !== true) {
1216                        if (columnObj.column_number_data !== undefined) {
1217                            column_number_filter = columnObj.column_number_data;
1218                            val = dot2obj(rowData, column_number_filter);
1219                        } else {
1220                            val = rowData[column_number_filter];
1221                        }
1222                    } else {
1223                        val = aData[column_number_filter];
1224                    }
1225
1226                    column_data_type = columnObj.column_data_type;
1227                    html_data_type = columnObj.html_data_type;
1228
1229                    if (column_data_type === "html" || column_data_type === "rendered_html") {
1230                        if (html_data_type === undefined) {
1231                            html_data_type = "text";
1232                        }
1233                        if ($(val).length !== 0) {
1234                            switch (html_data_type) {
1235                                case "text":
1236                                    val = $(val).text();
1237                                    break;
1238                                case "value":
1239                                    val = $(val).val();
1240                                    break;
1241                                case "id":
1242                                    val = val.id;
1243                                    break;
1244                                case "selector":
1245                                    val = $(val).find(columnObj.html_data_selector).text();
1246                                    break;
1247                            }
1248                        }
1249                    } else {
1250                        if (typeof val === 'object') {
1251                            if (columnObj.html5_data !== undefined) {
1252                                val = val['@' + columnObj.html5_data];
1253                            }
1254                        }
1255                    }
1256                    //omit empty rows when filtering
1257                    if (val === '' && (min !== '' || max !== '')) {
1258                        return false;
1259                    }
1260                    try {
1261                        if (min.length === (date_format.length + 2) || columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1262                            if (columnObj.datepicker_type === 'jquery-ui') {
1263                                min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min;
1264                            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1265                                min = (min !== "") ? moment(min, columnObj.moment_date_format).toDate() : min;
1266                            }
1267                        }
1268                    } catch (err1) {}
1269                    try {
1270                        if (max.length === (date_format.length + 2) || columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1271                            if (columnObj.datepicker_type === 'jquery-ui') {
1272                                max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max;
1273                            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1274                                max = (max !== "") ? moment(max, columnObj.moment_date_format).toDate() : max;
1275                            }
1276                        }
1277                    } catch (err2) {}
1278                    try {
1279                        if (columnObj.datepicker_type === 'jquery-ui') {
1280                            val = (val !== "") ? $.datepicker.parseDate(date_format, val) : val;
1281                        } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1282                            val = (val !== "") ? moment(val, columnObj.moment_date_format).toDate() : val;
1283                        }
1284                    } catch (err3) {}
1285
1286                    if (date_format.toLowerCase() !== 'hh:mm') {
1287                        if ((min === "" || !(min instanceof Date)) && (max === "" || !(max instanceof Date))) {
1288                            retVal = true;
1289                        } else if (min === "" && val <= max) {
1290                            retVal = true;
1291                        } else if (min <= val && "" === max) {
1292                            retVal = true;
1293                        } else if (min <= val && val <= max) {
1294                            retVal = true;
1295                        }
1296                    } else {
1297                        min_time = moment(min);
1298                        min_time = min_time.minutes() + min_time.hours() * 60;
1299                        if (isNaN(min_time)) {
1300                            min_time = '';
1301                        }
1302                        max_time = moment(max);
1303                        max_time = max_time.minutes() + max_time.hours() * 60;
1304                        if (isNaN(max_time)) {
1305                            max_time = '';
1306                        }
1307                        val = moment(val);
1308                        val = val.minutes() + val.hours() * 60;
1309
1310                        if ((min === "" || !(moment(min, date_format).isValid())) && (max === "" || !(moment(max, date_format).isValid()))) {
1311                            retVal = true;
1312                        } else if (min_time === "" && val <= max_time) {
1313                            retVal = true;
1314                        } else if (min_time <= val && "" === max_time) {
1315                            retVal = true;
1316                        } else if (min_time <= val && val <= max_time) {
1317                            retVal = true;
1318                        }
1319                    }
1320                    return retVal;
1321                }
1322            );
1323        }
1324
1325        function addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char) {
1326            var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-" + column_number,
1327                toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-" + column_number,
1328                filter_selector_string_tmp,
1329                filter_wrapper_id,
1330                oTable,
1331                columnObj,
1332                filterActionStr;
1333
1334            filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1335
1336            if ($("#" + filter_wrapper_id).length > 0) {
1337                return;
1338            }
1339        
1339    $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1340            oTable = oTables[table_selector_jq_friendly];
1341            columnObj = getOptions(oTable.selector)[column_number];
1342
1343            //add a wrapper to hold both filter and reset button
1344            $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\"  id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper\"></div>");
1345            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
1346            filter_selector_string_tmp = filter_selector_string;
1347
1348            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper-inner" + " -" + table_selector_jq_friendly + "-" + column_number + "\"></div>");
1349            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper-inner";
1350
1351            filterActionStr = 'onkeyup="yadcf.rangeNumberKeyUP(\'' + table_selector_jq_friendly + '\',event);"';
1352            if (columnObj.externally_triggered === true) {
1353                filterActionStr = '';
1354            }
1355
1356            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[0] + "\" id=\"" + fromId + "\" class=\"yadcf-filter-range-number yadcf-filter-range\" " + filterActionStr + "></input>");
1357            $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-seperator\" >" +
1358                "</span>");
1359            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[1] + "\" id=\"" + toId + "\" class=\"yadcf-filter-range-number yadcf-filter-range\" " + filterActionStr + "></input>");
1360
1361            if (filter_reset_button_text !== false) {
1362                $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
1363                    "onclick=\"yadcf.stopPropagation(event);yadcf.rangeClear('" + table_selector_jq_friendly + "',event," + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
1364            }
1365
1366            if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1367                if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1368                    $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from);
1369                    if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") {
1370                        $('#' + fromId).addClass("inuse");
1371                    }
1372                    $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to);
1373                    if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") {
1374                        $('#' + toId).addClass("inuse");
1375                    }
1376                }
1377            }
1378            resetIApiIndex();
1379
1380            if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1381                addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, ignore_char);
1382            }
1383
1384        }
1385
1386        function dateSelectSingle(pDate, pEvent, clear) {
1387            var oTable,
1388                date,
1389                event,
1390                column_number,
1391                dashIndex,
1392                table_selector_jq_friendly,
1393                column_number_filter,
1394                settingsDt,
1395                columnObj;
1396
1397            if (pDate.type === 'dp') {
1398                event = pDate.target;
1399            } else {
1400                date = pDate;
1401                event = pEvent;
1402            }
1403            column_number = $(event).attr('id').replace('yadcf-filter-', '').replace('-date', '').replace('-reset', '');
1404            dashIndex = column_number.lastIndexOf("-");
1405            table_selector_jq_friendly = column_number.substring(0, dashIndex);
1406
1407            column_number = column_number.substring(dashIndex + 1);
1408            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1409            oTable = oTables[table_selector_jq_friendly];
1410            settingsDt = getSettingsObjFromTable(oTable);
1411            columnObj = getOptions(oTable.selector)[column_number];
1412
1413            if (pDate.type === 'dp') {
1414                if (moment($(event).val(), columnObj.date_format).isValid()) {
1415                    date = $(event).val();
1416                } else {
1417                    clear = 'clear';
1418                }
1419                $(event).blur();
1420            }
1421
1422            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1423
1424            if (clear === undefined) {
1425                oTable.fnFilter(date, column_number_filter);
1426                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass("inuse");
1427            } else if (clear === 'clear') {
1428                if (exGetColumnFilterVal(oTable, column_number) === '') {
1429                    return;
1430                }
1431                oTable.fnFilter('', column_number_filter);
1432                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val('').removeClass("inuse");
1433            }
1434
1435            resetIApiIndex();
1436        }
1437
1438        function dateSelect(pDate, pEvent) {
1439            var oTable,
1440                column_number,
1441                dashIndex,
1442                table_selector_jq_friendly,
1443                yadcfState,
1444                from,
1445                to,
1446                date,
1447                event,
1448                columnObj;
1449
1450            if (pDate.type === 'dp') {
1451                event = pDate.target;
1452            } else {
1453                date = pDate;
1454                event = pEvent;
1455            }
1456
1457            column_number = $(event).attr("id").replace("yadcf-filter-", "").replace("-from-date", "").replace("-to-date", "");
1458            dashIndex = column_number.lastIndexOf("-");
1459            table_selector_jq_friendly = column_number.substring(0, dashIndex);
1460
1461            column_number = column_number.substring(dashIndex + 1);
1462
1463            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1464
1465            oTable = oTables[table_selector_jq_friendly];
1466            columnObj = getOptions(oTable.selector)[column_number];
1467
1468            if (pDate.type === 'dp') {
1469                event = pDate.target;
1470                if (pDate.date === false || !moment($(event).val(), columnObj.date_format).isValid()) {
1471                    $(event).removeClass("inuse");
1472                    $(event).data("DateTimePicker").minDate(false);
1473                } else {
1474                    $(event).addClass("inuse");
1475                }
1476                $(event).blur();
1477            } else {
1478                $(event).addClass("inuse");
1479            }
1480
1481            if ($(event).attr("id").indexOf("-from-") !== -1) {
1482                from = document.getElementById($(event).attr("id")).value;
1483                to = document.getElementById($(event).attr("id").replace("-from-", "-to-")).value;
1484            } else {
1485                to = document.getElementById($(event).attr("id")).value;
1486                from = document.getElementById($(event).attr("id").replace("-to-", "-from-")).value;
1487            }
1488
1489            if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1490                oTable.fnDraw();
1491            } else {
1492                oTable.fnFilter(from + '-yadcf_delim-' + to, column_number);
1493            }
1494
1495            if (!oTable.fnSettings().oLoadedState) {
1496                oTable.fnSettings().oLoadedState = {};
1497                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1498            }
1499            if (oTable.fnSettings().oFeatures.bStateSave === true) {
1500                if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
1501                    oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
1502                        {
1503                            'from' : from,
1504                            'to' : to
1505                        };
1506                } else {
1507                    yadcfState = {};
1508                    yadcfState[table_selector_jq_friendly] = [];
1509                    yadcfState[table_selector_jq_friendly][column_number] = {
1510                        'from' : from,
1511                        'to' : to
1512                    };
1513                    oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
1514                }
1515                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1516            }
1517
1518            resetIApiIndex();
1519        }
1520
1521        function addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) {
1522            var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number,
1523                toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number,
1524                filter_selector_string_tmp,
1525                filter_wrapper_id,
1526                oTable,
1527                columnObj,
1528                datepickerObj = {},
1529                filterActionStr,
1530                filterClass = '',
1531                $fromInput,
1532                $toInput,
1533                innerWrapperAdditionalClass = '';
1534
1535            filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1536
1537            if ($("#" + filter_wrapper_id).length > 0) {
1538                return;
1539            }
1540            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1541            oTable = oTables[table_selector_jq_friendly];
1542            columnObj = getOptions(oTable.selector)[column_number];
1543            if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1544                innerWrapperAdditionalClass = 'input-daterange';
1545            }
1546            //add a wrapper to hold both filter and reset button
1547            $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\"  id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper\"></div>");
1548            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
1549            filter_selector_string_tmp = filter_selector_string;
1550
1551            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper-inner " + innerWrapperAdditionalClass + "\"></div>");
1552            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper-inner";
1553
1554            filterActionStr = 'onkeyup="yadcf.rangeDateKeyUP(\'' + table_selector_jq_friendly + '\',\'' + date_format + '\',event);"';
1555            if (columnObj.externally_triggered === true) {
1556                filterActionStr = '';
1557            }
1558
1559            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[0] + "\" id=\"" + fromId + "\" class=\"yadcf-filter-range-date yadcf-filter-range\" " + filterActionStr + "></input>");
1560            $(filter_selector_string).append("<span class=\"yadcf-filter-range-date-seperator\" >" +
1561                "</span>");
1562            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[1] + "\" id=\"" + toId + "\" class=\"yadcf-filter-range-date yadcf-filter-range\" " + filterActionStr + "></input>");
1563
1564            $fromInput = $("#" + fromId);
1565            $toInput = $("#" + toId);
1566
1567            if (filter_reset_button_text !== false) {
1568                $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
1569                    "onclick=\"yadcf.stopPropagation(event);yadcf.rangeClear('" + table_selector_jq_friendly + "',event," + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
1570            }
1571
1572            if (columnObj.datepicker_type === 'jquery-ui') {
1573                datepickerObj.dateFormat = date_format;
1574            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1575                datepickerObj.format = date_format;
1576            }
1577
1578            if (columnObj.externally_triggered !== true) {
1579                if (columnObj.datepicker_type === 'jquery-ui') {
1580                    datepickerObj.onSelect = dateSelect;
1581                }
1582                // for 'bootstrap-datetimepicker' its implemented below...
1583            }
1584
1585            datepickerObj = $.extend({}, datepickerObj, columnObj.filter_plugin_options);
1586
1587            if (columnObj.datepicker_type === 'jquery-ui') {
1588                $fromInput.datepicker($.extend(datepickerObj, {onClose: function (selectedDate) {
1589                    $toInput.datepicker('option', 'minDate', selectedDate);
1590                }  }));
1591                $toInput.datepicker($.extend(datepickerObj, {onClose: function (selectedDate) {
1592                    $fromInput.datepicker('option', 'maxDate', selectedDate);
1593                }  }));
1594
1595            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1596                datepickerObj.useCurrent = false;
1597                $fromInput.datetimepicker(datepickerObj);
1598                $toInput.datetimepicker(datepickerObj);
1599                if (columnObj.externally_triggered !== true) {
1600                    $fromInput.add($toInput).on('dp.hide', dateSelect);
1601                }
1602            } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1603                //$fromInput.datepicker({});
1604                //$toInput.datepicker({});
1605            }
1606
1607            if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1608                if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1609                    $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from);
1610                    if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") {
1611                        $('#' + fromId).addClass("inuse");
1612                    }
1613                    $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to);
1614                    if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") {
1615                        $('#' + toId).addClass("inuse");
1616                    }
1617                }
1618            }
1619
1620            if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1621                addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, date_format);
1622            }
1623
1624            resetIApiIndex();
1625        }
1626
1627        function addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) {
1628            var dateId = "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number,
1629                filter_selector_string_tmp,
1630                filter_wrapper_id,
1631                oTable,
1632                columnObj,
1633                datepickerObj = {},
1634                filterActionStr;
1635
1636            filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1637
1638            if ($("#" + filter_wrapper_id).length > 0) {
1639                return;
1640            }
1641            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1642            oTable = oTables[table_selector_jq_friendly];
1643            columnObj = getOptions(oTable.selector)[column_number];
1644
1645            //add a wrapper to hold both filter and reset button
1646            $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);
1646\" onclick=\"yadcf.stopPropagation(event);\" id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper\"></div>");
1647            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
1648            filter_selector_string_tmp = filter_selector_string;
1649
1650            filterActionStr = 'onkeyup="yadcf.dateKeyUP(\'' + table_selector_jq_friendly + '\',\'' + date_format + '\',event);"';
1651            if (columnObj.externally_triggered === true) {
1652                filterActionStr = '';
1653            }
1654
1655            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label + "\" id=\"" + dateId + "\" class=\"yadcf-filter-date\" " + filterActionStr + "></input>");
1656
1657            if (filter_reset_button_text !== false) {
1658                $(filter_selector_string_tmp).append('<button type="button" id="' + dateId + '-reset" ' + 'onmousedown="yadcf.stopPropagation(event);" ' +
1659                    'onclick="yadcf.stopPropagation(event);yadcf.dateSelectSingle(\'' + table_selector_jq_friendly + '\',yadcf.eventTargetFixUp(event).target, \'clear\'); return false;" class="yadcf-filter-reset-button ' + columnObj.reset_button_style_class + '">' + filter_reset_button_text + '</button>');
1660            }
1661
1662            if (columnObj.datepicker_type === 'jquery-ui') {
1663                datepickerObj.dateFormat = date_format;
1664            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1665                datepickerObj.format = date_format;
1666            }
1667
1668            if (columnObj.externally_triggered !== true) {
1669                if (columnObj.datepicker_type === 'jquery-ui') {
1670                    datepickerObj.onSelect = dateSelectSingle;
1671                }
1672            }
1673
1674            datepickerObj = $.extend({}, datepickerObj, columnObj.filter_plugin_options);
1675
1676            if (columnObj.datepicker_type === 'jquery-ui') {
1677                $("#" + dateId).datepicker(datepickerObj);
1678            } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1679                datepickerObj.useCurrent = false;
1680                $("#" + dateId).datetimepicker(datepickerObj);
1681                if (columnObj.externally_triggered !== true) {
1682                    if (datepickerObj.format.toLowerCase() !== 'hh:mm') {
1683                        $("#" + dateId).on('dp.change', dateSelectSingle);
1684                    } else {
1685                        $("#" + dateId).on('dp.hide', dateSelectSingle);
1686                    }
1687                }
1688            } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1689                $("#" + dateId).datepicker({});
1690            }
1691
1692            if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') {
1693                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(oTable.fnSettings().aoPreSearchCols[column_number].sSearch).addClass("inuse");
1694            }
1695
1696            resetIApiIndex();
1697        }
1698
1699        function rangeNumberSldierDrawTips(min_tip_val, max_tip_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number) {
1700            var first_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number),// + " .ui-slider-handle:first"),
1701                last_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number),// + " .ui-slider-handle:last"),
1702                min_tip_inner,
1703                max_tip_inner;
1704
1705            min_tip_inner = "<div id=\"" + min_tip_id + "\" class=\"yadcf-filter-range-number-slider-min-tip-inner\">" + min_tip_val + "</div>";
1706            max_tip_inner = "<div id=\"" + max_tip_id + "\" class=\"yadcf-filter-range-number-slider-max-tip-inner\">" + max_tip_val + "</div>";
1707
1708            if (first_handle.length === 1) {
1709                first_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:first");
1710                $(first_handle).addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1711
1712                last_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:last");
1713                $(last_handle).addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1714            } else {
1715                //migth happen when scrollX is used or when filter row is being duplicated by DT
1716                $($(first_handle)[0]).find('.ui-slider-handle:first').addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1717                $($(last_handle)[0]).find('.ui-slider-handle:last').addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1718
1719                $($(first_handle)[1]).find('.ui-slider-handle:first').addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1720                $($(last_handle)[1]).find('.ui-slider-handle:last').addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1721            }
1722        }
1723
1724        function rangeNumberSliderChange(table_selector_jq_friendly, event, ui) {
1725            event = eventTargetFixUp(event);
1726            var oTable,
1727                min_val,
1728                max_val,
1729                slider_inuse,
1730                yadcfState,
1731                column_number = $(event.target).attr('id').replace("yadcf-filter-", "").replace(table_selector_jq_friendly, "").replace("-slider-", ""),
1732                columnObj,
1733                keyUp;
1734
1735            oTable = oTables[table_selector_jq_friendly];
1736            columnObj = getOptions(oTable.selector)[column_number];
1737
1738            keyUp = function () {
1739
1740                $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1741
1742                if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1743                    oTable.fnDraw();
1744                } else {
1745                    oTable.fnFilter(ui.values[0] + '-yadcf_delim-' + ui.values[1], column_number);
1746                }
1747                min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text();
1748                max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text();
1749
1750                if (min_val !== ui.values[0]) {
1751                    $($(event.target).find(".ui-slider-handle")[0]).addClass("inuse");
1752                    slider_inuse = true;
1753                } else {
1754                    $($(event.target).find(".ui-slider-handle")[0]).removeClass("inuse");
1755                }
1756                if (max_val !== ui.values[1]) {
1757                    $($(event.target).find(".ui-slider-handle")[1]).addClass("inuse");
1758                    slider_inuse = true;
1759                } else {
1760                    $($(event.target).find(".ui-slider-handle")[1]).removeClass("inuse");
1761                }
1762
1763                if (slider_inuse === true) {
1764                    $(event.target).find(".ui-slider-range").addClass("inuse");
1765                } else {
1766                    $(event.target).find(".ui-slider-range").removeClass("inuse");
1767                }
1768
1769                if (!oTable.fnSettings().oLoadedState) {
1770                    oTable.fnSettings().oLoadedState = {};
1771                    oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1772                }
1773                if (oTable.fnSettings().oFeatures.bStateSave === true) {
1774                    if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
1775                        oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
1776                            {
1777                                'from' : ui.values[0],
1778                                'to' : ui.values[1]
1779                            };
1780                    } else {
1781                        yadcfState = {};
1782                        yadcfState[table_selector_jq_friendly] = [];
1783                        yadcfState[table_selector_jq_friendly][column_number] = {
1784                            'from' : ui.values[0],
1785                            'to' : ui.values[1]
1786                        };
1787                        oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
1788                    }
1789                    oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1790                }
1791
1792                resetIApiIndex();
1793            };
1794
1795            if (columnObj.filter_delay === undefined) {
1796                keyUp();
1797            } else {
1798                yadcfDelay(function () {
1799                    keyUp();
1800                }, columnObj.filter_delay);
1801            }
1802        }
1803
1804        function addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char) {
1805            var sliderId = "yadcf-filter-" + table_selector_jq_friendly + "-slider-" + column_number,
1806                min_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-min_tip-" + column_number,
1807                max_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-max_tip-" + column_number,
1808                filter_selector_string_tmp,
1809                filter_wrapper_id,
1810                oTable,
1811                min_state_val = min_val,
1812                max_state_val = max_val,
1813                columnObj,
1814                slideFunc,
1815                changeFunc,
1816                sliderObj,
1817                sliderMaxMin = {
1818                    min: min_val,
1819                    max: max_val
1820                },
1821                settingsDt,
1822                currSliderMin = $("#" + sliderId).slider("option", "min"),
1823                currSliderMax = $("#" + sliderId).slider("option", "max"),
1824                redrawTable;
1825
1826            filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1827
1828            if ($("#" + filter_wrapper_id).length > 0 && (currSliderMin === min_val && currSliderMax === max_val)) {
1829                return;
1830            }
1831
1832            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1833            oTable = oTables[table_selector_jq_friendly];
1834            settingsDt = settingsMap[generateTableSelectorJQFriendly2(oTable)];
1835
1836            if ($("#" + filter_wrapper_id).length > 0) {
1837                $("#" + sliderId).slider("destroy");
1838                $("#" + filter_wrapper_id).remove();
1839                redrawTable = true;
1840            }
1841
1842            columnObj = getOptions(oTable.selector)[column_number];
1843
1844            if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
1845                if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1846                    if (min_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) {
1847                        min_state_val = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
1848                    }
1849                    if (max_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) {
1850                        max_state_val = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to;
1851                    }
1852                }
1853            }
1854
1855            if (isFinite(min_val) && isFinite(max_val) && isFinite(min_state_val) && isFinite(max_state_val)) {
1856
1857                //add a wrapper to hold both filter and reset button
1858                $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);
1858\" onclick=\"yadcf.stopPropagation(event);\"  id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper\"></div>");
1859                filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
1860                filter_selector_string_tmp = filter_selector_string;
1861
1862                $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-number-slider-filter-wrapper-inner" + " -" + table_selector_jq_friendly + "-" + column_number + "\"></div>");
1863                filter_selector_string = filter_selector_string + " div.yadcf-number-slider-filter-wrapper-inner";
1864
1865                $(filter_selector_string).append("<div id=\"" + sliderId + "\" class=\"yadcf-filter-range-number-slider\"></div>");
1866                filter_selector_string = filter_selector_string + " #" + sliderId;
1867
1868                $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-slider-min-tip-hidden hide\">" + min_val + "</span>");
1869                $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-slider-max-tip-hidden hide\">" + max_val + "</span>");
1870
1871                if (columnObj.externally_triggered !== true) {
1872                    slideFunc = function (event, ui) {
1873                        rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
1874                        rangeNumberSliderChange(table_selector_jq_friendly, event, ui);
1875                    };
1876                    changeFunc = function (event, ui) {
1877                        rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
1878                        if (event.originalEvent || $(event.target).slider("option", "yadcf-reset") === true) {
1879                            $(event.target).slider("option", "yadcf-reset", false);
1880                            rangeNumberSliderChange(table_selector_jq_friendly, event, ui);
1881                        }
1882                    };
1883                } else {
1884                    slideFunc = function (event, ui) {
1885                        rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
1886                    };
1887                    changeFunc = function (event, ui) {
1888                        rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
1889                    };
1890                }
1891                sliderObj = {
1892                    range: true,
1893                    min: min_val,
1894                    max: max_val,
1895                    values: [min_state_val, max_state_val],
1896                    create: function (event, ui) {
1897                        rangeNumberSldierDrawTips(min_state_val, max_state_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
1898                    },
1899                    slide: slideFunc,
1900                    change: changeFunc
1901                };
1902
1903                if (columnObj.filter_plugin_options !== undefined) {
1904                    $.extend(sliderObj, columnObj.filter_plugin_options);
1905                }
1906
1907                $("#" + sliderId).slider(sliderObj);
1908
1909                if (filter_reset_button_text !== false) {
1910                    $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
1911                        "onclick=\"yadcf.stopPropagation(event);yadcf.rangeNumberSliderClear('" + table_selector_jq_friendly + "',event); return false;\" class=\"yadcf-filter-reset-button range-number-slider-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
1912                }
1913            }
1914
1915            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1916            oTable = oTables[table_selector_jq_friendly];
1917            if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
1918                if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1919                    if (isFinite(min_val) && min_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) {
1920                        $($(filter_selector_string).find(".ui-slider-handle")[0]).addClass("inuse");
1921                    }
1922                    if (isFinite(max_val) && max_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) {
1923                        $($(filter_selector_string).find(".ui-slider-handle")[1]).addClass("inuse");
1924                    }
1925                    if ((isFinite(min_val) && isFinite(max_val)) && (min_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from || max_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to)) {
1926                        $($(filter_selector_string).find(".ui-slider-range")).addClass("inuse");
1927                    }
1928                }
1929            }
1930            resetIApiIndex();
1931
1932            if (settingsDt.oFeatures.bServerSide !== true) {
1933                addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, min_tip_id, max_tip_id, column_number, ignore_char, sliderMaxMin);
1934            }
1935            if (redrawTable === true) {
1936                oTable.fnDraw(false);
1937            }
1938        }
1939
1940        function destroyThirdPartyPlugins(table_arg) {
1941
1942            var tableOptions,
1943                table_selector_jq_friendly,
1944                settingsDt,
1945                columnObjKey,
1946                column_number,
1947                optionsObj,
1948                fromId,
1949                toId;
1950
1951            //check if the table arg is from new datatables API (capital "D")
1952            if (table_arg.settings !== undefined) {
1953                table_arg = table_arg.settings()[0].oInstance;
1954            }
1955            tableOptions = getOptions(table_arg.selector);
1956            table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
1957            settingsDt = getSettingsObjFromTable(table_arg);
1958
1959            for (columnObjKey in tableOptions) {
1960                if (tableOptions.hasOwnProperty(columnObjKey)) {
1961                    optionsObj = tableOptions[columnObjKey];
1962                    column_number = optionsObj.column_number;
1963
1964                    switch (optionsObj.filter_type) {
1965                        case 'multi_select':
1966                        case 'multi_select_custom_func':
1967                        case 'select':
1968                        case 'custom_func':
1969                            switch (optionsObj.select_type) {
1970                                case 'chosen':
1971                                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).chosen('destroy');
1972                                    break;
1973                                case 'select2':
1974                                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2('destroy');
1975                                    break;
1976                                case 'custom_select':
1977                                    if (selectElementCustomDestroyFunc !== undefined) {
1978                                        selectElementCustomDestroyFunc($("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
1979                                    }
1980                                    break;
1981                            }
1982                            break;
1983                        case 'auto_complete':
1984                            $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).autocomplete("destroy");
1985                            break;
1986                        case 'date':
1987                            switch (optionsObj.select_type) {
1988                                case 'jquery-ui':
1989                                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).datepicker("destroy");
1990                                    break;
1991                                case 'bootstrap-datetimepicker':
1992                                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).destroy();
1993                                    break;
1994                            }
1995                            break;
1996                        case 'range_date':
1997                            fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number;
1998                            toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number;
1999                            switch (optionsObj.select_type) {
2000                                case 'jquery-ui':
2001                                    $("#" + fromId).datepicker("destroy");
2002                                    $("#" + toId).datepicker("destroy");
2003                                    break;
2004                                case 'bootstrap-datetimepicker':
2005                                    $("#" + fromId).destroy();
2006                                    $("#" + toId).destroy();
2007                                    break;
2008                            }
2009                            break;
2010                        case 'range_number_slider':
2011                            $("#yadcf-filter-" + table_selector_jq_friendly + "-slider-" + column_number).slider("destroy");
2012                            break;
2013                    }
2014                }
2015            }
2016        }
2017
2018        function removeFilters(oTable, args, table_selector) {
2019            var tableId = getTableId(oTable);
2020            $('#' + tableId + ' .yadcf-filter-wrapper').remove();
2021            if (yadcfVersionCheck('1.10')) {
2022                $(document).off('draw.dt', oTable.selector);
2023                $(document).off('xhr.dt', oTable.selector);
2024                $(document).off('column-visibility.dt', oTable.selector);
2025                $(document).off('destroy.dt', oTable.selector);
2026            } else {
2027                $(document).off('draw', oTable.selector);
2028                $(document).off('destroy', oTable.selector);
2029            }
2030            destroyThirdPartyPlugins(oTable);
2031        }
2032
2033        /* alphanum.js (C) Brian Huisman
2034		   Based on the Alphanum Algorithm by David Koelle
2035		   The Alphanum Algorithm is discussed at http://www.DaveKoelle.com
2036		*/
2037        function sortAlphaNum(a, b) {
2038            function chunkify(t) {
2039                var tz = new Array();
2040                var x = 0, y = -1, n = 0, i, j;
2041
2042                while (i = (j = t.charAt(x++)).charCodeAt(0)) {
2043                    var m = (i == 46 || (i >=48 && i <= 57));
2044                    if (m !== n) {
2045                        tz[++y] = "";
2046                        n = m;
2047                    }
2048                    tz[y] += j;
2049                }
2050                return tz;
2051            }
2052
2053            if (typeof a === 'object' && typeof a.label === 'string') {
2054                a = a.label;
2055            }
2056            if (typeof b === 'object' && typeof b.label === 'string') {
2057                b = b.label;
2058            }
2059
2060            var aa = chunkify(a.toLowerCase());
2061            var bb = chunkify(b.toLowerCase());
2062
2063            for (var x = 0; aa[x] && bb[x]; x++) {
2064                if (aa[x] !== bb[x]) {
2065                    var c = Number(aa[x]), d = Number(bb[x]);
2066                    if (c == aa[x] && d == bb[x]) {
2067                        return c - d;
2068                    } else return (aa[x] > bb[x]) ? 1 : -1;
2069                }
2070            }
2071            return aa.length - bb.length;
2072        }
2073
2074        function sortColumnData(column_data, columnObj) {
2075            var numArray = [],
2076                alphaArray = [];
2077            if (columnObj.filter_type === "select" || columnObj.filter_type === "auto_complete" || columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func' || columnObj.filter_type === "custom_func") {
2078                if (columnObj.sort_as === "alpha") {
2079                    if (columnObj.sort_order === "asc") {
2080                        column_data.sort();
2081                    } else if (columnObj.sort_order === "desc") {
2082                        column_data.sort();
2083                        column_data.reverse();
2084                    }
2085                } else if (columnObj.sort_as === "num") {
2086                    if (columnObj.sort_order === "asc") {
2087                        column_data.sort(sortNumAsc);
2088                    } else if (columnObj.sort_order === "desc") {
2089                        column_data.sort(sortNumDesc);
2090                    }
2091                } else if (columnObj.sort_as === "alphaNum") {
2092                    if (columnObj.sort_order === "asc") {
2093                        column_data.sort(sortAlphaNum);
2094                    } else if (columnObj.sort_order === "desc") {
2095                        column_data.sort(sortAlphaNum);
2096                        column_data.reverse();
2097                    }
2098                } else if (columnObj.sort_as === "custom") {
2099                    column_data.sort(columnObj.sort_as_custom_func);
2100                }
2101            }
2102            return column_data;
2103        }
2104        function getFilteredRows(table) {
2105            var dataTmp,
2106                data = [],
2107                i;
2108            if (yadcfVersionCheck('1.10')) {
2109                dataTmp = table._('tr', {filter: 'applied' });
2110            } else {
2111                dataTmp = table.rows({filter: 'applied'}).data().toArray();
2112            }
2113            for (i = 0; i < dataTmp.length; i++) {
2114                data.push({
2115                    _aData: dataTmp[i]
2116                });
2117            }
2118            return data;
2119        }
2120
2121        function parseTableColumn(pTable, columnObj, table_selector_jq_friendly, pSettings) {
2122            var col_inner_elements,
2123                col_inner_data,
2124                j,
2125                k,
2126                col_filter_array = {},
2127                column_data = [],
2128                data,
2129                data_length,
2130                settingsDt,
2131                column_number_filter;
2132
2133            if (pSettings !== undefined) {
2134                settingsDt = pSettings;
2135            } else {
2136                settingsDt = getSettingsObjFromTable(pTable);
2137            }
2138
2139            if (columnObj.cumulative_filtering !== true) {
2140                data = settingsDt.aoData;
2141                data_length = data.length;
2142            } else {
2143                data = getFilteredRows(pTable);
2144                data_length = data.length;
2145            }
2146            if (columnObj.col_filter_array !== undefined) {
2147                col_filter_array = columnObj.col_filter_array;
2148            }
2149            column_number_filter = calcColumnNumberFilter(settingsDt, columnObj.column_number, table_selector_jq_friendly);
2150            if (isNaN(settingsDt.aoColumns[column_number_filter].mData) && typeof settingsDt.aoColumns[column_number_filter].mData !== 'object') {
2151                columnObj.column_number_data = settingsDt.aoColumns[column_number_filter].mData;
2152            }
2153            if (isNaN(settingsDt.aoColumns[column_number_filter].mRender) && typeof settingsDt.aoColumns[column_number_filter].mRender !== 'object') {
2154                columnObj.column_number_render = settingsDt.aoColumns[column_number_filter].mRender;
2155            }
2156
2157            for (j = 0; j < data_length; j++) {
2158                if (columnObj.column_data_type === "html") {
2159                    if (columnObj.column_number_data === undefined) {
2160                        col_inner_elements = $(data[j]._aData[column_number_filter]);
2161                    } else {
2162                        col_inner_elements = dot2obj(data[j]._aData, columnObj.column_number_data);
2163                        col_inner_elements = $(col_inner_elements);
2164                    }
2165                    if (col_inner_elements.length > 0) {
2166                        for (k = 0; k < col_inner_elements.length; k++) {
2167                            switch (columnObj.html_data_type) {
2168                                case "text":
2169                                    col_inner_data = $(col_inner_elements[k]).text();
2170                                    break;
2171                                case "value":
2172                                    col_inner_data = $(col_inner_elements[k]).val();
2173                                    break;
2174                                case "id":
2175                                    col_inner_data = col_inner_elements[k].id;
2176                                    break;
2177                                case "selector":
2178                                    col_inner_data = $(col_inner_elements[k]).find(columnObj.html_data_selector).text();
2179                                    break;
2180                            }
2181
2182                            if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2183                                col_filter_array[col_inner_data] = col_inner_data;
2184                                column_data.push(col_inner_data);
2185                            }
2186                        }
2187                    } else {
2188                        col_inner_data = col_inner_elements.selector;
2189                        if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2190                            col_filter_array[col_inner_data] = col_inner_data;
2191                            column_data.push(col_inner_data);
2192                        }
2193                    }
2194
2195                } else if (columnObj.column_data_type === "text") {
2196                    if (columnObj.text_data_delimiter !== undefined) {
2197                        if (columnObj.column_number_data === undefined) {
2198                            col_inner_elements = data[j]._aData[column_number_filter].split(columnObj.text_data_delimiter);
2199                        } else {
2200                            col_inner_elements = dot2obj(data[j]._aData, columnObj.column_number_data);
2201                            col_inner_elements = (col_inner_elements + '').split(columnObj.text_data_delimiter);
2202                        }
2203                        for (k = 0; k < col_inner_elements.length; k++) {
2204                            col_inner_data = col_inner_elements[k];
2205                            if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2206                                col_filter_array[col_inner_data] = col_inner_data;
2207                                column_data.push(col_inner_data);
2208                            }
2209                        }
2210                    } else {
2211                        if (columnObj.column_number_data === undefined) {
2212                            col_inner_data = data[j]._aData[column_number_filter];
2213                            if (typeof col_inner_data === 'object') {
2214                                if (columnObj.html5_data !== undefined) {
2215                                    col_inner_data = col_inner_data['@' + columnObj.html5_data];
2216                                } else {
2217                                    console.log('Warning: Looks like you have forgot to define the html5_data attribute for the ' + columnObj.column_number + ' column');
2218                                    return;
2219                                }
2220                            }
2221                        } else if (data[j]._aFilterData !== undefined && data[j]._aFilterData !== null) {
2222                            col_inner_data = data[j]._aFilterData[column_number_filter];
2223                        } else {
2224                            col_inner_data = dot2obj(data[j]._aData, columnObj.column_number_data);
2225                        }
2226                        if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2227                            col_filter_array[col_inner_data] = col_inner_data;
2228                            column_data.push(col_inner_data);
2229                        }
2230                    }
2231                } else if (columnObj.column_data_type === "rendered_html") {
2232                    col_inner_elements = data[j]._aFilterData[column_number_filter];
2233                    if (typeof col_inner_elements !== 'string') {
2234                        col_inner_elements = $(col_inner_elements);
2235                        if (col_inner_elements.length > 0) {
2236                            for (k = 0; k < col_inner_elements.length; k++) {
2237                                switch (columnObj.html_data_type) {
2238                                    case "text":
2239                                        col_inner_data = $(col_inner_elements[k]).text();
2240                                        break;
2241                                    case "value":
2242                                        col_inner_data = $(col_inner_elements[k]).val();
2243                                        break;
2244                                    case "id":
2245                                        col_inner_data = col_inner_elements[k].id;
2246                                        break;
2247                                    case "selector":
2248                                        col_inner_data = $(col_inner_elements[k]).find(columnObj.html_data_selector).text();
2249                                        break;
2250                                }
2251                            }
2252                        } else {
2253                            col_inner_data = col_inner_elements.selector;
2254                        }
2255                    } else {
2256                        col_inner_data = col_inner_elements;
2257                    }
2258                    if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2259                        col_filter_array[col_inner_data] = col_inner_data;
2260                        column_data.push(col_inner_data);
2261                    }
2262                }
2263            }
2264            columnObj.col_filter_array = col_filter_array;
2265            return column_data;
2266        }
2267
2268        function appendFilters(oTable, args, table_selector, pSettings) {
2269
2270            var i = 0,
2271                $filter_selector,
2272                filter_selector_string,
2273
2274                data,
2275                filter_container_id,
2276                column_number_data,
2277                column_number,
2278                column_position,
2279                column_data_type,
2280                html_data_type,
2281                text_data_delimiter,
2282                filter_default_label,
2283                filter_reset_button_text,
2284                enable_auto_complete,
2285                sort_as,
2286                sort_order,
2287                date_format,
2288                ignore_char,
2289                filter_match_mode,
2290
2291                column_data,
2292                column_data_temp,
2293                options_tmp,
2294                j,
2295                k,
2296                data_length,
2297                col_inner_elements,
2298                col_inner_data,
2299                ii,
2300                table_selector_jq_friendly,
2301                min_val,
2302                max_val,
2303                col_num_visible,
2304                col_num_visible_iter,
2305                tmpStr,
2306                columnObjKey,
2307                columnObj,
2308                filters_position,
2309                unique_th,
2310                settingsDt,
2311                filterActionStr,
2312                custom_func_filter_value_holder,
2313                exclude_str,
2314                tableDT,
2315                columnFilterVal;
2316
2317            if (pSettings === undefined) {
2318                settingsDt = getSettingsObjFromTable(oTable);
2319            } else {
2320                settingsDt = pSettings;
2321            }
2322            settingsMap[generateTableSelectorJQFriendly2(oTable)] = settingsDt;
2323
2324            table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable);
2325            tableDT = tablesDT[table_selector_jq_friendly];
2326
2327            initColReorder2(settingsDt, table_selector_jq_friendly);
2328
2329            filters_position = $(document).data(table_selector + "_filters_position");
2330            if (settingsDt.oScroll.sX !== '' || settingsDt.oScroll.sY !== '') {
2331                table_selector = '.yadcf-datatables-table-' + table_selector_jq_friendly;
2332            }
2333            if (settingsDt.oApi._fnGetUniqueThs !== undefined) {
2334                unique_th = settingsDt.oApi._fnGetUniqueThs(settingsDt);
2335            }
2336            for (columnObjKey in args) {
2337                if (args.hasOwnProperty(columnObjKey)) {
2338                    columnObj = args[columnObjKey];
2339
2340                    options_tmp = '';
2341                    tmpStr = '';
2342                    data = columnObj.data;
2343                    column_data = [];
2344                    column_data_temp = [];
2345                    filter_container_id = columnObj.filter_container_id;
2346                    column_number = columnObj.column_number;
2347                    column_number = +column_number;
2348                    column_position = column_number;
2349
2350                    if (plugins[table_selector_jq_friendly] !== undefined && (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
2351                        column_position = plugins[table_selector_jq_friendly].ColReorder[column_number];
2352                    }
2353
2354                    columnObj.column_number = column_number;
2355                    column_number_data = undefined;
2356                    if (isNaN(settingsDt.aoColumns[column_position].mData) && typeof settingsDt.aoColumns[column_position].mData !== 'object') {
2357                        column_number_data = settingsDt.aoColumns[column_position].mData;
2358                        columnObj.column_number_data = column_number_data;
2359                    }
2360                    if (isNaN(settingsDt.aoColumns[column_position].mRender) && typeof settingsDt.aoColumns[column_position].mRender !== 'object') {
2361                        columnObj.column_number_render = settingsDt.aoColumns[column_position].mRender;
2362                    }
2363                    column_data_type = columnObj.column_data_type;
2364                    html_data_type = columnObj.html_data_type;
2365                    text_data_delimiter = columnObj.text_data_delimiter;
2366                    filter_default_label = columnObj.filter_default_label;
2367                    filter_reset_button_text = columnObj.filter_reset_button_text;
2368                    enable_auto_complete = columnObj.enable_auto_complete;
2369                    sort_as = columnObj.sort_as;
2370                    sort_order = columnObj.sort_order;
2371                    date_format = columnObj.date_format;
2372                    if (columnObj.datepicker_type === 'jquery-ui') {
2373                        date_format = date_format.replace("yyyy", "yy");
2374                    }
2375                    if (columnObj.datepicker_type === 'bootstrap-datetimepicker' && columnObj.filter_plugin_options !== undefined && columnObj.filter_plugin_options.format !== undefined) {
2376                        date_format = columnObj.filter_plugin_options.format;
2377                    }
2378                    columnObj.date_format = date_format;
2379
2380                    if (columnObj.ignore_char !== undefined && !(columnObj.ignore_char instanceof RegExp)) {
2381                        ignore_char = new RegExp(columnObj.ignore_char, "g");
2382                        columnObj.ignore_char = ignore_char;
2383                    }
2384                    filter_match_mode = columnObj.filter_match_mode;
2385
2386                    if (column_number === undefined) {
2387                        alert("You must specify column number");
2388                        return;
2389                    }
2390
2391                    if (enable_auto_complete === true) {
2392                        columnObj.filter_type = "auto_complete";
2393                    }
2394
2395                    if (filter_default_label === undefined) {
2396                        if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2397                            filter_default_label = placeholderLang.select;
2398                        } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2399                            filter_default_label = placeholderLang.select_multi;
2400                        } else if (columnObj.filter_type === "auto_complete" || columnObj.filter_type === "text") {
2401                            filter_default_label = placeholderLang.filter;
2402                        } else if (columnObj.filter_type === "range_number" || columnObj.filter_type === "range_date") {
2403                            filter_default_label = placeholderLang.range;
2404                        } else if (columnObj.filter_type === "date") {
2405                            filter_default_label = placeholderLang.date;
2406                        }
2407                        columnObj.filter_default_label = filter_default_label;
2408                    }
2409
2410                    if (filter_reset_button_text === undefined) {
2411                        filter_reset_button_text = "x";
2412                    }
2413
2414                    if (data !== undefined) {
2415                        for (ii = 0; ii < data.length; ii++) {
2416                            column_data.push(data[ii]);
2417                        }
2418                    }
2419                    if (data === undefined || columnObj.append_data_to_table_data !== undefined) {
2420                        columnObj.col_filter_array = undefined;
2421                        column_data_temp = parseTableColumn(oTable, columnObj, table_selector_jq_friendly, settingsDt);
2422                        if (columnObj.append_data_to_table_data !== 'before') {
2423                            column_data = column_data.concat(column_data_temp);
2424                        } else {
2425                            column_data_temp = sortColumnData(column_data_temp, columnObj);
2426                            column_data = column_data.concat(column_data_temp);
2427                        }
2428                    }
2429
2430                    if (columnObj.append_data_to_table_data === undefined || columnObj.append_data_to_table_data === 'sorted') {
2431                        column_data = sortColumnData(column_data, columnObj);
2432                    }
2433
2434                    if (columnObj.filter_type === "range_number_slider") {
2435                        min_val = findMinInArray(column_data, columnObj);
2436                        max_val = findMaxInArray(column_data, columnObj);
2437                    }
2438
2439                    if (filter_container_id === undefined && columnObj.filter_container_selector === undefined) {
2440                        //Can't show filter inside a column for a hidden one (place it outside using filter_container_id)
2441                        if (settingsDt.aoColumns[column_position].bVisible === false) {
2442                            //console.log('Yadcf warning: Can\'t show filter inside a column N#' + column_number + ' for a hidden one (place it outside using filter_container_id)');
2443                            continue;
2444                        }
2445
2446                        if (filters_position !== 'thead') {
2447                            if (unique_th === undefined) {
2448                                //handle hidden columns
2449                                col_num_visible = column_position;
2450                                for (col_num_visible_iter = 0; col_num_visible_iter < settingsDt.aoColumns.length && col_num_visible_iter < column_position; col_num_visible_iter++) {
2451                                    if (settingsDt.aoColumns[col_num_visible_iter].bVisible === false) {
2452                                        col_num_visible--;
2453                                    }
2454                                }
2455                                column_position = col_num_visible;
2456                                filter_selector_string = table_selector + ' ' + filters_position + ' th:eq(' + column_position + ')';
2457                            } else {
2458                                filter_selector_string = table_selector + ' ' + filters_position + ' th:eq(' + $(unique_th[column_position]).index() + ')';
2459                            }
2460                        } else {
2461                            if (columnObj.filters_tr_index === undefined) {
2462                                filter_selector_string = table_selector + ' ' + filters_position + ' tr:eq(' + $(unique_th[column_position]).parent().index() + ') th:eq(' + $(unique_th[column_position]).index() + ')';
2463                            } else {
2464                                filter_selector_string = table_selector + ' ' + filters_position + ' tr:eq(' + columnObj.filters_tr_index + ') th:eq(' + $(unique_th[column_position]).index() + ')';
2465                            }
2466                        }
2467                        $filter_selector = $(filter_selector_string).find(".yadcf-filter");
2468                    } else {
2469                        if (filter_container_id !== undefined) {
2470                            columnObj.filter_container_selector = "#" + filter_container_id;
2471                        }
2472                        if ($(columnObj.filter_container_selector).length === 0) {
2473                            console.log("ERROR: Filter container could not be found, columnObj.filter_container_selector: " + columnObj.filter_container_selector);
2474                            continue;
2475                        }
2476                        filter_selector_string = columnObj.filter_container_selector;
2477                        $filter_selector = $(filter_selector_string).find(".yadcf-filter");
2478                    }
2479
2480                    if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func' || columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2481                        if (columnObj.data_as_is !== true) {
2482                            if (columnObj.omit_default_label !== true) {
2483                                if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2484                                    options_tmp = "<option value=\"" + "-1" + "\">" + filter_default_label + "</option>";
2485
2486                                    if (columnObj.select_type === 'select2' && columnObj.select_type_options.placeholder !== undefined && columnObj.select_type_options.allowClear === true) {
2487                                        options_tmp = "<option value=\"\"></option>";
2488                                    }
2489                                } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2490                                    if (columnObj.select_type === undefined) {
2491                                        options_tmp = "<option data-placeholder=\"true\" value=\"" + "-1" + "\">" + filter_default_label + "</option>";
2492                                    } else {
2493                                        options_tmp = "";
2494                                    }
2495                                }
2496                            }
2497
2498                            if (columnObj.append_data_to_table_data === undefined) {
2499                                if (typeof column_data[0] === 'object') {
2500                                    for (ii = 0; ii < column_data.length; ii++) {
2501                                        options_tmp += "<option value=\"" + (column_data[ii].value + '').replace(/"/g, '&quot;') + "\">" + column_data[ii].label + "</option>";
2502                                    }
2503                                } else {
2504                                    for (ii = 0; ii < column_data.length; ii++) {
2505                                        options_tmp += "<option value=\"" + (column_data[ii] + '').replace(/"/g, '&quot;') + "\">" + column_data[ii] + "</option>";
2506                                    }
2507                                }
2508                            } else {
2509                                for (ii = 0; ii < column_data.length; ii++) {
2510                                    if (typeof column_data[ii] === 'object') {
2511                                        options_tmp += "<option value=\"" + (column_data[ii].value + '').replace(/"/g, '&quot;') + "\">" + column_data[ii].label + "</option>";
2512                                    } else {
2513                                        options_tmp += "<option value=\"" + (column_data[ii] + '').replace(/"/g, '&quot;') + "\">" + column_data[ii] + "</option>";
2514                                    }
2515                                }
2516                            }
2517                        } else {
2518                            options_tmp = columnObj.data;
2519                        }
2520                        column_data = options_tmp;
2521                    }
2522                    if ($filter_selector.length === 1) {
2523                        if (columnObj.filter_type === "select" || columnObj.filter_type === "multi_select" || columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2524                            if (columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2525                                custom_func_filter_value_holder = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val();
2526                            }
2527                            $filter_selector.empty();
2528                            $filter_selector.append(column_data);
2529                            if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2530                                tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2531                                if (columnObj.filter_type === "select") {
2532                                    tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2533                                    $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2534                                } else if (columnObj.filter_type === "multi_select") {
2535                                    tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2536                                    tmpStr = tmpStr.replace(/\\/g, "");
2537                                    tmpStr = tmpStr.split("|");
2538                                    $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2539                                }
2540                            }
2541                            if (columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2542                                tmpStr = custom_func_filter_value_holder;
2543                                if (tmpStr === '-1' || tmpStr === undefined) {
2544                                    $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2545                                } else {
2546                                    $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2547                                }
2548                            }
2549
2550                            initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2551                            if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2552                                refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2553                            }
2554                        } else if (columnObj.filter_type === "auto_complete") {
2555                            $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_data);
2556                        }
2557                    } else {
2558                        if (filter_container_id === undefined && columnObj.filter_container_selector === undefined) {
2559                            if ($(filter_selector_string + " div.DataTables_sort_wrapper").length > 0) {
2560                                $(filter_selector_string + " div.DataTables_sort_wrapper").css("display", "inline-block");
2561                            }
2562                        } else {
2563                            if (filter_container_id !== undefined) {
2564                                columnObj.filter_container_selector = "#" + filter_container_id;
2565                            }
2566                            if ($("#yadcf-filter-wrapper-" + columnObj.filter_container_selector).length === 0) {
2567                                $(columnObj.filter_container_selector).append("<div id=\"yadcf-filter-wrapper-" + generateTableSelectorJQFriendlyNew(columnObj.filter_container_selector) + "\"></div>");
2568                            }
2569                            filter_selector_string = "#yadcf-filter-wrapper-" + generateTableSelectorJQFriendlyNew(columnObj.filter_container_selector);
2570                        }
2571
2572                        if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2573
2574                            //add a wrapper to hold both filter and reset button
2575                            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2576                            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
2577
2578                            if (columnObj.filter_type === "select") {
2579                                filterActionStr = 'onchange="yadcf.doFilter(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ', \'' + filter_match_mode + '\');"';
2580                                if (columnObj.externally_triggered === true) {
2581                                    filterActionStr = '';
2582                                }
2583                                $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2584                                    filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2585                                if (filter_reset_button_text !== false) {
2586                                    $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " +
2587                                        "id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "-reset\" onmousedown=\"yadcf.stopPropagation(event);
2587\" onclick=\"yadcf.stopPropagation(event);yadcf.doFilter('clear', '" + table_selector_jq_friendly + "', " + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2588                                }
2589                            } else {
2590                                filterActionStr = 'onchange="yadcf.doFilterCustomDateFunc(this, \'' + table_selector_jq_friendly  + '\', ' +  column_number + ');"';
2591                                if (columnObj.externally_triggered === true) {
2592                                    filterActionStr = '';
2593                                }
2594                                $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2595                                    filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2596                                if (filter_reset_button_text !== false) {
2597                                    $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2598                                        "onclick=\"yadcf.stopPropagation(event);yadcf.doFilterCustomDateFunc('clear', '" + table_selector_jq_friendly + "', " + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2599                                }
2600
2601                                if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2602                                    if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2603                                        tmpStr = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
2604                                        if (tmpStr === '-1' || tmpStr === undefined) {
2605                                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2606                                        } else {
2607                                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2608                                        }
2609                                    }
2610                                }
2611                                if (settingsDt.oFeatures.bServerSide !== true) {
2612                                    addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number);
2613                                }
2614                            }
2615
2616                            if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2617                                tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2618                                tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2619                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2620                            }
2621
2622                            if (columnObj.select_type !== undefined) {
2623                                initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2624                                if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2625                                    refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2626                                }
2627                            }
2628
2629                        } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2630
2631                            //add a wrapper to hold both filter and reset button
2632                            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2633                            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
2634
2635                            if (columnObj.filter_type === "multi_select") {
2636                                filterActionStr = 'onchange="yadcf.doFilterMultiSelect(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ', \'' + filter_match_mode + '\');"';
2637                                if (columnObj.externally_triggered === true) {
2638                                    filterActionStr = '';
2639                                }
2640                                $(filter_selector_string).append("<select multiple data-placeholder=\"" + filter_default_label + "\" id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2641                                    filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2642
2643                                if (filter_reset_button_text !== false) {
2644                                    $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2645                                        "onclick=\"yadcf.stopPropagation(event);yadcf.doFilter('clear', '" + table_selector_jq_friendly + "', " + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2646                                }
2647
2648                                if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2649                                    tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2650                                    tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2651                                    tmpStr = tmpStr.replace(/\\/g, "");
2652                                    tmpStr = tmpStr.split("|");
2653                                    $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2654                                }
2655                            } else {
2656                                filterActionStr = 'onchange="yadcf.doFilterCustomDateFunc(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ');"';
2657                                if (columnObj.externally_triggered === true) {
2658                                    filterActionStr = '';
2659                                }
2660                                $(filter_selector_string).append("<select multiple data-placeholder=\"" + filter_default_label + "\" id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2661                                    filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2662
2663                                if (filter_reset_button_text !== false) {
2664                                    $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2665                                        "onclick=\"yadcf.stopPropagation(event);yadcf.doFilterCustomDateFunc('clear', '" + table_selector_jq_friendly + "', " + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2666                                }
2667
2668                                if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2669                                    if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2670                                        tmpStr = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
2671                                        if (tmpStr === '-1' || tmpStr === undefined) {
2672                                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2673                                        } else {
2674                                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2675                                        }
2676                                    }
2677                                }
2678                                if (settingsDt.oFeatures.bServerSide !== true) {
2679                                    addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number);
2680                                }
2681                            }
2682
2683                            if (columnObj.filter_container_selector === undefined && columnObj.select_type_options.width === undefined) {
2684                                columnObj.select_type_options = $.extend(columnObj.select_type_options, {width: $(filter_selector_string).closest("th").width() + "px"});
2685                            }
2686                            if (columnObj.filter_container_selector !== undefined && columnObj.select_type_options.width === undefined) {
2687                                columnObj.select_type_options = $.extend(columnObj.select_type_options, {width: $(filter_selector_string).closest(columnObj.filter_container_selector).width() + "px"});
2688                            }
2689
2690                            if (columnObj.select_type !== undefined) {
2691                                initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2692                                if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2693                                    refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2694                                }
2695                            }
2696
2697                        } else if (columnObj.filter_type === "auto_complete") {
2698
2699                            //add a wrapper to hold both filter and reset button
2700                            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2701                            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
2702
2703                            filterActionStr = 'onkeyup="yadcf.autocompleteKeyUP(\'' + table_selector_jq_friendly + '\',event);"';
2704                            if (columnObj.externally_triggered === true) {
2705                                filterActionStr = '';
2706                            }
2707                            $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);" +
2708                                "' placeholder='" + filter_default_label + "'" + " filter_match_mode='" + filter_match_mode + "' " + filterActionStr + "></input>");
2709                            $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, 
2709column_data);
2710
2711                            if (filter_reset_button_text !== false) {
2712                                $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2713                                    "onclick=\"yadcf.stopPropagation(event);yadcf.doFilterAutocomplete('clear', '" + table_selector_jq_friendly + "', " + column_number + "); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2714                            }
2715
2716                        } else if (columnObj.filter_type === "text") {
2717
2718                            //add a wrapper to hold both filter and reset button
2719                            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2720                            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
2721
2722                            filterActionStr = 'onkeyup="yadcf.textKeyUP(event,\'' + table_selector_jq_friendly + '\', ' + column_number + ');"';
2723                            if (columnObj.externally_triggered === true) {
2724                                filterActionStr = '';
2725                            }
2726
2727                            exclude_str = '';
2728                            if (columnObj.exclude === true) {
2729                                if (columnObj.externally_triggered !== true) {
2730                                    exclude_str = '<span class="yadcf-exclude-wrapper" onmousedown="yadcf.stopPropagation(event);" onclick="yadcf.stopPropagation(event);">' +
2731                                        '<div class="yadcf-label small">' + columnObj.exclude_label + '</div><input type="checkbox" title="' + columnObj.exclude_label + '" onclick="yadcf.stopPropagation(event);yadcf.textKeyUP(event,\'' + table_selector_jq_friendly + '\',' + column_number + ');"></span>';
2732                                } else {
2733                                    exclude_str = '<span class="yadcf-exclude-wrapper" onmousedown="yadcf.stopPropagation(event);" onclick="yadcf.stopPropagation(event);">' +
2734                                        '<div class="yadcf-label small">' + columnObj.exclude_label + '</div><input type="checkbox" title="' + columnObj.exclude_label + '" onclick="yadcf.stopPropagation(event);"></span>';
2735                                }
2736                            }
2737
2738                            $(filter_selector_string).append(exclude_str + "<input type=\"text\" onkeydown=\"yadcf.preventDefaultForEnter(event);\" id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);" +
2739                                "' placeholder='" + filter_default_label + "'" + " filter_match_mode='" + filter_match_mode + "' " + filterActionStr + "></input>");
2740
2741                            if (filter_reset_button_text !== false) {
2742                                $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " + " id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2743                                    "onclick=\"yadcf.stopPropagation(event);yadcf.textKeyUP(event,'" + table_selector_jq_friendly + "', '" + column_number + "', 'clear'); return false;\" class=\"yadcf-filter-reset-button " + columnObj.reset_button_style_class + "\">" + filter_reset_button_text + "</button>");
2744                            }
2745
2746                            if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2747                                tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2748                                if (columnObj.exclude === true) {
2749                                    if (tmpStr.indexOf('^((?!') !== -1) {
2750                                        $('#yadcf-filter-wrapper-' + table_selector_jq_friendly + '-' + column_number).find(':checkbox').prop('checked', true);
2751                                    }
2752                                    tmpStr = tmpStr.substring(5, tmpStr.indexOf(').)'));
2753                                }
2754                                tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2755                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2756                            }
2757
2758                        } else if (columnObj.filter_type === "date") {
2759
2760                            addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format);
2761
2762                        } else if (columnObj.filter_type === "range_number") {
2763
2764                            addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char);
2765
2766                        } else if (columnObj.filter_type === "range_number_slider") {
2767
2768                            addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char);
2769
2770                        } else if (columnObj.filter_type === "range_date") {
2771
2772                            addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format);
2773
2774                        }
2775                    }
2776
2777                    if ($(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val") !== undefined && $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val") !== "-1") {
2778                        $(filter_selector_string).find(".yadcf-filter").val($(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val"));
2779                    }
2780                    if (columnObj.filter_type === "auto_complete") {
2781                        columnObj.filter_plugin_options = {
2782                            source: $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number),
2783                            select: autocompleteSelect
2784                        };
2785                        if (columnObj.externally_triggered === true) {
2786                            delete columnObj.filter_plugin_options.select;
2787                        }
2788                        $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).autocomplete(columnObj.filter_plugin_options);
2789                        if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2790                            tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2791                            tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2792                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2793                        }
2794                    }
2795                }
2796            }
2797            if (exFilterColumnQueue.length > 0) {
2798                (exFilterColumnQueue.shift())();
2799            }
2800        }
2801
2802        function rangeClear(table_selector_jq_friendly, event, column_number) {
2803            event = eventTargetFixUp(event);
2804            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2805            var oTable = oTables[table_selector_jq_friendly],
2806                yadcfState,
2807                settingsDt,
2808                column_number_filter,
2809                currentFilterValues,
2810                columnObj,
2811                dateRange;
2812
2813            settingsDt = getSettingsObjFromTable(oTable);
2814
2815            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
2816
2817            currentFilterValues = exGetColumnFilterVal(oTable, column_number);
2818            if (currentFilterValues.from === '' && currentFilterValues.to === '') {
2819                return;
2820            }
2821
2822            columnObj = getOptions(oTable.selector)[column_number];
2823
2824            $(event.target).parent().find(".yadcf-filter-range").val("");
2825            dateRange = $(event.target).parent().find(".yadcf-filter-range-date");
2826            if (dateRange.length > 1) {
2827                if (columnObj.datepicker_type === 'jquery-ui') {
2828                    $(dateRange[0]).datepicker('option', 'maxDate', null);
2829                    $(dateRange[1]).datepicker('option', 'minDate', null);
2830                }
2831            }
2832            if ($(event.target).parent().find(".yadcf-filter-range-number").length > 0) {
2833                $($(event.target).parent().find(".yadcf-filter-range")[0]).focus();
2834            }
2835
2836            if (oTable.fnSettings().oFeatures.bServerSide !== true) {
2837                oTable.fnDraw();
2838            } else {
2839                oTable.fnFilter('-yadcf_delim-', column_number_filter);
2840            }
2841
2842            if (!oTable.fnSettings().oLoadedState) {
2843                oTable.fnSettings().oLoadedState = {};
2844                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
2845            }
2846            if (oTable.fnSettings().oFeatures.bStateSave === true) {
2847                if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
2848                    oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
2849                        {
2850                            'from' : "",
2851                            'to' : ""
2852                        };
2853                } else {
2854                    yadcfState = {};
2855                    yadcfState[table_selector_jq_friendly] = [];
2856                    yadcfState[table_selector_jq_friendly][column_number] = {
2857                        'from' : "",
2858                        'to' : ""
2859                    };
2860                    oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
2861                }
2862                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
2863            }
2864            resetIApiIndex();
2865
2866            $(event.target).parent().find(".yadcf-filter-range").removeClass("inuse");
2867
2868            return;
2869        }
2870
2871        function rangeNumberSliderClear(table_selector_jq_friendly, event) {
2872            event = eventTargetFixUp(event);
2873            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2874            var oTable = oTables[table_selector_jq_friendly],
2875                min_val,
2876                max_val,
2877                currentFilterValues,
2878                column_number;
2879
2880            column_number = parseInt($(event.target).prev().find(".yadcf-filter-range-number-slider").attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-slider-", ""), 10);
2881
2882            min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text();
2883            max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text();
2884
2885            currentFilterValues = exGetColumnFilterVal(oTable, column_number);
2886            if (+currentFilterValues.from === min_val && +currentFilterValues.to === max_val) {
2887                return;
2888            }
2889
2890            $(event.target).prev().find(".yadcf-filter-range-number-slider").slider("option", "yadcf-reset", true);
2891            $(event.target).prev().find(".yadcf-filter-range-number-slider").slider("option", "values", [min_val, max_val]);
2892
2893            $($(event.target).prev().find(".ui-slider-handle")[0]).attr("tabindex", -1).focus();
2894
2895            $($(event.target).prev().find(".ui-slider-handle")[0]).removeClass("inuse");
2896            $($(event.target).prev().find(".ui-slider-handle")[1]).removeClass("inuse");
2897            $(event.target).prev().find(".ui-slider-range").removeClass("inuse");
2898
2899            oTable.fnDraw();
2900            resetIApiIndex();
2901
2902            return;
2903        }
2904
2905        function dateKeyUP(table_selector_jq_friendly, date_format, event) {
2906            var oTable,
2907                date,
2908                dateId,
2909                column_number,
2910                columnObj;
2911
2912            event = eventTargetFixUp(event);
2913
2914            dateId = event.target.id;
2915            date = document.getElementById(dateId).value;
2916
2917            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2918            oTable = oTables[table_selector_jq_friendly];
2919            column_number = parseInt(dateId.replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10);
2920            columnObj = getOptions(oTable.selector)[column_number];
2921
2922            try {
2923                if (columnObj.datepicker_type === 'jquery-ui') {
2924                    if (date.length === (date_format.length + 2)) {
2925                        date = (date !== "") ? $.datepicker.parseDate(date_format, date) : date;
2926                    }
2927                }
2928            } catch (err1) {}
2929
2930            if (date instanceof Date || moment(date, columnObj.date_format).isValid()) {
2931                $("#" + dateId).addClass('inuse');
2932                oTable.fnFilter(document.getElementById(dateId).value, column_number);
2933                resetIApiIndex();
2934            } else if (date === "" || $.trim(event.target.value) === '') {
2935                $("#" + dateId).removeClass('inuse');
2936                $('#' + event.target.id).removeClass('inuse');
2937                oTable.fnFilter('', column_number);
2938                resetIApiIndex();
2939            }
2940        }
2941
2942        function rangeDateKeyUP(table_selector_jq_friendly, date_format, event) {
2943            event = eventTargetFixUp(event);
2944            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2945            var oTable = oTables[table_selector_jq_friendly],
2946                min,
2947                max,
2948                fromId,
2949                toId,
2950                column_number,
2951                columnObj,
2952                keyUp,
2953                settingsDt,
2954                column_number_filter;
2955
2956            column_number = parseInt($(event.target).attr("id").replace('-from-date-', '').replace('-to-date-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10);
2957            columnObj = getOptions(oTable.selector)[column_number];
2958            settingsDt = getSettingsObjFromTable(oTable);
2959            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
2960
2961            keyUp = function () {
2962                if (event.target.id.indexOf("-from-") !== -1) {
2963                    fromId = event.target.id;
2964                    toId = event.target.id.replace("-from-", "-to-");
2965
2966                    min = document.getElementById(fromId).value;
2967                    max = document.getElementById(toId).value;
2968                } else {
2969                    toId = event.target.id;
2970                    fromId = event.target.id.replace("-to-", "-from-");
2971
2972                    max =   document.getElementById(toId).value;
2973                    min = document.getElementById(fromId).value;
2974                }
2975
2976                //moment(min, "YYYY-MM-DD hh:mm:ss").toDate() typeof Date
2977
2978                if (columnObj.datepicker_type === 'jquery-ui') {
2979                    try {
2980                        if (min.length === (date_format.length + 2)) {
2981                            min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min;
2982                        }
2983                    } catch (err1) {}
2984                    try {
2985                        if (max.length === (date_format.length + 2)) {
2986                            max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max;
2987                        }
2988                    } catch (err2) {}
2989                } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
2990                    try {
2991                        min = moment(min, columnObj.moment_date_format).toDate();
2992                        if (isNaN(min.getTime())) {
2993                            min = '';
2994                        }
2995                    } catch (err3) {}
2996                    try {
2997                        max = moment(max, columnObj.moment_date_format).toDate();
2998                        if (isNaN(max.getTime())) {
2999                            max = '';
3000                        }
3001                    } catch (err4) {}
3002                }
3003
3004                if (((max instanceof Date) && (min instanceof Date) && (max >= min)) || min === "" || max === "") {
3005
3006                    if (oTable.fnSettings().oFeatures.bServerSide !== true) {
3007                        oTable.fnDraw();
3008                    } else {
3009                        oTable.fnFilter(document.getElementById(fromId).value + '-yadcf_delim-' + document.getElementById(toId).value, column_number_filter);
3010                    }
3011
3012                    if (min instanceof Date) {
3013                        $("#" + fromId).addClass("inuse");
3014                    } else {
3015                        $("#" + fromId).removeClass("inuse");
3016                    }
3017                    if (max instanceof Date) {
3018                        $("#" + toId).addClass("inuse");
3019                    } else {
3020                        $("#" + toId).removeClass("inuse");
3021                    }
3022
3023                    if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) {
3024                        $("#" + event.target.id).removeClass("inuse");
3025                    }
3026
3027                }
3028                resetIApiIndex();
3029            };
3030
3031            if (columnObj.filter_delay === undefined) {
3032                keyUp(table_selector_jq_friendly, event);
3033            } else {
3034                yadcfDelay(function () {
3035                    keyUp(table_selector_jq_friendly, event);
3036                }, columnObj.filter_delay);
3037            }
3038        }
3039
3040        function rangeNumberKeyUP(table_selector_jq_friendly, event) {
3041            event = eventTargetFixUp(event);
3042            $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3043            var oTable = oTables[table_selector_jq_friendly],
3044                min,
3045                max,
3046                fromId,
3047                toId,
3048                yadcfState,
3049                column_number,
3050                options,
3051                keyUp;
3052
3053            column_number = parseInt($(event.target).attr("id").replace('-from-', '').replace('-to-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10);
3054            options = getOptions(oTable.selector)[column_number];
3055
3056            keyUp = function () {
3057
3058                if (event.target.id.indexOf("-from-") !== -1) {
3059                    fromId = event.target.id;
3060                    toId = event.target.id.replace("-from-", "-to-");
3061
3062                    min = document.getElementById(fromId).value;
3063                    max = document.getElementById(toId).value;
3064                } else {
3065                    toId = event.target.id;
3066                    fromId = event.target.id.replace("-to-", "-from-");
3067
3068                    max =   document.getElementById(toId).value;
3069                    min = document.getElementById(fromId).value;
3070                }
3071
3072                min = (min !== "") ? (+min) : min;
3073                max = (max !== "") ? (+max) : max;
3074
3075                if ((!isNaN(max) && !isNaN(min) && (max >= min)) || min === "" || max === "") {
3076
3077                    if (oTable.fnSettings().oFeatures.bServerSide !== true) {
3078                        oTable.fnDraw();
3079                    } else {
3080                        oTable.fnFilter(min + '-yadcf_delim-' + max, column_number);
3081                    }
3082                    if (document.getElementById(fromId).value !== "") {
3083                        $("#" + fromId).addClass("inuse");
3084                    }
3085                    if (document.getElementById(toId).value !== "") {
3086                        $("#" + toId).addClass("inuse");
3087                    }
3088
3089                    if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) {
3090                        $("#" + event.target.id).removeClass("inuse");
3091                    }
3092                    if (!oTable.fnSettings().oLoadedState) {
3093                        oTable.fnSettings().oLoadedState = {};
3094                        oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3095                    }
3096                    if (oTable.fnSettings().oFeatures.bStateSave === true) {
3097                        if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
3098                            oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
3099                                {
3100                                    'from' : min,
3101                                    'to' : max
3102                                };
3103                        } else {
3104                            yadcfState = {};
3105                            yadcfState[table_selector_jq_friendly] = [];
3106                            yadcfState[table_selector_jq_friendly][column_number] = {
3107                                'from' : min,
3108                                'to' : max
3109                            };
3110                            oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
3111                        }
3112                        oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3113                    }
3114                }
3115                resetIApiIndex();
3116            };
3117
3118            if (options.filter_delay === undefined) {
3119                keyUp();
3120            } else {
3121                yadcfDelay(function () {
3122                    keyUp();
3123                }, options.filter_delay);
3124            }
3125        }
3126
3127        function doFilterMultiTablesMultiSelect(tablesSelectors, event, column_number_str, clear) {
3128
3129            var columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3130                regex = false,
3131                smart = true,
3132                caseInsen = true,
3133                tablesAsOne,
3134                tablesArray = oTables[tablesSelectors],
3135                selected_values = $(event.target).val(),
3136                i;
3137
3138            event = eventTargetFixUp(event);
3139            tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3140
3141            if (clear !== undefined || selected_values == undefined || selected_values.length === 0) {
3142                if (clear !== undefined) {
3143                    $(event.target).parent().find('select').val('-1').focus();
3144                    $(event.target).parent().find('selectn ').removeClass("inuse");
3145                }
3146                if (columnsObj.column_number instanceof Array) {
3147                    tablesAsOne.columns(columnsObj.column_number).search('').draw();
3148                } else {
3149                    tablesAsOne.search('').draw();
3150                }
3151
3152                refreshSelectPlugin(columnsObj, $('#' + columnsObj.filter_container_id + ' select'), '-1');
3153                return;
3154            }
3155
3156            $(event.target).addClass("inuse");
3157
3158            regex = true;
3159            smart = false;
3160            caseInsen = columnsObj.case_insensitive;
3161
3162            if (selected_values !== null) {
3163                for (i = selected_values.length - 1; i >= 0; i--) {
3164                    if (selected_values[i] === "-1") {
3165                        selected_values.splice(i, 1);
3166                        break;
3167                    }
3168                }
3169                if (selected_values.length !== 0) {
3170                    selected_values = selected_values.join('narutouzomaki');
3171                    selected_values = selected_values.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
3172                    selected_values = selected_values.split('narutouzomaki').join('|');
3173                }
3174            }
3175            if (columnsObj.filter_match_mode === "exact") {
3176                selected_values = "^" + selected_values + "$";
3177            } else if (columnsObj.filter_match_mode === "startsWith") {
3178                selected_values = "^" + selected_values;
3179            }
3180            if (columnsObj.column_number instanceof Array) {
3181                tablesAsOne.columns(columnsObj.column_number).search(selected_values, regex, smart, caseInsen).draw();
3182            } else {
3183                tablesAsOne.search(selected_values, regex, smart, caseInsen).draw();
3184            }
3185        }
3186
3187        function doFilterMultiTables(tablesSelectors, event, column_number_str, clear) {
3188
3189            var columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3190                regex = false,
3191                smart = true,
3192                caseInsen = true,
3193                serachVal,
3194                tablesAsOne,
3195                tablesArray = oTables[tablesSelectors];
3196
3197            event = eventTargetFixUp(event);
3198            tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3199
3200            if (clear !== undefined || event.target.value === '-1') {
3201                if (clear !== undefined) {
3202                    $(event.target).parent().find('select').val('-1').focus();
3203                    $(event.target).parent().find('select').removeClass("inuse");
3204                }
3205                if (columnsObj.column_number instanceof Array) {
3206                    tablesAsOne.columns(columnsObj.column_number).search('').draw();
3207                } else {
3208                    tablesAsOne.search('').draw();
3209                }
3210
3211                refreshSelectPlugin(columnsObj, $('#' + columnsObj.filter_container_id + ' select'), '-1');
3212
3213                return;
3214            }
3215
3216            $(event.target).addClass("inuse");
3217
3218            serachVal = event.target.value;
3219            smart = false;
3220            caseInsen = columnsObj.case_insensitive;
3221            /*
3222			if (columnsObj.filter_match_mode === "contains") {
3223				regex = false;
3224			} else if (columnsObj.filter_match_mode === "exact") {
3225				regex = true;
3226				serachVal = "^" + serachVal + "$";
3227			} else if (columnsObj.filter_match_mode === "startsWith") {
3228				regex = true;
3229				serachVal = "^" + serachVal;
3230			}*/
3231            if (columnsObj.column_number instanceof Array) {
3232                tablesAsOne.columns(columnsObj.column_number).search(serachVal, regex, smart, caseInsen).draw();
3233            } else {
3234                tablesAsOne.search(serachVal, regex, smart, caseInsen).draw();
3235            }
3236        }
3237
3238        function textKeyUpMultiTables(tablesSelectors, event, column_number_str, clear) {
3239
3240            var keyUp,
3241                columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3242                regex = false,
3243                smart = true,
3244                caseInsen = true,
3245                serachVal,
3246                tablesAsOne,
3247                tablesArray = oTables[tablesSelectors];
3248
3249            event = eventTargetFixUp(event);
3250            tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3251
3252            keyUp = function (tablesAsOne, event, clear) {
3253
3254                if (clear !== undefined || event.target.value === '') {
3255                    if (clear !== undefined) {
3256                        $(event.target).prev().val("").focus();
3257                        $(event.target).prev().removeClass("inuse");
3258                    } else {
3259                        $(event.target).val("").focus();
3260                        $(event.target).removeClass("inuse");
3261                    }
3262                    if (columnsObj.column_number instanceof Array) {
3263                        tablesAsOne.columns(columnsObj.column_number).search('').draw();
3264                    } else {
3265                        tablesAsOne.search('').draw();
3266                    }
3267                    return;
3268                }
3269
3270                $(event.target).addClass("inuse");
3271
3272                serachVal = event.target.value;
3273                smart = false;
3274                caseInsen = columnsObj.case_insensitive;
3275                /*
3276				if (columnsObj.filter_match_mode === "contains") {
3277					regex = false;
3278				} else if (columnsObj.filter_match_mode === "exact") {
3279					regex = true;
3280					serachVal = "^" + serachVal + "$";
3281				} else if (columnsObj.filter_match_mode === "startsWith") {
3282					regex = true;
3283					serachVal = "^" + serachVal;
3284				}
3285	*/
3286                if (columnsObj.column_number instanceof Array) {
3287                    tablesAsOne.columns(columnsObj.column_number).search(serachVal, regex, smart, caseInsen).draw();
3288                } else {
3289                    tablesAsOne.search(serachVal, regex, smart, caseInsen).draw();
3290                }
3291
3292            };
3293
3294            if (columnsObj.filter_delay === undefined) {
3295                keyUp(tablesAsOne, event, clear);
3296            } else {
3297                yadcfDelay(function () {
3298                    keyUp(tablesAsOne, event, clear);
3299                }, columnsObj.filter_delay);
3300            }
3301        }
3302
3303        function textKeyUP(ev, table_selector_jq_friendly, column_number, 
3303clear) {
3304            var column_number_filter,
3305                oTable = oTables[table_selector_jq_friendly],
3306                keyUp,
3307                columnObj,
3308                settingsDt = getSettingsObjFromTable(oTable),
3309                exclude,
3310                keyCodes = [37, 38, 39, 40];
3311
3312            if (keyCodes.indexOf(ev.keyCode) !== -1) {
3313                return;
3314            }
3315            column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
3316
3317            columnObj = getOptions(oTable.selector)[column_number];
3318
3319            keyUp = function (table_selector_jq_friendly, column_number, clear) {
3320                $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3321
3322                if (clear === 'clear' || $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val() === '') {
3323                    if (clear === 'clear' && exGetColumnFilterVal(oTable, column_number) === '') {
3324                        return;
3325                    }
3326                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus();
3327                    $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
3328                    oTable.fnFilter("", column_number_filter);
3329                    resetIApiIndex();
3330                    return;
3331                }
3332
3333                if (columnObj.exclude === true) {
3334                    exclude = $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).closest('.yadcf-filter-wrapper').find('.yadcf-exclude-wrapper :checkbox').prop('checked');
3335                }
3336                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
3337
3338                yadcfMatchFilter(oTable, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val(), columnObj.filter_match_mode, column_number_filter, exclude);
3339
3340                resetIApiIndex();
3341            };
3342
3343            if (columnObj.filter_delay === undefined) {
3344                keyUp(table_selector_jq_friendly, column_number, clear);
3345            } else {
3346                yadcfDelay(function () {
3347                    keyUp(table_selector_jq_friendly, column_number, clear);
3348                }, columnObj.filter_delay);
3349            }
3350        }
3351
3352        function autocompleteKeyUP(table_selector_jq_friendly, event) {
3353            var oTable,
3354                column_number,
3355                keyCodes = [37, 38, 39, 40];
3356
3357            event = eventTargetFixUp(event);
3358
3359            if (keyCodes.indexOf(event.keyCode) !== -1) {
3360                return;
3361            }
3362
3363            if (event.target.value === "" && event.keyCode === 8 && $(event.target).hasClass("inuse")) {
3364                $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3365                oTable = oTables[table_selector_jq_friendly];
3366                column_number = parseInt($(event.target).attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10);
3367
3368                $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
3369                $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
3370                oTable.fnFilter("", column_number);
3371                resetIApiIndex();
3372            }
3373        }
3374
3375        function isDOMSource(tableVar) {
3376            var settingsDt;
3377            settingsDt = getSettingsObjFromTable(tableVar);
3378            if (settingsDt.sAjaxSource == undefined && settingsDt.ajax == undefined && settingsDt.oFeatures.bServerSide !== true) {
3379                return true;
3380            }
3381            return false;
3382        }
3383
3384        function scrollXYHandler(oTable, table_selector) {
3385            var $tmpSelector,
3386                filters_position = $(document).data(table_selector + "_filters_position"),
3387                table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable);
3388
3389            if (filters_position === 'thead') {
3390                filters_position = '.dataTables_scrollHead';
3391            } else {
3392                filters_position = '.dataTables_scrollFoot';
3393            }
3394            if (oTable.fnSettings().oScroll.sX !== '' || oTable.fnSettings().oScroll.sY !== '') {
3395                $tmpSelector = $(table_selector).closest('.dataTables_scroll').find(filters_position + ' table');
3396                $tmpSelector.addClass('yadcf-datatables-table-' + table_selector_jq_friendly);
3397            }
3398        }
3399
3400        function firstFromObject(obj) {
3401            var key;
3402            for (key in obj) {
3403                if (obj.hasOwnProperty(key)) {
3404                    return key;
3405                }
3406            }
3407        }
3408
3409        function initAndBindTable(oTable, table_selector, index, pTableDT) {
3410
3411            var table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable),
3412                table_selector_tmp;
3413            oTables[table_selector_jq_friendly] = oTable;
3414            tablesDT[table_selector_jq_friendly] = pTableDT;
3415            oTablesIndex[table_selector_jq_friendly] = index;
3416
3417            scrollXYHandler(oTable, table_selector);
3418
3419            if (isDOMSource(oTable)) {
3420                table_selector_tmp = table_selector;
3421                if (table_selector.indexOf(":eq") !== -1) {
3422                    table_selector_tmp = table_selector.substring(0, table_selector.lastIndexOf(":eq"));
3423                }
3424                appendFilters(oTable, getOptions(table_selector_tmp), table_selector);
3425                if (getOptions(table_selector_tmp)[firstFromObject(getOptions(table_selector_tmp))].cumulative_filtering === true) {
3426                    //when filters should be populated only from visible rows (non filtered)
3427                    $(document).off('search.dt', oTable.selector).on('search.dt', oTable.selector, function (e, settings, json) {
3428                        var table_selector_tmp = oTable.selector;
3429                        if (table_selector.indexOf(":eq") !== -1) {
3430                            table_selector_tmp = table_selector.substring(0, table_selector.lastIndexOf(":eq"));
3431                        }
3432                        appendFilters(oTable, getOptions(table_selector_tmp), oTable.selector, settings);
3433                    });
3434                }
3435            } else {
3436                appendFilters(oTable, getOptions(table_selector), table_selector);
3437                if (yadcfVersionCheck('1.10')) {
3438                    $(document).off('xhr.dt', oTable.selector).on('xhr.dt', oTable.selector, function (e, settings, json) {
3439                        var col_num,
3440                            column_number_filter,
3441                            table_selector_jq_friendly = generateTableSelectorJQFriendly2(oTable);
3442                        if (json == undefined) {
3443                            console.log('datatables xhr.dt event came back with null as data (nothing for yadcf to do with it).');
3444                            return;
3445                        }
3446                        if (settings.oSavedState !== null) {
3447                            initColReorder2(settings, table_selector_jq_friendly);
3448                        }
3449                        for (col_num in yadcf.getOptions(settings.oInstance.selector)) {
3450                            if (yadcf.getOptions(settings.oInstance.selector).hasOwnProperty(col_num)) {
3451                                if (json['yadcf_data_' + col_num] !== undefined) {
3452                                    column_number_filter = col_num;
3453                                    if (settings.oSavedState !== null && plugins[table_selector_jq_friendly] !== undefined) {
3454                                        column_number_filter = plugins[table_selector_jq_friendly].ColReorder[col_num];
3455                                    }
3456                                    yadcf.getOptions(settings.oInstance.selector)[col_num].data = json['yadcf_data_' + column_number_filter];
3457                                }
3458                            }
3459                        }
3460                    });
3461                }
3462            }
3463            //events that affects both DOM and Ajax
3464            if (yadcfVersionCheck('1.10')) {
3465                $(document).off('draw.dt', oTable.selector).on('draw.dt', oTable.selector, function (event, settings) {
3466                    appendFilters(oTable, yadcf.getOptions(settings.oInstance.selector), settings.oInstance.selector, settings);
3467                });
3468                $(document).off('column-visibility.dt', oTable.selector).on('column-visibility.dt', oTable.selector, function (e, settings, col_num, state) {
3469                    var obj = {},
3470                        columnsObj = getOptions(settings.oInstance.selector);
3471                    if (state === true && settings._oFixedColumns === undefined) {
3472                        if ((plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
3473                            col_num = plugins[table_selector_jq_friendly].ColReorder[col_num];
3474                        } else if (settings.oSavedState != undefined && settings.oSavedState.ColReorder !== undefined) {
3475                            col_num = settings.oSavedState.ColReorder[col_num];
3476                        }
3477                        obj[col_num] = yadcf.getOptions(settings.oInstance.selector)[col_num];
3478                        if (obj[col_num] !== undefined) {
3479                            obj[col_num].column_number = col_num;
3480                            if (obj[col_num] !== undefined) {
3481                                appendFilters(oTables[yadcf.generateTableSelectorJQFriendly2(settings)],
3482                                    obj,
3483                                    settings.oInstance.selector, settings);
3484                            }
3485                        }
3486                    } else if (settings._oFixedColumns !== undefined) {
3487                        appendFilters(oTables[yadcf.generateTableSelectorJQFriendly2(settings)],
3488                            columnsObj,
3489                            settings.oInstance.selector, settings);
3490                    }
3491                });
3492                $(document).off('column-reorder.dt', oTable.selector).on('column-reorder.dt', oTable.selector, function (e, settings, json) {
3493                    var table_selector_jq_friendly = generateTableSelectorJQFriendly2(oTable);
3494                    initColReorderFromEvent(table_selector_jq_friendly);
3495                });
3496                $(document).off('destroy.dt', oTable.selector).on('destroy.dt', oTable.selector, function (event, ui) {
3497                    removeFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector);
3498                });
3499            } else {
3500                $(document).off('draw', oTable.selector).on('draw', oTable.selector, function (event, settings) {
3501                    appendFilters(oTable, yadcf.getOptions(settings.oInstance.selector), settings.oInstance.selector, settings);
3502                });
3503                $(document).off('destroy', oTable.selector).on('destroy', oTable.selector, function (event, ui) {
3504                    removeFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector);
3505                });
3506            }
3507            if (oTable.fnSettings().oFeatures.bStateSave === true) {
3508                if (yadcfVersionCheck('1.10')) {
3509                    $(oTable.selector).off('stateSaveParams.dt').on('stateSaveParams.dt', function (e, settings, data) {
3510                        if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) {
3511                            data.yadcfState = settings.oLoadedState.yadcfState;
3512                        } else {
3513                            data.naruto = 'kurama';
3514                        }
3515                    });
3516                } else {
3517                    $(oTable.selector).off('stateSaveParams').on('stateSaveParams', function (e, settings, data) {
3518                        if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) {
3519                            data.yadcfState = settings.oLoadedState.yadcfState;
3520                        } else {
3521                            data.naruto = 'kurama';
3522                        }
3523                    });
3524                }
3525                //when using DOM source
3526                if (isDOMSource(oTable)) {
3527                    //we need to make sure that the yadcf state will be saved after page reload
3528                    oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3529                    //redraw the table in order to apply the filters
3530                    oTable.fnDraw(false);
3531                }
3532            }
3533        }
3534
3535        $.fn.yadcf = function (options_arg, params) {
3536
3537            var tmpParams,
3538                i = 0,
3539                selector,
3540                tableSelector = '#' + this.fnSettings().sTableId;
3541
3542            //in case that instance.selector will be undefined (jQuery 3)
3543            if (this.selector === undefined) {
3544                this.selector = tableSelector;
3545            }
3546
3547            if (params === undefined) {
3548                params = {};
3549            }
3550
3551            if (typeof params === 'string') {
3552                tmpParams = params;
3553                params = {};
3554                params.filters_position = tmpParams;
3555            }
3556            if (params.filters_position === undefined || params.filters_position === 'header') {
3557                params.filters_position = 'thead';
3558            } else {
3559                params.filters_position = 'tfoot';
3560            }
3561            if (params.language !== undefined) {
3562                for (tmpParams in placeholderLang) {
3563                    if (placeholderLang.hasOwnProperty(tmpParams)) {
3564                        if (params.language[tmpParams] !== undefined) {
3565                            placeholderLang[tmpParams] = params.language[tmpParams];
3566                        }
3567                    }
3568                }
3569            }
3570            $(document).data(this.selector + "_filters_position", params.filters_position);
3571
3572            if ($(this.selector).length === 1) {
3573                setOptions(this.selector, options_arg, params);
3574                initAndBindTable(this, this.selector, 0);
3575            } else {
3576                for (i; i < $(this.selector).length; i++) {
3577                    $.fn.dataTableExt.iApiIndex = i;
3578                    selector = this.selector + ":eq(" + i + ")";
3579                    setOptions(this.selector, options_arg, params);
3580                    initAndBindTable(this, selector, i);
3581                }
3582                $.fn.dataTableExt.iApiIndex = 0;
3583            }
3584            return this;
3585        };
3586
3587        function init(oTable, options_arg, params) {
3588            var instance = oTable.settings()[0].oInstance,
3589                i = 0,
3590                selector,
3591                tmpParams,
3592                tableSelector = '#' + oTable.table().node().id;
3593
3594            //in case that instance.selector will be undefined (jQuery 3)
3595            if (instance.selector === undefined) {
3596                instance.selector = tableSelector;
3597            }
3598
3599            if (params === undefined) {
3600                params = {};
3601            }
3602
3603            if (typeof params === 'string') {
3604                tmpParams = params;
3605                params = {};
3606                params.filters_position = tmpParams;
3607            }
3608            if (params.filters_position === undefined || params.filters_position === 'header') {
3609                params.filters_position = 'thead';
3610            } else {
3611                params.filters_position = 'tfoot';
3612            }
3613            if (params.language !== undefined) {
3614                for (tmpParams in placeholderLang) {
3615                    if (placeholderLang.hasOwnProperty(tmpParams)) {
3616                        if (params.language[tmpParams] !== undefined) {
3617                            placeholderLang[tmpParams] = params.language[tmpParams];
3618                        }
3619                    }
3620                }
3621            }
3622            $(document).data(instance.selector + "_filters_position", params.filters_position);
3623
3624            if ($(instance.selector).length === 1) {
3625                setOptions(instance.selector, options_arg, params);
3626                initAndBindTable(instance, instance.selector, 0, oTable);
3627            } else {
3628                for (i; i < $(instance.selector).length; i++) {
3629                    $.fn.dataTableExt.iApiIndex = i;
3630                    selector = instance.selector + ":eq(" + i + ")";
3631                    setOptions(instance.selector, options_arg, params);
3632                    initAndBindTable(instance, selector, i, oTable);
3633                }
3634                $.fn.dataTableExt.iApiIndex = 0;
3635            }
3636        }
3637
3638        function appendFiltersMultipleTables(tablesArray, tablesSelectors, colObjDummy) {
3639            var filter_selector_string = "#" + colObjDummy.filter_container_id,
3640                $filter_selector = $(filter_selector_string).find(".yadcf-filter"),
3641                table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendlyNew(tablesSelectors),
3642                options_tmp,
3643                ii,
3644                column_number_str = columnsArrayToString(colObjDummy.column_number).column_number_str,
3645                tableTmp,
3646                tableTmpArr,
3647                tableTmpArrIndex,
3648                filterOptions = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3649                column_number_index,
3650                columnsTmpArr,
3651                settingsDt,
3652                tmpStr,
3653                columnForStateSaving;
3654
3655            //add a wrapper to hold both filter and reset button
3656            $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter-wrapper\"></div>");
3657            filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper";
3658            if (column_number_str.indexOf('_') !== -1) {
3659                columnForStateSaving = column_number_str.split('_')[0];
3660            } else {
3661                columnForStateSaving = column_number_str;
3662            }
3663
3664            switch (filterOptions.filter_type) {
3665                case 'text':
3666                    $(filter_selector_string).append("<input type=\"text\" id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);" +
3667                        "' placeholder='" + filterOptions.filter_default_label + "'" + " onkeyup=\"yadcf.textKeyUpMultiTables('" + tablesSelectors + "',event,'" + column_number_str + "');\"></input>");
3668                    if (filterOptions.filter_reset_button_text !== false) {
3669                        $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " + " id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" " +
3670                            "onclick=\"yadcf.stopPropagation(event);yadcf.textKeyUpMultiTables('" + tablesSelectors + "', event,'" + column_number_str + "','clear'); return false;\" class=\"yadcf-filter-reset-button " + filterOptions.reset_button_style_class + "\">" + filterOptions.filter_reset_button_text + "</button>");
3671                    }
3672                    if (tablesArray[0].table !== undefined) {
3673                        tableTmp = $('#' + tablesArray[0].table().node().id).dataTable();
3674                    } else {
3675                        tableTmp = tablesArray[0];
3676                    }
3677                    settingsDt = getSettingsObjFromTable(tableTmp);
3678                    if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
3679                        tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
3680                        tmpStr = yadcfParseMatchFilter(tmpStr, filterOptions.filter_match_mode);
3681                        $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr).addClass("inuse");
3682                    }
3683                    break;
3684                case 'select':
3685                case 'multi_select':
3686                    if (filterOptions.select_type === undefined) {
3687                        options_tmp = "<option data-placeholder=\"true\" value=\"" + "-1" + "\">" + filterOptions.filter_default_label + "</option>";
3688                    } else {
3689                        options_tmp = "";
3690                    }
3691                    if (filterOptions.select_type === 'select2' && filterOptions.select_type_options.placeholder !== undefined && filterOptions.select_type_options.allowClear === true) {
3692                        options_tmp = "<option value=\"\"></option>";
3693                    }
3694                    if (filterOptions.data === undefined) {
3695                        filterOptions.data = [];
3696                        tableTmpArr = tablesSelectors.split(',');
3697                        for (tableTmpArrIndex = 0; tableTmpArrIndex < tableTmpArr.length; tableTmpArrIndex++) {
3698                            if (tablesArray[tableTmpArrIndex].table !== undefined) {
3699                                tableTmp = $('#' + tablesArray[tableTmpArrIndex].table().node().id).dataTable();
3700                            } else {
3701                                tableTmp = tablesArray[tableTmpArrIndex];
3702                            }
3703                            if (isDOMSource(tableTmp)) {
3704                                //check if ajax source, if so, listen for dt.draw
3705                                columnsTmpArr = filterOptions.column_number;
3706                                for (column_number_index = 0; column_number_index < columnsTmpArr.length; column_number_index++) {
3707                                    filterOptions.column_number = columnsTmpArr[column_number_index];
3708                                    filterOptions.data = filterOptions.data.concat(parseTableColumn(tableTmp, filterOptions, table_selector_jq_friendly));
3709                                }
3710                                filterOptions.column_number = columnsTmpArr;
3711                            } else {
3712                                $(document).off('draw.dt', '#' + tablesArray[tableTmpArrIndex].table().node().id).on('draw.dt', '#' + tablesArray[tableTmpArrIndex].table().node().id, function (event, ui) {
3713                                    var options_tmp = '',
3714                                        ii;
3715                                    columnsTmpArr = filterOptions.column_number;
3716                                    for (column_number_index = 0; column_number_index < columnsTmpArr.length; column_number_index++) {
3717                                        filterOptions.column_number = columnsTmpArr[column_number_index];
3718                                        filterOptions.data = filterOptions.data.concat(parseTableColumn(tableTmp, filterOptions, table_selector_jq_friendly, ui));
3719                                    }
3720                                    filterOptions.column_number = columnsTmpArr;
3721                                    filterOptions.data = sortColumnData(filterOptions.data, filterOptions);
3722                                    for (ii = 0; ii < filterOptions.data.length; ii++) {
3723                                        options_tmp += "<option value=\"" + filterOptions.data[ii] + "\">" + filterOptions.data[ii] + "</option>";
3724                                    }
3725                                    $('#' + filterOptions.filter_container_id + ' select').empty().append(options_tmp);
3726
3727                                    if (filterOptions.select_type !== undefined) {
3728                                        initializeSelectPlugin(filterOptions.select_type, $('#' + filterOptions.filter_container_id + ' select'), filterOptions.select_type_options);
3729                                        if (filterOptions.cumulative_filtering === true && filterOptions.select_type === 'chosen') {
3730                                            refreshSelectPlugin(filterOptions, $('#' + filterOptions.filter_container_id + ' select'));
3731                                        }
3732                                    }
3733                                });
3734                            }
3735                        }
3736                    }
3737
3738                    filterOptions.data = sortColumnData(filterOptions.data, filterOptions);
3739
3740                    if (tablesArray[0].table !== undefined) {
3741                        tableTmp = $('#' + tablesArray[0].table().node().id).dataTable();
3742                    } else {
3743                        tableTmp = tablesArray[0];
3744                    }
3745                    settingsDt = getSettingsObjFromTable(tableTmp);
3746
3747                    if (typeof filterOptions.data[0] === 'object') {
3748                        for (ii = 0; ii < filterOptions.data.length; ii++) {
3749                            options_tmp += "<option value=\"" + filterOptions.data[ii].value + "\">" + filterOptions.data[ii].label + "</option>";
3750                        }
3751                    } else {
3752                        for (ii = 0; ii < filterOptions.data.length; ii++) {
3753                            options_tmp += "<option value=\"" + filterOptions.data[ii] + "\">" + filterOptions.data[ii] + "</option>";
3754                        }
3755                    }
3756                    if (filterOptions.filter_type === 'select') {
3757                        $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter\" " +
3758                            "onchange=\"yadcf.doFilterMultiTables('" + tablesSelectors + "',event,'" + column_number_str + "')\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + options_tmp + "</select>");
3759                        if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
3760                            tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
3761                            tmpStr = yadcfParseMatchFilter(tmpStr, filterOptions.filter_match_mode);
3762                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr).addClass("inuse");
3763                        }
3764                    } else if (filterOptions.filter_type === 'multi_select') {
3765                        $(filter_selector_string).append("<select multiple data-placeholder=\"" + filterOptions.filter_default_label + "\" id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter\" " +
3766                            "onchange=\"yadcf.doFilterMultiTablesMultiSelect('" + tablesSelectors + "',event,'" + column_number_str + "')\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + options_tmp + "</select>");
3767                        if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
3768                            tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
3769                            tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, filterOptions.filter_match_mode);
3770                            tmpStr = tmpStr.replace(/\\/g, "");
3771                            tmpStr = tmpStr.split("|");
3772                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr);
3773                        }
3774                    }
3775                    if (filterOptions.filter_type === 'select') {
3776                        if (filterOptions.filter_reset_button_text !== false) {
3777                            $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " + " id=\"yadcf-filter-" + table_selector_jq_friendly  + '-' + column_number_str + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" " +
3778                                "onclick=\"yadcf.stopPropagation(event);yadcf.doFilterMultiTables('" + tablesSelectors + "', event,'" + column_number_str + "','clear'); return false;\" class=\"yadcf-filter-reset-button " + filterOptions.reset_button_style_class + "\">" + filterOptions.filter_reset_button_text + "</button>");
3779                        }
3780                    } else if (filterOptions.filter_type === 'multi_select') {
3781                        if (filterOptions.filter_reset_button_text !== false) {
3782                            $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " + " id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" " +
3783                                "onclick=\"yadcf.stopPropagation(event);yadcf.doFilterMultiTablesMultiSelect('" + tablesSelectors + "', event,'" + column_number_str + "','clear'); return false;\" class=\"yadcf-filter-reset-button " + filterOptions.reset_button_style_class + "\">" + filterOptions.filter_reset_button_text + "</button>");
3784                        }
3785                    }
3786
3787                    if (filterOptions.select_type !== undefined) {
3788                        initializeSelectPlugin(filterOptions.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str), filterOptions.select_type_options);
3789                        if (filterOptions.cumulative_filtering === true && filterOptions.select_type === 'chosen') {
3790                            refreshSelectPlugin(filterOptions, $("#yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str));
3791                        }
3792                    }
3793                    break;
3794                default:
3795                    alert('Filters Multiple Tables does not support ' + filterOptions.filter_type);
3796            }
3797        }
3798
3799        function initMultipleTables(tablesArray, filtersOptions) {
3800            var i,
3801                tablesSelectors = '',
3802                default_options = {
3803                    filter_type : "text",
3804                    filter_container_id: '',
3805                    filter_reset_button_text: 'x',
3806                    case_insensitive: true
3807                },
3808                columnsObjKey,
3809                columnsObj,
3810                columnsArrIndex,
3811                column_number_str,
3812                dummyArr;
3813
3814            for (columnsArrIndex = 0; columnsArrIndex < filtersOptions.length; columnsArrIndex++) {
3815                dummyArr = [];
3816                columnsObj = filtersOptions[columnsArrIndex];
3817                if (columnsObj.filter_default_label === undefined) {
3818                    if (columnsObj.filter_type === "select" || columnsObj.filter_type === 'custom_func') {
3819                        columnsObj.filter_default_label = "Select value";
3820                    } else if (columnsObj.filter_type === "multi_select" || columnsObj.filter_type === 'multi_select_custom_func') {
3821                        columnsObj.filter_default_label = "Select values";
3822                    } else if (columnsObj.filter_type === "auto_complete" || columnsObj.filter_type === "text") {
3823                        columnsObj.filter_default_label = 'Type to filter';
3824                    } else if (columnsObj.filter_type === "range_number" || columnsObj.filter_type === "range_date") {
3825                        columnsObj.filter_default_label = ["from", "to"];
3826                    } else if (columnsObj.filter_type === "date") {
3827                        columnsObj.filter_default_label = "Select a date";
3828                    }
3829                }
3830                columnsObj = $.extend({}, default_options, columnsObj);
3831
3832                column_number_str = columnsArrayToString(columnsObj.column_number).column_number_str;
3833                columnsObj.column_number_str = column_number_str;
3834
3835                dummyArr.push(columnsObj);
3836                tablesSelectors = '';
3837                for (i = 0; i < tablesArray.length; i++) {
3838                    if (tablesArray[i].table !== undefined) {
3839                        tablesSelectors += tablesArray[i].table().node().id + ',';
3840                    } else {
3841                        tablesSelectors += getSettingsObjFromTable(tablesArray[i]).sTableId;
3842                    }
3843                }
3844                tablesSelectors = tablesSelectors.substring(0, tablesSelectors.length - 1);
3845
3846                setOptions(tablesSelectors + '_' + column_number_str, dummyArr);
3847                oTables[tablesSelectors] = tablesArray;
3848                appendFiltersMultipleTables(tablesArray, tablesSelectors, columnsObj);
3849            }
3850        }
3851
3852        function initMultipleColumns(table, filtersOptions) {
3853            var tablesArray = [];
3854            tablesArray.push(table);
3855            initMultipleTables(tablesArray, filtersOptions);
3856        }
3857
3858        function stopPropagation(evt) {
3859            if (evt.stopPropagation !== undefined) {
3860                evt.stopPropagation();
3861            } else {
3862                evt.cancelBubble = true;
3863            }
3864        }
3865
3866        function preventDefaultForEnter(evt) {
3867            if (evt.keyCode === 13) {
3868                if (evt.preventDefault) {
3869                    evt.preventDefault();
3870                } else {
3871                    evt.returnValue = false;
3872                }
3873            }
3874        }
3875
3876        //--------------------------------------------------------
3877        function exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr) {
3878            return function () {
3879                exFilterColumn(table_arg, col_filter_arr, true);
3880            };
3881        }
3882
3883        function exFilterColumn(table_arg, col_filter_arr, ajaxSource) {
3884            var table_selector_jq_friendly,
3885                j,
3886                tmpStr,
3887                column_number,
3888                column_position,
3889                filter_value,
3890                fromId,
3891                toId,
3892                sliderId,
3893                optionsObj,
3894                min,
3895                max,
3896                exclude = false;
3897            //check if the table arg is from new datatables API (capital "D")
3898            if (table_arg.settings !== undefined) {
3899                table_arg = table_arg.settings()[0].oInstance;
3900            }
3901            table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
3902            if (isDOMSource(table_arg) || ajaxSource === true) {
3903                for (j = 0; j < col_filter_arr.length; j++) {
3904                    column_number = col_filter_arr[j][0];
3905                    column_position = column_number;
3906                    exclude = false;
3907                    if (plugins[table_selector_jq_friendly] !== undefined && (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
3908                        column_position = plugins[table_selector_jq_friendly].ColReorder[column_number];
3909                    }
3910                    optionsObj = getOptions(table_arg.selector)[column_number];
3911                    filter_value = col_filter_arr[j][1];
3912
3913                    switch (optionsObj.filter_type) {
3914                        case 'auto_complete':
3915                        case 'text':
3916                        case 'date':
3917                            if (filter_value !== undefined && filter_value.indexOf('_exclude_') !== -1) {
3918                                exclude = true;
3919                                filter_value = filter_value.replace('_exclude_', '');
3920                            }
3921                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
3922                            if (filter_value !== '') {
3923                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
3924                            } else {
3925                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
3926                            }
3927                            tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, false, exclude);
3928                            table_arg.fnSettings().aoPreSearchCols[
3928column_position].sSearch = tmpStr;
3929                            break;
3930                        case 'select':
3931                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
3932                            if (filter_value !== '') {
3933                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
3934                            } else {
3935                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
3936                            }
3937                            tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, false);
3938                            table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = tmpStr;
3939                            if (optionsObj.select_type !== undefined) {
3940                                refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number), '-1');
3941                            }
3942                            break;
3943                        case 'multi_select':
3944                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
3945                            tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, true);
3946                            table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = tmpStr;
3947                            if (optionsObj.select_type !== undefined) {
3948                                refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number), '-1');
3949                            }
3950                            break;
3951                        case 'range_date':
3952                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
3953                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
3954                            $('#' + fromId).val(filter_value.from);
3955                            if (filter_value.from !== '') {
3956                                $('#' + fromId).addClass('inuse');
3957                            } else {
3958                                $('#' + fromId).removeClass('inuse');
3959                            }
3960                            $('#' + toId).val(filter_value.to);
3961                            if (filter_value.to !== '') {
3962                                $('#' + toId).addClass('inuse');
3963                            } else {
3964                                $('#' + toId).removeClass('inuse');
3965                            }
3966                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
3967                                min = filter_value.from;
3968                                max = filter_value.to;
3969                                table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = min + '-yadcf_delim-' + max;
3970                            }
3971                            saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
3972                            break;
3973                        case 'range_number':
3974                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
3975                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
3976                            $('#' + fromId).val(filter_value.from);
3977                            if (filter_value.from !== '') {
3978                                $('#' + fromId).addClass('inuse');
3979                            } else {
3980                                $('#' + fromId).removeClass('inuse');
3981                            }
3982                            $('#' + toId).val(filter_value.to);
3983                            if (filter_value.to !== '') {
3984                                $('#' + toId).addClass('inuse');
3985                            } else {
3986                                $('#' + toId).removeClass('inuse');
3987                            }
3988                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
3989                                table_arg.fnSettings().aoPreSearchCols[
3989column_position].sSearch = filter_value.from + '-yadcf_delim-' + filter_value.to;
3990                            }
3991                            saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
3992                            break;
3993                        case 'range_number_slider':
3994                            sliderId = 'yadcf-filter-' + table_selector_jq_friendly + '-slider-' + column_number;
3995                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
3996                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number;
3997                            if (filter_value.from !== '') {
3998                                min = $('#' + fromId).closest('.yadcf-filter-range-number-slider').find(".yadcf-filter-range-number-slider-min-tip-hidden").text();
3999                                max = $('#' + fromId).closest('.yadcf-filter-range-number-slider').find(".yadcf-filter-range-number-slider-max-tip-hidden").text();
4000                                $('#' + fromId).text(filter_value.from);
4001                                if (min !== filter_value.from) {
4002                                    $('#' + fromId).parent().addClass('inuse');
4003                                    $('#' + fromId).parent().parent().find('ui-slider-range').addClass('inuse');
4004                                } else {
4005                                    $('#' + fromId).parent().removeClass('inuse');
4006                                    $('#' + fromId).parent().parent().find('ui-slider-range').removeClass('inuse');
4007                                }
4008                                $('#' + sliderId).slider('values', 0, filter_value.from);
4009                            }
4010                            if (filter_value.to !== '') {
4011                                $('#' + toId).text(filter_value.to);
4012                                if (max !== filter_value.to) {
4013                                    $('#' + toId).parent().addClass('inuse');
4014                                    $('#' + toId).parent().parent().find('.ui-slider-range').addClass('inuse');
4015                                } else {
4016                                    $('#' + toId).parent().removeClass('inuse');
4017                                    $('#' + toId).parent().parent().find('.ui-slider-range').removeClass('inuse');
4018                                }
4019                                $('#' + sliderId).slider('values', 1, filter_value.to);
4020                            }
4021                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4022                                table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = filter_value.from + '-yadcf_delim-' + filter_value.to;
4023                            }
4024                            saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
4025                            break;
4026                        case 'custom_func':
4027                        case 'multi_select_custom_func':
4028                            $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
4029                            if (filter_value !== '') {
4030                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
4031                            } else {
4032                                $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
4033                            }
4034                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4035                                table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = filter_value;
4036                            }
4037                            if (optionsObj.select_type !== undefined) {
4038                                refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number), filter_value);
4039                            }
4040                            saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value, '');
4041                            break;
4042                    }
4043                }
4044                if (table_arg.fnSettings().oFeatures.bServerSide !== true) {
4045                    table_arg.fnDraw();
4046                } else {
4047                    setTimeout(function () {
4048                        table_arg.fnDraw();
4049                    }, 10);
4050                }
4051            } else {
4052                exFilterColumnQueue.push(exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr));
4053            }
4054        }
4055
4056        function exGetColumnFilterVal(table_arg, column_number) {
4057            var retVal,
4058                fromId,
4059                toId,
4060                table_selector_jq_friendly,
4061                optionsObj,
4062                $filterElement;
4063
4064            //check if the table arg is from new datatables API (capital "D")
4065            if (table_arg.settings !== undefined) {
4066                table_arg = table_arg.settings()[0].oInstance;
4067            }
4068
4069            optionsObj = getOptions(table_arg.selector)[column_number];
4070            table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
4071
4072            $filterElement = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number);
4073            switch (optionsObj.filter_type) {
4074                case 'select':
4075                case 'custom_func':
4076                    retVal = $filterElement.val();
4077                    if (retVal === '-1') {
4078                        retVal = '';
4079                    }
4080                    break;
4081                case 'auto_complete':
4082                case 'text':
4083                case 'date':
4084                    retVal = $filterElement.val();
4085                    if ($filterElement.prev().hasClass('yadcf-exclude-wrapper') && $filterElement.prev().find('input').prop('checked') === true) {
4086                        retVal = '_exclude_' + retVal;
4087                    }
4088                    break;
4089                case 'multi_select':
4090                    retVal = $filterElement.val();
4091                    if (retVal === null) {
4092                        retVal = '';
4093                    }
4094                    break;
4095                case 'range_date':
4096                    retVal = {};
4097                    fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
4098                    toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
4099
4100                    retVal.from = $('#' + fromId).val();
4101                    retVal.to = $('#' + toId).val();
4102                    break;
4103                case 'range_number':
4104                    retVal = {};
4105                    fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
4106                    toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
4107
4108                    retVal.from = $('#' + fromId).val();
4109                    retVal.to = $('#' + toId).val();
4110                    break;
4111                case 'range_number_slider':
4112                    retVal = {};
4113                    fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
4114                    toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' 
4114+ column_number;
4115
4116                    retVal.from = $('#' + fromId).text();
4117                    retVal.to = $('#' + toId).text();
4118
4119                    break;
4120                default:
4121                    console.log('exGetColumnFilterVal error: no such filter_type: ' + optionsObj.filter_type);
4122            }
4123            return retVal;
4124        }
4125
4126        function clearStateSave(oTable, column_number, table_selector_jq_friendly) {
4127            var yadcfState;
4128            if (oTable.fnSettings().oFeatures.bStateSave === true) {
4129                if (!oTable.fnSettings().oLoadedState) {
4130                    oTable.fnSettings().oLoadedState = {};
4131                    oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4132                }
4133                if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
4134                    oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = undefined;
4135                } else {
4136                    yadcfState = {};
4137                    yadcfState[table_selector_jq_friendly] = [];
4138                    yadcfState[table_selector_jq_friendly][column_number] = undefined;
4139                    oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
4140                }
4141                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4142            }
4143        }
4144
4145        function saveStateSave(oTable, column_number, table_selector_jq_friendly, from, to) {
4146            var yadcfState;
4147            if (oTable.fnSettings().oFeatures.bStateSave === true) {
4148                if (!oTable.fnSettings().oLoadedState) {
4149                    oTable.fnSettings().oLoadedState = {};
4150                }
4151                if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
4152                    oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = {
4153                        'from' : from,
4154                        'to' : to
4155                    };
4156                } else {
4157                    yadcfState = {};
4158                    yadcfState[table_selector_jq_friendly] = [];
4159                    yadcfState[table_selector_jq_friendly][column_number] = {
4160                        'from' : from,
4161                        'to' : to
4162                    };
4163                    oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
4164                }
4165                oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4166            }
4167        }
4168
4169        function exResetAllFilters(table_arg, noRedraw, columns) {
4170            var table_selector_jq_friendly,
4171                column_number,
4172                fromId,
4173                toId,
4174                sliderId,
4175                tableOptions,
4176                optionsObj,
4177                columnObjKey,
4178                settingsDt = getSettingsObjFromTable(table_arg),
4179                i,
4180                $filterElement;
4181
4182            //check if the table arg is from new datatables API (capital "D")
4183            if (table_arg.settings !== undefined) {
4184                table_arg = table_arg.settings()[0].oInstance;
4185            }
4186            tableOptions = getOptions(table_arg.selector);
4187            table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
4188            settingsDt = getSettingsObjFromTable(table_arg);
4189
4190            for (columnObjKey in tableOptions) {
4191                if (tableOptions.hasOwnProperty(columnObjKey)) {
4192                    optionsObj = tableOptions[columnObjKey];
4193                    column_number = optionsObj.column_number;
4194
4195                    if (columns !== undefined && $.inArray(column_number, columns) === -1) {
4196                        continue;
4197                    }
4198                    $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
4199
4200                    $filterElement = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number);
4201
4202                    switch (optionsObj.filter_type) {
4203                        case 'select':
4204                        case 'custom_func':
4205                            $filterElement.val('-1').removeClass('inuse');
4206                            table_arg.fnSettings().aoPreSearchCols[
4206column_number].sSearch = '';
4207                            if (optionsObj.select_type !== undefined) {
4208                                refreshSelectPlugin(optionsObj, $filterElement, '-1');
4209                            }
4210                            break;
4211                        case 'auto_complete':
4212                        case 'text':
4213                        case 'date':
4214                            $filterElement.val('').removeClass('inuse');
4215                            table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4216                            if ($filterElement.prev().hasClass('yadcf-exclude-wrapper')) {
4217                                $filterElement.prev().find('input').prop('checked', false);
4218                            }
4219                            break;
4220                        case 'multi_select':
4221                        case 'multi_select_custom_func':
4222                            $filterElement.val('-1');
4223                            $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", undefined);
4224                            table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4225                            if (optionsObj.select_type !== undefined) {
4226                                refreshSelectPlugin(optionsObj, $filterElement, '-1');
4227                            }
4228                            break;
4229                        case 'range_date':
4230                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
4231                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
4232                            $('#' + fromId).val('');
4233                            $('#' + fromId).removeClass('inuse');
4234                            $('#' + toId).val('');
4235                            $('#' + toId).removeClass('inuse');
4236                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4237                                table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4238                            }
4239                            clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4240                            break;
4241                        case 'range_number':
4242                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
4243                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
4244                            $('#' + fromId).val('');
4245                            $('#' + fromId).removeClass('inuse');
4246                            $('#' + toId).val('');
4247                            $('#' + toId).removeClass('inuse');
4248                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4249                                table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4250                            }
4251                            clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4252                            break;
4253                        case 'range_number_slider':
4254                            sliderId = 'yadcf-filter-' + table_selector_jq_friendly + '-slider-' + column_number;
4255                            fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
4256                            toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number;
4257                            $('#' + fromId).text('');
4258                            $('#' + fromId).parent().removeClass('inuse');
4259                            $('#' + fromId).parent().parent().find('ui-slider-range').removeClass('inuse');
4260                            $('#' + toId).text('');
4261                            $('#' + toId).parent().removeClass('inuse');
4262                            $('#' + toId).parent().parent().find('.ui-slider-range').removeClass('inuse');
4263                            $('#' + sliderId).slider("option", "values", [$('#' + fromId).parent().parent().find('.yadcf-filter-range-number-slider-min-tip-hidden').text(), $('#' + fromId).parent().parent().find('.yadcf-filter-range-number-slider-max-tip-hidden').text()]);
4264                            if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4265                                table_arg.fnSettings().aoPreSearchCols[
4265column_number].sSearch = '';
4266                            }
4267                            clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4268                            break;
4269                    }
4270
4271                }
4272            }
4273            if (noRedraw !== true) {
4274                //clear global filter
4275                settingsDt.oPreviousSearch.sSearch = '';
4276                if (settingsDt.aanFeatures.f !== undefined) {
4277                    for (i = 0; i < settingsDt.aanFeatures.f.length; i++) {
4278                        $('input', settingsDt.aanFeatures.f[i]).val('');
4279                    }
4280                }
4281                //end of clear global filter
4282                table_arg.fnDraw(settingsDt);
4283            }
4284        }
4285
4286        function exResetFilters(table_arg, columns, noRedraw) {
4287            exResetAllFilters(table_arg, noRedraw, columns);
4288        }
4289
4290        function exFilterExternallyTriggered(table_arg) {
4291            var columnsObj,
4292                columnObjKey,
4293                columnObj,
4294                filterValue,
4295                filtersValuesSingleElem,
4296                filtersValuesArr = [];
4297
4298            //check if the table arg is from new datatables API (capital "D")
4299            if (table_arg.settings !== undefined) {
4300                table_arg = table_arg.settings()[0].oInstance;
4301            }
4302            columnsObj = getOptions(table_arg.selector);
4303
4304            for (columnObjKey in columnsObj) {
4305                if (columnsObj.hasOwnProperty(columnObjKey)) {
4306                    columnObj = columnsObj[columnObjKey];
4307                    filterValue = exGetColumnFilterVal(table_arg, columnObj.column_number);
4308                    filtersValuesSingleElem = [];
4309                    filtersValuesSingleElem.push(columnObj.column_number);
4310                    filtersValuesSingleElem.push(filterValue);
4311                    filtersValuesArr.push(filtersValuesSingleElem);
4312                }
4313            }
4314            exFilterColumn(table_arg, filtersValuesArr, true);
4315        }
4316
4317        return {
4318            init : init,
4319            doFilter : doFilter,
4320            doFilterMultiSelect : doFilterMultiSelect,
4321            doFilterAutocomplete : doFilterAutocomplete,
4322            autocompleteKeyUP : autocompleteKeyUP,
4323            getOptions : getOptions,
4324            rangeNumberKeyUP : rangeNumberKeyUP,
4325            rangeDateKeyUP : rangeDateKeyUP,
4326            rangeClear: rangeClear,
4327            rangeNumberSliderClear : rangeNumberSliderClear,
4328            stopPropagation : stopPropagation,
4329            exFilterColumn: exFilterColumn,
4330            exGetColumnFilterVal : exGetColumnFilterVal,
4331            exResetAllFilters: exResetAllFilters,
4332            dateKeyUP : dateKeyUP,
4333            dateSelectSingle : dateSelectSingle,
4334            textKeyUP : textKeyUP,
4335            doFilterCustomDateFunc : doFilterCustomDateFunc,
4336            eventTargetFixUp : eventTargetFixUp,
4337            initMultipleTables: initMultipleTables,
4338            initMultipleColumns: initMultipleColumns,
4339            textKeyUpMultiTables: textKeyUpMultiTables,
4340            doFilterMultiTables: doFilterMultiTables,
4341            doFilterMultiTablesMultiSelect: doFilterMultiTablesMultiSelect,
4342            generateTableSelectorJQFriendlyNew: generateTableSelectorJQFriendlyNew,
4343            exFilterExternallyTriggered: exFilterExternallyTriggered,
4344            exResetFilters: exResetFilters,
4345            initSelectPluginCustomTriggers: initSelectPluginCustomTriggers,
4346            preventDefaultForEnter: preventDefaultForEnter,
4347            generateTableSelectorJQFriendly2: generateTableSelectorJQFriendly2
4348        };
4349
4350    }());
4351    if (window) {
4352        window.yadcf = yadcf;
4353    }
4354    return yadcf;
4355}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.