/**
 * 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;
  }
}

/**
 * Call this to update the table's sort order
 **/
function sort_contacts_table(table_info, sort_field) {
  if(table_info.cursort == sort_field)
    table_info.reverse = !table_info.reverse;
  else
    table_info.reverse = true;
  table_info.cursort = sort_field;

  table_info.data.sort(sort_functions[sort_field]);
  if(table_info.reverse) table_info.data.reverse();
  refresh_contacts_table(table_info);
}

/**
 * Recreate the whole table, including rows
 **/
function refresh_contacts_table(table_info) {
  var html = '<tr><td style="margin: 0px; padding: 0px;">'+
 '<table class="lined" width="100%" cellspacing="0" style="table-layout: fixed;">'+
'<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 = 'title="Click to sort" onclick="populate_rows(contact_info); sort_contacts_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>';
    }
  }
  document.getElementById('column_headers').innerHTML = html + '</tr></table></td></tr>';
  document.getElementById('column_headers').firstChild.setAttribute("width","95%");
  
  html = '<table width="95%" cellspacing="0">';
  
  
  /* do rows, originally from the <tr>'s innerHTML property */
  for(var i = 0; i < table_info.data.length; i++)
  { 
    html = html + '<tr id="contact_'+table_info.data[i].key+'">' + table_info.data[i].row + '</tr>';
  }
  html = html + '</table></table>'

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

/**
 * 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));
  }
};

