/**
 * JavaScript to support dynamically sortable tables
 **/

/**
 * Read the table data from the HTML into an Array, so we can recreate the
 * table later on.
 **/
function populate_rows(table_info)
{
  for(var i = 0; i < table_info.data.length; i++)
  {
    var node = document.getElementById(table_info.prefix + '_' + table_info.data[i].key)
    table_info.data[i].row = node.innerHTML;
    table_info.data[i].rownumber = node.rowIndex;
    table_info.is_sorted = false;
    /* is_sorted:
       Cursort is set before the table is ever sorted to provide arrows,
       is_sorted lets us determine if the table has ever been sorted.
       This is used to return a table to its orignal ordering if it has
       never been sorted by this tool. Usefull after filtering. 
    */
  }
}

/**
 * Call this to update the table's sort order
 * If 2nd argument is null then re-sort on table_info.cursort 
 * as if the table has not been sorted before, then we sort by 
 * the orignal row number.
 *
 * This is useful to mantain order after filtering rows.
 *
 **/
function sort_table(table_info, sort_field) {
  if(sort_field != null)   // Normal change/reverse of sort feild
  {
    if(table_info.cursort == sort_field)
      table_info.reverse = !table_info.reverse;
    else
      table_info.reverse = true;
    table_info.cursort = sort_field;
  } 
  else if (table_info.is_sorted == false) // Unsorted table with null sort_feild
  {                                       // provided, we sort by orignal row number.
    table_info.data.sort(sort_by_rownumber);
    refresh_table(table_info);
    return;
  }
  else                                    // Null sort_feild, and we have sorted before,
  {                                       // we resort by cursort.
    sort_field = table_info.cursort;
  }

  table_info.data.sort(sort_functions[sort_field]);
  table_info.is_sorted = true;
  if(table_info.reverse) table_info.data.reverse();
  refresh_table(table_info);
}



/**
 * Recreate the whole table, including rows
 **/
function refresh_table(table_info) {
  var html = '<table class="lined" cellspacing="0" ' + table_info.tblextra + '><tr>';

  /* headings - take care of column sort indicator */
  for(var i = 0; i < table_info.headings.length; i++)
  {
    heading = table_info.headings[i][0];
    hname   = table_info.headings[i][1];
    extra   = table_info.headings[i][2];

    if(heading == '')
    {
      html = html + extra;
    }
    else
    {
      sort_action = "";
      if(sort_functions[hname])
        sort_action = 'class="sortable" title="Click to sort" onclick="sort_table('
                    + table_info.prefix + '_info, \'' + hname + '\')" ';

      sort_indicator = "";
      if(hname == table_info.cursort)
        sort_indicator = '&nbsp;<img src="static/sort-'
                       + (table_info.reverse ? 'down' : 'up') + '.png">';

      html = html + '<th ' + sort_action + extra + '>'
                  + heading + sort_indicator + '</th>';
    }
  }
  html = html + '</tr>';

  /* do rows, originally from the <tr>'s innerHTML property */
  for(var i = 0; i < table_info.data.length; i++)
  {
      if ( (!table_info.currentfilter) || (table_info.data[i].modifiers.indexOf(table_info.currentfilter) >= 0) ) {
	  html = html + '<tr>' + table_info.data[i].row + '</tr>';
      }
  }
  html = html + '</table>'

  document.getElementById(table_info.prefix + '_container').innerHTML = html;
}


function sort_by_rownumber (a, b)
{
   a = a.rownumber;
   b = b.rownumber;
   return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}

/**
 * Define sort functions for all possible sort orders
 **/
var sort_functions =
{
  'Vulnerability': function (a, b)
  {
    a = '' + a.vulnerability.toLowerCase();
    b = '' + b.vulnerability.toLowerCase();
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Severity': function (a, b) {
    a = a.severity;
    b = b.severity;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Systems': function (a, b) {
    a = a.systems;
    b = b.systems;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Longest': function (a, b) {
    a = a.longest;
    b = b.longest;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Frequency': function (a, b) {
    a = a.frequency;
    b = b.frequency;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Host Name': function (a, b) {
    a = '' + a.hostname.toLowerCase();
    b = '' + b.hostname.toLowerCase();
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'IP Address': function (a, b) {
    a = a.ipaddress;
    b = b.ipaddress;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Critical': function (a, b) {
    a = a.criticality;
    b = b.criticality;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Ports': function (a, b) {
    a = a.ports;
    b = b.ports;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Region': function (a, b) {
    a = '' + a.region;
    b = '' + b.region;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Vulnerabilities': function (a, b) {
    a = a.vulns;
    b = b.vulns;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'number_1': function (a, b) {
    a = a.number_1;
    b = b.number_1;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'longest_1': function (a, b) {
    a = a.longest_1;
    b = b.longest_1;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'number_2': function (a, b) {
    a = a.number_2;
    b = b.number_2;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'longest_2': function (a, b) {
    a = a.longest_2;
    b = b.longest_2;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'number_3': function (a, b) {
    a = a.number_3;
    b = b.number_3;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'longest_3': function (a, b) {
    a = a.longest_3;
    b = b.longest_3;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'number_4': function (a, b) {
    a = a.number_4;
    b = b.number_4;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'longest_4': function (a, b) {
    a = a.longest_4;
    b = b.longest_4;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Description': function (a, b) {
    a = '' + a.description.toLowerCase();
    b = '' + b.description.toLowerCase();
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Id': function (a, b) {
    a = a.id;
    b = b.id;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Reason': function (a, b) {
    a = '' + a.reason.toLowerCase();
    b = '' + b.reason.toLowerCase();
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  },

  'Expires': function (a, b) {
    a = a.enddate;
    b = b.enddate;
    return ((a < b) ? -1 : ((a > b) ? 1 : 0))
  }

};
