var map;
var points_by_index;
var points_by_logid;
var points_by_locid;
var num_markers;
var html_content_by_index;
var html_content_by_logid;
var html_content_by_locid;
var markers_by_index;
var markers_by_logid;
var markers_by_locid;

var baseIcon = new GIcon();
baseIcon.shadow = "/img/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

var redIcon = new GIcon(baseIcon);
redIcon.image = "/img/fish_marker_red.png";

var greenIcon = new GIcon(baseIcon);
greenIcon.image = "/img/fish_marker_green.png";

var blueIcon = new GIcon(baseIcon);
blueIcon.image = "/img/fish_marker_blue.png";

var yellowIcon = new GIcon(baseIcon);
yellowIcon.image = "/img/fish_marker_yellow.png";

function createWorldMarker(point, location, total_fish, in_caches, spawn, release, locid)
{
  var marker = new GMarker(point, blueIcon);
	var html = "<div style=\"white-space:nowrap;\"><strong>" + location + "</strong><br/>Currently In Caches: " + in_caches + "<br/>Total Fish To Pass Through: " + total_fish + "<br/>Fish Spawned By digitalfish: " + spawn  + "<br/>Fish Released By Geocachers: " + release + "</div>";
	html_content_by_locid[locid] = html;
	GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(html);});	
	markers_by_locid[locid] = marker;
  map.addOverlay(marker);
}

function getDistance(dist) {
	var distance = "";
	if (map_type) {
		if (map_type == "mileage") {
			distance = "Total Distance: " + dist + " miles";
		}
		else {
			distance = "Hop Distance: " + dist + " miles";
		}
	}
	else {
		distance = "Distance: " + dist + " miles";
	}
	return distance;
}

function getAction(logtype, username) {
	var action;
	if (logtype == 0) {
		if (username == 'digitalfish') {
			action = "Spawned by <strong>digitalfish</strong>";
		}
		else {
			action = "Released into the hands of <strong>" + username + "</strong>";
		}
	}
	else {
		if (logtype == 1) {
			action = "Caught by <strong>" + username + "</strong>";
		}
		else {
			if (logtype == 2) {
				action = "Released by <strong>" + username + "</strong>";
			}
			else {
				if (logtype == 3) {
					action = "Spontaneously migrated by <strong>digitalfish</strong>";
				}
			}
		}
	}
	return action;
}

function createMarker(point, logtype, username) {
	var icon;
	if (logtype == 0) {
  	icon = greenIcon;
	}
	else {
		if (logtype == 1) {
			icon = greenIcon;
		}
		else {
			if (logtype == 2) {
				icon = yellowIcon;
			}
			else {
				if (logtype == 3) {
					icon = redIcon;
				}
			}
		}
	}
  return new GMarker(point, icon);	
}

function createItemMarker(point, idnum, logtype, username, waypoint, dist, date, logid, location, i) {
	var marker = createMarker(point, logtype, username);
	var action = getAction(logtype, username);
	var distance = getDistance(dist);
	var nav_links = "";
	if (num_markers > 1) {
		nav_links = "<br/>";
		if (i == 0) {
			nav_links += "<a href=\"javascript:moveToByIndex(" + (i + 1) + ")\">Next >></a>";
		}
		else {
			if (i == (num_markers - 1)) {
				nav_links += "<a href=\"javascript:moveToByIndex(" + (i - 1) + ")\"><< Previous</a>";
			}
			else {
				nav_links += "<a href=\"javascript:moveToByIndex(" + (i - 1) + ")\"><< Previous</a>&nbsp;&nbsp;<a href=\"javascript:moveToByIndex(" + (i + 1) + ")\">Next >></a>";
			}
		}
	}
	var html = "<div style=\"white-space:nowrap;\">Fish #: <a href=\"/fish/track/" + idnum + "\" title=\"Track fish #" + idnum + "\">" + idnum + "</a>" + "<br/>" + action + "<br/>Date: " + date + "<br/>Cache: <a href=\"http://www.geocaching.com/seek/cache_details.aspx?wp=" + waypoint + "\" title=\"Geocaching.com cache details for " + waypoint + "\">" + waypoint + "</a>" + "<br/>Location: " + location + "<br/>" + distance  + nav_links + "</div>";
	html_content_by_index[i] = html;
	html_content_by_logid[logid] = html;
	GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(html);});	
	markers_by_index[i] = marker;
	markers_by_logid[logid] = marker;
	map.addOverlay(marker);
}

function createStatsMarker(point, idnum, logtype, username, waypoint, dist, date, logid, location)
{
	var marker = createMarker(point, logtype, username);

	var action = getAction(logtype, username);

	var distance = getDistance(dist);

	var nav_links;

	var html = "<div style=\"white-space:nowrap;\">Fish #: <a href=\"/fish/track/" + idnum + "\" title=\"Track fish #" + idnum + "\">" + idnum + "</a>" + "<br/>" + action + "<br/>Date: " + date + "<br/>Cache: <a href=\"http://www.geocaching.com/seek/cache_details.aspx?wp=" + waypoint + "\" title=\"Geocaching.com cache details for " + waypoint + "\">" + waypoint + "</a>" + "<br/>Location: " + location + "<br/>" + distance + "</div>";
	html_content_by_logid[logid] = html;
	GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(html);});	
	markers_by_logid[logid] = marker;
	map.addOverlay(marker);
}

