//------------------------------------------------------------------------------
/* Miguel Angel Argañaraz                                            Mitch(tm) *
 * miguel@mitch.com.ar                             mitch@buenosaireslibre.org  *
 *                                                                             *
 * $Id: mitch_ge.js 56 2007-11-15 15:08:28Z mitch $
 * $HeadURL: svn://bb/var/svn/mapa/tags/1.2.0/mitch_ge.js $
 *-----------------------------------------------------------------------------*/

var gmarkers = htmls = nodes = nodesn = links = [];
var latlon_msgl_add = "";
function display_node(i) {
  m_display_node(i,1);
}
function display_node_uri(i) {
  m_display_node(i,0);
}
function m_display_node(i,z) {
  gmarkers[i].openInfoWindowTabsHtml(htmls[i]);
  save_point(nodesn[i], nodes[i]);
  map.panTo(nodes[i]);
  if (z == 1) {
    window.location.href = "#mapa";
  }
}
var map;
var geoXml1b=false;
var geoXml2b=false;
var geoXml1d;
var geoXml2d;

function load(cur_id,categ,fav) {
  gmarkers = []; htmls = []; nodes = []; nodesn = []; links = [];
  if (categ != 'all') { window.location.href = "#mapa"; }
  if (categ == 'active') { categ = 'all'; url_add = '?active'; } else { url_add = ''; }
  if (fav != '-1') { categ = 'all'; url_add = "?fav="+fav; }
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl());
    map.addControl(new GMenuMapTypeControl());
    map.setCenter(new GLatLng(-34.613431,-58.443145),12);
    map.setMapType(G_HYBRID_MAP);

    loadstart();

    var gIcon = new GIcon();
    gIcon.iconAnchor = new GPoint(9, 34);
    gIcon.infoWindowAnchor = new GPoint(9, 2);
    gIcon.infoShadowAnchor = new GPoint(18, 25);

    //gIcon.image = "http://www.google.com/mapfiles/marker.png";
    gIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    gIcon.iconSize = new GSize(18, 32);
    gIcon.shadowSize = new GSize(35, 32);

    document.getElementById("nodo_lat1").value = document.getElementById("nodo_lat2").value = "";
    //document.getElementById("latlon_msgl").innerHTML = "Generando Mapa...";
    GDownloadUrl("xml-db.php"+(categ=='all'?'':"?categ="+categ)+url_add, function(data, responseCode) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("node");
      for (var i = 0; i < markers.length; i++) {
        try {
          var lat = parseFloat(markers[i].getAttribute("lat"));
          var lng = parseFloat(markers[i].getAttribute("lng"));
          var point = new GLatLng(lat,lng);
	  var name = markers[i].getAttribute("name");
	  var desc = markers[i].getAttribute("desc");
	  var wiki = markers[i].getAttribute("wiki");
	  var iconname = markers[i].getAttribute("icon");;
	  var node_id = markers[i].getAttribute("node_id");;
	  var marker = createMarker(point,name,desc,wiki,iconname,node_id);
	  map.addOverlay(marker); 
	  nodes.push(marker);
	  nodes[node_id] = point;
	  nodesn[node_id] = name;
        } catch (e) {
          alert ("ERROR: " + name + ":\n\n" + e);
        }
      }
      latlon_msgl_add = (categ == 'all'?'':" (<a class=\"n\" href='javascript:load(-1,\"all\",-1);'>quitar filtro</a>)");
      document.getElementById("latlon_msgl").innerHTML = (markers.length) + " Nodos Cargados"+latlon_msgl_add;
      if (cur_id > 0) {
        display_node_uri(cur_id);
      }
      var lnks = xml.documentElement.getElementsByTagName("link");
      for (var i = 0; i < lnks.length; i++) {
        try {
          var point1 = nodes[lnks[i].getAttribute("src")];
          var point2 = nodes[lnks[i].getAttribute("dst")];
          switch (lnks[i].getAttribute("status")) {
          case "ready":
            var l_color = '#00FF00'; break;
          case "soon":
            var l_color = '#0000FF'; break;
          case "active":
            var l_color = lnks[i].getAttribute("status_grad"); break;
          default:
            var l_color = '#FF0000'; break;
          };
          var polyline = new GPolyline([point1, point2], l_color, 3);
          map.addOverlay(polyline);
        } catch (e) {
          alert ("LINK ERROR: " + lnks[i].getAttribute("src")  + " <--> " + lnks[i].getAttribute("dst") + ":\n\n" + e);
        }
      }

      loadend();
    });

    GEvent.addListener(map, "moveend", function() {
      var center = map.getCenter();
      var latlon = center.toString().replace(/\(/,"").replace(/\)/,"");
      document.getElementById("latlon_msgl").innerHTML = "<b>Centro Lat/Long:</b> " + latlon + latlon_msgl_add;
      document.getElementById("latlon_msgr").innerHTML = m_conv(latlon);
    });

    GEvent.addListener(map, "mouseover", function() {
      map.showControls();
    });

    GEvent.addListener(map, "mouseout", function() {
      map.hideControls(); 
    });

    GEvent.addListener(map, "zoomend", function() {
      //drawGEO();
    });
    map.hideControls();
}
function loadstart() {
    //document.getElementById('loadingMessage').innerHTML="&nbsp;&nbsp;Getting New Markers...";
    document.getElementById('loading').style.display='block';
}
function loadend() {
      document.getElementById('loading').style.display='none';
}
 
