// ---------------- Deklaration Variablen ----------------

// t: BankCard p: Sparkassen m: CashGroup b: CashPool w: eigenes Netzwerk
var chains = new Array('m', 'b', 'p', 't', 'w');
// Generierung Staedte-Icons
var iconWidths = new Array(12, 12, 14, 16, 16, 20, 22, 24, 26);
var iconHeights = new Array(20, 22, 24, 27, 30, 36, 40, 44, 48);
var icons = new Array(iconWidths.length);
for (i = 0; i < icons.length; i++) {
	icons[i] = new google.maps.MarkerImage("/images/gaa/" + (i + 1) + ".png",
			new google.maps.Size(iconWidths[i], iconHeights[i]),
			new google.maps.Point(0, 0), // The origin for this image is 0,0.
			new google.maps.Point(Math.ceil(iconWidths[i] / 2), iconHeights[i]));
}
//Generierung Bank-Icons
var cache = new Array();
for (i = 0; i < chains.length; i++) {
	chain = chains[i];
	cache[chain] = new Array(1, 1, null, null, 0, null);
	cache[chain][2] = new google.maps.MarkerImage("/images/gaa/" + chain
			+ ".png", new google.maps.Size(16, 28), new google.maps.Point(
			0, 0), new google.maps.Point(16, 28));

	cache[chain][5] = new google.maps.MarkerImage("/images/gaa/" + "s-"
			+ chain + ".png", new google.maps.Size(11, 17),
			new google.maps.Point(0, 0), new google.maps.Point(5, 16));
	cache[chain][3] = new Array();
	chainOn = (chainString == "" || chainString.indexOf(chain) != -1);
	aendereGruppenStyle(chain, chainOn);
	cache[chain][0] = chainOn;
}
var markersArray = [];
var map;
var points;
var minX;
var maxX;
var minY;
var maxY;
var standpunkt;
var standpunkt_pos;
var cutoff = 0;

// Programmablauf
var myOptions = {
	zoom : zoom,
	center : new google.maps.LatLng(standpunkt_lat, standpunkt_lon),
	mapTypeId : google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map"), myOptions);
google.maps.event.addListener(map, "tilesloaded", function() {
	startRequest();
});
google.maps.event.addListener(map, "zoom_changed", function() {
	startRequest();
});
google.maps.event.addListener(map, "dragend", function() {
	startRequest();
});

// ---------------- DATENVERARBEITUNG ----------------
// Aufbereitung Request und Ablaufverarbeitung
function startRequest() {
	zoom = map.getZoom();
	var bounds = map.getBounds();
	var url;
	var request;
	var zz = 1;
	miny = bounds.getSouthWest().lat();
	minx = bounds.getSouthWest().lng();
	maxy = bounds.getNorthEast().lat();
	maxx = bounds.getNorthEast().lng();
	request = erzXMLHttpRequestObject();
	updateGruppenString();
	chainSelection = "";
	if (chainString != null) {
		chainSelection = "&chains=" + chainString;
	}
	getChain = "";
	url = "/geldautomaten/gaa_daten?minx=" + minx + "&miny=" + miny + "&maxx="
			+ maxx + "&maxy=" + maxy + "&zoom=" + zz + "&last=" + cutoff
			+ chainSelection + getChain;
	if (standard == 1) {
		url = url + "&standard=1";
		standard = 0;
	}
	request.open("GET", url, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var xmlDoc = request.responseText;
			if (xmlDoc == "")
				return;
			var rows = xmlDoc.split("\n");
			processHeader(rows[0]); // Verarbeitung erste Zeile
			for (i = 1; i < rows.length - 1; i++) { // Verarbeitung Datenzeilen
				rows[i] = rows[i].split("|");
				if (rows[i].length > 6) {// Verarbeitung GAA Standorte
					createRestaurant(rows[i]);
				} else if (rows[i].length == 5) {// Verarbeitung Staedte
					createCity(rows[i]);
				}
			}

		}
	};
	request.send(null);
}
// Verarbeitung erhaltener Daten
function processHeader(data) {
	/* 
	 * Verarbeitung der ersten Zeile des Datenstreams:
	 * Werte 0 bis 9 angezeigte Automaten der einzelnen Gruppen
	 * Wert 10: Summe der Automaten
	 * Wert 11: Cutoff (Anzeigenlevel)
	 */
	arr = data.split("|");
	clear = arr[12];
	// Hier wird die Map gecleard
	if (clear == 1)
		clearmap();
	for (i = 0; i < 5; i++) {
		chain = chains[i];
		count = arr[i];
		if (count == "")
			count = 0;
		count = parseInt(count);
		cache[chain][4] = count;
		document.getElementById("count" + chain).innerHTML = addComma(count);
	}
	document.getElementById("totalcount").innerHTML = addComma(parseInt(arr[10]));
	cutoff = arr[11];

	// Hier wird der Anzeige Level bestimmt
	if (cutoff == 0) {
		cutString = "Geldautomaten";
	} else if (cutoff == 1) {
		cutString = "Städte";
	} else {
		cutString = "Städte mit mehr als " + cutoff + " Standorten";
	}
	document.getElementById("showing").innerHTML = cutString;
}
// Erzeugt die Marker für die Staedte
function createCity(rowdata) {
	// Ueergabe von 5 Werten:0-Anzahl Automaten in Stadt,
	// 1-lang,2-lat,3-city,4-state
	var num = rowdata[0];
	var city = rowdata[3];
	var latlang = new google.maps.LatLng(rowdata[2], rowdata[1]);
	iconNum = Math.floor(num / 10);
	if (iconNum < 0)
		iconNum = 0;
	if (iconNum > 8)
		iconNum = 8;
	icon = icons[iconNum];
	var text = "Geldautomaten in " + city + ": " + num;
	marker = new google.maps.Marker( {
		position : latlang,
		map : map,
		title : text,
		icon : icon
	});
	google.maps.event.addListener(marker, "click", function() {
		var new_zoom = 11;
		var old_zoom = map.getZoom();
		if (old_zoom >= new_zoom) {
			new_zoom = old_zoom + 1;
		}
		map.setCenter(latlang);
		map.setZoom(new_zoom);
	});
	markersArray.push(marker);
}