function createWorldMap() {
	map = new GMap(document.getElementById("map"));
	document.getElementById("map").style.width = "550px";
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	map.centerAndZoom(new GPoint(-98.5833, 39.8333), 15);

	if (world_list) {
		points_by_locid = new Array();
		markers_by_locid = new Array();
		html_content_by_locid = new Array();
		for (var i = 0; i < world_list.length; i++) {
			var point = new GPoint(parseFloat(world_list[i][2]), parseFloat(world_list[i][1]));
			points_by_locid[world_list[i][0]] = point;
			createWorldMarker(point, world_list[i][3], world_list[i][5], world_list[i][4], world_list[i][6], world_list[i][7], world_list[i][0]);
		}
	}
}

function createItemMap() {
	map = new GMap(document.getElementById("map"));
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	map.centerAndZoom(new GPoint(-98.5833, 39.8333), 15);
	if (log_list) {
		points_by_logid = new Array();
		markers_by_logid = new Array();
		html_content_by_logid = new Array();
		points_by_index = new Array();
		markers_by_index = new Array();
		html_content_by_index = new Array();
		num_markers = log_list.length;
		var zoom = 4;
		if (num_markers > 1) {
			zoom = calculateZoomLevel(parseFloat(span[0]), parseFloat(span[1]));
			if (zoom < 4) {
				zoom = 4;
			}
		}
		map.centerAndZoom(new GPoint(parseFloat(center[0]), parseFloat(center[1])), zoom);		
		for (var i = 0; i < log_list.length; i++) {
			var logtype = log_list[i][1];
			var point = new GPoint(parseFloat(log_list[i][8]), parseFloat(log_list[i][7]));
			points_by_index[i] = point;
			points_by_logid[log_list[i][2]] = point;
			createItemMarker(point, log_list[i][0], logtype, log_list[i][5], log_list[i][3], log_list[i][4], log_list[i][6], log_list[i][2], log_list[i][9], i );
		}
	}
	if (polyline_list) {
		var pts = new Array();
		if (polyline_list.length > 1) {
			for (var i = 0; i < polyline_list.length; i++) {
				pts[i] = new GPoint(polyline_list[i][0], polyline_list[i][1]);
			}
			map.addOverlay(new GPolyline(pts));
		}
	}	
}

function createStatsMap() {
	map = new GMap(document.getElementById("map"));
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	map.centerAndZoom(new GPoint(-98.5833, 39.8333), 15);
	if (log_list) {
		points_by_logid = new Array();
		markers_by_logid = new Array();
		html_content_by_logid = new Array();
		num_markers = log_list.length;
		var zoom = 4;
		if (num_markers > 1) {
			zoom = calculateZoomLevel(parseFloat(span[0]), parseFloat(span[1]));
			if (zoom < 4) {
				zoom = 4;
			}			
		}
		map.centerAndZoom(new GPoint(parseFloat(center[0]), parseFloat(center[1])), zoom);		
		for (var i = 0; i < log_list.length; i++) {
			var logtype = log_list[i][1];
			var point = new GPoint(parseFloat(log_list[i][8]), parseFloat(log_list[i][7]));
			points_by_logid[log_list[i][2]] = point;
			createStatsMarker(point, log_list[i][0], logtype, log_list[i][5], log_list[i][3], log_list[i][4], log_list[i][6], log_list[i][2], log_list[i][9]);
		}
	}
}

function moveToByIndex(i) {
//	alert('inside move to by index');
	map.recenterOrPanToLatLng(points_by_index[i]);
	markers_by_index[i].openInfoWindowHtml(html_content_by_index[i]);
}

function moveToByLogId(logid) {
//	alert('inside move to by log id');
	map.centerAndZoom(points_by_logid[logid], 4);
	markers_by_logid[logid].openInfoWindowHtml(html_content_by_logid[logid]);
}

function moveToByLocId(locid) {
//	alert('inside move to by loc id');
	map.centerAndZoom(points_by_locid[locid], 4);
	markers_by_locid[locid].openInfoWindowHtml(html_content_by_locid[locid]);
}

var _zoomLevelsX = new Array (
  0.006909370422363281,
	0.013818740844726562,
	0.027637481689453125,
	0.05527496337890625,
	0.1105499267578125,
	0.221099853515625,
	0.44219970703125,
	0.8843994140625,
	1.768798828125,
	3.53759765625,
	7.0751953125,
	14.150390625,
	28.30078125,
	56.6015625,
	113.203125,
	226.40625,
	452.8125,
	905.625
);

var _zoomLevelsY = new Array(
  0.004021349152047549,
	0.007363281682394529,
	0.014461909688769481,
	0.02892381953046197,
	0.05784764028408773,
	0.11569529035357107,
	0.23562428066983898,
	0.47124912808747155,
	0.9425027896319733,
	1.8851124359721396,
	3.77079657359333,
	7.545017279042916,
	15.112321558176376,
	30.3670678608755,
	61.292986211921395,
	117.13764533763911,
	167.5220271293487,
	179.69506690448844
); 

function calculateZoomLevel(spanLng, spanLat)
{
	var level = _zoomLevelsX.length-1;
	var found = false;
	var index = 0;

	while (!found && index<_zoomLevelsX.length)
	{
		if (_zoomLevelsX[index]>spanLng&& _zoomLevelsY[index]>spanLat)
		{
			level = index;
			found = true;
		}
		index++;
	}

	return level;
} 
