var iconList = [];
var markerList = [];

/*########## bePALmap Funktionen ##########*/
function addMarker(marker, title)
{
	if (clusterer)
	{
		clusterer.AddMarker(marker, title);
	}
	else
	{
		getMapObj().addOverlay(marker);
	}
}

function removeMarker(marker)
{
	getMapObj().removeOverlay(marker);
}

function createMarker(mPoint, icon) 
{ 
	if(icon) 
	{
		return new GMarker(mPoint, icon); 
	} 
	else 
	{
		return new GMarker(mPoint); 
	}
}

function createTextMarker(mPoint, mText, mIcon, markerId, mLabel) 
{ 
	var opts = {};
	if (mIcon)
		opts.icon = mIcon;
	if (mLabel)
		opts.title = mLabel;
	var marker = new GMarker(mPoint, opts);
	
	if (mText) {
		marker.bindInfoWindowHtml(mText, {'maxWidth':200});
	}

	if (zoomMarker)
	{
		GEvent.addListener(marker, 'mouseover', function() { showZoomMarker(marker); });
		GEvent.addListener(marker, 'mouseout', function() { timerReset("hideZoomMarker()"); });
	}
	return marker; 
}

function panMapTo(lat, lng) 
{
	getMapObj().setCenter(new GLatLng(lat, lng));
}

function setZoomlevel(level) 
{
	getMapObj().setZoom(level);
}

function showAddress(address) 
{
	if (geocoder) 
	{
		geocoder.getLatLng(address, function(point)
		{ 
			if (!point) {
				alert(address+' konnte nicht gefunden werden');
			} else { 
				getMapObj().removeOverlay(arrowmarker);
				getMapObj().setCenter(point, 13);
				arrowmarker = createMarker(point, getArrowIcon());
				getMapObj().addOverlay(arrowmarker);
			}
		});
	}
}

function getIcon(img)
{
	if (img)
	{
		var icon = new GIcon(baseIcon);
		icon.image = iconPath + img;
		return icon;
	}
	return baseIcon;
}

function getArrowIcon()
{
	var icon = new GIcon();
	icon.image = iconPath + 'arrow_0.png';
	icon.shadow = iconPath + 'arrow_shadow.png';
	icon.iconSize = new GSize(39, 34);
	icon.shadowSize = new GSize(39, 34);
	icon.iconAnchor= new GPoint(10, 32);
	return icon;
}

function createZoomMarker(icImg, icW, icH, shImg, shW, shH, anchX, anchY, anchInfoX, anchInfoY, titletext)
{
	var ic = new GIcon();
	ic.image = icImg;
	ic.iconSize = new GSize(icW, icH);
	ic.iconAnchor = new GPoint(anchX, anchY);
	if (shImg)
	{
		ic.shadow = shImg;
		ic.shadowSize = new GSize(shW, shH);
	}
	if (anchInfoX && anchInfoY)
		ic.infoWindowAnchor = new GPoint(anchInfoX, anchInfoY);
	else
		ic.infoWindowAnchor = new GPoint(0, 0);
	
	var opts = {
		icon:ic,
		zIndexProcess:function(){ return 10000; },
		title:titletext
		};
	zoomMarker = new GMarker(new GLatLng(0, 0), opts);
	zoomMarker.hide();
	GEvent.addListener(zoomMarker, 'click', function() { zoomPanTo(zoomMarker); });
	GEvent.addListener(zoomMarker, 'mouseover', function() { timerStop(); });
	GEvent.addListener(zoomMarker, 'mouseout', function() { timerReset("hideZoomMarker()"); });
	addMarker(zoomMarker);
}

function showZoomMarker(marker)
{
	if ((getMapObj().getZoom() < mapMaxZoom) && zoomMarker.isHidden())
	{
		timerStop();
		zoomMarker.setPoint(marker.getPoint());
		zoomMarker.show();
	}
}

function hideZoomMarker()
{
	zoomMarker.hide();
}

function zoomPanTo(marker) 
{
	hideZoomMarker();
	var ln = marker.getPoint();
	panMapTo(ln.lat(), ln.lng());
	setZoomlevel(mapMaxZoom);
}

