// Global variables

var startLat = 40.7440;
var startLon = -73.9526;
var startZoom = 13;
var startType = G_PHYSICAL_MAP;


var mapdiv = document.getElementById("map");
var map;
var poly;
var polyLines = new Array();
var count = 0;
var points = new Array();
var markers = new Array();
var streetCoords = new Array();
var icon_url ="http://labs.google.com/ridefinder/images/";
var tooltip;
var lineColor = "#6666af";
var normalColor = "#FF0000";
var normalTextColor = "#000000";
var hiliteColor = "#0000FF";
var fillColor = "#335599";
var editColor = "#FF00FF";
var hilite;
var lineWeight = 3;
var lineOpacity = .5;
var fillOpacity = .2;
var report= document.getElementById("status");
var previousHiliteId = -1;
var backupCoords = null;
var domain = "www.hardtoremember.org";
var numRecent = 20;
var dateString = "";


var hilitePolyStyleOptions = {color: hiliteColor , opacity: .8};
var normalPolyStyleOptions = {color: normalColor, opacity: lineOpacity};
var editPolyStyleOptions = {color: editColor, opacity: lineOpacity};

var editPoly = null;

var editId = -1;

var totalMiles = 0.0;


function loadStreets() {
	
	
	var url='http://'+domain+'/wlog/data.php';
		
	xmlhttp=GXmlHttp.create();
	xmlhttp.onreadystatechange=xmlhttpChange;
		
	xmlhttp.open('GET', url, true);

	xmlhttp.send(null);
		
	function xmlhttpChange()
	{
	// if xmlhttp shows "loaded"
  	  
  if(xmlhttp.readyState == 4) {
  	  	
  	if(xmlhttp.status == 200) {
			constructStreets(xmlhttp.responseText);
		} else {
			alert("ERROR");
		}
		
		}
	}
    		
}


function calculateDistance(lat1, lon1, lat2, lon2) {

	var glatlng1 = new GLatLng(lat1, lon1);
	var glatlng2 = new GLatLng(lat2, lon2);
	var miledistance = glatlng1.distanceFrom(glatlng2, 3959);
	var kmdistance = (miledistance * 1.609344).toFixed(1);
	
	return miledistance;
 
}

function getTotalLength(coords) {

total = 0.0;



for (i = 0; i < coords.length; i++) {
	currentLat = coords[i].y;
	currentLon = coords[i].x;
	
	if (i != 0) {
		total = total + calculateDistance(currentLat, currentLon, previousLat, previousLon);
	}
	
	previousLat = currentLat;
	previousLon = currentLon;

}

	return total;

}

function constructStreets(text) {



	if (text == "") return;
		
	var streetRows = text.split("\n");
	dateString = streetRows[0];
	for (var j = 1; j < streetRows.length; j++) {
	
		if (streetRows[j]=="") continue;
		var streetFields = streetRows[j].split("|");
		
				var coords = JSON.parse(streetFields[2]);
				
				totalMiles += getTotalLength(coords);
				
				var streetId = streetFields[0];
				var streetName = streetFields[1];
				drawStreet(streetId, streetName, coords, 0);
				
				if (j >= streetRows.length - numRecent) {
					recentRatio = (streetRows.length - j) / numRecent;
					drawStreet(streetId, streetName, coords, 1 - recentRatio);
				}

	}
	
	writeInfoPanel();
	
}



function writeInfoPanel() {


	totalKilometers = totalMiles * 1.609344;
	infoString = "Coverage: " + totalMiles.toFixed(0) + " mi / " 
	+ totalKilometers.toFixed(0) + " km <br>First data: August 16, 2008" +
	"<br>Last data: " + dateString;
	document.getElementById("infoPanel").innerHTML = infoString;

}



function addStreetListing(id, street) {
	
	streets = document.getElementById("streets");
	
	streets.innerHTML += "<div id=street" + id + " onClick=\"editStreet(" + id + ")\" onMouseOver=\"hiliteStreet(" + id + ")\">" + street + "</div>";

	

}






function clearHilite(id) {
	
	document.getElementById("status").value = id;
	
	if (id != -1) {
		polyLines[id].setStrokeStyle(normalPolyStyleOptions);
	  document.getElementById("street"+id).style.color = "";
	  document.getElementById("street"+id).style.fontWeight = "";	  
	}
	
}


