﻿/// public:

/// private:
/// A CAddressSearch osztaly allapotmentesere valo segedosztaly
function CAddressSearchUserState(strInputText, arrAddressList)
{
	this.strInputText = strInputText;
	this.arrAddressList = arrAddressList;
}
///protected:
// Egy input mezohoz rendelheto cimkereso objektum.
// Terkepi muveletet nem vegez.
// Parameterben a CTopoliszMap osztaly egy peldanyat varja
function CAddressSearch()
{
	// Keressen-e focus vesztesre
	this.bAutoSearch = true;
	// Eltuntesse-e a talalati listat focus vesztesre
	this.bAutoHideResultList = false;

	this.bOKPressed = false;
	// Keresosztring
	this.strInputText = "";
	// CAddress lista, Talalt cim: a 0. elem
	this.arrAddressList = new Array();
	// Aktiv talalat sorszama, enterre ha lista van akkor ez lesz az uj elem;
	this.iActive = 0;
	// Default szoveg
	this.strDefaultText = "";
	// Lista div eltolasa az input mezohoz kepest
	this.iListOffsetX = 5;
	this.iListOffsetY = 20;

	//Csak akkor fut meg a filladdress, ha ez ugyanaz mint az eredmeny
	this.iCommandID = -1;
	this.input = null;
	this.divResult = null;

	// public:
	// OK gombra, vagy enterre hivodik meg
	this.OnOKPressed = function()
	{
	}

	// protected:
	// Egyertelmu cimtalalat eseten hivodik meg
	this.OnAddressFound = function(address) 
	{
	}

	// private:
	var me = this;

	// protected:
	// Cim megadasa, CSimpleAddress-t var
	this.SetAddress = function(pAddress)
	{
		me.arrAddressList = new Array();
		me.strInputText = "";
		me.iActive = -1;
		if(pAddress != null)
		{
			me.strInputText = pAddress.strAddress;
			if(pAddress.dX > 0 && pAddress.dY > 0)
				me.arrAddressList[0] = pAddress;
		}
		if(me.input)
			me.Show();
		if(me.OnAddressFound)
		{
			try {
				me.OnAddressFound(pAddress);
			}
			catch(exp) {
				if(me.OnError) {
					me.OnError(exp, 'AddressSearch.OnAddressFound');
				}
			}
		}
		if(me.bOKPressed)
			me.Go();
	}

	// protected:
	// Visszaadja az egyertelmu cimtalalatot
	this.GetAddress = function()
	{
		if(me.arrAddressList.length == 1)
			return me.arrAddressList[0];
		return null;
	}
	
	// protected:
	// Letezik e cim, vagy cimlista a keresoben
	this.HasAddress = function()
	{
	    if (me.arrAddressList == null)
	        return false;
		return me.arrAddressList.length > 0;
	}

	// protected:
	// Van-e egyertelmu cimtalalat
	this.IsUnique = function()
	{
		return me.arrAddressList.length == 1;
	}

	// protected:
	// Van-e tobbelemu cimlista
	this.HasList = function()
	{
		return me.arrAddressList.length > 1;
	}

	//protected:
	// Input mezo beallitasa
	this.SetInput = function(input)
	{
		me.input = input;
		if(me.input)
		{
			me.input.onfocus = me.OnFocus;
			me.input.onblur = me.OnBlur;
			me.input.onchange = me.OnChange;
			me.input.onkeyup = me.OnKeyPress;
			me.input.onbeforedeactivate = me.OnBeforeDeactivate;
		}
	}

	// protected:
	// Hozzarendelt input mezo lekerdezese
	this.GetInput = function()
	{
		return me.input;
	}

	// protected:
	// Allapotmentes (input box szovege, cimlista)
	this.GetUserState = function()
	{
		return new CAddressSearchUserState(me.strInputText, me.arrAddressList);
	}

	// protected:
	// Allapot betoltes a GetUserState altal visszaadott objektummal
	this.SetUserState = function(state)
	{
		me.strInputText = state.strInputText;
		me.SetInputValue(me.strInputText);
		me.arrAddressList = state.arrAddressList;
	}

	// protected:
	// Fokuszvesztesre kezdjen-e el cimet keresni
	this.IsAutoSearch = function() 
	{
		return me.bAutoSearch;
	}
	
	// protected:
	this.SetAutoSearch = function(bValue)
	{
		me.bAutoSearch = bValue;
	}

	// protected:
	// ures input box szovegenek beallitasa
	this.SetDefaultText = function(strDefaultText)
	{
		var strInputValue = me.GetInputValue(); // Valtozik az alapszoveg, ezert az ures mezot ujra be kell allitani
		me.strDefaultText = strDefaultText;
		me.SetInputValue(strInputValue);
	}

	// protected:
	// ures input box szovegenek lekerdezese
	this.GetDefaultText = function()
	{
		return me.strDefaultText;
	}

	// private:
	this.SetListOffset = function(iListOffsetX, iListOffsetY)
	{
		me.iListOffsetX = iListOffsetX;
		me.iListOffsetY = iListOffsetY;
	}
	// private:
	this.GetListOffsetX = function() 
	{
		return me.iListOffsetX;
	}
	// private:
	this.GetListOffsetY = function()
	{
		return me.iListOffsetY;
	}
	
	//private:
	this.SetInputValue = function(strInputValue)
	{
		if(me.input)
		{
			if(strInputValue != "")
				me.input.value = strInputValue;
			else
				me.input.value = me.strDefaultText;
		}
		else
		{
			me.strInputText = strInputValue;
		}
	}
	// private:
	this.GetInputValue = function()
	{
		if(me.input)
		{
			if(me.input.value != me.strDefaultText)
				return me.input.value;
			else
				return "";
		}
		else
			return me.strInputText;
	}

	// private:
	this.OnFocus = function(pEvent)
	{
		if(me.input.value == me.strDefaultText)
			me.input.value = "";
		if(me.HasList())
		{
			me.SetActive(-1);
			if(me.bAutoHideResultList)
			{
				if(me.divResult && me.divResult.parentNode)
				{
					me.divResult.style.display = "";
				}
			}
		}
		else
			me.input.select();
	}
	
	// private:
	this.OnBlur = function(pEvent)
	{
		if(me.input.value == "")
			me.input.value = me.strDefaultText;
		if(me.HasList())
		{
			if(me.bAutoHideResultList)
			{
				if(me.divResult && me.divResult.parentNode)
				{
					var func = function() { 
						if(me.divResult)
							me.divResult.style.display = "none"; 
					}
					window.setTimeout(func, 500);
				}
			}
		}
		if(me.bAutoSearch)
		{
			if(!me.bOKPressed)
				me.FindAddress();
		}
	}

	// private:
	// Az IE olyan kedves, hogy elviszi a focus-t egy uj HTML elem generalasakor, 
	// hat most majd nem hagyjuk neki
	this.OnBeforeDeactivate = function(pEvent)
	{
		var divTo = GetEventRelatedElement(pEvent);
		if(divTo && divTo.nodeName.toLowerCase() == "body")
		{
			return false;
		}
		return true;
	}

	// private:
	this.OnChange = function(pEvent)
	{
		if(me.arrAddressList != null && me.GetInputValue() != me.strInputText)
		{
			me.arrAddressList = new Array();
		}
	}

	// private:
	this.OnKeyPress = function(pEvent)
	{
		if (me.input.value == me.strDefaultText)
			me.input.value = "";
	
		if(pEvent == null)
			pEvent = window.event;
		if(pEvent.keyCode==13)
		{
			if(me.iActive >= 0 && me.iActive < me.arrAddressList)
			{
				me.SetAddress(me.arrAddressList[me.iActive]);
			}
			else if(true)
			{
				me.bOKPressed = true;
				//Dump("FindAddressFromKey " + me.input.value);
				me.FindAddress();
			}
		}
		// felnyil
		if(pEvent.keyCode== 38)
		{
			if(me.iActive > 0)
				me.SetActive(me.iActive-1);
			else
				me.SetActive(me.arrAddressList.length-1);
			return;
		}
		//lenyil
		if(pEvent.keyCode == 40)
		{
			if(me.iActive < me.arrAddressList.length-1)
				me.SetActive(me.iActive+1);
			else
				me.SetActive(0);
			return;
		}
		me.SetActive(-1);
		
		if(pEvent.keyCode==27) // escape
		{
			me.SetAddress(null);
			me.input.value = "";			
		}
	}

	// private:
	this.SetOnClick = function(a, address, iAddress)
	{
		a.onclick = function()
		{
			$("idAddressCity").style.display = "none";
			me.SetAddress(address); 
		}
		a.onmouseover = function()
		{
			me.SetActive(iAddress);
		}
		a.onkeyup = me.OnKeyPress;
	}

	// protected:
	// Kitolti az input mezot
	this.Show = function()
	{
		me.ClearResultDiv();
		me.SetInputValue(me.strInputText);
		
		if(me.arrAddressList.length>1)
		{
			$("idAddressCity").style.display = "";
			me.divResult = new Element("div");
			me.divResult.style.textAlign = "left";
			$("idAddressCity").insert(me.divResult);

			var iLength = me.arrAddressList.length;
			var a;
			var i;
			var span;
			var div;
			for(i=0; i<iLength; i++)
			{
				a = new Element('a');
				me.divResult.insert(a);
				a.setAttribute('href', 'javascript:void(0)');
				if(i == me.iActive)
					a.className = "whiteActive";
				else
					a.className = "white";
				a.style.zIndex = "5";
				var pAddress = me.arrAddressList[i];
				me.SetOnClick(a, me.arrAddressList[i], i);

				a.update(me.arrAddressList[i].strAddress);
				//me.divResult.insert(new Element("br"));
				
				div = new Element('div')
				me.divResult.insert(div);
				div.style.color = "#777777";
				div.style.fontStyle = "italic";
				div.style.paddingLeft = "20px";
				if (me.arrAddressList[i].strRegion != "") {
					div.update(me.arrAddressList[i].strRegion);
				}
				else {
					div.update(me.arrAddressList[i].strSettlement);
				}
				me.divResult.insert(new Element("br"));
			}
		}
	}

	// private:
	this.SetActive = function (iActive)
	{
		me.iActive = iActive;
		if(me.divResult)
		{
			var aList = me.divResult.getElementsByTagName("a");
			for(var i=0; i<aList.length; i++)
			{
				if(i == iActive)
					aList[i].className = "whiteActive";
				else
					aList[i].className = "white";
			}
		}
	}

	// private:
	this.ClearResultDiv = function()
	{
		if(me.divResult)
		{
			if(me.divResult.parentNode)
				me.divResult.parentNode.removeChild(me.divResult);
			delete me.divResult;
			me.divResult = null;
		}
	}

	// private:
	this.FillAddress = function(addresslist, pDummy, iCommandID)
	{
		if(iCommandID != me.iCommandID)
		{
			return;
		}

		$("idAddressCity").style.display = "none";
		if ($("idAddressCity")) {
			while ($("idAddressCity").hasChildNodes()) {
				$("idAddressCity").removeChild($("idAddressCity").firstChild);
			}
		}
		me.arrAddressList = addresslist.compact();
		if(me.arrAddressList == null || me.arrAddressList.length < 1)
		{
			var errdiv = new Element("div");
			$("idAddressCity").insert(errdiv);
			errdiv.id = "idErrorDiv";
			errdiv.className = "error";
			errdiv.innerHTML = g_Babel.GetWord("addressnotfound");
			me.strInputText = "";
			$("idAddressCity").style.display = "";
		}
		else if(me.arrAddressList.length==1)
		{
			me.strInputText = me.arrAddressList[0].strAddress;
			if(me.OnAddressFound)
			{
				try {
					me.OnAddressFound(me.arrAddressList[0]);
				}
				catch(exp) {
					if(me.OnError) {
						me.OnError(exp, 'CAddressSearch.OnAddressFound');
					}
				}
			}
		}

		me.Show();
		if(me.bOKPressed)
			me.Go();
	}

	// private:
	this.FindAddress = function()
	{
		if(me.GetInputValue() != me.strInputText)
		{
			me.arrAddressList = new Array();
		}
		if(me.arrAddressList.length<1)
		{
			me.strInputText = me.GetInputValue();
			if(me.strInputText != null && me.strInputText.length > 0)
				me.iCommandID = g_Srv.CallFunction("FindAddress", "strAddress="+me.strInputText, 0, me.FillAddress );
			else
			{
				if(me.bOKPressed)
					me.Go();
			}
		}
		else if(me.arrAddressList.length==1)
		{
			if(me.bOKPressed)
				me.Go();
		}
	}

	// private:
	this.Warning = function(strMessage)
	{
		//alert(strMessage);
	}
	
	// protected:
	// Elinditja a cimkeresest
	this.Go = function()
	{
		me.bOKPressed = true;
		if(!me.HasAddress())
		{
			if(me.input && me.GetInputValue() == "")
			{
//				me.Warning("Toltse ki a cimet!");
				me.bOKPressed = false;
				if(me.OnOK)
				{
					try {					
						me.OnOK();
					}
					catch(exp) {
						if(me.OnError) {
							me.OnError(exp, 'AddressSearch.OnOK');
						}
					}
				}
			}
			else
			{
				me.FindAddress();
			}
		}
		else if(!me.IsUnique())
		{
//			me.Warning("Kerem valasszon!");
			me.input.focus();
		}
		else 
		{
			me.bOKPressed = false;
			if(me.OnOK)
			{
				try {
				me.OnOK();
		}
				catch(exp) {
					if(me.OnError) {
						me.OnError(exp, 'CAddressSearch.OnOK');
					}
				}
			}
		}
	}
	
	this.OnError = function(exp, where) {
		exp;
		where;
	}

}
