﻿/// protected:
///
/// Kozlekedesi modul
///

function CUtvonaltervRouteSearch (div, pTopoliszMap)
{
	// Teljes div, amiben lehet garazdalkodni
	this.divMain = div;
	this.divAlert = null;

	this.bNeedRouteSearch = false;

	// csak a cimlistat tartalmazza
	this.divAddressList = null;

	// uj erintve cim gomb divje
	this.spanAddThroughAddress = null;

	this.pTopoliszMap = pTopoliszMap;
	this.pTopoliszMap.pRouteSearch = this;
//	this.pTopoliszMap.pTextResult = this;

	//Útvonallistát megjelenítő osztály
	this.pResultHandler = null;

	// Cimlista: CAddressBlock-ok vannak benne
	this.arrAddressBlocks = new Array();

	// Kozlekedesi paramaterek:
	this.strTrafficType = ((g_InitSettings.bShowTrafficChoice && (getCookie('TrafficType') != null)) ? getCookie('TrafficType') : "car");

	this.txtBtnCar = null;
	this.txtBtnTaxi = null;
	this.txtBtnBkv = null;
	this.txtBtnBicycle = null;
	this.txtBtnFoot = null;

	this.strTrafficTime = "";
	this.timectrl = new TimeControl();
	this.iCarOptim = getIntCookie('CarOptim', 0);
	this.bUseTolledRoute = getBoolCookie('PayCheck', true);
	this.bUseFerry = getBoolCookie('FerryCheck', false);
	this.bUseDirtyRoad = getBoolCookie('DirtyCheck', true);
	this.dConsumption = parseFloat(getCookie('Consumption'));
	this.dFuelPrice = parseFloat(getCookie('FuelPrice'));
	// Taxis beállítások
	this.dTaxiFeeBasic = getFloatCookie('TaxiFeeBasic', 300);
	this.dTaxiFeeKm = getFloatCookie('TaxiFeeKm', 240);
	// Bkvs beállítások
	this.iBkvOptim = 0;
	this.bUsePTLocal = getBoolCookie('UsePTLocal', true);
	this.bUsePTTrain = getBoolCookie('UsePTTrain', true);

	this.strGetOnType = ((g_InitSettings.iMultiModalVersion == 1) ? getStringCookie('GetOnType', "pedestrian") : ((g_InitSettings.iMultiModalVersion == 2)? "pedestrian":"" ) );

	this.pDragAndDrop = new CDragAndDrop ();
	this.divRegistered = null;

	this.pRouteParams = new CUtvonaltervRouteParams(this);
	this.pLanguageSupporter = new LanguageSupporter ();

	this.MAXADDRESSBLOCKS = 12; // Max hany cimet engedunk meg egyszerre
	this.bSaveAddresses = false;
	
	this.divTimeCtrl = null;
	var me = this;

	// events
	this.OnShow = null;
	
	
	// private:
	this.Init = function()
	{
		me.AddThroughAddress();
		me.AddThroughAddress();
		me.arrAddressBlocks[0].LoadAddress();
		if(g_bAdmin)
		{
			var iLength = parseInt(getCookie('iAddressCount'));
			for(var i=2;i<iLength;i++)
			{
				me.AddThroughAddress();
			}
			for(var i=1;i<iLength;i++)
			{
				me.arrAddressBlocks[i].LoadAddress();
			}
			if(g_bAdmin && getCookie('TrafficTime') != null)
			{
				me.SetTrafficTime(getCookie('TrafficTime'));
				me.timectrl.SetTime(new Date(Date.parse(me.strTrafficTime)));
				if(me.strTrafficType != "")
					me.timectrl.bHasTime = true;
			}
		}
		me.bSaveAddresses = true;
	}

	/// protected:
	/// Visszaadja, hogy melyik div-ben jelenik meg
	this.GetDiv = function()
	{
		return me.divMain;
	}

	/// protected:
	/// A CTopoliszMap osztaly egy peldanya, ez fogja megjeleniteni az utvonalat a terkepen
	this.SetMap = function(pTopoliszMap)
	{
		me.pTopoliszMap = pTopoliszMap;
		me.pTopoliszMap.pRouteSearch = me;
		me.pTopoliszMap.pTextResult = me;
	}
	
	/// protected:
	/// Itinermegjelenito hozzakapcsolasa
	this.SetResultHandler = function(resultHandler)
	{
		me.pResultHandler = resultHandler;
		resultHandler.pRouteSearch = me;
	}

	/// private:
	/// Adott sorszamu cimhez tartozo divet adja vissza
	this.GetAddressDiv = function(iAddress)
	{
		var divAddress = null;
		var div = me.divAddressList.firstChild;
		var i=-1;
		for(div = me.divAddressList.firstChild; div != null; div = div.nextSibling)
		{
			if(div.className = "TextResultDragAddress")
			{
				i++;
				if(i >= iAddress)
				{
					divAddress = div;
					break;
				}
			}
		}
		return divAddress;
	}

	/// private:
	/// Modvalaszto gombok megjelenitese
	this.GetTabImageUrl = function(strBabelID, strPostfix)
	{
		var strUrl = "./design/" + g_Babel.GetWord(strBabelID);
		if(strPostfix != null && strPostfix.length > 0)
		{
			var iPos = strUrl.lastIndexOf(".");
			strUrl.substr(0, iPos)
			if(iPos >= 0)
				strUrl = strUrl.substr(0, iPos) + "_"+ strPostfix + strUrl.substr(iPos);
		}
		return strUrl;
	}
	
	
	this.ShowTrafficButtons = function()
	{
		NewTextTag(g_Babel.GetWord('capSelectTransportType'), me.divMain);
		var panel = new Panel(me.divMain);
		var trImg = panel.tr;
		var CreateTd = function(tr)
		{
			var td = NewTag('td', tr);
			td.className = 'center';
			td.style.width = '25%';
			td.style.whiteSpace = 'normal';
			return td;
		}
		var iIconWidth = 52;
		var iIconHeight = 75;

		var a = NewTag('a', CreateTd(trImg));
		me.txtBtnCar = new ImgLink(a, iIconWidth, iIconHeight, me.GetTabImageUrl("TrafficByCarImg", null), me.GetTabImageUrl("TrafficByCarImg", "over"), me.GetTabImageUrl("TrafficByCarImg", "on"), me.GetTabImageUrl("TrafficByCarImg", "on"), g_Babel.GetWord("TrafficByCarShort"), true);
		AddEvent(a, 'click', me.SetByCar);

		var a = NewTag('a', CreateTd(trImg));
		me.txtBtnTaxi = new ImgLink(a, iIconWidth, iIconHeight, me.GetTabImageUrl("TrafficByTaxiImg", null), me.GetTabImageUrl("TrafficByTaxiImg", "over"), me.GetTabImageUrl("TrafficByCarImg", "on"), me.GetTabImageUrl("TrafficByTaxiImg", "on"), "Taxi", true);
		AddEvent(a, 'click', me.SetByTaxi);

		var a = NewTag('a', CreateTd(trImg));
		me.txtBtnBkv = new ImgLink(a, iIconWidth, iIconHeight, me.GetTabImageUrl("TrafficByBkvImg", null), me.GetTabImageUrl("TrafficByBkvImg", "over"), me.GetTabImageUrl("TrafficByBkvImg", "on"), me.GetTabImageUrl("TrafficByBkvImg", "on"), g_Babel.GetWord("TrafficByBkvShort"), true);
		AddEvent(a, 'click', me.SetByBkv);

		var a = NewTag('a', CreateTd(trImg));
		me.txtBtnBicycle = new ImgLink(a, iIconWidth, iIconHeight, me.GetTabImageUrl("TrafficByBikeImg", null), me.GetTabImageUrl("TrafficByBikeImg", "over"), me.GetTabImageUrl("TrafficByBikeImg", "on"), me.GetTabImageUrl("TrafficByBikeImg", "on"), g_Babel.GetWord("TrafficByBikeShort"), true);
		AddEvent(a, 'click', me.SetByBike);

		var a = NewTag('a', CreateTd(trImg));
		me.txtBtnFoot = new ImgLink(a, iIconWidth, iIconHeight, me.GetTabImageUrl("TrafficOnFootImg", null), me.GetTabImageUrl("TrafficOnFootImg", "over"), me.GetTabImageUrl("TrafficOnFootImg", "on"), me.GetTabImageUrl("TrafficOnFootImg", "on"), g_Babel.GetWord("TrafficOnFootShort"), true);
		AddEvent(a, 'click', me.SetOnFoot);

		me.SetTrafficType(me.strTrafficType);
	}
	
	/// private:
	/// Kozlekedesi parameterek megjelenitese
	this.ShowTrafficParams = function()
	{
		var divRouteParams = NewTag('div', me.divMain);
		divRouteParams.className = "noprint";
		me.pRouteParams.SetDiv(divRouteParams);
		me.pRouteParams.Show();
	}
	
	/// private:
	/// Idopontmegadas megjelenitese
	this.CreateTimeCtrl = function()
	{	
		me.divTimeCtrl = NewTag ("div", me.divMain);
		var panel = new Panel(me.divTimeCtrl);		
		var str = panel.CreateCaption(g_Babel.GetWord('capTimeToTravel'), "design/ICON_settings_off.gif", 14, 14);
		me.pLanguageSupporter.Add(str.parentNode, "innerHTML", 'capTimeToTravel', "", "");
		var div = NewTag('div', me.divTimeCtrl);
		me.timectrl.SetDiv(div);
		me.timectrl.Show();
		me.divTimeCtrl.style.display = "none";
	}
	
	
	this.GetTimeControlMustBeVisible = function ()
	{
		var bValue = false;
		if (me.strTrafficType == "public")
			bValue = true;
		return bValue;
	}

	this.RefreshTimeCtrl = function ()
	{	
		if (me.GetTimeControlMustBeVisible())
			me.divTimeCtrl.style.display = "";
		else
			me.divTimeCtrl.style.display = "none";		
	}
		
	/// protected:
	/// Megjeleneti a kozlekedesi input adatokat
	this.Show = function()
	{
		if(me.divMain)
		{
			while (me.divMain.hasChildNodes()) {
				me.divMain.removeChild(me.divMain.firstChild);
			}

			if (g_InitSettings.bShowTrafficChoice)
			{
				me.ShowTrafficButtons();
				me.ShowTrafficParams();

				NewTag('hr', me.divMain);
			}

			me.divAddressList = NewTag('div', me.divMain);
			me.divAddressList.className = "AddressList";

			var i;
			var iLength = GetArrayLength(me.arrAddressBlocks);
			//var iRouteLength = GetArrayLength(me.arrRouteBlocks);
			var iStartOrder = 1;
			for(var i=0; i<iLength; i++)
			{
				var div = NewTag("div", me.divAddressList);
				me.arrAddressBlocks[i].SetDiv(div);
				me.arrAddressBlocks[i].Show(i, iLength);
				
				//if(i<iRouteLength)
				//{
				//	div = NewTag("div", me.divAddressList);
				//	me.arrRouteBlocks[i].SetDiv(div);
				//	iStartOrder = me.arrRouteBlocks[i].Show(iStartOrder);
				//}
			}

			me.CreateTimeCtrl(); 
			me.RefreshTimeCtrl();							

			var panel = new Panel(me.divMain);
			var td = NewTag('td', panel.tr);
			var td = NewTag('td', panel.tr);
			td.className = 'right';

			NewTag("br", td);
			var a = NewTag('a', td);
			a.className = 'UI_button_TEXT';
			a.style.height = "28px";
			a.setAttribute('href', 'javascript:void(0)');
			NewTextTag(g_Babel.GetWord('btnFindRoute', "OK"), a);
			AddEvent(a, "click", function() {me.FindRoute(true);});

			me.divAlert = NewTag('div', me.divMain);

			var maxitable = NewTag ("table", me.divMain);
			var maxitbody = NewTag ("tbody", maxitable);
			var maxitr = NewTag ("tr", maxitbody);
			var maxitd1 = NewTag ("td", maxitr);
			var maxitd2 = NewTag ("td", maxitr);
			var maxitd3 = NewTag ("td", maxitr);

			var panel = new Panel(/*me.divMain*/maxitd1);
			var td = NewTag('td', panel.tr);			
			var txtBtn = new TextButton(td);
			im = txtBtn.CreateImage(14, 14, "design/icon_add_off.gif", "design/icon_add_on.gif", null, null, false);
			a = txtBtn.CreateText(g_Babel.GetWord('capInsertVisitNode'));
			me.pLanguageSupporter.Add(a, "innerHTML", "capInsertVisitNode", "", "");
			txtBtn.OnClick = me.AddThroughEmptyAddress;
			me.spanAddThroughAddress = panel.table;//txtBtn.span;
			me.divRegistered = NewTag('div', me.divMain);

			var panel = new Panel(/*me.divMain*/maxitd2);
			var td = NewTag('td', panel.tr);			
			var txtBtn = new TextButton(td);
			im = txtBtn.CreateImage(14, 14, "design/icon_delete_off.gif", "design/icon_delete_on.gif", null, null, false);
			me.pLanguageSupporter.Add (im, "alt", "hintRouteClear", "", "");
			a = txtBtn.CreateText(g_Babel.GetWord('hintRouteClear'));
			me.pLanguageSupporter.Add (a, "innerHTML", "hintRouteClear", "", "");
			txtBtn.OnClick = me.Reset;

			var panel = new Panel(/*me.divMain*/maxitd3);
			var td = NewTag('td', panel.tr);			
			var txtBtn = new TextButton(td);
			var im = txtBtn.CreateImage(20, 14, "design/icon_reverse_off.gif", "design/icon_reverse_on.gif", null, null, false);
			var a = txtBtn.CreateText(g_Babel.GetWord('capChangeDirection'));
			me.pLanguageSupporter.Add(a, "innerHTML", "capChangeDirection", "", "");			
			txtBtn.OnClick = me.OnReverseAddressOrder;

			if (me.OnShow) {
				try {
					me.OnShow();
				}
				catch (exp) {
					if(me.pTopoliszMap.OnError)
						me.pTopoliszMap.OnError(exp,'CUtvonaltervRouteSearch.OnShow');
				}
			}
		}
	}

	/// protected:
	// -----------------------------------------------
	/// Kiuriti a kozlekedesi listat, letorli a kozlekedest a terkeprol
	this.Reset = function()
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		for(var iOld = 1; iOld < iLength - 1; iOld++)
		{
				// Ha nem az utolsó címet törölte, akkor az egesz addressblockot torolni kell, meg a listabol is
				var div = me.arrAddressBlocks[iOld].GetDiv();
				if(div)
					div.parentNode.removeChild(div);
				me.arrAddressBlocks[iOld] = null;
				delete me.arrAddressBlocks[iOld];
		}
		me.arrAddressBlocks[1] = me.arrAddressBlocks[iLength - 1];
		if (iLength > 2) {
			me.arrAddressBlocks[iLength - 1] = null;
		}
		me.arrAddressBlocks[0].Delete();
		me.arrAddressBlocks[1].Delete();
		me.DeleteRoute (true);
		me.Show ();
	}


	/// public:
	/// A címlista megváltozásakor hívódik meg
	this.OnAddressListChanged = function()
	{
	}
	
	
	/// protected:
	/// A cimlistat cookie-ba menti
	this.SaveAddresses = function()
	{
		if(me.bSaveAddresses)
		{
			me.arrAddressBlocks[0].SaveAddress();
			if(g_bAdmin)
			{
				var iLength = GetArrayLength(me.arrAddressBlocks);
				setCookie('iAddressCount', iLength);
				for(var i=1; i<iLength; i++)
				{
					me.arrAddressBlocks[i].SaveAddress();
				}
			}
		}
	}

	/// private:
	this.OnAddressListChangedInternal = function(bDeleteRoute)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		
		me.SaveAddresses();
		me.pTopoliszMap.pMarkers.DeleteAllWithType("start");
		me.pTopoliszMap.pMarkers.DeleteAllWithType("stop");
		me.pTopoliszMap.pMarkers.DeleteAllWithType("marker");
		me.pTopoliszMap.pMarkers.DeleteAllWithType("pick");
		
		for(var i=0; i<iLength; i++)
		{
			var strClass = "marker";
			if(iLength > 1)
			{
				if(i==0)
					strClass="start";
				if(i==iLength - 1)
					strClass="stop";
			}
			var address = me.arrAddressBlocks[i].GetAddress();
			if(address)
				me.pTopoliszMap.AddMarker (address, strClass, 0, 0);
		}
		//me.pDragAndDrop.SetArray(me.arrAddressBlocks); //Ettől nem lehet az input mezőt többet módosítani!
		if(bDeleteRoute)
			me.DeleteRoute(true);	//me.FindRoute(bZoomTo);

		if (me.OnAddressListChanged)
			me.OnAddressListChanged();
	}

	//protected:
	//Egy adott címet beállít kezdőcímnek
	this.SetStartAddress = function(address)
	{
		if(GetArrayLength(me.arrAddressBlocks) > 0)
		{
			me.arrAddressBlocks[0].SetAddress(address);
			me.OnAddressListChangedInternal(true);
		}
		g_TopoliszControls.ShowRouteSearch();
	}

	// protected:
	//Egy adott címet beállít stopcímnek
	this.SetStopAddress = function(address)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		if(iLength > 1)
		{
			me.arrAddressBlocks[iLength-1].SetAddress(address);
			me.OnAddressListChangedInternal(true);
		}
		g_TopoliszControls.ShowRouteSearch();
	}
	
	/// private:
	this.OnAddressFound = function(pAddressBlock, pAddress)
	{
		//Dump('RS.OnAddressFound('+ ((pAddress != null) ? pAddress.strAddress : "null" )+')');
		me.OnAddressListChangedInternal(false);
/*
		if(me.bNeedRouteSearch)
		{
			if(!me.HasBusyAddressSearch())
			{
				me.FindRoute(true);
			}
		}
		else
			me.ClearAlertDiv();
			*/
	}
	
	/// private:
	this.OnSearchEnded = function(bFound)
	{
		if(!me.HasBusyAddressSearch())
			me.ClearAlertDiv();
		if(me.bNeedRouteSearch)
		{
			if(!me.HasBusyAddressSearch())
			{
				me.FindRoute(true);
			}
		}
	}

	/// private:
	this.OnAddAddressBefore = function(pAddressBlock)
	{
		me.AddAddressBlock(pAddressBlock.iOrder);
	}


	//protected:
	// Egy új címkezelő blokkot vesz fel az utolsó előtti pozicioba
	this.AddThroughEmptyAddress = function()
	{
		me.AddThroughAddress(null);
	}
	
	// protected:
	// Egy uj erintve cimet vesz fol.
	this.AddThroughAddress = function(pAddress)
	{
		if(GetArrayLength(me.arrAddressBlocks) < me.MAXADDRESSBLOCKS)
		{
			var iLength = GetArrayLength(me.arrAddressBlocks);
			var iAddress = 0;
			if(iLength > 0)
				iAddress = iLength-1;

			me.AddAddressBlock(iAddress);
			if(pAddress != null)
			{
				me.arrAddressBlocks[iAddress].SetAddress(pAddress);
				me.OnAddressListChangedInternal(true);
				g_TopoliszControls.ShowRouteSearch();
			}
		}
	}
	
	/// protected:
	/// Egy uj cimbeviteli blokkot vesz fol a megadott poziciora.
	this.AddAddressBlock = function(iNewPos)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		for(var i=iLength; i>iNewPos; i--)
		{
			me.arrAddressBlocks[i] = me.arrAddressBlocks[i-1];
			me.arrAddressBlocks[i].iOrder = i;
		}

		me.arrAddressBlocks[iNewPos] = new CUtvonaltervAddressBlock(me.pTopoliszMap, me);
		me.arrAddressBlocks[iNewPos].OnOK = me.OnAddressOK;
		me.arrAddressBlocks[iNewPos].OnDelete = me.OnDeleteAddress;
		me.arrAddressBlocks[iNewPos].OnMoveDown = me.OnMoveDownAddress;
		me.arrAddressBlocks[iNewPos].OnMoveUp = me.OnMoveUpAddress;
		me.arrAddressBlocks[iNewPos].OnMoveBack = me.OnMoveBackAddress;
		me.arrAddressBlocks[iNewPos].OnAddressFound = me.OnAddressFound;
		me.arrAddressBlocks[iNewPos].OnSearchEnded = me.OnSearchEnded;
		me.arrAddressBlocks[iNewPos].OnAddAddressBefore = me.OnAddAddressBefore;
		me.arrAddressBlocks[iNewPos].iOrder = iNewPos;
		if(me.divMain != null)
		{
			var divBefore = null;
			if(iLength > 1)
			{
				divBefore = me.arrAddressBlocks[iNewPos+1].GetDiv();
			}
			var div = NewTag('div', me.divAddressList, divBefore);
			me.arrAddressBlocks[iNewPos].SetDiv(div);
			me.arrAddressBlocks[iNewPos].Show();
		}
		me.EnableNewThroughAddress();
	}
	
	/// private:
	this.EnableNewThroughAddress = function()
	{
		if(me.spanAddThroughAddress)
		{
			if(GetArrayLength(me.arrAddressBlocks) >= me.MAXADDRESSBLOCKS)
				Hide(me.spanAddThroughAddress);
			else
				Show(me.spanAddThroughAddress);
		}
		var iLength = GetArrayLength(me.arrAddressBlocks);
		for(var i=0; i<iLength; i++)
		{
			me.arrAddressBlocks[i].ShowHeader();
		}
	}

	/// private:
		// cím törlésénél nézi, hogy kell-e törölni az egész addressblock-ot
	this.OnDeleteAddress = function(pAddressBlock)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var iNew = 0;
		var bWasDelete = false;
		for(var iOld = 0;iOld<iLength; iOld++)
		{
			if(me.arrAddressBlocks[iOld] == pAddressBlock && (iLength > 2))
			{
				// Ha tobb mint 2 cim van meg, akkor az egesz addressblockot torolni kell, meg a listabol is
				var div = pAddressBlock.GetDiv();
				if(div)
					div.parentNode.removeChild(div);
				me.arrAddressBlocks[iOld] = null;
				delete pAddressBlock;
				bWasDelete = true;
				continue;
			}
			if(iOld != iNew)
			{
				me.arrAddressBlocks[iNew] = me.arrAddressBlocks[iOld];
				me.arrAddressBlocks[iOld] = null;
			}
			me.arrAddressBlocks[iNew].iOrder = iNew;
			iNew++;
		}
		if(bWasDelete)
		{
			iLength = GetArrayLength(me.arrAddressBlocks);
			for(var i=0; i<iLength; i++)
			{
				//me.arrAddressBlocks[i].SetCaption(i, iLength);
				me.arrAddressBlocks[i].ShowHeader();
			}
			me.EnableNewThroughAddress();
		}
		if(GetArrayLength(me.GetAddressList()) < 2)
			me.DeleteRoute(false);
		me.OnAddressListChangedInternal(true);
	}

	/// private:
	// eMode = "down", "up", "back"
	this.ChangeAddressOrder = function (pAddressBlock, eMode)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var iAddress;
		var iSwap1 = -1;
		var iSwap2 = -1;

		for(iAddress = 0; iAddress < iLength; iAddress++)
		{
			if (( me.arrAddressBlocks[iAddress] == pAddressBlock ) || (( eMode == "back" ) && (iAddress < iLength / 2)))
			{
				iSwap1 = iAddress;
				
				if (eMode == "down")
				{
					if(iSwap1 < iLength - 1)
						iSwap2 = iSwap1 + 1;
					else
						iSwap2 = 0; 
				}
				else if (eMode == "up")
				{
					if(iSwap1 < 0)
						iSwap2 = iLength - 1;
					else
						iSwap2 = iSwap1 - 1; 
				}
				else if (eMode == "back")
				{
					iSwap1 = iAddress;
					iSwap2 = iLength - 1 - iAddress; 
				}

				//csere
				var temp = me.arrAddressBlocks[iSwap1];
				me.arrAddressBlocks[iSwap1] = me.arrAddressBlocks[iSwap2];
				me.arrAddressBlocks[iSwap2] = temp;
				me.arrAddressBlocks[iSwap1].iOrder = iSwap1;
				me.arrAddressBlocks[iSwap2].iOrder = iSwap2;

				// vizualis csere
				me.arrAddressBlocks[iSwap1].GetDiv().style.visibility = "hidden";
				me.arrAddressBlocks[iSwap2].GetDiv().style.visibility = "hidden";

				SwapNode(me.arrAddressBlocks[iSwap1].GetDiv(), me.arrAddressBlocks[iSwap2].GetDiv());

				me.arrAddressBlocks[iSwap1].ShowHeader();
				me.arrAddressBlocks[iSwap2].ShowHeader();

				me.arrAddressBlocks[iSwap1].GetDiv().style.visibility = "visible";
				me.arrAddressBlocks[iSwap2].GetDiv().style.visibility = "visible";

				if(me.arrAddressBlocks[iSwap1].GetAddress() != null && me.arrAddressBlocks[iSwap2].GetAddress() != null)
					me.OnAddressListChangedInternal(true);
				else
					me.SaveAddresses();
				break;
			}
		}
		
	}

	/// private:
	this.OnMoveDownAddress = function(pAddressBlock)
	{
		me.ChangeAddressOrder (pAddressBlock, "down");
	}

	/// private:
	this.OnMoveUpAddress = function(pAddressBlock)
	{
		me.ChangeAddressOrder (pAddressBlock, "up");
	}

