/*
key for www.waytogo.idv.tw ABQIAAAAeyajz_ChWIgx7qW0NcjZvRQcauK1jmQXskylhG7AsFQgDCtN7RS-rvPnKwyATHI3D9wp9UxQE6gqIw
key for waytogo.donghong.info ABQIAAAAeyajz_ChWIgx7qW0NcjZvRQcauK1jmQXskylhG7AsFQgDCtN7RS-rvPnKwyATHI3D9wp9UxQE6gqIw
key for way2go ABQIAAAAeyajz_ChWIgx7qW0NcjZvRQ6SJosiJrHsuqlkUKMynzTRegVKhTZOZjU5ckJmxmsNdzE_hpdSqSwbQ
key for living.donghong.info ABQIAAAAeyajz_ChWIgx7qW0NcjZvRRDDr-zsLNGwKw-8mv4TnKoHoYpShSxJtcNN_6qeelPh3HRmjGiTUMvzA
key for www.waytogo.cc ABQIAAAAeyajz_ChWIgx7qW0NcjZvRRtuAOJocxCE1moHPb3ptmvN3mqrhR1J3E8f02YyrJud2lzTzBJs_iNpA
key for gallery.waytogo.cc ABQIAAAAeyajz_ChWIgx7qW0NcjZvRQ5dLD1FlF6ZKh5YdWBmvhK_7snfxRyPlwySqtFoeceeSVLAfPgTTDi1w
*/
var gmap =null;
var xwpobj = null;

function initgmap() 
{ 
        if(GBrowserIsCompatible())
        {
            if(gmap ==null)
            {
            	document.getElementById("divmapcanvas").style.display="";
            	document.getElementById("gmlresults").style.display="";
            	document.getElementById("gmlresults").innerHTML="載入中...";
            	
            	var argv = initgmap.arguments;
 		var argc = initgmap.arguments.length;
  		var lat = (argc > 0) ? argv[0] : 23.81849;
  		var lng = (argc > 1) ? argv[1] : 120.96956;
  		var zlevel = (argc > 2) ? argv[2] : 7;
            	
            	gmap = new CGMapObj("divmapcanvas", lat, lng, zlevel);
            }			
        }        
}


//used for homepage first load to render waypoints from a previous stored file, if zlevel=-1, don't show the map
function loadRecentWaypoints(zlevel)
{
  	//callback from xajax scriptcall may make parameter ambigious
  	zlevel = parseInt(zlevel) || 7;
  	
	//2009.7.30 load recent waypoints  
        GDownloadUrl("xml/recentwaypoints.xml", function(data, responseCode) {
 	   	xwpobj = GXml.parse(data);
  	  	
  	  	if(zlevel !=-1)
  	  		traverseWPXml(xwpobj, zlevel);
      	});
}

//2009.8.30
function setWaypointsObj(xmlstr, bShow, zlevel)
{
	bShow = bShow || 0;
	zlevel = parseInt(zlevel) || 7;
		
	if(xmlstr!= "")
	{
		xwpobj = GXml.parse(xmlstr.toLowerCase()); // lower case for IE8
			
		//store xml data to data island for later used e.g. a wp updated, IE6 fail to save xml to div's innerHTML
  		//document.getElementById("xmlWaypoints").innerHTML = xmlstr;
  		if(bShow)
  			setTimeout("traverseWP("+zlevel+")", 500);
	}
}