// Erzeugt Marker für Standorte und Routing
function createRestaurant(rowdata) {
	var name;
	var id = rowdata[0];
	var icon;
	var chain = rowdata[3];
	var latlang = new google.maps.LatLng(rowdata[2], rowdata[1]);

	if (chain == "m")
		name = "Cash Group";
	if (chain == "b")
		name = "Cash Pool";
	if (chain == "p")
		name = "Sparkassen-Verbund";
	if (chain == "t")
		name = "BankCard ServiceNetz";
	if (chain == "w")
		name = "eigenes Netzwerk";
	if (zoom > 10)
		icon = cache[chain][2];
	else
		icon = cache[chain][5];
	var address = rowdata[4];
	var text = rowdata[7] + " ("+name+"): " + address;
	
	if (rowdata[5])
		text += ", " + rowdata[5];
	if (rowdata[8])
		text += ", " + rowdata[8];
	
	var marker = new google.maps.Marker( {
		position : latlang,
		map : map,
		title : text,
		icon : icon
	});
	markersArray.push(marker);
	if (standpunkt_pos) {
		google.maps.event.addListener(marker, "click", function() {
			var directionsService = new google.maps.DirectionsService();
			var directionsDisplay = new google.maps.DirectionsRenderer();
			directionsDisplay.setMap(map);
		    directionsDisplay.setPanel(document.getElementById("info"));
			var start = standpunkt_pos;
		    var end = latlang;
		    var request = {
		        origin:start, 
		        destination:end,
		        language:"de",
		        travelMode: google.maps.DirectionsTravelMode.DRIVING
		    };
		    
		    directionsService.route(request, function(response, status) {
		      if (status == google.maps.DirectionsStatus.OK) {
		       directionsDisplay.setDirections(response);
		      }
		    });
			
		});
	}
}


// ---------------- HELPERFUNKTIONEN ----------------
//An- und Ausschalten von Gruppen
function toggleChain(chain, flag) {
	count = 0;
	zoom = 20;// ändere Zoomstufe, sonst kein ClearCash

	if (cache[chain][0] == flag) {
		return;
	}
	aendereGruppenStyle(chain, flag);
	if (!flag) {
		cache[chain][0] = false;
	} else {
		cache[chain][0] = true;
	}
	startRequest(minX, minY, maxX, maxY, zoom);
}
// Veraenderung der ausgewaehlten Gruppen im Suchstring, der an php uebergeben wird
function updateGruppenString() {
	allChains = 1;
	str = "";
	for ( var select in cache) {
		if (select == 0)
			continue;
		c = cache[select][0];
		if (c == 1)
			str += select;
		else
			allChains = 0;
	}
	if (str == "")
		str = "0";
	if (allChains)
		str = "";
	chainString = str;
}
// Fuegt 1000-Stelle in Zahl ein
function addComma(num) {
	if (num < 1000)
		return num;
	numstr = num.toString();
	newnum = numstr.substr(0, numstr.length - 3) + "."
			+ numstr.substr(numstr.length - 3, 3);
	return newnum;
}
function clearmap() {
	if (markersArray && markersArray.length > 0) {
		for (i = 0; i < markersArray.length; i++) {
			markersArray[i].setMap(null);
		}
		markersArray.length = 0;
	}
}
// ---------------- DOMFUNKTIONEN ----------------
function aendereGruppenStyle(chain, flag) {
	if (cache[chain][0] == flag)
		return;
	document.getElementById("check" + chain).checked = flag;
	if (!flag) {
		document.getElementById("icon" + chain).src = "/images/gaa/" + "bw.png";
		document.getElementById("name" + chain).style.color = "#BBBBBB";
		document.getElementById("count" + chain).style.color = "#DDDDDD";
	} else {
		document.getElementById("icon" + chain).src = "/images/gaa/" + "s-"
				+ chain + ".png";
		document.getElementById("name" + chain).style.color = "";
		document.getElementById("count" + chain).style.color = "";
	}
}

