/* Generelle Einstellungen, Initialisierung
  * @param: Lat lat, Lng lng
  */
function initialize(lat, lng){
  if (GBrowserIsCompatible()) {
	path = "typo3conf/ext/addressmap/";									// Pfad zum Extension-Verzeichnis
	markerArray = new Array();											// Array mit den Koordinaten der gesetzten Marker
	bounds = new GLatLngBounds();										// Array in dem die Koordinaten der Marker platziert werden
	allowedBounds = new GLatLngBounds(new GLatLng(47,6), new GLatLng(55,15));// Regionsbegrenzung
	ismaximized = false;												// Gibt an, ob die Karte maximiert ist

	map = new GMap2(document.getElementById("googlemap"));				// Neue Karte im DIV googlemap erstellen
	geocoder = new GClientGeocoder();									// Verbindung mit Google Server
	var mt = map.getMapTypes();
	for (var i=0; i<mt.length; i++){
		mt[i].getMinimumResolution = function(){ return 5; }			// Zoom-Beschränkung
	}
	GEvent.addListener(map, "move", function(){ checkBounds(); });		// Move-Listener für Regionsbeschränkung
	GEvent.addListener(map, "infowindowopen", function(){
		map.savePosition();
	});
	GEvent.addListener(map, "infowindowclose", function(){
		map.returnToSavedPosition();
	});

	
	smallmapcontrol = new GSmallMapControl();							// Kleine Navigation erstellen
	largemapcontrol = new GLargeMapControl();							// Große Navigation erstellen
	minimize = new minControl();										// Minimier-Button erstellen
	maximize = new maxControl();										// Maximier-Button erstellen
	
	map.setCenter(new GLatLng(lat, lng), 10);							// Karte ausrichten (Y,X),Zoom
	map.addControl(smallmapcontrol);									// Navigation erstellen
	map.addControl(maximize);											// Maximier-Button anzeigen
	
	baseIcon = new GIcon();												// Neues Marker-Icon erstellen
	baseIcon.shadow = path+"images/marker_shadow.png";					// Schattenbild festlegen
	baseIcon.iconSize = new GSize(20, 34);								// Icongröße angeben
	baseIcon.shadowSize = new GSize(37, 34);							// Schattengröße angeben
	baseIcon.iconAnchor = new GPoint(9, 34);							// Iconfixpunkt angeben
	baseIcon.infoWindowAnchor = new GPoint(9, 2);						// Tooltip-Fenster-Fixpunkt angeben
	baseIcon.infoShadowAnchor = new GPoint(18, 25);						// Tooltip-Fenster-Schatten-Fixpunkt angeben
  }
}

/* Bewegt die Karte zurück, falls Sie außerhalb der Regionsbeschränkung bewegt wurde
  */
function checkBounds() {
	if(allowedBounds.contains(map.getCenter())){
	  return;
	}

	var C = map.getCenter();
	var X = C.lng();
	var Y = C.lat();

	var AmaxX = allowedBounds.getNorthEast().lng();
	var AmaxY = allowedBounds.getNorthEast().lat();
	var AminX = allowedBounds.getSouthWest().lng();
	var AminY = allowedBounds.getSouthWest().lat();

	if (X < AminX) {X = AminX;}
	if (X > AmaxX) {X = AmaxX;}
	if (Y < AminY) {Y = AminY;}
	if (Y > AmaxY) {Y = AmaxY;}

	map.setCenter(new GLatLng(Y,X));
}

/* Legt das Marker-Icon anhand der Parameter fest, erstellt einen Marker und gibt ihn zurück
  * @param: Point point, Int/String icon, String tooltip
  * @return: GMarker marker
  */
function createMarker(point, icon, tooltip){
  var letteredIcon = new GIcon(baseIcon);
  switch(icon){
	case '1':
		letteredIcon.image = path+"images/marker_anwalt.png";
		break;
	case '2':
		letteredIcon.image = path+"images/marker_insolvenzgericht.png";
		break;
	case '3':
		letteredIcon.image = path+"images/marker_sanierer.png";
		break;
	case '4':
		letteredIcon.image = path+"images/marker_schuldnerberatungsstelle.png";
		break;
	case '5':
		letteredIcon.image = path+"images/marker_verwalter.png";
		break;
	default:
		if(icon.substring(0,5) == "point"){
			letteredIcon.image = path+"images/marker_"+icon+".png";
		}else{
			letteredIcon.image = path+"images/marker_default.png";
		}
  }
  var markerOptions = { icon:letteredIcon };
  var marker = new GMarker(point, markerOptions);

  GEvent.addListener(marker,"click", function() {
	maximizeMap();
    marker.openInfoWindowHtml(tooltip);
  });
  
  return marker;
}

