forked from extern/egroupware
158 lines
5.2 KiB
JavaScript
158 lines
5.2 KiB
JavaScript
/******************************************************************************
|
|
* 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;
|
|
}
|
|
|
|
|