var currentSearch={response:null,addresses:[]};

function searchSetup()
{
}


function searchAddToNodes(entry,type,event)
{
	if(mapNodes[currentNode].isPreset || mapNodes[currentNode].isPresetRoot)
	{
	}
	else
	{
		var geo=currentSearch.addresses[entry]
		var parts=geo.parts
		var node
		switch(type)
		{
			case 'marker':
				node=nodesAddMarkerNode(event,(parts.Accuracy<2)?parts.address:geo,geo,map.zoom,parts.Point)
			break;
			case 'overlay':
				node=nodesAddOverlayNode(event,(parts.Accuracy<2)?parts.address:geo,geo,map.zoom,parts.Point,(parts.Accuracy<2)?parts.address:geo)
			break;
			case 'polygon':
				node=nodesAddPolygonNode(event,(parts.Accuracy<2)?parts.address:geo,geo,map.zoom,parts.Point)
			break;
			case 'group':
				node=nodesAddGroupNode(event,(parts.Accuracy<2)?parts.address:geo,geo,map.zoom,parts.Point)
			break;
		}
		mapNodes[node].xAL=currentSearch.addresses[entry].parts;
	}
}

function searchCenterOnMap(entry)
{
	var place=window.currentSearch.response.Placemark[entry]
	var point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
	gmap.setCenter(point);
}

function searchPut(response)
{
	if(response && response.Status.code==200)
	{
		currentSearch.response=response;
		currentSearch.addresses=[]

		var out='<TABLE CLASS="layout">';
		var address=null
		var geo,parts
		var places=response.Placemark;
		for(x in places)
		{
			geo=currentSearch.addresses[x]=new GeoCoderAddress(places[x]);
			parts=geo.parts;
			out+='<TR><TD>'
			+((parts.Accuracy<2)?parts.address:geo)
			+'</TD><TD>'
			+'<SPAN CLASS="nodeLatLng"><IMG CLASS="nodeLatLngIcon"'
			+' onClick="searchCenterOnMap('+x+')"'
			+' onMouseOver="searchShowInfo(\'latLng\','+x+',event)"'
			+' onMouseMove="moveInfo(event)"'
			+' onMouseOut="searchHideInfo()"'
			+' ALIGN="absmiddle" SRC="gfx/dummy.gif" BORDER="0"></SPAN>'
			+'</TD><TD>'
			+'<BUTTON ID="markerAdd" onMouseOver="searchShowInfo(\'nodesAddMarkerNode\','+x+',event)" onMouseMove="moveInfo(event)" onMouseOut="searchHideInfo()" onClick="searchAddToNodes('+x+',\'marker\',event)">Add Marker</BUTTON>'
			+'</TD><TD><BUTTON ID="addPolygon" onMouseOver="searchShowInfo(\'nodesAddPolygonNode\','+x+',event)" onMouseMove="moveInfo(event)" onMouseOut="searchHideInfo()" onClick="searchAddToNodes('+x+',\'polygon\',event)">Add Polygon</BUTTON>'
			+'</TD><TD><BUTTON ID="overlayAdd" onMouseOver="searchShowInfo(\'nodesAddOverlayNode\','+x+',event)" onMouseMove="moveInfo(event)" onMouseOut="searchHideInfo()" onClick="searchAddToNodes('+x+',\'overlay\',event)">Add Overlay</BUTTON>'
			+'</TD><TD><BUTTON ID="addGroup" onMouseOver="searchShowInfo(\'nodesAddGroupNode\','+x+',event)" onMouseMove="moveInfo(event)" onMouseOut="searchHideInfo()" onClick="searchAddToNodes('+x+',\'group\',event)">Add Group</BUTTON>'
			+'</TD></TR>'
		}
		out+='</TABLE>'
		document.getElementById('searchResults').innerHTML=out;
	}
	else
	{
		document.getElementById('searchResults').innerHTML='<FONT COLOR="red">'+getGeoCoderError(response.Status.code)+'</FONT>'
		document.getElementById('search').focus()
	}
	
}

function searchStart(address)
{
	if(!address)address=document.getElementById('searchInput').value;
	geocoder.getLocations(address,searchPut);
	document.getElementById('searchResults').innerHTML='searching...'
}