/* Erstellt den HTML-Text für das InfoWindow
  * @param: String institution, String firstname, String lastname, String location, String webpage, String pictures
  * @return: String tooltip
  */
function createTooltip(institution, firstname, lastname, location, webpage, pictures){
	var tooltip = '<b>'+institution+'</b><br/>';
	
	if(lastname != ''){
		if(firstname != ''){
			tooltip = tooltip+'<br/>'+lastname+', '+firstname+'<br/>';
		}else{
			tooltip = tooltip+'<br/>'+lastname+'<br/>';
		}
	}
	
	if(location != ''){
		tooltip = tooltip+location+'<br/>';
	}
	
	if(webpage != ''){
		if(webpage.indexOf("http://")==-1 && webpage.indexOf("https://")==-1){
			webpage = 'http://'+webpage;
		}else if(webpage.indexOf("http")!=0){
			webpage.slice(webpage.indexOf("http"));
		}
		webpage = '<a href="'+webpage+'" target="_blank">Homepage</a>';
		tooltip = tooltip+webpage+'<br/>';
	}
	
	if(pictures != ''){
		var pics = pictures.split(",");
		for(var i=0; i<pics.length; i++){
			pics[i] = 'uploads/tx_addressmap/'+pics[i];
			pics[i] = '<img src="'+pics[i]+'" width="100" border="1"/> ';
			tooltip = tooltip+pics[i];
		}
		tooltip = tooltip+'<br/><br/>';
	}
	
	return tooltip;
}

/* Tooltip zur Adresse erstellen und dann an placeAddress übergeben
  * @param: Float lat, Float lng, String address, String city, String country, Int/String groups, String firstname, String lastname, String institution, String webpage, String pictures
  */
function addLocation(lat, lng, address, city, country, groups, firstname, lastname, institution, webpage, pictures){
	var location = address+', '+city;
	if(country != ''){
		location = location+', '+country;
	}
	var tooltip = createTooltip(institution, firstname, lastname, location, webpage, pictures);
	placeAddress(lat, lng, groups, tooltip);
}

/* Tooltip zur Adresse erstellen und dann an placeAddress übergeben - EINZELANSICHT!
  * @param: Float lat, Float lng, String address, String city, String country, Int/String groups, String firstname, String lastname, String institution, String webpage, String pictures
  */
function addLocation2(lat, lng, address, city, country, groups, firstname, lastname, institution, webpage, pictures){
	var location = address+', '+city;
	if(country != ''){
		location = location+', '+country;
	}
	var tooltip = createTooltip(institution, firstname, lastname, location, webpage, pictures);
	placeAddress(lat, lng, groups, tooltip);
	map.savePosition();
}

/* Platziert mehrere Punkte gleichzeitig in der Karte
  * @param: Array addresses
  */
function addAll(addresses){
	map.clearOverlays();
	delete markerArray;
	markerArray = new Array();
	
	var cont = document.getElementById('content');
	var myObjColl = getElementsByClassName('numeration','div', cont);
	for (var i = 0, j = myObjColl.length; i < j; i++) {
	   myObjColl[i].style.display="inline";
	}
	
	for(var i=0; i<addresses.length; i++){
		var location = addresses[i]['address']+', '+addresses[i]['city'];
		if(addresses[i]['country'] != ''){
			location = location+', '+addresses[i]['country']
		}

		var tooltip = createTooltip(addresses[i]['institution'],
									addresses[i]['firstname'],
									addresses[i]['lastname'],
									location,
									addresses[i]['webpage'],
									addresses[i]['pictures']);
		var group = 'point'+(i+1);
		placeAddress(addresses[i]['latitude'], addresses[i]['longitude'], group, tooltip);
	}
	
	maximizeMap();
	map.setZoom(map.getBoundsZoomLevel(bounds));
	map.setCenter(bounds.getCenter());
	map.savePosition();
}

/* Leert die Karte
  */
function removeAll(){
	map.clearOverlays();
	delete markerArray;
	markerArray = new Array();
	
	var cont = document.getElementById('content');
	var myObjColl = getElementsByClassName('numeration','div', cont);
	for (var i = 0, j = myObjColl.length; i < j; i++) {
	   myObjColl[i].style.display="none";
	}
}

/* Setzt die Adresse der Koordinaten auf der Karte
  * @param: Float lat, Float lng, Int/String group, String tooltip
  */
