diff --git a/phpgwapi/js/tablesort/tablesort.js b/phpgwapi/js/tablesort/tablesort.js new file mode 100644 index 0000000000..e079c67371 --- /dev/null +++ b/phpgwapi/js/tablesort/tablesort.js @@ -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; +} + +