function submitRoute(tohere, print, targetId)
{
	var markeraddress = document.getElementById('markeraddress').value;
	var address = '';
	if (document.getElementById('routingaddress') !== null)
	{
		address = document.getElementById('routingaddress').value;
	}
	address = (address.length < 1) ? routingaddress : address;
	var url = (print) ? 'http://maps.google.de/maps?hl=de&f=d&z=17&om=1&pw=2&' : 'http://maps.google.de/maps?';
	var start = 'saddr=';
	var dest = 'daddr=';
	if (tohere)
	{
		start += address;
		dest += markeraddress;
	}
	else
	{
		start += markeraddress;
		dest += address;
	}
	
	url += start + '&' + dest;
	window.open(url, '_blank');
	logRoute(print, targetId);
}

function logRoute(print, targetId)
{
	var action = (print) ? "drucken" : "berechnen";
	loadXML('/logAction.php?id='+ownUserId+'&action='+action+'&target='+targetId, null);
}


/**
 * gibt den Befehl zum speichern der Kartenposition und Zoom in die DB
**/
function saveMapOptions(savepath)
{
	var mapObj = getMapObj();
	if (typeof mapObj != 'object')
		return;
	var z = mapObj.getZoom();
	var latlng = mapObj.getCenter();
	var lat = latlng.lat();
	var lng = latlng.lng();

	savepath += '&lat=' + lat + '&lng=' + lng + '&zoom=' + z;
	window.location.href = savepath;
}

/**
 * Lädt XML-Datei führt die übergebene Funktion aus
**/
function loadXML(url, func)
{
	//IE
	var xmlDoc;
	if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
		xmlDoc.load(url);
		if (func)
			func(xmlDoc);
	}
	//Mozilla, Firefox, Opera, etc.
	else if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.load(url);
		if (func)
			xmlDoc.onload = function() { func(xmlDoc); };
	}
	else
	{
		alert('Die hier verwendeten interaktiven Inhalte sind mit Ihrem \nverwendeten Browser leider nicht kompatibel. \nEs können keine Daten dargestellt werden');
	}
}

/**
 * prüft, ob Kartendaten neu geladen werden müssen
**/
var checkUpdates = function(xmlDoc) 
{
	var t = new Date();
	t = t.getTime();
	var update = getTextContent(xmlDoc.getElementsByTagName("lastUpdate")[0]);
	if ((update != lastUpdate) || (markerList.length < 1))
	{
		lastUpdate = update;
		loadXML(xmlPath +'kunden.xml?t='+t, initOverlays);
	}
	mapRefreshTimer = window.setTimeout(function() { loadXML(xmlPath +'version.xml?t='+t, checkUpdates); }, 30000);
	if (window.loadBanner)
		loadBanner();
}

/**
 * Erzeugt die Marker Icons
 * @param xmlNodes IconStyle Nodes
**/
function createMarkerIcons(xmlNodes)
{
	if (iconList.length > 0)
		return;
	for (var i = 0; i < xmlNodes.length; i++) 
	{
		var icon = xmlNodes[i].getElementsByTagName("Icon")[0];
		if (icon == null)
			continue;

		if ((icon.getElementsByTagName("href")[0] == null) || getTextContent(icon.getElementsByTagName("href")[0]).length < 2)
			continue;
		var icId = xmlNodes[i].getAttribute("id");
		var icW = parseInt(getTextContent(icon.getElementsByTagName("width")[0]));
		var icH = parseInt(getTextContent(icon.getElementsByTagName("height")[0]));
		var anchX = parseInt(getTextContent(icon.getElementsByTagName("anchorX")[0]));
		var anchY = parseInt(getTextContent(icon.getElementsByTagName("anchorY")[0]));
		var infoanchX = parseInt(getTextContent(icon.getElementsByTagName("infowindowAnchorX")[0]));
		var infoanchY = parseInt(getTextContent(icon.getElementsByTagName("infowindowAnchorY")[0]));
		var hover = getTextContent(icon.getElementsByTagName("hover")[0]);
		
		var newIcon = new GIcon(baseIcon);
		newIcon.iconAnchor= new GPoint(anchX, anchY);
		newIcon.shadow = getTextContent(icon.getElementsByTagName("shadow")[0]);
		newIcon.shadowSize = new GSize(icW, icH);
		newIcon.image = getTextContent(icon.getElementsByTagName("href")[0]);
		newIcon.iconSize = new GSize(icW, icH);
		newIcon.infoWindowAnchor = new GPoint(infoanchX, infoanchY);
		iconList[icId] = newIcon;
		
		if ((hover !== null) || (hover.length > 1))
		{
			var hoverIcon = new GIcon(newIcon);
			hoverIcon.image = getTextContent(icon.getElementsByTagName("hover")[0]);
			iconList[icId + 'Hover'] = hoverIcon;
		}
	}
}

