﻿// contains data about a specific POI
function VisualPoiListItem (marker, pPOIBOX, iIndex, strName, bDetailed)
{
	this.m_pMarker = marker;
	this.m_pPOIBOX = pPOIBOX; // ptr
	this.m_iIndex = iIndex; // int
	this.m_strName = strName; // str
	this.m_trPOIItem = null; // tr
	this.m_aPOIName = null; // a	
	
	this.m_arrNames = null; // array
	this.m_arrValues = null; // array
	this.m_iTypeId = marker.GetProperty ("nTypeID");
	
	this.m_bDetailed = bDetailed; // bool	
	this.m_divDetails = null;
	
	this.OnMouseOverPOIName = null;
	this.OnMouseOutPOIName = null;
	this.OnClickPOIName = null;
	this.OnClickLoupe = null;
	
	this.m_bDetailsHasDownloadedFromServer = false;
	
	var me = this;
	
	this.Create = function ()
	{
		var tr = me.m_pPOIBOX.panelPoiList.tr;
		if(tr.firstChild)
			tr = NewTag('tr', tr.parentNode);
	//	AddEvent(tr, 'mouseover', me.OnMouseOverPOIName); // external event handler
	//	AddEvent(tr, 'mouseout', me.OnMouseOutPOIName); // external event handler

		me.m_trPOIItem = tr;
		tr.className = me.m_pMarker.GetProperty("list_css_classname");
		var td = NewTag('td', tr);
		td.className = 'list_order';
		var span = NewTag('span', td);
		NewTextTag(me.m_iIndex + '.', span);

		td = NewTag('td', tr);
		td.className = "list_data";
		var a = NewTag('a', td);
		a.setAttribute('href', 'javascript:void(0)');
		NewTextTag (me.m_strName, a);
		me.m_aPOIName = a;
				
		AddEvent(a, 'click',  me.OnClickPOIName); // external event handler		
		//n:
		AddEvent(a, 'mouseover', me.OnMouseOverPOIName); // external event handler 
		AddEvent(a, 'mouseout', me.OnMouseOutPOIName); // external event handler
		

		td = NewTag('td', tr);
		td.className = "list_show";
		var a = NewTag('a', td);
		if (me.OnClickLoupe != null)
		{
			new ImgLink(a, 12, 15, "design/ICON_display_off.gif", "design/ICON_display_on.gif", null, null, g_Babel.GetWord("ShowAddress"), false);
			AddEvent(a, 'click',  me.OnClickLoupe); // external event handler
		}

		var tr = NewTag('tr', tr.parentNode);
		var td = NewTag('td', tr);
		td.colSpan = 3;
		var hr = NewTag('hr', td);
		hr.className = 'dotted';	
		
		if (me.m_bDetailed == true)
		{
			me.ShowDetails();
		}			
		else
		{
			me.m_bDetailed = false;
		}
	}
	
	this.GetTableRow = function ()
	{
		return me.m_trPOIItem;
	}
	
	this.AddArrNames = function (arrNames)
	{
		if (me.m_arrNames != null)
		{
			delete me.m_arrNames;			
			me.m_arrNames = null;
		}
		
		me.m_arrNames = arrNames;
	}
	
	this.AddArrValues = function (arrValues)
	{
		if (me.m_arrValues != null)
		{
			delete me.m_arrValues;			
			me.m_arrValues = null;
		}
	
		me.m_arrValues = arrValues;
	}	
	
			
	
	this.DetailsDataArrivedPOIBOX = function (result)
	{		
		me.m_iTypeId = result.arrRecords[0].nTypeID;		
		
		var j;
		for (j = 1; j < result.arrRecords[0].arrValues.length; j++)
		{						
			me.m_arrNames.push (result.arrRecords[0].arrNames[j]);
			me.m_arrValues.push (result.arrRecords[0].arrValues[j]);				
		};					
		
		me.m_bDetailsHasDownloadedFromServer = true;
		me.ShowDetails();			
	}	
	
	this.ShowDetails = function ()
	{				
		var iServerID = me.m_pMarker.GetProperty("get_details_from_server");		
		if ((iServerID != "???") && (me.m_bDetailsHasDownloadedFromServer == false))
		{
			g_TopoliszMap.NoSessionServer.CallFunction("SearchPoi", "iID=" + iServerID, 0, me.DetailsDataArrivedPOIBOX); 
			return;
		}		
	
		if (me.m_divDetails == null)
		{
			me.m_divDetails = NewTag ('div', me.m_aPOIName.parentNode);								
		}
		else
		{
			me.m_divDetails.parentNode.removeChild (me.m_divDetails);
			me.m_divDetails = NewTag ('div', me.m_aPOIName.parentNode);		
		}
								
		if ((me.m_iTypeId != "") && (me.m_iTypeId != "???"))
		{
			NewTag ('br', me.m_divDetails);	
			NewTextTag (g_Babel.GetWord("PoiType") + ": " + g_Babel.GetWord("poi"+me.m_iTypeId) , me.m_divDetails);																
		}
								
		var i;
		for (i = 1; i < me.m_arrNames.length; i++)
		{		
			var listPoiPropertyNames = [g_Babel.GetWord("PoiType"),"Cím","Telefon","Fax","Email","Web","Nyitva"];				
			if (listPoiPropertyNames.indexOf(me.m_arrNames[i]) != -1)							
			{
				var brDetail = NewTag ('br', me.m_divDetails);		

				// A Firefox aljassaga miatti hack - kulonben eltunik a komplett bal panel:
				var img = NewTag ("img", me.m_divDetails);
				SetImage (img, "images/transparent.gif",1,1,"VALAMI");
				
				if (me.m_pPOIBOX.pMap.GetLang() == "hu")
					NewTextTag (me.m_arrNames[i] + ": " + me.m_arrValues[i], me.m_divDetails);																
				else
					NewTextTag (me.m_arrValues[i], me.m_divDetails);																
			}
		}		
		
		me.m_bDetailed = true;						
	}
	
	this.HideDetails = function ()
	{
		try
		{
			if (me.m_divDetails != null)
			{
				while (me.m_divDetails.firstChild)
				{
					me.m_divDetails.removeChild (me.m_divDetails.firstChild);
				}
			}
		}
		catch (x)
		{			
			alert ("1"+ x); //xxx
		}		
		
		me.m_bDetailed = false;
	}
	
	this.SwitchDetails = function ()
	{
		if (me.m_bDetailed) 
			me.HideDetails();
		else 
			me.ShowDetails();
	}
}