function createMarker(point,name,html,wiki,iconname,node_id) {
  var icon = new GIcon(gIcon);
  icon.image = "img/"+iconname;
  var marker = new GMarker(point, {icon:icon,title:name});
  var nameb = '<b>'+name+'</b><br/>';
  //var html_id = " - Nodo ID " + node_id;
  if (wiki) { wiki = "Wiki: <a href='" + wiki + "' target='_blank' class='b'>" + wiki.replace(/http:\/\/wiki.buenosaireslibre.org\//,"") + "</a><br>"; }
  balls =  "http://balls.buenosaireslibre.org/datosusuario.php?id_nodo="+node_id; 
  wiki = wiki + "Balls: <a href='"+balls+"' target='_blank' class='b'>Información del Usuario</a>"; 
  var iTab = [
    new GInfoWindowTab("Info", mktbl(nameb + html)),
    new GInfoWindowTab("Web", mktbl(wiki))
  ];
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowTabsHtml(iTab);
    map.panTo(point);
    save_point(name, point);
  });
  gmarkers[node_id] = marker;
  htmls[node_id] = iTab;
  return marker;
}

function mktbl(st) {
  return "<table border=0><tr><td align=left>" + st + "</td></tr></table>";
}

}

function save_point(name, LatLon)
{
  LatLon = LatLon.toString().replace(/\(/,"").replace(/\)/,"");
  var latlon = LatLon.split(",");
  document.getElementById("nodo_lat").value = latlon[0];
  document.getElementById("nodo_lon").value = latlon[1];
  document.getElementById("nodo_name").value = name;
}

function m_conv(LatLon) {
  var latlon = new Array();
  latlon = LatLon.split(",");
  var lat = latlon[0];
  var lon = latlon[1];
  if (lat==null) var lat=0;
  if (lon==null) var lon=0;
  if (lat < -90 || lat > 90 || lon < -180 || lon > 180) {
    return "Error";
  } else {
    if (lat<0) { LatDirect = "S"; } else { LatDirect = "N"; }
    if (lon<0) { LonDirect = "O"; } else { LonDirect = "E"; }
    lat = Math.abs(lat);
    lon = Math.abs(lon);
    LatDeg = Math.floor(lat);
    LatMin = Math.floor((lat-LatDeg)*60);
    LatSec = (Math.round((((lat - LatDeg) - (LatMin/60)) * 60 * 60) * 100) / 100 ) ;
    LonDeg = Math.floor(lon);
    LonMin = Math.floor((lon-LonDeg)*60);
    LonSec = (Math.round((((lon - LonDeg) - (LonMin / 60 )) * 60 * 60) * 100 ) / 100);
    return "<b>Lat</b> " + LatDeg + "º " + LatMin + "' " + LatSec + "'' " + LatDirect + " <b>Long</b> " + LonDeg + "º " +LonMin + "' " + LonSec + "'' " + LonDirect;
  }
}