function getIndexOfMarker(id)
{
	for (var i = 0; i < markerList.length; i++) 
	{
		if (markerList[i][0] == id)
			return i;
	}
	return -1;
}

function addMarkerFromPlacemark(xmlNode)
{
	var id = xmlNode.getAttribute("id");
	var ppoint = getTextContent(xmlNode.getElementsByTagName("coordinates")[0]).split(",");
	if (ppoint.length < 2 || id < 1)
		return null;
	
	//var markerIndex = getIndexOfMarker(id);
	//if (markerIndex >= 0)
	//	return null;

	var platlng = new GLatLng(ppoint[1], ppoint[0]);
	var name = getTextContent(xmlNode.getElementsByTagName("name")[0]);
	var street = getTextContent(xmlNode.getElementsByTagName("street")[0]);
	var plz = getTextContent(xmlNode.getElementsByTagName("plz")[0]);
	var city = getTextContent(xmlNode.getElementsByTagName("city")[0]);
	var tel = getTextContent(xmlNode.getElementsByTagName("tel")[0]);
	var fax = getTextContent(xmlNode.getElementsByTagName("fax")[0]);
	var email = getTextContent(xmlNode.getElementsByTagName("email")[0]);
	var edv = getTextContent(xmlNode.getElementsByTagName("edv")[0]);
	var grp = getTextContent(xmlNode.getElementsByTagName("grp")[0]);
	var prod = getTextContent(xmlNode.getElementsByTagName("prod")[0]);
	
	var picon = iconList['image'+grp];
	var pdesc = 'EDV-Nr.: '+ edv + ' | Gruppe: '+ grp + '<br />';
	pdesc += '<b>'+ name +'</b><br />';
	pdesc += street +'<br />';
	pdesc += plz +' '+ city +'<br />';
	pdesc += 'Tel.:' + tel +' | Fax: '+ fax +'<br />';
	pdesc += '<a href="mailto:'+ email +'">'+ email +'</a><br />';
	pdesc += 'Produkte: '+ prod +'<br />';
	pdesc += '<a href="javascript:void(0)" onclick="setTarget(\'start\', '+ id +');">Start</a> | ';
	pdesc += '<a href="javascript:void(0)" onclick="setTarget(\'destination\', '+ id +');">Ziel</a> | ';
	pdesc += '<a href="javascript:void(0)" onclick="addRoute('+ id +');">Route</a>';
	
	var address = street + ', '+ plz + ' '+ city;
	
	var marker;
	marker = createTextMarker(platlng, pdesc, iconList['image'+grp], -1, unescapeHtml(name +' ['+prod +']'));
	markerList.push([id, name, address, marker]);
	addMarker(marker, name);
}

/**
 * Fügt die Marker aus der XML-Datei in die Karte ein
**/
var initOverlays = function(xmlDoc)
{
	//icons erzeugen
	createMarkerIcons(xmlDoc.getElementsByTagName("IconStyle"));
	
	//marker holen und erzeugen
	xmlNodes = xmlDoc.getElementsByTagName("Placemark");
	for (var i = 0; i < xmlNodes.length; i++) 
	{
		addMarkerFromPlacemark(xmlNodes[i]);
	}
}

function showMarkerDetails(markerId, dir)
{
	var idx = getIndexOfMarker(markerId);
	if (idx < 0)
		return;
	var m = markerList[idx][3];
	m.openInfoWindowHtml(markerList[idx][4]);
	var db = getElement('detailbar');
	db.innerHTML = markerList[idx][5];
	if (ownMarker && dir)
	{
		var bounds = new GLatLngBounds();
		bounds.extend(m.getPoint());
		bounds.extend(ownMarker.getPoint());
		getMapObj().setZoom(getMapObj().getBoundsZoomLevel(bounds));
		getMapObj().setCenter(bounds.getCenter());
		bePALdirection.load("from: "+ ownMarker.getPoint().toUrlValue() +" to: "+ m.getPoint().toUrlValue());
	}
	//var dd = bePALdirection.getDistance();
	//var ds = bePALdirection.getStatus();
	//var c = 0;
}

