/*
File Name: 米卡地图js
File URI: http://www.mikaa.cn/
Description: 
Author: 笑容
Version: 1.0
Author URI: http://www.oo8h.com/
*/

// 读入地图
function loadMap(lat,lng,fid,fpl)
{
	
	map=new GMap2($("map"));
	geocoder = new GClientGeocoder();
	// 地图控制器
	map.addControl(new GLargeMapControl());
	// 地图类型切换
	map.addControl(new GMapTypeControl());
	// 鹰眼
	map.addControl(new GOverviewMapControl());

	// 比例尺
	map.addControl(new GScaleControl());

	// 启用双击放大
	map.enableDoubleClickZoom();
	map.enableContinuousZoom();
	createIcon();
	var point;
	if(lat==0 || lng==0)
		//默认定位
		var point=new GLatLng(39.90604926575327,116.3917350769043);
	else
		point=new GLatLng(lat,lng);
	// map.setCenter(point, 14,G_SATELLITE_MAP);
	map.setCenter(point, 14,G_NORMAL_MAP);
	// 中文地图和实际GPS坐标系统差距较大，特别是经度校正，改以卫星地图为主
	// 修正，无奈以普通图为主吧，毕竟默认的Geo结果是以普通图为主的，为了兼容更多的Geo数据，忍痛了

	
	// 取页面上的经纬度值
	$("lonText").value=point.lng();
	$("latText").value=point.lat();

	// 显示级别
	if(fpl==0)
		fpl=5;
	map.setZoom(pl2Zoom(fpl));

	// 监听 各个 动作
	clickListener=GEvent.addListener(map, "click", showlatlng);	
	GEvent.addListener(map, "moveend", loadAp);
	GEvent.addListener(map, "zoomend", 
		function(oldZoomLevel,newZoomLevel)
		{
			if(oldZoomLevel<newZoomLevel)
				loadAp();
		}
	);
	resizeMap();
	selId=fid;
	loadAp();

}

// 自己设计的ICon, 这个应该是可以用Google的
function createIcon()
{
	pointicon = new GIcon();
	pointicon.image = "/img/point.png";
	pointicon.shadow = "/img/point_shadow.png";
	pointicon.iconSize = new GSize(12, 20);
	pointicon.shadowSize = new GSize(22, 20);
	pointicon.iconAnchor = new GPoint(6, 20);
	pointicon.infoWindowAnchor = new GPoint(5, 1);

}

// 载入小地图？
function loadSmallMap(lat,lng,id,title)
{
      if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map"));
		map.addControl(new GSmallZoomControl());
		map.addControl(new GScaleControl());
		map.disableDragging();
		var point=new GLatLng(lat,lng);
		//map.setCenter(point, 16,G_SATELLITE_MAP);
		map.setCenter(point, 15);
		createIcon();
		var opt=new Object();
		opt.title="点击在大图浏览"+title;
		opt.icon=pointicon;
		aMarker=new GMarker(point,opt);
		map.addOverlay(aMarker);
		//biaozhu=new Zbiaozhu(title,point);
		//map.addOverlay(biaozhu);

		Listener=GEvent.addListener(aMarker, "click", 
					function()
					{
						window.location.href="/map/"+id;
					}
		);

      }
}

// 显示 经纬度
function showlatlng(overlay, point)
{
	if(point)
	{
		$("lonText").value=point.lng();
		$("latText").value=point.lat();
	}
}

// 显示 panel 
function showPanels(n)
{
	if(n==0)
	{
		$('actionpanel').style.display='';
		$('aplist').style.display='none';
	}
	if(n==1)
	{
		$('actionpanel').style.display='none';
		$('aplist').style.display='';	
	}
}

// 增加点
function AddPoint()
{
	if($("appanel").style.display!="none")
	{
		if(!confirm("Don't save?"))
			return;	
	}
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	var point=new GLatLng($("lonText").value,$("latText").value);
	markerAP=new GMarker(point);
	map.addOverlay(markerAP);
	$("appanel").style.display="";
	$("AddButton").disabled=true;
	GEvent.removeListener(clickListener);
}

// 清除点
function clearAP()
{
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	resetAp();
}

