datawinners/media/javascript/data_tables/js/dwtable.js
(function ($) {
$.fn.dwTable = function (options) {
function continue_dwtable_creation() {
var sliceGroups = function(data, start, length) {
var newData = [];
var groupKeys = Object.keys(data);
for (var count=start;count<start+length;count++) {
if (count >= groupKeys.length) break;
var rows = data[groupKeys[count]];
newData = newData.concat(rows);
}
return newData;
};
var paginateGroups = function(oSettings, fnCallback) {
displayStart = oSettings._iDisplayStart;
displayLength = oSettings._iDisplayLength;
var paginatedResult = {
"data": sliceGroups(defaults.result, displayStart, displayLength),
"iDisplayStart": displayStart,
"iDisplayLength": displayLength,
"iTotalDisplayRecords": Object.keys(defaults.result).length
}
fnCallback(paginatedResult);
};
var defaults = {
"concept": "Row",
"sDom": "ipfrtipl",
"bProcessing": true,
"aLengthMenu": [10, 25, 50, 100],
"iDisplayLength": 25,
"bResetDisplay": true,
"sAjaxDataProp": "data",
"sPaginationType": "dw_pagination",
"onMenuLoad": function(){},
"searchPlaceholderText": '',
'getFilter': function () {
},
"fnServerData": function (sSource, aoData, fnCallback, oSettings) {
lastXHR = oSettings.jqXHR;
lastXHR && lastXHR.abort && lastXHR.abort();
aoData.push({"name": "disable_cache", "value": new Date().getTime()});
aoData.push({"name": "search_filters", "value": JSON.stringify(defaults.getFilter())});
//this.fnFilter(filterVal);
oSettings.jqXHR = $.ajax({
"dataType": 'json',
"type": "POST",
"url": sSource,
"data": aoData,
"success": function (result) {
$.each(result.data, function (i, data) {
data.unshift('')
});
if (result.data.length > 0 && defaults.paginateGroups) {
defaults.result = _.groupBy(result.data, result.data[0].length - 1);
paginateGroups(oSettings, fnCallback);
return;
}
fnCallback(result);
},
"error": function () {
},
"global": false
});
}
}
$.extend(defaults, options);
defaults["oLanguage"] = defaults["oLanguage"] || {};
$.extend(defaults["oLanguage"], {
"sInfoFiltered": "",
"sLengthMenu": gettext("Show") + " _MENU_ " + gettext(defaults.concept)+ "s",
"sProcessing": "<img class=\"search-loader\"src=\"/media/images/ajax-loader.gif\"></img>",
"sInfo": interpolate(gettext("<b>%(start)s to %(end)s</b> of %(total)s %(subject_type)s(s)"),
{'start': '_START_', 'end': '_END_', 'total': '_TOTAL_', subject_type: gettext(defaults.concept)}, true),
"sInfoEmpty": gettext("<b> 0 to 0</b> of 0") + " " + gettext(defaults.concept),
"sSearch": "<label><strong>" + gettext("Search:") + "</strong></label>", "sZeroRecords": gettext("No matching records found")
});
defaults["aoColumns"] && defaults["aoColumns"].unshift({"sTitle": "<input type='checkbox' class='checkall-checkbox'/>"});
defaults["aoColumnDefs"] = defaults["aoColumnDefs"] || [];
if (typeof defaults["actionItems"] != "undefined") {
defaults["aoColumnDefs"].push({ "sTitle": "<input type='checkbox' class='checkall-checkbox'></input>", "fnRender": function (data) {
cb = '<input type="checkbox" class="row_checkbox" value="' + data.aData[options.sAjaxDataIdColIndex] + '"/>';
if (options.remove_id) {
data.aData.splice([options.sAjaxDataIdColIndex], 1);
}
return cb
}, "aTargets": [0] });
defaults["aoColumnDefs"].push({"bSortable": false, "aTargets": [0]});
}
defaults["fnPreDrawCallback"] = function (oSettings) {
$(this).find("input:checked").attr('checked', false);
_reset_start_page_when_page_length_changes.call(this, oSettings);
};
function _reset_start_page_when_page_length_changes(oSettings) {
previous_page_length = jQuery.data($(this)[0], "displayLength");
if (previous_page_length != oSettings._iDisplayLength) {
jQuery.data($(this)[0], "displayLength", oSettings._iDisplayLength);
oSettings._iDisplayStart = 0;
}
}
defaults["fnDrawCallback"] = function (orignal_handler) {
return function (oSettings) {
$(this).find("thead input:checkbox").attr("disabled", oSettings.fnRecordsDisplay() == 0);
var nCols = $(this).find('thead>tr').children('th').length;
$(this).find('tbody').prepend('<tr style="display:none;"><td class ="table_message" colspan=' + nCols + '><div class="select_all_message"></div></td></tr>');
$(this).find(".select_all_message").data('all_selected', false);
$(".repeat_ans").parents("td").addClass('repeat_ans_style');
format_repeat_question();
if (typeof orignal_handler == "function") orignal_handler.apply(this, arguments);
}
}(defaults["fnDrawCallback"]);
defaults["fnInitComplete"] = function (original_init_complete_handler, concept, actionItems, displayLength) {
return function () {
var dataTableObject = this;
//Used to reset page number when page length changes
jQuery.data($(this)[0], "displayLength", displayLength);
if (typeof actionItems != "undefined" && actionItems.length) {
var dropdown_id = "dropdown-menu" + Math.floor(Math.random() * 10000000000000001);
var html = '<div class="table_action_button action_bar clear-both"> <div class="btn-group">' +
'<button class="btn dropdown-toggle action" href="#" data-dropdown="#' + dropdown_id + '">Actions' +
'<span class="caret"></span> </button> </div></div>';
var action_button = $(dataTableObject).parents(".dataTables_wrapper").find(".dataTables_info").before($(html));
var select_link_text = interpolate(gettext("Select a %(concept)s"), {"concept": gettext(concept)}, true);
$(document.body).append('<div id="' + dropdown_id + '" class="dropdown"> <ul class="dropdown-menu"><li class="none-selected disabled"><label>' + select_link_text + '</label><li></ul> </div>');
$(".checkall-checkbox").parents("th").addClass("checkbox_col");
for (var item = 0; item < actionItems.length; item++) {
var item_handler = function (handler) {
return function (e) {
if ($(this).hasClass("disabled")) {
e.preventDefault();
return false;
}
var all_selected = $(dataTableObject).find(".select_all_message").data('all_selected');
var selected_ids = $.map($(dataTableObject).find("input.row_checkbox:checked"), function (e) {
return $(e).val()
});
return handler(dataTableObject, selected_ids, all_selected);
};
};
var menu_item = $('<li class="' + actionItems[item].allow_selection + '"><a class="' + actionItems[item].label.toLowerCase() + '">' + gettext(actionItems[item].label) + '</a></li>');
if(typeof(actionItems[item].id) != undefined){
menu_item.find("a").attr('id', actionItems[item].id);
}
var a = $("#" + dropdown_id + ">.dropdown-menu").append(menu_item);
$(menu_item, 'a').click(item_handler(actionItems[item].handler));
}
$(this).parents(".dataTables_wrapper").find('.action').click(function () {
var all_selected = $(dataTableObject).find(".select_all_message").data('all_selected');
var selected_count = $(this).parents('.dataTables_wrapper').find('input:checked').not(".checkall-checkbox").length;
if (selected_count == 0) {
$("#" + dropdown_id + ">.dropdown-menu li").hide();
$("#" + dropdown_id + ">.dropdown-menu li.none-selected").show();
} else {
$("#" + dropdown_id + ">.dropdown-menu li").show();
$("#" + dropdown_id + ">.dropdown-menu li.none-selected").hide();
if (selected_count > 1 || all_selected)
$("#" + dropdown_id + ">.dropdown-menu li.single").addClass('disabled')
else
$("#" + dropdown_id + ">.dropdown-menu li.single").removeClass('disabled')
}
defaults['onMenuLoad']();
});
}
function clear_select_all_rows() {
$(dataTableObject).find(".select_all_message").data('all_selected', false);
$(dataTableObject).find('input:checked').attr('checked', false);
$(dataTableObject).find(".select_all_message").html('');
$(dataTableObject).find(".select_all_message").parents('tr').hide();
}
function select_all_rows() {
$(dataTableObject).find(".select_all_message").data('all_selected', true);
var total_number_of_records = $(dataTableObject).dataTable().fnSettings().fnRecordsDisplay();
var msg = interpolate(gettext("You have selected all %(total_number_of_records)s %(concept)s(s)."), {"total_number_of_records": total_number_of_records, "concept": gettext(concept)}, true);
msg += ' <a href="javascript:void(0);">' + gettext("Clear Selection") + '</a>';
$(dataTableObject).find(".select_all_message").html(msg);
$(dataTableObject).find(".select_all_message").find('a').click(clear_select_all_rows);
}
function show_select_all_message(show) {
var show = $(dataTableObject).find(".checkall-checkbox").is(":checked");
boxes = $(dataTableObject).find("input.row_checkbox")
var total_number_of_records = $(dataTableObject).dataTable().fnSettings().fnRecordsDisplay();
var are_there_more_items = (boxes.length != total_number_of_records);
if (show && are_there_more_items) {
var msg = "";
$(dataTableObject).find(".table_message").parent().show();
msg = interpolate(gettext("You have selected <b>%(number_of_records)s</b> %(concept)s(s) on this page."), {"number_of_records": boxes.length, "concept": gettext(concept)}, true);
msg += ' <a href="javascript:void(0);">' + interpolate(gettext('Select all <b> %(total_number_of_records)s </b>%(concept)s(s)'),
{'total_number_of_records': total_number_of_records, "concept": gettext(concept)}, true) + "</a>";
var link = $(msg)
$(dataTableObject).find(".select_all_message").html(msg);
$(dataTableObject).find(".select_all_message").find('a').click(select_all_rows);
} else {
$(dataTableObject).find(".select_all_message").data('all_selected', false);
$(dataTableObject).find(".table_message").parent().hide();
$(dataTableObject).find(".select_all_message").html('')
}
}
$(this).find(".checkall-checkbox").click(function () {
$('.select_all_message').width($('.grid_23').width())
$(dataTableObject).find("input.row_checkbox").attr('checked', $(this).is(":checked"));
show_select_all_message();
});
$(this).on('click', ".row_checkbox", function () {
boxes = $(dataTableObject).find("input.row_checkbox")
all_checked = boxes.length == boxes.filter(":checked").length
$(dataTableObject).find(".checkall-checkbox").attr('checked', all_checked);
show_select_all_message();
});
$(".paging_dw_pagination").show();
$(".dataTables_filter").show();
try {
$(dataTableObject).parents(".dataTables_wrapper").find(".dataTables_filter input").attr('placeholder', gettext(defaults.searchPlaceholderText)).watermark(gettext(defaults.searchPlaceholderText));
} catch (ignore) {
} //fails on old IEs
if (typeof original_init_complete_handler == "function") original_init_complete_handler.apply(this, arguments);
}
}(defaults["fnInitComplete"], defaults.concept, defaults.actionItems, defaults.iDisplayLength);
$(this).dataTable(defaults)["_dw"] = defaults;
$(this, "table").wrap('<div class="table_wrapper"></div>');
}
if ($(this).find('th').length == 0 && typeof options["aoColumns"] == "undefined") {
$.ajax({"dataType": 'json',
"type": "GET",
"url": options.sAjaxSource,
"data": {"header": true},
"success": function () {
continue_dwtable_creation();
}});
} else {
continue_dwtable_creation.apply(this, arguments);
}
};
})(jQuery);
$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, fnCallback, bStandingRedraw) {
if (sNewSource !== undefined && sNewSource !== null) {
oSettings.sAjaxSource = sNewSource;
}
// Server-side processing should just call fnDraw
if (oSettings.oFeatures.bServerSide) {
oSettings["iInitDisplayStart"] = oSettings._iDisplayStart;
this.fnDraw(false);
return;
}
this.oApi._fnProcessingDisplay(oSettings, true);
var that = this;
var iStart = oSettings._iDisplayStart;
var aData = [];
this.oApi._fnServerParams(oSettings, aData);
oSettings.fnServerData.call(oSettings.oInstance, oSettings.sAjaxSource, aData, function (json) {
/* Clear the old information from the table */
that.oApi._fnClearTable(oSettings);
/* Got the data - add it to the table */
var aData = (oSettings.sAjaxDataProp !== "") ?
that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json;
for (var i = 0; i < aData.length; i++) {
that.oApi._fnAddData(oSettings, aData[i]);
}
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
that.fnDraw();
if (bStandingRedraw === true) {
oSettings._iDisplayStart = iStart;
that.oApi._fnCalculateEnd(oSettings);
that.fnDraw(false);
}
that.oApi._fnProcessingDisplay(oSettings, false);
/* Callback user function - for event handlers etc */
if (typeof fnCallback == 'function' && fnCallback !== null) {
fnCallback(oSettings);
}
}, oSettings);
};
$.fn.dataTableExt.oApi.fnDisplayStart = function (oSettings, iStart, bRedraw) {
if (typeof bRedraw == 'undefined') {
bRedraw = true;
}
oSettings._iDisplayStart = iStart;
oSettings.oApi._fnCalculateEnd(oSettings);
if (bRedraw) {
oSettings.oApi._fnDraw(oSettings);
}
};
function get_updated_table_page_index(table, allIds, all_selected) {
var settings = table.fnSettings();
if (current_page_rows_going_to_vanish()) {
return 0;
} else {
return settings._iDisplayStart;
}
function is_last_page() {
return (settings.fnDisplayEnd() == settings.fnRecordsDisplay());
}
function current_page_rows_going_to_vanish() {
return all_selected ||
(is_last_page() &&
(table.find("input.row_checkbox").length == allIds.length))
}
}
function format_repeat_question(){
var repeatedQuestions = $(".repeat_qtn_label");
for (var i = 0; i < repeatedQuestions.length; i++) {
var currentRepeatQuestion = repeatedQuestions[i];
var questionText = $(currentRepeatQuestion).text();
var questionTextArray = questionText.split(' ');
if (questionTextArray.length > 3){
var displayText = questionTextArray.slice(0,3).join(' ') + '... ';
$(currentRepeatQuestion).text(displayText);
var toolTip = '<div class="tooltip"><p>' + questionText + '</p></div>';
$(toolTip).insertAfter(currentRepeatQuestion);
DW.ToolTip({target: $(currentRepeatQuestion)});
}
}
}