//This file created by Barry Hunter www.nearby.org.uk (c) July 2007

//the google map object
var map;

//the geocoder object
var geocoder;

var addressMarker;

//the ajax request object
var request;

//the 'dafault' icon
var baseicon;


//array of markers so we can keep track of which to remove
var marks = new Array();

//shortcut to the message div
var m;

//is the a fetch in progress?
var running = false;

//these are for zoomin optimization (if prev zoom had all markers then no need to load them again for zooming in)
var prevZoom = -1;
var shownall = false;
var sentBounds = '';

function showAddress(address) {
	if (geocoder) {
		geocoder.getLatLng(address,function(point) {
			if (!point) {
				alert("Your entry '" + address + "' could not be geocoded, please try again");
			} else {
				if (addressMarker) {
					map.removeOverlay(addressMarker);
				}
				addressMarker = new GMarker(point);
				map.setCenter(point, 12);
				map.addOverlay(addressMarker);
				}
			});
	}
}

function createMarker(point, html,icon,link,id) {
	ii = new GIcon(baseicon);
	if (icon.length > 0) {
		ii.image = imageRoot+icon;
	}

	var marker = new GMarker(point, ii);
	if (link.length >0) {
		html = '<a href="'+link+'">'+html+'</a>';
	}
	

	//if (gr.length >0) {
	//	html = html+"<br/>"+gr;
	//}
	

	html = html+'<br/><a href="/results_link.cgi?map=1&id='+id+'">multimap</a>';
	
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});

	return marker;
}

function refresh_map() {
	if (running) {
		request.abort();
	}
	running = false;
	request = null;
	map.clearOverlays();
	marks = new Array();
	update_map();
}

function update_map() {
	if (running) {
		request.abort();
		running = false;
	}
	if (shownall == false || map.getZoomLevel() >= prevZoom) {
		var bounds = map.getBoundsLatLng();

		//build a list of layers to request
		var ob = document.getElementById("select_layers");
		var layers = '';
		for (var i = 0; i < ob.options.length; i++)
			if (ob.options[i].selected)
				layers = layers + ',' +ob.options[i].value;

		var center = map.getCenterLatLng();
		var zoom = map.getZoomLevel();
		
		sentBounds = bounds.toString()
		
	//setup links that utalise the current map location
		document.getElementById("datalink").innerHTML='<A HREF="'+baselink+'?lat='+center.y+'&long='+ center.x+'&zoom='+zoom+'&layers='+layers+'">Link to this Map</A>, <a href="http://www.nearby.org.uk/googleEarth.kml.php?lat='+center.y+'&long='+ center.x+'&zoom='+zoom+'">Open Location in Google Earth</a> or <a href="http://www.nearby.org.uk/coord.cgi?p='+center.y+'+'+ center.x+'">Location Links</a>. (<A HREF="googleMaps.xml.php?bounds='+sentBounds+'&layers='+layers+'">Data</A>)';
		
		if (layers == '') {
			m.innerHTML = "No layers Selected";
			map.clearOverlays();
			marks = new Array();
			running = false;
			return;
		} else {
			request = GXmlHttp.create();
			request.open("GET", "googleMaps.xml.php?bounds="+sentBounds+"&layers="+layers, true);
		}
		
		
		if (layers == ',none') {
			m.innerHTML = "Loading Layers Skipped";
			map.clearOverlays();
			marks = new Array();
			running = false;
			return;
		}
		
		request.onreadystatechange = function() {
			if (request.readyState == 4 && running) {
				m.innerHTML = "Parsing XML..";
				var xmlDoc = request.responseXML;
				if (!xmlDoc.documentElement) {
					m.innerHTML = "Error: Unable to Parse XML";
					running = false;
					return;
				}
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				
				//flag all current markers as old
				for (i in marks) 
					if (marks[i] != null) 
						marks[i].old = true;

				m.innerHTML = "Adding Markers...";
				for (var i = 0; i < markers.length; i++) {
					id = markers[i].getAttribute("id");
					if (marks[id] && marks[id] != null) {
						//we have this one so lets flag it as valid
						marks[id].old = false;
					} else {
						var point = new GPoint(parseFloat(markers[i].getAttribute("lng")), parseFloat(markers[i].getAttribute("lat")));
						
						//add any extra fields to this line
						marks[id] = createMarker(point,markers[i].getAttribute("name"),markers[i].getAttribute("icon"),markers[i].getAttribute("link"),id  );
						
						map.addOverlay(marks[id]); 
						
					}
				}
				
				m.innerHTML = "Removing Old Markers...";
				for (i in marks) 
					if (marks[i] != null) 
						if (marks[i].old == true) {
							map.removeOverlay(marks[i]);
							marks[i] = null; //marks.splice(i,1);
						}

				//print out a message
				var count = xmlDoc.documentElement.getElementsByTagName("count");
				if (count && count.length > 0) {
					c = count[0].getAttribute("value");
					if (markers.length == c) {
						m.innerHTML = "Finished, showing "+markers.length+" markers.";
						shownall = true;
					} else {
						m.innerHTML = "Finished, showing random "+markers.length+" of "+c+" markers, Zoom-in to see more!";
						shownall = false;
					}
				} else {
					m.innerHTML = "Finished, showing "+markers.length+" of unknown markers.";
					shownall = true;
				}
				running = false;
			}
		}//end function
		m.innerHTML = "Requesting Results...";
		running = true;
		request.send(null);
	}
	prevZoom = map.getZoomLevel();
}

