
var lastIP="";
var IPS = null;
var currIndex = -1;

var lastPoint = null;

function doClear()
{
  var s = document.forms['mf'].ta.value='';
  map.clearOverlays(); 
}

function doIt()
{
 lastPoint = null;
 lastIP = "";
 IPS = new Array();
 
 var s = document.forms['mf'].ta.value;
 if (s=='')
 {
   alert("Please, provide data");
   return;
 }
 
 while (s.length>0)
 {
   var i = s.indexOf("\n");
   if (i==0)
   {
     if (s.length==1) break;
     s = s.substring(1);
     continue; 
   }
   if (i<0)
   { 
     processString(s);
     break;
   }
   else
   {
     processString(s.substring(0,i));
     s = s.substring(i);
   }
 }

 if (IPS.length==0) 
 {
   alert("There are no IP's for the geocoding");
   return;
 }

 currIndex = 0;

 showBlock('loading');
 processArray();
}

function processArray()
{
  if (currIndex<0) { hideBlock('loading'); return; }
  if (!IPS) { hideBlock('loading'); return; }
  if (IPS.length) 
  {
    if (currIndex>=IPS.length) 
    {
     hideBlock('loading');
     return; 
    }
    var ip = IPS[currIndex];
    cjAjaxEngine('geoip.jsp?'+ip,geoipHandler,errorHandler);
    currIndex++;
  }
  else
  {
   hideBlock('loading');
   return;
  }
}

function geoipHandler(txt, xmlDoc)
{
  if (txt==null) return; 
  var loc = eval("("+trim(txt)+")");

  var s = "<em>"+loc.ip+"</em> > ";
  if (loc.lat) s+=loc.lat;
  else         s+="?";

  s+=":";

  if (loc.lng) s+=loc.lng;
  else         s+="?";

  s+="<br>";

  var old = document.getElementById('discovery').innerHTML;
  document.getElementById('discovery').innerHTML = s+old;

  if (s.indexOf("?")<0 && (loc.lng!="0.0" || loc.lat!="0.0"))
  {
   var point = new GLatLng(loc.lat, loc.lng);

   var m = new GMarker(point,{title:loc.ip});
         
   map.addOverlay(m);    

   if (lastPoint!=null) 
   {
      var points = new Array();
      points[0] = lastPoint;
      points[1] = point;
      map.addOverlay(new GPolyline(points));
   }

   lastPoint = point;
  }

  processArray();

}

function errorHandler()
{
  alert("Could not proceed Geo request. Sorry ...");
}

function processString (_s)
{
 var s = trim(_s);
 if (s.length<10) return;

 var i = s.indexOf(" ");
 if (i<=0) return;

 var num = s.substring(0,i);
 if (isNaN(num)) return;

 i = s.lastIndexOf("[");
 if (i<=0)
   i = s.lastIndexOf("(");

 if (i<=0)
   i = s.lastIndexOf(" ");

 if (i<=0) return;

 s = s.substring(i+1);
 if (s.length<7) return;
 i = s.indexOf("]");
 if (i>0) s=s.substring(0,i);
 i = s.indexOf(")");
 if (i>0) s=s.substring(0,i);

 s = trim(s);

 if (!isIp(s)) return;

 if (isPrivateIp(s)) return;

 if (sameCNet(s)) return;

 lastIP = s;

 IPS[IPS.length] = s; 
}

function isPrivateIp(s)
{
 if (s.indexOf("10.")==0) return true;
 if (s.indexOf("192.168.")==0) return true;
 if (s.indexOf("169.254.")==0) return true;
 if (s.indexOf("0.0.0")==0) return true;

 if (s.indexOf("172.")==0)
 {
   var i = s.indexOf(".");
   var s1 = s.substring(i+1);
   i = s1.indexOf(".");
   s1 = s1.substring(0,i);
   var m = eval(s1);
   if (m>=16 && m<=31) return true;
 }

 return false;
 
}

function isIp(IPvalue)
{
var ipPattern = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
var ipArray = IPvalue.match(ipPattern);

if (IPvalue == "0.0.0.0") return false;
else if (IPvalue == "255.255.255.255") return false;

if (ipArray == null) return false;
else 
{
  for (i = 0; i < 4; i++) 
  {
    thisSegment = ipArray[i];
    if (thisSegment > 255) return false;
  }
}

return true; 

}

function sameCNet(ip)
{
  if (lastIP =='') return false;
  if (ip.substring(0,ip.lastIndexOf("."))==lastIP.substring(0,lastIP.lastIndexOf(".")))
    return true;

  return false;
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}

function showBlock(id)
    {
      if (document.getElementById(id))
        document.getElementById(id).style.display="block";
    }

function hideBlock(id)
    {
      if (document.getElementById(id))
        document.getElementById(id).style.display="none";
    }

