var map;
var number_meaning;
var size_meaning;
var default_lat;
var default_lng;
var default_zoom;
var new_node_lat;
var new_node_lng;
var topology_refresh_rate;
var max_virtualcoordinate1;
var min_virtualcoordinate1;
var max_virtualcoordinate2;
var min_virtualcoordinate2;
var max_battery;
var min_battery;
var max_light;
var min_light;
var max_IR;
var min_IR;
var max_temperature;
var min_temperature;
var max_rssi;
var min_rssi;
var max_lat;
var min_lat;
var max_lng;
var min_lng;

function createSensor(point, id, type, description, battery, light, IR, temperature, virtualcoordinate1, virtualcoordinate2) {
   var icon = new GIcon();
   icon.image = 'images/' + type + 'marker.png';
   var iconsize;
   switch (size_meaning) {
      case 'id': iconsize=30;break;
      case 'battery':
      if (battery=='') { iconsize=10;
         } else { iconsize=10+20*(battery-min_battery)/(max_battery-min_battery); }
         break;
         case 'temperature':
         if (temperature=='') { iconsize=10;
         } else { iconsize=10+20*(temperature-min_temperature)/(max_temperature-min_temperature); }
         break;
         case 'light':
         if (light=='') { iconsize=10;
         } else { iconsize=10+20*(light-min_light)/(max_light-min_light); }
         break;
         case 'IR':
         if (IR=='') { iconsize=10;
         } else { iconsize=10+20*(IR-min_IR)/(max_IR-min_IR); }
         break;
         case 'virtualcoordinate1':
         if (virtualcoordinate1=='-1.00' || virtualcoordinate1=='') { iconsize=10;
         } else { iconsize=10+20*(virtualcoordinate1-(min_virtualcoordinate1))/(max_virtualcoordinate1-min_virtualcoordinate1); }
         break;
         case 'virtualcoordinate2':
         if (virtualcoordinate2=='-1.00' || virtualcoordinate2=='') { iconsize=10;
         } else { iconsize=10+20*(virtualcoordinate2-(min_virtualcoordinate2))/(max_virtualcoordinate2-min_virtualcoordinate2); }
         break;
   }
   icon.iconAnchor = new GPoint(iconsize/2, iconsize/2);
   icon.iconSize = new GSize(iconsize, iconsize);
   icon.infoWindowAnchor = new GPoint(iconsize, iconsize/3);
   var opts;
   switch (number_meaning) {
      case 'id': opts={ "icon": icon, "clickable": true, "title": id, "labelText": id, "labelOffset": new GSize(-15,-8)};break;
      case 'battery': opts={ "icon": icon, "clickable": true, "title": battery, "labelText": battery, "labelOffset": new GSize(-12,-8)};break;
      case 'temperature': opts={ "icon": icon, "clickable": true, "title": temperature, "labelText": temperature, "labelOffset": new GSize(-15,-8)};break;
      case 'light': opts={ "icon": icon, "clickable": true, "title": light, "labelText": light, "labelOffset": new GSize(-15,-8)};break;
      case 'IR': opts={ "icon": icon, "clickable": true, "title": IR, "labelText": IR, "labelOffset": new GSize(-15,-8)};break;
      case 'virtualcoordinate1': opts={ "icon": icon, "clickable": true, "title": virtualcoordinate1, "labelText": virtualcoordinate1, "labelOffset": new GSize(-15,-8)};break;
      case 'virtualcoordinate2': opts={ "icon": icon, "clickable": true, "title": virtualcoordinate2, "labelText": virtualcoordinate2, "labelOffset": new GSize(-15,-8)};break;
   }
   var sensor = new LabeledMarker(point, opts);
   if (battery=='') {battery="<i>unknown</i>";}
   if (light=='') {light="<i>unknown</i>";}
   if (IR=='') {IR="<i>unknown</i>";}
   if (temperature=='') {temperature="<i>unknown</i>";}
   if (virtualcoordinate1=='') {virtualcoordinate1="<i>unknown</i>";}
   if (virtualcoordinate2=='') {virtualcoordinate2="<i>unknown</i>";}
   var html = "<p><b>Node "+id+"</b><br/>"+description+"</p><table border='1'><tr><td>temperature</td><td>"+temperature+"</td></tr><tr><td>light</td><td>"+light+"</td></tr><tr><td>IR</td><td>"+IR+"</td></tr><tr><td>battery</td><td>"+battery+"</td></tr><tr><td>Virtual Coordinate 1</td><td>"+virtualcoordinate1+"</td></tr><tr><td>Virtual Coordinate 2</td><td>"+virtualcoordinate2+"</td></tr></table><br/><a href='show_sensing_history.php?ids[]="+id+"'>Sensing History</a>";
   GEvent.addListener(sensor, 'click', function() {sensor.openInfoWindowHtml(html);});
   return sensor;
}

