PageSourceSearch

https://gproteindb.org/static/home/js/jquery.dataTables.yadcf.js

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

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.