function calc_dist_km() {
  var degtorad = 0.01745329; var radtodeg = 57.29577951;
  var lat1h = document.getElementById("nodo_lat1").value;
  var long1h = document.getElementById("nodo_lon1").value;
  var lat2h = document.getElementById("nodo_lat2").value;
  var long2h = document.getElementById("nodo_lon2").value;
  var lat1 = parseFloat(lat1h);
  var lat2 = parseFloat(lat2h);
  var long1 = parseFloat(long1h);
  var long2 = parseFloat(long2h);
  if ((lat1h.lastIndexOf("S"))!=-1 || (lat1h.lastIndexOf("s"))!=-1) lat1 = (lat1 * (-1));
  if ((lat1h.lastIndexOf("W"))!=-1 || (lat1h.lastIndexOf("w"))!=-1) lat1 = (lat1 * (-1));
  if((lat2h.lastIndexOf("S"))!=-1 || (lat2h.lastIndexOf("s"))!=-1) lat2 = (lat2 * (-1));
  if((lat2h.lastIndexOf("W")!=-1) || (lat2h.lastIndexOf("w"))!=-1) lat2 = (lat2 * (-1));
  if((long1h.lastIndexOf("S")!=-1) || (long1h.lastIndexOf("s"))!=-1) long1 = (long1 * (-1));
  if((long1h.lastIndexOf("W")!=-1) || (long1h.lastIndexOf("w"))!=-1) long1 = (long1 * (-1));
  if((long2h.lastIndexOf("S")!=-1) || (long2h.lastIndexOf("s"))!=-1) long2 = (long2 * (-1));
  if((long2h.lastIndexOf("W")!=-1) || (long2h.lastIndexOf("w"))!=-1) long2 = (long2 * (-1));
  var dlong = (long1 - long2);
  var dvalue = (Math.sin(lat1 * degtorad) * Math.sin(lat2 * degtorad)) + (Math.cos(lat1 * degtorad) * Math.cos(lat2 * degtorad) * Math.cos(dlong * degtorad));
  var dd = Math.acos(dvalue) * radtodeg;
  //var miles = (dd * 69.16);
  //miles = (miles * 100)/100;
  var km = (dd * 111.302);
  km = (km * 100)/100;
  document.getElementById("nodo_dist").innerHTML = FormatNumber(km, 2) + " km";
}

var dstpolyline;
function calc_point(id)
{
  document.getElementById("nodo_lat"+id).value = document.getElementById("nodo_lat").value;
  document.getElementById("nodo_lon"+id).value = document.getElementById("nodo_lon").value;
  document.getElementById("nodo_name"+id).innerHTML = document.getElementById("nodo_name").value;
  if (document.getElementById("nodo_lat1").value && document.getElementById("nodo_lat2").value)
  {
    calc_dist_km();
    if (dstpolyline) map.removeOverlay(dstpolyline);
    var dst_point1 = new GLatLng(document.getElementById("nodo_lat1").value,document.getElementById("nodo_lon1").value);
    var dst_point2 = new GLatLng(document.getElementById("nodo_lat2").value,document.getElementById("nodo_lon2").value);
    dstpolyline = new GPolyline([dst_point1, dst_point2], "#FF0000", 5);
    map.addOverlay(dstpolyline);
  }
}