function placeAddress(lat, lng, group, tooltip){
	var addresspoint = new GLatLng(lat, lng);
	for(var i=0; i<markerArray.length; i++){
		if(markerArray[i].getLatLng().lat() == addresspoint.lat() && markerArray[i].getLatLng().lng() == addresspoint.lng()){
			if(group.substring(0,5) != 'point'){
				map.panTo(addresspoint);
			}
			return 0;
		}
	}
	
	var marker = createMarker(addresspoint, group, tooltip);
	markerArray[markerArray.length] = marker;
	map.addOverlay(marker);
	bounds.extend(addresspoint);
	map.savePosition();
	
	if(group.substring(0,5) != 'point'){
		//maximizeMap();
		map.panTo(addresspoint);
		//marker.openInfoWindowHtml(tooltip); Bug in IE7!
	}
}

/* Initialisiert die Wegbeschreibung
  */
function initDirections(){
	gdir = new GDirections(map, document.getElementById("directions"));
	GEvent.addListener(gdir, "load", onGDirectionsLoad);
	GEvent.addListener(gdir, "error", handleGDirectionsErrors);
}

/* Wegbeschreibung erstellen und ausgeben
  * @param: String fromAddress, String toAddress
  */
function setDirections(fromAddress, toAddress){
	if(toAddress != ''){
		gdir.clear();
		gdir.load("from: " + fromAddress + " to: " + toAddress, { "locale":"de" });
	}else{
		alert("Bitte geben Sie die Startadresse ein!");
	}
}

/* Load-Ereignisse für Wegbeschreibung
 */
function onGDirectionsLoad(){
}

/* Fehlerbehandlung für Wegbeschreibung
  */
function handleGDirectionsErrors(){
   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	 alert("Eine der angegebenen Adressen ist falsch!");
   
   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	 alert("Verbindungsfehler!");
   
   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	 alert("Ziel- oder Start-Adresse fehlt!");
	 
   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	 alert("Google Maps Api Key ist für diese Seite nicht gültig!");

   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	 alert("Die Wegbeschreibung konnte nicht berechnet werden!");
	
   else
     alert("Es trat ein unbekannter Fehler auf!");
}

/* Zentriert die Karte bei Größenänderung
  */
function centerMap(){
	var center = map.getCenter();
	map.checkResize();
	map.panTo(center);
}

/* Maximiert die Karte
  */
function maximizeMap(){
	if(!ismaximized){
		ismaximized = true;
		document.getElementById('googlemap').style.height="390px";
		map.checkResize();
		map.removeControl(maximize);
		map.removeControl(smallmapcontrol);
		map.removeControl(minimize);
		map.removeControl(largemapcontrol);
		map.addControl(minimize);
		map.addControl(largemapcontrol);
	}
}

/* Zeichnet einen Kreis um den Punkt mit einem bestimmten Radius
  * @param: Point center, Int radius
  */
function drawCircle(center, radius){
	radius = parseFloat(radius);
	var sw = map.getBounds().getSouthWest();
	var ne = map.getBounds().getNorthEast();
	var circleSquish = (ne.lng() - sw.lng()) / (ne.lat() - sw.lat());
	
	var points = new Array();
	for(var i=0; i<360; i+=5){	// 5 ergibt die Qualität des Kreises
		var point = new GLatLng(
			parseFloat(center.lat()) + (radius * Math.sin(i * (Math.PI / 180))),
			parseFloat(center.lng()) + (radius * Math.cos(i * (Math.PI / 180))) * (circleSquish/1.32)
			);
		points.push(point);
		bounds.extend(point);
	}
	points.push(points[0]);
	
	var polyline = new GPolyline(points, "#4781C0", 3, 0.7);	// Punkte, Farbe, Dicke, Tranparenz
	map.addOverlay(polyline);
	map.setZoom(map.getBoundsZoomLevel(bounds));
	map.setCenter(bounds.getCenter());
}

/* Schickt das Formular zur Überprüfung und dann weiter zur Addressauflösung, gibt immer false zurück
  * @param: Form form
  * @return: false
  */
function getLatLng(form){
	var erg = checkSearchForm(form);
	if(erg == -1){
		return true;
	}else if(erg){
		geocoder.getLocations(form.elements["tx_addressmap_pi1[city]"].value, function(response){ setLatLng(response, form, 'getLatLng'); });
	}
	return false;
}

/* Füllt das übergebene Formular mit den Koordinaten und dem Radius mittels der eingetragenen Stadt und dem Umkreis
  * @param: Placemark/Status response, Formular form, String from
  */
