function searchTable(tableId,name) {
  var t=document.getElementById(tableId);
  name=name.toUpperCase();
  for (var i=0; i<t.rows.length && t.rows[i].cells[0].innerText.toUpperCase()<name; i++) {
  }
  t.rows[i].scrollIntoView();
}

function Quicksort(vec, loBound, hiBound) {

  var pivot, loSwap, hiSwap, temp;

  // Two items to sort
  if (hiBound - loBound == 1)
  {
    if (vec[loBound] > vec[hiBound])
    {
      temp = vec[loBound];
      vec[loBound] = vec[hiBound];
      vec[hiBound] = temp;
    }
    return;
  }

  // Three or more items to sort
  pivot = vec[parseInt((loBound + hiBound) / 2)];
  vec[parseInt((loBound + hiBound) / 2)] = vec[loBound];
  vec[loBound] = pivot;
  loSwap = loBound + 1;
  hiSwap = hiBound;

  do {
    // Find the right loSwap
    while (loSwap <= hiSwap && vec[loSwap] <= pivot)
      loSwap++;

    // Find the right hiSwap
    while (vec[hiSwap] > pivot)
      hiSwap--;

    // Swap values if loSwap is less than hiSwap
    if (loSwap < hiSwap)
    {
      temp = vec[loSwap];
      vec[loSwap] = vec[hiSwap];
      vec[hiSwap] = temp;
    }
  } while (loSwap < hiSwap);

  vec[loBound] = vec[hiSwap];
  vec[hiSwap] = pivot;


  // Recursively call function...  the beauty of quicksort

  // 2 or more items in first section    
  if (loBound < hiSwap - 1)
    Quicksort(vec, loBound, hiSwap - 1);


  // 2 or more items in second section
  if (hiSwap + 1 < hiBound)
    Quicksort(vec, hiSwap + 1, hiBound);
}

function stripHTML(s) {
  var p,q;
  if (s=="") return(s);
  p=s.indexOf("<");
  while (p>-1) {
    q=s.indexOf(">",p);
    s=s.substring(0,p) + s.substring(q+1,s.length);
    p=s.indexOf("<");
  }
  while (s.charAt(0)<=" ")
    s=s.substring(1,s.length);
  while (s.charAt(s.length-1)<=" ")
    s=s.substring(0,s.length-1);
  return(s)
}

function sortTable(tableId,sortBy,excludeFirstRow) {
  var t=document.getElementById(tableId);
  var colCount=t.rows[0].cells.length;
  var rows=new Array(t.rows.length);
  var rowsort=new Array(t.rows.length);
  var i,j
  var firstRow=(excludeFirstRow?1:0);
  var cell;
  var sortedImage;
  for (i=firstRow; i<t.rows.length; i++) {
    rows[i]=new Array(colCount);
    for (j=0; j<colCount; j++) 
      rows[i][j]=t.rows[i].cells[j].innerHTML;
    var sortTxt=stripHTML(t.rows[i].cells[sortBy].innerHTML);
    if (!isNaN(Number(sortTxt)))
      sortTxt="          ".substring(0,10-sortTxt.length) + sortTxt;
    rowsort[i]=sortTxt+" " +i;
  }
  Quicksort(rowsort,0,rows.length-1);
  if (t.rows[0].cells[sortBy].style.backgroundImage.indexOf('uparr')==-1) {
    for (i=firstRow; i<rows.length; i++) {
      var rowno=parseInt(rowsort[i].substring(rowsort[i].lastIndexOf(" ")+1,rowsort[i].length));
      for (j=0; j<colCount; j++) {
         t.rows[i].cells[j].innerHTML=rows[rowno][j];
      }
    }
    sortedImage='uparr.gif';
  } else {
     for (i=firstRow; i<rows.length; i++) {
       var rowno=parseInt(rowsort[i].substring(rowsort[i].lastIndexOf(" ")+1,rowsort[i].length));
       for (j=0; j<colCount; j++) {
          t.rows[firstRow+rows.length-1-i].cells[j].innerHTML=rows[rowno][j];
       }
     }
    sortedImage='downarr.gif';
  }
  for (j=0; j<colCount; j++) {
     cell=t.rows[0].cells[j];
     if (j==sortBy)
       cell.style.backgroundImage="url(" + sortedImage + ")";
     else
       cell.style.backgroundImage="";
     cell.style.backgroundRepeat="no-repeat";
     cell.style.backgroundPosition="center right";
     cell.style.paddingRight='14px';
  }
};