// 保存点
function saveAP()
{
	if(trim($("ApName").value)=="")
	{
		alert("At Least please input name");
		return ;
	}
	var objHTTP = GXmlHttp.create();
	objHTTP.open('POST',"saveap.php",true);
	objHTTP.onreadystatechange = function() 
	{
		
		if (objHTTP.readyState == 4) 
		{
			var xmlDoc = objHTTP.responseXML;

			//GLog.write(objHTTP.responseText);


			var rets = xmlDoc.documentElement.getElementsByTagName("ret");
			if(rets.length>0)
			{
				ret=parseInt(rets[0].getAttribute("value"));
				loadAp();
				if(ret==1)
				{
					//GLog.write("Add OK!");
				}
			}
		}
	}
	
	objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	var ApName=$("ApName").value;
	var ApDesc=$("ApDesc").value;
	var Aplon=$("lonText").value;
	var Aplat=$("latText").value;
	
	objHTTP.send(
					"ApName="  + ApName +
					"&ApDesc=" + ApDesc + 
					"&Aplon="  + Aplon +
					"&Aplat="  + Aplat					
				);
  
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	resetAp();
}

// 复位 点
function resetAp()
{
	$("appanel").style.display="none";
	$("AddButton").disabled=false;
	$("ApName").value="";
	$("ApDesc").value="";	
	clickListener=GEvent.addListener(map, "click", showlatlng);
}

// 载入 点
function loadAp()
{

	//GLog.write(map.getZoom());
	var theBound=map.getBounds();
	var minX=theBound.getSouthWest().lng();
	var minY=theBound.getSouthWest().lat();
	var maxX=theBound.getNorthEast().lng();
	var maxY=theBound.getNorthEast().lat();
	var Plevel=getPlevel();
	var objHTTP = GXmlHttp.create();
	var	strloadap="/loadap.php?minX=" + minX + "&maxX="+ maxX +"&minY="+ minY +"&maxY=" + maxY + "&Plevel=" + Plevel;

	//GLog.write(strloadap);

	objHTTP.open('GET',strloadap,true);
	objHTTP.onreadystatechange = function() 
	{
		
		if (objHTTP.readyState == 4) 
		{
			var xmlDoc = objHTTP.responseXML;

			//GLog.write(objHTTP.responseText);
			
			var rets = xmlDoc.documentElement.getElementsByTagName("point");
			for(var i=0;i<rets.length;i++)
			{
				newMarker(rets[i]);
			}

			if(selId!=0)
			{
				OpenInfo(selId);
				selId=0;
			}
			$("markerpanel").innerHTML="<h3>周边地标点</h3>";
			for(var x in Markers)
			{
				var thismarker=Markers[x];
				if(thismarker.lon<minX || thismarker.lon >maxX || thismarker.lat<minY || thismarker.lat >maxY || thismarker.pl > getPlevel() )
				{
					delete Markers[x];
					GEvent.removeListener(thismarker.Listener);
					map.removeOverlay(thismarker.marker);
//					map.removeOverlay(thismarker.biaozhu);
				}
			}
			for(var x in Markers)
			{
				$("markerpanel").innerHTML+="<a href=\"javascript:OpenInfo(" + x + ");\">" + Markers[x].title +"</a>"
					+" <a id=\""+x+"\" href=\"" + Markers[x].purl + "\" title=\"用新窗口查看该地标详情_"+x+"\" target=\"_blank\"><img src=\"/img/newwin.gif\" border=\"0\"/></a> "
//					+"<a href=\"gearth.php?id=" + x +"\" title=\"在Google Earth里查看该地标\"><img src=\"/gearth.gif\" border=\"0\"/></a>"
					+"<br/>"
					;
			}
		}
	}
	objHTTP.send(null);
}

// 新标签
function newMarker(ret)
{
				var Marker;
				var title;
				var desc;

				var marker;
				var lat;
				var lon;
				var id;
				var Listener;
				var purl;
				var ph;
				var pw;
				var pl;

				id=parseInt(ret.getAttribute("id"));
				if(Markers[id]==null)
				{
					lon=parseFloat(ret.getAttribute("x"));
					lat=parseFloat(ret.getAttribute("y"));
					title=unescape(ret.getAttribute("title"));
					
					purl=ret.getAttribute("purl");
					ph=parseInt(ret.getAttribute("ph"));
					pw=parseInt(ret.getAttribute("pw"));
					pl=parseInt(ret.getAttribute("pl"));

					desc="";
					try{desc=decodeURIComponent(ret.getAttribute("desc"));}
					catch(e){}
					var opt=new Object();
					opt.title=title;
					opt.icon=pointicon;
					point=new GLatLng(lat,lon);
					marker=new GMarker(point,opt);
					Listener=GEvent.addListener(marker, "click", 
						function()
						{
							OpenInfo(id);
						}
					);
					map.addOverlay(marker);
					//biaozhu=new Zbiaozhu(title,point);
					//map.addOverlay(biaozhu);
					Marker=new TMarker(id,lon,lat,title,desc,marker,Listener,purl,ph,pw,pl);
					Markers[id]=Marker;
				}
	
}