function AfterStoreAMark(lat, lng, postid, n, ai, author, d, cat_id)
{
	if(xwpobj == null)
	{
		//alert("waypoints object not initialed");
		return;
	}
	var wps = xwpobj.documentElement.getElementsByTagName("wp");
	
	var pid=-1;
	for(i=0;i<wps.length;i++)
	{
		pid = wps[i].getAttribute("postid");
		if(postid==pid)
			break;
	} 
	var wp = null;
	
	if(postid!=pid)
	{
		wp = xwpobj.createElement("wp", postid);
		
		xwpobj.documentElement.appendChild(wp);
		wp.setAttribute("name", n);
		wp.setAttribute("oid", postid);
		wp.setAttribute("ai", ai);
		wp.setAttribute("author", author);
		wp.setAttribute("d", d);
		wp.setAttribute("c", cat_id);
	}
	else wp = wps[i];
		
	wp.setAttribute("lat", lat);
	wp.setAttribute("lng", lng);
	
	traverseWP(9, lat+","+lng);		

	xajax_getLocatorSimple("divlocatorsimpleboard");

}

//used to render waypoints previous stored in xml data island
function traverseWP(zlevel, centerll)
{	
	if(xwpobj == null)
	{
		alert("waypoints object not initialed");
		return;
	}
	
	if(gmap == null)
   		initgmap();	
			
	zlevel = parseInt(zlevel) || 7;
 	centerll = centerll ||  "";
 		 	
 	var par = centerll.split(",");
 	  				
	var wps = xwpobj.documentElement.getElementsByTagName("wp");
			
	if(wps.length >0)
	{
		var centerp;
		if(par.length == 2)
			centerp = new GLatLng(parseFloat(par[0]), parseFloat(par[1]));
		else
			centerp = new GLatLng(parseFloat(wps[0].getAttribute("lat")), parseFloat(wps[0].getAttribute("lng")));			
				
		gmap.mmapobj.setCenter(centerp);
				
		traverseWPXml(xwpobj, zlevel);
	} 
	else
	{
		gmap.mmarkmgr.clearMarkers();
	}	
}



//2009.7.31
function traverseWPXml(xml, level)
{	
	if(gmap == null)
   		initgmap();
   		
   	var zlevel = level || 7;
   	  		
   	gmap.mmapobj.setZoom(zlevel);	
	
	gmap.mmarkmgr.clearMarkers();
  		
	var wps = xml.documentElement.getElementsByTagName("wp");
		
 	var batch = [];
 	var jtitle="";
 	var wptype = 1;
        for (var i = 0; i < wps.length; i++) 
        {
        	jtitle = wps[i].getAttribute("name").substr(0, 16);
        	if(jtitle.length == 16)
        		jtitle+="..";
        		
        	wptype = wps[i].getAttribute("t");
        	
        	switch(wptype)
        	{
        		case "0": //topic
        			marker = gmap.addMark(parseFloat(wps[i].getAttribute("lat")), parseFloat(wps[i].getAttribute("lng")), "<a href='/?topicid="+wps[i].getAttribute("oid")+"' title='"+wps[i].getAttribute("name")+"'>"+jtitle+"</a>", "topic"); 
        			break;
        		default:
        	       		marker = gmap.addMark(parseFloat(wps[i].getAttribute("lat")), parseFloat(wps[i].getAttribute("lng")), "<a href='/?id="+wps[i].getAttribute("oid")+"' target=_blank title='"+wps[i].getAttribute("name")+"'><span onclick='javascript:onAccessJournal("+wps[i].getAttribute("oid")+", "+wps[i].getAttribute("ai")+")'>"+jtitle+"</span></a><br>by "+ "<a href='/?showuser_id="+wps[i].getAttribute("ai")+"'>"+wps[i].getAttribute("author")+"</a>", wps[i].getAttribute("c"));
        			break;
        	}
        	batch.push(marker);
        }
        gmap.mmarkmgr.addMarkers(batch, 5);
        gmap.mmarkmgr.refresh();
}



function addMark(Lat, Lng, tname, type)
{
	type = type || 0;
    	var marker = gmap.addMark(Lat, Lng, tname, type);
    	gmap.mmarkmgr.addMarker(marker, 7);
        gmap.mmarkmgr.refresh();
}    
    
