function showInputInfoWin()
{
	var infoWin='<div id="inputInfoWin" style="height:130px;">';
	if(loginName=="")
		infoWin+=getLoginHtml();
	else
		infoWin+=getNewPointHtml();
	infoWin += '</div>';
	npoint.openInfoWindowHtml(infoWin);
}
function newPoint(overlay, point)
{
	if(point)
	{
		if(!npoint)
		{
			npoint=new GMarker(point);
			GEvent.addListener(npoint, "click", showInputInfoWin);
		}
		else
			npoint.setLatLng(point);
		if(npoint.hide)
			npoint.show();
		map.addOverlay(npoint);
		showInputInfoWin();
	}
}
function getNewPointHtml()
{
	var html=	'<table align="center">' +
	'<tr><td width="60">地点名</td><td><input type="text" size="24" id="js_title" onkeydown="inputKeyDown(event,0);"//></td></tr>' +
	'<tr><td width="60" valign="top">简　介</td><td><textarea  cols="20" rows="4" id="js_desc"></textarea></td></tr>' +
	'<tr><td colspan="2" align="center"><input type="submit" value="保存" onclick="savePoint();"/>' +'</td></tr>' +
	'</table>';
	return html;
}
function getSavePointId(ret)
{
	  var re = new RegExp("^id=(\\d+)$");
	  var m = re.exec(ret);
	  if (m == null)
	    return "";
	  else
		return m[1];
}
function savePoint()
{
	var title=ge("js_title").value;
	var content=ge("js_desc").value;
	if(trim(title)=="" || trim(content)=="")
	{
		alert("标题和内容都不能留空！");
		return;
	}
	var pos=npoint.getLatLng();
	var x=pos.lng();
	var y=pos.lat();
	ge("inputInfoWin").innerHTML="保存中，请稍候……";
	var objHTTP = GXmlHttp.create();
	var	url="jsSavePoint.php";
	objHTTP.open("POST",url,true);
	objHTTP.onreadystatechange = function() 
	{
		if (objHTTP.readyState == 4) 
		{
			var ret = objHTTP.responseText;
			var id=getSavePointId(ret);
			if(id!="")
			{
				ge("inputInfoWin").innerHTML="地点添加成功，<a target=\"_blank\" href=\"/p/"+ id +  ".html\">点击此处继续完善该地点信息</a>，或者添加其他的地点。";
				loadAp();
				npoint.hide();
			}
			else
			{
				ge("inputInfoWin").innerHTML="添加失败，请重试，如果还有问题请联系管理员 tinyfool@gmail.com";
			}
		}
	};
	objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	objHTTP.send( 	"title=" + title +
					"&content=" + content +
					"&x=" + x +
					"&y=" + y
	);
}
function getName(ret)
{
	  var re = new RegExp("^name=(.*)$");
	  var m = re.exec(ret);
	  if (m == null)
	    return "";
	  else
		return m[1];
}
function jsLogin()
{
	var user=ge("js_name").value;
	var pass=ge("js_pass").value;
	ge("inputInfoWin").innerHTML="登入中，请稍候……";
	var objHTTP = GXmlHttp.create();
	var	url="jsLogin.php";
	objHTTP.open("POST",url,true);
	objHTTP.onreadystatechange = function() 
	{
		if (objHTTP.readyState == 4) 
		{
			
			var ret = objHTTP.responseText;
			var name=getName(ret);
			if(name!="")
			{
				ge("inputInfoWin").innerHTML="登入成功！"+getNewPointHtml();
				loginName=name;
			}
			else
			{
				ge("inputInfoWin").innerHTML=
					'<span style="color:red;">登入失败，请重试！</span>'+getLoginHtml();
			}
		}
	};
	objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	objHTTP.send("user="+user+"&pass="+pass);
}
function inputKeyDown(e,i)
{
	var keynum;
	var keychar;
	var numcheck;

	if(window.event) // IE
	{
	keynum = e.keyCode;
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
	keynum = e.which;
	}
	if(keynum==13)
	{
		if(i==1)
			jsLogin();
		else
			ge("js_pass").focus();
	}
}
function getLoginHtml()
{
	var html=	'<table align="center">' +
				'<tr><td colspan="2" align="center">只有登入以后才能标注地点！</td></tr>' +
				'<tr><td width="60">用户名</td><td><input type="text" size="12" id="js_name" onkeydown="inputKeyDown(event,0);"//></td></tr>' +
				'<tr><td width="60">密　码</td><td><input type="password" size="12" id="js_pass" onkeydown="inputKeyDown(event,1);"/></td></tr>' +
				'<tr><td colspan="2" align="center"><input type="submit" value="登入" onclick="jsLogin();"/>' +
				'<a href="http://www.zmap.org/reg.php" target="_blank"><input type="button" value="免费注册"/></a>' +
				'</td>' +
				'</table>';
	return html;
}
function ToolBarControl(){}
ToolBarControl.prototype = new GControl();
ToolBarControl.prototype.initialize = function(map) {
	var toolbar=this;
	ToolBarControl.prototype.stat=0;
	var container = document.createElement("div");
	var addPointButton = document.createElement("div");
	this.initButton(addPointButton, "addpoint.png", "新增标注");
	container.appendChild(addPointButton);
	GEvent.addDomListener(addPointButton, "click", function() {
		if(toolbar.stat==0)
		{
			toolbar.stat=1;
			toolbar.setButtonStyle(addPointButton, 1);
			GEvent.removeListener(clickListener);
			clickListener=GEvent.addListener(map, "click", newPoint);
		}
		else
		{
			toolbar.stat=0;
			toolbar.setButtonStyle(addPointButton, 0);
			GEvent.removeListener(clickListener);
			npoint.closeInfoWindow();
			npoint.hide();
			clickListener=GEvent.addListener(map, "click", showlatlng);
		}
	});
	map.getContainer().appendChild(container);
	return container;
}
ToolBarControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(120,6));
}
ToolBarControl.prototype.setButtonStyle = function(button,style)
{
	if(style==1)
	{
//		  button.style.borderLeft	="2px solid black";
//		  button.style.borderTop	="2px solid black";
//		  button.style.borderRight	="2px solid #cccccc";
//		  button.style.borderBottom	="2px solid #cccccc";
//		  button.style.backgroundColor="#eeeeee";
		  button.style.backgroundImage="url(/img/toolbar/buttonsel.png)";

	}
	else
	{
		  button.style.backgroundImage="url(/img/toolbar/buttonback.png)";
//		  button.style.backgroundColor = "white";
//		  button.style.borderLeft	="2px solid #cccccc";
//		  button.style.borderTop	="2px solid #cccccc";
//		  button.style.borderRight	="2px solid black";
//		  button.style.borderBottom	="2px solid black";		
	}
}
ToolBarControl.prototype.initButton = function(button,img,title) 
{
	  button.style.color = "black";
	  button.style.fontSize="11pt";
	  
	  //button.style.backgroundColor = "white";
	  button.style.backgroundImage="url(/img/toolbar/buttonback.png)";
	  button.style.backgroundRepeat="repeat-x";
	  button.style.border	="1px solid black";

//
//	  button.style.borderLeft	="2px solid #cccccc";
//	  button.style.borderTop	="2px solid #cccccc";
//	  button.style.borderRight	="2px solid black";
//	  button.style.borderBottom	="2px solid black";
	  
	  button.style.padding = "2px";
	  button.style.marginBottom = "3px";
	  button.style.cursor = "pointer";
	  button.innerHTML="<img src=\"/img/toolbar/" + img + "\" />" + title;
}


