var map = null;
var icons = new Object();
var directions = null;

var polyline = null;
var opacity = 0.5;

var mapMarkers = new Object();
mapMarkers.distanceMarkers = new Array();
mapMarkers.customMarkers = new Array();
var customMarkerCount = 0;
var selectedMarker = null;

var graphHeight=0;

window.onresize=resizeMap;

function loadMap(lat, lng, zoom, view)
{
	if (GBrowserIsCompatible()) 				// Do Map if Compatible Browser only
	{
		map = new GMap2(document.getElementById("map"),{draggableCursor: 'crosshair'});
		map.addControl(new GLargeMapControl());
		map.addControl(new GScaleControl()) ;    	
		map.addMapType(G_PHYSICAL_MAP);
		map.addControl(new GMapTypeControl());

		setView(view);
		var latlng = new GLatLng(lat,lng) ;
		map.setCenter(latlng,zoom);
		loadIcons();
		
		var publisher_id = "pub-0491229010337848";
		var pos =  new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5,35));
		var adsManagerOptions = {
		  maxAdsOnMap : 2,
		  style: G_ADSMANAGER_STYLE_ADUNIT,
		  channel: 'on map ads',
		  position: pos
		};
		adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
		adsManager.enable();		
		
	}else	{
		document.getElementById("map").innerHTML = "<h1>Browser not compatible with Google Maps. Sorry...</h1>" ;
	}
}

function setView(view)
{
	switch(view){
		case 'Satellite':
			mapType = G_SATELLITE_MAP;
			break;
		case 'Terrain':
			mapType = G_PHYSICAL_MAP;
			break;
		case 'Hybrid':
			mapType = G_HYBRID_MAP;
			break;
		default:
			mapType = G_NORMAL_MAP;
	}
	map.setMapType(mapType);
}


function resizeMap()
{
	var mapElement = document.getElementById("map");
	if( window.innerHeight )
	{
		var width = window.innerWidth - 530;
		var height = window.innerHeight - 200 - graphHeight;
	} 
	else
	{
		var width = document.documentElement.offsetWidth - 530; 
		var height = document.documentElement.offsetHeight - 200 - graphHeight;
	}
	if(width < 468){
		width= 468;
	}
	mapElement.style.width = width  + 'px';
	mapElement.style.height = height + 'px';
	updateGraph();
}

function update()
{
	updateGraph();
	redraw();
	updateAltData();
	
}
function updateAltData()
{
	var milesElement = document.getElementById("miles");
	if(milesElement && milesElement.checked == true){
		var heightConversion = 3.2808399;
		var heightUnit = 'ft'
		var distConversion = 0.621367/1000;
		var distUnit = 'Miles'
	}else{
		var heightConversion = 1;
		var heightUnit = 'm'
		var distConversion = 1/1000;
		var distUnit = 'Km'
	}
	document.getElementById('totalAscent').innerHTML = Math.round(parseFloat(totalAscentMeters) * heightConversion)+' '+heightUnit;
	document.getElementById('totalDescent').innerHTML = Math.round(parseFloat(totalDescentMeters) * heightConversion)+' '+heightUnit;
	document.getElementById('distance').innerHTML = Math.round(parseFloat(distanceMeters) * distConversion*10)/10+' '+distUnit;
}

function updateMarkers()
{
	if(mapMarkers.distanceMarkers.length > 0)
	{
		for(var i=0; i<mapMarkers.distanceMarkers.length; i++)
		{
			map.removeOverlay(mapMarkers.distanceMarkers[i]);
		}	
		mapMarkers.distanceMarkers.length=0;
	}
	
	var showMarkersElement = document.getElementById("showMarkers");
	var milesElement = document.getElementById("miles");
	if(milesElement){
		if(milesElement && milesElement.checked == true){
			unitDistance = 1000 / 0.621367;
		}else{
			unitDistance = 1000;
		}	
		var distances = new Array();
		distances[0] = 0;
		for(i=1; i<polyline.getVertexCount(); i++)
		{
			distances[i] = distances[i-1] + polyline.getVertex(i-1).distanceFrom(polyline.getVertex(i))  / unitDistance;
		}	
		var distance = distances[distances.length-1];

		var step = 1;
		if(distance >30 ){ step = 5; }
		if(distance >104 ){ step = 10; }
		if(distance >209 ){ step = 20; }
		if(distance >519 ){ step = 50; }

		var unitCount = 0;
		var markerCount = 0;
		for(i=1; i< distances.length; i++)
		{
			var count = Math.floor(distances[i]);
			while(count >= unitCount+step)
			{
				// do calcs on page co-ords and then convert to lat / lang ???
				unitCount+=step;
				var posOnLine = (unitCount - distances[i-1])/((distances[i] - distances[i-1]));
				var lat = polyline.getVertex(i-1).lat()+ (polyline.getVertex(i).lat() - polyline.getVertex(i-1).lat()) * posOnLine; // need to allow for date-line!
				var lng = polyline.getVertex(i-1).lng()+ (polyline.getVertex(i).lng() - polyline.getVertex(i-1).lng()) * posOnLine; // need to allow for date-line!
				var markerPoint = new GLatLng(lat, lng);
				if(milestones[unitCount]){
					var marker = new GMarker(markerPoint, {icon: milestones[unitCount], clickable:false});
				}else{
					var marker = new GMarker(markerPoint, {icon: milestones[0], clickable:false});
				}
				map.addOverlay(marker);
				mapMarkers.distanceMarkers[markerCount++] = marker;
			}
		}
	}

}