function setLatLng(response, form, from){
	if(!response || response.Status.code != 200){
		if(from == 'getLatLng'){
			alert("Stadt nicht gefunden!\nVersuchen Sie durch ein Komma getrennt noch das Bundesland anzugeben.");
		}
		if(from == 'getCoord'){
			alert("Stadt nicht gefunden!\nVersuchen Sie mehr Daten zu erfassen.");
		}
	}else{
		if(from == 'getLatLng'){
			form.elements["tx_addressmap_pi1[lat]"].value = response.Placemark[0].Point.coordinates[1];
			form.elements["tx_addressmap_pi1[lng]"].value = response.Placemark[0].Point.coordinates[0];
			form.elements["tx_addressmap_pi1[radius]"].value = parseFloat(form.elements["tx_addressmap_pi1[distance]"].value)*0.0089831;
			form.submit();
		}
		if(from == 'getCoord'){
			form.elements["coordx"].value = response.Placemark[0].Point.coordinates[1];
			form.elements["coordy"].value = response.Placemark[0].Point.coordinates[0];
			form.submit();
		}
	}
}

/* Schickt das Formular zur Adressauflösung
  * @param: Formular form, String address
  */
function getCoord(form, address){
	geocoder.getLocations(address, function(response){ setLatLng(response, form, 'getCoord'); });
	return false;
}

/* Überprüft das Filterformular, -1 wenn keine Umkreissuche
  * @param: Form searchform
  * @return: Boolean
  */
function checkSearchForm(searchform){
	if(searchform.elements["tx_addressmap_pi1[distance]"].value != 0){
		if(searchform.elements["tx_addressmap_pi1[city]"].value == ''){
			alert("Bitte tragen Sie in das Feld der Stadt eine Stadt ein,\noder wählen Sie '-' in der Umkreissuche aus!");
			return false;
		}else{
			return true;
		}
	}else{
		return -1;
	}
}

/* Minimieren-Button-Funktion */
function minControl(){}
minControl.prototype = new GControl();
minControl.prototype.initialize = function(map) {
	var minButton = document.createElement("div");
	this.setButtonStyle_(minButton);
	minButton.appendChild(document.createTextNode("Minimieren"));
	GEvent.addDomListener(minButton, "click", function() {
		ismaximized = false;
		document.getElementById('googlemap').style.height="130px";
		centerMap();
		map.addControl(maximize);
		map.removeControl(minimize);
		map.removeControl(largemapcontrol);
		map.addControl(smallmapcontrol);
	});
	map.getContainer().appendChild(minButton);
	return minButton;
}
minControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7));
}
minControl.prototype.setButtonStyle_ = function(button) {
	button.style.textDecoration = "underline";
	button.style.color = "#4781C0";
	button.style.background = "url("+path+"images/bg_minmax.png) repeat-x 0 0";
	button.style.font = "small Arial";
	button.style.border = "1px solid black";
	button.style.padding = "2px";
	button.style.marginBottom = "3px";
	button.style.textAlign = "center";
	button.style.width = "6em";
	button.style.cursor = "pointer";
}

/* Maximieren-Button-Funktion */
function maxControl(){}
maxControl.prototype = new GControl();
maxControl.prototype.initialize = function(map) {
	var maxButton = document.createElement("div");
	this.setButtonStyle_(maxButton);
	maxButton.appendChild(document.createTextNode("Maximieren"));
	GEvent.addDomListener(maxButton, "click", function() {
		ismaximized = true;
		document.getElementById('googlemap').style.height="390px";
		centerMap();
		map.addControl(minimize);
		map.removeControl(maximize);
		map.removeControl(smallmapcontrol);
		map.addControl(largemapcontrol);
	});
	map.getContainer().appendChild(maxButton);
	return maxButton;
}
maxControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7));
}
maxControl.prototype.setButtonStyle_ = function(button) {
	button.style.textDecoration = "underline";
	button.style.color = "#4781C0";
	button.style.background = "url("+path+"images/bg_minmax.png) repeat-x 0 0";
	button.style.font = "small Arial";
	button.style.border = "1px solid black";
	button.style.padding = "2px";
	button.style.marginBottom = "3px";
	button.style.textAlign = "center";
	button.style.width = "6em";
	button.style.cursor = "pointer";
}

function getElementsByClassName(strClass, strTag, objContElm) {
  strTag = strTag || "*";
  objContElm = objContElm || document;
  var objColl = objContElm.getElementsByTagName(strTag);
  if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
  var arr = new Array();
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
  var arrClass = strClass.split(delim);
  for (var i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (var k = 0, l = arrObjClass.length; k < l; k++) {
      for (var m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]);
          break comparisonLoop;
        }
      }
    }
  }
  return arr;
}

// To cover IE 5.0's lack of the push method
Array.prototype.push = function(value) {
  this[this.length] = value;
}