function redraw_map(at_time) {
   map.clearOverlays();
   draw_overlay(at_time);
}

function load() {
   if (GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById("map"), {size:new GSize(650,650)});
      map.addControl(new GSmallMapControl());
      map.addControl(new GScaleControl());
      map.setCenter(new GLatLng(default_lat, default_lng), default_zoom, G_SATELLITE_MAP);
      draw_overlay();
   }
}

function draw_overlay(at_time) {
   for(var i = 0; i < 7; i++) {
      if(document.forms["f"].elements["number"][i].checked) {
         number_meaning = document.forms["f"].elements["number"][i].value;
      }
   }
   for(var i = 0; i < 6; i++) {
      if(document.forms["f"].elements["size"][i].checked) {
         size_meaning = document.forms["f"].elements["size"][i].value;
      }
   }
   //options
   GDownloadUrl("genxml_options.php?at_time="+at_time, function(data) {
      var xml = GXml.parse(data);
      var options = xml.documentElement.getElementsByTagName("option");
      new_node_lat = options[0].getAttribute("new_node_lat");
      new_node_lng = options[0].getAttribute("new_node_lng");
      topology_refresh_rate = options[0].getAttribute("topology_refresh_rate");
      max_virtualcoordinate1 = options[0].getAttribute("max_virtualcoordinate1");
      min_virtualcoordinate1 = options[0].getAttribute("min_virtualcoordinate1");
      max_virtualcoordinate2 = options[0].getAttribute("max_virtualcoordinate2");
      min_virtualcoordinate2 = options[0].getAttribute("min_virtualcoordinate2");
      max_battery = options[0].getAttribute("max_battery");
      min_battery = options[0].getAttribute("min_battery");
      max_light = options[0].getAttribute("max_light");
      min_light = options[0].getAttribute("min_light");
      max_IR = options[0].getAttribute("max_IR");
      min_IR = options[0].getAttribute("min_IR");
      max_temperature = options[0].getAttribute("max_temperature");
      min_temperature = options[0].getAttribute("min_temperature");
      max_rssi = options[0].getAttribute("max_rssi");
      min_rssi = options[0].getAttribute("min_rssi");
      max_lat = options[0].getAttribute("max_lat");
      min_lat = options[0].getAttribute("min_lat");
      max_lng = options[0].getAttribute("max_lng");
      min_lng = options[0].getAttribute("min_lng");
   //white overlay
   if(document.forms["f"].elements["topology_only"].checked) {
      var polygon = new GPolygon([new GLatLng(max_lat,max_lng),
      new GLatLng(max_lat,min_lng),
      new GLatLng(min_lat,min_lng),
      new GLatLng(min_lat,max_lng),
      new GLatLng(max_lat,max_lng)],"#ffffff",60,1,"#ffffff",1);
      map.addOverlay(polygon);
   }
   // new node location
   var new_node_icon = new GIcon();
   new_node_icon.image = "images/newnodemarker.png";
   new_node_icon.iconAnchor = new GPoint(25,5);
   var new_node = new GMarker(new GLatLng(new_node_lat,new_node_lng), {icon:new_node_icon, clickable:false, draggable:false, bouncy:false, dragCrossMove:true});
   map.addOverlay(new_node);
   // neighbors
   GDownloadUrl("genxml_neighbors.php?at_time="+at_time, function(data) {
      var xml = GXml.parse(data);
      var neighbors = xml.documentElement.getElementsByTagName("neighbor");
      for (var i = 0; i < neighbors.length; i++) {
         var temp_rssi=neighbors[i].getAttribute("rssi")-(min_rssi);
         var temp_max_rssi=max_rssi-(min_rssi);
         var link = new GPolyline([new GLatLng(parseFloat(neighbors[i].getAttribute("id_lat")),parseFloat(neighbors[i].getAttribute("id_lng"))),new GLatLng((parseFloat(neighbors[i].getAttribute("id_lat"))+parseFloat(neighbors[i].getAttribute("neighbor_lat")))/2,(parseFloat(neighbors[i].getAttribute("id_lng"))+parseFloat(neighbors[i].getAttribute("neighbor_lng")))/2)], "#FF6600", 6, 0.2+0.8*parseFloat(temp_rssi)/temp_max_rssi);
         map.addOverlay(link);
      }
   // last paths
   GDownloadUrl("genxml_last_paths.php?at_time="+at_time, function(data) {
      var xml = GXml.parse(data);
      var hops = xml.documentElement.getElementsByTagName("hop");
      var last_sourceid=-1;
      var last_lat=-1;
      var last_lng=-1;
      var last_source = 0;
      for (var i = 0; i < hops.length; i++) {
         last_source=hops[i].getAttribute("sourceid");
      }
      for (var i = 0; i < hops.length; i++) {
         if (last_sourceid!=hops[i].getAttribute("sourceid")) {
            last_sourceid=hops[i].getAttribute("sourceid");
            last_lat=hops[i].getAttribute("lat");
            last_lng=hops[i].getAttribute("lng");
         } else {
            if (hops[i].getAttribute("sourceid")==last_source) {
               var link = new GPolyline([new GLatLng(parseFloat(last_lat),parseFloat(last_lng)),new GLatLng(parseFloat(hops[i].getAttribute("lat")),parseFloat(hops[i].getAttribute("lng")))], "#17A752", 3, 1);
            } else {
               var link = new GPolyline([new GLatLng(parseFloat(last_lat),parseFloat(last_lng)),new GLatLng(parseFloat(hops[i].getAttribute("lat")),parseFloat(hops[i].getAttribute("lng")))], "#FF6600", 1, 1);
            }
            map.addOverlay(link);
            last_lat=hops[i].getAttribute("lat");
            last_lng=hops[i].getAttribute("lng");
         }
      }
   // nodes
   GDownloadUrl("genxml_sensors.php?at_time="+at_time, function(data) {
      var xml = GXml.parse(data);
      var sensors = xml.documentElement.getElementsByTagName("sensor");
      for (var i = 0; i < sensors.length; i++) {
         var point = new GLatLng(parseFloat(sensors[i].getAttribute("lat")),parseFloat(sensors[i].getAttribute("lng")));
         var sensor = createSensor(point,sensors[i].getAttribute('id'),sensors[i].getAttribute('type'),sensors[i].getAttribute('description'),sensors[i].getAttribute('battery'),sensors[i].getAttribute('light'),sensors[i].getAttribute('IR'),sensors[i].getAttribute('temperature'),sensors[i].getAttribute('virtualcoordinate1'),sensors[i].getAttribute('virtualcoordinate2'));
         map.addOverlay(sensor);
      }
   });
   });
   });
   });
}

