/* Google maps javascript functions */

var icon = new GIcon();
icon.image = "/images/markers/marker.png";
icon.shadow = "/images/markers/marker_shadow.png";
icon.iconSize = new GSize(18,30);
icon.shadowSize = new GSize(36,31);
icon.iconAnchor = new GPoint(9,30);
icon.infoWindowAnchor = new GPoint(9,1);

var icon_blue = new GIcon();
icon_blue.image = "/images/markers/marker_new.png";
icon_blue.shadow = "/images/markers/marker_new_shadow.png";
icon_blue.iconSize = new GSize(20,28);
icon_blue.shadowSize = new GSize(35,28);
icon_blue.iconAnchor = new GPoint(9,28);
icon_blue.infoWindowAnchor = new GPoint(18,3);

var icon_small = new GIcon();
icon_small.image = "/images/markers/marker_small.png";
icon_small.iconSize = new GSize(8, 14);
icon_small.iconAnchor = new GPoint(4, 14);
icon_small.infoWindowAnchor = new GPoint(4, 7);

var icon_small_red = new GIcon();
icon_small_red.image = "/images/markers/marker_small_red.png";
icon_small_red.iconSize = new GSize(8, 14);
icon_small_red.iconAnchor = new GPoint(4, 14);
icon_small_red.infoWindowAnchor = new GPoint(4, 7);

var man = new GIcon();
man.image = "/images/markers/marker_man.png";
man.shadow = "/images/markers/marker_shadow.png";
man.iconSize = new GSize(18,30);
man.shadowSize = new GSize(36,31);
man.iconAnchor = new GPoint(9,30);
man.infoWindowAnchor = new GPoint(9,1);

var woman = new GIcon();
woman.image = "/images/markers/marker_woman.png";
woman.shadow = "/images/markers/marker_shadow.png";
woman.iconSize = new GSize(18,30);
woman.shadowSize = new GSize(36,31);
woman.iconAnchor = new GPoint(9,30);
woman.infoWindowAnchor = new GPoint(9,1);

var icon_start = new GIcon();
icon_start.image = "/images/markers/marker_start.png";
icon_start.shadow = "/images/markers/marker_shadow.png";
icon_start.iconSize = new GSize(18,30);
icon_start.shadowSize = new GSize(36,31);
icon_start.iconAnchor = new GPoint(9,30);
icon_start.infoWindowAnchor = new GPoint(9,1);

var icon_end = new GIcon();
icon_end.image = "/images/markers/marker_end.png";
icon_end.shadow = "/images/markers/marker_shadow.png";
icon_end.iconSize = new GSize(18,30);
icon_end.shadowSize = new GSize(36,31);
icon_end.iconAnchor = new GPoint(9,30);
icon_end.infoWindowAnchor = new GPoint(9,1);

var coords = new Array(0);
var markers = new Array(0);
var laptimes = new Array(0);

var track_polyline = null;


/* km / mile markers */

var km_markers = new Array();

for(var i = 1; i <= 50; i++)
{
	var km_icon = new GIcon();
	km_icon.image = "/images/markers/" + i + ".png";	
	km_icon.shadow = "/images/markers/marker_shadow.png";
	km_icon.iconSize = new GSize(18,30);
	km_icon.shadowSize = new GSize(36,31);
	km_icon.iconAnchor = new GPoint(9,30);
	km_icon.infoWindowAnchor = new GPoint(9,1);
	
	km_markers.push(km_icon);
}

var map_km_markers = new Array(0);
var distances = new Array(0);

/* Functions */

function show_laptimes()
{
	alert(laptimes.join(','));
}