function loadMap(lat,lng,fid,fpl)
{
	
	map=new GMap2(ge("map"));		
	var publisherID = 'ca-pub-7732761529337293';
     var adsManagerOptions = {
       maxAdsOnMap : 2,
       style: 'adunit',
       channel: '3319591502'  
     };
    adsManager = new GAdsManager(map, publisherID, adsManagerOptions);
    adsManager.enable();
    
	map.removeMapType(G_HYBRID_MAP);
	geocoder = new GClientGeocoder();
	map.addControl(new GLargeMapControl3D());
	map.addControl(new ToolBarControl());
	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);
	ge("lonText").value=point.lng();
	ge("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();
}
function createIcon()
{
	pointicon = new GIcon();
	pointicon.image = "http://www.zmap.org/img/point.png";
	pointicon.shadow = "http://www.zmap.org/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(x,y,id,title)
{
	mapdiv=ge("map");
	map=new GMap2(mapdiv);
	map.addControl(new GSmallZoomControl());
	map.addControl(new GScaleControl());
	map.disableDragging();
	var point=new GLatLng(y,x);
	map.setCenter(point, 16,G_SATELLITE_MAP);
	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="/?lat="+y+"&lng="+x+"&id="+id;
				}
	);
}

function showlatlng(overlay, point)
{
	if(point)
	{
		ge("lonText").value=point.lng();
		ge("latText").value=point.lat();
	}
}