/**
 * @param Array mIdArr Array der MarkerId's 
 * @param String type Mögliche Werte: local, view, print 
*/
function showDirection(mIdArr, type)
{
	if (mIdArr.length < 2)
		return;
	getMapObj().closeInfoWindow();
	
	var url = (type == 'print') ? 'http://maps.google.de/maps?hl=de&f=d&z=17&om=1&pw=2&' : 'http://maps.google.de/maps?';
	var start = (type == 'local') ? 'from:' : 'saddr=';
	var dest = (type == 'local') ? ' to:' : '&daddr=';
	
	
	
	var idx;
	var m;
	var str = '';
	for (i = 0; i < mIdArr.length; i++)
	{
		idx = getIndexOfMarker(mIdArr[i]);
		if (idx < 0)
			continue;
		m = markerList[idx][3];
		if (i == 0)
		{
			start += m.getPoint().toUrlValue();
			if (type != 'local')
				start += encodeURIComponent(' ('+markerList[idx][1] +', '+ markerList[idx][2] +')');
		}
		else
		{
			if (i > 1)
				dest += ' to:';
			dest += m.getPoint().toUrlValue();
			if (type != 'local')
				dest += encodeURIComponent(' ('+markerList[idx][1] +', '+ markerList[idx][2] +')');
		}
	}
	
	if (type == 'local')
		bePALdirection.load(start + dest);
	else
		window.open(url + start + dest, '_blank');
}

function clearDirection()
{
	if (bePALdirection != null)
		bePALdirection.clear();
}

var bePALdirectionError = function()
{
	var status = bePALdirection.getStatus().code;
	var str = 'Fehler: ';
	
	switch (status)
	{
	case 400:
	case 601:
		str += 'Ungültige Adressübergabe';
		break;
		
	case 602:
	case 603:
	case 604:
		str += "Es konnten keine Routeninformationen \nfür diese Strecke gefunden werden";
		break;
		
	case 500:
		str += "Google-Serverfehler";
		break;
		
	case 610:
		str += "Ungültiger API-Key";
		break;
		
	case 620:
		str += "Maximale Anzahl an Routenabfragen pro 24h erreicht";
		break;
	
	default:
		str += "Unbekannter Fehler";
	}
	
	str += " ("+ status +")";
	alert(str);
}
/*END########## bePALmap Funktionen ##########*/


/*########## Timer Funktionen ##########*/
var timerId = null;
var delay = 1000;
function timerReset(func)
{
	timerStop();
	timerStart(func, delay);
}

function timerStop()
{
	if (timerId)
	{
		clearTimeout(timerId);
		timerId = null;
	}
}

function timerStart(func, delay)
{
	timerId = window.setTimeout(func, delay);
}
/*END########## Timer Funktionen ##########*/


/*########## Allgemeine Funktionen ##########*/
function hideOverlay(objId)
{
	var d = getElement(objId);
	d.style.display = "none";
}

function getElement(elementId)
{
	return (document.getElementById) ? document.getElementById(elementId) : document.all.elementId;
}

function getTextContent(domNode)
{
	return ((domNode == null) || (domNode.childNodes.length < 1)) ? '' : domNode.childNodes[0].nodeValue;
}

function compareArray(a, b, type)
{
	if (type == 'num')
		return a - b;
	else
	{
		if (a < b) 
			return -1;
		if (a > b) 
			return 1;
		return 0;
	}
}

function findPos(obj) 
{
	var left = 0;
	var top = 0;
	if (obj.offsetParent) 
	{
		left = obj.offsetLeft
		top = obj.offsetTop
		while (obj = obj.offsetParent) 
		{
			left += obj.offsetLeft
			top += obj.offsetTop
		}
	}
	return [left, top];
}

/**
 *	Liefert die Breite und Höhe des sichtbaren Browser-Body
 * @return Array [0] = Breite, [1] = Höhe
**/
function getBodySize()
{
	var w = -1;
	if(window.innerWidth)
		w = window.innerWidth;
	else if(document.body && document.body.clientWidth)
		w = document.body.clientWidth;
	
	var h = -1;
	if(window.innerHeight)
		h = window.innerHeight;
	else if(document.documentElement)
		h = document.documentElement.offsetHeight;
	else if(document.body && document.body.offsetHeight)
		h = document.body.offsetHeight;
	
	return [w, h];
}
/*END########## Allgemeine Funktionen ##########*/