function update_laptime(id)
{
	var laptime_checkbox = document.getElementById('laptime_' +id);
		
	if(laptime_checkbox.checked)
	{
		var hit = false;
		
		for (var i = 0; i < laptimes.length; i++)
		{
			if(laptimes[i] == id)
			{
				hit = true;
			}
		}
		
		if(!hit)
		{
			laptimes.push(id);
			markers[id].setImage("/images/markers/marker_small_red.png");
			
		}
	}
	else
	{					
		var new_array = new Array(0);
			
		for (var i = 0; i < laptimes.length; i++)
		{
			if(laptimes[i] != id)
			{
				new_array.push(laptimes[i]);
			}
			else
			{
				markers[id].setImage("/images/markers/marker_small.png");				
			}
		}
		
		laptimes = new_array;
	}
	
	var input = document.getElementById('laptimes');
	
	if(input)
	{
		input.value = laptimes.join(',');
	}
}

function draggable_marker() 
{	
	var point = map.getCenter();
	
	draggable = new GMarker(point, {draggable: true, icon: icon});

	GEvent.addListener(draggable, "dragstart", function() 
	{
	  map.closeInfoWindow();
	});
	
	GEvent.addListener(draggable, "dragend", function() 
	{
	  var input = document.getElementById(form_id);
	  input.value = draggable.getPoint().toString();
	});
	
	GEvent.addListener(map, "click", function(overlay,point) 
	{
	  if(point)
	  {
		draggable.setLatLng(point);
	  	
		var input = document.getElementById(form_id);
		input.value = draggable.getPoint().toString();
	  }
	});
	
	map.addOverlay(draggable);
}

function distance_between_points(p1,p2,format) 
{
	var lat1 = p1.y;
	var lat2 = p2.y;
	
	var lon1 = p1.x;
	var lon2 = p2.x;
	
	var R = 6371; // km
	
	var dLat = degree_to_radian(lat2-lat1);
	var dLon = degree_to_radian(lon2-lon1); 
	
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
	        Math.cos(degree_to_radian(lat1)) * Math.cos(degree_to_radian(lat2)) * 
	        Math.sin(dLon/2) * Math.sin(dLon/2); 
	
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	
	var distance = R * c;
	
	
	if(format == 1) {
		distance = distance / 1.6093472186944;
	}
	
	return distance;
}

function degree_to_radian(value) 
{
  return value * Math.PI / 180;
}

function view_distance_markers(coordinates,totDistance,format) 
{
	if(format == 1) 
	{
		var length = 1.6093472186944;
	}
	else 
	{
		var length = 1;
	}
	
	if(totDistance >= 50000)
	{
		length = length * 10000;
	}
	else if(totDistance >= 5000)
	{
		length = length * 1000;
	}
	else if(totDistance >= 500)
	{
		length = length * 100;
	}
	if(totDistance >= 50)
	{
		length = length * 10;
	}
	
	var number = 0;
	
	var last_leg = 0;
	var next_marker = length;
	
	for(var i = 1; i < coordinates.length; i++) 
	{		
		var current_leg =  distance_between_points(coordinates[i-1], coordinates[i], 0);

		while(last_leg + current_leg >= next_marker)	
		{
			distance_to_next = next_marker - last_leg;
			
			var vectorX = (coordinates[i].x - coordinates[i-1].x) / current_leg;
			var vectorY = (coordinates[i].y - coordinates[i-1].y) / current_leg;
			
			var point = new GPoint(coordinates[i-1].x, coordinates[i-1].y);
			
			point.x = point.x + (vectorX * distance_to_next);
			point.y = point.y + (vectorY * distance_to_next);
			
			var marker = new GMarker(point, km_markers[number++]);
			map.addOverlay(marker);
			
			map_km_markers.push(marker);
			
			next_marker = next_marker + length;
		}
		
		last_leg = last_leg + current_leg;
	}
	
}

function clear_km_markers()
{
	for(var i = 0; i < map_km_markers.length; i++) 
	{
		map.removeOverlay(map_km_markers[i]);
	}
	
	map_km_markers = new Array(0);
}

function zoom_to_track(polyline) 
{
	var bounds = new GLatLngBounds();

	for(var i = 0; i < polyline.getVertexCount(); i++) 
	{
		bounds.extend(polyline.getVertex(i));		
	}
	
	zoom_to_bounds(bounds);
}

