var map;
var geocoder = new GClientGeocoder();
var numberOfRestos;
var restos = new Array();
var showStars = new Array();
var showPrices = new Array();
var param;
var userSelected = -1;
var originalintro;
var selectedResto = null;

// Create a base icon for all of our markers
var iconOptions = {};
iconOptions.width = 26;
iconOptions.height = 26;
iconOptions.primaryColor = "#FF0000";
iconOptions.cornerColor = "#F76767";
iconOptions.strokeColor = "#F76767";

/*iconOptions.label = "";
iconOptions.labelColor = "#000000";
iconOptions.addStar = false;
iconOptions.starPrimaryColor = "#FFFF00";
iconOptions.starStrokeColor = "#0000FF";
*/
var baseIcon = MapIconMaker.createMarkerIcon(iconOptions);

  iconOptions.primaryColor = "#23BA00";
  iconOptions.cornerColor = "#B2F9A7";
  iconOptions.strokeColor = "#23BA00";
var selectedIcon = MapIconMaker.createMarkerIcon(iconOptions);

//Extends basic marker with other key information
function myResto(restoName, c, stars, address, telNo, comment, bloglink, bookinglink, point, area, price, cuisine) {
	this.colour = c;
	this.point = point;
	this.marker = new GMarker(point, {icon: baseIcon});
	this.rating = parseInt( stars.substring(0,1) );
	this.price = parseInt(price);
	
	var wt = "<b>" + restoName + "</b>";
	if (this.rating > 0) {wt+= "<img src='" + codeBase + this.rating + "stars.png' style='float:none;'>&nbsp;";}
	if (this.price > 0) {wt+= "<img src='" + codeBase + this.price + "euro.png' style='float:none;'>";}
	wt += "<br clear=all><div class='IWaddr'>" + address + " (" + telNo + ")</div><hr style='display:block'><div class='IWcomment'>" + comment + "</div>";
	if (bloglink !== "none") {
		if (!AFmap) {wt += "<a href=" + bloglink + " class='IWcomment'>Restaurant's site</a>"
			} else {wt += "<a href=" + bloglink + " class='IWcomment'>Review</a>"
		}
	};
	if (bookinglink != "") wt += " <a href='" + bookinglink + "' target='_blank' class='booknow'>Book&nbsp now</a>";
	this.windowText = wt;
	this.colour = c;
	this.restoName = restoName;
	this.area = area;
	this.cuisine = cuisine;
	GEvent.bind(this.marker, "click", this, this.setSelect);
	GEvent.bind(this.marker, "infowindowclose", this, this.unSelect);
	map.addOverlay(this.marker);
	//alert ("added " + this.restoName);
}

myResto.prototype.setSelect = function() {
	if (this.marker.isHidden()) {this.marker.show()};		//show if otherwise hidden
	if (this == selectedResto) {  // i.e. we clicking on last selected icon
			this.unSelect();
		} else {		//
			if (selectedResto !== null) {selectedResto.unSelect();}  //close previous
			//Change colour and add window
			this.marker.setImage(selectedIcon.image);
			var markerOptions = {maxWidth : 300}
			this.marker.openInfoWindowHtml(this.windowText, markerOptions);
			selectedResto = this;
			//var svOptions = {latlng:this.point };
			//originalintro = document.getElementById("mapinfo").removeChild(document.getElementById("mapinfoinner") );
			//var myPano = new GStreetviewPanorama(document.getElementById("mapinfo"), svOptions);
	}
}

myResto.prototype.unSelect = function() {
	//alert ("Unselect");
	this.marker.setImage(baseIcon.image);
	this.marker.closeInfoWindow();
	selectedResto = null;
	//document.getElementById("mapinfo").innerHTML = "";
	//document.getElementById("mapinfo").appendChild(originalintro);
}

function showAppropriate() {
	for (var i = 0; i < numberOfRestos; i++) {
		if ((	(showStars[restos[i].rating]) &&
				((selectedCuisine == "All cuisines") || (selectedCuisine == restos[i].cuisine)) &&
				(showPrices[restos[i].price])) || (i == userSelected) 
			)
		{
			restos[i].marker.show();
		}
		else {
			//alert (showStars[restos[i].rating] + " : " + selectedCuisine  + " : " +  showPrices[restos[i].price]);
			restos[i].marker.closeInfoWindow();
			restos[i].marker.hide();
		}
	}
}

