var timerID = 0;
var timerCount = 0;
var requestID = 0;
var totalResultCount = 0;
var listSize = 0;
var sids = new Array();

function setListSize(ls)
{
  listSize = ls;
}

function queryIPResult(result)
{
  eval("var values = " + result.responseText);

  totalResultCount = totalResultCount + values.length;

  for(var i=0; i<values.length; i++)
  {
    id = values[i][0];

    if($('rst_' + id) != null && $('msg_' + id) != null)
    {
      switch(values[i][1])
      {
        case '1': 
        {
          $('row_' + id).className = "listed";
          $('rst_' + id).innerHTML = "Listed: " + values[i][2];
          $('msg_' + id).innerHTML = convertHREFs(values[i][3]);
        } break;
        case '2':
        {
          $('row_' + id).className = "not-listed";
          $('rst_' + id).innerHTML = "Not Listed";
        } break;
        case '0': 
        default: 
        {
          $('row_' + id).className = "error";
          $('rst_' + id).innerHTML = "Error";
        } break;
      }
    }
  }

  if( totalResultCount >= listSize )
  {
    stopTimer();
    $('status').innerHTML = "Status: Complete. " + totalResultCount + " out of " + listSize;

    $('linkarea').innerHTML = "<a href=\"#\" onclick=\"hideErrorAndNotListed()\">Hide Errors and Not Listed</a>";
  }
  else
  {
    $('status').innerHTML = "Status: " + totalResultCount + " out of " + listSize;
  }
}

function hideErrorAndNotListed()
{
  for(var i=0; i<siteIDs.length; i++)
  {
    id = siteIDs[i];
    if($('row_' + id).className != "listed")
    {
      $('row_' + id).style.display = 'none';
    }
  }
  $('linkarea').innerHTML = "<a href=\"#\" onclick=\"showAll()\">Show all</a>";
}

function showAll()
{
  for(var i=0; i<siteIDs.length; i++)
  {
    id = siteIDs[i];
    $('row_' + id).style.display = '';
  }
  $('linkarea').innerHTML = "<a href=\"#\" onclick=\"hideErrorAndNotListed()\">Hide Errors and Not Listed</a>";
}

function updateTimer()
{
  if(timerID)   
  {
    clearTimeout(timerID);
    timerCount++;
  }

  var ajax = new Ajax.Request('http://www.ioncannon.net/dnsbl/data.php', {method: 'get', parameters: '&step=2&rid=' + requestID, onComplete: queryIPResult});

  // After 30 seconds just give up and mark everything NA
  if(timerCount < 3)
  {
    timerID = setTimeout("updateTimer()", 1000);
    for(var i=0; i<siteIDs.length; i++)
    {
      id = siteIDs[i];
      if($('rst_' + id) == "" && $('msg_' + id) == "")
      {
        $('row_' + id).className = "error";
        $('rst_' + id).innerHTML = "Error";
      }
    }
  }
}

function startTimer() 
{
  timerCount = 0;
  timerID  = setTimeout("updateTimer()", 1000);
}

function stopTimer() 
{
  if(timerID) 
  {
    clearTimeout(timerID);
    timerID = 0;
    timerCount = 0;
  }
}

function queryIPStart(result)
{
  requestID = result.responseText;
  startTimer();
}

function setSiteIDs(sids)
{
  siteIDs = sids;
}

function queryIP()
{
  if(validateIP($F('ip_addr')))
  {
    $('status').innerHTML = "Status: " + 0 + " out of " + listSize;
    $('linkarea').innerHTML = "";
    totalResultCount = 0;

    for(var i=0; i<siteIDs.length; i++)
    {  
      id = siteIDs[i];
      if($('rst_' + id) != null && $('msg_' + id) != null)
      {
        $('row_' + id).style.display = '';
        $('row_' + id).className = "";
        $('rst_' + id).innerHTML = "&nbsp;";
        $('msg_' + id).innerHTML = "&nbsp;";
      }
    }

    var ajax = new Ajax.Request('http://www.ioncannon.net/dnsbl/data.php', {method: 'get', parameters: '&step=1&ip=' + $F('ip_addr'), onComplete: queryIPStart});
  }
  return false;
}


function validateIP(inputIP) 
{
  if (inputIP == "0.0.0.0")
  {
    alert('IP: ' + inputIP + ' is a special IP address and cannot be used here.');
    return false;
  }
  else if (inputIP == "255.255.255.255")
  {
    alert('IP: ' + inputIP + ' is a special IP address and cannot be used here.');
    return false;
  }
  else
  { 
    var ipSegs = inputIP.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);

    if (ipSegs == null)
    {
      alert('IP: ' + inputIP + ' is not a valid IP address.');
      return false;
    }
    else 
    {
      for (i = 0; i < 4; i++) 
      {
        if (ipSegs[i] > 255) 
        {
          alert('IP: ' + inputIP + ' is not a valid IP address.');
          return false;
        }
        if ((i == 0) && (ipSegs[i] > 255)) 
        {
          alert('IP: ' + inputIP + ' is a special IP address and cannot be used here.');
          return false;
        }
      }
    }
  }

  return true;
}

// If message contains an href then pull it out and make it a link
function convertHREFs(input)
{
  var values = input.split(" ");
  var output = "";

  for(var i=0; i<values.length; i++)
  {
    idx = values[i].indexOf("http://");
    if(idx != -1)
    {
      output = output + " <a href=\"" + values[i] + "\">" + values[i] + "</a>";
    }
    else
    {
      output = output + " " + values[i];
    }
  }

  return output;
}

