/**
 * @author Giuseppe Tagliamonte
 */
var arrayLinee;
var arrayPercorsi;
var xmldoc;
var map;
var gmarkers = [];
var markers = [];
var i = 0;
var geo;
var color = "";

function caricaPagina() {
	var xmlHttp;
	if (window.XMLHttpRequest) {
		xmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Il tuo browser non supporta AJAX!");
	}

	var side_bar_html = "";
	xmlHttp.open("GET", "/EavServlet?n=1", true);
	xmlHttp.onreadystatechange = handleStateChange;
	function handleStateChange() {
		if (xmlHttp.readyState == 4) {
			arrayLinee = xmlHttp.responseText;
			document.getElementById("side_bar").innerHTML = arrayLinee;
		}
	}
	xmlHttp.send(null);
	if (GBrowserIsCompatible()) {
		var dirn1 = new GDirections();

		geo = new GClientGeocoder();
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();
		map.setCenter(new GLatLng(40.871728, 14.269524), 12);
		GEvent.addListener(map, 'click', function(overlay, point) {
			// var latLngStr = "Lat = " + point.y + ", Long = " + point.x;
				if (!overlay) {
					trovaFermata(point);
				}
			});

	} else {
		alert("Mi dispiace, le Google Maps API non sono compatibili con questo browser");
	}
}

function trovaFermata(point) {
	var xmlHttp;
	if (window.XMLHttpRequest) {
		xmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Il tuo browser non supporta AJAX!");
	}
	xmlHttp.open("GET", "/EavServlet?n=5&lat=" + point.y + "&lng=" + point.x,
			true);
	xmlHttp.onreadystatechange = handleStateChange;
	function handleStateChange() {
		if (xmlHttp.readyState == 4) {
			var xmlDoc;
			if (window.ActiveXObject) {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(xmlHttp.responseText);
			} else {
				xmlDoc = xmlHttp.responseXML.documentElement;
			}
			var fermata = xmlDoc.getElementsByTagName("fermata");
			map.clearOverlays();
			var html = "<li class='titolo'>Elenco Fermate</li>";
			html += "<li class='backMenu'><a href='#' style='background-color: #4E90C3' onclick='getLinee()'>Torna alle linee</a></li>";
			if (fermata.length == 0) {
				alert("Non ci sono fermate nel raggio di 1 km\n "
						+ "dall'indirizzo richiesto");
			} else {
				for ( var i = 0; i < fermata.length; i++) {
					var idFermata = fermata[i].getAttribute("id");
					var lat = parseFloat(fermata[i].getAttribute("lat"));
					var lng = parseFloat(fermata[i].getAttribute("lng"));
					var descrizione = fermata[i].getAttribute("descrizione");
					var pointF = new GLatLng(lat, lng);
					color = "red";
					var marker = createMarker(pointF, descrizione, i,
							idFermata, color);
					gmarkers[i] = marker;
					map.addOverlay(marker);
					map.setCenter(point, 14);
					html += "<li><a href=\"javascript:vediInfo(" + i + ",\'"
							+ descrizione + "\')" + "\" id='" + idFermata
							+ "' >" + descrizione + "</a></li>";
					document.getElementById("side_bar").innerHTML = html;
				}
			}

		}
	}
	xmlHttp.send(null);
}

function vediInfo(i, descrizione) {
	map.setCenter(gmarkers[i].getLatLng(), 15);
	gmarkers[i].openInfoWindowHtml("" + descrizione + "<br />"
			+ "Clicca sulla fermata per ottenere le previsioni di arrivo.");
}

function getLinee() {
	var side_bar_html = "";
	// document.getElementById("side_bar").innerHTML = arrayLinee;
	if (arrayLinee.length > 0) {
		document.getElementById("side_bar").innerHTML = arrayLinee;
	}
}

function getPercorsi(id) {
	var xmlHttp;
	if (window.XMLHttpRequest) {
		xmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Il tuo browser non supporta AJAX!");
	}

	var side_bar_html = "";
	xmlHttp.open("GET", "/EavServlet?n=2&idLinea=" + id, true);
	xmlHttp.onreadystatechange = handleStateChange;
	function handleStateChange() {
		if (xmlHttp.readyState == 4) {
			arrayPercorsi = xmlHttp.responseText;
			document.getElementById("side_bar").innerHTML = arrayPercorsi;
		}
	}
	xmlHttp.send(null);
}

