2 * Yet Another DataTables Column Filter - (yadcf)
4 * File: jquery.dataTables.yadcf.js
7 * Author: Daniel Reznick
8 * Info: https://github.com/vedmack/yadcf
9 * Contact: vedmack@gmail.com
10 * Twitter: @danielreznick
11 * Q&A http://stackoverflow.com/questions/tagged/yadcf
13 * Copyright 2015 Daniel Reznick, all rights reserved.
14 * Copyright 2015 Released under the MIT License
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.
29 Description: The number of the column to which the filter will be applied
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 / date_custom_func
36 Description: The type of the filter to be used in the column
39 Required: true (when filter_type is custom_func / multi_select_custom_func / date_custom_func)
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
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
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
62 * append_data_to_table_data
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)
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
82 Description: Delimiter that seperates text in table column, for example text_data_delimiter: ","
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 <span class="someClass">Some text</span>
90 Special notes: when using selector you must provide a valid selector string for the html_data_selector property
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)
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
108 * filter_container_id
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
113 * filter_container_selector
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
118 * filter_default_label
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
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
131 * filter_reset_button_text
133 Type: String / boolean
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)
137 * enable_auto_complete (this attribute is deprecated , and will become obsolete in the future , so you better start using filter_type: "auto_complete")
141 Description: Turns the filter into an autocomplete input - make use of the jQuery UI Autocomplete widget (with some enhancements)
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
152 * sort_as_custom_func
155 Default value: undefined
156 Description: Allows to provide a custom sorting function for the filter elements
162 Possible values: asc / desc
163 Description: Defines the order in which the values in the filter will be sorted, ascending or descending
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
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')
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 '_|\\.|\\$'
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)
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
204 Default value: 'exclude'
205 Description: The label that will appear above the exclude checkbox
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
216 * select_type_options
220 Description: This parameter will be passed "as is" to the Chosen/Select2 plugin constructor
222 * filter_plugin_options
225 Default value: undefined
226 Description: This parameter will be passed to the jQuery Autocomplete / jQuery Slider / Bootstrap Datetimepicker
232 Description: Do case-insensitive filtering (supported in select / auto_complete / text filters)
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
245 Default value: 'jquery-ui'
246 Possible values: 'jquery-ui' / 'bootstrap-datetimepicker' / bootstrap-datepicker
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.
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 / range_number / range_number_slider / range_date
257 * reset_button_style_class
260 Description: Allows adding additional class/classes to filter reset button
263 * Global Parameters (per table rather than per column)
265 * Usage example yadcf.init(oTable,[{column_number : 0}, {column_number: 3}],{cumulative_filtering: true});
268 * externally_triggered
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)
276 * cumulative_filtering
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
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
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
304 Default value: undefined
305 Description: Calls the provided callback function in the end of the yadcf init function
306 Note: This callback function will run before datatables fires its event such as draw/xhr/etc., migth be usefull for call some
307 third parties init / loading code
312 * External API functions:
318 Description: Allows to trigger filter/s externally/programmatically (support ALL filter types!!!) , perfect for showing table with pre filtered columns
319 Arguments: table_arg: (variable of the datatable),
320 array of pairs: column number String/Object with from and to, filter_value (the actual string value that we want to filter by)
321 Usage example: yadcf.exFilterColumn(oTable, [[0, 'Some Data 2']]); //pre filter one column
322 yadcf.exFilterColumn(oTable, [[0, 'Some Data 1'], [1, {from: 111, to: 1110}], [2, {from: "", to: "11/25/2014"}]]); //pre filter several columns
323 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)
325 * exGetColumnFilterVal
326 Description: Allows to retrieve column current filtered value (support ALL filter types!!!)
327 Arguments: table_arg: (variable of the datatable),
328 column number: column number from which we want the value
329 Usage example: yadcf.exGetColumnFilterVal(oTable,1);
330 Return value: String (for simple filter) / Object (for range filter) with from and to properties / Array of strings for multi_select filter
334 Description: Allows to reset all filters externally/programmatically (support ALL filter types!!!) , perfect for adding a "reset all" button to your page!
335 Arguments: table_arg: (variable of the datatable)
336 noRedraw: (boolean) , use it if you don't want your table to be reloaded after the filter reset,
337 for example if you planning to call exFilterColumn function right after the exResetAllFilters (to avoid two AJAX requests)
338 Usage example: yadcf.exResetAllFilters(oTable);
341 Description: Allows to reset specific filters externally/programmatically (support ALL filter types!!!) , can be used for resetting one or more filters
342 Arguments: table_arg: (variable of the datatable)
343 array with columns numbers
344 noRedraw: (boolean) , use it if you don't want your table to be reloaded after the filter reset,
345 for example if you planning to call exFilterColumn function right after the exResetFilters (to avoid two AJAX requests)
346 Usage example: yadcf.exResetAllFilters(oTable, [1,2]);
348 * initSelectPluginCustomTriggers
349 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.
350 Great for integrating any jquey select plugin (Selectize / MultiSelect / etc)
351 Arguments: initFunc : function which will initialize the plugin
352 refreshFunc : function that will refresh the plugin.
353 destroyFunc : function that will destroy the plugin (upon table destroy even trigger).
354 Usage example: yadcf.initSelectPluginCustomTriggers(function ($filterSelector){$filterSelector.multiselect({});}, function ($filterSelector){$filterSelector.multiselect("refresh")}, , function ($filterSelector){$filterSelector.multiselect("destroy")});
356 * exFilterExternallyTriggered
357 Description: Triggers all the available filters, should be used only when the externally_triggered option used
358 Arguments: table_arg: (variable of the datatable)
359 Usage example: yadcf.exResetAllFilters(table_arg);
363 * Server-side processing API (see more on showcase):
365 * From server to client:
366 * 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:
367 * 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...
369 * From client to server:
370 * 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
371 * 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-");
379 * Working with filters for multiple tables:
385 Description: Allows to create filter that will affect multiple tables / multiple column(s) in multiple tables
386 Arguments: Array of tables,
387 Array of objects with properties for each filter
388 Usage example: yadcf.initMultipleTables([oTable, oTable2], [{
389 column_number: [0, 1], filter_container_id: 'multi-table-filter-0', filter_default_label: 'Filter all tables columns 1 and 2!'
392 column_number: [2], filter_container_id: 'multi-table-filter-1', filter_default_label: 'Filter all tables column 3!'
394 Valid properties: filter_type: 'text' (default) / 'select' / 'multi_select',
395 column_number: not required (in that case the filter will be global)
396 can be either number(single column filter) or array of numbers(multiple columns filter)
397 filter_container_id: '' (required),
398 Note: All the usual properties of yadcf should be supported in initMultipleTables too!
400 * initMultipleColumns
401 Description: Allows to create filter that will affect multiple column(s) in in a particular table
402 Arguments: Table variable,
403 Array of objects with properties for each filter
404 Usage example: yadcf.initMultipleColumns(oTable, [{
405 column_number: [0, 1], filter_container_id: 'multi-table-filter-0', filter_default_label: 'Filter columns 1 and 2!'
408 column_number: [2, 3], filter_container_id: 'multi-table-filter-1', filter_default_label: 'Filter column 3 and 4!'
410 Valid properties: filter_type: 'text' (default) / 'select' / 'multi_select',
411 column_number: not required (in that case the filter will be global)
412 can be either number(single column filter) or array of numbers(multiple columns filter)
413 filter_container_id: '' (required),
414 Note: All the usual properties of yadcf should be supported in initMultipleColumns too!
417 if (window.NodeList && !NodeList.prototype.forEach) {
418 NodeList.prototype.forEach = function (callback, thisArg) {
419 thisArg = thisArg || window;
420 for (var i = 0; i < this.length; i++) {
421 callback.call(thisArg, this[i], i, this);
425 if (!Object.entries) {
426 Object.entries = function(obj) {
427 var ownProps = Object.keys(obj),
429 resArray = new Array(i); // preallocate the Array
431 resArray[i] = [ownProps[i], obj[ownProps[i]]];
436 (function (factory) {
439 if (typeof define === 'function' && define.amd) {
441 define(['jquery'], function ($) {
442 return factory($, window, document);
444 } else if (typeof module === 'object') {
446 module.exports = function (root, $) {
448 // CommonJS environments without a window global must pass a
449 // root. This will give an error otherwise
454 $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
456 require('jquery')(root);
459 return factory($, root, root.document);
463 factory(jQuery, window, document);
466 (function ($, window, document, undefined) {
467 var yadcf = (function () {
475 exFilterColumnQueue = [],
477 selectElementCustomInitFunc,
478 selectElementCustomRefreshFunc,
479 selectElementCustomDestroyFunc,
481 select: 'Select value',
482 select_multi: 'Select values',
483 filter: 'Type to filter',
484 range: ['From', 'To'],
485 date: 'Select a date'
489 let closeBootstrapDatepicker = false;
490 let closeBootstrapDatepickerRange = false;
491 let closeSelect2 = false;
493 //From ColReorder (SpryMedia Ltd (www.sprymedia.co.uk))
494 function getSettingsObjFromTable(dt) {
496 if ($.fn.dataTable.Api) {
497 oDTSettings = new $.fn.dataTable.Api(dt).settings()[0];
498 } else if (dt.fnSettings) { // 1.9 compatibility
499 // DataTables object, convert to the settings object
500 oDTSettings = dt.fnSettings();
501 } else if (typeof dt === 'string') { // jQuery selector
502 if ($.fn.dataTable.fnIsDataTable($(dt)[0])) {
503 oDTSettings = $(dt).eq(0).dataTable().fnSettings();
505 } else if (dt.nodeName && dt.nodeName.toLowerCase() === 'table') {
507 if ($.fn.dataTable.fnIsDataTable(dt.nodeName)) {
508 oDTSettings = $(dt.nodeName).dataTable().fnSettings();
510 } else if (dt instanceof jQuery) {
512 if ($.fn.dataTable.fnIsDataTable(dt[0])) {
513 oDTSettings = dt.eq(0).dataTable().fnSettings();
516 // DataTables settings object
522 function arraySwapValueWithIndex(pArray) {
525 for (i = 0; i < pArray.length; i++) {
531 function arraySwapValueWithIndex2(pArray) {
534 for (i = 0; i < pArray.length; i++) {
535 tmp[pArray[i]._ColReorder_iOrigCol] = i;
540 function initColReorder2(settingsDt, table_selector_jq_friendly) {
541 if (settingsDt.oSavedState && settingsDt.oSavedState.ColReorder !== undefined) {
542 if (plugins[table_selector_jq_friendly] === undefined) {
543 plugins[table_selector_jq_friendly] = {};
544 plugins[table_selector_jq_friendly].ColReorder = arraySwapValueWithIndex(settingsDt.oSavedState.ColReorder);
546 } else if (settingsDt.aoColumns[0]._ColReorder_iOrigCol !== undefined) {
547 if (plugins[table_selector_jq_friendly] === undefined) {
548 plugins[table_selector_jq_friendly] = {};
549 plugins[table_selector_jq_friendly].ColReorder = arraySwapValueWithIndex2(settingsDt.aoColumns);
554 function initColReorderFromEvent(table_selector_jq_friendly) {
555 plugins[table_selector_jq_friendly] = undefined;
558 function columnsArrayToString(column_number) {
559 var column_number_obj = {};
560 if (column_number !== undefined) {
561 if (column_number instanceof Array) {
562 column_number_obj.column_number_str = column_number.join('_');
564 column_number_obj.column_number_str = column_number;
566 column_number.push(column_number_obj.column_number_str);
569 column_number_obj.column_number_str = 'global';
571 column_number_obj.column_number = column_number;
572 return column_number_obj;
575 function getOptions(selector) {
576 return options[selector];
579 function getAllOptions() {
583 function eventTargetFixUp(pEvent) {
584 if (pEvent.target === undefined) {
585 pEvent.target = pEvent.srcElement;
590 function dot2obj(tmpObj, dot_refs) {
592 dot_refs = dot_refs.split(".");
593 for (i = 0; i < dot_refs.length; i++) {
594 tmpObj = tmpObj[dot_refs[i]];
599 function setOptions(selector_arg, options_arg, params) {
604 filter_type: "select",
605 enable_auto_complete: false,
608 date_format: "mm/dd/yyyy",
609 ignore_char: undefined,
610 filter_match_mode: "contains",
611 select_type: undefined,
612 select_type_options: {},
613 case_insensitive: true,
614 column_data_type: 'text',
615 html_data_type: 'text',
616 exclude_label: 'exclude',
618 reset_button_style_class: '',
619 datepicker_type: 'jquery-ui',
620 range_data_type: 'single',
621 range_data_type_delim: '-',
622 omit_default_label: false
624 //adaptContainerCssClassImpl = function (dummy) { return ''; };
626 $.extend(true, default_options, params);
628 if (options_arg.length === undefined) {
629 options[selector_arg] = options_arg;
632 for (i = 0; i < options_arg.length; i++) {
633 if (options_arg[i].date_format !== undefined && options_arg[i].moment_date_format === undefined) {
634 options_arg[i].moment_date_format = options_arg[i].date_format;
636 if (options_arg[i].select_type === 'select2') {
637 default_options.select_type_options = {
638 //adaptContainerCssClass: adaptContainerCssClassImpl
641 //no individual reset button for externally_triggered mode
642 if (default_options.externally_triggered === true) {
643 options_arg[i].filter_reset_button_text = false;
645 //validate custom function required attributes
646 if (options_arg[i].filter_type !== undefined && options_arg[i].filter_type.indexOf('custom_func') !== -1) {
647 if (options_arg[i].custom_func === undefined) {
648 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...\")');
652 col_num_as_int = +options_arg[i].column_number;
653 if (isNaN(col_num_as_int)) {
654 tmpOptions[options_arg[i].column_number_str] = $.extend(true, {}, default_options, options_arg[i]);
656 tmpOptions[col_num_as_int] = $.extend(true, {}, default_options, options_arg[i]);
659 options[selector_arg] = tmpOptions;
661 check3rdPPluginsNeededClose();
664 function check3rdPPluginsNeededClose() {
665 Object.entries(getAllOptions()).forEach(function(tableEntry) {
666 Object.entries(tableEntry[1]).forEach(function(columnEntry) {
667 if (columnEntry[1].datepicker_type === 'bootstrap-datepicker') {
668 if (columnEntry[1].filter_type === 'range_date') {
669 closeBootstrapDatepickerRange = true;
671 closeBootstrapDatepicker = true;
673 } else if (columnEntry[1].select_type === 'select2') {
680 //taken and modified from DataTables 1.10.0-beta.2 source
681 function yadcfVersionCheck(version) {
682 var aThis = $.fn.dataTable.ext.sVersion.split('.'),
683 aThat = version.split('.'),
689 for (i = 0, iLen = aThat.length; i < iLen; i++) {
690 iThis = parseInt(aThis[i], 10) || 0;
691 iThat = parseInt(aThat[i], 10) || 0;
693 // Parts are the same, keep comparing
694 if (iThis === iThat) {
698 // Parts are different, return immediately
699 return iThis > iThat;
705 function resetIApiIndex() {
706 $.fn.dataTableExt.iApiIndex = 0;
710 function escapeRegExp(string) {
711 return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
714 function escapeRegExpInArray(arr) {
716 for (i = 0; i < arr.length; i++) {
717 arr[i] = arr[i].replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
722 function replaceAll(string, find, replace) {
723 return string.replace(new RegExp(escapeRegExp(find), 'g'), replace);
726 function getTableId(obj) {
728 if (obj.table !== undefined) {
729 tableId = obj.table().node().id;
731 tableId = getSettingsObjFromTable(obj).sTableId;
736 function generateTableSelectorJQFriendly2(obj) {
738 if (obj.oInstance !== undefined && obj.oInstance.selector !== undefined) {
739 tmpStr = obj.oInstance.selector;
740 } else if (obj.selector !== undefined) {
741 tmpStr = obj.selector;
742 } else if (obj.table !== undefined) {
743 tmpStr = obj.table().node().id;
747 tmpStr = replaceAll(tmpStr, ".", "-");
748 tmpStr = replaceAll(tmpStr, ' ', '');
749 return tmpStr.replace(":", "-").replace("(", "").replace(")", "").replace("#", "-");
752 function generateTableSelectorJQFriendlyNew(tmpStr) {
753 tmpStr = replaceAll(tmpStr, ":", "-");
754 tmpStr = replaceAll(tmpStr, "(", "");
755 tmpStr = replaceAll(tmpStr, ")", "");
756 tmpStr = replaceAll(tmpStr, ",", "");
757 tmpStr = replaceAll(tmpStr, ".", "-");
758 tmpStr = replaceAll(tmpStr, "#", "-");
759 tmpStr = replaceAll(tmpStr, ' ', '');
763 yadcfDelay = (function () {
765 return function (callback, ms, param) {
767 timer = setTimeout(function () {
774 function initializeSelectPlugin(selectType, $selectObject, select_type_options) {
775 if (selectType === 'chosen') {
776 $selectObject.chosen(select_type_options);
777 $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
778 refreshSelectPlugin({
779 select_type: selectType,
780 select_type_options: select_type_options
782 } else if (selectType === 'select2') {
783 if (!$selectObject.data('select2')) {
784 $selectObject.select2(select_type_options);
786 if ($selectObject.next().hasClass('select2-container')) {
787 $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
789 } else if (selectType === 'custom_select') {
790 selectElementCustomInitFunc($selectObject);
791 $selectObject.next().attr("onclick", "yadcf.stopPropagation(event);").attr("onmousedown", "yadcf.stopPropagation(event);");
795 function refreshSelectPlugin(columnObj, $selectObject, val) {
796 var selectType = columnObj.select_type,
797 select_type_options = columnObj.select_type_options;
798 if (selectType === 'chosen') {
799 $selectObject.trigger("chosen:updated");
800 } else if (selectType === 'select2') {
801 if (!$selectObject.data('select2')) {
802 $selectObject.select2(select_type_options);
804 if (val !== undefined) {
805 $selectObject.val(val);
807 $selectObject.trigger('change');
808 } else if (selectType === 'custom_select') {
809 selectElementCustomRefreshFunc($selectObject);
813 function initSelectPluginCustomTriggers(initFunc, refreshFunc, destroyFunc) {
814 selectElementCustomInitFunc = initFunc;
815 selectElementCustomRefreshFunc = refreshFunc;
816 selectElementCustomDestroyFunc = destroyFunc;
819 //Used by exFilterColumn for translating readable search value into proper search string for datatables filtering
820 function yadcfMatchFilterString(table_arg, column_number, selected_value, filter_match_mode, multiple, exclude) {
821 var case_insensitive = yadcf.getOptions(table_arg.selector)[column_number].case_insensitive,
824 if (!selected_value) {
828 table_arg.fnSettings().aoPreSearchCols[column_number].bSmart = false;
829 table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true;
830 table_arg.fnSettings().aoPreSearchCols[column_number].bCaseInsensitive = case_insensitive;
832 if (multiple === undefined || multiple === false) {
833 if (exclude !== true) {
834 if (filter_match_mode === "contains") {
835 table_arg.fnSettings().aoPreSearchCols[column_number].bSmart = true;
836 table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = false;
837 ret_val = selected_value;
838 } else if (filter_match_mode === "exact") {
839 ret_val = "^" + selected_value + "$";
840 } else if (filter_match_mode === "startsWith") {
841 ret_val = "^" + selected_value;
842 } else if (filter_match_mode === "regex") {
843 ret_val = selected_value;
846 ret_val = "^((?!" + selected_value + ").)*$";
849 if (filter_match_mode !== 'regex') {
850 if (!(selected_value instanceof Array)) {
851 selected_value = [selected_value];
853 selected_value = escapeRegExpInArray(selected_value);
855 if (filter_match_mode === "contains") {
856 ret_val = selected_value.join("|");
857 } else if (filter_match_mode === "exact") {
858 ret_val = "^(" + selected_value.join("|") + ")$";
859 } else if (filter_match_mode === "startsWith") {
860 ret_val = "^(" + selected_value.join("|") + ")";
861 } else if (filter_match_mode === "regex") {
862 ret_val = selected_value;
868 function yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number, exclude, original_column_number) {
869 var case_insensitive = yadcf.getOptions(oTable.selector)[original_column_number].case_insensitive;
870 if (exclude !== true) {
871 if (filter_match_mode === "contains") {
872 oTable.fnFilter(selected_value, column_number, false, true, true, case_insensitive);
873 } else if (filter_match_mode === "exact") {
874 selected_value = escapeRegExp(selected_value);
875 oTable.fnFilter("^" + selected_value + "$", column_number, true, false, true, case_insensitive);
876 } else if (filter_match_mode === "startsWith") {
877 selected_value = escapeRegExp(selected_value);
878 oTable.fnFilter("^" + selected_value, column_number, true, false, true, case_insensitive);
879 } else if (filter_match_mode === "regex") {
881 //validate regex, only call fnFilter if valid
882 new RegExp(selected_value);
886 oTable.fnFilter(selected_value, column_number, true, false, true, case_insensitive);
889 oTable.fnFilter("^((?!" + selected_value + ").)*$", column_number, true, false, true, case_insensitive);
892 function yadcfParseMatchFilter(tmpStr, filter_match_mode) {
894 if (filter_match_mode === "contains") {
896 } else if (filter_match_mode === "exact") {
897 retVal = tmpStr.substring(1, tmpStr.length - 1);
898 retVal = retVal.replace(/([\\])/g, '');
899 } else if (filter_match_mode === "startsWith") {
900 retVal = tmpStr.substring(1, tmpStr.length);
901 retVal = retVal.replace(/([\\])/g, '');
902 } else if (filter_match_mode === "regex") {
908 function doFilterCustomDateFunc(arg, table_selector_jq_friendly, column_number) {
909 var oTable = oTables[table_selector_jq_friendly],
911 columnObj = getOptions(oTable.selector)[column_number];
913 if (arg === 'clear' && exGetColumnFilterVal(oTable, column_number) === '') {
917 if (arg.value !== undefined && arg.value !== "-1") {
918 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
920 //wehn arg === 'clear' or arg.value === '-1'
921 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val('-1').focus();
922 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
923 refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), '-1');
926 if (!oTable.fnSettings().oLoadedState) {
927 oTable.fnSettings().oLoadedState = {};
928 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
930 if (oTable.fnSettings().oFeatures.bStateSave === true) {
931 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
932 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
938 yadcfState[table_selector_jq_friendly] = [];
939 yadcfState[table_selector_jq_friendly][column_number] = {
942 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
944 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
950 function calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly) {
951 var column_number_filter;
952 if ((settingsDt.oSavedState && settingsDt.oSavedState.ColReorder !== undefined) ||
953 settingsDt._colReorder ||
954 (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
955 initColReorder2(settingsDt, table_selector_jq_friendly);
956 column_number_filter = plugins[table_selector_jq_friendly].ColReorder[column_number];
958 column_number_filter = column_number;
960 return column_number_filter;
963 function doFilter(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
964 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
966 var oTable = oTables[table_selector_jq_friendly],
968 column_number_filter,
970 settingsDt = getSettingsObjFromTable(oTable);
972 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
974 columnObj = getOptions(oTable.selector)[column_number];
975 if (arg === "clear") {
976 if (exGetColumnFilterVal(oTable, column_number) === '') {
979 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("-1").focus();
980 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
981 $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", "-1");
982 oTable.fnFilter("", column_number_filter);
985 refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), '-1');
989 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
991 $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value);
993 selected_value = $.trim($(arg).find('option:selected').val());
995 if (arg.value !== "-1") {
996 yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number_filter, false, column_number);
998 oTable.fnFilter("", column_number_filter);
999 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
1004 function doFilterMultiSelect(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
1005 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1006 var oTable = oTables[table_selector_jq_friendly],
1007 selected_values = $(arg).val(),
1008 selected_values_trimmed = [],
1011 column_number_filter,
1012 settingsDt = getSettingsObjFromTable(oTable);
1014 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1015 $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", selected_values);
1017 if (selected_values !== null) {
1018 for (i = selected_values.length - 1; i >= 0; i--) {
1019 if (selected_values[i] === "-1") {
1020 selected_values.splice(i, 1);
1024 for (i = 0; i < selected_values.length; i++) {
1025 selected_values_trimmed.push($.trim(selected_values[i]));
1027 if (selected_values_trimmed.length !== 0) {
1028 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass("inuse");
1029 if (filter_match_mode !== "regex") {
1030 stringForSearch = selected_values_trimmed.join('narutouzomaki');
1031 stringForSearch = stringForSearch.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
1032 stringForSearch = stringForSearch.split('narutouzomaki').join('|');
1033 if (filter_match_mode === "contains") {
1034 oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
1035 } else if (filter_match_mode === "exact") {
1036 oTable.fnFilter("^(" + stringForSearch + ")$", column_number_filter, true, false, true);
1037 } else if (filter_match_mode === "startsWith") {
1038 oTable.fnFilter("^(" + stringForSearch + ")", column_number_filter, true, false, true);
1041 stringForSearch = selected_values_trimmed.join('|');
1042 oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
1045 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass("inuse");
1046 oTable.fnFilter("", column_number_filter);
1049 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass("inuse");
1050 oTable.fnFilter("", column_number_filter);
1055 function yadcfParseMatchFilterMultiSelect(tmpStr, filter_match_mode) {
1057 if (filter_match_mode === "contains") {
1059 } else if (filter_match_mode === "exact") {
1060 retVal = tmpStr.substring(1, tmpStr.length - 1);
1061 retVal = retVal.substring(1, retVal.length - 1);
1062 } else if (filter_match_mode === "startsWith") {
1063 retVal = tmpStr.substring(1, tmpStr.length);
1064 retVal = retVal.substring(1, retVal.length - 1);
1065 } else if (filter_match_mode === "regex") {
1071 function doFilterAutocomplete(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
1072 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1073 var oTable = oTables[table_selector_jq_friendly],
1074 column_number_filter,
1075 settingsDt = getSettingsObjFromTable(oTable);
1077 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1079 if (arg === "clear") {
1080 if (exGetColumnFilterVal(oTable, column_number) === '') {
1083 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus();
1084 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
1085 $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
1086 oTable.fnFilter("", column_number_filter);
1091 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
1093 $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value);
1095 yadcfMatchFilter(oTable, arg.value, filter_match_mode, column_number_filter, false, column_number);
1100 function autocompleteSelect(event, ui) {
1103 table_selector_jq_friendly,
1107 event = eventTargetFixUp(event);
1108 table_column = event.target.id.replace("yadcf-filter-", "");
1109 dashIndex = table_column.lastIndexOf("-");
1110 table_selector_jq_friendly = table_column.substring(0, dashIndex);
1111 col_num = parseInt(table_column.substring(dashIndex + 1), 10);
1112 filter_match_mode = $(event.target).attr("filter_match_mode");
1114 doFilterAutocomplete(ui.item, table_selector_jq_friendly, col_num, filter_match_mode);
1117 function sortNumAsc(a, b) {
1121 function sortNumDesc(a, b) {
1125 function findMinInArray(array, columnObj) {
1130 for (i = 0; i < array.length; i++) {
1131 if (array[i] !== null) {
1132 if (columnObj.ignore_char !== undefined) {
1133 array[i] = array[i].toString().replace(columnObj.ignore_char, "");
1135 if (columnObj.range_data_type === 'single') {
1138 num = array[i].split(columnObj.range_data_type_delim);
1146 min = Math.min.apply(Math, narray);
1147 if (!isFinite(min)) {
1149 } else if (min !== 0) {
1151 min = Math.floor(min);
1153 min = -1 * Math.ceil(min * -1);
1160 function findMaxInArray(array, columnObj) {
1165 for (i = 0; i < array.length; i++) {
1166 if (array[i] !== null) {
1167 if (columnObj.ignore_char !== undefined) {
1168 array[i] = array[i].toString().replace(columnObj.ignore_char, "");
1170 if (columnObj.range_data_type === 'single') {
1173 num = array[i].split(columnObj.range_data_type_delim);
1181 max = Math.max.apply(Math, narray);
1182 if (!isFinite(max)) {
1185 max = Math.ceil(max);
1190 function addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, ignore_char, sliderMaxMin) {
1192 $.fn.dataTableExt.afnFiltering.push(
1193 function (settingsDt, aData, iDataIndex, rowData) {
1198 table_selector_jq_friendly_local = table_selector_jq_friendly,
1199 current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1200 ignore_char_local = ignore_char,
1204 column_number_filter,
1208 if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) {
1211 columnObj = getOptions(settingsDt.oInstance.selector)[col_num];
1212 if (columnObj.filter_type === 'range_number_slider') {
1213 min = $('#' + fromId).text();
1214 max = $('#' + toId).text();
1216 min = $('#' + fromId).val();
1217 max = $('#' + toId).val();
1220 column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1222 if (rowData !== undefined) {
1224 if (columnObj.column_number_data !== undefined) {
1225 column_number_filter = columnObj.column_number_data;
1226 val = dot2obj(aData, column_number_filter);
1228 val = aData[column_number_filter];
1231 val = aData[column_number_filter];
1233 if (!isFinite(min) || !isFinite(max)) {
1236 column_data_type = columnObj.column_data_type;
1237 html_data_type = columnObj.html_data_type;
1239 if (column_data_type === "html" || column_data_type === "rendered_html") {
1240 if (html_data_type === undefined) {
1241 html_data_type = "text";
1243 if ($(val).length !== 0) {
1244 switch (html_data_type) {
1246 val = $(val).text();
1255 val = $(val).find(columnObj.html_data_selector).text();
1260 if (typeof val === 'object') {
1261 if (columnObj.html5_data !== undefined) {
1262 val = val['@' + columnObj.html5_data];
1266 if (ignore_char_local !== undefined) {
1267 min = min.replace(ignore_char_local, "");
1268 max = max.replace(ignore_char_local, "");
1270 val = val.toString().replace(ignore_char_local, "");
1275 //omit empty rows when filtering
1276 if (columnObj.filter_type === 'range_number_slider') {
1277 if (val === '' && ((+min) !== sliderMaxMin.min || (+max) !== sliderMaxMin.max)) {
1281 if (val === '' && (min !== '' || max !== '')) {
1285 min = (min !== "") ? (+min) : min;
1286 max = (max !== "") ? (+max) : max;
1287 if (columnObj.range_data_type === 'single') {
1288 val = (val !== "") ? (+val) : val;
1289 if (min === "" && max === "") {
1291 } else if (min === "" && val <= max) {
1293 } else if (min <= val && "" === max) {
1295 } else if (min <= val && val <= max) {
1297 } else if (val === '' || isNaN(val)) {
1300 } else if (columnObj.range_data_type === 'range') {
1301 val = val.split(columnObj.range_data_type_delim);
1302 valFrom = (val[0] !== "") ? (+val[0]) : val[0];
1303 valTo = (val[1] !== "") ? (+val[1]) : val[1];
1304 if (min === "" && max === "") {
1306 } else if (min === "" && valTo <= max) {
1308 } else if (min <= valFrom && "" === max) {
1310 } else if (min <= valFrom && valTo <= max) {
1312 } else if ((valFrom === '' || isNaN(valFrom)) && (valTo === '' || isNaN(valTo))) {
1321 function addCustomFunctionFilterCapability(table_selector_jq_friendly, filterId, col_num) {
1323 $.fn.dataTableExt.afnFiltering.push(
1324 function (settingsDt, aData, iDataIndex, stateVal) {
1325 var filterVal = $('#' + filterId).val(),
1328 table_selector_jq_friendly_local = table_selector_jq_friendly,
1329 current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1331 column_number_filter;
1333 if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly || filterVal === '-1') {
1337 column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1339 columnVal = aData[column_number_filter] === "-" ? 0 : aData[column_number_filter];
1341 custom_func = getOptions(settingsDt.oInstance.selector)[col_num].custom_func;
1343 retVal = custom_func(filterVal, columnVal, aData, stateVal);
1349 function addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, date_format) {
1351 $.fn.dataTableExt.afnFiltering.push(
1352 function (settingsDt, aData, iDataIndex, rowData) {
1353 var min = document.getElementById(fromId) !== null ? document.getElementById(fromId).value : "",
1354 max = document.getElementById(toId) !== null ? document.getElementById(toId).value : "",
1357 table_selector_jq_friendly_local = table_selector_jq_friendly,
1358 current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(settingsDt),
1362 column_number_filter,
1368 if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) {
1371 columnObj = getOptions(settingsDt.oInstance.selector)[col_num];
1372 if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1373 dpg = $.fn.datepicker.DPGlobal;
1375 column_number_filter = calcColumnNumberFilter(settingsDt, col_num, table_selector_jq_friendly);
1376 if (typeof columnObj.column_number_data === 'function' || typeof columnObj.column_number_render === 'function') {
1377 dataRenderFunc = true;
1379 if (rowData !== undefined && dataRenderFunc !== true) {
1380 if (columnObj.column_number_data !== undefined) {
1381 column_number_filter = columnObj.column_number_data;
1382 val = dot2obj(rowData, column_number_filter);
1384 val = rowData[column_number_filter];
1387 val = aData[column_number_filter];
1390 column_data_type = columnObj.column_data_type;
1391 html_data_type = columnObj.html_data_type;
1393 if (column_data_type === "html" || column_data_type === "rendered_html") {
1394 if (html_data_type === undefined) {
1395 html_data_type = "text";
1397 if ($(val).length !== 0) {
1398 switch (html_data_type) {
1400 val = $(val).text();
1409 val = $(val).find(columnObj.html_data_selector).text();
1413 } else if (typeof val === 'object') {
1414 if (columnObj.html5_data !== undefined) {
1415 val = val['@' + columnObj.html5_data];
1419 //omit empty rows when filtering
1420 if (val === '' && (min !== '' || max !== '')) {
1424 if (min.length === (date_format.length + 2) || columnObj.datepicker_type.indexOf('bootstrap') !== -1) {
1425 if (columnObj.datepicker_type === 'jquery-ui') {
1426 min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min;
1427 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1428 min = (min !== "") ? moment(min, columnObj.moment_date_format).toDate() : min;
1429 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1430 min = (min !== "") ? dpg.parseDate(min, dpg.parseFormat(columnObj.date_format)) : min;
1435 if (max.length === (date_format.length + 2) || columnObj.datepicker_type.indexOf('bootstrap') !== -1) {
1436 if (columnObj.datepicker_type === 'jquery-ui') {
1437 max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max;
1438 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1439 max = (max !== "") ? moment(max, columnObj.moment_date_format).toDate() : max;
1440 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1441 max = (max !== "") ? dpg.parseDate(max, dpg.parseFormat(columnObj.date_format)) : max;
1446 if (columnObj.datepicker_type === 'jquery-ui') {
1447 val = (val !== "") ? $.datepicker.parseDate(date_format, val) : val;
1448 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1449 val = (val !== "") ? moment(val, columnObj.moment_date_format).toDate() : val;
1450 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1451 val = (val !== "") ? dpg.parseDate(val, dpg.parseFormat(columnObj.date_format)) : val;
1455 if (date_format.toLowerCase() !== 'hh:mm') {
1456 if ((min === "" || !(min instanceof Date)) && (max === "" || !(max instanceof Date))) {
1458 } else if (min === "" && val <= max) {
1460 } else if (min <= val && "" === max) {
1462 } else if (min <= val && val <= max) {
1466 min_time = moment(min);
1467 min_time = min_time.minutes() + min_time.hours() * 60;
1468 if (isNaN(min_time)) {
1471 max_time = moment(max);
1472 max_time = max_time.minutes() + max_time.hours() * 60;
1473 if (isNaN(max_time)) {
1477 val = val.minutes() + val.hours() * 60;
1479 if ((min === "" || !(moment(min, date_format).isValid())) && (max === "" || !(moment(max, date_format).isValid()))) {
1481 } else if (min_time === "" && val <= max_time) {
1483 } else if (min_time <= val && "" === max_time) {
1485 } else if (min_time <= val && val <= max_time) {
1494 function addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char) {
1495 var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-" + column_number,
1496 toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-" + column_number,
1497 filter_selector_string_tmp,
1503 filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1505 if ($("#" + filter_wrapper_id).length > 0) {
1508 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1509 oTable = oTables[table_selector_jq_friendly];
1510 columnObj = getOptions(oTable.selector)[column_number];
1512 //add a wrapper to hold both filter and reset button
1513 $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\" id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper " + columnObj.style_class + "\"></div>");
1514 filter_selector_string += " div.yadcf-filter-wrapper";
1515 filter_selector_string_tmp = filter_selector_string;
1517 $(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>");
1518 filter_selector_string += " div.yadcf-filter-wrapper-inner";
1520 filterActionStr = 'onkeyup="yadcf.rangeNumberKeyUP(\'' + table_selector_jq_friendly + '\',event);"';
1521 if (columnObj.externally_triggered === true) {
1522 filterActionStr = '';
1525 $(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>");
1526 $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-seperator\" >" +
1528 $(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>");
1530 if (filter_reset_button_text !== false) {
1531 $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
1532 "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>");
1535 if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1536 if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1537 $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from);
1538 if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") {
1539 $('#' + fromId).addClass("inuse");
1541 $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to);
1542 if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") {
1543 $('#' + toId).addClass("inuse");
1549 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1550 addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, ignore_char);
1555 function dateSelectSingle(pDate, pEvent, clear) {
1561 table_selector_jq_friendly,
1562 column_number_filter,
1566 if (pDate.type === 'dp') {
1567 event = pDate.target;
1568 } else if (pDate.type === 'changeDate') {
1569 event = pDate.currentTarget;
1575 column_number = $(event).attr('id').replace('yadcf-filter-', '').replace('-date', '').replace('-reset', '');
1576 dashIndex = column_number.lastIndexOf("-");
1577 table_selector_jq_friendly = column_number.substring(0, dashIndex);
1579 column_number = column_number.substring(dashIndex + 1);
1580 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1581 oTable = oTables[table_selector_jq_friendly];
1582 settingsDt = getSettingsObjFromTable(oTable);
1583 columnObj = getOptions(oTable.selector)[column_number];
1585 if (pDate.type === 'dp') {
1586 if (moment($(event).val(), columnObj.date_format).isValid()) {
1587 date = $(event).val();
1592 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1594 date = pDate.format(0, columnObj.date_format);
1598 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1600 if (clear === undefined) {
1601 if (columnObj.filter_type !== 'date_custom_func') {
1602 oTable.fnFilter(date, column_number_filter);
1604 doFilterCustomDateFunc({ value: date }, table_selector_jq_friendly, column_number);
1606 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass("inuse");
1607 } else if (clear === 'clear') {
1608 if (exGetColumnFilterVal(oTable, column_number) === '') {
1611 if (columnObj.filter_type === 'date_custom_func') {
1612 //handle state saving
1613 if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1614 if (!oTable.fnSettings().oLoadedState) {
1615 oTable.fnSettings().oLoadedState = {};
1616 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1618 if (oTable.fnSettings().oFeatures.bStateSave === true) {
1619 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
1620 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
1626 yadcfState[table_selector_jq_friendly] = [];
1627 yadcfState[table_selector_jq_friendly][column_number] = {
1630 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
1632 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1636 oTable.fnFilter('', column_number_filter);
1637 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val('').removeClass("inuse");
1638 if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1639 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).datepicker('update');
1646 function dateSelect(pDate, pEvent) {
1650 table_selector_jq_friendly,
1656 column_number_filter,
1659 if (pDate.type === 'dp') {
1660 event = pDate.target;
1661 } else if (pDate.type === 'changeDate') {
1662 event = pDate.currentTarget;
1667 column_number = $(event).attr("id").replace("yadcf-filter-", "").replace("-from-date", "").replace("-to-date", "");
1668 dashIndex = column_number.lastIndexOf("-");
1669 table_selector_jq_friendly = column_number.substring(0, dashIndex);
1671 column_number = column_number.substring(dashIndex + 1);
1674 oTable = oTables[table_selector_jq_friendly];
1675 settingsDt = getSettingsObjFromTable(oTable);
1676 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1678 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1680 columnObj = getOptions(oTable.selector)[column_number];
1682 if (pDate.type === 'dp') {
1683 event = pDate.target;
1684 if (pDate.date === false || !moment($(event).val(), columnObj.date_format).isValid()) {
1685 $(event).removeClass("inuse");
1686 $(event).data("DateTimePicker").minDate(false);
1688 $(event).addClass("inuse");
1691 } else if (pDate.type === 'changeDate') {
1692 if (pDate.date !== undefined) {
1693 $(event).addClass("inuse");
1695 $(event).removeClass("inuse");
1698 $(event).addClass("inuse");
1701 if ($(event).attr("id").indexOf("-from-") !== -1) {
1702 from = document.getElementById($(event).attr("id")).value;
1703 to = document.getElementById($(event).attr("id").replace("-from-", "-to-")).value;
1705 to = document.getElementById($(event).attr("id")).value;
1706 from = document.getElementById($(event).attr("id").replace("-to-", "-from-")).value;
1709 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1712 oTable.fnFilter(from + '-yadcf_delim-' + to, column_number_filter);
1715 if (!oTable.fnSettings().oLoadedState) {
1716 oTable.fnSettings().oLoadedState = {};
1717 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1719 if (oTable.fnSettings().oFeatures.bStateSave === true) {
1720 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
1721 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
1728 yadcfState[table_selector_jq_friendly] = [];
1729 yadcfState[table_selector_jq_friendly][column_number] = {
1733 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
1735 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
1741 function addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) {
1742 var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number,
1743 toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number,
1744 filter_selector_string_tmp,
1752 innerWrapperAdditionalClass = '';
1754 filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1756 if ($("#" + filter_wrapper_id).length > 0) {
1759 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1760 oTable = oTables[table_selector_jq_friendly];
1761 columnObj = getOptions(oTable.selector)[column_number];
1762 if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1763 innerWrapperAdditionalClass = 'input-daterange';
1765 //add a wrapper to hold both filter and reset button
1766 $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\" id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper " + columnObj.style_class + "\"></div>");
1767 filter_selector_string += " div.yadcf-filter-wrapper";
1768 filter_selector_string_tmp = filter_selector_string;
1770 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper-inner " + innerWrapperAdditionalClass + "\"></div>");
1771 filter_selector_string += " div.yadcf-filter-wrapper-inner";
1773 filterActionStr = 'onkeyup="yadcf.rangeDateKeyUP(\'' + table_selector_jq_friendly + '\',\'' + date_format + '\',event);"';
1774 if (columnObj.externally_triggered === true) {
1775 filterActionStr = '';
1778 $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[0] + "\" id=\"" + fromId + "\" class=\"yadcf-filter-range-date yadcf-filter-range yadcf-filter-range-start\" " + filterActionStr + "></input>");
1779 $(filter_selector_string).append("<span class=\"yadcf-filter-range-date-seperator\" >" + "</span>");
1780 $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label[1] + "\" id=\"" + toId + "\" class=\"yadcf-filter-range-date yadcf-filter-range yadcf-filter-range-end\" " + filterActionStr + "></input>");
1782 $fromInput = $("#" + fromId);
1783 $toInput = $("#" + toId);
1785 if (filter_reset_button_text !== false) {
1786 $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
1787 "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>");
1790 if (columnObj.datepicker_type === 'jquery-ui') {
1791 datepickerObj.dateFormat = date_format;
1792 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1793 datepickerObj.format = date_format;
1796 if (columnObj.externally_triggered !== true) {
1797 if (columnObj.datepicker_type === 'jquery-ui') {
1798 datepickerObj.onSelect = dateSelect;
1800 // for 'bootstrap-datetimepicker' its implemented below...
1803 datepickerObj = $.extend({}, datepickerObj, columnObj.filter_plugin_options);
1805 if (columnObj.datepicker_type === 'jquery-ui') {
1806 $fromInput.datepicker($.extend(datepickerObj, {onClose: function (selectedDate) {
1807 $toInput.datepicker('option', 'minDate', selectedDate);
1809 $toInput.datepicker($.extend(datepickerObj, {onClose: function (selectedDate) {
1810 $fromInput.datepicker('option', 'maxDate', selectedDate);
1813 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1814 datepickerObj.useCurrent = false;
1815 $fromInput.datetimepicker(datepickerObj);
1816 $toInput.datetimepicker(datepickerObj);
1817 if (columnObj.externally_triggered !== true) {
1818 $fromInput.add($toInput).on('dp.hide', dateSelect);
1820 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1822 $.extend(datepickerObj, { format: date_format });
1824 $fromInput.datepicker(datepickerObj).on('changeDate', function (e) {
1826 $(this).datepicker('hide');
1828 $toInput.datepicker(datepickerObj).on('changeDate', function (e) {
1830 $(this).datepicker('hide');
1834 if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1835 if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1836 $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from);
1837 if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") {
1838 $('#' + fromId).addClass("inuse");
1840 $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to);
1841 if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") {
1842 $('#' + toId).addClass("inuse");
1847 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
1848 addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, date_format);
1854 function addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) {
1855 var dateId = "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number,
1856 filter_selector_string_tmp,
1864 filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
1866 if ($("#" + filter_wrapper_id).length > 0) {
1869 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1870 oTable = oTables[table_selector_jq_friendly];
1871 columnObj = getOptions(oTable.selector)[column_number];
1873 //add a wrapper to hold both filter and reset button
1874 $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\" id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper\"></div>");
1875 filter_selector_string += " div.yadcf-filter-wrapper";
1876 filter_selector_string_tmp = filter_selector_string;
1878 filterActionStr = 'onkeyup="yadcf.dateKeyUP(\'' + table_selector_jq_friendly + '\',\'' + date_format + '\',event);"';
1879 if (columnObj.externally_triggered === true) {
1880 filterActionStr = '';
1883 $(filter_selector_string).append("<input onkeydown=\"yadcf.preventDefaultForEnter(event);\" placeholder=\"" + filter_default_label + "\" id=\"" + dateId + "\" class=\"yadcf-filter-date\" " + filterActionStr + "></input>");
1885 if (filter_reset_button_text !== false) {
1886 $(filter_selector_string_tmp).append('<button type="button" id="' + dateId + '-reset" ' + 'onmousedown="yadcf.stopPropagation(event);" ' +
1887 '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>');
1890 if (columnObj.datepicker_type === 'jquery-ui') {
1891 datepickerObj.dateFormat = date_format;
1892 } else if (columnObj.datepicker_type.indexOf('bootstrap') !== -1) {
1893 datepickerObj.format = date_format;
1896 if (columnObj.externally_triggered !== true) {
1897 if (columnObj.datepicker_type === 'jquery-ui') {
1898 datepickerObj.onSelect = dateSelectSingle;
1902 datepickerObj = $.extend({}, datepickerObj, columnObj.filter_plugin_options);
1904 if (columnObj.datepicker_type === 'jquery-ui') {
1905 $("#" + dateId).datepicker(datepickerObj);
1906 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
1907 datepickerObj.useCurrent = false;
1908 $("#" + dateId).datetimepicker(datepickerObj);
1909 if (columnObj.externally_triggered !== true) {
1910 if (datepickerObj.format.toLowerCase() !== 'hh:mm') {
1911 $("#" + dateId).on('dp.change', dateSelectSingle);
1913 $("#" + dateId).on('dp.hide', dateSelectSingle);
1916 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
1917 $("#" + dateId).datepicker(datepickerObj).on('changeDate', function (e) {
1918 dateSelectSingle(e);
1919 $(this).datepicker('hide');
1923 if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') {
1924 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(oTable.fnSettings().aoPreSearchCols[column_number].sSearch).addClass("inuse");
1927 if (columnObj.filter_type === 'date_custom_func') {
1928 settingsDt = getSettingsObjFromTable(oTable);
1930 if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) {
1931 if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
1932 $('#' + dateId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from);
1933 if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") {
1934 $('#' + dateId).addClass("inuse");
1939 if (settingsDt.oFeatures.bServerSide !== true) {
1940 addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number);
1947 function rangeNumberSldierDrawTips(min_tip_val, max_tip_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number) {
1948 var first_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number), // + " .ui-slider-handle:first"),
1949 last_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number), // + " .ui-slider-handle:last"),
1953 min_tip_inner = "<div id=\"" + min_tip_id + "\" class=\"yadcf-filter-range-number-slider-min-tip-inner\">" + min_tip_val + "</div>";
1954 max_tip_inner = "<div id=\"" + max_tip_id + "\" class=\"yadcf-filter-range-number-slider-max-tip-inner\">" + max_tip_val + "</div>";
1956 if (first_handle.length === 1) {
1957 first_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:first");
1958 $(first_handle).addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1960 last_handle = $(".yadcf-number-slider-filter-wrapper-inner.-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:last");
1961 $(last_handle).addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1963 //migth happen when scrollX is used or when filter row is being duplicated by DT
1964 $($(first_handle)[0]).find('.ui-slider-handle:first').addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1965 $($(last_handle)[0]).find('.ui-slider-handle:last').addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1967 $($(first_handle)[1]).find('.ui-slider-handle:first').addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner);
1968 $($(last_handle)[1]).find('.ui-slider-handle:last').addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner);
1972 function rangeNumberSliderChange(table_selector_jq_friendly, event, ui) {
1982 column_number_filter;
1984 event = eventTargetFixUp(event);
1985 column_number = $(event.target).attr('id').replace("yadcf-filter-", "").replace(table_selector_jq_friendly, "").replace("-slider-", "");
1987 oTable = oTables[table_selector_jq_friendly];
1988 settingsDt = getSettingsObjFromTable(oTable);
1989 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
1991 columnObj = getOptions(oTable.selector)[column_number];
1993 keyUp = function () {
1995 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
1997 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
2000 oTable.fnFilter(ui.values[0] + '-yadcf_delim-' + ui.values[1], column_number_filter);
2002 min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text();
2003 max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text();
2005 if (min_val !== ui.values[0]) {
2006 $($(event.target).find(".ui-slider-handle")[0]).addClass("inuse");
2007 slider_inuse = true;
2009 $($(event.target).find(".ui-slider-handle")[0]).removeClass("inuse");
2011 if (max_val !== ui.values[1]) {
2012 $($(event.target).find(".ui-slider-handle")[1]).addClass("inuse");
2013 slider_inuse = true;
2015 $($(event.target).find(".ui-slider-handle")[1]).removeClass("inuse");
2018 if (slider_inuse === true) {
2019 $(event.target).find(".ui-slider-range").addClass("inuse");
2021 $(event.target).find(".ui-slider-range").removeClass("inuse");
2024 if (!oTable.fnSettings().oLoadedState) {
2025 oTable.fnSettings().oLoadedState = {};
2026 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
2028 if (oTable.fnSettings().oFeatures.bStateSave === true) {
2029 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
2030 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
2037 yadcfState[table_selector_jq_friendly] = [];
2038 yadcfState[table_selector_jq_friendly][column_number] = {
2042 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
2044 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
2050 if (columnObj.filter_delay === undefined) {
2053 yadcfDelay(function () {
2055 }, columnObj.filter_delay);
2059 function addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char) {
2060 var sliderId = "yadcf-filter-" + table_selector_jq_friendly + "-slider-" + column_number,
2061 min_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-min_tip-" + column_number,
2062 max_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-max_tip-" + column_number,
2063 filter_selector_string_tmp,
2066 min_state_val = min_val,
2067 max_state_val = max_val,
2077 currSliderMin = $("#" + sliderId).slider("option", "min"),
2078 currSliderMax = $("#" + sliderId).slider("option", "max"),
2081 filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number;
2083 if ($("#" + filter_wrapper_id).length > 0 && (currSliderMin === min_val && currSliderMax === max_val)) {
2087 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2088 oTable = oTables[table_selector_jq_friendly];
2089 settingsDt = settingsMap[generateTableSelectorJQFriendly2(oTable)];
2091 if ($("#" + filter_wrapper_id).length > 0) {
2092 $("#" + sliderId).slider("destroy");
2093 $("#" + filter_wrapper_id).remove();
2097 columnObj = getOptions(oTable.selector)[column_number];
2099 if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2100 if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2101 if (min_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) {
2102 min_state_val = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
2104 if (max_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) {
2105 max_state_val = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to;
2110 if (isFinite(min_val) && isFinite(max_val) && isFinite(min_state_val) && isFinite(max_state_val)) {
2112 //add a wrapper to hold both filter and reset button
2113 $(filter_selector_string).append("<div onmousedown=\"yadcf.stopPropagation(event);\" onclick=\"yadcf.stopPropagation(event);\" id=\"" + filter_wrapper_id + "\" class=\"yadcf-filter-wrapper " + columnObj.style_class + "\"></div>");
2114 filter_selector_string += " div.yadcf-filter-wrapper";
2115 filter_selector_string_tmp = filter_selector_string;
2117 $(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>");
2118 filter_selector_string += " div.yadcf-number-slider-filter-wrapper-inner";
2120 $(filter_selector_string).append("<div id=\"" + sliderId + "\" class=\"yadcf-filter-range-number-slider\"></div>");
2121 filter_selector_string += " #" + sliderId;
2123 $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-slider-min-tip-hidden hide\">" + min_val + "</span>");
2124 $(filter_selector_string).append("<span class=\"yadcf-filter-range-number-slider-max-tip-hidden hide\">" + max_val + "</span>");
2126 if (columnObj.externally_triggered !== true) {
2127 slideFunc = function (event, ui) {
2128 rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
2129 rangeNumberSliderChange(table_selector_jq_friendly, event, ui);
2131 changeFunc = function (event, ui) {
2132 rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
2133 if (event.originalEvent || $(event.target).slider("option", "yadcf-reset") === true) {
2134 $(event.target).slider("option", "yadcf-reset", false);
2135 rangeNumberSliderChange(table_selector_jq_friendly, event, ui);
2139 slideFunc = function (event, ui) {
2140 rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
2142 changeFunc = function (event, ui) {
2143 rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
2150 values: [min_state_val, max_state_val],
2151 create: function (event, ui) {
2152 rangeNumberSldierDrawTips(min_state_val, max_state_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number);
2158 if (columnObj.filter_plugin_options !== undefined) {
2159 $.extend(sliderObj, columnObj.filter_plugin_options);
2162 $("#" + sliderId).slider(sliderObj);
2164 if (filter_reset_button_text !== false) {
2165 $(filter_selector_string_tmp).append("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2166 "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>");
2170 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
2171 oTable = oTables[table_selector_jq_friendly];
2172 if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2173 if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2174 if (isFinite(min_val) && min_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) {
2175 $($(filter_selector_string).find(".ui-slider-handle")[0]).addClass("inuse");
2177 if (isFinite(max_val) && max_val !== settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) {
2178 $($(filter_selector_string).find(".ui-slider-handle")[1]).addClass("inuse");
2180 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)) {
2181 $($(filter_selector_string).find(".ui-slider-range")).addClass("inuse");
2187 if (settingsDt.oFeatures.bServerSide !== true) {
2188 addRangeNumberAndSliderFilterCapability(table_selector_jq_friendly, min_tip_id, max_tip_id, column_number, ignore_char, sliderMaxMin);
2190 if (redrawTable === true) {
2191 oTable.fnDraw(false);
2195 function destroyThirdPartyPlugins(table_arg) {
2198 table_selector_jq_friendly,
2205 //check if the table arg is from new datatables API (capital "D")
2206 if (table_arg.settings !== undefined) {
2207 table_arg = table_arg.settings()[0].oInstance;
2209 tableOptions = getOptions(table_arg.selector);
2210 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
2212 for (columnObjKey in tableOptions) {
2213 if (tableOptions.hasOwnProperty(columnObjKey)) {
2214 optionsObj = tableOptions[columnObjKey];
2215 column_number = optionsObj.column_number;
2217 switch (optionsObj.filter_type) {
2218 case 'multi_select':
2219 case 'multi_select_custom_func':
2222 switch (optionsObj.select_type) {
2224 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).chosen('destroy');
2227 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2('destroy');
2229 case 'custom_select':
2230 if (selectElementCustomDestroyFunc !== undefined) {
2231 selectElementCustomDestroyFunc($("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2236 case 'auto_complete':
2237 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).autocomplete("destroy");
2240 switch (optionsObj.select_type) {
2242 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).datepicker("destroy");
2244 case 'bootstrap-datetimepicker':
2245 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).destroy();
2250 fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number;
2251 toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number;
2252 switch (optionsObj.select_type) {
2254 $("#" + fromId).datepicker("destroy");
2255 $("#" + toId).datepicker("destroy");
2257 case 'bootstrap-datetimepicker':
2258 $("#" + fromId).destroy();
2259 $("#" + toId).destroy();
2263 case 'range_number_slider':
2264 $("#yadcf-filter-" + table_selector_jq_friendly + "-slider-" + column_number).slider("destroy");
2271 function removeFilters(oTable) {
2272 var tableId = getTableId(oTable);
2273 $('#' + tableId + ' .yadcf-filter-wrapper').remove();
2274 if (yadcfVersionCheck('1.10')) {
2275 $(document).off('draw.dt', oTable.selector);
2276 $(document).off('xhr.dt', oTable.selector);
2277 $(document).off('column-visibility.dt', oTable.selector);
2278 $(document).off('destroy.dt', oTable.selector);
2280 $(document).off('draw', oTable.selector);
2281 $(document).off('destroy', oTable.selector);
2283 destroyThirdPartyPlugins(oTable);
2286 /* alphanum.js (C) Brian Huisman
2287 Based on the Alphanum Algorithm by David Koelle
2288 The Alphanum Algorithm is discussed at http://www.DaveKoelle.com
2290 function sortAlphaNum(a, b) {
2291 function chunkify(t) {
2293 var x = 0, y = -1, n = 0, i, j;
2295 while (i = (j = t.charAt(x++)).charCodeAt(0)) {
2296 var m = (i == 46 || (i >=48 && i <= 57));
2306 if (typeof a === 'object' && typeof a.label === 'string') {
2309 if (typeof b === 'object' && typeof b.label === 'string') {
2313 var aa = chunkify(a.toLowerCase());
2314 var bb = chunkify(b.toLowerCase());
2316 for (var x = 0; aa[x] && bb[x]; x++) {
2317 if (aa[x] !== bb[x]) {
2318 var c = Number(aa[x]), d = Number(bb[x]);
2319 if (c == aa[x] && d == bb[x]) {
2321 } else return (aa[x] > bb[x]) ? 1 : -1;
2324 return aa.length - bb.length;
2327 function sortColumnData(column_data, columnObj) {
2328 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") {
2329 if (columnObj.sort_as === "alpha") {
2330 if (columnObj.sort_order === "asc") {
2332 } else if (columnObj.sort_order === "desc") {
2334 column_data.reverse();
2336 } else if (columnObj.sort_as === "num") {
2337 if (columnObj.sort_order === "asc") {
2338 column_data.sort(sortNumAsc);
2339 } else if (columnObj.sort_order === "desc") {
2340 column_data.sort(sortNumDesc);
2342 } else if (columnObj.sort_as === "alphaNum") {
2343 if (columnObj.sort_order === "asc") {
2344 column_data.sort(sortAlphaNum);
2345 } else if (columnObj.sort_order === "desc") {
2346 column_data.sort(sortAlphaNum);
2347 column_data.reverse();
2349 } else if (columnObj.sort_as === "custom") {
2350 column_data.sort(columnObj.sort_as_custom_func);
2355 function getFilteredRows(table) {
2359 if (yadcfVersionCheck('1.10')) {
2360 dataTmp = table._('tr', { filter: 'applied' });
2362 dataTmp = table.rows({ filter: 'applied'}).data().toArray();
2364 for (i = 0; i < dataTmp.length; i++) {
2372 function parseTableColumn(pTable, columnObj, table_selector_jq_friendly, pSettings) {
2373 var col_inner_elements,
2375 col_inner_data_helper,
2378 col_filter_array = {},
2383 column_number_filter;
2385 if (pSettings !== undefined) {
2386 settingsDt = pSettings;
2388 settingsDt = getSettingsObjFromTable(pTable);
2391 if (columnObj.cumulative_filtering !== true) {
2392 data = settingsDt.aoData;
2393 data_length = data.length;
2395 data = getFilteredRows(pTable);
2396 data_length = data.length;
2398 if (columnObj.col_filter_array !== undefined) {
2399 col_filter_array = columnObj.col_filter_array;
2401 column_number_filter = calcColumnNumberFilter(settingsDt, columnObj.column_number, table_selector_jq_friendly);
2402 if (isNaN(settingsDt.aoColumns[column_number_filter].mData) && typeof settingsDt.aoColumns[column_number_filter].mData !== 'object') {
2403 columnObj.column_number_data = settingsDt.aoColumns[column_number_filter].mData;
2405 if (isNaN(settingsDt.aoColumns[column_number_filter].mRender) && typeof settingsDt.aoColumns[column_number_filter].mRender !== 'object') {
2406 columnObj.column_number_render = settingsDt.aoColumns[column_number_filter].mRender;
2409 for (j = 0; j < data_length; j++) {
2410 if (columnObj.column_data_type === "html") {
2411 if (columnObj.column_number_data === undefined) {
2412 col_inner_elements = $(data[j]._aData[column_number_filter]);
2414 col_inner_elements = dot2obj(data[j]._aData, columnObj.column_number_data);
2415 col_inner_elements = $(col_inner_elements);
2417 if (col_inner_elements.length > 0) {
2418 for (k = 0; k < col_inner_elements.length; k++) {
2419 col_inner_data = null;
2420 col_inner_data_helper = null;
2422 switch (columnObj.html_data_type) {
2424 col_inner_data = $(col_inner_elements[k]).text();
2427 col_inner_data = $(col_inner_elements[k]).val();
2430 col_inner_data = col_inner_elements[k].id;
2433 const len = $(col_inner_elements[k]).find(columnObj.html_data_selector).length;
2435 col_inner_data = $(col_inner_elements[k]).find(columnObj.html_data_selector).text();
2436 } else if (len > 1) {
2437 col_inner_data_helper = $(col_inner_elements[k]).find(columnObj.html_data_selector);
2443 if (col_inner_data || col_inner_data_helper) {
2444 if (!col_inner_data_helper) {
2445 if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2446 col_filter_array[col_inner_data] = col_inner_data;
2447 column_data.push(col_inner_data);
2450 col_inner_data = col_inner_data_helper;
2451 col_inner_data_helper.each(function (index) {
2452 var elm = $(col_inner_data[index]).text();
2453 if ($.trim(elm) !== '' && !(col_filter_array.hasOwnProperty(elm))) {
2454 col_filter_array[elm] = elm;
2455 column_data.push(elm);
2462 if (col_inner_elements.selector) {
2463 col_inner_data = col_inner_elements.selector;
2465 col_inner_data = data[j]._aData[column_number_filter];
2467 if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2468 col_filter_array[col_inner_data] = col_inner_data;
2469 column_data.push(col_inner_data);
2473 } else if (columnObj.column_data_type === "text") {
2474 if (columnObj.text_data_delimiter !== undefined) {
2475 if (columnObj.column_number_data === undefined) {
2476 col_inner_elements = data[j]._aData[column_number_filter].split(columnObj.text_data_delimiter);
2478 col_inner_elements = dot2obj(data[j]._aData, columnObj.column_number_data);
2479 col_inner_elements = (col_inner_elements + '').split(columnObj.text_data_delimiter);
2481 for (k = 0; k < col_inner_elements.length; k++) {
2482 col_inner_data = col_inner_elements[k];
2483 if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2484 col_filter_array[col_inner_data] = col_inner_data;
2485 column_data.push(col_inner_data);
2489 if (columnObj.column_number_data === undefined) {
2490 col_inner_data = data[j]._aData[column_number_filter];
2491 if (typeof col_inner_data === 'object') {
2492 if (columnObj.html5_data !== undefined) {
2493 col_inner_data = col_inner_data['@' + columnObj.html5_data];
2494 } else if (col_inner_data && col_inner_data.display) {
2495 col_inner_data = col_inner_data.display;
2497 console.log('Warning: Looks like you have forgot to define the html5_data attribute for the ' + columnObj.column_number + ' column');
2501 } else if (data[j]._aFilterData !== undefined && data[j]._aFilterData !== null) {
2502 col_inner_data = data[j]._aFilterData[column_number_filter];
2504 col_inner_data = dot2obj(data[j]._aData, columnObj.column_number_data);
2506 if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2507 col_filter_array[col_inner_data] = col_inner_data;
2508 column_data.push(col_inner_data);
2511 } else if (columnObj.column_data_type === "rendered_html") {
2512 col_inner_elements = data[j]._aFilterData[column_number_filter];
2513 if (typeof col_inner_elements !== 'string') {
2514 col_inner_elements = $(col_inner_elements);
2515 if (col_inner_elements.length > 0) {
2516 for (k = 0; k < col_inner_elements.length; k++) {
2517 switch (columnObj.html_data_type) {
2519 col_inner_data = $(col_inner_elements[k]).text();
2522 col_inner_data = $(col_inner_elements[k]).val();
2525 col_inner_data = col_inner_elements[k].id;
2528 col_inner_data = $(col_inner_elements[k]).find(columnObj.html_data_selector).text();
2533 col_inner_data = col_inner_elements.selector;
2536 col_inner_data = col_inner_elements;
2538 if ($.trim(col_inner_data) !== '' && !(col_filter_array.hasOwnProperty(col_inner_data))) {
2539 col_filter_array[col_inner_data] = col_inner_data;
2540 column_data.push(col_inner_data);
2544 columnObj.col_filter_array = col_filter_array;
2548 function appendFilters(oTable, args, table_selector, pSettings) {
2549 var $filter_selector,
2550 filter_selector_string,
2552 filter_container_id,
2556 filter_default_label,
2557 filter_reset_button_text,
2558 enable_auto_complete,
2566 table_selector_jq_friendly,
2570 col_num_visible_iter,
2578 custom_func_filter_value_holder,
2581 if (pSettings === undefined) {
2582 settingsDt = getSettingsObjFromTable(oTable);
2584 settingsDt = pSettings;
2586 settingsMap[generateTableSelectorJQFriendly2(oTable)] = settingsDt;
2588 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable);
2590 initColReorder2(settingsDt, table_selector_jq_friendly);
2592 filters_position = $(document).data(table_selector + "_filters_position");
2593 if (settingsDt.oScroll.sX !== '' || settingsDt.oScroll.sY !== '') {
2594 table_selector = '.yadcf-datatables-table-' + table_selector_jq_friendly;
2595 if ($(table_selector).length === 0) {
2596 scrollXYHandler(oTable, '#' + getTableId(oTable));
2599 if (settingsDt.oApi._fnGetUniqueThs !== undefined) {
2600 unique_th = settingsDt.oApi._fnGetUniqueThs(settingsDt);
2602 for (columnObjKey in args) {
2603 if (args.hasOwnProperty(columnObjKey)) {
2604 columnObj = args[columnObjKey];
2608 data = columnObj.data;
2610 column_data_temp = [];
2611 filter_container_id = columnObj.filter_container_id;
2612 column_number = columnObj.column_number;
2613 column_number = +column_number;
2614 column_position = column_number;
2616 if (plugins[table_selector_jq_friendly] !== undefined && (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
2617 column_position = plugins[table_selector_jq_friendly].ColReorder[column_number];
2620 columnObj.column_number = column_number;
2621 column_number_data = undefined;
2622 if (isNaN(settingsDt.aoColumns[column_position].mData) && typeof settingsDt.aoColumns[column_position].mData !== 'object') {
2623 column_number_data = settingsDt.aoColumns[column_position].mData;
2624 columnObj.column_number_data = column_number_data;
2626 if (isNaN(settingsDt.aoColumns[column_position].mRender) && typeof settingsDt.aoColumns[column_position].mRender !== 'object') {
2627 columnObj.column_number_render = settingsDt.aoColumns[column_position].mRender;
2629 filter_default_label = columnObj.filter_default_label;
2630 filter_reset_button_text = columnObj.filter_reset_button_text;
2631 enable_auto_complete = columnObj.enable_auto_complete;
2632 date_format = columnObj.date_format;
2633 if (columnObj.datepicker_type === 'jquery-ui') {
2634 date_format = date_format.replace("yyyy", "yy");
2636 if (columnObj.datepicker_type === 'bootstrap-datetimepicker' && columnObj.filter_plugin_options !== undefined && columnObj.filter_plugin_options.format !== undefined) {
2637 date_format = columnObj.filter_plugin_options.format;
2639 columnObj.date_format = date_format;
2641 if (columnObj.ignore_char !== undefined && !(columnObj.ignore_char instanceof RegExp)) {
2642 ignore_char = new RegExp(columnObj.ignore_char, "g");
2643 columnObj.ignore_char = ignore_char;
2645 filter_match_mode = columnObj.filter_match_mode;
2647 if (column_number === undefined) {
2648 alert("You must specify column number");
2652 if (enable_auto_complete === true) {
2653 columnObj.filter_type = "auto_complete";
2656 if (filter_default_label === undefined) {
2657 if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2658 filter_default_label = placeholderLang.select;
2659 } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2660 filter_default_label = placeholderLang.select_multi;
2661 } else if (columnObj.filter_type === "auto_complete" || columnObj.filter_type === "text") {
2662 filter_default_label = placeholderLang.filter;
2663 } else if (columnObj.filter_type === "range_number" || columnObj.filter_type === "range_date") {
2664 filter_default_label = placeholderLang.range;
2665 } else if (columnObj.filter_type === "date" || columnObj.filter_type === 'date_custom_func') {
2666 filter_default_label = placeholderLang.date;
2668 columnObj.filter_default_label = filter_default_label;
2671 if (filter_reset_button_text === undefined) {
2672 filter_reset_button_text = "x";
2675 if (data !== undefined) {
2676 for (ii = 0; ii < data.length; ii++) {
2677 column_data.push(data[ii]);
2680 if (data === undefined || columnObj.append_data_to_table_data !== undefined) {
2681 columnObj.col_filter_array = undefined;
2682 column_data_temp = parseTableColumn(oTable, columnObj, table_selector_jq_friendly, settingsDt);
2683 if (columnObj.append_data_to_table_data !== 'before') {
2684 column_data = column_data.concat(column_data_temp);
2686 column_data_temp = sortColumnData(column_data_temp, columnObj);
2687 column_data = column_data.concat(column_data_temp);
2691 if (columnObj.append_data_to_table_data === undefined || columnObj.append_data_to_table_data === 'sorted') {
2692 column_data = sortColumnData(column_data, columnObj);
2695 if (columnObj.filter_type === "range_number_slider") {
2696 min_val = findMinInArray(column_data, columnObj);
2697 max_val = findMaxInArray(column_data, columnObj);
2700 if (filter_container_id === undefined && columnObj.filter_container_selector === undefined) {
2701 //Can't show filter inside a column for a hidden one (place it outside using filter_container_id)
2702 if (settingsDt.aoColumns[column_position].bVisible === false) {
2703 //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)');
2707 if (filters_position !== 'thead') {
2708 if (unique_th === undefined) {
2709 //handle hidden columns
2710 col_num_visible = column_position;
2711 for (col_num_visible_iter = 0; col_num_visible_iter < settingsDt.aoColumns.length && col_num_visible_iter < column_position; col_num_visible_iter++) {
2712 if (settingsDt.aoColumns[col_num_visible_iter].bVisible === false) {
2716 column_position = col_num_visible;
2717 filter_selector_string = table_selector + ' ' + filters_position + ' th:eq(' + column_position + ')';
2719 filter_selector_string = table_selector + ' ' + filters_position + ' th:eq(' + $(unique_th[column_position]).index() + ')';
2722 if (columnObj.filters_tr_index === undefined) {
2723 filter_selector_string = table_selector + ' ' + filters_position + ' tr:eq(' + $(unique_th[column_position]).parent().index() + ') th:eq(' + $(unique_th[column_position]).index() + ')';
2725 filter_selector_string = table_selector + ' ' + filters_position + ' tr:eq(' + columnObj.filters_tr_index + ') th:eq(' + $(unique_th[column_position]).index() + ')';
2728 $filter_selector = $(filter_selector_string).find(".yadcf-filter");
2729 if (columnObj.select_type === 'select2') {
2730 $filter_selector = $(filter_selector_string).find("select.yadcf-filter");
2733 if (filter_container_id !== undefined) {
2734 columnObj.filter_container_selector = "#" + filter_container_id;
2736 if ($(columnObj.filter_container_selector).length === 0) {
2737 console.log("ERROR: Filter container could not be found, columnObj.filter_container_selector: " + columnObj.filter_container_selector);
2740 filter_selector_string = columnObj.filter_container_selector;
2741 $filter_selector = $(filter_selector_string).find(".yadcf-filter");
2744 if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func' || columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2745 if (columnObj.data_as_is !== true) {
2746 if (columnObj.omit_default_label !== true) {
2747 if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2748 options_tmp = "<option value=\"" + "-1" + "\">" + filter_default_label + "</option>";
2750 if (columnObj.select_type === 'select2' && columnObj.select_type_options.placeholder !== undefined && columnObj.select_type_options.allowClear === true) {
2751 options_tmp = "<option value=\"\"></option>";
2753 } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2754 if (columnObj.select_type === undefined) {
2755 options_tmp = "<option data-placeholder=\"true\" value=\"" + "-1" + "\">" + filter_default_label + "</option>";
2762 if (columnObj.append_data_to_table_data === undefined) {
2763 if (typeof column_data[0] === 'object') {
2764 for (ii = 0; ii < column_data.length; ii++) {
2765 options_tmp += "<option value=\"" + (column_data[ii].value + '').replace(/"/g, '"') + "\">" + column_data[ii].label + "</option>";
2768 for (ii = 0; ii < column_data.length; ii++) {
2769 options_tmp += "<option value=\"" + (column_data[ii] + '').replace(/"/g, '"') + "\">" + column_data[ii] + "</option>";
2773 for (ii = 0; ii < column_data.length; ii++) {
2774 if (typeof column_data[ii] === 'object') {
2775 options_tmp += "<option value=\"" + (column_data[ii].value + '').replace(/"/g, '"') + "\">" + column_data[ii].label + "</option>";
2777 options_tmp += "<option value=\"" + (column_data[ii] + '').replace(/"/g, '"') + "\">" + column_data[ii] + "</option>";
2782 options_tmp = columnObj.data;
2784 column_data = options_tmp;
2786 if ($filter_selector.length === 1) {
2787 if (columnObj.filter_type === "select" || columnObj.filter_type === "multi_select" || columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2788 if (columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2789 custom_func_filter_value_holder = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val();
2791 $filter_selector.empty();
2792 $filter_selector.append(column_data);
2793 if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2794 tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2795 if (columnObj.filter_type === "select") {
2796 tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2797 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2798 } else if (columnObj.filter_type === "multi_select") {
2799 tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2800 tmpStr = tmpStr.replace(/\\/g, "");
2801 tmpStr = tmpStr.split("|");
2802 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2805 if (columnObj.filter_type === 'custom_func' || columnObj.filter_type === 'multi_select_custom_func') {
2806 tmpStr = custom_func_filter_value_holder;
2807 if (tmpStr === '-1' || tmpStr === undefined) {
2808 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2810 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2814 initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2815 if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2816 refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2818 } else if (columnObj.filter_type === "auto_complete") {
2819 $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_data);
2822 if (filter_container_id === undefined && columnObj.filter_container_selector === undefined) {
2823 if ($(filter_selector_string + " div.DataTables_sort_wrapper").length > 0) {
2824 $(filter_selector_string + " div.DataTables_sort_wrapper").css("display", "inline-block");
2827 if (filter_container_id !== undefined) {
2828 columnObj.filter_container_selector = "#" + filter_container_id;
2830 if ($("#yadcf-filter-wrapper-" + generateTableSelectorJQFriendlyNew(columnObj.filter_container_selector)).length === 0) {
2831 $(columnObj.filter_container_selector).append("<div id=\"yadcf-filter-wrapper-" + generateTableSelectorJQFriendlyNew(columnObj.filter_container_selector) + "\"></div>");
2833 filter_selector_string = "#yadcf-filter-wrapper-" + generateTableSelectorJQFriendlyNew(columnObj.filter_container_selector);
2836 if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') {
2838 //add a wrapper to hold both filter and reset button
2839 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2840 filter_selector_string += " div.yadcf-filter-wrapper";
2842 if (columnObj.filter_type === "select") {
2843 filterActionStr = 'onchange="yadcf.doFilter(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ', \'' + filter_match_mode + '\');"';
2844 if (columnObj.externally_triggered === true) {
2845 filterActionStr = '';
2847 $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2848 filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2849 if (filter_reset_button_text !== false) {
2850 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " +
2851 "id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" 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>");
2854 filterActionStr = 'onchange="yadcf.doFilterCustomDateFunc(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ');"';
2855 if (columnObj.externally_triggered === true) {
2856 filterActionStr = '';
2858 $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter " + columnObj.style_class + "\" " +
2859 filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2860 if (filter_reset_button_text !== false) {
2861 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2862 "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>");
2865 if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2866 if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2867 tmpStr = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
2868 if (tmpStr === '-1' || tmpStr === undefined) {
2869 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2871 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2875 if (settingsDt.oFeatures.bServerSide !== true) {
2876 addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number);
2880 if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2881 tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2882 tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2883 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2886 if (columnObj.select_type !== undefined) {
2887 initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2888 if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2889 refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2892 } else if (columnObj.filter_type === "multi_select" || columnObj.filter_type === 'multi_select_custom_func') {
2894 //add a wrapper to hold both filter and reset button
2895 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2896 filter_selector_string += " div.yadcf-filter-wrapper";
2898 if (columnObj.filter_type === "multi_select") {
2899 filterActionStr = 'onchange="yadcf.doFilterMultiSelect(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ', \'' + filter_match_mode + '\');"';
2900 if (columnObj.externally_triggered === true) {
2901 filterActionStr = '';
2903 $(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 + "\" " +
2904 filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2906 if (filter_reset_button_text !== false) {
2907 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2908 "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>");
2911 if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
2912 tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
2913 tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
2914 tmpStr = tmpStr.replace(/\\/g, "");
2915 tmpStr = tmpStr.split("|");
2916 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2919 filterActionStr = 'onchange="yadcf.doFilterCustomDateFunc(this, \'' + table_selector_jq_friendly + '\', ' + column_number + ');"';
2920 if (columnObj.externally_triggered === true) {
2921 filterActionStr = '';
2923 $(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 + "\" " +
2924 filterActionStr + " onkeydown=\"yadcf.preventDefaultForEnter(event);\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + column_data + "</select>");
2926 if (filter_reset_button_text !== false) {
2927 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2928 "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>");
2931 if (settingsDt.oFeatures.bStateSave === true && settingsDt.oLoadedState) {
2932 if (settingsDt.oLoadedState.yadcfState && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly] && settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) {
2933 tmpStr = settingsDt.oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from;
2934 if (tmpStr === '-1' || tmpStr === undefined) {
2935 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr);
2937 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
2941 if (settingsDt.oFeatures.bServerSide !== true) {
2942 addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number);
2946 if (columnObj.filter_container_selector === undefined && columnObj.select_type_options.width === undefined) {
2947 columnObj.select_type_options = $.extend(columnObj.select_type_options, {width: $(filter_selector_string).closest("th").width() + "px"});
2949 if (columnObj.filter_container_selector !== undefined && columnObj.select_type_options.width === undefined) {
2950 columnObj.select_type_options = $.extend(columnObj.select_type_options, {width: $(filter_selector_string).closest(columnObj.filter_container_selector).width() + "px"});
2953 if (columnObj.select_type !== undefined) {
2954 initializeSelectPlugin(columnObj.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), columnObj.select_type_options);
2955 if (columnObj.cumulative_filtering === true && columnObj.select_type === 'chosen') {
2956 refreshSelectPlugin(columnObj, $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number));
2959 } else if (columnObj.filter_type === "auto_complete") {
2961 //add a wrapper to hold both filter and reset button
2962 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2963 filter_selector_string += " div.yadcf-filter-wrapper";
2965 filterActionStr = 'onkeyup="yadcf.autocompleteKeyUP(\'' + table_selector_jq_friendly + '\',event);"';
2966 if (columnObj.externally_triggered === true) {
2967 filterActionStr = '';
2969 $(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);" +
2970 "' placeholder='" + filter_default_label + "'" + " filter_match_mode='" + filter_match_mode + "' " + filterActionStr + "></input>");
2971 $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_data);
2973 if (filter_reset_button_text !== false) {
2974 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" onmousedown=\"yadcf.stopPropagation(event);\" " +
2975 "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>");
2977 } else if (columnObj.filter_type === "text") {
2979 //add a wrapper to hold both filter and reset button
2980 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number + "\" class=\"yadcf-filter-wrapper\"></div>");
2981 filter_selector_string += " div.yadcf-filter-wrapper";
2983 filterActionStr = 'onkeyup="yadcf.textKeyUP(event,\'' + table_selector_jq_friendly + '\', ' + column_number + ');"';
2984 if (columnObj.externally_triggered === true) {
2985 filterActionStr = '';
2989 if (columnObj.exclude === true) {
2990 if (columnObj.externally_triggered !== true) {
2991 exclude_str = '<span class="yadcf-exclude-wrapper" onmousedown="yadcf.stopPropagation(event);" onclick="yadcf.stopPropagation(event);">' +
2992 '<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>';
2994 exclude_str = '<span class="yadcf-exclude-wrapper" onmousedown="yadcf.stopPropagation(event);" onclick="yadcf.stopPropagation(event);">' +
2995 '<div class="yadcf-label small">' + columnObj.exclude_label + '</div><input type="checkbox" title="' + columnObj.exclude_label + '" onclick="yadcf.stopPropagation(event);"></span>';
2999 $(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);" +
3000 "' placeholder='" + filter_default_label + "'" + " filter_match_mode='" + filter_match_mode + "' " + filterActionStr + "></input>");
3002 if (filter_reset_button_text !== false) {
3003 $(filter_selector_string).find(".yadcf-filter").after("<button type=\"button\" " + " id=\"yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "-reset\" onmousedown=\"yadcf.stopPropagation(event);\" " +
3004 "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>");
3007 if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
3008 tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
3009 if (columnObj.exclude === true) {
3010 if (tmpStr.indexOf('^((?!') !== -1) {
3011 $('#yadcf-filter-wrapper-' + table_selector_jq_friendly + '-' + column_number).find(':checkbox').prop('checked', true);
3013 tmpStr = tmpStr.substring(5, tmpStr.indexOf(').)'));
3015 tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
3016 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
3019 } else if (columnObj.filter_type === "date" || columnObj.filter_type === 'date_custom_func') {
3021 addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format);
3023 } else if (columnObj.filter_type === "range_number") {
3025 addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char);
3027 } else if (columnObj.filter_type === "range_number_slider") {
3029 addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char);
3031 } else if (columnObj.filter_type === "range_date") {
3033 addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format);
3038 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") {
3039 $(filter_selector_string).find(".yadcf-filter").val($(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val"));
3041 if (columnObj.filter_type === "auto_complete") {
3042 columnObj.filter_plugin_options = {
3043 source: $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number),
3044 select: autocompleteSelect
3046 if (columnObj.externally_triggered === true) {
3047 delete columnObj.filter_plugin_options.select;
3049 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).autocomplete(columnObj.filter_plugin_options);
3050 if (settingsDt.aoPreSearchCols[column_position].sSearch !== '') {
3051 tmpStr = settingsDt.aoPreSearchCols[column_position].sSearch;
3052 tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode);
3053 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse");
3058 if (exFilterColumnQueue.length > 0) {
3059 (exFilterColumnQueue.shift())();
3063 function rangeClear(table_selector_jq_friendly, event, column_number) {
3064 var oTable = oTables[table_selector_jq_friendly],
3067 column_number_filter,
3068 currentFilterValues,
3070 fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number,
3071 toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number,
3075 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3076 event = eventTargetFixUp(event);
3077 settingsDt = getSettingsObjFromTable(oTable);
3079 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
3081 currentFilterValues = exGetColumnFilterVal(oTable, column_number);
3082 if (currentFilterValues.from === '' && currentFilterValues.to === '') {
3086 columnObj = getOptions(oTable.selector)[column_number];
3088 $(event.target).parent().find(".yadcf-filter-range").val("");
3089 if ($(event.target).parent().find(".yadcf-filter-range-number").length > 0) {
3090 $($(event.target).parent().find(".yadcf-filter-range")[0]).focus();
3093 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
3094 saveStateSave(oTable, column_number, table_selector_jq_friendly, '', '');
3097 oTable.fnFilter('', column_number_filter);
3100 if (!oTable.fnSettings().oLoadedState) {
3101 oTable.fnSettings().oLoadedState = {};
3102 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3104 if (oTable.fnSettings().oFeatures.bStateSave === true) {
3105 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
3106 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
3113 yadcfState[table_selector_jq_friendly] = [];
3114 yadcfState[table_selector_jq_friendly][column_number] = {
3118 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
3120 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3124 $(event.target).parent().find(".yadcf-filter-range").removeClass("inuse");
3125 if (columnObj.datepicker_type === 'bootstrap-datepicker') {
3126 $fromInput = $("#" + fromId);
3127 $toInput = $("#" + toId);
3128 $fromInput.datepicker('update');
3129 $toInput.datepicker('update');
3135 function rangeNumberSliderClear(table_selector_jq_friendly, event) {
3136 var oTable = oTables[table_selector_jq_friendly],
3139 currentFilterValues,
3142 event = eventTargetFixUp(event);
3143 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3145 column_number = parseInt($(event.target).prev().find(".yadcf-filter-range-number-slider").attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-slider-", ""), 10);
3147 min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text();
3148 max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text();
3150 currentFilterValues = exGetColumnFilterVal(oTable, column_number);
3151 if (+currentFilterValues.from === min_val && +currentFilterValues.to === max_val) {
3155 $(event.target).prev().find(".yadcf-filter-range-number-slider").slider("option", "yadcf-reset", true);
3156 $(event.target).prev().find(".yadcf-filter-range-number-slider").slider("option", "values", [min_val, max_val]);
3158 $($(event.target).prev().find(".ui-slider-handle")[0]).attr("tabindex", -1).focus();
3160 $($(event.target).prev().find(".ui-slider-handle")[0]).removeClass("inuse");
3161 $($(event.target).prev().find(".ui-slider-handle")[1]).removeClass("inuse");
3162 $(event.target).prev().find(".ui-slider-range").removeClass("inuse");
3170 function dateKeyUP(table_selector_jq_friendly, date_format, event) {
3177 event = eventTargetFixUp(event);
3179 dateId = event.target.id;
3180 date = document.getElementById(dateId).value;
3182 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3183 oTable = oTables[table_selector_jq_friendly];
3184 column_number = parseInt(dateId.replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10);
3185 columnObj = getOptions(oTable.selector)[column_number];
3188 if (columnObj.datepicker_type === 'jquery-ui') {
3189 if (date.length === (date_format.length + 2)) {
3190 date = (date !== "") ? $.datepicker.parseDate(date_format, date) : date;
3195 if (date instanceof Date || moment(date, columnObj.date_format).isValid()) {
3196 $("#" + dateId).addClass('inuse');
3197 if (columnObj.filter_type !== 'date_custom_func') {
3198 oTable.fnFilter(document.getElementById(dateId).value, column_number);
3201 doFilterCustomDateFunc({ value: date }, table_selector_jq_friendly, column_number);
3203 } else if (date === "" || $.trim(event.target.value) === '') {
3204 $("#" + dateId).removeClass('inuse');
3205 $('#' + event.target.id).removeClass('inuse');
3206 oTable.fnFilter('', column_number);
3211 function rangeDateKeyUP(table_selector_jq_friendly, date_format, event) {
3221 column_number_filter,
3226 event = eventTargetFixUp(event);
3227 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3229 oTable = oTables[table_selector_jq_friendly];
3231 column_number = parseInt($(event.target).attr("id").replace('-from-date-', '').replace('-to-date-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10);
3232 columnObj = getOptions(oTable.selector)[column_number];
3233 settingsDt = getSettingsObjFromTable(oTable);
3234 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
3236 if (columnObj.datepicker_type === 'bootstrap-datepicker') {
3237 dpg = $.fn.datepicker.DPGlobal;
3240 keyUp = function () {
3241 if (event.target.id.indexOf("-from-") !== -1) {
3242 fromId = event.target.id;
3243 toId = event.target.id.replace("-from-", "-to-");
3245 toId = event.target.id;
3246 fromId = event.target.id.replace("-to-", "-from-");
3249 min = document.getElementById(fromId).value;
3250 max = document.getElementById(toId).value;
3252 if (columnObj.datepicker_type === 'jquery-ui') {
3254 if (min.length === (date_format.length + 2)) {
3255 min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min;
3259 if (max.length === (date_format.length + 2)) {
3260 max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max;
3263 } else if (columnObj.datepicker_type === 'bootstrap-datetimepicker') {
3265 min = moment(min, columnObj.moment_date_format).toDate();
3266 if (isNaN(min.getTime())) {
3271 max = moment(max, columnObj.moment_date_format).toDate();
3272 if (isNaN(max.getTime())) {
3276 } else if (columnObj.datepicker_type === 'bootstrap-datepicker') {
3278 min = dpg.parseDate(min, dpg.parseFormat(columnObj.date_format));
3279 if (isNaN(min.getTime())) {
3284 max = dpg.parseDate(max, dpg.parseFormat(columnObj.date_format));
3285 if (isNaN(max.getTime())) {
3291 if (((max instanceof Date) && (min instanceof Date) && (max >= min)) || !min || !max) {
3293 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
3294 minTmp = document.getElementById(fromId).value;
3295 maxTmp = document.getElementById(toId).value;
3296 saveStateSave(oTable, column_number, table_selector_jq_friendly, !min ? '' : minTmp , !max ? '' : maxTmp);
3299 oTable.fnFilter(document.getElementById(fromId).value + '-yadcf_delim-' + document.getElementById(toId).value, column_number_filter);
3302 if (min instanceof Date) {
3303 $("#" + fromId).addClass("inuse");
3305 $("#" + fromId).removeClass("inuse");
3307 if (max instanceof Date) {
3308 $("#" + toId).addClass("inuse");
3310 $("#" + toId).removeClass("inuse");
3313 if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) {
3314 $("#" + event.target.id).removeClass("inuse");
3321 if (columnObj.filter_delay === undefined) {
3322 keyUp(table_selector_jq_friendly, event);
3324 yadcfDelay(function () {
3325 keyUp(table_selector_jq_friendly, event);
3326 }, columnObj.filter_delay);
3330 function rangeNumberKeyUP(table_selector_jq_friendly, event) {
3331 var oTable = oTables[table_selector_jq_friendly],
3341 column_number_filter;
3343 event = eventTargetFixUp(event);
3344 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3346 column_number = parseInt($(event.target).attr("id").replace('-from-', '').replace('-to-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10);
3347 columnObj = getOptions(oTable.selector)[column_number];
3348 settingsDt = getSettingsObjFromTable(oTable);
3349 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
3351 keyUp = function () {
3352 if (event.target.id.indexOf("-from-") !== -1) {
3353 fromId = event.target.id;
3354 toId = event.target.id.replace("-from-", "-to-");
3356 min = document.getElementById(fromId).value;
3357 max = document.getElementById(toId).value;
3359 toId = event.target.id;
3360 fromId = event.target.id.replace("-to-", "-from-");
3362 max = document.getElementById(toId).value;
3363 min = document.getElementById(fromId).value;
3366 min = (min !== "") ? (+min) : min;
3367 max = (max !== "") ? (+max) : max;
3369 if ((!isNaN(max) && !isNaN(min) && (max >= min)) || min === "" || max === "") {
3371 if (oTable.fnSettings().oFeatures.bServerSide !== true) {
3374 oTable.fnFilter(min + '-yadcf_delim-' + max, column_number_filter);
3376 if (document.getElementById(fromId).value !== "") {
3377 $("#" + fromId).addClass("inuse");
3379 if (document.getElementById(toId).value !== "") {
3380 $("#" + toId).addClass("inuse");
3383 if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) {
3384 $("#" + event.target.id).removeClass("inuse");
3386 if (!oTable.fnSettings().oLoadedState) {
3387 oTable.fnSettings().oLoadedState = {};
3388 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3390 if (oTable.fnSettings().oFeatures.bStateSave === true) {
3391 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
3392 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] =
3399 yadcfState[table_selector_jq_friendly] = [];
3400 yadcfState[table_selector_jq_friendly][column_number] = {
3404 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
3406 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3412 if (columnObj.filter_delay === undefined) {
3415 yadcfDelay(function () {
3417 }, columnObj.filter_delay);
3421 function doFilterMultiTablesMultiSelect(tablesSelectors, event, column_number_str, clear) {
3423 var columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3428 tablesArray = oTables[tablesSelectors],
3429 selected_values = $(event.target).val(),
3432 event = eventTargetFixUp(event);
3433 tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3435 if (clear !== undefined || !selected_values || selected_values.length === 0) {
3436 if (clear !== undefined) {
3437 $(event.target).parent().find('select').val('-1').focus();
3438 $(event.target).parent().find('selectn ').removeClass("inuse");
3440 if (columnsObj.column_number instanceof Array) {
3441 tablesAsOne.columns(columnsObj.column_number).search('').draw();
3443 tablesAsOne.search('').draw();
3446 refreshSelectPlugin(columnsObj, $('#' + columnsObj.filter_container_id + ' select'), '-1');
3450 $(event.target).addClass("inuse");
3454 caseInsen = columnsObj.case_insensitive;
3456 if (selected_values !== null) {
3457 for (i = selected_values.length - 1; i >= 0; i--) {
3458 if (selected_values[i] === "-1") {
3459 selected_values.splice(i, 1);
3463 if (selected_values.length !== 0) {
3464 selected_values = selected_values.join('narutouzomaki');
3465 selected_values = selected_values.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
3466 selected_values = selected_values.split('narutouzomaki').join('|');
3469 if (columnsObj.filter_match_mode === "exact") {
3470 selected_values = "^" + selected_values + "$";
3471 } else if (columnsObj.filter_match_mode === "startsWith") {
3472 selected_values = "^" + selected_values;
3474 if (columnsObj.column_number instanceof Array) {
3475 tablesAsOne.columns(columnsObj.column_number).search(selected_values, regex, smart, caseInsen).draw();
3477 tablesAsOne.search(selected_values, regex, smart, caseInsen).draw();
3481 function doFilterMultiTables(tablesSelectors, event, column_number_str, clear) {
3483 var columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3489 tablesArray = oTables[tablesSelectors];
3491 event = eventTargetFixUp(event);
3492 tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3494 if (clear !== undefined || event.target.value === '-1') {
3495 if (clear !== undefined) {
3496 $(event.target).parent().find('select').val('-1').focus();
3497 $(event.target).parent().find('select').removeClass("inuse");
3499 if (columnsObj.column_number instanceof Array) {
3500 tablesAsOne.columns(columnsObj.column_number).search('').draw();
3502 tablesAsOne.search('').draw();
3505 refreshSelectPlugin(columnsObj, $('#' + columnsObj.filter_container_id + ' select'), '-1');
3510 $(event.target).addClass("inuse");
3512 serachVal = event.target.value;
3514 caseInsen = columnsObj.case_insensitive;
3516 if (columnsObj.filter_match_mode === "contains") {
3518 } else if (columnsObj.filter_match_mode === "exact") {
3520 serachVal = "^" + serachVal + "$";
3521 } else if (columnsObj.filter_match_mode === "startsWith") {
3523 serachVal = "^" + serachVal;
3525 if (columnsObj.column_number instanceof Array) {
3526 tablesAsOne.columns(columnsObj.column_number).search(serachVal, regex, smart, caseInsen).draw();
3528 tablesAsOne.search(serachVal, regex, smart, caseInsen).draw();
3532 function textKeyUpMultiTables(tablesSelectors, event, column_number_str, clear) {
3535 columnsObj = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3541 tablesArray = oTables[tablesSelectors];
3543 event = eventTargetFixUp(event);
3544 tablesAsOne = new $.fn.dataTable.Api(tablesArray);
3546 keyUp = function (tablesAsOne, event, clear) {
3548 if (clear !== undefined || event.target.value === '') {
3549 if (clear !== undefined) {
3550 $(event.target).prev().val("").focus();
3551 $(event.target).prev().removeClass("inuse");
3553 $(event.target).val("").focus();
3554 $(event.target).removeClass("inuse");
3556 if (columnsObj.column_number instanceof Array) {
3557 tablesAsOne.columns(columnsObj.column_number).search('').draw();
3559 tablesAsOne.search('').draw();
3564 $(event.target).addClass("inuse");
3566 serachVal = event.target.value;
3568 caseInsen = columnsObj.case_insensitive;
3570 if (columnsObj.filter_match_mode === "contains") {
3572 } else if (columnsObj.filter_match_mode === "exact") {
3574 serachVal = "^" + serachVal + "$";
3575 } else if (columnsObj.filter_match_mode === "startsWith") {
3577 serachVal = "^" + serachVal;
3580 if (columnsObj.column_number instanceof Array) {
3581 tablesAsOne.columns(columnsObj.column_number).search(serachVal, regex, smart, caseInsen).draw();
3583 tablesAsOne.search(serachVal, regex, smart, caseInsen).draw();
3588 if (columnsObj.filter_delay === undefined) {
3589 keyUp(tablesAsOne, event, clear);
3591 yadcfDelay(function () {
3592 keyUp(tablesAsOne, event, clear);
3593 }, columnsObj.filter_delay);
3597 function textKeyUP(ev, table_selector_jq_friendly, column_number, clear) {
3598 var column_number_filter,
3599 oTable = oTables[table_selector_jq_friendly],
3602 settingsDt = getSettingsObjFromTable(oTable),
3604 keyCodes = [37, 38, 39, 40];
3606 if (keyCodes.indexOf(ev.keyCode) !== -1) {
3609 column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
3611 columnObj = getOptions(oTable.selector)[column_number];
3613 keyUp = function (table_selector_jq_friendly, column_number, clear) {
3614 var fixedPrefix = '';
3615 if (settingsDt._fixedHeader !== undefined && $('.fixedHeader-floating').is(":visible")) {
3616 fixedPrefix = '.fixedHeader-floating ';
3618 if (columnObj.filters_position === 'tfoot' && settingsDt.nScrollFoot) {
3619 fixedPrefix = '.' + settingsDt.nScrollFoot.className + ' ';
3621 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3623 if (clear === 'clear' || $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val() === '') {
3624 if (clear === 'clear' && exGetColumnFilterVal(oTable, column_number) === '') {
3628 $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus();
3629 $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
3630 oTable.fnFilter("", column_number_filter);
3635 if (columnObj.exclude === true) {
3636 exclude = $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).closest('.yadcf-filter-wrapper').find('.yadcf-exclude-wrapper :checkbox').prop('checked');
3638 $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse");
3640 yadcfMatchFilter(oTable, $(fixedPrefix + "#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val(), columnObj.filter_match_mode, column_number_filter, exclude, column_number);
3645 if (columnObj.filter_delay === undefined) {
3646 keyUp(table_selector_jq_friendly, column_number, clear);
3648 yadcfDelay(function () {
3649 keyUp(table_selector_jq_friendly, column_number, clear);
3650 }, columnObj.filter_delay);
3654 function autocompleteKeyUP(table_selector_jq_friendly, event) {
3657 keyCodes = [37, 38, 39, 40];
3659 event = eventTargetFixUp(event);
3661 if (keyCodes.indexOf(event.keyCode) !== -1) {
3665 if (event.target.value === "" && event.keyCode === 8 && $(event.target).hasClass("inuse")) {
3666 $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
3667 oTable = oTables[table_selector_jq_friendly];
3668 column_number = parseInt($(event.target).attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10);
3670 $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse");
3671 $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
3672 oTable.fnFilter("", column_number);
3677 function isDOMSource(tableVar) {
3679 settingsDt = getSettingsObjFromTable(tableVar);
3680 if (!settingsDt.sAjaxSource && !settingsDt.ajax && settingsDt.oFeatures.bServerSide !== true) {
3686 function scrollXYHandler(oTable, table_selector) {
3688 filters_position = $(document).data(table_selector + "_filters_position"),
3689 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable);
3691 if (filters_position === 'thead') {
3692 filters_position = '.dataTables_scrollHead';
3694 filters_position = '.dataTables_scrollFoot';
3696 if (oTable.fnSettings().oScroll.sX !== '' || oTable.fnSettings().oScroll.sY !== '') {
3697 $tmpSelector = $(table_selector).closest('.dataTables_scroll').find(filters_position + ' table');
3698 $tmpSelector.addClass('yadcf-datatables-table-' + table_selector_jq_friendly);
3702 function firstFromObject(obj) {
3705 if (obj.hasOwnProperty(key)) {
3711 function initAndBindTable(oTable, table_selector, index, pTableDT) {
3713 var table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(oTable),
3715 oTables[table_selector_jq_friendly] = oTable;
3716 tablesDT[table_selector_jq_friendly] = pTableDT;
3717 oTablesIndex[table_selector_jq_friendly] = index;
3719 scrollXYHandler(oTable, table_selector);
3721 if (isDOMSource(oTable)) {
3722 table_selector_tmp = table_selector;
3723 if (table_selector.indexOf(":eq") !== -1) {
3724 table_selector_tmp = table_selector.substring(0, table_selector.lastIndexOf(":eq"));
3726 appendFilters(oTable, getOptions(table_selector_tmp), table_selector);
3727 if (getOptions(table_selector_tmp)[firstFromObject(getOptions(table_selector_tmp))].cumulative_filtering === true) {
3728 //when filters should be populated only from visible rows (non filtered)
3729 $(document).off('search.dt', oTable.selector).on('search.dt', oTable.selector, function (e, settings, json) {
3730 var table_selector_tmp = oTable.selector;
3731 if (table_selector.indexOf(":eq") !== -1) {
3732 table_selector_tmp = table_selector.substring(0, table_selector.lastIndexOf(":eq"));
3734 appendFilters(oTable, getOptions(table_selector_tmp), oTable.selector, settings);
3738 appendFilters(oTable, getOptions(table_selector), table_selector);
3739 if (yadcfVersionCheck('1.10')) {
3740 $(document).off('xhr.dt', oTable.selector).on('xhr.dt', oTable.selector, function (e, settings, json) {
3742 column_number_filter,
3743 table_selector_jq_friendly = generateTableSelectorJQFriendly2(oTable);
3745 console.log('datatables xhr.dt event came back with null as data (nothing for yadcf to do with it).');
3748 if (settings.oSavedState !== null) {
3749 initColReorder2(settings, table_selector_jq_friendly);
3751 for (col_num in yadcf.getOptions(settings.oInstance.selector)) {
3752 if (yadcf.getOptions(settings.oInstance.selector).hasOwnProperty(col_num)) {
3753 if (json['yadcf_data_' + col_num] !== undefined) {
3754 column_number_filter = col_num;
3755 if (settings.oSavedState !== null && plugins[table_selector_jq_friendly] !== undefined) {
3756 column_number_filter = plugins[table_selector_jq_friendly].ColReorder[col_num];
3758 yadcf.getOptions(settings.oInstance.selector)[col_num].data = json['yadcf_data_' + column_number_filter];
3765 //events that affects both DOM and Ajax
3766 if (yadcfVersionCheck('1.10')) {
3767 $(document).off('draw.dt', oTable.selector).on('draw.dt', oTable.selector, function (event, settings) {
3768 appendFilters(oTable, yadcf.getOptions(settings.oInstance.selector), settings.oInstance.selector, settings);
3770 $(document).off('column-visibility.dt', oTable.selector).on('column-visibility.dt', oTable.selector, function (e, settings, col_num, state) {
3772 columnsObj = getOptions(settings.oInstance.selector);
3773 if (state === true && settings._oFixedColumns === undefined) {
3774 if ((plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
3775 col_num = plugins[table_selector_jq_friendly].ColReorder[col_num];
3776 } else if (settings.oSavedState && settings.oSavedState.ColReorder !== undefined) {
3777 col_num = settings.oSavedState.ColReorder[col_num];
3779 obj[col_num] = yadcf.getOptions(settings.oInstance.selector)[col_num];
3780 if (obj[col_num] !== undefined) {
3781 obj[col_num].column_number = col_num;
3782 if (obj[col_num] !== undefined) {
3783 appendFilters(oTables[yadcf.generateTableSelectorJQFriendly2(settings)],
3785 settings.oInstance.selector, settings);
3788 } else if (settings._oFixedColumns !== undefined) {
3789 appendFilters(oTables[yadcf.generateTableSelectorJQFriendly2(settings)],
3791 settings.oInstance.selector, settings);
3794 $(document).off('column-reorder.dt', oTable.selector).on('column-reorder.dt', oTable.selector, function (e, settings, json) {
3795 var table_selector_jq_friendly = generateTableSelectorJQFriendly2(oTable);
3796 initColReorderFromEvent(table_selector_jq_friendly);
3798 $(document).off('destroy.dt', oTable.selector).on('destroy.dt', oTable.selector, function (event, ui) {
3799 removeFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector);
3802 $(document).off('draw', oTable.selector).on('draw', oTable.selector, function (event, settings) {
3803 appendFilters(oTable, yadcf.getOptions(settings.oInstance.selector), settings.oInstance.selector, settings);
3805 $(document).off('destroy', oTable.selector).on('destroy', oTable.selector, function (event, ui) {
3806 removeFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector);
3809 if (oTable.fnSettings().oFeatures.bStateSave === true) {
3810 if (yadcfVersionCheck('1.10')) {
3811 $(oTable.selector).off('stateSaveParams.dt').on('stateSaveParams.dt', function (e, settings, data) {
3812 if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) {
3813 data.yadcfState = settings.oLoadedState.yadcfState;
3815 data.naruto = 'kurama';
3819 $(oTable.selector).off('stateSaveParams').on('stateSaveParams', function (e, settings, data) {
3820 if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) {
3821 data.yadcfState = settings.oLoadedState.yadcfState;
3823 data.naruto = 'kurama';
3827 //when using DOM source
3828 if (isDOMSource(oTable)) {
3829 //we need to make sure that the yadcf state will be saved after page reload
3830 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
3831 //redraw the table in order to apply the filters
3832 oTable.fnDraw(false);
3837 $.fn.yadcf = function (options_arg, params) {
3842 tableSelector = '#' + this.fnSettings().sTableId;
3844 //in case that instance.selector will be undefined (jQuery 3)
3845 if (this.selector === undefined) {
3846 this.selector = tableSelector;
3849 if (params === undefined) {
3853 if (typeof params === 'string') {
3856 params.filters_position = tmpParams;
3858 if (params.filters_position === undefined || params.filters_position === 'header') {
3859 params.filters_position = 'thead';
3861 params.filters_position = 'tfoot';
3863 if (params.language !== undefined) {
3864 for (tmpParams in placeholderLang) {
3865 if (placeholderLang.hasOwnProperty(tmpParams)) {
3866 if (params.language[tmpParams] !== undefined) {
3867 placeholderLang[tmpParams] = params.language[tmpParams];
3872 $(document).data(this.selector + "_filters_position", params.filters_position);
3874 if ($(this.selector).length === 1) {
3875 setOptions(this.selector, options_arg, params);
3876 initAndBindTable(this, this.selector, 0);
3878 for (i; i < $(this.selector).length; i++) {
3879 $.fn.dataTableExt.iApiIndex = i;
3880 selector = this.selector + ":eq(" + i + ")";
3881 setOptions(this.selector, options_arg, params);
3882 initAndBindTable(this, selector, i);
3884 $.fn.dataTableExt.iApiIndex = 0;
3887 if (params !== undefined && params.onInitComplete !== undefined) {
3888 params.onInitComplete();
3893 function init(oTable, options_arg, params) {
3894 var instance = oTable.settings()[0].oInstance,
3898 tableSelector = '#' + oTable.table().node().id;
3900 //in case that instance.selector will be undefined (jQuery 3)
3901 if (!instance.selector) {
3902 instance.selector = tableSelector;
3905 if (params === undefined) {
3909 if (typeof params === 'string') {
3912 params.filters_position = tmpParams;
3914 if (params.filters_position === undefined || params.filters_position === 'header') {
3915 params.filters_position = 'thead';
3917 params.filters_position = 'tfoot';
3919 if (params.language !== undefined) {
3920 for (tmpParams in placeholderLang) {
3921 if (placeholderLang.hasOwnProperty(tmpParams)) {
3922 if (params.language[tmpParams] !== undefined) {
3923 placeholderLang[tmpParams] = params.language[tmpParams];
3928 $(document).data(instance.selector + "_filters_position", params.filters_position);
3930 if ($(instance.selector).length === 1) {
3931 setOptions(instance.selector, options_arg, params);
3932 initAndBindTable(instance, instance.selector, 0, oTable);
3934 for (i; i < $(instance.selector).length; i++) {
3935 $.fn.dataTableExt.iApiIndex = i;
3936 selector = instance.selector + ":eq(" + i + ")";
3937 setOptions(instance.selector, options_arg, params);
3938 initAndBindTable(instance, selector, i, oTable);
3940 $.fn.dataTableExt.iApiIndex = 0;
3943 if (params !== undefined && params.onInitComplete !== undefined) {
3944 params.onInitComplete();
3948 function appendFiltersMultipleTables(tablesArray, tablesSelectors, colObjDummy) {
3949 var filter_selector_string = "#" + colObjDummy.filter_container_id,
3950 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendlyNew(tablesSelectors),
3953 column_number_str = columnsArrayToString(colObjDummy.column_number).column_number_str,
3957 filterOptions = getOptions(tablesSelectors + '_' + column_number_str)[column_number_str],
3958 column_number_index,
3962 columnForStateSaving;
3964 //add a wrapper to hold both filter and reset button
3965 $(filter_selector_string).append("<div id=\"yadcf-filter-wrapper-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter-wrapper\"></div>");
3966 filter_selector_string += " div.yadcf-filter-wrapper";
3967 if (column_number_str.indexOf('_') !== -1) {
3968 columnForStateSaving = column_number_str.split('_')[0];
3970 columnForStateSaving = column_number_str;
3973 switch (filterOptions.filter_type) {
3975 $(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);" +
3976 "' placeholder='" + filterOptions.filter_default_label + "'" + " onkeyup=\"yadcf.textKeyUpMultiTables('" + tablesSelectors + "',event,'" + column_number_str + "');\"></input>");
3977 if (filterOptions.filter_reset_button_text !== false) {
3978 $(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);\" " +
3979 "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>");
3981 if (tablesArray[0].table !== undefined) {
3982 tableTmp = $('#' + tablesArray[0].table().node().id).dataTable();
3984 tableTmp = tablesArray[0];
3986 settingsDt = getSettingsObjFromTable(tableTmp);
3987 if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
3988 tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
3989 tmpStr = yadcfParseMatchFilter(tmpStr, filterOptions.filter_match_mode);
3990 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr).addClass("inuse");
3994 case 'multi_select':
3995 if (filterOptions.select_type === undefined) {
3996 options_tmp = "<option data-placeholder=\"true\" value=\"" + "-1" + "\">" + filterOptions.filter_default_label + "</option>";
4000 if (filterOptions.select_type === 'select2' && filterOptions.select_type_options.placeholder !== undefined && filterOptions.select_type_options.allowClear === true) {
4001 options_tmp = "<option value=\"\"></option>";
4003 if (filterOptions.data === undefined) {
4004 filterOptions.data = [];
4005 tableTmpArr = tablesSelectors.split(',');
4006 for (tableTmpArrIndex = 0; tableTmpArrIndex < tableTmpArr.length; tableTmpArrIndex++) {
4007 if (tablesArray[tableTmpArrIndex].table !== undefined) {
4008 tableTmp = $('#' + tablesArray[tableTmpArrIndex].table().node().id).dataTable();
4010 tableTmp = tablesArray[tableTmpArrIndex];
4012 if (isDOMSource(tableTmp)) {
4013 //check if ajax source, if so, listen for dt.draw
4014 columnsTmpArr = filterOptions.column_number;
4015 for (column_number_index = 0; column_number_index < columnsTmpArr.length; column_number_index++) {
4016 filterOptions.column_number = columnsTmpArr[column_number_index];
4017 filterOptions.data = filterOptions.data.concat(parseTableColumn(tableTmp, filterOptions, table_selector_jq_friendly));
4019 filterOptions.column_number = columnsTmpArr;
4021 $(document).off('draw.dt', '#' + tablesArray[tableTmpArrIndex].table().node().id).on('draw.dt', '#' + tablesArray[tableTmpArrIndex].table().node().id, function (event, ui) {
4022 var options_tmp = '',
4024 columnsTmpArr = filterOptions.column_number;
4025 for (column_number_index = 0; column_number_index < columnsTmpArr.length; column_number_index++) {
4026 filterOptions.column_number = columnsTmpArr[column_number_index];
4027 filterOptions.data = filterOptions.data.concat(parseTableColumn(tableTmp, filterOptions, table_selector_jq_friendly, ui));
4029 filterOptions.column_number = columnsTmpArr;
4030 filterOptions.data = sortColumnData(filterOptions.data, filterOptions);
4031 for (ii = 0; ii < filterOptions.data.length; ii++) {
4032 options_tmp += "<option value=\"" + filterOptions.data[ii] + "\">" + filterOptions.data[ii] + "</option>";
4034 $('#' + filterOptions.filter_container_id + ' select').empty().append(options_tmp);
4036 if (filterOptions.select_type !== undefined) {
4037 initializeSelectPlugin(filterOptions.select_type, $('#' + filterOptions.filter_container_id + ' select'), filterOptions.select_type_options);
4038 if (filterOptions.cumulative_filtering === true && filterOptions.select_type === 'chosen') {
4039 refreshSelectPlugin(filterOptions, $('#' + filterOptions.filter_container_id + ' select'));
4047 filterOptions.data = sortColumnData(filterOptions.data, filterOptions);
4049 if (tablesArray[0].table !== undefined) {
4050 tableTmp = $('#' + tablesArray[0].table().node().id).dataTable();
4052 tableTmp = tablesArray[0];
4054 settingsDt = getSettingsObjFromTable(tableTmp);
4056 if (typeof filterOptions.data[0] === 'object') {
4057 for (ii = 0; ii < filterOptions.data.length; ii++) {
4058 options_tmp += "<option value=\"" + filterOptions.data[ii].value + "\">" + filterOptions.data[ii].label + "</option>";
4061 for (ii = 0; ii < filterOptions.data.length; ii++) {
4062 options_tmp += "<option value=\"" + filterOptions.data[ii] + "\">" + filterOptions.data[ii] + "</option>";
4065 if (filterOptions.filter_type === 'select') {
4066 $(filter_selector_string).append("<select id=\"yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str + "\" class=\"yadcf-filter\" " +
4067 "onchange=\"yadcf.doFilterMultiTables('" + tablesSelectors + "',event,'" + column_number_str + "')\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + options_tmp + "</select>");
4068 if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
4069 tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
4070 tmpStr = yadcfParseMatchFilter(tmpStr, filterOptions.filter_match_mode);
4071 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr).addClass("inuse");
4073 } else if (filterOptions.filter_type === 'multi_select') {
4074 $(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\" " +
4075 "onchange=\"yadcf.doFilterMultiTablesMultiSelect('" + tablesSelectors + "',event,'" + column_number_str + "')\" onmousedown=\"yadcf.stopPropagation(event);\" onclick='yadcf.stopPropagation(event);'>" + options_tmp + "</select>");
4076 if (settingsDt.aoPreSearchCols[columnForStateSaving].sSearch !== '') {
4077 tmpStr = settingsDt.aoPreSearchCols[columnForStateSaving].sSearch;
4078 tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, filterOptions.filter_match_mode);
4079 tmpStr = tmpStr.replace(/\\/g, "");
4080 tmpStr = tmpStr.split("|");
4081 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number_str).val(tmpStr);
4084 if (filterOptions.filter_type === 'select') {
4085 if (filterOptions.filter_reset_button_text !== false) {
4086 $(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);\" " +
4087 "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>");
4089 } else if (filterOptions.filter_type === 'multi_select') {
4090 if (filterOptions.filter_reset_button_text !== false) {
4091 $(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);\" " +
4092 "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>");
4096 if (filterOptions.select_type !== undefined) {
4097 initializeSelectPlugin(filterOptions.select_type, $("#yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str), filterOptions.select_type_options);
4098 if (filterOptions.cumulative_filtering === true && filterOptions.select_type === 'chosen') {
4099 refreshSelectPlugin(filterOptions, $("#yadcf-filter-" + table_selector_jq_friendly + '-' + column_number_str));
4104 alert('Filters Multiple Tables does not support ' + filterOptions.filter_type);
4108 function initMultipleTables(tablesArray, filtersOptions) {
4110 tablesSelectors = '',
4112 filter_type: "text",
4113 filter_container_id: '',
4114 filter_reset_button_text: 'x',
4115 case_insensitive: true
4123 for (columnsArrIndex = 0; columnsArrIndex < filtersOptions.length; columnsArrIndex++) {
4125 columnsObj = filtersOptions[columnsArrIndex];
4126 if (columnsObj.filter_default_label === undefined) {
4127 if (columnsObj.filter_type === "select" || columnsObj.filter_type === 'custom_func') {
4128 columnsObj.filter_default_label = "Select value";
4129 } else if (columnsObj.filter_type === "multi_select" || columnsObj.filter_type === 'multi_select_custom_func') {
4130 columnsObj.filter_default_label = "Select values";
4131 } else if (columnsObj.filter_type === "auto_complete" || columnsObj.filter_type === "text") {
4132 columnsObj.filter_default_label = 'Type to filter';
4133 } else if (columnsObj.filter_type === "range_number" || columnsObj.filter_type === "range_date") {
4134 columnsObj.filter_default_label = ["from", "to"];
4135 } else if (columnsObj.filter_type === "date") {
4136 columnsObj.filter_default_label = "Select a date";
4139 columnsObj = $.extend({}, default_options, columnsObj);
4141 column_number_str = columnsArrayToString(columnsObj.column_number).column_number_str;
4142 columnsObj.column_number_str = column_number_str;
4144 dummyArr.push(columnsObj);
4145 tablesSelectors = '';
4146 for (i = 0; i < tablesArray.length; i++) {
4147 if (tablesArray[i].table !== undefined) {
4148 tablesSelectors += tablesArray[i].table().node().id + ',';
4150 tablesSelectors += getSettingsObjFromTable(tablesArray[i]).sTableId;
4153 tablesSelectors = tablesSelectors.substring(0, tablesSelectors.length - 1);
4155 setOptions(tablesSelectors + '_' + column_number_str, dummyArr);
4156 oTables[tablesSelectors] = tablesArray;
4157 appendFiltersMultipleTables(tablesArray, tablesSelectors, columnsObj);
4161 function initMultipleColumns(table, filtersOptions) {
4162 var tablesArray = [];
4163 tablesArray.push(table);
4164 initMultipleTables(tablesArray, filtersOptions);
4167 function close3rdPPluginsNeededClose(evt) {
4168 if (closeBootstrapDatepickerRange) {
4169 $('.yadcf-filter-range-date').not($(evt.target)).datepicker('hide');
4171 if (closeBootstrapDatepicker) {
4172 $('.yadcf-filter-date').not($(evt.target)).datepicker('hide');
4176 if (evt.target.className.indexOf('yadcf-filter-reset-button') !== -1) {
4177 $('select.yadcf-filter').select2('close');
4179 currentSelect2 = $($(evt.target).closest('.yadcf-filter-wrapper').find('select'));
4180 $('select.yadcf-filter').not(currentSelect2).select2('close');
4185 function stopPropagation(evt) {
4186 close3rdPPluginsNeededClose(evt);
4187 if (evt.stopPropagation !== undefined) {
4188 evt.stopPropagation();
4190 evt.cancelBubble = true;
4194 function preventDefaultForEnter(evt) {
4195 if (evt.keyCode === 13) {
4196 if (evt.preventDefault) {
4197 evt.preventDefault();
4199 evt.returnValue = false;
4204 //--------------------------------------------------------
4205 function exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr) {
4206 return function () {
4207 exFilterColumn(table_arg, col_filter_arr, true);
4211 function exFilterColumn(table_arg, col_filter_arr, ajaxSource) {
4212 var table_selector_jq_friendly,
4225 //check if the table arg is from new datatables API (capital "D")
4226 if (table_arg.settings !== undefined) {
4227 table_arg = table_arg.settings()[0].oInstance;
4229 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
4230 if (isDOMSource(table_arg) || ajaxSource === true) {
4231 for (j = 0; j < col_filter_arr.length; j++) {
4232 column_number = col_filter_arr[j][0];
4233 column_position = column_number;
4235 if (plugins[table_selector_jq_friendly] !== undefined && (plugins[table_selector_jq_friendly] !== undefined && plugins[table_selector_jq_friendly].ColReorder !== undefined)) {
4236 column_position = plugins[table_selector_jq_friendly].ColReorder[column_number];
4238 optionsObj = getOptions(table_arg.selector)[column_number];
4239 filter_value = col_filter_arr[j][1];
4241 switch (optionsObj.filter_type) {
4242 case 'auto_complete':
4245 if (filter_value !== undefined && filter_value.indexOf('_exclude_') !== -1) {
4247 filter_value = filter_value.replace('_exclude_', '');
4249 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
4250 if (filter_value !== '') {
4251 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
4253 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
4255 tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, false, exclude);
4256 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = tmpStr;
4259 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
4260 if (filter_value !== '') {
4261 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
4263 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
4265 tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, false);
4266 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = tmpStr;
4267 if (optionsObj.select_type !== undefined) {
4268 refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number));
4271 case 'multi_select':
4272 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
4273 tmpStr = yadcfMatchFilterString(table_arg, column_position, filter_value, optionsObj.filter_match_mode, true);
4274 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = tmpStr;
4275 if (optionsObj.select_type !== undefined) {
4276 refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number));
4280 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
4281 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
4282 $('#' + fromId).val(filter_value.from);
4283 if (filter_value.from !== '') {
4284 $('#' + fromId).addClass('inuse');
4286 $('#' + fromId).removeClass('inuse');
4288 $('#' + toId).val(filter_value.to);
4289 if (filter_value.to !== '') {
4290 $('#' + toId).addClass('inuse');
4292 $('#' + toId).removeClass('inuse');
4294 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4295 min = filter_value.from;
4296 max = filter_value.to;
4297 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = min + '-yadcf_delim-' + max;
4299 saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
4301 case 'range_number':
4302 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
4303 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
4304 $('#' + fromId).val(filter_value.from);
4305 if (filter_value.from !== '') {
4306 $('#' + fromId).addClass('inuse');
4308 $('#' + fromId).removeClass('inuse');
4310 $('#' + toId).val(filter_value.to);
4311 if (filter_value.to !== '') {
4312 $('#' + toId).addClass('inuse');
4314 $('#' + toId).removeClass('inuse');
4316 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4317 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = filter_value.from + '-yadcf_delim-' + filter_value.to;
4319 saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
4321 case 'range_number_slider':
4322 sliderId = 'yadcf-filter-' + table_selector_jq_friendly + '-slider-' + column_number;
4323 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
4324 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number;
4325 if (filter_value.from !== '') {
4326 min = $('#' + fromId).closest('.yadcf-filter-range-number-slider').find(".yadcf-filter-range-number-slider-min-tip-hidden").text();
4327 max = $('#' + fromId).closest('.yadcf-filter-range-number-slider').find(".yadcf-filter-range-number-slider-max-tip-hidden").text();
4328 $('#' + fromId).text(filter_value.from);
4329 if (min !== filter_value.from) {
4330 $('#' + fromId).parent().addClass('inuse');
4331 $('#' + fromId).parent().parent().find('ui-slider-range').addClass('inuse');
4333 $('#' + fromId).parent().removeClass('inuse');
4334 $('#' + fromId).parent().parent().find('ui-slider-range').removeClass('inuse');
4336 $('#' + sliderId).slider('values', 0, filter_value.from);
4338 if (filter_value.to !== '') {
4339 $('#' + toId).text(filter_value.to);
4340 if (max !== filter_value.to) {
4341 $('#' + toId).parent().addClass('inuse');
4342 $('#' + toId).parent().parent().find('.ui-slider-range').addClass('inuse');
4344 $('#' + toId).parent().removeClass('inuse');
4345 $('#' + toId).parent().parent().find('.ui-slider-range').removeClass('inuse');
4347 $('#' + sliderId).slider('values', 1, filter_value.to);
4349 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4350 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = filter_value.from + '-yadcf_delim-' + filter_value.to;
4352 saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value.from, filter_value.to);
4355 case 'multi_select_custom_func':
4356 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value);
4357 if (filter_value !== '') {
4358 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass('inuse');
4360 $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).removeClass('inuse');
4362 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4363 table_arg.fnSettings().aoPreSearchCols[column_position].sSearch = filter_value;
4365 if (optionsObj.select_type !== undefined) {
4366 refreshSelectPlugin(optionsObj, $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number), filter_value);
4368 saveStateSave(table_arg, column_number, table_selector_jq_friendly, filter_value, '');
4372 if (table_arg.fnSettings().oFeatures.bServerSide !== true) {
4375 setTimeout(function () {
4380 exFilterColumnQueue.push(exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr));
4384 function exGetColumnFilterVal(table_arg, column_number) {
4388 table_selector_jq_friendly,
4392 //check if the table arg is from new datatables API (capital "D")
4393 if (table_arg.settings !== undefined) {
4394 table_arg = table_arg.settings()[0].oInstance;
4397 optionsObj = getOptions(table_arg.selector)[column_number];
4398 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
4400 $filterElement = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number);
4401 switch (optionsObj.filter_type) {
4404 retVal = $filterElement.val();
4405 if (retVal === '-1') {
4409 case 'auto_complete':
4412 case 'date_custom_func':
4413 retVal = $filterElement.val();
4414 if ($filterElement.prev().hasClass('yadcf-exclude-wrapper') && $filterElement.prev().find('input').prop('checked') === true) {
4415 retVal = '_exclude_' + retVal;
4418 case 'multi_select':
4419 retVal = $filterElement.val();
4420 if (retVal === null) {
4426 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
4427 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
4429 retVal.from = $('#' + fromId).val();
4430 retVal.to = $('#' + toId).val();
4432 case 'range_number':
4434 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
4435 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
4437 retVal.from = $('#' + fromId).val();
4438 retVal.to = $('#' + toId).val();
4440 case 'range_number_slider':
4442 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
4443 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number;
4445 retVal.from = $('#' + fromId).text();
4446 retVal.to = $('#' + toId).text();
4450 console.log('exGetColumnFilterVal error: no such filter_type: ' + optionsObj.filter_type);
4455 function clearStateSave(oTable, column_number, table_selector_jq_friendly) {
4457 if (oTable.fnSettings().oFeatures.bStateSave === true) {
4458 if (!oTable.fnSettings().oLoadedState) {
4459 oTable.fnSettings().oLoadedState = {};
4460 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4462 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
4463 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = undefined;
4466 yadcfState[table_selector_jq_friendly] = [];
4467 yadcfState[table_selector_jq_friendly][column_number] = undefined;
4468 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
4470 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4474 function saveStateSave(oTable, column_number, table_selector_jq_friendly, from, to) {
4476 if (oTable.fnSettings().oFeatures.bStateSave === true) {
4477 if (!oTable.fnSettings().oLoadedState) {
4478 oTable.fnSettings().oLoadedState = {};
4480 if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) {
4481 oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = {
4487 yadcfState[table_selector_jq_friendly] = [];
4488 yadcfState[table_selector_jq_friendly][column_number] = {
4492 oTable.fnSettings().oLoadedState.yadcfState = yadcfState;
4494 oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings());
4498 function exResetAllFilters(table_arg, noRedraw, columns) {
4499 var table_selector_jq_friendly,
4507 settingsDt = getSettingsObjFromTable(table_arg),
4511 //check if the table arg is from new datatables API (capital "D")
4512 if (table_arg.settings !== undefined) {
4513 table_arg = table_arg.settings()[0].oInstance;
4515 tableOptions = getOptions(table_arg.selector);
4516 table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly2(table_arg);
4517 settingsDt = getSettingsObjFromTable(table_arg);
4519 for (columnObjKey in tableOptions) {
4520 if (tableOptions.hasOwnProperty(columnObjKey)) {
4521 optionsObj = tableOptions[columnObjKey];
4522 column_number = optionsObj.column_number;
4524 if (columns !== undefined && $.inArray(column_number, columns) === -1) {
4527 $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val");
4529 $filterElement = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number);
4531 switch (optionsObj.filter_type) {
4534 $filterElement.val('-1').removeClass('inuse');
4535 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4536 if (optionsObj.select_type !== undefined) {
4537 refreshSelectPlugin(optionsObj, $filterElement, '-1');
4540 case 'auto_complete':
4543 $filterElement.val('').removeClass('inuse');
4544 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4545 if ($filterElement.prev().hasClass('yadcf-exclude-wrapper')) {
4546 $filterElement.prev().find('input').prop('checked', false);
4549 case 'multi_select':
4550 case 'multi_select_custom_func':
4551 $filterElement.val('-1');
4552 $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", undefined);
4553 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4554 if (optionsObj.select_type !== undefined) {
4555 refreshSelectPlugin(optionsObj, $filterElement, '-1');
4559 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number;
4560 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number;
4561 $('#' + fromId).val('');
4562 $('#' + fromId).removeClass('inuse');
4563 $('#' + toId).val('');
4564 $('#' + toId).removeClass('inuse');
4565 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4566 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4568 clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4570 case 'range_number':
4571 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number;
4572 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number;
4573 $('#' + fromId).val('');
4574 $('#' + fromId).removeClass('inuse');
4575 $('#' + toId).val('');
4576 $('#' + toId).removeClass('inuse');
4577 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4578 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4580 clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4582 case 'range_number_slider':
4583 sliderId = 'yadcf-filter-' + table_selector_jq_friendly + '-slider-' + column_number;
4584 fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number;
4585 toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number;
4586 $('#' + fromId).text('');
4587 $('#' + fromId).parent().removeClass('inuse');
4588 $('#' + fromId).parent().parent().find('ui-slider-range').removeClass('inuse');
4589 $('#' + toId).text('');
4590 $('#' + toId).parent().removeClass('inuse');
4591 $('#' + toId).parent().parent().find('.ui-slider-range').removeClass('inuse');
4592 $('#' + 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()]);
4593 if (table_arg.fnSettings().oFeatures.bServerSide === true) {
4594 table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = '';
4596 clearStateSave(table_arg, column_number, table_selector_jq_friendly);
4602 if (noRedraw !== true) {
4603 //clear global filter
4604 settingsDt.oPreviousSearch.sSearch = '';
4605 if (settingsDt.aanFeatures.f !== undefined) {
4606 for (i = 0; i < settingsDt.aanFeatures.f.length; i++) {
4607 $('input', settingsDt.aanFeatures.f[i]).val('');
4610 //end of clear global filter
4611 table_arg.fnDraw(settingsDt);
4615 function exResetFilters(table_arg, columns, noRedraw) {
4616 exResetAllFilters(table_arg, noRedraw, columns);
4619 function exFilterExternallyTriggered(table_arg) {
4624 filtersValuesSingleElem,
4625 filtersValuesArr = [];
4627 //check if the table arg is from new datatables API (capital "D")
4628 if (table_arg.settings !== undefined) {
4629 table_arg = table_arg.settings()[0].oInstance;
4631 columnsObj = getOptions(table_arg.selector);
4633 for (columnObjKey in columnsObj) {
4634 if (columnsObj.hasOwnProperty(columnObjKey)) {
4635 columnObj = columnsObj[columnObjKey];
4636 filterValue = exGetColumnFilterVal(table_arg, columnObj.column_number);
4637 filtersValuesSingleElem = [];
4638 filtersValuesSingleElem.push(columnObj.column_number);
4639 filtersValuesSingleElem.push(filterValue);
4640 filtersValuesArr.push(filtersValuesSingleElem);
4643 exFilterColumn(table_arg, filtersValuesArr, true);
4649 doFilterMultiSelect: doFilterMultiSelect,
4650 doFilterAutocomplete: doFilterAutocomplete,
4651 autocompleteKeyUP: autocompleteKeyUP,
4652 getOptions: getOptions,
4653 rangeNumberKeyUP: rangeNumberKeyUP,
4654 rangeDateKeyUP: rangeDateKeyUP,
4655 rangeClear: rangeClear,
4656 rangeNumberSliderClear: rangeNumberSliderClear,
4657 stopPropagation: stopPropagation,
4658 exFilterColumn: exFilterColumn,
4659 exGetColumnFilterVal: exGetColumnFilterVal,
4660 exResetAllFilters: exResetAllFilters,
4661 dateKeyUP: dateKeyUP,
4662 dateSelectSingle: dateSelectSingle,
4663 textKeyUP: textKeyUP,
4664 doFilterCustomDateFunc: doFilterCustomDateFunc,
4665 eventTargetFixUp: eventTargetFixUp,
4666 initMultipleTables: initMultipleTables,
4667 initMultipleColumns: initMultipleColumns,
4668 textKeyUpMultiTables: textKeyUpMultiTables,
4669 doFilterMultiTables: doFilterMultiTables,
4670 doFilterMultiTablesMultiSelect: doFilterMultiTablesMultiSelect,
4671 generateTableSelectorJQFriendlyNew: generateTableSelectorJQFriendlyNew,
4672 exFilterExternallyTriggered: exFilterExternallyTriggered,
4673 exResetFilters: exResetFilters,
4674 initSelectPluginCustomTriggers: initSelectPluginCustomTriggers,
4675 preventDefaultForEnter: preventDefaultForEnter,
4676 generateTableSelectorJQFriendly2: generateTableSelectorJQFriendly2
4681 window.yadcf = yadcf;