﻿function Address( arrCities, arrDistricts, arrQuarters, arrStreets, arrDX, arrDY, dCenterX, dCenterY, dLwrX, dLwrY, dUprX, dUprY, dLat, dLon  )
{
	this.arrCities = (arrCities != null ? arrCities : new Array());
	this.arrDistricts = (arrDistricts != null ? arrDistricts : new Array());
	this.arrQuarters = (arrQuarters != null ? arrQuarters : new Array());
	this.arrStreets = (arrStreets != null ? arrStreets : new Array());
	this.arrDX = (arrQuarters != null ? arrDX : new Array());
	this.arrDY = (arrStreets != null ? arrDY : new Array());
	this.dCenterX = dCenterX;
	this.dCenterY = dCenterY;
	this.dLwrX    = dLwrX;
	this.dLwrY    = dLwrY;
	this.dUprX    = dUprX;
	this.dUprY    = dUprY;
	this.dLat     = dLat;
	this.dLon     = dLon;
	
	var self = this;

	this.GetFullStreet = function(iStreet)
	{
		if(self.arrDistricts[iStreet] != null && self.arrDistricts[iStreet].length > 0)
			return self.arrDistricts[iStreet] + " " + self.arrStreets[iStreet];
		return self.arrStreets[iStreet];
	}
	this.HasCoords = function()
	{
		return self.dCenterX!=0.0 && self.dCenterY!=0  && self.dCenterX > -1000000 && self.dCenterY > -1000000;
	}	
}