// ---------------- AJAXFUNKTIONEN ----------------
function erzXMLHttpRequestObject() {
	var resObjekt = null;
	try {
		resObjekt = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (Error) {
		try {
			resObjekt = new ActiveXObject("MSXML2.XMLHTTP");
		} catch (Error) {
			try {
				resObjekt = new XMLHttpRequest();
			} catch (Error) {
			}
		}
	}
	return resObjekt;
}
//---------------- Geolocation und Routing----------------
function showAddress(direct) {
	geocoder = new google.maps.Geocoder();
	document.getElementById("message").innerHTML = "";
	var search;
	if (!direct) {
		search = document.getElementById("search").value + ", Deutschland";
	} else {
		search = direct;
		document.getElementById("search").value = direct;
	}
	geocoder.geocode({'address' : search},
					function(results, status) {
						if (status == google.maps.GeocoderStatus.OK) {
							processAdressen(results);
						} else {
							var reasons = [];
							reasons["ZERO_RESULTS"] = "Unbekannte Adresse:  Für die angegebene Adresse konnten keine Koordinaten gefunden werden.";
							reasons["REQUEST_DENIED"] = "Unerreichbare Adresse:  Die Koordinaten konnten aufgrund rechtlicher oder vertraglicher Bedingungen nicht zurückgegeben werden.";
							reasons["OVER_QUERY_LIMIT"] = "Serverfehler: Es wurden zuviele Anfragen gestellt.";
							reasons["INVALID_REQUEST"] = "ServerFehler: Die Abfrage konnte nicht ausgeführt werden.";
							if (reasons[status]) {
								var reason = reasons[status];
								alert(search + '\n' + reason);
							}
						}
					});
}
// Liste der gefundenen Standorte und Setzen des Markers auf den ersten Standpunkt
function processAdressen(result) {
	if (result.length > 1) {
		message = "<table><tr><td colspan=2>Resultate:</td></tr>";
		for ( var i = 0; i < result.length; i++) {
			adress_new = result[i].formatted_address;
			adress_detail = adress_new.split(",");
			message += "<tr><td>" + (i + 1)
					+ ":</td><td><a  href=\"javascript:showAddress('"
					+ adress_detail[0] + "," + adress_detail[1] + ","
					+ adress_detail[2] + "')\">" + adress_detail[0] + ", "
					+ adress_detail[1] + "</a></td></tr>";
		}
		message += "</table>"
		document.getElementById("message").innerHTML = message;
	}
	map.setCenter(result[0].geometry.location);
	map.setZoom(14);
	standpunkt = new google.maps.Marker( {
		map : map,
		position : result[0].geometry.location
	});
	standpunkt_pos = result[0].geometry.location;
	
}

//W3C Geolocation
function geolocate() {
	var browserSupportFlag = new Boolean();
	// Try W3C Geolocation (Preferred)
	if (navigator.geolocation) {
		browserSupportFlag = true;
		navigator.geolocation.getCurrentPosition(function(position) {
			var position=new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
			standpunkt = new google.maps.Marker( {
				map : map,
				position : position
			});
			standpunkt_pos=new google.maps.LatLng(position.latitude, position.longitude);
			map.setCenter(position);
			map.setZoom(14);
		}, function() {
			handleNoGeolocation(browserSupportFlag);
		});
		// Try Google Gears Geolocation
	} else if (google.gears) {
		browserSupportFlag = true;
		var geo = google.gears.factory.create('beta.geolocation');
		geo.getCurrentPosition(function(position) {
			standpunkt = new google.maps.LatLng(position.latitude,
					position.longitude);
			standpunkt_pos=new google.maps.LatLng(position.latitude, position.longitude);
			map.setCenter(standpunkt);
			map.setZoom(14);
		}, function() {
			handleNoGeoLocation(browserSupportFlag);
		});
		// Browser doesn't support Geolocation
	} else {
		browserSupportFlag = false;
		handleNoGeolocation(browserSupportFlag);
	}
}
function handleNoGeolocation(errorFlag) {
	alert("Ihr Standort konnte nicht ermittelt werden");

}
