// JavaScript Document: tablePagerFilter.js
// Script Name: Table Pager Searcher
// Plugin URI: www.softcos.eu
// Description: Script per paginazione e ricerca in tabella HTML
// Author: Enzo Costantini (SoftCos)
// Author URI: www.softcos.eu
//
function tableNavigate(selfName, tableName, itemsPerPage) {
this.table = document.getElementById(tableName); // controllare che esista!!!
this.itemsPerPage = itemsPerPage;
this.selfName = selfName;
this.filteredRows = [];
// struttura dell'array columnTypes [{a: "AVG"|"SUM"|"COUNT"|"MIN"|"MAX", t: "INT"|"FLOAT"|"CURR", d: ##}...]
this.columnTypes = [];
this.aggregatedValues = [];
this.totalRow = null;
this.subTotalRow = null;
this.searchObj = [];
this.pages = 0;
this.inited = false;
this.createTotalBar = function() {
if (this.table.tFoot) {
this.totalRow = this.table.tFoot.insertRow(0);
} else {
this.totalRow = this.table.createTFoot().insertRow(0);
}
var cols = this.table.rows[0].cells.length;
var innerRow = '';
for (var i = 0; i < cols; i++) {
innerRow += '
| ';
}
this.totalRow.innerHTML = innerRow;
for (var i = 0; i < cols; i++) {
if (this.columnTypes[i]["t"] == "CURR"){
this.totalRow.cells[i].className = 'number';
}
}
}
this.createExportBar = function(){
var row = (this.table.tFoot) ? (this.table.tFoot.insertRow(-1)) : (this.table.createTFoot().insertRow(-1));
var cols = this.table.rows[0].cells.length;
row.innerHTML = ' | ';
row.cells[0].innerHTML =
'Esporta: ' +
'';
row.cells[0].innerHTML +=
' ' +
'';
}
this.createNavBar = function(){
var row = (this.table.tHead) ? (this.table.tHead.insertRow(0)) : (this.table.createTHead().insertRow(0));
var cols = this.table.tBodies[0].rows[0].cells.length;
row.innerHTML = '| Barra di navigazione |
';
}
this.createSearchBar = function(){
var cols = this.table.rows[0].cells.length;
var row = this.table.tHead.insertRow(-1);
row.setAttribute("id", "searchBar");
var th, input;
this.searchObj = [];
for (var i = 0; i < cols; i++) {
th = document.createElement('th');
row.appendChild(th);
input = document.createElement('input');
input.setAttribute('type', 'search');
input.setAttribute('spellcheck', 'false');
input.setAttribute('oninput', this.selfName + '.filterRows(this.value, ' + i + ');');
th.appendChild(input);
this.searchObj.push(input);
}
}
this.createSubTotalBar = function() {
var cols = this.table.rows[0].cells.length;
this.subTotalRow = this.table.tHead.insertRow(-1);
this.subTotalRow.style.display = 'none';
var innerRow = '';
for (var i = 0; i < cols; i++) {
innerRow += ' | ';
}
this.subTotalRow.innerHTML = innerRow;
for (var i = 0; i < cols; i++) {
if (this.columnTypes[i]["t"] == "CURR"){
this.subTotalRow.cells[i].className = 'number';
}
}
}
this.showRecords = function(from, to) {
var rows = this.table.tBodies[0].rows;
var l = rows.length;
for (var i = 0; i < l; i++) {
rows[i].style.display = 'none';
}
l = this.filteredRows.length;
for (var i = 0; i < l; i++) {
if (i >= from && i <= to) {
rows[this.filteredRows[i]].style.display = '';
}
}
}
this.showPage = function(pageNumber) {
if (!this.inited) {
alert("Attenzione! L'oggetto non ` stato inizializzato...");
return;
}
this.currentPage = pageNumber;
this.showPageNav();
var from = (pageNumber - 1) * itemsPerPage;
var to = from + this.itemsPerPage - 1;
this.showRecords(from, to);
}
this.first = function() {
if (this.currentPage > 1) {
this.showPage(1);
}
}
this.last = function() {
if (this.currentPage < this.pages) {
this.showPage(this.pages);
}
}
this.prev = function() {
if (this.currentPage > 1) {
this.showPage(this.currentPage - 1);
}
}
this.next = function() {
if (this.currentPage < this.pages) {
this.showPage(this.currentPage + 1);
}
}
this.processRow = function(row) {
for (var j = 0; j < this.columnTypes.length; j++) {
if (this.columnTypes[j]["a"] == "COUNT") {
this.aggregatedValues[j]++;
} else if (this.columnTypes[j]["a"] == "SUM") {
this.aggregatedValues[j] += string2Num(row.cells[j].innerHTML);
} else if (this.columnTypes[j]["a"] == "AVG") {
this.aggregatedValues[j] = (this.aggregatedValues[j] * (i) + string2Num(row.cells[j].innerHTML)) / (i + 1);
} else if (this.columnTypes[j]["a"] == "MIN") {
if (i == 0) {
this.aggregatedValues[j] = string2Num(rows[i].cells[j].innerHTML);
} else {
this.aggregatedValues[j] = Math.min(this.aggregatedValues[j], string2Num(row.cells[j].innerHTML));
}
} else if (this.columnTypes[j]["a"] == "MAX") {
this.aggregatedValues[j] = Math.max(this.aggregatedValues[j], string2Num(row.cells[j].innerHTML));
}
}
}
this.calculateTotals = function (rowBar, subSetRows) {
if (!rowBar) { return; }
var rows = this.table.tBodies[0].rows;
this.aggregatedValues = [];
for (var i = 0; i < this.columnTypes.length; i++) {
this.aggregatedValues.push(0);
}
if (subSetRows) {
for (var i = 0; i < subSetRows.length; i++) {
this.processRow(rows[subSetRows[i]]);
}
} else {
for (var i = 0; i < rows.length; i++) {
this.processRow(rows[i]);
}
}
for (var j = 0; j < this.columnTypes.length; j++) {
if (this.columnTypes[j]['a']) {
if (this.columnTypes[j]["t"]) {
if (this.columnTypes[j]["t"] == "CURR") {
rowBar.cells[j].innerHTML = this.aggregatedValues[j].format(2, 3, ' ', ',');
} else if (this.columnTypes[j]["t"] == "FLOAT") {
if (this.columnTypes[j]["d"]) {
rowBar.cells[j].innerHTML = this.aggregatedValues[j].format(this.columnTypes[j]["d"], 3, ' ', ',');
} else {
rowBar.cells[j].innerHTML = this.aggregatedValues[j].format(2, 3, ' ', ',');
}
} else {
rowBar.cells[j].innerHTML = this.aggregatedValues[j].format(0, 3, ' ', ',');
}
}
}
}
}
this.filterRows = function(keySearch, Id) {
Id = Id ? Id : 0;
var rows = this.table.tBodies[0].rows;
var l = rows.length;
for (var i = 0; i < this.searchObj.length; i++) {
if (i != Id) {
this.searchObj[i].value = '';
}
}
this.aggregatedValues = [];
for (var i = 0; i < this.columnTypes.length; i++) {
this.aggregatedValues.push(0);
}
this.filteredRows = [];
for (var i = 0; i < l; i++) {
// filtra le righe
var t = rows[i].cells[Id].innerHTML.replace(/(<([^>]+)>)/ig,"");
var regExp = new RegExp(keySearch, 'i');
if (regExp.test(t)) {
this.filteredRows.push(i);
}
}
// calcola i totali parziali
if (keySearch && (this.filteredRows.length > 0)) {
this.calculateTotals(this.subTotalRow, this.filteredRows)
this.subTotalRow.style.display = '';
} else {
this.subTotalRow.style.display = 'none';
}
this.pages = Math.ceil(this.filteredRows.length / this.itemsPerPage);;
this.currentPage = 1;
this.showPage(1);
}
this.init = function() {
this.createTotalBar();
this.createSearchBar();
this.createSubTotalBar();
this.createExportBar();
this.createNavBar();
this.calculateTotals(this.totalRow);
this.inited = true;
this.filterRows('');
}
this.showPageNav = function() {
if (!this.inited) {
return;
}
var firstPage = 0;
var lastPage = 0;
if (this.currentPage <= 2) {
firstPage = 1;
} else {
firstPage = this.currentPage - 2;
}
if (this.currentPage >= this.pages - 2) {
lastPage = this.pages;
} else {
lastPage = this.currentPage + 2;
}
var pagerHtml = ' ' +
' | ';
for (var page = firstPage; page <= lastPage; page++)
pagerHtml += '' + page + ' | ';
pagerHtml += ' ' +
' ';
this.table.tHead.rows[0].cells[0].innerHTML = pagerHtml;
// var element = document.getElementById("navDiv");
// element.innerHTML = pagerHtml;
var newPageAnchor = document.getElementById('pg' + this.currentPage);
if (newPageAnchor) newPageAnchor.className = 'pg-selected';
}
}
/**
* Number.prototype.format(n, x, s, c)
*
* @param integer n: length of decimal
* @param integer x: length of section
* @param mixed s: section delimiter
* @param mixed c: decimal delimiter
*/
Number.prototype.format = function(n, x, s, c) {
var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')',
num = this.toFixed(Math.max(0, ~~n));
return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
}
String.prototype.replaceAll = function(str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\$&"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$$$") : str2);
}
function string2Num(n) {
n = n.replaceAll('.', '');
n = n.replaceAll(' ', '');
return parseFloat(n.replaceAll(',', '.'));
}