function AddressHandler(commandhandler)
{
	this.Srv = commandhandler;
	this.arrAddressSequence = new Array();
	this.arrAddressList = new Array();
	
	this.strDefaultCityText = "[Település]";
	this.strDefaultStreetText = "[Ker. utca házszám]";
	this.strDefaultLatText = "[Szélesség]";
	this.strDefaultLonText = "[Hosszúság]";
	
	this.strAddressMode = "Text"; // can be "Text" or "GPS"

	var self = this;	
	// Address handling;
	this.GetInputValue = function(input, defaultText, defaultValue) {	return (input==null || input.value == defaultText ? defaultValue : input.value);	}	
	
	this.GetCity = function(strAddressUI)	{
		return self.GetInputValue(GetBlock("editAddressCity"+ strAddressUI), self.strDefaultCityText, "Budapest");
	}
	this.GetStreet = function(strAddressUI)	{
		return self.GetInputValue(GetBlock("editAddressStreet" + strAddressUI), self.strDefaultStreetText, "");
	}
	this.GetLat = function(strAddressUI)	{
		return self.GetInputValue(GetBlock("editAddressLat" + strAddressUI), self.strDefaultLatText, "");
	}
	this.GetLon = function(strAddressUI)	{
		return self.GetInputValue(GetBlock("editAddressLon" + strAddressUI), self.strDefaultLonText, "");
	}

	this.IsTextAddressMode = function(strAddressUI)	{ return (strAddressMode == "Text");	}
	
	this.IsGPSAddressMode = function (strAddressUI) {	return (strAddressMode == "GPS");	}

	self.Srv.SetAddressMode = function (strMode) {	strMode == "GPS" ? strAddressMode = "GPS" : strAddressMode = "Text";	}
	
	this.GetCityListParent = function(strAddressUI)	     { return GetBlock("idAddressCity" + strAddressUI); }
	this.GetCityListObjBefore = function(strAddressUI)	 { return null; }
	this.GetStreetListParent = function(strAddressUI)	   { return GetBlock("idAddressStreet" + strAddressUI); }
	this.GetStreetListObjBefore = function(strAddressUI) { return null; }
	
	this.FillAddress = function(strAddressUI, address, handler)
	{
		var objBefore, div, divMsg, span, input;
		if(strAddressUI == null)
			strAddressUI = "";

		var div = GetBlock("idAddressCityList" + strAddressUI);
		if(div)
			div.parentNode.removeChild(div);
		var div = GetBlock("idAddressStreetList" + strAddressUI);
		if(div)
			div.parentNode.removeChild(div);
		
		if(address.arrCities.length == 1)
		{
			input = GetBlock('editAddressCity' + strAddressUI);
			input.value = address.arrCities[0];
			address.eParsed = 'c';
		}
		else
		{
			div = NewTag('div', self.GetCityListParent(strAddressUI), self.GetCityListObjBefore(strAddressUI));
			div.setAttribute('id', "idAddressCityList" + strAddressUI);
			div.className = 'addresslist';

			var SetOnClick = function(a, iCity)
			{
				a.onclick = function() { self.Srv.FindFixedCity(strAddressUI, address, iCity, handler ); return false; };
			};
			
			for(var i=0; i < address.arrCities.length; i++)
			{
				var a = NewTag('a', div);
				a.className = 'block';
				a.setAttribute('href', "javascript:void(0)");
				SetOnClick(a, i);
				NewTextTag(address.arrCities[i], a);
			}
		}
		if(address.arrCities.length == 1)
		{
			if(address.arrStreets.length == 0)
			{
				input = GetBlock('editAddressStreet' + strAddressUI);
				input.value = '';
			}
			else if(address.arrStreets.length == 1)
			{
				input = GetBlock('editAddressStreet'+ strAddressUI );
				input.value = address.GetFullStreet(0);
				address.m_eParsed = 's';
			}
			else
			{
				div = NewTag('div', self.GetStreetListParent(strAddressUI), self.GetStreetListObjBefore(strAddressUI) );
				div.setAttribute('id', "idAddressStreetList" + strAddressUI);
				div.className = 'addresslist';
				
				var SetOnClick = function(a, iStreet)
				{
					a.onclick = function() { self.Srv.FindFixedStreet(strAddressUI, address, iStreet, handler); return false; };
				};
				
				for(var i=0; i < address.arrStreets.length; i++)
				{
					var a = NewTag('a',div);
					a.className = 'block';
					a.setAttribute('href', 'javascript:void(0)');
					SetOnClick(a, i);
					NewTextTag(address.GetFullStreet(i),a);
				}
			}
		}	
	}


	
	// Address list handling;
	
	this.IsStartAddress = function(iAddressID)
	{
		if(iAddressID == self.arrAddressSequence[0])
			return true;
		return false;
	}

	this.IsStopAddress = function(iAddressID)
	{
		if(iAddressID == self.arrAddressSequence[GetArrayLength(self.arrAddressSequence)-1])
			return true;
		return false;
	}

	this.GetAddressPos = function(iAddressID)
	{
		for(var iPos=0; iPos<self.arrAddressSequence.length; iPos++)
		{
			if(self.arrAddressSequence[iPos] == iAddressID)
				return iPos;
		}
		return -1;
	}

// Commands


	self.Srv.FindAddress = function(strAddressUI, address, handler)
	{
		var eParsed = '';
		var x=0, y=0;
		if(address
			&& (address.arrCities.length > 0  && self.GetCity(strAddressUI) == address.arrCities[0])
			&& ( (address.arrStreets.length < 1 && self.GetStreet(strAddressUI) == "") 
				|| (address.arrStreets[0] == self.GetStreet(strAddressUI) )))
		{
			eParsed = address.m_eParsed;
			x = address.dCenterX;
			y = address.dCenterY;
		}
		
		if(self.IsTextAddressMode(strAddressUI))
			self.Srv.CallAddressFunction(strAddressUI, self.GetCity(strAddressUI), "", "", self.GetStreet(strAddressUI),0,0,x,y, '', handler);
		else if(self.IsGPSAddressMode(strAddressUI))
			self.Srv.CallAddressFunction(strAddressUI, "", "", "", "", self.GetLat(strAddressUI),self.GetLon(strAddressUI),0,0, '', handler);
	}

	self.Srv.FindFixedCity = function(strAddressUI, address, iCity, handler)
	{
		self.Srv.CallAddressFunction(strAddressUI, address.arrCities[iCity], "", "", self.GetStreet(strAddressUI), 0, 0, address.arrDX[iCity], address.arrDY[iCity], 'c', handler);
	}

	self.Srv.FindFixedStreet = function(strAddressUI, address, iStreet, handler)
	{
		self.Srv.CallAddressFunction(strAddressUI, address.arrCities[0], address.arrDistricts[iStreet], address.arrQuarters[iStreet], address.arrStreets[iStreet], 0, 0, 0, 0, 's', handler);
	}

	self.Srv.CallAddressFunction = function(strAddressUI, strCity, strDistrict, strQuarter, strStreet, dLat, dLon, dX, dY, eParsed, handler)
	{
		var hand = function(address) 
		{ 
			self.FillAddress(strAddressUI, address, handler); 
			if(handler)
				handler(address);
		}
		g_Srv.CallFunction('FindAddressOld', '&strCity='+ strCity + '&strDistrict=' + strDistrict + "&strQuarter=" + strQuarter + "&strStreet=" + strStreet + "&dLat="+ dLat + "&dLon=" + dLon +"&dX=" + dX + "&dY=" + dY + "&eParsed=" + eParsed, 0, hand);
	}

	self.Srv.ShowAddress = function(strAddressUI, address, bZoom)
	{
		var iImageID = 0;
		var strMarkerClass;
		
		if(!isNaN(strAddressUI))
		{		
			if(self.IsStartAddress(strAddressUI))
				strMarkerClass = "start";
			else if(self.IsStopAddress(strAddressUI))
				strMarkerClass = "stop";
			else
				strMarkerClass = "address";
		}
		else
			strMarkerClass = strAddressUI

		SetMarker("Pin" /*+ iAddressID*/, address.dCenterX, address.dCenterY, "Pin"/*strMarkerClass*/);

		var strLabel = address.arrCities[0];
		if(address.arrStreets.length > 0)
			strLabel += " " + address.GetFullStreet(0);
		if(bZoom)
			g_Srv.ZoomMapRect(iImageID, address.dCenterX, address.dCenterY, address.dLwrX, address.dLwrY, address.dUprX, address.dUprY, "", 1, null);
	}
}

