var lastbounds;
var map;
var lastzoom;
var points;
var cityView=1;
var minX;
var maxX;
var minY;
var maxY;
var zoom;
var detail=-1;
var showWindow=false;
var selected=null;
var gdir;
var man_clear=0;

var standpunkt_lon=10.3;
var standpunkt_lan=52;

var numPoints=0;//Anzahl angezeigter GAAs
var maxPoints=200;


var cache;
var cutoff=0;
var chains=new Array('m','b','p','t','w','k','j','h','c','i');



// browseridentifikation
var IE=false;
browser=navigator.appName;
check=browser.indexOf("Microsoft");
if (check!=-1) {IE=true;}
// browseridentifikation

// Generierung StÃÂ¤dte-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);
var iconPolys=new Array("7,17,5,12,2,8,2,4,5,2,9,2,11,4,11,8,8,12",
						"7,18,5,13,2,8,2,4,6,1,8,1,11,4,11,8,8,13",
						"7,20,6,15,2,10,2,4,6,2,10,2,13,4,13,10,9,15",
						"8,23,7,17,2,11,2,6,6,2,11,2,15,6,15,11,10,17",
						"9,27,7,19,2,12,2,5,5,2,12,2,15,5,15,12,10,19",
						"11,32,9,23,2,13,2,7,7,2,14,2,19,7,19,13,12,23",
						"12,36,10,25,2,14,2,8,8,2,16,2,21,8,21,14,14,25",
						"12,40,11,29,2,16,2,8,9,2,17,2,23,8,23,16,14,29",
						"14,46,10,29,2,18,2,9,12,1,17,1,25,9,25,18,17,29");
for (i=0;i<icons.length;i++){
	width=iconWidths[i];
	height=iconHeights[i];
	icons[i]= new GIcon();
	icons[i].image="/images/gaa/"+(i+1)+".png";
	icons[i].iconSize= new GSize(width,height);
	icons[i].iconAnchor = new GPoint(Math.ceil(width/2),height);
	icons[i].infoWindowAnchor = new GPoint(width/2,width/2);
	icons[i].poly = iconPolys[i];
}
// Generierung StÃÂ¤dte-Icons


//Allgemeine Funktionen
function clearmap() {
	if (man_clear==0) {
		map.clearOverlays();
	}
// wird noch nicht gebraucht initArray();
man_clear=0;
numPoints=0;
	point=new GLatLng(standpunkt_lon,standpunkt_lan);
	marker= new GMarker(point);
	map.addOverlay(marker);
}
function hideTheInfoWindow(force) {
// versteckt InfoDiv mit Detailinformationen	
if (force!=null && force==1)
	document.getElementById("cursor1").style.display="none";
	showWindow=false;
}
function addComma(num) {
//fÃÂ¼gt 1000-Stelle in Zahl ein
if (num<1000) return num;
numstr=num.toString();
newnum=numstr.substr(0,numstr.length-3)+"."+numstr.substr(numstr.length-3,3);
return newnum;
}

function getMouseXY(e) {
	if (!cityView) return;
	
	if (IE) {
		tempX = event.clientX + document.body.scrollLeft;
		tempY = event.clientY + document.body.scrollTop;
	}
	else { 
		tempX = e.pageX;
		tempY = e.pageY;
	}  
	if (tempX < 0){tempX = 0;}
	if (tempY < 0){tempY = 0;}  
	
	if (showWindow) {
		document.getElementById("cursor1").style.left=(tempX+20) +"px";
		document.getElementById("cursor1").style.top=(tempY-5) +"px";
		document.getElementById("cursor1").style.display="";
	} else { 	
		document.getElementById("cursor1").style.display="none"; 
	}
	return true;
}
//Allgemeine Funktionen