function processEvent(evt) {
	evt = (evt) ? evt : ((event) ? event : null );
	if (evt) {
		//alert (evt);
		var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
		if (elem) {
			elem = (elem.nodeType == 1 || elem.nodeType == 9) ? elem : elem.parentNode;
			return elem;
		}
	}
}

function processCheckmarks(evt) {
	elem	= processEvent (evt);
	var stars = parseInt( elem.getAttribute("name").substring(0,1) );
	showStars[stars] = !showStars[stars];
	
	showAppropriate();
}

function processPrices(evt) {
	elem	= processEvent (evt);
	var stars = parseInt( elem.getAttribute("name").substring(0,1) );
	showPrices[stars] = !showPrices[stars];
	
	showAppropriate();
}

function processCuisine() {
	if (document.getElementById("cuisineSelect")) {
		var thisSelect = document.getElementById("cuisineSelect");
		selectedCuisine = thisSelect.options[thisSelect.selectedIndex].value;
	}
	//alert(selectedCuisine);
	showAppropriate();
}

function processArea() {
	switch (document.getElementById("restoByArea").value) {
		case "Amsterdam":
			map.setCenter(new GLatLng(centreLat,centreLng), 13);
			document.getElementById('restoByArea').selectedIndex=0;
			break;
		case "Oud-West":  //Oud-West
			map.setCenter(new GLatLng(52.3664809, 4.87243652), 15);
			break;
		case "Watergraafsmeer":  //Oost/Watergraafsmeer
			map.setCenter(new GLatLng(52.3532719, 4.920158), 14);
			break;
		case "Westerpark":  //Westerpark
			map.setCenter(new GLatLng(52.3861823, 4.88136291), 15);
			break;
		case "Jordaan":  //Jordaan
			map.setCenter(new GLatLng(52.3759135, 4.88531112), 15);
			break;
		case "De Pijp":  //De Pijp
			map.setCenter(new GLatLng(52.3553688, 4.89252090), 15);
			break;
		case "Dam":  //Dam
			map.setCenter(new GLatLng(52.3713023, 4.89286422), 15);
			break;
		case "Rembrandtplein":  //Rembrandtplein
			map.setCenter(new GLatLng(52.3665857, 4.89320755), 15);
			break;
		case "Leidseplein":  //Leidseplein
			map.setCenter(new GLatLng(52.3640176, 4.88222122), 15);
			break;
		case "Nieuwmarkt":  //Nieuwmarkt
			map.setCenter(new GLatLng(52.3726909, 4.90024566), 15);
			break;
	}
}

function showAddress(address) {
	geocoder.getLatLng(
		address,
		function(point) {
			if (!point) {
				alert(address + " not found - try again?");
			} else {
				var homeIcon = new GIcon();
				homeIcon.image = "http://www.google.com/mapfiles/kml/pal2/icon2.png"
				homeIcon.iconSize=new GSize(32,32);
				homeIcon.shadowSize=new GSize(56,32);
				homeIcon.iconAnchor=new GPoint(16,32);
				homeIcon.infoWindowAnchor=new GPoint(16,0);
				
				var homeMarker = new GMarker(point, homeIcon);
				//panMap(homeMarker);
				map.addOverlay(homeMarker);
				//test for mapsetup.html
				if (document.getElementById("lat")) {
					//document.getElementById("message1").innerHTML = point.toString();
					document.getElementById("lat").value = point.y.toString();
					document.getElementById("lng").value = point.x.toString();
				}
			}
		}
  );
}

function loadMap(cLat, cLng) {
	//alert ("loading map");
	if ( document.URL.toString().indexOf("#") != -1) {
		param = document.URL.toString().substring(document.URL.toString().indexOf("#")+1, document.URL.toString().length);  //file://
	}
	//if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.setCenter(new GLatLng(cLat,cLng), 13);

		//Make geocoder emphasise locations on the map
		geocoder.setViewport(map.getBounds());
		if (AFmap) {
//		  (bMap) ? loadRestos() : loadRestosFromMySQL();
		  loadRestosFromMySQL();
		}
	//}
	originalintro = document.getElementById("mapinfoinner")
}