function updateGraph()
{
	var graphElement = document.getElementById('graphImg');
	if(graphElement){
		var width = parseInt(document.getElementById("map").style.width);
		graphElement.style.width = width  + 'px';
		var milesElement = document.getElementById("miles");
		if(milesElement && milesElement.checked == true){
			var unit = 'miles';
		}else{
			var unit = 'km';
		}
		var rand = Math.floor((Math.random() *100000000));
		graphElement.src = "/main/graph/"+walk_id+"/"+width+"/"+unit+"/"+rand;
	}
	
}


function loadRoute(route_data, marker_data)
{

	if(route_data != ''){
		var pointStrings = route_data.split(',');
		var points = new Array();
		for(var i=0 ; i<pointStrings.length; i++)
		{
			var latlng = pointStrings[i].split(':');
			points.push(new GLatLng(parseFloat(latlng[0]), parseFloat(latlng[1])));
		}
		polyline = new GPolyline(points, '#ff0000',3, opacity, {clickable: false});
		map.addOverlay(polyline);
	}
	for(var i=0 ; i<marker_data.length; i++)
	{
		createCustomMarker(marker_data[i][0], parseFloat(marker_data[i][1]), parseFloat(marker_data[i][2]), marker_data[i][3]);
	}
	redraw();	
}

function createCustomMarker(markerType, markerLat, markerLng, markerHTML)
{
	var location = new GLatLng(markerLat, markerLng);
	customMarkerCount++;

	markerIcon = icons[markerType];
	var marker = new GMarker(location, {icon:markerIcon, draggable:false, title:markerType });
	marker.id = customMarkerCount;
	marker.type = markerType;
	marker.text=markerHTML;
	mapMarkers.customMarkers[customMarkerCount] = marker;

	GEvent.addListener(marker, "click", function() {
		var html = '<div>'+markerHTML+'</div>';
		marker.openInfoWindowHtml(html, {maxWidth:250});
	});
	map.addOverlay(marker);	
}

function redraw()
{
	if(polyline && polyline.getVertexCount() > 0)
	{   		
		if(polyline.getVertexCount() > 1)
		{
			var point = polyline.getVertex(polyline.getVertexCount()-1);
			var marker = new GMarker(point, {icon: icons.endFlag, clickable:false, title:'Finish'});
			mapMarkers.finish = marker;
			map.addOverlay(marker);
		}
		var marker = new GMarker(polyline.getVertex(0), {icon: icons.startFlag, clickable:false, title:'Start'});
		mapMarkers.start = marker;
		map.addOverlay(marker);
	}
//	var distance = displayDistance('miles');

	if(mapMarkers.distanceMarkers.length > 0)
	{
		for(var i=0; i<mapMarkers.distanceMarkers.length; i++)
		{
			map.removeOverlay(mapMarkers.distanceMarkers[i]);
		}	
		mapMarkers.distanceMarkers.length=0;
	}

	if(polyline && polyline.getVertexCount() > 0)
	{   		
		updateMarkers();
	}	
}

function displayDistance(unit)
{
	var distance = 0.0;
	if(polyline && polyline.getVertexCount() > 0){
		distance = polyline.getLength() /1000;
	}
	if(unit=='miles'){
		distance = distance * 0.621367;
	}
	distance = distance.toFixed(2);
	return distance;
}