function FormatNumber(Number, Decimals) {
  Number = "" + Number; Decimals = "" + Decimals;
  var OriginalNumber = Number;
  var Sign = 1;
  var Pad = "";
  var Count = 0;
  if(parseFloat(Number)) { Number = parseFloat(Number); }
  else { Number = 0; }
  if((parseInt(Decimals,10)) || (parseInt(Decimals,10) == 0)) {
   Decimals = parseInt(Decimals,10);
  } else { Decimals = 2; }
  if(Number < 0) { Sign = -1; Number *= Sign; }
  if(Decimals < 0) Decimals *= -1;
  Number = "" + Math.floor(Number * Math.pow(10,Decimals + 1) + 5);
  if((Number.substring(1,2) == '.') || (Number=='NaN'))
   return(OriginalNumber);
  if(Number.length < Decimals +1)
  {
   for(Count = Number.length; Count <= Decimals; Count++)
   Pad += "0"
  }
  Number = Pad + Number;
  if(Decimals == 0) { Number = Number.substring(0, Number.length -1) }
  else {
   Number = Number.substring(0,Number.length - Decimals -1) +  "." +
   Number.substring(Number.length - Decimals -1, Number.length -1);
  }
  if(Sign == -1) Number = "-" + Number;
  return(Number)
}

// Mitch(tm) | Search Tab
function do_search(e)
{
  var keynum;
  if (window.event) { keynum = e.keyCode } else if (e.which) { keynum = e.which }
  if (keynum == 13) {
    window.location.href = "#nodos";
    var tbl = document.getElementById("tbl_search");
    var lastRow = tbl.rows.length;
    for (i=1; i<lastRow; i++) { tbl.deleteRow(1); }
    var m_search = document.getElementById("m_search").value;
    document.getElementById("m_search").disabled = true;
    makeRequest(m_search);
    document.getElementById("m_search").disabled = false;
    document.getElementById("m_search").focus();
    return false; }
  return true;
}
   var http_request = false;
   function makeRequest(parameters) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Imposible crear instancia XMLHTTP');
         return false;
      }
      http_request.onreadystatechange = crearContenido;
      //http_request.open('GET', 'http://mapa.buenosaireslibre.org/xml-db.php?search='+parameters, true);
      http_request.open('GET', 'http://mapa.buenosaireslibre.org/xml-db.php?search='+parameters, true);
      http_request.send(null);
   }

	
   function crearContenido() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            var xmldoc = http_request.responseXML;
            var xmlrows = xmldoc.getElementsByTagName("node"); 
            var tbl = document.getElementById("tbl_search");
            var tbl_res = document.getElementById("tbl_search_res");
	    tbl_res.innerHTML = "("+xmlrows.length+" coincidencias)";
              for (var i=0; i < xmlrows.length; i++) {
                var name = xmlrows[i].getAttribute("name");
                var dir = xmlrows[i].getAttribute("dir");
                var pm = xmlrows[i].getAttribute("pm");
                var wiki = xmlrows[i].getAttribute("wiki");
                var iconname = xmlrows[i].getAttribute("icon");
                var node_id = xmlrows[i].getAttribute("node_id");
		var lastRow = tbl.rows.length;
		var row = tbl.insertRow(lastRow);
                row.style.backgroundColor = (lastRow % 2 == 0 ? "#f2f2f2" : "#ffffff");
		var cell = row.insertCell(0);
		cell.innerHTML = "<img src=\"/img/"+iconname+"\">";
		var cell = row.insertCell(1);
		cell.innerHTML = "<nobr><a class=\"n\" href=\"javascript:display_node('"+node_id+"')\">"+name+"</a></nobr>";
		var cell = row.insertCell(2);
		cell.innerHTML = dir;
		var cell = row.insertCell(3);
		cell.innerHTML = pm;
		var cell = row.insertCell(4);
		cell.innerHTML = "<a class=\"n\" href=\""+wiki+"\" target=\"_blank\">wiki</a>";
              }
         } else {
            alert('Imposible continuar.');
         }
      }
   }