function showPanels(n)
{
	if(n==0)
	{
		ge('actionpanel').style.display='';
		ge('aplist').style.display='none';
	}
	if(n==1)
	{
		ge('actionpanel').style.display='none';
		ge('aplist').style.display='';	
	}
}
function AddPoint()
{
	if(ge("appanel").style.display!="none")
	{
		if(!confirm("Don't save?"))
			return;	
	}
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	var point=new GLatLng(ge("lonText").value,ge("latText").value);
	markerAP=new GMarker(point);
	map.addOverlay(markerAP);
	ge("appanel").style.display="";
	ge("AddButton").disabled=true;
	GEvent.removeListener(clickListener);
}

function clearAP()
{
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	resetAp();
}
function saveAP()
{
	if(trim(ge("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;
			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=ge("ApName").value;
	var ApDesc=ge("ApDesc").value;
	var Aplon=ge("lonText").value;
	var Aplat=ge("latText").value;
	
	objHTTP.send(
					"ApName="  + ApName +
					"&ApDesc=" + ApDesc + 
					"&Aplon="  + Aplon +
					"&Aplat="  + Aplat					
				);
  
	if(markerAP!=0)
	{
		map.removeOverlay(markerAP);
	}
	resetAp();
}

function resetAp()
{
	ge("appanel").style.display="none";
	ge("AddButton").disabled=false;
	ge("ApName").value="";
	ge("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="loadap2.php?minX=" + minX + "&maxX="+ maxX +"&minY="+ minY +"&maxY=" + maxY + "&Plevel=" + Plevel;
	//GLog.write("http://www.zmap.org/"+strloadap);
	objHTTP.open('GET',strloadap,true);
	objHTTP.onreadystatechange = function() 
	{
		
		if (objHTTP.readyState == 4) 
		{
			var xmlDoc = objHTTP.responseXML;
			
			var rets = xmlDoc.documentElement.getElementsByTagName("point");
			for(var i=0;i<rets.length;i++)
			{
				newMarker(rets[i]);
			}
			if(selId!=0)
			{
				OpenInfo(selId);
				selId=0;
			}
			ge("markerpanel").innerHTML="<h3>Markers</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)
			{
				ge("markerpanel").innerHTML+="<a href=\"javascript:OpenInfo(" + x + ");\">" + Markers[x].title +"</a>"
//					+"<a href=\"p/" + x + ".html\" title=\"用新窗口查看该地标详情\" target=\"_blank\"><img src=\"/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=unescape(ret.getAttribute("desc"));}
					catch(e){}
					
					var opt=new Object();
					opt.title=title;
					opt.icon=pointicon;
					//opt.draggable=true;
					
					point=new GLatLng(lat,lon);
					marker=new GMarker(point,opt);
				
					Listener=GEvent.addListener(marker, "click", 
						function()
						{
							OpenInfo(id);
						}
					);
					map.addOverlay(marker);
					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=\"p/" + id + ".html\" title=\"查看该地标详情\" target=\"_blank\">" + Markers[x].title + "</a> "
//					+"<a href=\"p/" + id + ".html\" title=\"用新窗口查看该地标详情\" target=\"_blank\"><img src=\"/newwin.gif\" border=\"0\"/></a> "
//					+"<a href=\"gearth.php?id=" + id +"\" title=\"在Google Earth里查看该地标\"><img src=\"/img/gearth.gif\" border=\"0\"/></a>"
					+"</b><br/>";
//			if(Markers[x].purl!="")
//			{
//				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>"
//			}
			if(Markers[x].desc.length>0)
			{
				dinfo = dinfo + "<div style=\"width:280px;max-height:160px;font-size:9pt;overflow-x:hidden;overflow-y:auto;\">";
				dinfo = dinfo + Markers[x].desc;
				dinfo = dinfo + "</div>"
			}
			else
			{
				dinfo = dinfo + "<p>该地点暂无描述，欢迎<a href=\"/pointedit.php?id=" + id +"\" target=\"_blank\">编辑该地点</a></p>";
			}
			dinfo = dinfo + "<div style=\"text-align:right;font-size:9pt;\"><a href=\"p/" + id + ".html\" target=\"_blank\">查看全文</a> | ";
			dinfo = dinfo + "<a href=\"p/" + id + ".html#newpost\" target=\"_blank\">参与讨论</a></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)
{
	ge("infoSpan").innerHTML="<font color=\"red\">" + info + "</font>";
}
function setSearchInfo(info)
{
	ge("infoSpan").innerHTML="<font color=\"green\">" + info + "</font>";
}

function SearchPos()
{
	ge("infoSpan").innerHTML="";
	if(ge("searchBox").value=="")
	{
		setSearchAlert("请先输入您要查找的地址！");
		return;
	}

	var address= ge("searchBox").value;
		
	pointSearch(address);
}

function SearchPosGeo(address)
{
	
	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;
			if(!xmlDoc)
			{	
				SearchPosGeo(address);
				return 0;
			}
			var rets = xmlDoc.documentElement.getElementsByTagName("ret");

			if(rets.length>0)
			{
				if(parseInt(rets[0].getAttribute("err"))==1)
				{
					SearchPosGeo(address);
					return 0;
					map.setCenter(point);
				}
			}

			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();
				OpenInfo(id);
				map.openInfoWindowHtml(new GLatLng(viewportlat,viewportlon),
			                   "<h3>" + title + "</h3>" + desc);	
				
			}
			else
			{
				SearchPosGeo(address);
				return 0;
			}
		}
	}
	objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	objHTTP.send("q=" + address);
}

function resizeMap()
{
	var offset=90;
	ge("map").style.height=getWindowHeight()-offset+"px";
	map.checkResize();
	loadAp();
	ge("aplist").style.height=getWindowHeight()-offset+"px";
	ge("actionpanel").style.height=getWindowHeight()-offset+"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 showhideHelp()
{
	ge("helpdiv").style.left=(getWindowWidth()-500)/2+"px";
	if(ge("helpdiv").style.display=="none")
		ge("helpdiv").style.display="";
	else
		ge("helpdiv").style.display="none";
}
function goLatLng()
{
	map.panTo(new GLatLng(ge("latText").value,ge("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;
	}
}
///-----
function ge(id){return document.getElementById(id);}
function trim(str){return str.replace(/^\s*|\s*$/g,"");}
///-----
function Zbiaozhu(biaozhu,pt){this.biaozhu_=biaozhu;this.pt_=pt;}
Zbiaozhu.prototype = new GOverlay();
Zbiaozhu.prototype.initialize = function(map)
{
	var div=document.createElement("div");
	div.style.border = "1px solid red";
	div.style.background="yellow";
    div.style.position = "absolute";
	map.getPane(G_MAP_MAP_PANE).appendChild(div);
	div.innerHTML="<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td nowrap=\"nowrap\" style=\"font-size:9pt;\">" + this.biaozhu_+"</td></tr></table>";
	this.map_ = map;
	this.div_ = div;
}
Zbiaozhu.prototype.remove = function(){this.div_.parentNode.removeChild(this.div_);}
Zbiaozhu.prototype.copy = function(){return new Zbiaozhu(this.biaozhu_);}
Zbiaozhu.prototype.redraw = function(force){
	if (!force) return;
	var c = this.map_.fromLatLngToDivPixel(this.pt_);
	this.div_.style.left = (c.x + 3) + "px";
	this.div_.style.top = (c.y - 10) + "px";
}