function panTo(Lat, Lng, tname)
{
    	var p2 = new GLatLng(Lat,Lng);
    	gmap.mmapobj.panTo(p2);
    	gmap.mmapobj.openInfoWindowHtml(p2, "<div class='infowin'>"+tname+"<br>規劃路線：<a href='http://www.google.com/maps?source=uds&daddr=%40"+Lat+"%2C"+Lng+"&iwstate1=dir%3Ato' target=_blank>到這裡</a> ("+Lat+","+Lng+")</div>");
}

function panToWayObjLoc(Loc, tname, id, type, bAddMark)
{
	bAddMark= bAddMark || 0;
	
	if(gmap == null)
   		initgmap();	
	
	var locar = Loc.split(",");
	jtitle = tname;
        jtitle = jtitle.substr(0, 16)+"..";
        var objstr = (type==0) ? "topicid" : "id";
	panTo(locar[0], locar[1], "<a href='/?"+objstr+"="+id+"' target=_new title='"+tname+"'>"+jtitle+"</a>");
	
	if(bAddMark)
	{
		//gmap.mmarkmgr.clearMarkers();
		addMark(locar[0], locar[1], "<a href='/?"+objstr+"="+id+"' target=_new title='"+tname+"'>"+jtitle+"</a>", type);
	}
}

var Icon0 = new GIcon(G_DEFAULT_ICON);
//Icon0.image = "http://maps.google.com/mapfiles/kml/paddle/grn-diamond-lv.png"
Icon0.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";			
Icon0.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
Icon0.iconSize = new GSize(12, 20);
Icon0.shadowSize = new GSize(22, 20);
Icon0.iconAnchor = new GPoint(6, 20);
Icon0.infoWindowAnchor = new GPoint(6, 10);

//2009.12.17
IconTopic = new GIcon(Icon0, "http://labs.google.com/ridefinder/images/mm_20_yellow.png");

Icon1 = new GIcon(Icon0, "http://maps.google.com/mapfiles/ms/micons/cycling.png");
Icon1.shadow = "";
Icon1.iconSize = new GSize(24, 24);
Icon1.iconAnchor = new GPoint(12, 12);
Icon1.infoWindowAnchor = new GPoint(12, 12);


Icon2 = new GIcon(Icon1, "http://maps.google.com/mapfiles/kml/pal4/icon46.png");
Icon3 = new GIcon(Icon1, "http://maps.google.com/mapfiles/ms/micons/tree.png");
Icon4 = new GIcon(Icon1, "http://maps.google.com/mapfiles/kml/pal3/icon21.png");
Icon5 = new GIcon(Icon1, "http://maps.google.com/mapfiles/ms/micons/rail.png");
Icon6 = new GIcon(Icon1, "http://maps.google.com/mapfiles/kml/pal3/icon29.png");
Icon7 = new GIcon(Icon1, "http://maps.google.com/mapfiles/ms/micons/ferry.png");
Icon8 = new GIcon(Icon1, "http://maps.google.com/mapfiles/ms/micons/restaurant.png");


//新增規劃路線功能,2009.8.20
function CGMapObj_addMark(Lat, Lng, tname, type)
{
	var argv = CGMapObj_addMark.arguments;
  	var argc = CGMapObj_addMark.arguments.length;
  	var bBuffered = (argc > 3) ? argv[3] : true;
		
	var p2 = new GLatLng(Lat,Lng);
	
	var iconused=null;
	
	var iconno = parseInt(type);
	if(isNaN(iconno))
	{
		switch(type)
		{
			case "topic":
				iconused=IconTopic;
				break;
			default:
				iconused=Icon0;
				break;	
		}	
	}
	else 
	{
		if((iconno >-1) && (iconno <9))
			iconused = eval("Icon"+type);
			
		//cat -1 will use the default system icon
	}
	
    	var objective = new GMarker(p2, iconused);
    	if(!bBuffered)
    	  	this.mmapobj.addOverlay(objective);
    	
    	GEvent.addListener(objective, "click", function() {objective.openInfoWindowHtml("<div class='infowin'>"+tname+"<br>規劃路線：<a href='http://www.google.com/maps?source=uds&daddr=%40"+Lat+"%2C"+Lng+"&iwstate1=dir%3Ato' target=_blank>到這裡</a> ("+Lat+","+Lng+")</div>");});
	return objective;
}