function LayerPoi (strID, iX, iY, strName, wgsX, wgsY) 
{
	this.strID = (strID != undefined && strID != null ? strID : "");
	this.iX    = (iX != undefined ? iX : 0);
	this.iY    = (iY != undefined ? iY : 0); 
	this.strName = (strName != undefined && strName != null ? strName : "");
	this.divPoiListItem = null;	
	this.pMap = null;
	this.pPOIBOX = null;
	this.divDetails = null;
	this.divLabel = null;
	this.divLabelDetails = null;
	this.pVPLI = null;
/*	this.wgsX = 0;
	this.wgsY = 0;*/

	var me = this;

	this.RemoveBox = function ()
	{
		if (me.pPOIBOX != null)
		{
			me.pPOIBOX.DeselectPOI ();
		}
	}
	
	this.MouseOverEventHandler = function ()
	{
		//me.divPoiListItem.style.fontWeight = "Bold";
		if ((me.pPOIBOX != null) /*&& (me.pMap.bFixedLabel == false)*/)
		{
			me.pMap.RemovePinBoxes ("findpoi");
			me.pPOIBOX.SelectPOI (me);
		}
	}

	this.MouseClickEventHandler = function ()
	{
		if (me.pPOIBOX != null)
		{
			me.pMap.RemovePinBoxes ("findpoi");
			me.pPOIBOX.SelectPOI (me);
			me.pPOIBOX.ShowHideDetailsOfLayerPoi (me);
		}
	}

	this.MouseOutEventHandler = function ()
	{
		//me.divPoiListItem.style.fontWeight = "Normal";
	}
}