function editStreet(id, discard ) {
	
	if (editPoly != null) {
		editPoly.disableEditing();
		clearHilite(editPoly.streetId);
		if (discard) {
			map.removeOverlay(polyLines[editPoly.streetId]);
			editPoly = null;
		}
	}
	
	if (id==null) return;

	editPoly =  polyLines[id];
	backupCoords = streetCoords[editPoly.streetId];
	editPoly.setStrokeStyle(editPolyStyleOptions);
	document.getElementById("street"+id).style.color = editColor;
	document.getElementById("street"+id).style.fontWeight = "Bold";	
	document.getElementById("streetName").value = editPoly.streetName;
	editPoly.enableEditing();
	editId = id;

}


function hiliteStreet(id) {

	if (editPoly != null && editPoly.streetId == id) return;
	if (editPoly == null || editPoly.streetId != previousHiliteId) {
		clearHilite(previousHiliteId);
	}
	
	polyLines[id].setStrokeStyle(hilitePolyStyleOptions);
  document.getElementById("street"+id).style.color = hiliteColor;
  document.getElementById("street"+id).style.fontWeight = "Bold";	  
  
  previousHiliteId = id;
  
}


function clearStreet() {


 points.length = 0;
 
 
 for (i = 0; i < markers.length; i++) {
 	map.removeOverlay(markers[i]);
 }
 
 
 markers.length = 0;
 count = 0;
 if(poly) { map.removeOverlay(poly); }
 poly = null;
 
}




function drawStreet(id, name, coords, color){

 //if(poly) { map.removeOverlay(poly); }
 
 var points = [];
 var newPoly;
 
 streetCoords[id] = coords;
 var newColor = normalColor;
 var newOpacity = lineOpacity;
 
 if (color) {
 	newColor = hiliteColor;
 	newOpacity = lineOpacity * color;
 }
 
 newPoly = new GPolyline(coords, newColor, 4, newOpacity,  {clickable:true});
 newPoly.polyline=true
 newPoly.streetId = id;
 newPoly.streetName = name;
  //GEvent.addListener(newPoly, "click", test);

	//newPoly.enableEditing();

 polyLines[id]=newPoly;
   //report.value += "\ndraw " + id;


  map.addOverlay(newPoly);
  clearStreet();
}




function buildMap() {

 var GMapTypeOptions

 map = new GMap2(mapdiv, {draggableCursor:"auto", draggingCursor:"move"});



 // Add a div element for toolips
 //tooltip = document.createElement("div");
 //tooltip.className="tooltip";
 //map.getPane(G_MAP_MARKER_PANE).appendChild(tooltip);

 // Load initial map and a bunch of controls
 map.setCenter(new GLatLng(startLat,startLon), startZoom, startType);
 map.addControl(new GLargeMapControl()); // Zoom control
 map.addMapType(G_PHYSICAL_MAP);
 // Create a hierarchical map type control
 var hierarchy = new GMapTypeControl();//(new GMapTypeOptions{ hybrid: false});
 // make Hybrid the Satellite default
 //hierarchy.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, null, false);
 // add the control to the map
 map.addControl(hierarchy);

 map.addControl(new GScaleControl()); // Scale bar
 //map.disableDoubleClickZoom();

	map.removeMapType(G_HYBRID_MAP);
 
 // Add click listener
 //GEvent.addListener(map, "click", leftClick);
 
 loadStreets();
 
}




function toggleMode() {

 if(markers.length > 1) drawOverlay();
}





function drawOverlay(){

 // Check radio button
// var lineMode = document.forms["f"].elements["mode"][0].checked;
var lineMode = true;

 if(poly) { map.removeOverlay(poly); }
 points.length = 0;

 for(i = 0; i < markers.length; i++) {
  points.push(markers[i].getLatLng());
 }
 if(lineMode) {
   // Polyline mode
   poly = new GPolyline(points, lineColor, lineWeight, lineOpacity);
   var length = poly.getLength()/1000;
   var unit = " km";
   //report.innerHTML = "Total line length:<br> " + length.toFixed(3) + unit;
  }
  else {
   // Polygon mode
   points.push(markers[0].getLatLng());
   poly = new GPolygon(points, lineColor, lineWeight, lineOpacity, fillColor, fillOpacity);
   var area = poly.getArea()/(1000*1000);
   var unit = " km&sup2;";
  // report.innerHTML = "Area of polygon:<br> " + area.toFixed(3) + unit;
  }
  map.addOverlay(poly);
}


function clearMap() {

 // Clear current map and reset arrays
 map.clearOverlays();
 points.length = 0;
 markers.length = 0;
 count = 0;
}