//Darstellung HTML der Gruppen
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="";
	}
}
function toggleChain(chain, flag) {
// An- und Ausschalten von Gruppen
// Benutzung des Cashs ist ausgeschaltet, da der Funktionsweise noch unklar ist
count=0;
zoom=20;//ändere Zoomstufe, sonst kein ClearCash

if (cache[chain][0]==flag) return;
	aendereGruppenStyle(chain,flag);
	
	if (!flag) {
		cache[chain][0]=false;
		
		
		startRequest(minX,minY,maxX,maxY,zoom); 
		/*
		if (cityView) {
			
			startRequest(minX,minY,maxX,maxY,zoom); 
		} else {
			//wegklicken in GAA Ansicht
			for (var marker in cache[chain][3])
			{
				map.removeOverlay(cache[chain][3][marker]);
			}
			updateTotal();
			updateGruppenString();
		}*/
	} 
	else {
		cache[chain][0]=true;
		startRequest(minX,minY,maxX,maxY,zoom); 
		/*
		if (cityView) {
			startRequest(minX,minY,maxX,maxY,zoom); 
		} else {
			if (cache[chain][1]) {
				updateTotal();
				
				for (var marker in cache[chain][3])
				{
					map.addOverlay(cache[chain][3][marker]);
				}
				updateGruppenString();
			} else {
				startRequest(minX,minY,maxX,maxY,zoom,null,null,null,null,chain); 
			}
		cache[chain][1]=1;
		
		}	
		*/
	}
}

//Initialisierung Gruppen
function initGruppen() {

	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 GIcon();
		cache[chain][2].image="/images/gaa/"+chain+".png";
		cache[chain][2].iconSize= new GSize(16, 28);
		cache[chain][2].iconAnchor = new GPoint(8, 27);
		cache[chain][2].infoWindowAnchor = new GPoint(5, 1);
		cache[chain][2].poly="8,27,7,18,2,12,2,6,7,2,11,2,15,6,15,12,10,18";
		
		cache[chain][5]=new GIcon();
		cache[chain][5].image="/images/gaa/"+"s-"+chain+".png";
		cache[chain][5].iconSize= new GSize(11, 17);
		cache[chain][5].iconAnchor = new GPoint(5, 16);
		cache[chain][5].infoWindowAnchor = new GPoint(5, 1);
		cache[chain][5].poly="6,16,5,11,2,8,2,3,5,1,7,1,10,3,10,8,7,11";
		
		cache[chain][3]=new Array();
		chainOn=(chainString=="" || chainString.indexOf(chain)!=-1);
		aendereGruppenStyle(chain,chainOn);
		cache[chain][0]=chainOn;

	}
		
}
//Initialisierung Gruppen


function initBody() {

initGruppen();
//noch nicht gebraucht: debugData("",1);
map = new GMap2(document.getElementById("map"));

map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl());
gdir=new GDirections(map, document.getElementById("info"));


GEvent.addListener(map, "dragstart", function() {
	dragging=true;
});

GEvent.addListener(map, "dragend", function() {
	dragging=false;
});

/*
GEvent.addListener(map, "click", function(overlay,point) {
	if (overlay==null) select(null);
});
*/


GEvent.addListener(map, "moveend", function() {

	zoom= map.getZoom();
	var bounds = map.getBounds();
//noch nicht gebraucht: syncCache();
	minY=bounds.getSouthWest().lat();
	minX=bounds.getSouthWest().lng();
	maxY=bounds.getNorthEast().lat();
	maxX=bounds.getNorthEast().lng();
	
	if (lastbounds!=null) {
		var lastMinY=lastbounds.getSouthWest().lat();
		var lastMinX=lastbounds.getSouthWest().lng();
		var lastMaxY=lastbounds.getNorthEast().lat();
		var lastMaxX=lastbounds.getNorthEast().lng();
	}
	
	if (lastbounds==null || minX!=lastMinX || minY!=lastMinY || maxX!=lastMaxX || maxY!=lastMaxY)
	{	
	if (lastbounds!=null && !refresh && zoom==lastzoom && numPoints<maxPoints) {
		//startRequest(minX, minY, maxX, maxY, zoom, lastMinX, lastMinY, lastMaxX, lastMaxY);
		startRequest(minX, minY, maxX, maxY, zoom);
		} else {
			startRequest(minX, minY, maxX, maxY, zoom);
		}
	}
	refresh=0;
	lastbounds=bounds;
	lastzoom=zoom;		


});

map.setCenter(new GLatLng(lat,lon), zoom);

if (!IE) document.captureEvents(Event.MOUSEMOVE);
document.getElementById("map").onmousemove = getMouseXY;
}

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;
}