// POIBOX contains more divs with POI data
function POIBOX (div, pMap, type)
{
	this.pMap = pMap;
	this.div = div;
	this.type = type;
	
	this.divPois = null;
	this.panelPoiList = null;
	
	this.pPager = null;
	this.aDetails = null;
	this.divDetails = null;

	var me = this;

	this.divSelectedPoi = null;	
	this.imgFocus = null;
	this.divFocus = null;
	this.sSelectedPOIColor = "Red";
	this.sNormalPOIColor = "#70706e";
	this.bDetailsRequestIsInProgress = false;

	//this.pDetailedPoi = null;

	this.Init = function()
	{
		if (me.type == "layertype")
		{
			me.pMap.OnPoiOnGridListChanged = me.OnPoiOnGridListChanged;
			me.pMap.OnMapViewChanged = me.OnMapViewChanged;
		}
		else if (me.type == "searchtype")
		{
			me.pMap.OnMarkerListChanged = me.OnMarkerListChanged;
		}
	}

	this.SetDiv = function(div)
	{
		me.div = div;
	}
	
	this.Show = function()
	{
		var panel = new Panel(me.div);
		
		/*if (me.type == "layertype")
			panel.CreateCaption(g_Babel.GetWord('VisibleOnMap'), "design/ICON_info_off.gif", 14, 14);
		else*/ 
		if (me.type == "searchtype")
			panel.CreateCaption(g_Babel.GetWord('SearchResults'), "design/ICON_info_off.gif", 14, 14);
		me.divPois = NewTag('div', me.div);
		AddCssClass(me.divPois, "poi_list")				
	}

	this.Unhide = function ()
	{
		if(me.div)
			Show(me.div);
	}

	this.Hide = function ()
	{
		if(me.div)
			Hide(me.div);
	}

	/// private:
	this.AddHeader = function (sCaption)
	{
		var divHeader = NewTag ("div", me.divPois);
		divHeader.className = "POIHeader";
		NewTextTag (sCaption, divHeader);
		return divHeader;
	}

	/// private:    
	/*this.AddPOI = function (pPoi, iIndex)
	{
		pPoi.pPOIBOX = me;
		var ptrVPLI = new VisualPoiListItem (me, iIndex, pPoi.strName);	
		pPoi.pVPLI = ptrVPLI;
		ptrVPLI.OnClickPOIName = pPoi.MouseClickEventHandler;
		ptrVPLI.OnMouseOverPOIName = pPoi.MouseOverEventHandler;
		ptrVPLI.OnMouseOutPOIName = pPoi.MouseOutEventHandler;
		ptrVPLI.OnClickLoupe = function () 
		{		
			me.pActualMarker = pPoi; 
			me.pMap.ZoomToPoint (pPoi.wgsX, pPoi.wgsY, 400); 
			window.setTimeout(function () {window.location="#idMap";}, 500);
		}

		
		ptrVPLI.Create();
	}*/

	/// private:    
	this.AddFindPoi = function (marker)
	{			
		var strPOIName = marker.GetLabelCaption();
		var iSerial = marker.GetProperty("pinnumber");
		var bDetailed = (marker == me.pMap.pActualMarker);
		var ptrVPLI = new VisualPoiListItem (marker, me, iSerial, strPOIName, bDetailed);
		
		marker.pVPLI = ptrVPLI;
		ptrVPLI.AddArrNames (marker.arrNames);
		ptrVPLI.AddArrValues (marker.arrValues);
		
				
		ptrVPLI.OnMouseOverPOIName =
			function ()
			{	
				if (me.pMap.pFixedMarker != marker)
				{
					me.pMap.iMustVisibleMarkerSID = 0;
					me.pMap.pFixedMarker = null;
				}
				
				//if (me.pMap.bFixedLabel == false)
				{
					me.pMap.RemovePinBoxes ();
					if (marker.pLabel != null)
						marker.pLabel.DrawBox (marker, me.pMap.divPoiParent);
				}
			}

		ptrVPLI.OnMouseOutPOIName =
			function ()
			{					
				{
					if (marker.pLabel)
						marker.pLabel.RemoveBox ();   
				}
			}

		ptrVPLI.OnClickPOIName =
			function ()
			{
				ptrVPLI.SwitchDetails();
			}

		// zoom to the point
		ptrVPLI.OnClickLoupe = function ()  
		{
			var ServerID = marker.GetProperty ("get_wgs_from_server");			
			
			if (ServerID != "???")
				me.pMap.iMustVisibleMarkerSID = ServerID;	
			else
			{
				marker.bLabelBoxMustBeVisible = true;
			}
			
			if (marker.HasWGSCoords())
			{				
				me.pMap.ZoomToPoint (marker.dX, marker.dY, 150); 
				window.setTimeout(function () {window.location="#idMap";}, 500);			
			}
			else if (ServerID != "???")
			{
				me.pMap.NoSessionServer.CallFunction ("SearchPoi", "iID=" + ServerID, 0, ptrVPLI.OnClickLoupe_Callback, null); 
			}								
		}
		
		ptrVPLI.OnClickLoupe_Callback = function (result, funcAfter)  
		{
			marker.dX = result.arrRecords[0].dX;
			marker.dY = result.arrRecords[0].dY;				
			me.pMap.ZoomToPoint (marker.dX, marker.dY, 400); 
			window.setTimeout(function () {window.location="#idMap";}, 500);	
			if (funcAfter != null)
				funcAfter();					
		}
		
		ptrVPLI.Create();
	}

	this.ResetFindPoi = function ()
	{		
		me.DeselectPOI ();
		me.Clear ();
		me.pMap.pMarkers.DeleteAllWithType ("findpoi");
	}

	this.ResetLayerPoi = function ()
	{		
		me.DeselectPOI ();
		me.Clear ();
	}

	/// public:
	this.AddPOIs = function (arrPOIRecords)
	{
		var panel = new Panel(me.divPois);
		panel.CreateCaption(arrPOIRecords.length + " " + g_Babel.GetWord('SearchResultCount'), "design/ICON_list_off.gif", 14, 14);
		
		DeleteChildren (me.pMap.pGridMain.mainGridDiv, "layerpoinumber");
		if (arrPOIRecords.length == 0)
		{		
		}
		else if (arrPOIRecords.length < 51)
		{
			var whitepanel = new WhitePanel(me.divPois);
			me.panelPoiList = new Panel(whitepanel.td);
			var i;
					
			me.pMap.pGridMain.mainGridDiv.style.visibility = "visible";
			
			for (i = 0; i < arrPOIRecords.length; i++)
			{
				var marker = arrPOIRecords[i];
				marker.SetProperty("pinnumber", i+1);

				me.AddFindPoi (marker);
				marker.pLabel.DrawSign();									
			}			
		}
		else if (arrPOIRecords.length >= 51)
		{
			var note = new Note(me.divPois);
			NewTextTag(g_Babel.GetWord("capProposal"), note.th);
			var ul = NewTag('ul', note.td);
			var li = NewTag('li', ul);
			NewTextTag (g_Babel.GetWord('NarrowTheResultSet'), li);
			var i;
			for (i = 0; i < arrPOIRecords.length; i++)
			{
				arrPOIRecords[i].pPOIBOX = me;
			}			
		}
	}

	this.WriteNoResultMessage = function ()
	{
		var note = new Note(me.divPois);
		NewTextTag(g_Babel.GetWord("capProposal"), note.th);
		var ul = NewTag('ul', note.td);
		var li = NewTag('li', ul);
		NewTextTag (g_Babel.GetWord('NoPoiWereFound'), li);
	}

	this.DeselectPOI = function ()
	{
		if (me.divSelectedPoi)
		{
			me.divSelectedPoi.style.color = me.sNormalPOIColor;
			me.divSelectedPoi.style.fontStyle = "Normal";
			me.divSelectedPoi.divLabel = null;
		}

		if (me.imgFocus)
		{
				if (me.imgFocus.parentNode != null)
						me.imgFocus.parentNode.removeChild (me.imgFocus);
				me.imgFocus = null;
		}

		if (me.divFocus)
		{
				if (me.divFocus.parentNode != null)
						me.divFocus.parentNode.removeChild (me.divFocus);

				me.divFocus = null;
		}

		me.divSelectedPoi = null;
	}
	
	this.IsSelected = function (divPOI)
	{
		return (divPOI == me.divSelectedPoi);
	}

	this.CreatePager = function (iFirst, iLast, bHasNextPage, iResultPerPages, iVisiblePages)
	{
		var divPager = NewTag ("div", me.div);
		var iStartPageNumber = Math.floor(iFirst / iResultPerPages) + 1;
		var iEndPageNumber = Math.floor(iLast / iResultPerPages) + 1;
		var iPagesNumber = iEndPageNumber;
		if (bHasNextPage) iPagesNumber = iPagesNumber + 1;
		me.pPager = new DrawPager (divPager, iVisiblePages, iStartPageNumber, iPagesNumber);
		return  me.pPager;	
	}

	this.OnChangeLang = function ()
	{
	}
	g_Babel.AddListener(this.OnChangeLang);

	this.OnPoiOnGridListChanged = function ()
	{
		me.ClearPoiList ();

		if (me.pMap)
			me.AddPOIs (me.pMap.GetPoisInView());
	}

	this.OnMarkerListChanged = function ()
	{
		var actualMarkerExists = false;
		me.ClearPoiList ();

		if (me.pMap)
		{
				var i;
				
				var whitepanel = new WhitePanel(me.divPois);
				me.panelPoiList = new Panel(whitepanel.td);				
				
				for (i = 0; i < me.pMap.pMarkers.arrMarkers.length; i++)
				{
						var marker = me.pMap.pMarkers.arrMarkers[i];
						if (marker == me.pMap.pActualMarker)
								actualMarkerExists = true;
						if (marker)
						{
								if ((marker.mainType == "findpoi"))
								{
										me.AddFindPoi (marker);
								}
						}
				}
		}
	}

	this.OnMapViewChanged = function ()
	{
		me.ClearPoiList ();
		if (me.pMap)
				me.AddPOIs (me.pMap.GetPoisInView());
	}

	this.ClearPoiList = function ()
	{
		if(me.divPois)
		{
			while (me.divPois.firstChild)
				me.divPois.removeChild (me.divPois.firstChild) ; 
		}
	}

	this.Clear = function ()
	{
		while (me.div.firstChild)
				me.div.removeChild (me.div.firstChild); 
		me.divPois = NewTag ('div', me.div);
	}    

	me.Init();
}