/// private:
	this.OnMoveBackAddress = function(pAddressBlock)
	{
		me.ChangeAddressOrder (pAddressBlock, "back");
	}

	this.OnReverseAddressOrder = function()
	{
		me.arrAddressBlocks.reverse();
		var iLength = GetArrayLength(me.arrAddressBlocks);
		for(var i=0; i<iLength; i++)
		{
			me.divAddressList.removeChild(me.arrAddressBlocks[i].GetDiv());
			me.divAddressList.appendChild(me.arrAddressBlocks[i].GetDiv());
		}
		for(var i=0; i<iLength; i++)
		{
			me.arrAddressBlocks[i].iOrder = i;
			me.arrAddressBlocks[i].ShowHeader();
		}
		
		if(me.arrAddressBlocks[0].GetAddress() != null && me.arrAddressBlocks[me.arrAddressBlocks.length-1].GetAddress() != null)
			me.OnAddressListChangedInternal(true);
		else
			me.SaveAddresses();
	
	}
	

	/// private:
	this.OnDragAndDropFinished = function ()
	{
		me.arrAddressBlocks = me.pDragAndDrop.GetArray ();
		me.OnAddressListChangedInternal(true);
	}
	this.pDragAndDrop.OnArrayChanged = me.OnDragAndDropFinished;

	/// protected:
	// Visszadja az indulasi idot sztringkent
	this.GetTrafficTime = function()
	{
		if(me.strTrafficTime == "")
			me.SetTrafficTime("");
		return me.strTrafficTime;
	}
	
	/// protected:
	/// Beallitja az indulasi idot sztringkent
	this.SetTrafficTime = function(strTime)
	{
		var myDate = Date.parse(strTime);
		if(isNaN(myDate) || myDate == null)
			myDate = new Date();
		else
			myDate = new Date(myDate);
		var str = myDate.getFullYear() + "/";
		if(myDate.getMonth()<9)
			str += "0";
		str += myDate.getMonth()+1 + "/";
		if(myDate.getDate()<10)
			str += "0";
		str += myDate.getDate() + " ";
		if(myDate.getHours()<10)
			str += "0";
		str += myDate.getHours() + ":";
		if(myDate.getMinutes()<10)
			str += "0";
		str += myDate.getMinutes();
		me.strTrafficTime = str;
		if(g_bAdmin)
			setCookie("TrafficTime", str);

		if(me.timectrl)
		{
			me.timectrl.SetTime(myDate);
			if(me.strTrafficTime != "")
				me.timectrl.bHasTime = true;
		}
		return str;
	}
	
	/// protected:
	/// Beallitja az indulasi idot Date objektumkent
	this.SetTrafficTimeValue = function(dtTime)
	{
		var str = dtTime.getFullYear() + "/";
		if(dtTime.getMonth()<9)
			str += "0";
		str += dtTime.getMonth()+1 + "/";
		if(dtTime.getDate()<10)
			str += "0";
		str += dtTime.getDate() + " ";
		if(dtTime.getHours()<10)
			str += "0";
		str += dtTime.getHours() + ":";
		if(dtTime.getMinutes()<10)
			str += "0";
		str += dtTime.getMinutes();
		me.strTrafficTime = str;
		if(g_bAdmin)
			setCookie("TrafficTime", str);

		if(me.timectrl)
		{
			me.timectrl.SetTime(dtTime);
			if(me.strTrafficTime != "")
				me.timectrl.bHasTime = true;
		}
		return str;
	}

	/// protected:
	/// Visszadja a cimlistat
	/// Visszateresi ertek: CSimpleAddress[]
	this.GetAddressList = function()
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var arrAddressList = new Array();
		for(i=0; i<iLength; i++)
		{
			var pAddress = me.arrAddressBlocks[i].GetAddress();
			if(pAddress != null)
				arrAddressList[arrAddressList.length] = pAddress;
		}
		return arrAddressList;
	}

	/// protected:
	/// Címlista beállítás: CSimpleAddress tömbbel
	this.SetAddressList = function(arrAddressList)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		for(var iOld = 1; iOld < iLength - 1; iOld++)
		{
				// Ha nem az utolsó címet törölte, akkor az egesz addressblockot torolni kell, meg a listabol is
				var div = me.arrAddressBlocks[iOld].GetDiv();
				if(div)
					div.parentNode.removeChild(div);
				me.arrAddressBlocks[iOld] = null;
				delete me.arrAddressBlocks[iOld];
		}
		me.arrAddressBlocks[1] = me.arrAddressBlocks[iLength - 1];
		if (iLength > 2) {
			me.arrAddressBlocks[iLength - 1] = null;
		}
		
		var counter = 0;

		if(arrAddressList != null)
		{
			for(var i = 0; i < arrAddressList.length; i++)
			{
				if (i > 0 && i < arrAddressList.length - 1) {
					me.AddThroughAddress();
				}
				counter++;
				if(arrAddressList[i] != null && arrAddressList[i].strAddress != null && arrAddressList[i].strAddress != '')
				{
					me.arrAddressBlocks[i].SetAddress(arrAddressList[i]);
				}
			}
		}
		for (var i = counter; i < 2; i++) {
			me.AddThroughAddress();
		}
		
		if(me.divAddressList)
			me.Show();
		me.OnAddressListChangedInternal(true);
	}
	

	/// private:
	this.GetAddressListUrl = function()
	{
		var arrAddressList = me.GetAddressList();
		var arrNames = "", arrAddresses = "", arrX="", arrY="";
		var iLength = GetArrayLength(arrAddressList);
		var i;
		for(i=0; i<iLength; i++)
		{
			if(i>0)
			{
				arrNames += "|";
				arrAddresses += "|";
				arrX += "|";
				arrY += "|";
			}
			if(arrAddressList[i].strName != null)
			{
				arrNames += arrAddressList[i].strName;
			}
			arrAddresses += arrAddressList[i].strAddress;
			arrX += arrAddressList[i].dX;
			arrY += arrAddressList[i].dY;
		}
		return "arrAddresses=" + arrAddresses + "&arrNames="+arrNames +"&arrX="+arrX + "&arrY="+arrY;
	}

	/// private:
	/// Torli a kozlekedesi listat
	/// bServerAsWell: uj terkepet is ker hozza
	this.DeleteRoute = function (bServerAsWell)
	{
		me.ClearAlertDiv();
		if(me.pResultHandler)
		{
			me.pResultHandler.DeleteRoute();
		}
		if (bServerAsWell == true)
		{
			me.timectrl.Reset();
			me.pTopoliszMap.InciServer.CallFunction("DeleteRoute", "", 0, me.pTopoliszMap.DrawRoute);
			if(me.OnRouteChanged)
			{
				try {
					me.OnRouteChanged(null);
				}
				catch(exp) {
					if(me.pTopoliszMap.OnError)
						me.pTopoliszMap.OnError(exp, "CUtvonaltervRouteSearch.OnRouteChanged");
				}
			}
		}
	}

	/// protected:
	/// Beallitja a kozlekedes tipusat:
	/// car: autos
	/// taxi: taxi
	/// public: tomegkozlekedes
	/// bicycle: kerekparos
	/// foot: gyalogos
	/// protected:
	this.SetTrafficType = function(strTrafficType)
	{
		if(!g_InitSettings.bShowTrafficChoice)
			strTrafficType = "car";
		me.strTrafficType = strTrafficType;
		if(me.strTrafficType != null)
			me.strTrafficType = me.strTrafficType.toLowerCase();
		if(me.txtBtnCar)
			me.txtBtnCar.SetActive(me.IsByCar());
		if(me.txtBtnTaxi)
			me.txtBtnTaxi.SetActive(me.IsByTaxi());
		if(me.txtBtnBkv)
			me.txtBtnBkv.SetActive(me.IsByPublicTransport());
		if(me.txtBtnBicycle)
			me.txtBtnBicycle.SetActive(me.IsByBicycle());
		if(me.txtBtnFoot)
			me.txtBtnFoot.SetActive(me.IsOnFoot());
		if(g_InitSettings.bShowTrafficChoice)
			setCookie('TrafficType', strTrafficType);
	}
	
	/// protected:
	/// Visszaadja a kozlekedes tipusat
	this.GetTrafficType = function()
	{
		if(me.IsByPublicTransport())
		{
			if(me.bUsePTLocal && !me.bUsePTTrain)
				return "local";
			else if(!me.bUsePTLocal && me.bUsePTTrain)
				return "train";
			return "public";
		}
		return me.strTrafficType;
	}

	/// private:
	this.IsInList = function(strValue, arrList)
	{
		strValue = strValue.toLowerCase();
		strValue = strValue.replace(" ", ",");
		var arrStrings = strValue.split(",");
		for(var i=0; i<arrList.length; i++)
		{
			for(var j=0; j<arrStrings.length; j++)
			{
				if(arrList[i].toLowerCase() == arrStrings[j])
					return true;
			}
		}
		return false;
	}
	
	/// private:
	this.IsCarString = function(strValue)
	{
		var arrList = ["VT_CAR", "car", "auto"];
		return me.IsInList(strValue, arrList);
	}
	
	/// protected:
	/// Autos tervezes
	/// visszateresi ertek: bool
	this.IsByCar = function()
	{
		return me.strTrafficType == null || me.strTrafficType.length < 1 || me.IsCarString(me.strTrafficType);
	}

	/// private:
	this.IsTaxiString = function(strValue)
	{
		var arrList = ["VT_TAXI", "taxi"];
		return me.IsInList(strValue, arrList);
	}

	/// protected:
	/// Taxis tervezes
	/// visszateresi ertek: bool
	this.IsByTaxi = function()
	{
		return me.strTrafficType == null || me.strTrafficType.length < 1 || me.IsTaxiString(me.strTrafficType);
	}

	/// private:
	this.IsPublicTransportString = function(strValue)
	{
		var arrList = ["PT_ALL", "public", "pt",
		               "PT_LOCALTRANSPORT", "bkv", "ptlocal", "local",
		               "PT_GLOBALBUSTRANSPORT", "volan", "volanbusz", "ptglobal", "global",
		               "PT_GLOBALTRAINTRANSPORT", "mav", "mav-start", "mavstart", "pttrain", "train"];
		return me.IsInList(strValue, arrList);
	}

	/// protected:
	/// Tomegkozlekedes tervezes
	/// visszateresi ertek: bool
	this.IsByPublicTransport = function()
	{
		if(me.strTrafficType)
			return me.IsPublicTransportString(me.strTrafficType);
		return false;
	}

	/// private:
	this.IsBicycleString = function(strValue)
	{
		var arrList = ["VT_BICYCLE", "bicycle", "bike"];
		return me.IsInList(strValue, arrList);
	}

	/// protected:
	/// Kerekparos tervezes
	/// visszateresi ertek: bool
	this.IsByBicycle = function()
	{
		if(me.strTrafficType)
			return me.IsBicycleString(me.strTrafficType);
		return false;
	}
	
	/// private:
	this.IsFootString = function(strValue)
	{
		var arrList = ["VT_PEDESTRIAN", "foot", "pedestrian", "gyalog", "gyalogos"];
		return me.IsInList(strValue, arrList);
	}

	/// protected:
	/// Gyalogos tervezes
	/// visszateresi ertek: bool
	this.IsOnFoot = function()
	{
		if(me.strTrafficType)
			return me.IsFootString(me.strTrafficType);
		return false;
	}

	/// private:
	this.IsTaxiString = function(strValue)
	{
		var arrList = ["VT_TAXI", "taxi"];
		return me.IsInList(strValue, arrList);
	}

	/// protected:
	/// Autos tervezes beallitasa
	this.SetByCar = function()
	{
		me.SetTrafficType("car");
		me.VehicleTypeChanged()
	}

	/// protected:
	/// Taxis tervezes beallitasa
	this.SetByTaxi = function()
	{
		me.SetTrafficType("taxi");
		me.VehicleTypeChanged()
	}
	
	/// protected:
	/// Tomegkozlekedesi tervezes beallitasa
	this.SetByBkv = function()
	{
		me.SetTrafficType("public");
		me.VehicleTypeChanged()
	}

	/// protected:
	/// Biciklis tervezes beallitasa
	this.SetByBike = function()
	{
		me.SetTrafficType("bicycle");
		me.VehicleTypeChanged()
	}

	/// protected:
	/// Gyalogos tervezes beallitasa
	this.SetOnFoot = function()
	{
		me.SetTrafficType("foot");
		me.VehicleTypeChanged();
	}

	/// private:
	this.VehicleTypeChanged = function()
	{
		me.pRouteParams.Show();
		me.RefreshTimeCtrl();
		//if(GetArrayLength(me.GetAddressList()) >= 2)
		//{
		//	me.FindRoute(true);
		//}
	}
	
	/// private:
	this.GetWrongAddresses = function()
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var arrWrongAddresses = new Array();
		var i;
		for(i=0; i<iLength; i++)
		{
			var pSearch = me.arrAddressBlocks[i].pSearch;
			if(pSearch.GetInputValue() != "" && !pSearch.IsUnique())
				arrWrongAddresses[arrWrongAddresses.length] = pSearch.GetInputValue();
		}
		return arrWrongAddresses;
	}

	/// private:
	this.HasBusyAddressSearch = function()
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var i;
		for(i=0; i<iLength; i++)
		{
			var pSearch = me.arrAddressBlocks[i].pSearch;
			if(pSearch.bIsBusy)
			{
				//console.log(i + " is busy");
				return true;
			}
		}
		return false;
	}

	/// private:
	this.FindAllAddress = function(strEventSource)
	{
		var iLength = GetArrayLength(me.arrAddressBlocks);
		var i;
		for(i=0; i<iLength; i++)
		{
			var pSearch = me.arrAddressBlocks[i].pSearch;
			if(!pSearch.bIsBusy)
			{
				//console.log(i + " Go sent");
				pSearch.Go(strEventSource);
			}
			else
				pSearch.bOKPressed = true;
		}
	}

	/// private:
	this.OnAddressOK = function(pAddressBlock, strEventSource)
	{
		//console.log("OnAddressOK(bNeedRouteSearch="+me.bNeedRouteSearch+")");
		if(!me.bNeedRouteSearch)
		{
			var address = pAddressBlock.GetAddress();
			if (address != null)
			{
				if ( address.dMinX > 0 && address.dMinY > 0 && address.dMaxX > 0 && address.dMaxY > 0
					&& address.dMinX != address.dMaxX && address.dMinY != address.dMaxY )
					me.pTopoliszMap.ZoomToRect(address.dMinX, address.dMinY, address.dMaxX, address.dMaxY);
				else if(address.dX > 0 && address.dY > 0)
					me.pTopoliszMap.ZoomToPoint(address.dX, address.dY, 250);
			}
			if(!me.HasBusyAddressSearch())
				me.ClearAlertDiv();
		}
	}

	/// protected:
	/// Elindítja az útvonal számítást
	/// bZoomMap: a térképet az útvonal fölé vigye-e
	this.FindRoute = function(bZoomMap)
	{
		//console.log("FindRoute");
		me.bNeedRouteSearch = true;

		if(me.HasBusyAddressSearch())
		{
			var div = NewTag('div', me.GetAlertDiv());
			div.className = 'UI_routingprogress';
	
			var tt = NewTextTag(g_Babel.GetWord("capAddressSearchInProgress"), div);
			return;
		}
		me.bNeedRouteSearch = false;
		me.DeleteRoute(false); // eddigi eredmeny torlese

		if(me.IsByPublicTransport() && !me.bUsePTLocal && !me.bUsePTTrain)
		{
			me.bUsePTLocal = true;
			me.bUsePTTrain = true;
			me.pRouteParams.Show();
		}

		var arrWrongAddresses = me.GetWrongAddresses();
		if(arrWrongAddresses.length == 0)
		{
		//	me.bNeedRouteSearch = false;
			var addressList = me.GetAddressList(); // csak a kitöltött címek szerepelnek benne
			var iRoutePointsNum = GetArrayLength(addressList);
			// csak akkor keres utat, ha legalabb egy szakasza van.

			//Dump('FindRoute(iRpNum:+'+ iRoutePointsNum +')');
			if (iRoutePointsNum > 1)
			{
				if(me.IsByPublicTransport() && !me.timectrl.HasTime())
				{
					var divPopup = NewTag('div');
					var timectrl2 = new TimeControl();
					var div = NewTag('div', divPopup);
					div.style.marginLeft = "auto";
					div.style.marginRight = "auto";
					div.style.width = "240px";
					timectrl2.SetDiv(div);
					timectrl2.Show();
					var div = NewTag('div', divPopup);
					div.style.textAlign = "center";
					
					var OnOK = function()
					{
						me.timectrl.SetTime(timectrl2.GetTime());
						me.timectrl.bHasTime = timectrl2.bHasTime;
						me.timectrl.Show();
						g_PopUpHandler.HidePopup();
						me.FindRoute();
					}
					
					var OnNow = function()
					{
						me.timectrl.SetTimePart(g_Babel.GetWord('Now'));
						me.timectrl.Show();
						g_PopUpHandler.HidePopup();
						me.FindRoute();
					}
					
					var OnCancel = function()
					{
						g_PopUpHandler.HidePopup();
					}

					var button = NewTag('input');
					button.type = "button";
					button.value = "OK";
					AddTag(button, div);
					AddEvent(button, "click", OnOK);

					var button = NewTag('input');
					button.type = "button";
					button.value = g_Babel.GetWord('Now');
					AddTag(button, div);
					AddEvent(button, "click", OnNow);

					var button = NewTag('input');
					button.type = "button";
					button.value = "Mégsem";
					AddTag(button, div);
					AddEvent(button, "click", OnCancel);
					
					
					g_PopUpHandler.SetContent(g_Babel.GetWord('capTimeToTravel'), divPopup);
					g_PopUpHandler.SetSize(320, 150);
					g_PopUpHandler.CenterPopup();
					g_PopUpHandler.ShowPopup();
					return;
				}
				me.SetTrafficTimeValue(me.timectrl.GetTime());
			
				if(me.pResultHandler != null)
				{
					var div = NewTag('div', me.GetAlertDiv());
					div.className = 'UI_routingprogress';
					var bid = "messageRouting";
					if(me.IsByCar())
						bid += "Car";
					else if(me.IsByPublicTransport())
						bid += "PT";
					else if(me.IsByBicycle())
						bid += "Bike";
					else if(me.IsOnFoot())
						bid += "Foot";
					else if(me.IsByTaxi())
						bid += "Taxi";
					var tt = NewTextTag(g_Babel.GetWord(bid), div);
					me.pLanguageSupporter.Add(tt,"nodeValue","capRoutingInProgress","","");

					var strParams = me.GetAddressListUrl()
												+ "&strTrafficType=" + me.GetTrafficType()
												+ "&iCarOptim=" + me.iCarOptim
												+ "&iBkvOptim=" + me.iBkvOptim
												+ "&strGetOnType=" + me.strGetOnType
												+ "&strTime=" + me.strTrafficTime
												+ "&bToll=" + me.bUseTolledRoute
												+ "&bFerry=" + me.bUseFerry
												+ "&bDirtyRoad=" + me.bUseDirtyRoad;
					/*document.title = "Útvonalterv.hu - " + me.pTopoliszMap.strDefaultCountry + " térkép"*/
					me.pTopoliszMap.InciServer.CallFunction("FindRoute", strParams, 0, me.FindRouteReturned, {'arrAddressList': me.GetAddressList(),'bZoomMap': bZoomMap, "strTrafficTime" : me.strTrafficTime});
					//me.pTopoliszMap.InciServer.CallFunction("FindRoute", strParams, 0, me.pResultHandler.FillRoute, {'arrAddressList': me.GetAddressList(),'bZoomMap': bZoomMap});
					
					me.iBkvOptim = 0; // Alternativa visszaállítása
				}
			}
			else
			{
				var alertbox = new Alert(me.GetAlertDiv());
				var aa = NewTextTag(g_Babel.GetWord("capAlert"), alertbox.th);
				me.pLanguageSupporter.Add(aa, "nodeValue", "capAlert", "", "");
				aa = NewTextTag(g_Babel.GetWord("capMinTwoAddress"), alertbox.td);
				me.pLanguageSupporter.Add(aa, "nodeValue", "capMinTwoAddress", "", "");
				window.scrollTo(0, GetAbsLayerTop(alertbox.table));
			}
		}
		else
		{
			var alertbox = new Alert(me.GetAlertDiv());
			var aa = NewTextTag(g_Babel.GetWord("capAlert"), alertbox.th);
			me.pLanguageSupporter.Add(aa, "nodeValue", "capAlert", "", "");
			aa = NewTextTag(g_Babel.GetWord("TrafficErrorAddressList"), alertbox.td);
			me.pLanguageSupporter.Add(aa, "nodeValue", "TrafficErrorAddressList", "", "");
			var ul = NewTag('ul', alertbox.td);
			for(var i=0; i<arrWrongAddresses.length; i++)
			{
				var li = NewTag('li', ul);
				NewTextTag(arrWrongAddresses[i], li);
			}
			window.scrollTo(0, GetAbsLayerTop(alertbox.table));
		}
	}
	
	/// private:
	this.FindRouteReturned = function (pRoute, pClientParams, iCommandID)
	{
		me.pResultHandler.FillRoute (pRoute, pClientParams);
		if(me.OnRouteChanged)
		{
			try {
				me.OnRouteChanged(pRoute);
			}
			catch(exp) {
				if(me.pTopoliszMap.OnError)
					me.pTopoliszMap.OnError(exp, "CUtvonaltervRouteSearch.OnRouteChanged");
			}
		}
	}

	/// private:
	this.GetAlertDiv = function()
	{
		me.ClearAlertDiv();
		return me.divAlert;
	}

	/// private:
	this.ClearAlertDiv = function()
	{
		if(me.divAlert)
		{
			while(me.divAlert.firstChild)
				me.divAlert.removeChild(me.divAlert.firstChild);
		}
	}

	//protected:
	//Elrejtes
	this.Hide = function ()
	{
		me.divMain.style.display = "none";
	}

	//protected:
	//Megjelenites elrejtes utan
	this.Unhide = function ()
	{
		me.divMain.style.display = "";
	}

	/// private:
	this.OnChangeLang = function()
	{
		//me.Show();
		me.pLanguageSupporter.Apply();
	}
	
	g_Babel.AddListener(this.OnChangeLang);


	this.Init();

}