function loadRestos() {	//loads my xml file for brussels
	GDownloadUrl(codeBase+"brestos.xml", function(bdata, responseCode) {
		var bxml = GXml.parse(bdata);
		numberOfRestos = bxml.documentElement.getElementsByTagName("resto").length;
		//document.getElementById("message2").innerHTML = "Number of restos = " + restos.length.toString();
		var names = bxml.documentElement.getElementsByTagName("name");
		var colours = bxml.documentElement.getElementsByTagName("colour");
		var ratings = bxml.documentElement.getElementsByTagName("rating")
		var addresses = bxml.documentElement.getElementsByTagName("address");
		var comments = bxml.documentElement.getElementsByTagName("comment");
		var linkers = bxml.documentElement.getElementsByTagName("link");
		var qNames = bxml.documentElement.getElementsByTagName("qName");
		var prices = bxml.documentElement.getElementsByTagName("price");
		var points = bxml.documentElement.getElementsByTagName("marker");
	
		for (var i = 0; i < numberOfRestos; i++) {
			var point = new GLatLng(parseFloat(points[i].getAttribute("lat")),
											parseFloat(points[i].getAttribute("lng")));
			//function myResto(restoName, c, stars, address, telNo, comment, bloglink, point, area, price, cuisine)
			restos[i] = new myResto(names[i].firstChild.nodeValue,
								colours[i].firstChild.nodeValue,
								ratings[i].firstChild.nodeValue,
								addresses[i].firstChild.nodeValue,
								"",
								comments[i].firstChild.nodeValue,
								linkers[i].firstChild.nodeValue,
								point,
								"", prices[i].firstChild.nodeValue, "");

			//add to selection box on right
			var t= restos[i].restoName;
			if (restos[i].rating > 0) { t += " (" + restos[i].rating + "*)";}
			document.getElementById("restoByName").options[i+1] = new Option (t, qNames[i].firstChild.nodeValue);
			if (qNames[i].firstChild.nodeValue == param) {restos[i].setSelect();}
		}
		//Set to show all ratings, as ratings boxes don't exist on this web page
		for (i=0; i<6; i++) {
			showStars[i] = true;
		}
		for (i=1; i<4; i++) {
			var p = document.getElementById(i+'_price');
			(p.checked) ? showPrices[i] = true : showPrices[i] = false;
		}
		selectedCuisine = "All cuisines";
	});
}

function loadRestosFromMySQL() {
	//Code from google to generate xml from mysql
	GDownloadUrl(codeBase+"genxml.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		numberOfRestos = markers.length;
		for (var i = 0; i < markers.length; i++) {
			var rname = markers[i].getAttribute("name");
			var address = markers[i].getAttribute("address");
			var tel = markers[i].getAttribute("tel");
			var colour = markers[i].getAttribute("colour");
			var rating = markers[i].getAttribute("rating") + "stars";
			var qName = markers[i].getAttribute("qName");
			var comment = markers[i].getAttribute("comment");
			var area = markers[i].getAttribute("area");
			var cuisine = markers[i].getAttribute("cuisine");
			var price = markers[i].getAttribute("price");
			var bloglink = markers[i].getAttribute("bloglink");
			var bookinglink = markers[i].getAttribute("bookinglink");
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
											parseFloat(markers[i].getAttribute("lng")));
			// function myResto(restoName, c, stars, address, comment, bloglink, point, area, cuisine)
			restos[i] = new myResto(rname,
						colour,
						rating,
						address, tel,
						comment,
						bloglink, bookinglink,
						point,
						area,
						price,
						cuisine
						);
			if (qName == param) {
				restos[i].setSelect();
				userSelected = i;
			}
		}
		showStars[0] = true;
		for (i=1; i<6; i++) {
			var p = document.getElementById(i+'_star');
			(p.checked) ? showStars[i] = true : showStars[i] = false;
			//alert("Element " + i+'_star' + " is " + showStars[i]);
		}
		for (i=1; i<4; i++) {
			var p = document.getElementById(i+'_price');
			(p.checked) ? showPrices[i] = true : showPrices[i] = false;
			//alert("Element " + i+'_price' + " is " + showPrice[i]);
		}
		processArea();
		processCuisine();
	});
}