function startRequest(minx,miny,maxx,maxy,z,minx2,miny2,maxx2,maxy2,ch) {
	var url;
	var request;
	var zz=1;

// Festlegen der Zoomstufe	
//	if (detail!=-1) 
//		zz=detail;
//	else
//		zz=z;
//	if (zz<0) zz=0;
//	if (zz>17) zz=17;
// Festlegen der Zoomstufe	
	
	
// wird nicht gebraucht if (minx>0) minx=-180; warum sind die Werte drin?
// wird nicht gebraucht if (minx2!=null && minx2>0) minx2=-180; warum sind die Werte drin?

//if (z==lastzoom) {zz=0;} // bei gleichem zoomlevel keine mapclear
zz=1;
request=erzXMLHttpRequestObject();
	updateGruppenString();
	
	chainSelection="";
	if (chainString!=null) chainSelection="&chains="+chainString;
	
	getChain="";
	if (ch!=null) getChain="&getchain="+ch;


	if (minx2==null) 
	{
		url="/geldautomaten/gaa_daten?minx="+minx+"&miny="+miny+"&maxx="+maxx+"&maxy="+maxy+"&zoom="+zz+"&last="+cutoff+chainSelection+getChain;
	}
	else
		url="/geldautomaten/gaa_daten?minx="+minx+"&miny="+miny+"&maxx="+maxx+"&maxy="+maxy+"&minx2="+minx2+"&miny2="+miny2+"&maxx2="+maxx2+"&maxy2="+maxy2+"&zoom="+zz+"&last="+cutoff+chainSelection+getChain;

	if (standard==1) {
		url=url+"&standard=1";
		standard=0;
	}


// wird nicht gebraucht debugData(url,1);
	boundcheck=map.getBounds();
//	request.setRequestHeader("Content-type","application/x-www-form-urlencoded","charset=UTF-8");
	request.open("GET", url , true);
	
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
  			var xmlDoc = request.responseText;
 			if (xmlDoc=="") return;
        	var rows=xmlDoc.split("\n");
// wird nicht gebraucht			tStart   = new Date();
			processHeader(rows[0]); //Verarbeitung erste Zeile
// wird nicht gebraucht				prevPoints=numPoints;

			for (i=1;i<rows.length-1;i++) { // Verarbeitung  Datenzeilen
				rows[i]=rows[i].split("|");
				if (rows[i].length==9) {// Verarbeitung  GAA Standorte
					createRestaurant(rows[i]);
					cityView=0;
				} else if (rows[i].length==5){// Verarbeitung  StÃÂ¤dte
					createCity(rows[i]);
					cityView=1;
				}
			}	
			
// wird nicht gebraucht			var   tStop = new Date();
// wird nicht gebraucht			var   tDiff = tStop.getTime() - tStart.getTime();
// wird nicht gebraucht			var sec=tDiff/1000;
// wird nicht gebraucht				var newPoints=numPoints-prevPoints;
// wird nicht gebraucht			var out="Created " +newPoints+" points in " + sec + " seconds.\n";
// wird nicht gebraucht			debugData(out,0);		
		}
	}
	point=new GLatLng(standpunkt_lon,standpunkt_lan);
	marker= new GMarker(point);
	map.addOverlay(marker);
  	request.send(null);
	
//letzte Zeile ist Verarbeitungsgeschwindigkeit	
}
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;
}