function loadIcons()
{
	milestones = new Array();
	milestones[0] = new GIcon();
	milestones[0].image = "/images/milestone_blank.png";
	milestones[0].shadow = "/images/milestone_shadow.png";
	milestones[0].shadowSize = new GSize(24,15);
	milestones[0].iconSize = new GSize(15,15);
	milestones[0].iconAnchor = new GPoint(15,8);
	
	for(i=1; i<=30; i++)
	{
		milestones[i] = new GIcon(milestones[0]);
		milestones[i].image = "/images/milestone_"+i+".png";
	}
	for(i=35; i<=100; i+=5)
	{
		milestones[i] = new GIcon(milestones[0]);
		milestones[i].image = "/images/milestone_"+i+".png";
	}
	for(i=110; i<=200; i+=10)
	{
		milestones[i] = new GIcon(milestones[0]);
		milestones[i].image = "/images/milestone_"+i+".png";
	}
	for(i=220; i<=500; i+=20)
	{
		milestones[i] = new GIcon(milestones[0]);
		milestones[i].image = "/images/milestone_"+i+".png";
	}
	for(i=550; i<=950; i+=50)
	{
		milestones[i] = new GIcon(milestones[0]);
		milestones[i].image = "/images/milestone_"+i+".png";
	}
	
	icons.startFlag = new GIcon();
	icons.startFlag.image = "/images/start_flag.png";
	icons.startFlag.shadow = "/images/flag_shadow.png";
	icons.startFlag.shadowSize = new GSize(34,20);
	icons.startFlag.iconSize = new GSize(20,20);
	icons.startFlag.iconAnchor = new GPoint(2,20);

	icons.endFlag = new GIcon(icons.startFlag);
	icons.endFlag.iconAnchor = new GPoint(8,20);
	icons.endFlag.image = "/images/end_flag.png";

	icons.parking = new GIcon();
	icons.parking.image = "/images/parking.png";
	icons.parking.shadow = "";
	icons.parking.iconSize = new GSize(20,20);
	icons.parking.iconAnchor = new GPoint(10,20);
	icons.parking.infoWindowAnchor = new GPoint(10,10);

	icons.photo = new GIcon(icons.parking);
	icons.photo.image = "/images/photo.png";	
	icons.shopping = new GIcon(icons.parking);
	icons.shopping.image = "/images/shopping.png";
	icons.accom = new GIcon(icons.parking);
	icons.accom.image = "/images/accom.png";
	icons.feature = new GIcon(icons.parking);
	icons.feature.image = "/images/feature.png";
	icons.information = new GIcon(icons.parking);
	icons.information.image = "/images/information.png";
	icons.cafe = new GIcon(icons.parking);
	icons.cafe.image = "/images/cafe.png";
	icons.pub = new GIcon(icons.parking);
	icons.pub.image = "/images/pub.png";
	icons.rspb = new GIcon(icons.parking);
	icons.rspb.image = "/images/rspb.png";
	
	icons.milestones = milestones;
}


function show_directions(loc_lat, loc_lng, country)
{
	var fromLoc = document.getElementById('directions_location');
	var output_panel = document.getElementById('directions_panel');
	output_panel.innerHTML = '';
	if(!directions){
		directions = new GDirections(map, output_panel);
	}else{
		directions.clear();
	}
	var toLatLng = new GLatLng(loc_lat, loc_lng);

	directions.loadFromWaypoints([fromLoc.value + ", UK", toLatLng]);
	GEvent.addListener(directions, 'error', 
		function(){
			if(directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS){ 
				directions.clear(); 	
				alert("Sorry, we didn't recognise your location");	
			}else{
				alert("Error getting directions: status "+directions.getStatus().code);
				directions.clear(); 	
			}
		});
	GEvent.addListener(directions, 'load', 
		function(){
			map.setMapType(G_NORMAL_MAP);
		});
}

function loadAccommMap()
{
	var request = GXmlHttp.create();
	request.open('GET', '/main/ajax_accommMap', true);
	request.onreadystatechange = function() 
	{
		if (request.readyState == 4 && request.status == 200) 
		{
//alert(request.responseText);
			var accomm = eval(request.responseText);
			for(var i=0; i<accomm.length; i++)
			{

				var lat = parseFloat(accomm[i].lat);
				var lng = parseFloat(accomm[i].lng);
				if(lat && lng){
					var marker = new GMarker(new GLatLng(lat, lng), {icon: icons[accomm[i].icon], clickable:true});
					marker.infoHtml = accomm[i].infoHtml;
					map.addOverlay(marker);
					
					GEvent.addListener(marker, 'click', function(){						
						this.openInfoWindowHtml(this.infoHtml);						
					});
				}
			}			
		}	
	} //function	
	request.send(null);	
	
}


function showWeather()
{
	var weatherElement = document.getElementById('weatherDiv');
	var weatherButton = document.getElementById('weatherButton');
	if(weatherElement.style.display == 'block'){
		weatherElement.style.display = 'none';
		weatherButton.style.backgroundImage = 'url(/images/weather_button.gif)';
	}else{
		weatherElement.style.display = 'block';
		weatherButton.style.backgroundImage = 'url(/images/weather_hide.gif)';
	}
}