function update_replay(at_time) {
   //redraw the map
   redraw_map(at_time);
   //reposition the cursor and fill the hidden form
   document.getElementById("max_cursor").style.left = 630*((at_time-min_time)/(max_time-min_time))+"px";
   document.getElementById('max_slider_time').value=at_time;
   //refill the info window
   GDownloadUrl("genxml_update_replay.php?at_time="+at_time, function(data) {
      var xml = GXml.parse(data);
      var infos = xml.documentElement.getElementsByTagName("previous_next_info");
      var html = "<table style='border:0px;background-color:#E5EE55'>";
      for (var i = 0; i < infos.length; i++) {
         html += "<tr><th colspan='3'>node "+infos[i].getAttribute('id')+"</th></tr>";
         html += "<tr><td style='text-align:center' onClick=\"update_replay("+infos[i].getAttribute('previous_seq_time')+")\">"+infos[i].getAttribute('previous_seq')+"</td>";
         html += "    <td style='text-align:center' onClick=\"update_replay("+infos[i].getAttribute('last_seq_time')+    ")\">"+infos[i].getAttribute('last_seq')+    "</td>";
         html += "    <td style='text-align:center' onClick=\"update_replay("+infos[i].getAttribute('next_seq_time')+    ")\">"+infos[i].getAttribute('next_seq')+    "</td></tr>";
      }
      html += "</table>";
      document.getElementById("timely_info").innerHTML=html;
   });
}