mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-26 16:49:10 +01:00
Tablesort javascript file
This commit is contained in:
parent
fd25fbdc03
commit
e600ee01c7
157
phpgwapi/js/tablesort/tablesort.js
Normal file
157
phpgwapi/js/tablesort/tablesort.js
Normal file
@ -0,0 +1,157 @@
|
||||
/******************************************************************************
|
||||
* Sort tables by column *
|
||||
* Copyright (C) 2002 by Mike Hall *
|
||||
* Please see http://www.brainjar.com for terms of use. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program 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 *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software *
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*
|
||||
******************************************************************************/
|
||||
|
||||
/* function sortTable
|
||||
* @author Mike Hall
|
||||
* @abstract Sorts an table by selection sort
|
||||
* @param int col Number (0-n)of the column which will be used for the sorting
|
||||
* @param string section name of the id of the sorted section
|
||||
*/
|
||||
function sortTable(col,section) {
|
||||
|
||||
// Get the table section to sort.
|
||||
var tblEl = document.getElementById(section);
|
||||
|
||||
// Set up an array of reverse sort flags, if not done already.
|
||||
if (tblEl.reverseSort == null)
|
||||
tblEl.reverseSort = new Array();
|
||||
|
||||
// If this column was the last one sorted, reverse its sort direction.
|
||||
if (col == tblEl.lastColumn)
|
||||
tblEl.reverseSort[col] = !tblEl.reverseSort[col];
|
||||
|
||||
// Remember this column as the last one sorted.
|
||||
tblEl.lastColumn = col;
|
||||
|
||||
// Set the table display style to "none" - necessary for Netscape 6
|
||||
// browsers.
|
||||
var oldDsply = tblEl.style.display;
|
||||
tblEl.style.display = "none";
|
||||
|
||||
// Sort the rows based on the content of the specified column using a
|
||||
// selection sort.
|
||||
|
||||
var tmpEl;
|
||||
var i, j;
|
||||
var minVal, minIdx;
|
||||
var testVal;
|
||||
var cmp;
|
||||
|
||||
for (i = 0; i < tblEl.rows.length - 1; i++) {
|
||||
|
||||
// Assume the current row has the minimum value.
|
||||
minIdx = i;
|
||||
minVal = TSgetTextValue(tblEl.rows[i].cells[col]);
|
||||
|
||||
// Search the rows that follow the current one for a smaller value.
|
||||
for (j = i + 1; j < tblEl.rows.length; j++) {
|
||||
testVal = TSgetTextValue(tblEl.rows[j].cells[col]);
|
||||
cmp = TScompareValues(minVal, testVal);
|
||||
// Reverse order?
|
||||
if (tblEl.reverseSort[col])
|
||||
cmp = -cmp;
|
||||
// If this row has a smaller value than the current minimum, remember its
|
||||
// position and update the current minimum value.
|
||||
if (cmp > 0) {
|
||||
minIdx = j;
|
||||
minVal = testVal;
|
||||
}
|
||||
}
|
||||
|
||||
// By now, we have the row with the smallest value. Remove it from the
|
||||
// table and insert it before the current row.
|
||||
if (minIdx > i) {
|
||||
tmpEl = tblEl.removeChild(tblEl.rows[minIdx]);
|
||||
tblEl.insertBefore(tmpEl, tblEl.rows[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Restore the table's display style.
|
||||
tblEl.style.display = oldDsply;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Functions to get and compare values during a sort.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// This code is necessary for browsers that don't reflect the DOM constants
|
||||
// (like IE).
|
||||
if (document.ELEMENT_NODE == null) {
|
||||
document.ELEMENT_NODE = 1;
|
||||
document.TEXT_NODE = 3;
|
||||
}
|
||||
|
||||
function TSgetTextValue(el) {
|
||||
|
||||
var i;
|
||||
var s;
|
||||
|
||||
// Find and concatenate the values of all text nodes contained within the
|
||||
// element.
|
||||
s = "";
|
||||
for (i = 0; i < el.childNodes.length; i++)
|
||||
if (el.childNodes[i].nodeType == document.TEXT_NODE)
|
||||
s += el.childNodes[i].nodeValue;
|
||||
else if (el.childNodes[i].nodeType == document.ELEMENT_NODE &&
|
||||
el.childNodes[i].tagName == "BR")
|
||||
s += " ";
|
||||
else
|
||||
// Use recursion to get text within sub-elements.
|
||||
s += TSgetTextValue(el.childNodes[i]);
|
||||
|
||||
return TSnormalizeString(s);
|
||||
}
|
||||
|
||||
function TScompareValues(v1, v2) {
|
||||
|
||||
var f1, f2;
|
||||
|
||||
// If the values are numeric, convert them to floats.
|
||||
|
||||
f1 = parseFloat(v1);
|
||||
f2 = parseFloat(v2);
|
||||
if (!isNaN(f1) && !isNaN(f2)) {
|
||||
v1 = f1;
|
||||
v2 = f2;
|
||||
}
|
||||
|
||||
// Compare the two values.
|
||||
if (v1 == v2)
|
||||
return 0;
|
||||
if (v1 > v2)
|
||||
return 1
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Regular expressions for normalizing white space.
|
||||
var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
|
||||
var whtSpMult = new RegExp("\\s\\s+", "g");
|
||||
|
||||
function TSnormalizeString(s) {
|
||||
|
||||
s = s.replace(whtSpMult, " "); // Collapse any multiple whites space.
|
||||
s = s.replace(whtSpEnds, ""); // Remove leading or trailing white space.
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user