// addAddressToMap() is called when the geocoder returns an
// answer.  It adds a marker to the map with an open info window
// showing the nicely formatted version of the address and the country code.
function addAddressToMap(response) 
{
	gmap.mmapobj.clearOverlays();
	if (!response || response.Status.code != 200) 
	{
   	//	alert("Sorry, we were unable to geocode that address");
	} else 
	{
   		place = response.Placemark[0];
   		point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
   	
   	
   		marker = new GMarker(point);
   		GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml("<font color=black>"+place.address+"</font>");});
   		gmap.mmapobj.addOverlay(marker);
   		gmap.mmapobj.setCenter(Point, 10);
   		//marker.openInfoWindowHtml('<font color=black>' + place.address + '</font>');
   		
   	}
}

function getJournalLocations()
{
	/*
	var data = document.getElementById("xmlWaypoints").innerHTML;	
	if(data == "")
		return null;
		
	data = data.toLowerCase(); // for IE8	
 	  			
	var xml = GXml.parse(data);
	*/
	if(xwpobj == null)
	{
		alert("waypoints object not initialed");
		return;
	}
		
	var wps = xwpobj.documentElement.getElementsByTagName("wp");
	
	var wpar = new Array();
	for(i=0; i< wps.length; i++)
		wpar[i] = new GLatLng(parseFloat(wps[i].getAttribute("lat")), parseFloat(wps[i].getAttribute("lng")));			
	return wpar;	 
}

//try to set a topic's location automatically while a topic loading, this will do only while result from gecode and locations from journals are available and matched, 2009.8.28
function autoTopicLocation(topicid, address, radius)
{
	if(topicid==-1)
		return;
			
	//1.get geocode result
	gmap.geocoder.getLocations(
    		address,
   		function(response) {
   				
   			//alert(response.Status.code)	
   				
      			if (response && response.Status.code == 200)  {	
        			   			
        			var glar = new Array();
        			for(i=0; i<response.Placemark.length; i++)
        			{
        				place = response.Placemark[i];
   					glar[i] = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
   				}
   				
   				
   			
   				                	
                	var jlar = getJournalLocations();
                	if((jlar == null) || (jlar.length ==0))
                		return;
                		              		
                	var bFound = false;
                	//var radius = 2500;
                	var point = null;
                	                	
                	for(i=0;i<glar.length;i++)
                	{
                		point = glar[i];
                		for(j=0;j<jlar.length;j++)
                		{
                			if(point.distanceFrom(jlar[j]) < radius)
                			{
                				bFound = true;
                				break;
                			}
                		}
                		if(bFound)
                			break;	
                	}
                	if(bFound)
                		xajax_autosetTopicLocation(topicid, point.toUrlValue());
                	
      	    	}
    	    }
  	);
	
	//2.get locations from journals		
	
}