function zoom_to_bounds(bounds) 
{
	var original_zoomlevel = map.getBoundsZoomLevel(bounds);
	
	var original_lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) / 2;
	var original_long = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) / 2;

	map.setCenter(new GLatLng(original_lat, original_long));
	map.setZoom(original_zoomlevel);	
}

function draw_line() 
{
	if(track_polyline)
		map.removeOverlay(track_polyline);
	
	track_polyline = new GPolyline(coords,'#e15b04',3,0.8);
	
	map.addOverlay(track_polyline);
}

function in_array(value, array)
{						
	var hit = false;
	
	for (var k = 0; k < array.length; k++)
	{
		if(array[k] == value)
		{
			hit = true;
		}
	}
	
	return hit;
}

function remove_from_laptimes(value)
{
	var new_array = new Array(0);
		
	for (var k = 0; k < laptimes.length; k++)
	{
		if(laptimes[k] != value)
		{
			new_array.push(laptimes[k]);
		}
	}
	
	laptimes = new_array;
	
	var input = document.getElementById('laptimes');
	
	if(input)
	{
		input.value = laptimes.join(',');
	}
}

function draw_markers()
{
	draw_markers_maptime(1);
}

function draw_markers_maptime(laptime) 
{	
	for(var i = 0; i < coords.length; i++) 
	{			
		if(in_array(i,laptimes))
		{
			var temp_icon = icon_small_red;			
		}
		else
		{
			var temp_icon = icon_small;	
		}
				
		if(i == 0)
		{
			temp_icon = icon_start;
		}
		else if(i == coords.length - 1)
		{
			temp_icon = icon_end;
		}
		
		markers[i] = new GMarker(coords[i], {icon:temp_icon, draggable: true});
		map.addOverlay(markers[i]);
		markers[i].enableDragging();
		
		GEvent.addListener(markers[i],'drag',function() 
		{
			updateCoords(),
			draw_line();
			calculate_length();
		});
				
		eval("GEvent.addListener(markers[" + i + "],'click',function() {  if(distance_format == 1)  { var distance_string = (distances[" + (i-1) + "]/1.6093472186944) + 'miles'; } else  { var distance_string = distances[" + (i-1) + "] + ' km'; } if(in_array(" + i + ",laptimes)) { var checked = ' CHECKED'; } else { checked = ''; } if(laptime == 1) { markers[" + i + "].openInfoWindow('Markering #: ' + (" + (i+1) + ") + '<br />Str&auml;cka: ' + distance_string + ' <br /><br/><input type=\"checkbox\" name=\"laptime[]\" value=\"" + i + "\" onClick=\"update_laptime(" + i + ")\" ' + checked + ' id=\"laptime_" + i + "\" /> Markera som mellantid'); } })");
	}
	
	draw_line();
}

function add_marker(point)
{	
	add_marker_laptime(point,1);
}