function createCity(rowdata) {
//ÃÅbergabe von 5 Werten
//0:Anzahl Automaten in Stadft
//1:lang
//2:lat
//3:city
//4:state
	var marker;
	var num=rowdata[0];
	var city=rowdata[3];
	var state=rowdata[4];
	var id=city+"+"+state;
	var point;

// wenn nicht auskommentiert passiert nicht. warum?
//	if (cache[0][id]!=null) return;

	point=new GLatLng(rowdata[2],rowdata[1]);
	
//marker 1.png-8.png	
	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 FFMarker(point,icon,text,num);
//	map.addOverlay(marker);
//lbr


	marker= new GMarker(point,icon);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindow(text);  
		map.setCenter(point,11);
  		});
	map.addOverlay(marker);
	

  
	//cache[0][id]=marker;
	numPoints++;
}
function createRestaurant(rowdata) {   

	var name;
	var marker;
	var id=rowdata[0];
	var icon;
	
	var chain=rowdata[3];
// wenn nicht auskommentiert passiert nicht. warum?
//	if (cache[chain][3][id]!=null) return;
	
	point=new GLatLng(rowdata[2],rowdata[1]);

	if (chain=="m") name="Cash Group";
	if (chain=="b") name="Cash Pool";
	if (chain=="t") name="Sparkassen-Verbund";
	if (chain=="k") name="BankCard ServiceNetz";
	if (chain=="p") name="eigenes Netzwerk";

	
	 if (zoom>10) icon=cache[chain][2];
	 else icon=cache[chain][5];
	 
	 var address=rowdata[4];
	 var text="<b>"+rowdata[7]+"</b><br>"+address+"<br>"+rowdata[5]+", "+rowdata[6]+"<br><br>"+name;
	var gdir=new GDirections(map, document.getElementById("message"));
	marker= new GMarker(point,icon);
	
	GEvent.addListener(marker, "click", function(gdir) {  
		marker.openInfoWindow(text);

		var saddr=(standpunkt_lon+","+standpunkt_lan);
		var daddr=rowdata[2]+","+rowdata[1];
		setDirections("from: "+document.getElementById("search").value+"@"+saddr+" to: "+address+"@"+daddr);
	});
	map.addOverlay(marker);
	
	
     

  
	
	
	cache[chain][3][id]=marker;
	
	numPoints++;
	
}
function updateTotal() {
	total=0;
	for (i=0;i<chains.length;i++) {
		chain=chains[i];
		if (cache[chain][0]) total+=cache[chain][4];
	}
	
	document.getElementById("totalcount").innerHTML=addComma(total);
}


function updateGruppenString(){
// VerÃ¤nderung der ausgewÃÂ¤hlten Gruppen im Suchstring, der an php ÃÂ¼bergeben wird
	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;
}

function showAddress(direct) {
document.getElementById("message").innerHTML="";
man_clear=1;
var search;
var reasons=[];
	reasons[G_GEO_SUCCESS]            = "Erfolg";
	reasons[G_GEO_MISSING_ADDRESS]    = "Fehlerhafte Adresse: Die Adresse hat gefehlt.";
	reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unbekannte Adresse:  Für die angegebene Adresse konnten keine Koordinaten gefunden werden.";
	reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unerreichbare Adresse:  Die Koordinaten konnten aufgrund rechtlicher oder vertraglicher Bedingungen nicht zurückgegeben werden.";
	reasons[G_GEO_BAD_KEY]            = "Serverfehler: Der Google-API Key ist für die Domain nicht zulässig";
	reasons[G_GEO_TOO_MANY_QUERIES]   = "Serverfehler: Es wurden zuviele Anfragen gestellt.";
	reasons[G_GEO_SERVER_ERROR]       = "ServerFehler: Die Abfrage konnte nicht ausgeführt werden.";	
	
if (!direct){
	search = document.getElementById("search").value+", Deutschland";	
	}
else{
search = direct;
document.getElementById("search").value=direct;
}



// ====== Perform the Geocoding ====== 
var geo = new GClientGeocoder();        
var adress_new;
var adress_detail=new Array();
var message=''
geo.getLocations(search, function (result) { 


            // If that was successful
if (result.Status.code == G_GEO_SUCCESS) {
	// How many resuts were found
	if (result.Placemark.length>1){
	message = "<table><tr><td colspan=2>Resultate:</td></tr>";
	// Loop through the results, placing markers
	for (var i=0; i<result.Placemark.length; i++) {
		var p = result.Placemark[i].Point.coordinates;
		adress_new=result.Placemark[i].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;
	}
	// centre the map on the first result
	var p = result.Placemark[0].Point.coordinates;
	map.setCenter(new GLatLng(p[1],p[0]),14);
	
	standpunkt_lon=p[1];
	standpunkt_lan=p[0];
	
	var marker = new GMarker(new GLatLng(p[1],p[0]));

	map.addOverlay(marker);
}
	// ====== Decode the error status ======
else {
		var reason="Code "+result.Status.code;
		if (reasons[result.Status.code]) {
			reason = reasons[result.Status.code]
		} 
		alert(search+ '\n' + reason);
}
});
}
function setDirections(direction) {
document.getElementById("message").innerHTML="";
	man_clear=1;
	gdir.clear();
	gdir.load(direction,{ "preserveViewport": true });
	point=new GLatLng(standpunkt_lon,standpunkt_lan);
	marker= new GMarker(point);
	map.addOverlay(marker);
}
  