function GeoCoderAddress(place)
{
	this.parts={
		address:''
		,Accuracy:''
		,ThoroughfareName:''
		,PostalCodeNumber:''
		,LocalityName:''
		,DependentLocalityName:''
		,SubAdministrativeAreaName:''
		,AdministrativeAreaName:''
		,CountryName:''
		,CountryNameCode:''
		}
	this.parsedAddress='';
	if(place)
	{
		this.parseDetails(place)
	}
}

GeoCoderAddress.prototype.toString=function GeoCoderAddress_toString()
{
	var x;
	var str='';
	var count=0;
	for(x in this.parts)
	{
		switch(x)
		{
			case 'address':
			case 'Accuracy':
			case 'Point':
			break;
			case 'SubAdministrativeAreaName':
				if(this.parts[x]==this.parts['LocalityName'])break;
			default:
			if(this.parts[x])str+=((count++)?', ':'')+this.parts[x];
		}
	}
	return this.parsedAddress=str;
}

GeoCoderAddress.prototype.parseDetails=function GeoCoderAddress_parseDetails(details)
{
	var obj=null;
	var x
	for(x in details)
	{
		if(x=='Point')
		{
			 this.parts.Point=new GLatLng(details[x].coordinates[1],details[x].coordinates[0])
		}
		else
		{
			obj=details[x];
			if(typeOf(obj)=='object')this.parseDetails(obj)
			else 
			{
				if(this.parts[x]!=undefined)this.parts[x]=obj;
			}
		}
	}
}

function searchShowInfo(topic,node,e)
{
	var nodeObj=mapNodes[currentNode]
	var out='';
	moveInfo(e)
	switch(topic)
	{
		case 'latLng':
			out='<IMG CLASS="nodeLatLngIcon" ALIGN="absmiddle" SRC="gfx/dummy.gif" BORDER="0">&nbsp;<U>Latitude:</U> '+formatLat(currentSearch.addresses[node].parts.Point.lat())+'<BR>'
			+'<IMG CLASS="nodeDummyIcon" ALIGN="absmiddle" SRC="gfx/dummy.gif" BORDER="0">&nbsp;<U>Longitude:</U> '+formatLng(currentSearch.addresses[node].parts.Point.lng())
		break;
		case 'nodesAddMarkerNode':
			if(markerPreset)
			{	
				out='<B>Preset settings:</B><BR>'
				+markerGetPresetInfo()
			}
		break;
		case 'nodesAddOverlayNode':
			if(markerPreset)
			{	
				out='<B>Preset settings:</B><BR>'
				+overlayGetPresetInfo()
			}
		break;
		case 'nodesAddPolygonNode':
			if(markerPreset)
			{	
				out='<B>Preset settings:</B><BR>'
				+polygonGetPresetInfo()
			}
		break;
		case 'nodesAddGroupNode':
			if(markerPreset)
			{	
				out='<B>Preset settings:</B><BR>'
				+groupGetPresetInfo()
			}
		break;
	}
	var info=document.getElementById('info')
	if(out)
	{
		info.innerHTML=out;
		moveInfo(e)
		info.style.zIndex=sectionGroupsCount+1
		info.style.visibility='visible';
	}
	else info.style.visibility='hidden';
	searchShowStatus(topic,node)
}

function searchShowStatus(topic,node)
{
	var	nodeObj=mapNodes[currentNode]
	var out='';
	switch(topic)
	{
		case 'latLng':
			out='<U>Click:</U> Center on map'
			currentSearch.addresses[x]
		break;
		case 'nodesAddMarkerNode':
			out='<U>Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add first child.':'Add next.')
			+' <U>Shift-Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add last child.':'Add previous.')
		break;
		case 'nodesAddGroupNode':
			out='<U>Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add first child.':'Add next.')
			+' <U>Shift-Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add last child.':'Add previous.')
		break;
		case 'nodesAddOverlayNode':
			out='<U>Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add first child.':'Add next.')
			+' <U>Shift-Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add last child.':'Add previous.')
		break;
		case 'nodesAddPolygonNode':
			out='<U>Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add first child.':'Add next.')
			+' <U>Shift-Click:</U> '
			+((nodeObj.type=='group' && !nodeObj.isPreset)?'Add last child.':'Add previous.')
		break;
	}
	if(out)
	{
		sections.search.putStatusText(out,0)			
	}
}

function searchHideInfo(section)
{
	document.getElementById('info').style.visibility='hidden'
	sections.search.clearStatusText()
}