function str_pad (input, pad_length, pad_string, pad_type) 
{
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // + namespaced by: Michael White (http://getsprink.com)
    // *     example 1: str_pad('Kevin van Zonneveld', 30, '-=', 'STR_PAD_LEFT');
    // *     returns 1: '-=-=-=-=-=-Kevin van Zonneveld'
    // *     example 2: str_pad('Kevin van Zonneveld', 30, '-', 'STR_PAD_BOTH');
    // *     returns 2: '------Kevin van Zonneveld-----'
 
    var half = '', pad_to_go;
 
    var str_pad_repeater = function (s, len) {
        var collect = '', i;
 
        while (collect.length < len) {collect += s;}
        collect = collect.substr(0,len);
 
        return collect;
    };
 
    input += '';
 
    if (pad_type != 'STR_PAD_LEFT' && pad_type != 'STR_PAD_RIGHT' && pad_type != 'STR_PAD_BOTH') { pad_type = 'STR_PAD_RIGHT'; }
    if ((pad_to_go = pad_length - input.length) > 0) {
        if (pad_type == 'STR_PAD_LEFT') { input = str_pad_repeater(pad_string, pad_to_go) + input; }
        else if (pad_type == 'STR_PAD_RIGHT') { input = input + str_pad_repeater(pad_string, pad_to_go); }
        else if (pad_type == 'STR_PAD_BOTH') {
            half = str_pad_repeater(pad_string, Math.ceil(pad_to_go/2));
            input = half + input + half;
            input = input.substr(0, pad_length);
        }
    }
 
    return input;
}

//2009.8.30
function llnormalize(ll)
{
	var llar = ll.split(",");
	var lat = llar[0];
	var lng = llar[1];
	
	if((lat.indexOf("+")== -1) && (lat.indexOf("-")===-1))
		lat = "+"+lat;
	lat=str_pad(lat, 11, "0", 'STR_PAD_RIGHT');
	
	if((lng.indexOf("+")==-1) && (lng.indexOf("-")==-1))
		lng = "+"+lng;
	lng=str_pad(lng, 11, "0", 'STR_PAD_RIGHT');
	
	var newll = lat+","+lng;
	
	return newll;
}

function setLocationTo(postid, ll, addrfromkw, type)
{
	if(postid == -1)
		return;
		
	if(gmap == null)
   		initgmap();	
  	
  	var address = prompt("可先調整欲讓google用來自動搜尋的位置名稱或是直接輸入經緯度(以 緯度,經度 的格式輸入)", addrfromkw);
  	if((address == "") || (address == null))
  		return;	
  		
  	var pmtstr = (type == 0) ? "設為本景點座標" : "設為遊記發生地";	
  	var funcname = (type == 0) ? "Topic" : "Journal";	
  
  	//if the given has alredy been the coordinate
  	var par = address.split(",");
  	if(par.length == 2)
  	{
  		if(!isNaN(par[0]) && !isNaN(par[1]))
  		{
  			if(llnormalize(address) == ll)
   			{
   				alert("所輸入的經緯度跟目前已經設定的位置一樣，無須設定。");
   				return;
   			}
   			panTo(par[0], par[1], "自動搜尋結果："+address+"<br><a href='javascript:void(0)'><span onclick='gmap.mmapobj.closeInfoWindow();xajax_store"+funcname+"Location("+postid+", \""+address+"\")'>"+pmtstr+"</span></a>");
   			alert("請先在地圖上確認自動搜尋出的結果是否為期望中的位置？");
   			return;
  		}
  	}
  	
  	
  	gmap.geocoder.getLocations(
    		address,
   		function(response) {
      			if (response && response.Status.code == 200)  {
        			place = response.Placemark[0];
   				point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
   				if(llnormalize(point.toUrlValue()) == ll)
   				{
   					alert("重新尋找的結果跟之前的位置一樣，請再試試。");
   					return;
   				}
   				panTo(place.Point.coordinates[1], place.Point.coordinates[0], "自動搜尋結果："+point.toUrlValue()+"<br><a href='javascript:void(0)'><span onclick='gmap.mmapobj.closeInfoWindow();xajax_store"+funcname+"Location("+postid+", \""+point.toUrlValue()+"\")'>"+pmtstr+"</span></a>");
   				alert("請先在地圖上確認自動搜尋出的結果是否為期望中的位置？");
        	      		}
        		else alert("以 "+address+" 搜尋，但查無地址，請修改搜尋字詞後再設定一次");      	
    			}
    		);    		
}



