diff --git a/ChangeLog.markdown b/ChangeLog.markdown index 4886a96..69faac9 100644 --- a/ChangeLog.markdown +++ b/ChangeLog.markdown @@ -146,4 +146,4 @@ * Added enable_auto_complete option * Several code enhancements (added ids to filters etc...) - + \ No newline at end of file diff --git a/lab/jquery.dataTables.yadcf.js b/lab/jquery.dataTables.yadcf.js index 476e606..07514e5 100644 --- a/lab/jquery.dataTables.yadcf.js +++ b/lab/jquery.dataTables.yadcf.js @@ -4,7 +4,7 @@ * Yet Another DataTables Column Filter - (yadcf) * * File: jquery.dataTables.yadcf.js -* Version: 0.8.3.beta.6 +* Version: 0.8.3.beta.7 * * Author: Daniel Reznick * Info: https://github.com/vedmack/yadcf @@ -368,7 +368,8 @@ var yadcf = (function ($) { var oTable = oTables[table_selector_jq_friendly], aEscapedTerms = [], selected_values = $(arg).val(), - i; + i, + stringForSearch; $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", selected_values); @@ -380,12 +381,14 @@ var yadcf = (function ($) { } } if (selected_values.length !== 0) { + stringForSearch = selected_values.join("|"); + stringForSearch = stringForSearch.replace(/([.*+?^=!:${}()\[\]\/\\])/g, "\\$1"); if (filter_match_mode === "contains") { - oTable.fnFilter(selected_values.join("|"), column_number, true, false, true); + oTable.fnFilter(stringForSearch, column_number, true, false, true); } else if (filter_match_mode === "exact") { - oTable.fnFilter("^(" + selected_values.join("|") + ")$", column_number, true, false, true); + oTable.fnFilter("^(" + stringForSearch + ")$", column_number, true, false, true); } else if (filter_match_mode === "startsWith") { - oTable.fnFilter("^(" + selected_values.join("|") + ")", column_number, true, false, true); + oTable.fnFilter("^(" + stringForSearch + ")", column_number, true, false, true); } } else { oTable.fnFilter("", column_number); @@ -1380,6 +1383,7 @@ var yadcf = (function ($) { $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse"); } else if (columnObj.filter_type === "multi_select") { tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + tmpStr = tmpStr.replace(/\\/g, ""); tmpStr = tmpStr.split("|"); $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr); } @@ -1459,6 +1463,7 @@ var yadcf = (function ($) { if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + tmpStr = tmpStr.replace(/\\/g, ""); tmpStr = tmpStr.split("|"); $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr); } diff --git a/lab/old betas/0.8.3.beta.6/jquery.dataTables.yadcf.js b/lab/old betas/0.8.3.beta.6/jquery.dataTables.yadcf.js new file mode 100644 index 0000000..476e606 --- /dev/null +++ b/lab/old betas/0.8.3.beta.6/jquery.dataTables.yadcf.js @@ -0,0 +1,2222 @@ +/*global $, jQuery, exFilterColumn*/ +/*jslint plusplus: true, nomen: true */ +/*! +* Yet Another DataTables Column Filter - (yadcf) +* +* File: jquery.dataTables.yadcf.js +* Version: 0.8.3.beta.6 +* +* Author: Daniel Reznick +* Info: https://github.com/vedmack/yadcf +* Contact: vedmack@gmail.com +* Twitter: @danielreznick +* Q&A https://groups.google.com/forum/#!forum/daniels_code +*tate +* Copyright 2013 Daniel Reznick, all rights reserved. +* Dual licensed under two licenses: GPL v2 license or a BSD (3-point) license (just like DataTables itself) +* +* This source file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. +*/ +/* +* Parameters: +* +* +* ------------- + +* column_number + Required: true + Type: String + Description: The number of the column to which the filter will be applied + +* filter_type + Required: false + Type: String + Default value: select + Possible values: select / multi_select / auto_complete / text / date / range_number / range_number_slider / range_date / custom_func + Description: The type of the filter to be used in the column + +* data + Required: false + Type: Array (of string or objects) + 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 + array of objects [{value: 'Some Data 1', label: 'One'}, {value: 'Some Data 3', label: 'Three'}] (supported in select / multi_select filters) + +* column_data_type + Required: false + Type: String + Default value: text + Possible values: text / html + 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) + +* text_data_delimiter + Required: false + Type: String + Description: Delimiter that seperates text in table column, for example text_data_delimiter: "," + +* html_data_type + Required: false + Type: String + Default value: text + Possible values: text / value / id + 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 Some text + +* filter_container_id + Required: false + Type: String + 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 + +* filter_default_label + Required: false + 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 + Default value: Select value + Description: The label that will appear in the select menu filter when no value is selected from the filter + +* filter_reset_button_text + Required: false + Type: String / boolean + Default value: x + 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) + +* enable_auto_complete (this attribute is deprecated , and will become obsolete in the future , so you better start using filter_type: "auto_complete") + Required: false + Type: boolean + Default value: false + Description: Turns the filter into an autocomplete input - make use of the jQuery UI Autocomplete widget (with some enhancements) + +* sort_as + Required: false + Type: String + Default value: alpha + Possible values: alpha / num + Description: Defines how the values in the filter will be sorted, alphabetically or numerically + +* sort_order + Required: false + Type: String + Default value: asc + Possible values: asc / desc + Description: Defines the order in which the values in the filter will be sorted, ascending or descending + +* date_format + Required: false + Type: String + Default value: mm/dd/yyyy + Possible values: mm/dd/yyyy / dd/mm/yyyy (eventually I replace yyyy into yy for jquery datepicker) + Description: Defines the format in which the date values are being parsed into Date object + +* ignore_char + Required: false + Type: String + Description: Tells the range_number and range_number_slide to ignore specific char while filtering (that char can used as number separator) + +* filter_match_mode + Required: false + Type: String + Default value: contains + Possible values: contains / exact / startsWith + Description: Allows to control the matching mode of the filter (supported in select / auto_complete / text filters) + +* select_type + Required: false + Type: String + Default value: undefined + Possible values: chosen / select2 + Description: Turns the simple select element into "Chosen/Select2 select" (make use of the Chosen/Select2 jQuery plugin) + + +* select_type_options + Required: false + Type: Object + Default value: {} + Description: This parameter will be passed "as is" to the Chosen/Select2 plugin constructor + + +* case_insensitive + Required: false + Type: boolean + Default value: true + Description: Do case-insensitive filtering (supported in select / auto_complete / text filters) + + +* filter_delay + Required: false + Type: integer + Default value: undefined + Description: Delay filter execution for a XXX milliseconds - filter will fire XXX milliseconds after the last keyup. + Special Notes: Currently supported in text / range_number / range_date filters / range_number_slider + +* +* +* +* External API functions: +* +* +* ------------- + +* exFilterColumn + Description: Allows to trigger filter/s externally/programmatically (support ALL filter types!!!) , perfect for showing table with pre filtered columns + Arguments: table_arg: (variable of the datatable), + array of pairs: column number String/Object with from and to, filter_value (the actual string value that we want to filter by) + Usage Example: yadcf.exFilterColumn(oTable, [[0, 'Some Data 2']]); //pre filter one column + yadcf.exFilterColumn(oTable, [[0, 'Some Data 1'], [1, {from: 111, to: 1110}], [2, {from: "", to: "11/25/2014"}]]); //pre filter several columns + +* exGetColumnFilterVal + Description: Allows to retreive column current filtered value (support ALL filter types!!!) + Arguments: table_arg: (variable of the datatable), + column number: column number from which we want the value + Usage Example: yadcf.exGetColumnFilterVal(oTable,1); + Return value: String (for simple filter) / Object (for range filter) with from and to properties / Array of strings for multi_select filter + +* +* +* +* Server-side processing API (see more on showcase): +* +* From server to client: +* 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: +* 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... +* +* From client to server: +* 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 +* 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-"); +* +* +* ------------- +* +*/ +var yadcf = (function ($) { + + 'use strict'; + + var oTables = {}, + oTablesIndex = {}, + options = {}, + exFilterColumnQueue = [], + yadcfDelay; + + function getOptions(selector) { + return options[selector]; + } + + function setOptions(selector_arg, options_arg) { + var tmpOptions = {}, + i, + j, + col_num_as_int, + default_options = { + filter_type : "select", + enable_auto_complete : false, + sort_as : "alpha", + sort_order : "asc", + date_format : "mm/dd/yyyy", + ignore_char : undefined, + filter_match_mode : "contains", + select_type : undefined, + select_type_options : {}, + case_insensitive : true + }, + adaptContainerCssClassImpl = function (dummy) { return ''; }; + + for (i = 0; i < options_arg.length; i++) { + if (options_arg[i].select_type === 'select2') { + default_options.select_type_options = {adaptContainerCssClass: adaptContainerCssClassImpl}; + } + //validate custom function required attributes + if (options_arg[i].filter_type === 'custom_func') { + if (options_arg[i].custom_func === undefined) { + alert('You are trying to use filter_type: "custom_func" for column ' + options_arg[i].column_number + ' but there is no such custom_func attribute provided (custom_func: \"function reference goes here...\")'); + return; + } + if (options_arg[i].data === undefined) { + alert('You are trying to use filter_type: "custom_func" for column ' + options_arg[i].column_number + ' but there is no such data attribute provided (data: \"array of options goes here...\")'); + return; + } + } + col_num_as_int = +options_arg[i].column_number; + tmpOptions[col_num_as_int] = $.extend(true, {}, default_options, options_arg[i]); + } + options[selector_arg] = tmpOptions; + } + + function resetIApiIndex() { + $.fn.dataTableExt.iApiIndex = 0; + + } + + function generateTableSelectorJQFriendly(tmpStr) { + return tmpStr.replace(":", "-").replace("(", "").replace(")", "").replace(".", "-").replace("#", "-"); + } + + yadcfDelay = (function () { + var timer = 0; + return function (callback, ms, param) { + clearTimeout(timer); + timer = setTimeout(function () { + callback(param); + }, ms); + return timer; + }; + }()); + + //Used by exFilterColumn for translating readable search value into proper search string for datatables filtering + function yadcfMatchFilterString(table_arg, column_number, selected_value, filter_match_mode, multiple) { + var case_insensitive = yadcf.getOptions(table_arg.selector)[column_number].case_insensitive, + ret_val; + + table_arg.fnSettings().aoPreSearchCols[column_number].bSmart = false; + table_arg.fnSettings().aoPreSearchCols[column_number].bCaseInsensitive = case_insensitive; + + if (multiple === undefined || multiple === false) { + if (filter_match_mode === "contains") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = false; + ret_val = selected_value; + } else if (filter_match_mode === "exact") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true; + ret_val = "^" + selected_value + "$"; + } else if (filter_match_mode === "startsWith") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true; + ret_val = "^" + selected_value; + } + } else { + if (filter_match_mode === "contains") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true; + ret_val = selected_value.join("|"); + } else if (filter_match_mode === "exact") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true; + ret_val = "^(" + selected_value.join("|") + ")$"; + } else if (filter_match_mode === "startsWith") { + table_arg.fnSettings().aoPreSearchCols[column_number].bRegex = true; + ret_val = "^(" + selected_value.join("|") + ")"; + } + } + return ret_val; + } + + function yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number) { + var case_insensitive = yadcf.getOptions(oTable.selector)[column_number].case_insensitive; + if (filter_match_mode === "contains") { + oTable.fnFilter(selected_value, column_number, false, false, true, case_insensitive); + } else if (filter_match_mode === "exact") { + oTable.fnFilter("^" + selected_value + "$", column_number, true, false, true, case_insensitive); + } else if (filter_match_mode === "startsWith") { + oTable.fnFilter("^" + selected_value, column_number, true, false, true, case_insensitive); + } + } + + function yadcfParseMatchFilter(tmpStr, filter_match_mode) { + var retVal; + if (filter_match_mode === "contains") { + retVal = tmpStr; + } else if (filter_match_mode === "exact") { + retVal = tmpStr.substring(1, tmpStr.length - 1); + } else if (filter_match_mode === "startsWith") { + retVal = tmpStr.substring(1, tmpStr.length); + } + return retVal; + } + + function doFilterCustomDateFunc(arg, table_selector_jq_friendly, column_number) { + var oTable = oTables[table_selector_jq_friendly]; + if (arg === "clear" || arg.value === "-1") { + if (arg === "clear") { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("-1").focus(); + } + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + } else { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse"); + } + + oTable.fnDraw(); + } + + function doFilter(arg, table_selector_jq_friendly, column_number, filter_match_mode) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + selected_value; + + if (arg === "clear") { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("-1").focus(); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", "-1"); + oTable.fnFilter("", column_number); + resetIApiIndex(); + if (yadcf.getOptions(oTable.selector)[column_number].select_type === 'chosen') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).trigger("chosen:updated"); + } + return; + } + + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse"); + + $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value); + + selected_value = $.trim($(arg).find('option:selected').val()); + + if (arg.value !== "-1") { + yadcfMatchFilter(oTable, selected_value, filter_match_mode, column_number); + } else { + oTable.fnFilter("", column_number); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + } + resetIApiIndex(); + } + + function doFilterMultiSelect(arg, table_selector_jq_friendly, column_number, filter_match_mode) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + aEscapedTerms = [], + selected_values = $(arg).val(), + i; + + $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", selected_values); + + if (selected_values !== null) { + for (i = selected_values.length - 1; i >= 0; i--) { + if (selected_values[i] === "-1") { + selected_values.splice(i, 1); + break; + } + } + if (selected_values.length !== 0) { + if (filter_match_mode === "contains") { + oTable.fnFilter(selected_values.join("|"), column_number, true, false, true); + } else if (filter_match_mode === "exact") { + oTable.fnFilter("^(" + selected_values.join("|") + ")$", column_number, true, false, true); + } else if (filter_match_mode === "startsWith") { + oTable.fnFilter("^(" + selected_values.join("|") + ")", column_number, true, false, true); + } + } else { + oTable.fnFilter("", column_number); + } + } else { + oTable.fnFilter("", column_number); + } + resetIApiIndex(); + } + + function yadcfParseMatchFilterMultiSelect(tmpStr, filter_match_mode) { + var retVal; + if (filter_match_mode === "contains") { + retVal = tmpStr; + } else if (filter_match_mode === "exact") { + retVal = tmpStr.substring(1, tmpStr.length - 1); + retVal = retVal.substring(1, retVal.length - 1); + } else if (filter_match_mode === "startsWith") { + retVal = tmpStr.substring(1, tmpStr.length); + retVal = retVal.substring(1, retVal.length - 1); + } + return retVal; + } + + function doFilterAutocomplete(arg, table_selector_jq_friendly, column_number, filter_match_mode) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly]; + + if (arg === "clear") { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus(); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val"); + oTable.fnFilter("", column_number); + resetIApiIndex(); + return; + } + + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse"); + + $(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", arg.value); + + yadcfMatchFilter(oTable, arg.value, filter_match_mode, column_number); + + resetIApiIndex(); + } + + function autocompleteSelect(event, ui) { + + var table_column = event.target.id.replace("yadcf-filter-", ""), + dashIndex = table_column.lastIndexOf("-"), + table_selector_jq_friendly = table_column.substring(0, dashIndex), + col_num = parseInt(table_column.substring(dashIndex + 1), 10), + filter_match_mode = $(event.target).attr("filter_match_mode"); + doFilterAutocomplete(ui.item, table_selector_jq_friendly, col_num, filter_match_mode); + } + + function sortNumAsc(a, b) { + return a - b; + } + + function sortNumDesc(a, b) { + return b - a; + } + + function findMinInArray(array, ignore_char) { + var narray = [], i; + for (i = 0; i < array.length; i++) { + if (array[i] !== null) { + if (ignore_char !== undefined) { + array[i] = array[i].toString().replace(ignore_char, ""); + } + narray.push(array[i]); + } + } + return Math.min.apply(Math, narray); + } + + function findMaxInArray(array, ignore_char) { + var narray = [], i; + for (i = 0; i < array.length; i++) { + if (array[i] !== null) { + if (ignore_char !== undefined) { + array[i] = array[i].toString().replace(ignore_char, ""); + } + narray.push(array[i]); + } + } + return Math.max.apply(Math, narray); + } + + function addRangeNumberFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, ignore_char) { + + $.fn.dataTableExt.afnFiltering.push( + function (oSettings, aData, iDataIndex) { + var min = document.getElementById(fromId).value, + max = document.getElementById(toId).value, + val = aData[col_num] === "-" ? 0 : aData[col_num], + retVal = false, + table_selector_jq_friendly_local = table_selector_jq_friendly, + current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(oSettings.oInstance.selector), + ignore_char_local = ignore_char; + + if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) { + return true; + } + + if (ignore_char_local !== undefined) { + min = min.replace(ignore_char_local, ""); + max = max.replace(ignore_char_local, ""); + val = val.toString().replace(ignore_char_local, ""); + } + + min = (min !== "") ? (+min) : min; + max = (max !== "") ? (+max) : max; + val = (val !== "") ? (+val) : val; + if (min === "" && max === "") { + retVal = true; + } else if (min === "" && val <= max) { + retVal = true; + } else if (min <= val && "" === max) { + retVal = true; + } else if (min <= val && val <= max) { + retVal = true; + } + return retVal; + } + ); + } + + function addCustomFunctionFilterCapability(table_selector_jq_friendly, filterId, col_num) { + + $.fn.dataTableExt.afnFiltering.push( + function (oSettings, aData, iDataIndex) { + var filterVal = document.getElementById(filterId) !== null ? document.getElementById(filterId).value : "", + columnVal = aData[col_num] === "-" ? 0 : aData[col_num], + retVal = false, + table_selector_jq_friendly_local = table_selector_jq_friendly, + current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(oSettings.oInstance.selector), + custom_func; + + if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) { + return true; + } + + custom_func = yadcf.getOptions(oSettings.oInstance.selector)[col_num].custom_func; + + retVal = custom_func(filterVal, columnVal); + + return retVal; + } + ); + } + function addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, date_format) { + + $.fn.dataTableExt.afnFiltering.push( + function (oSettings, aData, iDataIndex) { + var min = document.getElementById(fromId) !== null ? document.getElementById(fromId).value : "", + max = document.getElementById(toId) !== null ? document.getElementById(toId).value : "", + val = aData[col_num] === "-" ? 0 : aData[col_num], + retVal = false, + table_selector_jq_friendly_local = table_selector_jq_friendly, + current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(oSettings.oInstance.selector); + + if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) { + return true; + } + try { + if (min.length === (date_format.length + 2)) { + min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min; + } + } catch (err1) {} + try { + if (max.length === (date_format.length + 2)) { + max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max; + } + } catch (err2) {} + try { + val = (val !== "") ? $.datepicker.parseDate(date_format, val) : val; + } catch (err3) {} + + if ((min === "" || !(min instanceof Date)) && (max === "" || !(max instanceof Date))) { + retVal = true; + } else if (min === "" && val <= max) { + retVal = true; + } else if (min <= val && "" === max) { + retVal = true; + } else if (min <= val && val <= max) { + retVal = true; + } + + return retVal; + } + ); + } + + function addRangeNumberSliderFilterCapability(table_selector_jq_friendly, fromId, toId, col_num, ignore_char) { + + $.fn.dataTableExt.afnFiltering.push( + function (oSettings, aData, iDataIndex) { + var min = $('#' + fromId).text(), + max = $('#' + toId).text(), + val = aData[col_num] === "-" ? 0 : aData[col_num], + retVal = false, + table_selector_jq_friendly_local = table_selector_jq_friendly, + current_table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(oSettings.oInstance.selector), + ignore_char_local = ignore_char, + column_data_type, + html_data_type, + i, + columnObjKey; + + if (table_selector_jq_friendly_local !== current_table_selector_jq_friendly) { + return true; + } + + if (!isFinite(min) || !isFinite(max)) { + return true; + } + + column_data_type = yadcf.getOptions(oSettings.oInstance.selector)[col_num].column_data_type; + html_data_type = yadcf.getOptions(oSettings.oInstance.selector)[col_num].html_data_type; + + if (column_data_type === "html") { + if (html_data_type === undefined) { + html_data_type = "text"; + } + switch (html_data_type) { + case "text": + val = $(val).text(); + break; + case "value": + val = $(val).val(); + break; + case "id": + val = val.id; + break; + } + } + + if (ignore_char_local !== undefined) { + min = min.replace(ignore_char_local, ""); + max = max.replace(ignore_char_local, ""); + val = val.toString().replace(ignore_char_local, ""); + } + + min = (min !== "") ? (+min) : min; + max = (max !== "") ? (+max) : max; + val = (val !== "") ? (+val) : val; + if (min === "" && max === "") { + retVal = true; + } else if (min === "" && val <= max) { + retVal = true; + } else if (min <= val && "" === max) { + retVal = true; + } else if (min <= val && val <= max) { + retVal = true; + } + return retVal; + } + ); + } + + function addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char) { + var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-" + column_number, + toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-" + column_number, + filter_selector_string_tmp, + filter_wrapper_id, + oTable; + + filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number; + + if ($("#" + filter_wrapper_id).length > 0) { + return; + } + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + filter_selector_string_tmp = filter_selector_string; + + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper-inner"; + + $(filter_selector_string).append("" + + ""); + $(filter_selector_string).append("" + + ""); + $(filter_selector_string).append("" + + ""); + + if (filter_reset_button_text !== false) { + $(filter_selector_string_tmp).append(""); + } + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) { + if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) { + $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from); + if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") { + $('#' + fromId).addClass("inuse"); + } + $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to); + if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") { + $('#' + toId).addClass("inuse"); + } + } + } + resetIApiIndex(); + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + addRangeNumberFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, ignore_char); + } + + } + + function dateSelectSingle(date, event, clear) { + var oTable, + column_number = $(event).attr('id').replace('yadcf-filter-', '').replace('-date', '').replace('-reset', ''), + dashIndex = column_number.lastIndexOf("-"), + table_selector_jq_friendly = column_number.substring(0, dashIndex), + date_str; + + column_number = column_number.substring(dashIndex + 1); + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + + if (clear === undefined) { + date_str = document.getElementById($(event).attr('id')).value; + oTable.fnFilter(date, column_number); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).addClass("inuse"); + } else if (clear === 'clear') { + oTable.fnFilter('', column_number); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val('').removeClass("inuse"); + } + + resetIApiIndex(); + } + + function dateSelect(date, event) { + + var oTable, + column_number = $(event).attr("id").replace("yadcf-filter-", "").replace("-from-date", "").replace("-to-date", ""), + dashIndex = column_number.lastIndexOf("-"), + table_selector_jq_friendly = column_number.substring(0, dashIndex), + yadcfState, + from, + to, + min, + max, + min_server, + max_server, + date_format; + + column_number = column_number.substring(dashIndex + 1); + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + + oTable = oTables[table_selector_jq_friendly]; + date_format = yadcf.getOptions(oTable.selector)[column_number].date_format; + date_format = date_format.replace("yyyy", "yy"); + + $("#" + $(event).attr("id")).addClass("inuse"); + + if ($(event).attr("id").indexOf("-from-") !== -1) { + from = document.getElementById($(event).attr("id")).value; + to = document.getElementById($(event).attr("id").replace("-from-", "-to-")).value; + } else { + to = document.getElementById($(event).attr("id")).value; + from = document.getElementById($(event).attr("id").replace("-to-", "-from-")).value; + } + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + oTable.fnDraw(); + } else { + min = from; + max = to; + + try { + if (min.length === (date_format.length + 2)) { + min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min; + } + } catch (err1) {} + try { + if (max.length === (date_format.length + 2)) { + max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max; + } + } catch (err2) {} + if (min instanceof Date) { + min_server = min.getTime(); + } else { + min_server = min; + } + if (max instanceof Date) { + max_server = max.getTime(); + } else { + max_server = max; + } + oTable.fnFilter(min_server + '-yadcf_delim-' + max_server, column_number); + } + + if (!oTable.fnSettings().oLoadedState) { + oTable.fnSettings().oLoadedState = {}; + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + if (oTable.fnSettings().oFeatures.bStateSave === true) { + if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) { + oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = + { + 'from' : from, + 'to' : to + }; + } else { + yadcfState = {}; + yadcfState[table_selector_jq_friendly] = []; + yadcfState[table_selector_jq_friendly][column_number] = { + 'from' : from, + 'to' : to + }; + oTable.fnSettings().oLoadedState.yadcfState = yadcfState; + } + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + + resetIApiIndex(); + } + + function addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) { + var fromId = "yadcf-filter-" + table_selector_jq_friendly + "-from-date-" + column_number, + toId = "yadcf-filter-" + table_selector_jq_friendly + "-to-date-" + column_number, + filter_selector_string_tmp, + filter_wrapper_id, + oTable; + + filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number; + + if ($("#" + filter_wrapper_id).length > 0) { + return; + } + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + filter_selector_string_tmp = filter_selector_string; + + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper-inner"; + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + $(filter_selector_string).append("" + + ""); + $(filter_selector_string).append("" + + ""); + $(filter_selector_string).append("" + + ""); + + if (filter_reset_button_text !== false) { + $(filter_selector_string_tmp).append(""); + } + + $("#" + fromId).datepicker({ + dateFormat: date_format, + onSelect: dateSelect + }); + $("#" + toId).datepicker({ + dateFormat: date_format, + onSelect: dateSelect + }); + + if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) { + if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) { + $('#' + fromId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from); + if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from !== "") { + $('#' + fromId).addClass("inuse"); + } + $('#' + toId).val(oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to); + if (oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to !== "") { + $('#' + toId).addClass("inuse"); + } + } + } + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + addRangeDateFilterCapability(table_selector_jq_friendly, fromId, toId, column_number, date_format); + } + + resetIApiIndex(); + } + + function addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format) { + var dateId = "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, + filter_selector_string_tmp, + filter_wrapper_id, + oTable; + + filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number; + + if ($("#" + filter_wrapper_id).length > 0) { + return; + } + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + filter_selector_string_tmp = filter_selector_string; + + $(filter_selector_string).append(""); + + if (filter_reset_button_text !== false) { + $(filter_selector_string_tmp).append(''); + } + + $("#" + dateId).datepicker({ + dateFormat: date_format, + onSelect: dateSelectSingle + }); + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(oTable.fnSettings().aoPreSearchCols[column_number].sSearch).addClass("inuse"); + } + + resetIApiIndex(); + + } + + function rangeNumberSldierDrawTips(min_tip_val, max_tip_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number) { + var first_handle = $("#yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:first"), + last_handle = $("#yadcf-filter-wrapper-inner-" + table_selector_jq_friendly + "-" + column_number + " .ui-slider-handle:last"), + min_tip_inner, + max_tip_inner; + + min_tip_inner = "
" + min_tip_val + "
"; + max_tip_inner = "
" + max_tip_val + "
"; + + $(first_handle).addClass("yadcf-filter-range-number-slider-min-tip").html(min_tip_inner); + $(last_handle).addClass("yadcf-filter-range-number-slider-max-tip").html(max_tip_inner); + } + + function rangeNumberSliderChange(table_selector_jq_friendly, event, ui) { + var oTable, + min_val, + max_val, + slider_inuse, + yadcfState, + column_number = $(event.target).attr('id').replace("yadcf-filter-", "").replace(table_selector_jq_friendly, "").replace("-slider-", ""), + options, + keyUp; + + oTable = oTables[table_selector_jq_friendly]; + options = getOptions(oTable.selector)[column_number]; + + keyUp = function () { + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + oTable.fnDraw(); + } else { + oTable.fnFilter(ui.values[0] + '-yadcf_delim-' + ui.values[1], column_number); + } + + min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text(); + max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text(); + + + if (min_val !== ui.values[0]) { + $($(event.target).find(".ui-slider-handle")[0]).addClass("inuse"); + slider_inuse = true; + } else { + $($(event.target).find(".ui-slider-handle")[0]).removeClass("inuse"); + } + if (max_val !== ui.values[1]) { + $($(event.target).find(".ui-slider-handle")[1]).addClass("inuse"); + slider_inuse = true; + } else { + $($(event.target).find(".ui-slider-handle")[1]).removeClass("inuse"); + } + + if (slider_inuse === true) { + $(event.target).find(".ui-slider-range").addClass("inuse"); + } else { + $(event.target).find(".ui-slider-range").removeClass("inuse"); + } + if (!oTable.fnSettings().oLoadedState) { + oTable.fnSettings().oLoadedState = {}; + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + if (oTable.fnSettings().oFeatures.bStateSave === true) { + if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) { + oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = + { + 'from' : ui.values[0], + 'to' : ui.values[1] + }; + } else { + yadcfState = {}; + yadcfState[table_selector_jq_friendly] = []; + yadcfState[table_selector_jq_friendly][column_number] = { + 'from' : ui.values[0], + 'to' : ui.values[1] + }; + oTable.fnSettings().oLoadedState.yadcfState = yadcfState; + } + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + + resetIApiIndex(); + }; + + if (options.filter_delay === undefined) { + keyUp(); + } else { + yadcfDelay(function () { + keyUp(); + }, options.filter_delay); + } + } + + function addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char) { + var sliderId = "yadcf-filter-" + table_selector_jq_friendly + "-slider-" + column_number, + min_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-min_tip-" + column_number, + max_tip_id = "yadcf-filter-" + table_selector_jq_friendly + "-max_tip-" + column_number, + filter_selector_string_tmp, + filter_wrapper_id, + oTable, + min_state_val = min_val, + max_state_val = max_val; + + filter_wrapper_id = "yadcf-filter-wrapper-" + table_selector_jq_friendly + "-" + column_number; + + if ($("#" + filter_wrapper_id).length > 0) { + if (!isFinite($('#' + min_tip_id).text()) || !isFinite($('#' + max_tip_id).text()) || !isFinite(min_val) || !isFinite(max_val) || + !isFinite($(filter_selector_string).find('.yadcf-filter-range-number-slider-min-tip-hidden.hide').text()) || + !isFinite($(filter_selector_string).find('.yadcf-filter-range-number-slider-max-tip-hidden.hide').text())) { + $(filter_selector_string).empty(); + } else { + return; + } + } + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + filter_selector_string_tmp = filter_selector_string; + + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-number-slider-filter-wrapper-inner"; + + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " #" + sliderId; + + $(filter_selector_string).append("" + min_val + ""); + $(filter_selector_string).append("" + max_val + ""); + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) { + if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) { + if (min_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) { + min_state_val = oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from; + } + if (max_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) { + max_state_val = oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to; + } + } + } + + if (isFinite(min_val) && isFinite(max_val) && isFinite(min_state_val) && isFinite(max_state_val)) { + $("#" + sliderId).slider({ + range: true, + min: min_val, + max: max_val, + values: [min_state_val, max_state_val], + create: function (event, ui) { + rangeNumberSldierDrawTips(min_state_val, max_state_val, min_tip_id, max_tip_id, table_selector_jq_friendly, column_number); + }, + slide: function (event, ui) { + rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number); + rangeNumberSliderChange(table_selector_jq_friendly, event, ui); + }, + change: function (event, ui) { + rangeNumberSldierDrawTips(ui.values[0], ui.values[1], min_tip_id, max_tip_id, table_selector_jq_friendly, column_number); + rangeNumberSliderChange(table_selector_jq_friendly, event, ui); + } + }); + + if (filter_reset_button_text !== false) { + $(filter_selector_string_tmp).append(""); + } + } + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + if (oTable.fnSettings().oFeatures.bStateSave === true && oTable.fnSettings().oLoadedState) { + if (oTable.fnSettings().oLoadedState.yadcfState && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number]) { + if (isFinite(min_val) && min_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from) { + $($(filter_selector_string).find(".ui-slider-handle")[0]).addClass("inuse"); + } + if (isFinite(max_val) && max_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to) { + $($(filter_selector_string).find(".ui-slider-handle")[1]).addClass("inuse"); + } + if ((isFinite(min_val) && isFinite(max_val)) && (min_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].from || max_val !== oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number].to)) { + $($(filter_selector_string).find(".ui-slider-range")).addClass("inuse"); + } + } + } + resetIApiIndex(); + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + addRangeNumberSliderFilterCapability(table_selector_jq_friendly, min_tip_id, max_tip_id, column_number, ignore_char); + } + } + + function dot2obj(tmpObj, dot_refs) { + var i = 0; + dot_refs = dot_refs.split("."); + for (i = 0; i < dot_refs.length; i++) { + tmpObj = tmpObj[dot_refs[i]]; + } + return tmpObj; + } + + function appendFilters(oTable, args, table_selector) { + + var i = 0, + $filter_selector, + filter_selector_string, + + data, + filter_container_id, + column_number_data, + column_number, + column_data_type, + html_data_type, + text_data_delimiter, + filter_default_label, + filter_reset_button_text, + enable_auto_complete, + sort_as, + sort_order, + date_format, + ignore_char, + filter_match_mode, + + options, + options_tmp, + j, + k, + data_length, + col_inner_elements, + col_inner_data, + col_filter_array, + ii, + table_selector_jq_friendly, + min_val, + max_val, + col_num_visible, + col_num_visible_iter, + tmpStr, + columnObjKey, + columnObj; + + + for (columnObjKey in args) { + if (args.hasOwnProperty(columnObjKey)) { + columnObj = args[columnObjKey]; + + data = columnObj.data; + filter_container_id = columnObj.filter_container_id; + column_number = columnObj.column_number; + column_number = +column_number; + column_number_data = undefined; + if (isNaN(oTable.fnSettings().aoColumns[column_number].mData) && typeof oTable.fnSettings().aoColumns[column_number].mData !== 'object') { + column_number_data = oTable.fnSettings().aoColumns[column_number].mData; + } + column_data_type = columnObj.column_data_type; + html_data_type = columnObj.html_data_type; + text_data_delimiter = columnObj.text_data_delimiter; + filter_default_label = columnObj.filter_default_label; + filter_reset_button_text = columnObj.filter_reset_button_text; + enable_auto_complete = columnObj.enable_auto_complete; + sort_as = columnObj.sort_as; + sort_order = columnObj.sort_order; + date_format = columnObj.date_format; + //for jquery datepicker + date_format = date_format.replace("yyyy", "yy"); + + if (columnObj.ignore_char !== undefined) { + ignore_char = new RegExp(columnObj.ignore_char, "g"); + } + filter_match_mode = columnObj.filter_match_mode; + + if (column_number === undefined) { + alert("You must specify column number"); + return; + } + + if (column_data_type === undefined) { + column_data_type = "text"; + } else if (column_data_type === "html") { + if (html_data_type === undefined) { + html_data_type = "text"; + } + } + + if (enable_auto_complete === true) { + columnObj.filter_type = "auto_complete"; + } + + if (filter_default_label === undefined) { + if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') { + filter_default_label = "Select value"; + } else if (columnObj.filter_type === "multi_select") { + filter_default_label = "Select values"; + } else if (columnObj.filter_type === "auto_complete" || columnObj.filter_type === "text") { + filter_default_label = "Type a value"; + } else if (columnObj.filter_type === "range_number" || columnObj.filter_type === "range_date") { + filter_default_label = ["from", "to"]; + } else if (columnObj.filter_type === "date") { + filter_default_label = "Select a date"; + } + } + + if (filter_reset_button_text === undefined) { + filter_reset_button_text = "x"; + } + + options = []; + col_filter_array = {}; + + if (data === undefined) { + data = oTable.fnSettings().aoData; + data_length = data.length; + + for (j = 0; j < data_length; j++) { + if (column_data_type === "html") { + if (column_number_data === undefined) { + col_inner_elements = $(data[j]._aData[column_number]); + } else { + col_inner_elements = dot2obj(data[j]._aData, column_number_data); + col_inner_elements = $(col_inner_elements); + } + for (k = 0; k < col_inner_elements.length; k++) { + switch (html_data_type) { + case "text": + col_inner_data = $(col_inner_elements[k]).text(); + break; + case "value": + col_inner_data = $(col_inner_elements[k]).val(); + break; + case "id": + col_inner_data = col_inner_elements[k].id; + break; + } + if (!(col_filter_array.hasOwnProperty(col_inner_data))) { + col_filter_array[col_inner_data] = col_inner_data; + options.push(col_inner_data); + } + } + } else if (column_data_type === "text") { + if (text_data_delimiter !== undefined) { + if (column_number_data === undefined) { + col_inner_elements = data[j]._aData[column_number].split(text_data_delimiter); + } else { + col_inner_elements = dot2obj(data[j]._aData, column_number_data); + col_inner_elements = col_inner_elements.split(text_data_delimiter); + } + for (k = 0; k < col_inner_elements.length; k++) { + col_inner_data = col_inner_elements[k]; + if (!(col_filter_array.hasOwnProperty(col_inner_data))) { + col_filter_array[col_inner_data] = col_inner_data; + options.push(col_inner_data); + } + } + } else { + if (column_number_data === undefined) { + col_inner_data = data[j]._aData[column_number]; + } else { + col_inner_data = dot2obj(data[j]._aData, column_number_data); + } + if (!(col_filter_array.hasOwnProperty(col_inner_data))) { + col_filter_array[col_inner_data] = col_inner_data; + options.push(col_inner_data); + } + } + } + } + + } else { + for (ii = 0; ii < data.length; ii++) { + options.push(data[ii]); + } + } + + if (columnObj.filter_type === "range_number_slider") { + min_val = findMinInArray(options, ignore_char); + max_val = findMaxInArray(options, ignore_char); + } + + + if (filter_container_id === undefined) { + //Can't show filter inside a column for a hidden one (place it outside using filter_container_id) + if (oTable.fnSettings().aoColumns[column_number].bVisible === false) { + //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)'); + continue; + } + col_num_visible = column_number; + + for (col_num_visible_iter = 0; col_num_visible_iter < oTable.fnSettings().aoColumns.length && col_num_visible_iter < column_number; col_num_visible_iter++) { + if (oTable.fnSettings().aoColumns[col_num_visible_iter].bVisible === false) { + col_num_visible--; + } + } + filter_selector_string = table_selector + " thead th:eq(" + col_num_visible + ")"; + $filter_selector = $(filter_selector_string).find(".yadcf-filter"); + } else { + if ($("#" + filter_container_id).length === 0) { + alert("Filter container could not be found."); + return; + } + filter_selector_string = "#" + filter_container_id; + $filter_selector = $(filter_selector_string).find(".yadcf-filter"); + } + + table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(table_selector); + + if (columnObj.filter_type === "select" || columnObj.filter_type === "auto_complete" || columnObj.filter_type === "multi_select" || columnObj.filter_type === "custom_func") { + if (sort_as === "alpha") { + if (sort_order === "asc") { + options.sort(); + } else if (sort_order === "desc") { + options.sort(); + options.reverse(); + } + } else if (sort_as === "num") { + if (sort_order === "asc") { + options.sort(sortNumAsc); + } else if (sort_order === "desc") { + options.sort(sortNumDesc); + } + } + } + + if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') { + options_tmp = ""; + if (typeof options[0] === 'object') { + for (ii = 0; ii < options.length; ii++) { + options_tmp += ""; + } + } else { + for (ii = 0; ii < options.length; ii++) { + options_tmp += ""; + } + } + options = options_tmp; + + } else if (columnObj.filter_type === "multi_select") { + if (columnObj.select_type === undefined) { + options_tmp = ""; + } else { + options_tmp = ""; + } + if (typeof options[0] === 'object') { + for (ii = 0; ii < options.length; ii++) { + options_tmp += ""; + } + } else { + for (ii = 0; ii < options.length; ii++) { + options_tmp += ""; + } + } + options = options_tmp; + } + + if ($filter_selector.length === 1) { + if (columnObj.filter_type === "select" || columnObj.filter_type === "multi_select") { + + $filter_selector.empty(); + $filter_selector.append(options); + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; + if (columnObj.filter_type === "select") { + tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse"); + } else if (columnObj.filter_type === "multi_select") { + tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + tmpStr = tmpStr.split("|"); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr); + } + } + if (columnObj.select_type !== undefined && columnObj.select_type === 'chosen') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).trigger("chosen:updated"); + } else if (columnObj.select_type !== undefined && columnObj.select_type === 'select2') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2("destroy").select2(columnObj.select_type_options); + } + } else if (columnObj.filter_type === "auto_complete") { + $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, options); + } + } else { + if (filter_container_id === undefined) { + if ($(filter_selector_string + " div.DataTables_sort_wrapper").length > 0) { + $(filter_selector_string + " div.DataTables_sort_wrapper").css("display", "inline-block"); + } + } else { + if ($("#yadcf-filter-wrapper-" + filter_container_id).length === 0) { + $("#" + filter_container_id).append("
"); + } + filter_selector_string = "#yadcf-filter-wrapper-" + filter_container_id; + } + + if (columnObj.filter_type === "select" || columnObj.filter_type === 'custom_func') { + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + + if (columnObj.filter_type === "select") { + $(filter_selector_string).append(""); + if (filter_reset_button_text !== false) { + $(filter_selector_string).find(".yadcf-filter").after(""); + } + } else { + $(filter_selector_string).append(""); + if (filter_reset_button_text !== false) { + $(filter_selector_string).find(".yadcf-filter").after(""); + } + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + addCustomFunctionFilterCapability(table_selector_jq_friendly, "yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, column_number); + } + } + + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; + tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse"); + } + + if (columnObj.select_type !== undefined && columnObj.select_type === 'chosen') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).chosen(columnObj.select_type_options); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).next().attr("onclick", "yadcf.stopPropagation(event);"); + } else if (columnObj.select_type !== undefined && columnObj.select_type === 'select2') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2(columnObj.select_type_options); + } + + } else if (columnObj.filter_type === "multi_select") { + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + + $(filter_selector_string).append(""); + + if (filter_reset_button_text !== false) { + $(filter_selector_string).find(".yadcf-filter").after(""); + } + + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; + tmpStr = yadcfParseMatchFilterMultiSelect(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + tmpStr = tmpStr.split("|"); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr); + } + + if (columnObj.filter_container_id === undefined && columnObj.select_type_options.width === undefined) { + columnObj.select_type_options = $.extend(columnObj.select_type_options, {width: $(filter_selector_string).closest("th").width() + "px"}); + } + if (columnObj.select_type !== undefined && columnObj.select_type === 'chosen') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).chosen(columnObj.select_type_options); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).next().attr("onclick", "yadcf.stopPropagation(event);"); + } else if (columnObj.select_type !== undefined && columnObj.select_type === 'select2') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2(columnObj.select_type_options); + } + + } else if (columnObj.filter_type === "auto_complete") { + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + + $(filter_selector_string).append(""); + $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number, options); + + if (filter_reset_button_text !== false) { + $(filter_selector_string).find(".yadcf-filter").after(""); + } + + } else if (columnObj.filter_type === "text") { + + //add a wrapper to hold both filter and reset button + $(filter_selector_string).append("
"); + filter_selector_string = filter_selector_string + " div.yadcf-filter-wrapper"; + + $(filter_selector_string).append(""); + + if (filter_reset_button_text !== false) { + $(filter_selector_string).find(".yadcf-filter").after(""); + } + + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; + tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse"); + } + + } else if (columnObj.filter_type === "date") { + + addDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format); + + } else if (columnObj.filter_type === "range_number") { + + addRangeNumberFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, ignore_char); + + } else if (columnObj.filter_type === "range_number_slider") { + + addRangeNumberSliderFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, min_val, max_val, ignore_char); + + } else if (columnObj.filter_type === "range_date") { + + addRangeDateFilter(filter_selector_string, table_selector_jq_friendly, column_number, filter_reset_button_text, filter_default_label, date_format); + + } + } + + 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") { + $(filter_selector_string).find(".yadcf-filter").val($(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val")); + } + if (columnObj.filter_type === "auto_complete") { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).autocomplete({ + source: $(document).data("yadcf-filter-" + table_selector_jq_friendly + "-" + column_number), + select: autocompleteSelect + }); + if (oTable.fnSettings().aoPreSearchCols[column_number].sSearch !== '') { + tmpStr = oTable.fnSettings().aoPreSearchCols[column_number].sSearch; + tmpStr = yadcfParseMatchFilter(tmpStr, getOptions(oTable.selector)[column_number].filter_match_mode); + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(tmpStr).addClass("inuse"); + } + } + } + } + if (exFilterColumnQueue.length > 0) { + (exFilterColumnQueue.shift())(); + } + } + + function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; + } + + function rangeClear(table_selector_jq_friendly, event) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + yadcfState, + column_number; + + column_number = parseInt($(event.target).parent().attr("id").replace('yadcf-filter-wrapper-' + table_selector_jq_friendly + '-', ''), 10); + + $(event.target).parent().find(".yadcf-filter-range").val(""); + if ($(event.target).parent().find(".yadcf-filter-range-number").length > 0) { + $($(event.target).parent().find(".yadcf-filter-range")[0]).focus(); + } + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + oTable.fnDraw(); + } else { + oTable.fnFilter('-yadcf_delim-', column_number); + } + + if (!oTable.fnSettings().oLoadedState) { + oTable.fnSettings().oLoadedState = {}; + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + if (oTable.fnSettings().oFeatures.bStateSave === true) { + if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) { + oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = + { + 'from' : "", + 'to' : "" + }; + } else { + yadcfState = {}; + yadcfState[table_selector_jq_friendly] = []; + yadcfState[table_selector_jq_friendly][column_number] = { + 'from' : "", + 'to' : "" + }; + oTable.fnSettings().oLoadedState.yadcfState = yadcfState; + } + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + resetIApiIndex(); + + $(event.target).parent().find(".yadcf-filter-range").removeClass("inuse"); + + return; + } + + function rangeNumberSliderClear(table_selector_jq_friendly, event) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + min_val, + max_val; + + min_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-min-tip-hidden")).text(); + max_val = +$($(event.target).parent().find(".yadcf-filter-range-number-slider-max-tip-hidden")).text(); + + $("#" + $(event.target).prev().find(".yadcf-filter-range-number-slider").attr("id")).slider("option", "values", [min_val, max_val]); + + $($(event.target).prev().find(".ui-slider-handle")[0]).attr("tabindex", -1).focus(); + + $($(event.target).prev().find(".ui-slider-handle")[0]).removeClass("inuse"); + $($(event.target).prev().find(".ui-slider-handle")[1]).removeClass("inuse"); + $(event.target).prev().find(".ui-slider-range").removeClass("inuse"); + + oTable.fnDraw(); + resetIApiIndex(); + + return; + } + + function dateKeyUP(table_selector_jq_friendly, date_format, event) { + var oTable, + date, + dateId, + column_number; + + dateId = event.target.id; + date = document.getElementById(dateId).value; + try { + if (date.length === (date_format.length + 2)) { + date = (date !== "") ? $.datepicker.parseDate(date_format, date) : date; + } + } catch (err1) {} + + if (((date instanceof Date) || date === "")) { + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + column_number = parseInt(dateId.replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10); + + if (date instanceof Date) { + $("#" + dateId).addClass('inuse'); + oTable.fnFilter(document.getElementById(dateId).value, column_number); + } else { + $("#" + dateId).removeClass('inuse'); + } + if ($.trim(event.target.value) === '' && $(event.target).hasClass('inuse')) { + $('#' + event.target.id).removeClass('inuse'); + oTable.fnFilter('', column_number); + } + resetIApiIndex(); + } else if ($(event.target).hasClass('inuse')) { + + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + oTable = oTables[table_selector_jq_friendly]; + column_number = parseInt(dateId.replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10); + + $("#" + dateId).removeClass('inuse'); + + oTable.fnFilter('', column_number); + resetIApiIndex(); + } + } + + function rangeDateKeyUP(table_selector_jq_friendly, date_format, event) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + min, + min_server, + max, + max_server, + fromId, + toId, + column_number, + options, + keyUp; + + column_number = parseInt($(event.target).attr("id").replace('-from-date-', '').replace('-to-date-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10); + options = getOptions(oTable.selector)[column_number]; + + keyUp = function () { + if (event.target.id.indexOf("-from-") !== -1) { + fromId = event.target.id; + toId = event.target.id.replace("-from-", "-to-"); + + min = document.getElementById(fromId).value; + max = document.getElementById(toId).value; + } else { + toId = event.target.id; + fromId = event.target.id.replace("-to-", "-from-"); + + max = document.getElementById(toId).value; + min = document.getElementById(fromId).value; + } + + try { + if (min.length === (date_format.length + 2)) { + min = (min !== "") ? $.datepicker.parseDate(date_format, min) : min; + } + } catch (err1) {} + try { + if (max.length === (date_format.length + 2)) { + max = (max !== "") ? $.datepicker.parseDate(date_format, max) : max; + } + } catch (err2) {} + + if (((max instanceof Date) && (min instanceof Date) && (max >= min)) || min === "" || max === "") { + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + oTable.fnDraw(); + } else { + if (min instanceof Date) { + min_server = min.getTime(); + } else { + min_server = min; + } + if (max instanceof Date) { + max_server = max.getTime(); + } else { + max_server = max; + } + oTable.fnFilter(min_server + '-yadcf_delim-' + max_server, column_number); + } + + if (min instanceof Date) { + $("#" + fromId).addClass("inuse"); + } else { + $("#" + fromId).removeClass("inuse"); + } + if (max instanceof Date) { + $("#" + toId).addClass("inuse"); + } else { + $("#" + toId).removeClass("inuse"); + } + + if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) { + $("#" + event.target.id).removeClass("inuse"); + } + + } + resetIApiIndex(); + }; + + if (options.filter_delay === undefined) { + keyUp(table_selector_jq_friendly, event); + } else { + yadcfDelay(function () { + keyUp(table_selector_jq_friendly, event); + }, options.filter_delay); + } + } + + function rangeNumberKeyUP(table_selector_jq_friendly, event) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + min, + max, + fromId, + toId, + yadcfState, + column_number, + options, + keyUp; + + column_number = parseInt($(event.target).attr("id").replace('-from-', '').replace('-to-', '').replace('yadcf-filter-' + table_selector_jq_friendly, ''), 10); + options = getOptions(oTable.selector)[column_number]; + + keyUp = function () { + + if (event.target.id.indexOf("-from-") !== -1) { + fromId = event.target.id; + toId = event.target.id.replace("-from-", "-to-"); + + min = document.getElementById(fromId).value; + max = document.getElementById(toId).value; + } else { + toId = event.target.id; + fromId = event.target.id.replace("-to-", "-from-"); + + max = document.getElementById(toId).value; + min = document.getElementById(fromId).value; + } + + min = (min !== "") ? (+min) : min; + max = (max !== "") ? (+max) : max; + + if ((!isNaN(max) && !isNaN(min) && (max >= min)) || min === "" || max === "") { + + if (oTable.fnSettings().oFeatures.bServerSide !== true) { + oTable.fnDraw(); + } else { + oTable.fnFilter(min + '-yadcf_delim-' + max, column_number); + } + if (document.getElementById(fromId).value !== "") { + $("#" + fromId).addClass("inuse"); + } + if (document.getElementById(toId).value !== "") { + $("#" + toId).addClass("inuse"); + } + + if ($.trim(event.target.value) === "" && $(event.target).hasClass("inuse")) { + $("#" + event.target.id).removeClass("inuse"); + } + if (!oTable.fnSettings().oLoadedState) { + oTable.fnSettings().oLoadedState = {}; + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + if (oTable.fnSettings().oFeatures.bStateSave === true) { + if (oTable.fnSettings().oLoadedState.yadcfState !== undefined && oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly] !== undefined) { + oTable.fnSettings().oLoadedState.yadcfState[table_selector_jq_friendly][column_number] = + { + 'from' : min, + 'to' : max + }; + } else { + yadcfState = {}; + yadcfState[table_selector_jq_friendly] = []; + yadcfState[table_selector_jq_friendly][column_number] = { + 'from' : min, + 'to' : max + }; + oTable.fnSettings().oLoadedState.yadcfState = yadcfState; + } + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + } + } + resetIApiIndex(); + }; + + if (options.filter_delay === undefined) { + keyUp(); + } else { + yadcfDelay(function () { + keyUp(); + }, options.filter_delay); + } + } + + function textKeyUP(table_selector_jq_friendly, event, clear) { + + var column_number = parseInt($(event.target).attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-", "").replace('-reset', ''), 10), + oTable = oTables[table_selector_jq_friendly], + options = getOptions(oTable.selector)[column_number], + + keyUp = function (table_selector_jq_friendly, event, clear) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + + if (clear !== undefined || event.target.value === '') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).val("").focus(); + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + oTable.fnFilter("", column_number); + resetIApiIndex(); + return; + } + + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).addClass("inuse"); + + yadcfMatchFilter(oTable, event.target.value, options.filter_match_mode, column_number); + + resetIApiIndex(); + }; + + if (options.filter_delay === undefined) { + keyUp(table_selector_jq_friendly, event, clear); + } else { + yadcfDelay(function () { + keyUp(table_selector_jq_friendly, event, clear); + }, options.filter_delay); + } + } + + function autocompleteKeyUP(table_selector_jq_friendly, event) { + if (event.target.value === "" && event.keyCode === 8 && $(event.target).hasClass("inuse")) { + $.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly]; + var oTable = oTables[table_selector_jq_friendly], + column_number = parseInt($(event.target).attr("id").replace("yadcf-filter-" + table_selector_jq_friendly + "-", ""), 10); + + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).removeClass("inuse"); + $(document).removeData("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val"); + oTable.fnFilter("", column_number); + resetIApiIndex(); + } + } + + //taken and modified from DataTables 1.10.0-beta.2 source + function yadcfVersionCheck(version) { + var aThis = $.fn.dataTable.ext.sVersion.split('.'), + aThat = version.split('.'), + iThis, + iThat, + i, + iLen; + + for (i = 0, iLen = aThat.length; i < iLen; i++) { + iThis = parseInt(aThis[i], 10) || 0; + iThat = parseInt(aThat[i], 10) || 0; + + // Parts are the same, keep comparing + if (iThis === iThat) { + continue; + } + + // Parts are different, return immediately + return iThis > iThat; + } + + return true; + } + + function initAndBindTable(oTable, table_selector, index) { + + var table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(table_selector), + table_selector_tmp; + oTables[table_selector_jq_friendly] = oTable; + oTablesIndex[table_selector_jq_friendly] = index; + + if (oTable.fnSettings().sAjaxSource === null && oTable.fnSettings().ajax === null) { + table_selector_tmp = table_selector; + if (table_selector.indexOf(":eq") !== -1) { + table_selector_tmp = table_selector.substring(0, table_selector.lastIndexOf(":eq")); + } + appendFilters(oTable, yadcf.getOptions(table_selector_tmp), table_selector); + } else { + appendFilters(oTable, yadcf.getOptions(table_selector), table_selector); + if (yadcfVersionCheck('1.10')) { + $(document).off('draw.dt').on('draw.dt', oTable.selector, function (event, ui) { + appendFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector); + }); + $(document).off('xhr.dt').on('xhr.dt', function (e, settings, json) { + var col_num; + for (col_num in yadcf.getOptions(settings.oInstance.selector)) { + if (yadcf.getOptions(settings.oInstance.selector).hasOwnProperty(col_num)) { + if (json['yadcf_data_' + col_num] !== undefined) { + yadcf.getOptions(settings.oInstance.selector)[col_num].data = json['yadcf_data_' + col_num]; + } + } + } + }); + $(document).off('column-visibility.dt').on('column-visibility.dt', function (e, settings, col_num, state) { + var obj = {}; + if (state === true) { + obj[col_num] = yadcf.getOptions(settings.oInstance.selector)[col_num]; + appendFilters(oTables[yadcf.generateTableSelectorJQFriendly(settings.oInstance.selector)], + obj, + settings.oInstance.selector); + } + }); + } else { + $(document).off('draw').on('draw', oTable.selector, function (event, ui) { + appendFilters(oTable, yadcf.getOptions(ui.oInstance.selector), ui.oInstance.selector); + }); + } + } + if (oTable.fnSettings().oFeatures.bStateSave === true) { + if (yadcfVersionCheck('1.10')) { + $(oTable.selector).off('stateSaveParams.dt').on('stateSaveParams.dt', function (e, settings, data) { + if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) { + data.yadcfState = settings.oLoadedState.yadcfState; + } else { + data.naruto = 'kurama'; + } + }); + } else { + $(oTable.selector).off('stateSaveParams').on('stateSaveParams', function (e, settings, data) { + if (settings.oLoadedState && settings.oLoadedState.yadcfState !== undefined) { + data.yadcfState = settings.oLoadedState.yadcfState; + } else { + data.naruto = 'kurama'; + } + }); + } + //when using DOM source + if (oTable.fnSettings().sAjaxSource === null && oTable.fnSettings().ajax === null) { + //we need to make sure that the yadcf state will be saved after page reload + oTable.fnSettings().oApi._fnSaveState(oTable.fnSettings()); + //redraw the table in order to apply the filters + oTable.fnDraw(); + } + } + } + + $.fn.yadcf = function (options_arg) { + + if ($(this.selector).length === 1) { + setOptions(this.selector, options_arg); + initAndBindTable(this, this.selector, 0); + } else { + var i = 0, + selector; + for (i; i < $(this.selector).length; i++) { + $.fn.dataTableExt.iApiIndex = i; + selector = this.selector + ":eq(" + i + ")"; + setOptions(this.selector, options_arg); + initAndBindTable(this, selector, i); + } + $.fn.dataTableExt.iApiIndex = 0; + } + return this; + }; + + function init(oTable, options_arg) { + var instance = oTable.settings()[0].oInstance, + i = 0, + selector; + if ($(instance.selector).length === 1) { + setOptions(instance.selector, options_arg); + initAndBindTable(instance, instance.selector, 0); + } else { + for (i; i < $(instance.selector).length; i++) { + $.fn.dataTableExt.iApiIndex = i; + selector = instance.selector + ":eq(" + i + ")"; + setOptions(instance.selector, options_arg); + initAndBindTable(instance, selector, i); + } + $.fn.dataTableExt.iApiIndex = 0; + } + } + + function stopPropagation(evt) { + if (evt.stopPropagation !== undefined) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + + //-------------------------------------------------------- + function exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr) { + return function () { + exFilterColumn(table_arg, col_filter_arr, true); + }; + } + + function exFilterColumn(table_arg, col_filter_arr, ajaxSource) { + var table_selector_jq_friendly, + j, + tmpStr, + column_number, + filter_value, + fromId, + toId, + sliderId, + optionsObj; + //check if the table arg is from new datatables API (capital "D") + if (table_arg.settings !== undefined) { + table_arg = table_arg.settings()[0].oInstance; + } + table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(table_arg.selector); + if ((table_arg.fnSettings().sAjaxSource === null && table_arg.fnSettings().ajax === null) || ajaxSource === true) { + for (j = 0; j < col_filter_arr.length; j++) { + column_number = col_filter_arr[j][0]; + optionsObj = getOptions(table_arg.selector)[column_number]; + filter_value = col_filter_arr[j][1]; + + switch (optionsObj.filter_type) { + case 'select': + case 'auto_complete': + case 'text': + case 'date': + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value).addClass('inuse'); + tmpStr = yadcfMatchFilterString(table_arg, column_number, filter_value, optionsObj.filter_match_mode, false); + table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = tmpStr; + break; + case 'multi_select': + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(filter_value); + tmpStr = yadcfMatchFilterString(table_arg, column_number, filter_value, optionsObj.filter_match_mode, true); + table_arg.fnSettings().aoPreSearchCols[column_number].sSearch = tmpStr; + if (optionsObj.select_type !== undefined) { + if (optionsObj.select_type === 'chosen') { + $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).trigger('chosen:updated'); + } else if (optionsObj.select_type === 'select2') { + $("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number).select2("destroy").select2(optionsObj.select_type_options); + } + } + break; + case 'range_date': + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number; + if (filter_value.from !== '') { + $('#' + fromId).val(filter_value.from); + $('#' + fromId).addClass('inuse'); + } + if (filter_value.to !== '') { + $('#' + toId).val(filter_value.to); + $('#' + toId).addClass('inuse'); + } + break; + case 'range_number': + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number; + if (filter_value.from !== '') { + $('#' + fromId).val(filter_value.from); + $('#' + fromId).addClass('inuse'); + } + if (filter_value.to !== '') { + $('#' + toId).val(filter_value.to); + $('#' + toId).addClass('inuse'); + } + break; + case 'range_number_slider': + sliderId = 'yadcf-filter-' + table_selector_jq_friendly + '-slider-' + column_number; + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number; + if (filter_value.from !== '') { + $('#' + fromId).text(filter_value.from); + $('#' + fromId).parent().addClass('inuse'); + $('#' + fromId).parent().parent().find('ui-slider-range').addClass('inuse'); + $('#' + sliderId).slider('values', 0, filter_value.from); + } + if (filter_value.to !== '') { + $('#' + toId).text(filter_value.to); + $('#' + toId).parent().addClass('inuse'); + $('#' + toId).parent().parent().find('.ui-slider-range').addClass('inuse'); + $('#' + sliderId).slider('values', 1, filter_value.to); + } + break; + } + + } + if (table_arg.fnSettings().oFeatures.bServerSide !== true) { + table_arg.fnDraw(); + } else { + switch (optionsObj.filter_type) { + case 'select': + case 'auto_complete': + case 'text': + case 'date': + setTimeout(function () { + table_arg.fnFilter(filter_value, column_number); + }, 10); + break; + default: + console.log('exFilterColumn is not supported for ' + optionsObj.filter_type); + break; + } + } + } else { + exFilterColumnQueue.push(exInternalFilterColumnAJAXQueue(table_arg, col_filter_arr)); + } + } + + function exGetColumnFilterVal(table_arg, column_number) { + var retVal, + fromId, + toId, + table_selector_jq_friendly, + optionsObj = getOptions(table_arg.selector)[column_number]; + + table_selector_jq_friendly = yadcf.generateTableSelectorJQFriendly(table_arg.selector); + + switch (optionsObj.filter_type) { + case 'select': + retVal = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(); + if (retVal === '-1') { + retVal = ''; + } + break; + case 'auto_complete': + case 'text': + case 'date': + retVal = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(); + break; + case 'multi_select': + retVal = $('#yadcf-filter-' + table_selector_jq_friendly + '-' + column_number).val(); + if (retVal === null) { + retVal = ''; + } + break; + case 'range_date': + retVal = {}; + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-date-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-date-' + column_number; + + retVal.from = $('#' + fromId).val(); + retVal.to = $('#' + toId).val(); + break; + case 'range_number': + retVal = {}; + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-from-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-to-' + column_number; + + retVal.from = $('#' + fromId).val(); + retVal.to = $('#' + toId).val(); + break; + case 'range_number_slider': + retVal = {}; + fromId = 'yadcf-filter-' + table_selector_jq_friendly + '-min_tip-' + column_number; + toId = 'yadcf-filter-' + table_selector_jq_friendly + '-max_tip-' + column_number; + + retVal.from = $('#' + fromId).text(); + retVal.to = $('#' + toId).text(); + break; + } + return retVal; + } + return { + init : init, + doFilter : doFilter, + doFilterMultiSelect : doFilterMultiSelect, + doFilterAutocomplete : doFilterAutocomplete, + autocompleteKeyUP : autocompleteKeyUP, + getOptions : getOptions, + rangeNumberKeyUP : rangeNumberKeyUP, + rangeDateKeyUP : rangeDateKeyUP, + rangeClear : rangeClear, + rangeNumberSliderClear : rangeNumberSliderClear, + stopPropagation : stopPropagation, + generateTableSelectorJQFriendly : generateTableSelectorJQFriendly, + exFilterColumn : exFilterColumn, + exGetColumnFilterVal : exGetColumnFilterVal, + dateKeyUP : dateKeyUP, + dateSelectSingle : dateSelectSingle, + textKeyUP : textKeyUP, + doFilterCustomDateFunc : doFilterCustomDateFunc + }; + +}(jQuery));