/*
* File: jquery.dataTables.columnFilter.js
* Version: 1.0.0
* Author: Jovan Popovic
*
* Copyright 2011 Jovan Popovic, all rights reserved.
*
* This source file is free software, under either the GPL v2 license or a
* BSD style license, as supplied with this software.
*
* 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.
*
* Parameters:"
* @sPlaceHolder String Place where inline filtering function should be placed ("tfoot", "thead:before", "thead:after"). Default is "tfoot"
* @sRangeSeparator String Separator that will be used when range values are sent to the server-side. Default value is "~".
* @sRangeFormat string Default format of the From ... to ... range inputs. Default is From {from} to {to}
* @aoColumns Array Array of the filter settings that will be applied on the columns
*/
(function ($) {
var asInitVals, i, label, th;
var sTableId = "table";
var sRangeFormat = "From {from} to {to}";
//Array of the functions that will override sSearch_ parameters
var afnSearch_ = new Array();
var aiCustomSearch_Indexes = new Array();
var oFunctionTimeout = null;
function fnCreateInput(regex, smart, bIsNumber) {
var sCSSClass = "text_filter";
if (bIsNumber)
sCSSClass = "number_filter";
var input = $('');
th.html(input);
if (bIsNumber)
th.wrapInner('');
else
th.wrapInner('');
asInitVals[i] = label;
var index = i;
if (bIsNumber && !oTable.fnSettings().oFeatures.bServerSide) {
input.keyup(function () {
/* Filter on the column all numbers that starts with the entered value */
oTable.fnFilter('^' + this.value, index, true, false);
});
} else {
input.keyup(function () {
/* Filter on the column (the index) of this element */
oTable.fnFilter(this.value, index, regex, smart);
});
}
input.focus(function () {
if ($(this).hasClass("search_init")) {
$(this).removeClass("search_init");
this.value = "";
}
});
input.blur(function () {
if (this.value == "") {
$(this).addClass("search_init");
this.value = asInitVals[index];
}
});
}
function fnCreateRangeInput() {
th.html(_fnRangeLabelPart(0));
var sFromId = sTableId + 'range_from_' + i;
var from = $('');
th.append(from);
th.append(_fnRangeLabelPart(1));
var sToId = sTableId + 'range_to_' + i;
var to = $('');
th.append(to);
th.append(_fnRangeLabelPart(2));
th.wrapInner('');
var index = i;
aiCustomSearch_Indexes.push(i);
//------------start range filtering function
/* Custom filtering function which will filter data in column four between two values
* Author: Allan Jardine, Modified by Jovan Popovic
*/
$.fn.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) {
var iMin = document.getElementById(sFromId).value * 1;
var iMax = document.getElementById(sToId).value * 1;
var iValue = aData[index] == "-" ? 0 : aData[index] * 1;
if (iMin == "" && iMax == "") {
return true;
}
else if (iMin == "" && iValue < iMax) {
return true;
}
else if (iMin < iValue && "" == iMax) {
return true;
}
else if (iMin < iValue && iValue < iMax) {
return true;
}
return false;
}
);
//------------end range filtering function
$('#' + sFromId + ',#' + sToId, th).keyup(function () {
var iMin = document.getElementById(sFromId).value * 1;
var iMax = document.getElementById(sToId).value * 1;
if (iMin != 0 && iMax != 0 && iMin > iMax)
return;
oTable.fnDraw();
});
}
function fnCreateDateRangeInput() {
th.html(_fnRangeLabelPart(0));
var sFromId = sTableId + 'range_from_' + i;
var from = $('');
from.datepicker();
th.append(from);
th.append(_fnRangeLabelPart(1));
var sToId = sTableId + 'range_to_' + i;
var to = $('');
th.append(to);
th.append(_fnRangeLabelPart(2));
th.wrapInner('');
to.datepicker();
var index = i;
aiCustomSearch_Indexes.push(i);
//------------start date range filtering function
$.fn.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) {
var dStartDate = from.datepicker("getDate");
var dEndDate = to.datepicker("getDate");
var dCellDate = $.datepicker.parseDate($.datepicker.regional[""].dateFormat, aData[index]);
if (dCellDate == null)
return false;
if (dStartDate == null && dEndDate == null) {
return true;
}
else if (dStartDate == null && dCellDate < dEndDate) {
return true;
}
else if (dStartDate < dCellDate && dEndDate == null) {
return true;
}
else if (dStartDate < dCellDate && dCellDate < dEndDate) {
return true;
}
return false;
}
);
//------------end date range filtering function
$('#' + sFromId + ',#' + sToId, th).change(function () {
oTable.fnDraw();
});
}
function fnCreateSelect(aData) {
var index = i;
var r = '');
th.html(select);
th.wrapInner('');
select.change(function () {
//var val = $(this).val();
if ($(this).val() != "") {
$(this).removeClass("search_init");
} else {
$(this).addClass("search_init");
}
oTable.fnFilter($(this).val(), index);
});
}
function _fnRangeLabelPart(iPlace){
switch(iPlace){
case 0:
return sRangeFormat.substring(0, sRangeFormat.indexOf("{from}"));
case 1:
return sRangeFormat.substring(sRangeFormat.indexOf("{from}") + 6, sRangeFormat.indexOf("{to}"));
default:
return sRangeFormat.substring(sRangeFormat.indexOf("{to}") + 4);
}
}
$.fn.columnFilter = function (options) {
oTable = this;
var defaults = {
sPlaceHolder: "foot",
sRangeSeparator: "~",
iFilteringDelay: 500,
aoColumns: null,
sRangeFormat: "From {from} to {to}"
};
properties = $.extend(defaults, options);
return this.each(function () {
asInitVals = new Array();
var sFilterRow = "tfoot tr";
if (properties.sPlaceHolder == "head:after") {
sFilterRow = "thead tr:last";
} else if (properties.sPlaceHolder == "head:before") {
var tr = $("thead tr:last").detach();
tr.prependTo("thead");
sFilterRow = "thead tr:first";
}
$(sFilterRow + " th", oTable).each(function (index) {
i = index;
var aoColumn = { type: "text",
bRegex: false,
bSmart: true
};
if (properties.aoColumns != null) {
if (properties.aoColumns.length < i || properties.aoColumns[i] == null)
return;
aoColumn = properties.aoColumns[i];
}
label = $(this).text(); //"Search by " + $(this).text();
th = $($(this)[0]);
if (aoColumn != null) {
if (aoColumn.sRangeFormat != null)
sRangeFormat = aoColumn.sRangeFormat;
else
sRangeFormat = properties.sRangeFormat
switch (aoColumn.type) {
case "number":
fnCreateInput(true, false, true);
break;
case "text":
bRegex = (aoColumn.bRegex == null ? false : aoColumn.bRegex);
bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart);
fnCreateInput(bRegex, bSmart, false);
break;
case "select":
fnCreateSelect(aoColumn.values);
break;
case "number-range":
fnCreateRangeInput();
break;
case "date-range":
fnCreateDateRangeInput();
break;
default:
break;
}
}
});
for (j = 0; j < aiCustomSearch_Indexes.length; j++) {
var index = aiCustomSearch_Indexes[j];
var fnSearch_ = function () {
return $("#range_from_" + index).val() + properties.sRangeSeparator + $("#range_to_" + index).val()
}
afnSearch_.push(fnSearch_);
}
if (oTable.fnSettings().oFeatures.bServerSide) {
var fnServerDataOriginal = oTable.fnSettings().fnServerData;
oTable.fnSettings().fnServerData = function (sSource, aoData, fnCallback) {
for (j = 0; j < aiCustomSearch_Indexes.length; j++) {
var index = aiCustomSearch_Indexes[j];
for (k = 0; k < aoData.length; k++) {
if (aoData[k].name == "sSearch_" + index)
aoData[k].value = afnSearch_[j]();
}
}
aoData.push({ "name": "sRangeSeparator", "value": properties.sRangeSeparator });
if (fnServerDataOriginal != null) {
fnServerDataOriginal(sSource, aoData, fnCallback);
}
else {
$.getJSON(sSource, aoData, function (json) {
fnCallback(json)
});
}
/*
if (fnServerDataOriginal != null) {
if (properties.iDelay != 0) {
if (oFunctionTimeout != null)
window.clearTimeout(oFunctionTimeout);
oFunctionTimeout = window.setTimeout(function () {
fnServerDataOriginal(sSource, aoData, fnCallback);
}, properties.iDelay);
} else {
fnServerDataOriginal(sSource, aoData, fnCallback);
}
}
else
$.getJSON(sSource, aoData, function (json) {
fnCallback(json)
});
*/
};
}
});
};
})(jQuery);