// showLocation() is called when you click on the Search button
// in the form.  It geocodes the address entered into the form
// and adds a marker to the map at that location.
function showLocation(address) 
{
	if(gmap == null)
   		initgmap();	
	
	//gmap.geocoder.getLocations(address, addAddressToMap);
	//use local search instead, 2009.2.17
	gmap.gmlsctl.execute(address);	
}

//2009.4.10
function setDirections()
{
   if(gmap == null)
   	initgmap();	
	
    var fromAddress = document.getElementById("fromAddress").value;
     
    gmap.geocoder.getLatLng(
    	fromAddress,
    	function(frompoint) {
      	if (!frompoint)
      		alert(" 查無出發地址："+ fromAddress + "，請加上縣市名稱或許比較容易找到");
        else
        {
        	var strfromAddr = fromAddress+"@"+frompoint.toUrlValue();
        	
        	var toAddress = document.getElementById("toAddress").value;
        	var atpos = toAddress.indexOf("@");
        	if(atpos!=-1)
        		gmap.gdir.load("from: " + strfromAddr + " to: " + toAddress, { "locale": "zh-TW" });
        	else
        	{
        		gmap.geocoder.getLatLng(
   			toAddress,
    			function(topoint) {
      			if (!topoint) 
        			alert(" 查無到達地址："+ toAddress + "，請加上縣市名稱或許比較容易找到");
     			else {
                		var strtoAddress = toAddress+"@"+topoint.toUrlValue();
        			gmap.gdir.load("from: " + strfromAddr + " to: " + strtoAddress, { "locale": "zh-TW" });
      	    		}//else
    			}//function
  			);//getLatlng
  		}//else	
      	}//else
    	}//function
	);//getLatLng
}

function handleErrors(){
	   if (gmap.gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + gmap.gdir.getStatus().code);
	   else if (gmap.gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gmap.gdir.getStatus().code);
	   
	   else if (gmap.gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gmap.gdir.getStatus().code);
 
	//   else if (gmap.gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gmap.gdir.getStatus().code);
	     
	   else if (gmap.gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gmap.gdir.getStatus().code);
 
	   else if (gmap.gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + gmap.gdir.getStatus().code);
	    
	   else alert("未知的錯誤，給一個更詳細的地址(如某某路幾段)也許就可解決");
	   
	}
 
function onGDirectionsLoad()
{ 
     if(gmap == null)
   	initgmap();	
     prepareshowmenu("divgdirections", false);
}

function CGMapObj(containerid, latCenter, lngCenter, zoomlevel)
{
	if (!GBrowserIsCompatible())
		return; 		     
			         	
	this.addMark = CGMapObj_addMark;
	this.mmapobj = new GMap2(document.getElementById(containerid));
	this.mpCenter = new GLatLng(latCenter, lngCenter);
	this.mmapobj.setCenter(this.mpCenter, zoomlevel, G_NORMAL_MAP);
	this.mmarkmgr = new MarkerManager(this.mmapobj);

		
	this.mmapobj.addMapType(G_PHYSICAL_MAP);
	
	//useing menutypecontrol to display drop-down menu, 2009.4.10	
	var maptypeControl = new GMenuMapTypeControl(false);
	this.mmapobj.addControl(maptypeControl);	
	
	this.mmapobj.addControl(new GLargeMapControl3D());
	
	this.geocoder = new GClientGeocoder();
	
        // bind a search control to the map, suppress result list 
        this.gmlsctl = new google.maps.LocalSearch({ 
              resultList : document.getElementById("gmlresults"),
              suppressInitialResultSelection : true
            });
        this.mmapobj.addControl(this.gmlsctl, new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(0,-30))); 
	
	
	this.gdir = new GDirections(this.mmapobj, document.getElementById("divgdirections"));
        GEvent.addListener(this.gdir, "load", onGDirectionsLoad);
        GEvent.addListener(this.gdir, "error", handleErrors);
}    