// JavaScript Document

function DosiMap()
{
	var m_BetrNr = null; 
	var m_Name = null;
	var m_DosiMapID = null;
	var m_Adress = "";
	var m_TeilBetriebNr = null;
	var Polys = new Array();
	var SelPolys = new Array();
	var DigitPoly = null;
	var NewPolyNr = -1;
	var MaxDrawPolys = 100;
	var BetriebHa = 0.0;
	var maLaIn = -6666;
	var miLaIn = 6666;
	var maLnIn = -6666;
	var miLnIn = 6666;
	var NeueDaten = null;
	
	this.Init = function(GlobalDosi)
	{
		//Auslesen der Global Variablen
		if(GlobalDosi != null)
		{
			m_BetrNr = Global.BetriebNr;
			m_TeilBetriebNr = Global.TeilBetriebNr;
			m_Name = Global.MapName;
			m_DosiMapID = Global.DosiMapID;
			m_Adress = Global.Adresse;
			BetriebHa = Global.BetriebHa;
			maLaIn = Global.Nmax;
			miLaIn = Global.Nmin;
			maLnIn = Global.Emax;
			miLnIn = Global.Emin;
			for(var i in Global.Flaechen)
			{
				Polys.push(new DosiPoly(i, Global.Flaechen[i].Wert, null, null));
				for(var j in Global.Flaechen[i].Punkte)
				{
					Polys[Polys.length-1].AddPoint(Global.Flaechen[i].Punkte[j].N, Global.Flaechen[i].Punkte[j].E);
				}
				Polys[Polys.length-1].SetArea(Global.Flaechen[i].Ha);
			}
		}
	}
	
	//haengt neues Polygon an und startet listener fuer Digitalisieren
	this.DigiNewPoly = function(ds)
	{
		this.ClearHandles();
		
		Dosi = parseInt(ds);
		Polys.push(new DosiPoly(NewPolyNr, Dosi, null, null));
		Polys[Polys.length-1].InitPoly();
		NewPolyNr--;
		DigitPoly = Polys[Polys.length-1];
		//Listener starten
		this.DigitHandles();
	}
	//neuen Punkt an DigiPoly anhaengen
	this.DigiNewPoint = function(latlng)
	{
		DigitPoly.DigitPoint(latlng);
	}
	//letzten Digitalisierten Punkt loeschen
	this.DeletePoint = function()
	{
		DigitPoly.DeletePoint();
	}
	
	//Aenderungen an php schicken
	this.CheckModified = function()
	{
		if(anfrage != null)
		{
			var found = false;
			//NeueDaten = '{"DosiMapID":'+m_DosiMapID+', "MapName":"'+m_Name+'", "BetriebNr":'+m_BetrNr+', "Flaechen":{';
			NeueDaten = '{"DosiMapID":'+m_DosiMapID+', "BetriebNr":'+m_BetrNr+', "TeilBetriebNr":'+m_TeilBetriebNr+', "Flaechen":{';
			var j=0;
			for(var i=0; i<Polys.length; i++)
			{
				if(Polys[i].IsModified())
				{
					if(j>0) {
						NeueDaten += ',';
					}
					
					var NeueFlaeche = Polys[i].GetDataArray();
					NeueDaten += NeueFlaeche ;
					Polys[i].SetModified(false);
					found = true;
					j++;
				}
			}
			NeueDaten += '}}';
			if(found && (anfrage != null))
			{
				var url = "../sk/dosimap_speichern.php";
				anfrage.open("POST", url, true);
				anfrage.onreadystatechange = this.antwortPHP;
				anfrage.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				anfrage.send("NeueDaten=" + NeueDaten);
			}
		}
		return true;
	}
	//CheckArray: wenn Polygon geaendert wurde werden neue Daten in Array geschrieben
	this.CheckArray = function()
	{
		for(var i=0; i<Polys.length; i++)
		{
			Polys[i].CheckArray();
		}
	}
	//Alle ausgewaehlten loeschen
	this.DelSelected = function()
	{
		for(var i=0; i<SelPolys.length; i++)
		{
			SelPolys[i].DeleteAllPoints();
			SelPolys[i].disableEditing();
		}
		//Polygone werden ohne Punkte an php geschickt ->Polygone werden in der Datenbank geloescht
		this.CheckArray();
		while(SelPolys.length != 0)
		{
			SelPolys.pop();
		}
	}
	//Auswahl bei allen aufheben
	this.UnselectALL = function()
	{
		for(var i=0; i<SelPolys.length; i++)
		{
			SelPolys[i].disableEditing();
		}
		while(SelPolys.length != 0)
		{
			SelPolys.pop();
		}
	}
	//Polygon mit Index i aus den selektierten loeschen
	this.UnSelIdx = function(i)
	{
		Idx = parseInt(i);
		if(Idx < SelPolys.length)
		{
			for(var i=Idx; i<SelPolys.length-1; i++)
			{
				SelPolys[i] = SelPolys[i+1];
			}
			SelPolys.pop();
		}
	}
	//Polygone loeschen
	this.DelPolyIndex = function(i)
	{
		Idx = parseInt(i);
		if(Idx < Polys.length)
		{
			for(var i=Idx; i<Polys.length-1; i++)
			{
				Polys[i] = Polys[i+1];
			}
			Polys.pop();
		}
	}
	//Dosierwert der ausgewaehlte aendern
	this.ChangeDosiSel = function(ds)
	{
		Dosi = parseInt(ds);
		for(var i=0; i<SelPolys.length; i++)
		{
			SelPolys[i].ChangeDosi(Dosi);
		}
	}
	//Anzahl der Ausgewaehlten
	this.getSelectedCount = function()
	{
		return SelPolys.length;
	}
	this.getPolyCount = function()
	{
		return Polys.length;
	}
	//Text Neu schreiben
	this.NewText = function()
	{
		this.RemoveText();
		this.WriteText();
	}
	//Dosierwerte auf Karte schreiben
	this.WriteText = function()
	{
		var TextCanvEle = document.getElementById("Text_canvas");
		var MapBounds = g_map.getBounds();
		var SWBounds = MapBounds.getSouthWest();
		var NEBounds = MapBounds.getNorthEast();
		var SchwerPunkt = null;
		for(var i=0; i<Polys.length; i++)
		{
			//Schreibe den Dosierwert an die Position des Schwerpunktes.
			SchwerPunkt = Polys[i].GetSchwerP();
			if(SchwerPunkt != null && (SchwerPunkt.lat() > SWBounds.lat() && SchwerPunkt.lng() > SWBounds.lng() && SchwerPunkt.lat() < NEBounds.lat() && SchwerPunkt.lng() < NEBounds.lng()))
			{
				//latlng Koordinaten in Dom Koordinaten umrechnen.
				var Punkt = g_map.fromLatLngToContainerPixel(SchwerPunkt);
				var Koords = Punkt.toString().split(", ");
				if(Koords.length == 2)
				{
					var strX = Koords[0].split("(");
					var strY = Koords[1].split(")");
					if(strX.length == 2 && strY.length == 2)
					{
						if(anfrage != null)
						{
							var X = parseInt(strX[1]) + 165;
							var Y = parseInt(strY[0]) + 122;
						}
						else
						{
							var X = parseInt(strX[1]) + 165;
							var Y = parseInt(strY[0]) + 100;
						}
				
						var DivEle = document.createElement("div");
						DivEle.style.position = 'absolute';
						DivEle.style.left = X+'px';
						DivEle.style.top = Y+'px';
						//var color = getColorValue(parseInt(DosiVal[i]));
						//DivEle.style.color = color;
						DivEle.style.color = "#DDFF33";
						var Area = Polys[i].GetAreaWrite();
						Area = Math.round(Area*10.0)/10.0;
						var TextEle = document.createTextNode(Polys[i].GetDosi()+" %");
						var UmEL = document.createElement("br");
						var TextHa = document.createTextNode(Area+ " ha");
					
						DivEle.appendChild(TextEle);
						if(Area > 0)
						{
							DivEle.appendChild(UmEL);
							DivEle.appendChild(TextHa);
						}
						TextCanvEle.appendChild(DivEle);
					}
				}
			}
		}
	}
	//Dosierwerte von Karte loeschen
	this.RemoveText = function()
	{
		var TextCanvEle = document.getElementById("Text_canvas");
		while(TextCanvEle.firstChild)
		{
			TextCanvEle.removeChild(TextCanvEle.lastChild);
		}
	}
	
	this.TotalDosiArea = function()
	{
		var TotArea = 0.0;
		for(var i=0; i<Polys.length; i++)
		{
			TotArea += Polys[i].GetArea();
		}
		return TotArea;
	}
	
	this.GetEinSpar = function(CostHa)
	{
		var EinSpar = 0.0;
		for(var i=0; i<Polys.length; i++)
		{
			EinSpar+=((Polys[i].GetArea())*((Polys[i].GetDosi()/100.0)-1.0)*CostHa);
		}
		return EinSpar;
	}
	this.Zoom = function()
	{
		if(SelPolys.length > 0)
		{
			this.ZoomtoSel();
		}
		else
		{
			this.ZoomtoAll();
		}
	}
	//Auf die Selektierten Zoomen
	this.ZoomtoSel = function()
	{
		var maxLat = -6666;
		var minLat = 6666;
		var maxLng = -6666;
		var minLng = 6666;
		var Lat = 0.0;
		var Lng = 0.0;
		for(var i=0; i<SelPolys.length; i++)
		{
			for(var j=0; j<SelPolys[i].GetPointCount(); j++)
			{
				Lat = SelPolys[i].GetPointLat(j);
				Lng = SelPolys[i].GetPointLng(j);
				if(Lat > maxLat)
					maxLat = Lat;
				if(Lat < minLat)
					minLat = Lat;
				if(Lng > maxLng)
					maxLng = Lng;
				if(Lng < minLng)
					minLng = Lng;
			}
		}
		return this.Zoom2Boundaries(maxLat, minLat, maxLng, minLng);
	}
	this.ZoomtoAll = function()
	{
		var maxLat = -6666;
		var minLat = 6666;
		var maxLng = -6666;
		var minLng = 6666;
		var Lat = 0.0;
		var Lng = 0.0;
		for(var i=0; i<Polys.length; i++)
		{
			for(var j=0; j<Polys[i].GetPointCount(); j++)
			{
				Lat = Polys[i].GetPointLat(j);
				Lng = Polys[i].GetPointLng(j);
				if(Lat > maxLat)
					maxLat = Lat;
				if(Lat < minLat)
					minLat = Lat;
				if(Lng > maxLng)
					maxLng = Lng;
				if(Lng < minLng)
					minLng = Lng;
			}
		}
		return this.Zoom2Boundaries(maxLat, minLat, maxLng, minLng);
	}
	//Zoom zu den Koordinaten die von php uebergeben wurden
	this.Zoom2Init = function()
	{
		//alert(maLaIn+", "+miLaIn+", "+maLnIn+", "+miLnIn);
		return this.Zoom2Boundaries(maLaIn, miLaIn, maLnIn, miLnIn);
	}
	this.Zoom2Boundaries = function(maLa, miLa, maLn, miLn)
	{
		maxLat = parseFloat(maLa);
		minLat = parseFloat(miLa);
		maxLng = parseFloat(maLn);
		minLng = parseFloat(miLn);
		if((maxLat > 90.0 || maxLat < -90.0 )|| (minLat > 90.0 || minLat < -90.0) || (minLng > 180.0 || minLng < -180.0) || (maxLng > 180.0 || maxLng < -180.0))
		{
			return false;
		}
		else
		{
			bZoomB = true;
			//Neuen Zoom Punkt ausrechnen.
			var meanLat = minLat + ((maxLat - minLat)/2.0);
			var meanLng = minLng + ((maxLng - minLng)*0.5);
			var ZoomPoint = new GLatLng(meanLat, meanLng, false);
			//Bounds fuer Zoomlevel
			var NE = new GLatLng(maxLat, maxLng, false);
			var SW = new GLatLng(minLat, minLng, false);
			var ZoomBound = new GLatLngBounds(SW, NE);
			//Zoomen und bewegen
			var ZoomStufe = g_map.getBoundsZoomLevel(ZoomBound);
			if(ZoomStufe > 17)
			{
				ZoomStufe = 17;
			}
			g_map.setZoom(ZoomStufe);
			g_map.panTo(ZoomPoint);
		}
		return true;
	}
	//Zur uebergebenen Adresse zoomen
	this.Zoom2Adress = function()
	{
		if(m_Adress != "" && m_Adress != null)
		{
			GetLatlngfromAdress(m_Adress);
		}
	}
	//Checked welche Polygone auf der Karte liegen
	this.IsOnMap = function()
	{
		var MapBounds = g_map.getBounds();
		var SWBounds = MapBounds.getSouthWest();
		var NEBounds = MapBounds.getNorthEast();
		var PolyOnMap = new Array();
		for(var i=0; i<Polys.length; i++)
		{
			if(Polys[i].IsOnMap(NEBounds.lat(), SWBounds.lat(), NEBounds.lng(), SWBounds.lng()))
			{
				PolyOnMap.push(Polys[i]);
			}
		}
		if(PolyOnMap.length < MaxDrawPolys)
		{
			for(var i=0; i<PolyOnMap.length; i++)
			{
				PolyOnMap[i].Array2GPoly();
			}
		}
		else
		{
			for(var i=0; i<PolyOnMap.length; i++)
			{
				PolyOnMap[i].SetPolyNull();
			}
		}
	}
	this.DeleteLast = function()
	{
		Polys[Polys.length-1].DeleteAllPoints();
		this.CheckArray();
		Polys.pop();
	}
	this.CheckLast = function()
	{
		if(Polys[Polys.length-1].GetVertexCount() < 4)
		{
			this.DeleteLast();
		}
	}
	this.GetBetriebHa = function()
	{
		return BetriebHa;
	}
	this.antwortPHP = function()
	{
		if (anfrage.readyState == 4)
		{
    		if (anfrage.status == 200) 
			{
		      var antwort = anfrage.responseText;
			  var AntArray = antwort.split(";");
			  if(AntArray.length == 0)
			  {
				  return;
			  }
			  else if(AntArray[0] == "demo")
			  {
				  if(AntArray.length > 1)
				  {
					  alert(AntArray[1]);
				  }
				  return;
			  }
			  else if(AntArray[0] == "false")
			  {
				  if(AntArray.length > 1)
				  {
					  alert(AntArray[1]);
				  }
				  return;
			  }
			  else
			  {
				  for(var i=0; i<AntArray.length; i++)
				  {
					  var FlNr = AntArray[i].split(",");
					  if(FlNr.length == 2)
					  {
						  if(FlNr[0] == "DosiMapID")
						  {
							  m_DosiMapID = parseInt(FlNr[1]);
						  }
						  else if(parseInt(FlNr[0]) < 0)
						  {
							  for(var i=0; i<Polys.length; i++)
							  {
								  if(Polys[i].GetNr() == FlNr[0])
								  {
									  Polys[i].SetNr(FlNr[1]);
									  i = Polys.length;
								  }
							  }
						  }
					  }
				  }
			  }
			}
		}
	}
	//*****************************************************************
	//funktionen und Variablen fuer Listener
	//Punkt auf Karte zeichnen
	var h_digiPoint = null;
	//Punkt von Karte entfernen
	var h_delPoint = null;
	//Polygon auswaehlen
	var h_SelPoly = null;
	//Auswahl aufheben
	var h_DeSelPoly = null;
	//Punkt auf anderen Polygonen zeichnen
	var h_digiPoint_poly = new Array();
	//Punkt von anderen Polygonen entfernen
	var h_delPoint_poly = new Array();
	
	//Listener zum digitalisieren hinzufuegen
	this.DigitHandles = function()
	{
		h_digiPoint = GEvent.addListener(g_map,"click", function(overlay,latlng)
		{
			DigitPoly.DigitPoint(latlng);
		});
		h_delPoint = GEvent.addListener(g_map,"singlerightclick", function()
		{
			DigitPoly.DeletePoint();
		});
		//Digitalisieren muss auch auf dem Overlay Polygon funktionieren.
		//Daher wird auch fuer Polygon das entsprechende Ereignis definiert.
		for(var i=0; i<Polys.length; i++)
		{
			if(Polys[i].GetPolygon() != null)
			{
				h_digiPoint_poly.push(GEvent.addListener(Polys[i].GetPolygon() ,"click", function(latlng)
				{
					DigitPoly.DigitPoint(latlng);
				}));
				h_delPoint_poly.push(GEvent.addListener(Polys[i].GetPolygon() ,"singlerightclick", function()
				{ 
					DigitPoly.DeletePoint();
				}));
			}
		}
	}
	
	this.StartSelection = function()
	{
		this.ClearHandles();
		h_SelPoly = GEvent.addListener(g_map,"click", function(overlay,latlng)
		{
			if(overlay != null)
			{
				for(var i=0; i<Polys.length; i++)
				{
					if(overlay == Polys[i].GetPolygon())
					{
						if(!Polys[i].GetEnableEdit())
						{
							Polys[i].enableEditing();
							SelPolys.push(Polys[i]);
						}
						i = Polys.length;
					}
				}
			}
		});
		h_DeSelPoly = GEvent.addListener(g_map,"singlerightclick", function(point, src, overlay)
		{
			if(overlay != g_map && overlay != null)
			{
				for(var i=0; i<SelPolys.length; i++)
				{
					if(overlay == SelPolys[i].GetPolygon())
					{
						SelPolys[i].disableEditing();
						UnSelIdx(i);
					}
				}
			}
		});
	}
	
	this.ClearHandles = function()
	{
		if(h_digiPoint != null)
		{
			GEvent.removeListener(h_digiPoint);
			h_digiPoint = null;
		}
		if(h_delPoint)
		{
			GEvent.removeListener(h_delPoint);
			h_delPoint = null;
		}
		while(h_digiPoint_poly.length != 0)
		{
			GEvent.removeListener(h_digiPoint_poly[h_digiPoint_poly.length-1]);
			h_digiPoint_poly.pop();
		}
		while(h_delPoint_poly.length != 0)
		{
			GEvent.removeListener(h_delPoint_poly[h_delPoint_poly.length-1]);
			h_delPoint_poly.pop();
		}
		if(h_SelPoly)
		{
			GEvent.removeListener(h_SelPoly);
			h_SelPoly = null;
		}
		if(h_DeSelPoly)
		{
			GEvent.removeListener(h_DeSelPoly);
			h_DeSelPoly = null;
		}
		this.CheckArray();
		this.UnselectALL();
		//Alle Deselekten, Text Neu schreiben, Check modified
	}
}

function UnSelIdx(j)
{
	g_DoMa.UnSelIdx(j);
}