function getFermate(idPercorso, id) {
	var xmlHttp;
	if (window.XMLHttpRequest) {
		xmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Il tuo browser non supporta AJAX!");
	}

	var side_bar_html = "";
	xmlHttp.open("GET", "/EavServlet?n=3&idPercorso=" + idPercorso + "&id="
			+ id, true);
	xmlHttp.onreadystatechange = handleStateChange;
	function handleStateChange() {
		if (xmlHttp.readyState == 4) {
			var xmlDoc;
			if (window.ActiveXObject) {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(xmlHttp.responseText);
			} else {
				xmlDoc = xmlHttp.responseXML.documentElement;
			}
			var markers = xmlDoc.getElementsByTagName("fermata");
			if (markers.length > 0) {
				var point1 = new GLatLng(parseFloat(markers[0]
						.getAttribute("lat")), parseFloat(markers[0]
						.getAttribute("lng")));
				map.clearOverlays();
				var html = "<li class='titolo'>Elenco Fermate</li>";
				html += "<li class='backMenu'><a href='#' style='background-color: #4E90C3' onclick='getPercorsi(\""
						+ id + "\")'>Torna ai Percorsi</a></li>";
				for ( var i = 0; i < markers.length; i++) {
					// obtain the attribues of each marker
					var idFermata = markers[i].getAttribute("id");
					var lat = parseFloat(markers[i].getAttribute("lat"));
					var lng = parseFloat(markers[i].getAttribute("lng"));
					var descrizione = markers[i]
							.getAttribute("descrizioneLunga");
					var point = new GLatLng(lat, lng);

					// create the marker
					color = "red";
					if ((i == 0) || (i == markers.length - 1)) {
						color = "green";
					}
					var marker = createMarker(point, descrizione, i, idFermata,
							color);
					// save the info we need to use later for the side_bar
					gmarkers[i] = marker;
					map.addOverlay(marker, descrizione);
					html += "<li><a href=\"javascript:vediInfo(" + i + ",\'"
							+ descrizione + "\')\" id='" + idFermata + "' >"
							+ descrizione + "</a></li>";
				}
				if (markers.length > 2)
					map.setCenter(point1, 13);
				else
					map.setCenter(point1, 11);
				document.getElementById("side_bar").innerHTML = html;
			}
		}
	}
	xmlHttp.send(null);
}

// This function picks up the click and opens the corresponding info window
function tempoArrivo(i, idFermata, descrizione) {
	gmarkers[i]
			.openInfoWindowHtml("Sto Calcolando le previsioni di arrivo<br/><br/>"
					+ "<center><img src='icons/ajax-loader.gif'/></center>");
	var xmlHttp;
	if (window.XMLHttpRequest) {
		xmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Il tuo browser non supporta AJAX!");
	}

	xmlHttp.open("GET", "/EavServlet?n=4&id=" + idFermata + "&descrizione="
			+ descrizione, true);
	xmlHttp.onreadystatechange = handleStateChange;
	function handleStateChange() {
		if (xmlHttp.readyState == 4) {
			arrayPercorsi = xmlHttp.responseText;
			gmarkers[i].closeInfoWindow();
			gmarkers[i].openInfoWindowHtml(arrayPercorsi);
		}
	}
	xmlHttp.send(null);
}

function createMarker(point, descrizione, j, idFermata, color) {
	var tinyIcon = new GIcon();
	tinyIcon.image = "http://labs.google.com/ridefinder/images/mm_20_" + color
			+ ".png";
	tinyIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	// tinyIcon.iconSize = new GSize(16, 16);
	// tinyIcon.shadowSize = new GSize(22, 20);
	tinyIcon.iconAnchor = new GPoint(6, 20);
	tinyIcon.infoWindowAnchor = new GPoint(5, 1);
	tinyIcon.label = "";

	// Set up our GMarkerOptions object literal
	markerOptions = {
		icon :tinyIcon
	};
	// var marker = new GMarker(point,Icon);
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, 'click', function() {
		tempoArrivo(j, idFermata, descrizione);
	});
	// save the info we need to use later for the side_bar
	gmarkers[i] = marker;
	i++;
	return marker;
}

