function filterTable(tablename)
// Used by Radost's single HTML page to sort list of all caves
// in expoweb/caves-tabular.htm
// where the data is all in that html file, having been extracted from 
// the svx files by an undocumented method. Probably from the .3d file// produced by 
//survex.
{
  table = document.getElementById(tablename);

  mindepth = document.getElementById("CaveDepthMin").value;
  maxdepth = document.getElementById("CaveDepthMax").value;
  if(mindepth==0)mindepth=-999999;
  if(maxdepth==0)maxdepth= 999999;

  minlength = document.getElementById("CaveLengthMin").value;
  maxlength = document.getElementById("CaveLengthMax").value;
  if(minlength==0)minlength=-999999;
  if(maxlength==0)maxlength= 999999;

  visitdate = document.getElementById("VisitDate").value;

  visitor = document.getElementById("Visitor").value;

  cavename = document.getElementById("CaveName").value.toLowerCase();

  incomplete = document.getElementById("Incomplete").checked;

  var regexmode = false;
  if(visitor[0]=='/' && visitor[visitor.length-1]=='/')
  {
     regexmode = true;
     visitor = new RegExp(visitor.substr(1,visitor.length-2));
  }
  else
  {
     visitor.toLowerCase();
  }

  rows = table.rows;
  for(i=1; i< rows.length; i++)
  {
    name  = (rows[i].getElementsByTagName("TD")[0]).innerHTML.toLowerCase();

    depth = (rows[i].getElementsByTagName("TD")[1]).innerHTML.toLowerCase();
    depth = Number(depth.replace(/[^0-9.]/g,''));

    length = (rows[i].getElementsByTagName("TD")[2]).innerHTML.toLowerCase();
    length = Number(length.replace(/[^0-9.]/g,''));

    date = (rows[i].getElementsByTagName("TD")[3]).innerHTML.toLowerCase();

    recentvisitor = (rows[i].getElementsByTagName("TD")[4]).innerHTML.toLowerCase();

    if(cavename != "" && !name.includes(cavename))
    {
      rows[i].style.visibility = "collapse";
    }
    if(depth<mindepth || depth>maxdepth)
    {
      rows[i].style.visibility = "collapse";
    }
    if(length<minlength || length>maxlength)
    {
      rows[i].style.visibility = "collapse";
    }
    if(date < visitdate)
    {
      rows[i].style.visibility = "collapse";
    }
    if(visitor != "" && regexmode && !visitor.test(recentvisitor))
    {
      rows[i].style.visibility = "collapse";
    }
    if(visitor != "" && !regexmode && !recentvisitor.includes(visitor))
    {
      rows[i].style.visibility = "collapse";
    }
    
    crow=rows[i].getElementsByTagName("TD");
    for(var j=0; j<crow.length; j++)
    {
      if(crow[j].innerHTML == "" && incomplete)
      {
        rows[i].style.visibility = "collapse";
        break;
      }
    }

  }
}

function filterTableReset(tablename)
{
  table = document.getElementById(tablename);
  rows = table.rows;
  for(i=1; i< rows.length; i++)
  {
    rows[i].style.visibility = "visible";
  }
}


function isOrdered(kvarray,numeric)
{
  for(var i=0;i<kvarray.length-1;i++)
  {
    if(numeric==1 && Number(kvarray[i][0])>Number(kvarray[i+1][0]))
    {
      return false;
    }
    if(numeric!=1 && kvarray[i][0]>kvarray[i+1][0])
    {
      return false;
    }
  }
  return true;
}

function sortTable(n, tablename, numeric) {
  table = document.getElementById(tablename);
  rows = table.rows;
  var ordering = [];
  var i;
  
  //construct key-value pairs for sorting
  for(i = 1; i < rows.length; i++) //remember header rows
  {
    key = rows[i].getElementsByTagName("TD")[n];
    key = key.innerHTML.toLowerCase();
    if(numeric==1)
    {
      key=key.replace(/[^0-9.]/g,'')
    }
    ordering.push([key,i]);
  }

  var ascending = isOrdered(ordering,numeric);
  
  //sort either numerically or alphabetically
  if(numeric==1)
  {
    ordering.sort((x,y) => Number(x[0])-Number(y[0]));
  }
  else
  {
    ordering.sort(); //sorts alphabetically
  }

  if(ascending) ordering.reverse();

  for(i = 0; i < ordering.length; i++) //add sorted list at the end of the table
  {
    var keyval = ordering[i];
    id = keyval[1]; //get rownumber of n^th sorted value
    cln = rows[id].cloneNode(true); //deep clone of current node
    table.insertBefore(cln,null); //add n^th row at the end
  }
  for(i = 1; i < ordering.length+1; i++) //remove unsorted nodes
  {
    table.deleteRow(1);// 0 -> header; 1 -> first row
  }

}