function OpenInfo(id)
{

	for(var x in Markers)
	{
		if(x==id)
		{	
			var dinfo= 	 
					"<b>"
					+"<a href=\"" + Markers[x].purl + "\" title=\"查看该地标详情\" target=\"_blank\">" + Markers[x].title + "</a> "
					+"<a href=\"" + Markers[x].purl + "\" title=\"用新窗口查看该地标详情\" target=\"_blank\"><img src=\"/img/newwin.gif\" border=\"0\"/></a> "
//					+"<a href=\"http://www.zmap.org/gearth.php?id=" + id +"\" title=\"在Google Earth里查看该地标\"><img src=\"http://www.zmap.org/gearth.gif\" border=\"0\"/></a>"
					+"</b><br/><div style=\"width:280px;max-height:160px;font-size:9pt;overflow-x:hidden;overflow-y:auto;\">";
			//if(Markers[x].purl!="")
			// 原来 purl 本来是放 picture url的啊，呵呵 我給改为 point url 了
			if(false)
			{
				dinfo = dinfo + "<a href=\"p/" + id + ".html\" target=\"_blank\"><img src=\"" + Markers[x].purl + "\" ";
				if(Markers[x].ph>Markers[x].pw)
					dinfo = dinfo + "height=\"150\" ";
				else
					dinfo = dinfo + "width=\"150\" ";
				dinfo = dinfo + "style=\"float:left;margin:2px;\" /></a>"
			}
			dinfo	= dinfo + decodeURIComponent(Markers[x].desc) +"</div>";	
			Markers[x].marker.openInfoWindowHtml(dinfo);
			return;
		}
	}
}
function TMarker(id,lon,lat,title,desc,marker,Listener,purl,ph,pw,pl)
{
	this.id	 = id;
	this.lon = lon;
	this.lat = lat;
	this.title = title;
	this.desc = desc;
	this.marker = marker;
	this.Listener = Listener;
	this.purl=purl;
	this.ph=ph;
	this.pw=pw;
	this.pl=pl;
}
function setSearchAlert(info)
{
	$("infoSpan").innerHTML="<font color=\"red\">" + info + "</font>";
}
function setSearchInfo(info)
{
	$("infoSpan").innerHTML="<font color=\"green\">" + info + "</font>";
}

function SearchPos()
{
	$("infoSpan").innerHTML="";
	if($("searchBox").value=="")
	{
		setSearchAlert("请先输入您要查找的地址！");
		return;
	}

	var address= $("searchBox").value;
		
	pointSearch(address);
}

function SearchPosGeo(address)
{
	// 为了兼容以后的开发而准备的，因为目前的Google的APIGeo还不能友好的支持中文Geo
	
	geocoder.getLatLng(
			address, 	
			function(point) 
			{
				if (!point) 
				{
					setSearchAlert("无法找到\"" + address + "\"");
				} 
				else 
				{
				        map.setCenter(point, 13);
				        var marker = new GMarker(point);
			        	map.addOverlay(marker);
				        marker.openInfoWindowHtml(address);
				}
		
			} );
}