// ===== list of words to be standardized =====
var standards = [ [ "road", "rd" ], [ "street", "st" ], [ "avenue", "ave" ],
		[ "av", "ave" ], [ "drive", "dr" ], [ "saint", "st" ],
		[ "north", "n" ], [ "south", "s" ], [ "east", "e" ], [ "west", "w" ],
		[ "expressway", "expy" ], [ "parkway", "pkwy" ], [ "terrace", "ter" ],
		[ "turnpike", "tpke" ], [ "highway", "hwy" ], [ "lane", "ln" ] ];

// ===== convert words to standard versions =====
function standardize(a) {
	for ( var i = 0; i < standards.length; i++) {
		if (a == standards[i][0]) {
			a = standards[i][1];
		}
	}
	return a;
}

// ===== check if two addresses are sufficiently different =====
function different(a, b) {
	// only interested in the bit before the first comma in the reply
	var c = b.split(",");
	b = c[0];
	// convert to lower case
	a = a.toLowerCase();
	b = b.toLowerCase();
	// remove apostrophies
	a = a.replace(/'/g, "");
	b = b.replace(/'/g, "");
	// replace all other punctuation with spaces
	a = a.replace(/\W/g, " ");
	b = b.replace(/\W/g, " ");
	// replace all multiple spaces with a single space
	a = a.replace(/\s+/g, " ");
	b = b.replace(/\s+/g, " ");
	// split into words
	awords = a.split(" ");
	bwords = b.split(" ");
	// perform the comparison
	var reply = false;
	for ( var i = 0; i < bwords.length; i++) {
		// GLog.write (standardize(awords[i])+" "+standardize(bwords[i]))
		if (standardize(awords[i]) != standardize(bwords[i])) {
			reply = true
		}
	}
	// GLog.write(reply);
	return (reply);
}

// ====== Plot a marker after positive reponse to "did you mean" ======
function place(lat, lng) {
	var point = new GLatLng(lat, lng);
	map.setCenter(point, 14);
	map.addOverlay(new GMarker(point));
	document.getElementById("message").innerHTML = "";
}

function showAddress() {
	var search = document.getElementById("search").value;
	// ====== Perform the Geocoding ======
	geo
			.getLocations(search, function(result) {
				map.clearOverlays();
				if (result.Status.code == G_GEO_SUCCESS) {
					// ===== If there was more than one result, "ask did
					// you mean" on them all =====
					if (result.Placemark.length > 1) {
						document.getElementById("message").innerHTML = "Stai cercando:";
						// Loop through the results
						for ( var i = 0; i < result.Placemark.length; i++) {
							var p = result.Placemark[i].Point.coordinates;
							point = new GLatLng(p[1], p[0]);
							document.getElementById("message").innerHTML += "<br>"
									+ (i + 1)
									+ ": <a href=\"javascript:trovaFermata(new GLatLng"
									+ point
									+ ")\">"
									+ result.Placemark[i].address + "</a>";
						}
					}
					// ===== If there was a single marker, is the
					// returned address significantly different =====
					else {
						document.getElementById("message").innerHTML = "";
						if (different(search, result.Placemark[0].address)) {
							document.getElementById("message").innerHTML = "Stai cercando: ";
							var p1 = result.Placemark[0].Point.coordinates;
							var point0 = new GLatLng(p1[1], p1[0]);
							document.getElementById("message").innerHTML += "<a href=\"javascript:trovaFermata(new GLatLng"
									+ point0
									+ ")\" >"
									+ result.Placemark[0].address + "</a>";
						} else {
							var p11 = result.Placemark[0].Point.coordinates;
							var point1 = new GLatLng(p11[1], p11[0]);
							trovaFermata(point1);
							document.getElementById("message").innerHTML = "Indirizzo: "
									+ result.Placemark[0].address;
						}
					}
				}
				// ====== Decode the error status ======
				else {
					var reason = "Code " + result.Status.code;
					if (reasons[result.Status.code]) {
						reason = reasons[result.Status.code]
					}
					alert('Could not find "' + search + '" ' + reason);
				}
			});
}