/*
  $Id: tableSorting.js,v 1.5 2005/07/18 10:31:08 Tomas Exp $
  
  *************************************************
  *** Table sorting functions                   ***
  *** How to use table sorting:
  *** - define the table with <THEAD> section and <TBODY> section
  ***     and place the labels to the <THEAD> section
  *** - use the fSortTable(table, cellIndex) function for texts sorting
  *** - use the fSortTableNumerical(table, cellIndex) function for numbers sorting
  *** - use the fSortTableLinks(table, cellIndex) function for sorting by link.href
  *** - use the fSortTableSpans(table, cellIndex) function for sorting by span.text
  *** For example: <TH ONCLICK="fSortTable(findTableParent(this), this.cellIndex);"...
  *************************************************
*/



function createRowsArray (table) {
  var rows = new Array();
  var r = 0;
  if (table.tHead == null && table.tFoot == null)
    for (var r1 = 0; r1 < table.rows.length; r1++, r++)
      rows[r] = table.rows[r1];
  else  
    for (var t = 0; t < table.tBodies.length; t++)
      for (var r1 = 0; r1 < table.tBodies[t].rows.length; r1++, r++)
        rows[r] = table.tBodies[t].rows[r1];
  return rows;
}
function insertSortedRows(table, rows) {
  if (document.all) var rowsCopy = new Array(rows.length)
  for (var r = 0; r < rows.length; r++) {
    if (document.all) rowsCopy[r] = rows[r].cloneNode(true);
    table.deleteRow(rows[r].rowIndex);
  }
  var tableSection = table.tBodies[table.tBodies.length - 1];
  for (var r = 0; r < rows.length; r++) {
    var row = document.all ? rowsCopy[r] : rows[r];
    tableSection.appendChild(row);
  }
}
function sortTable (table, sortFun) {
  var rows = createRowsArray(table);
  if (rows.length > 0) {
    rows.sort(sortFun);
    insertSortedRows(table, rows);
  }
}

function sortRowsAlpha (row1 , row2) {
  var column = sortRowsAlpha.col;
  var cell1 = row1.cells[column].firstChild.nodeValue.toUpperCase();
  var cell2 = row2.cells[column].firstChild.nodeValue.toUpperCase();
  return cell1 < cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsNumber (row1 , row2) {
  var column = sortRowsNumber.col;
  var cell1 = parseFloat(row1.cells[column].firstChild.nodeValue);
  var cell2 = parseFloat(row2.cells[column].firstChild.nodeValue);
  if(isNaN(cell1)) return -1;
  else if(isNaN(cell2)) return 1;
  else return cell1 < cell2 ? - 1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsNumberDesc (row1 , row2) {
  var column = sortRowsNumber.col;
  var cell1 = parseFloat(row1.cells[column].firstChild.nodeValue);
  var cell2 = parseFloat(row2.cells[column].firstChild.nodeValue);
  if(isNaN(cell1)) return 1;
  else if(isNaN(cell2)) return -1;
  else return cell1 > cell2 ? - 1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsLink (row1 , row2) {
  var column = sortRowsLink.col;
  var cell1 = findFirstLinkChild(row1.cells[column]).href;
  var cell2 = findFirstLinkChild(row2.cells[column]).href;
  return cell1 < cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsLinkDesc (row1 , row2) {
  var column = sortRowsLink.col;
  var cell1 = findFirstLinkChild(row1.cells[column]).href;
  var cell2 = findFirstLinkChild(row2.cells[column]).href;
  return cell1 > cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function findFirstLinkChild (el) {
  var child = el.firstChild;
  while (child.tagName.toUpperCase() != 'A')
    child = child.nextSibling;
  return child;
}
function sortRowsText (row1 , row2) {
  var column = sortRowsText.col;
  var cell1 = readTextChildren(row1.cells[column]).toUpperCase();
  var cell2 = readTextChildren(row2.cells[column]).toUpperCase();
  return cell1 < cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function sortRowsTextDesc (row1 , row2) {
  var column = sortRowsText.col;
  var cell1 = readTextChildren(row1.cells[column]).toUpperCase();
  var cell2 = readTextChildren(row2.cells[column]).toUpperCase();
  return cell1 > cell2 ? -1 : (cell1 == cell2 ? 0 : 1);
}
function readTextChildren (el) {
  function readTexts(n) {
    if (n.nodeType == 3) { // Node.TEXT_NODE
      vText += n.data;
    } else {
      var kids = n.childNodes;
      for (var iii=0; iii<kids.length; iii++) 
        readTexts(kids[iii]);
    }
  }
  var vText = "";
  readTexts(el);
  return vText;
}

function fSortTable(table, col) {
  if(!document.getElementById) return;
  sortRowsAlpha.col = col;
  sortTable(table, sortRowsAlpha);
}
function fSortTableNumerical (table, col, descending) {
  if(!document.getElementById) return;
  sortRowsNumber.col = col;
  if (descending) sortTable(table, sortRowsNumberDesc);
  else sortTable(table, sortRowsNumber);
}
function fSortTableLinks (table, col, descending) {
  if(!document.getElementById) return;
  sortRowsLink.col = col;
  if (descending) sortTable(table, sortRowsLinkDesc);
  else sortTable(table, sortRowsLink);
}
function fSortTableTexts (table, col, descending) {
  if(!document.getElementById) return;
  sortRowsText.col = col;
  if (descending) sortTable(table, sortRowsTextDesc);
  else sortTable(table, sortRowsText);
}

function findTableParent (node) {
  if(!document.getElementById) return false;
  while (node.tagName.toUpperCase() != 'TABLE')
    node = node.parentNode;
  return node;
}

function findTabHeadFieldParent (node) {
  if(!document.getElementById) return false;
  while (node.tagName.toUpperCase() != 'TH')
    node = node.parentNode;
  return node;
}