function pointSearch(address)
{	

	var objHTTP = GXmlHttp.create();
	objHTTP.open('POST',"/searchap.php",true);

	objHTTP.onreadystatechange = function() 
	{
		
		if (objHTTP.readyState == 4)
		{
			var xmlDoc = objHTTP.responseXML;

			// GLog.write(objHTTP.responseText);
			// 如果 自己的搜索 搜索不到合适的结果 出错，那么使用Google的Geo

			if(!xmlDoc)
			{	
				SearchPosGeo(address);
				return 0;
			}

			// 如果没有出错， 而返回ret ＝ 1 表示 没有搜索到结果，那么尝试 GoogleGeo
			var rets = xmlDoc.documentElement.getElementsByTagName("rets");

			if(rets.length>0)
			{
				if(parseInt(rets[0].getAttribute("ret"))==1)
				{
					SearchPosGeo(address);
					return 0;
					// 这一步因return 没有机会执行到。
					//map.setCenter(point);
				}
			}

			// 如果找到了， 返回 第一个节点
			// 以后可以考虑把结果 返回到 增加一个 panel 叫 搜索结果

			var viewport = xmlDoc.documentElement.getElementsByTagName("point");
			
			if(viewport.length>0)
			{		
				var viewportlat;
				var viewportlon;
				var id;
				var title;
				var desc;
				viewportlon=parseFloat(viewport[0].getAttribute("x"));
				viewportlat=parseFloat(viewport[0].getAttribute("y"));
				id=parseInt(viewport[0].getAttribute("id"));
				title=viewport[0].getAttribute("title");
				desc=viewport[0].getAttribute("desc");
				// setSearchInfo("您要找的位置在经度："+viewportlon+"，纬度："+viewportlat);
				map.setCenter(new GLatLng(viewportlat,viewportlon));
				loadAp();
				// alert(id);
				OpenInfo(id);
				map.openInfoWindowHtml(new GLatLng(viewportlat,viewportlon),
			                   "<h3>" + title + "</h3>" + decodeURIComponent(desc));	

				if(viewport.length>1)
				{
					// GLog.write(viewport.length);
					$("searchlist").innerHTML = "<h3> 搜索" + address + "的结果</h3>";

					for(var x=0;x<viewport.length;x++)
					{
						$("searchlist").innerHTML+="<a href=\"javascript:flyTo(" + viewport[x].getAttribute("y") + "," + viewport[x].getAttribute("x") + "," + viewport[x].getAttribute("id") + ",5);\">" + viewport[x].getAttribute("title") +"</a>"
							+" <a href=\"" + viewport[x].getAttribute("purl") + "\" title=\"用新窗口查看该地标详情\" target=\"_blank\"><img src=\"/img/newwin.gif\" border=\"0\"/></a> "
		//					+"<a href=\"gearth.php?id=" + x +"\" title=\"在Google Earth里查看该地标\"><img src=\"/gearth.gif\" border=\"0\"/></a>"
							+"<br/>"
							;
					}
					$("searchlist").innerHTML+='<input type="button" value="清除搜索结果" onclick="javascript:$(\'searchlist\').style.display =\'none\';">';
					$("searchlist").style.display ='block';


				}
				
			}
			else
			{
				SearchPosGeo(address);
				return 0;
			}
		}
	}
	objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	objHTTP.send("q=" + address);
}

function resizeMap()
{
	$("map").style.height=getWindowHeight()-110+"px";
	map.checkResize();
	loadAp();
	$("aplist").style.height=getWindowHeight()-110+"px";
	$("actionpanel").style.height=getWindowHeight()-110+"px";
}

function getWindowHeight() 
{
	if(window.self && self.innerHeight)
		 {return self.innerHeight;}
	if (document.documentElement && document.documentElement.clientHeight) 
		{return document.documentElement.clientHeight;}
	return 0;
}
function getWindowWidth() 
{
	if(window.self && self.innerWidth)
		 {return self.innerWidth;}
	if (document.documentElement && document.documentElement.clientWidth) 
		{return document.documentElement.clientWidth;}
	return 0;
}

function goLatLng()
{
	map.panTo(new GLatLng($("latText").value,$("lonText").value));
}

function flyTo(lat,lng,id,pl)
{
	map.setZoom(pl2Zoom(pl));
	map.panTo(new GLatLng(lat,lng));
	selId=id;
}

function onSearchKeyDown(e)
{
	if(window.event) // IE
	{
		keynum = e.keyCode
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which
	}
	if(keynum==13)
		SearchPos();
}

function getPlevel()
{
	var ZoomLevel=map.getZoom();
	if(ZoomLevel>=17)
		return 6;
	if(ZoomLevel>=14)
		return 5;
	if(ZoomLevel>=11)
		return 4;
	if(ZoomLevel>=5)
		return 3;
	if(ZoomLevel>=3)
		return 2;
	return 1;
}
function pl2Zoom(pl)
{
	switch(pl)
	{
		case 6:
			return 17;
		case 5:
			return 14;
		case 4:
			return 11;
		case 3:
			return 5;
		case 2:
			return 3;
		case 1:
			return 1;
		case 0:
			return 1;
		default:
			return 14;
	}
}