function add_marker_laptime(point,laptime)
{	
	if(coords.length > 1)
	{		
		var position = markers.length - 1;	
		calculate_length();
		
		map.removeOverlay(markers[position]);
		
		markers[position] = new GMarker(markers[position].getPoint(), {icon:icon_small, draggable: true});
		map.addOverlay(markers[position]);
		markers[position].enableDragging();
		
		GEvent.addListener(markers[position],'drag',function() 
		{
			update_coords(),
			draw_line();
			calculate_length();
		});
		
		GEvent.addListener(markers[position],'click',function() 
		{
			if(distance_format == 1) 
			{
				var distance_string = (distances[position-2]/1.6093472186944) + 'miles';
			}
			else 
			{
				var distance_string = distances[position-2] + ' km';
			}
			
			if(in_array(position-1,laptimes))
			{
				var checked = ' CHECKED';
			}
			else
			{
				checked = '';
			}
			
			if(laptime == 1)
			{
				markers[position-1].openInfoWindow('Markering #: ' + (position) + '<br />Str&auml;cka: ' + distance_string + ' <br /><br/><input type="checkbox" name="laptime[]" value="' + (position - 1) + '" onClick="update_laptime(' + (position - 1) +')" ' + checked + ' id="laptime_' + (position - 1) + '" /> Markera som mellantid');
			}
		});
		
		coords.push(point);
		
		position = position + 1;
		
		markers[position] = new GMarker(point, {icon:icon_end, draggable: true});
		map.addOverlay(markers[position]);
		markers[position].enableDragging();
		
		GEvent.addListener(markers[position],'drag',function() 
		{
			update_coords(),
			draw_line();
			calculate_length();
		});
	}
	else if(coords.length == 1)
	{		
		coords.push(point);
		
		var position = 1;
		
		markers[position] = new GMarker(point, {icon:icon_end, draggable: true});
		map.addOverlay(markers[position]);
		markers[position].enableDragging();
		
		GEvent.addListener(markers[position],'drag',function() 
		{
			update_coords(),
			draw_line();
			calculate_length();
		});
	}
	else
	{		
		coords.push(point);
		
		var position = 0;
		
		markers[position] = new GMarker(point, {icon:icon_start, draggable: true});
		map.addOverlay(markers[position]);
		markers[position].enableDragging();
		
		GEvent.addListener(markers[position],'drag',function() 
		{
			update_coords(),
			draw_line();
			calculate_length();
		});
	}
	
	map.setCenter(point);
	
	var input = document.getElementById('coords');
	
	if(input)
	{		
		input.value = coords.join('&');
	}
}

function update_coords()
{
	coords = new Array(0);
	
	for(var i = 0; i < markers.length; i++) 
	{
		coords.push(markers[i].getPoint());		
	}
	
	var input = document.getElementById('coords');
	
	if(input)
	{
		input.value = coords.join('&');
	}
}
			
function calculate_length() 
{	
	var real_input = document.getElementById('distance');
	var hidden_input = document.getElementById('x_distance');
	
	var distance = 0;
	
	distances = new Array(0);
		
	if(real_input && hidden_input)
	{
		for(var i = 0; i < coords.length -1; i++) 
		{
		  distance += distance_between_points(coords[i],coords[i+1],distance_format);
		  distances.push(Math.round(distance * 100) / 100);
		}
		
		distance = Math.round(distance * 100) / 100;
		
		real_input.value = distance;
		
		hidden_input.value = distance;
	}
	
	return distance;
}
			
function clear_map() 
{
	var lap_input = document.getElementById('laptimes');
	var input = document.getElementById('distance');
	var hidden_input = document.getElementById('x_distance');
	var coords_input = document.getElementById('coords');
	
	if(input && hidden_input)
	{
	    coords = new Array(0);
	    markers = new Array(0);
	    laptimes = new Array(0);
	    	    
	    track_polyline = null;
	    
		map.clearOverlays();
		
		input.value = 0;
		hidden_input.value = '';
		lap_input.value = '';
		coords_input.value = '';
		
		calculate_length();
	}
}
			
function remove_last_marker() 
{
	if(coords.length == 1)
	{
		clear_map();
	}
	else if(coords.length > 1)
	{
		map.removeOverlay(markers[coords.length - 1]);
		
		coords.pop();
		markers.pop();
		
		if(coords.length != 1)
		{
			position = coords.length - 1;
						
			if(laptimes.length > 0)
			{
				remove_from_laptimes(position);
			}
			
			map.removeOverlay(markers[position]);
			
			markers[position] = new GMarker(coords[position], {icon:icon_end, draggable: true});
			map.addOverlay(markers[position]);
			markers[position].enableDragging();
			
			GEvent.addListener(markers[position],'drag',function() 
			{
				update_coords(),
				draw_line();
				calculate_length();
			});
		}
		
		draw_line();
	}
	
	var input = document.getElementById('coords');
	
	if(input)
	{
		input.value = coords.join('&');
	}
	
	calculate_length();
}
