function parse_loc(response, to_open) {
	var xmldoc  = GXml.parse(response);
	var lat     = xmldoc.documentElement.getElementsByTagName('lat');
	var lon     = xmldoc.documentElement.getElementsByTagName('lon');
	var title   = xmldoc.documentElement.getElementsByTagName('title');
	var link    = xmldoc.documentElement.getElementsByTagName('link');
	var date    = xmldoc.documentElement.getElementsByTagName('date');
	var excerpt = xmldoc.documentElement.getElementsByTagName('excerpt');
	var image = xmldoc.documentElement.getElementsByTagName('image');
	var n = lat.length;
	if (n < 1) {
		return null;
	}
	var points = new Array();
	for (var i = 0 ; i < n ; i++) {
		var latlng = new GLatLng(GXml.value(lat[i]), GXml.value(lon[i]));
		if (to_open && latlng.equals(to_open)) {
			var opened = true;
		} else {
			var opened = false;
		}
		var desc = {
			'title'  : GXml.value(title[i]),
			'link'   : GXml.value(link[i]),
			'date'   : GXml.value(date[i]),
			'excerpt': GXml.value(excerpt[i]),
			'image': GXml.value(image[i])
		};
		var has_same = false;
		if (i > 0) {
			var last = Math.min(i, points.length);
			for (var j = 0 ; j < last ; j++) {
				if (latlng.equals(points[j][0])) {
					has_same = true;
					points[j].push(desc);
					break;
				}
			}
		}
		if (! has_same) {
			points.push(new Array(latlng, opened, desc));
		}
	}
	return points;
}

// --------------------

function window_content(desc) {
//	return '<div class="infowindow"><strong><a href="'+desc.link+'">'+desc.title+'</a></strong><br />'+desc.date+'<p>'+desc.excerpt+'</p></div>';
	return '<div class="infowindow"><a href="'+desc.link+'"><strong>'+desc.title+'</strong></a><br />'+desc.date+'</div><p style="height:120px;"><img src="'+desc.image+'" height="120" \/></p><p>'+desc.excerpt+'</p>';
}
// --------------------
function create_marker(map, loc) {
	var marker = new GMarker(loc[0]);
	map.addOverlay(marker);
	var n = loc.length;
	if (n <= 3) {
		marker.bindInfoWindowHtml(window_content(loc[2]), {'maxWidth':250});
		if (loc[1]) {
			marker.openInfoWindowHtml(window_content(loc[2]), {'maxWidth':250});
		}
	} else {
		var tabs = new Array(n - 2);
		for (var i = 2 ; i < n ; i++) {
			tabs[i - 2] = new GInfoWindowTab(i - 1, window_content(loc[i]));
		}
		marker.bindInfoWindowTabsHtml(tabs, {'maxWidth':250});
		if (loc[1]) {
			marker.openInfoWindowTabsHtml(tabs, {'maxWidth':250});
		}
	}
	return marker;
}
// --------------------
function put_markers(map, locs) {
	if (locs) {
		map.clearOverlays();
		var n = locs.length;
		for (var i = 0 ; i < n ; i++) {
			create_marker(map, locs[i]);
		}
	}
}
// --------------------
function recent_locations(num) {
	var query = 'recent=' + num;
	GDownloadUrl(baseurl + query, function(response) {
		var locs = parse_loc(response, null);
		if (locs) {
			locs[0][1] = true; // open a window of the recent marker
			put_markers(map, locs);
		}
	});
}
// --------------------
function move_to_latlong(latlng) {
	map.setCenter(latlng, 15, G_NORMAL_MAP);
	var bounds = map.getBounds();
	var query = 'bounds=' + bounds.getSouthWest().lat() + ',' + bounds.getSouthWest().lng() + ',' + bounds.getNorthEast().lat() + ',' + bounds.getNorthEast().lng();
	GDownloadUrl(baseurl + query, function(response) {
		var locs = parse_loc(response, latlng);
		put_markers(map, locs);
	});
}
// --------------------
function move_to_place(place) {
	geocoder.getLatLng(place, function(latlng) {
		if (latlng) {
			move_to_latlong(latlng);
		} else {
			alert(place + 'の緯度・経度が分かりませんでした。');
		}
	});
}
// --------------------
function get_outline(locs) {
	var outline = new GLatLngBounds(locs[0].latlng, locs[0].latlng);
	var n = locs.length;
	for (var i = 0 ; i < n ; i++) {
		outline.extend(locs[i][0]);
	}
	return outline;
}
// --------------------
function refine_by_category(cat_id) {
	var query = 'category=' + cat_id;
	GDownloadUrl(baseurl + query, function(response) {
		var locs  = parse_loc(response, null);
		if (! locs) {
			map.setCenter(new GLatLng(38.0,137.5), 4, G_NORMAL_MAP);
			map.clearOverlays();
			return;	
		}
		var outline = get_outline(locs);
		map.setCenter(outline.getCenter(), map.getBoundsZoomLevel(outline), G_NORMAL_MAP);
		put_markers(map, locs);
	});
}
// --------------------
function refine_by_tag(tag) {
	var query = 'tag=' + encodeURI(tag);
	GDownloadUrl(baseurl + query, function(response) {
		var locs  = parse_loc(response, null);
		if (! locs) {
			map.setCenter(new GLatLng(38.0,137.5), 4, G_NORMAL_MAP);
			map.clearOverlays();
			return;	
		}
		var outline = get_outline(locs);
		map.setCenter(outline.getCenter(), map.getBoundsZoomLevel(outline), G_NORMAL_MAP);
		put_markers(map, locs);
	});
}
// --------------------
function main() {
	map = new GMap2(document.getElementById('google_maps'));
	map.removeMapType(G_SATELLITE_MAP);
	map.addMapType(G_PHYSICAL_MAP);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	map.addControl(new GOverviewMapControl());
	geocoder = new GClientGeocoder();
	map.setCenter(new GLatLng(36.690854885601, 137.84270703793), 8, G_NORMAL_MAP);
	recent_locations(50);
//extension
var icon = new GIcon();
icon.image = "crosspoint.png";
icon.iconSize = new GSize(10, 10);
icon.iconAnchor = new GPoint(10, 10);

	var xy = map.getCenter();
	var cpoint = new GLatLng(xy.lat(), xy.lng());
	var c_mark = new GMarker(cpoint, icon);
	map.addOverlay(c_mark);

	GEvent.addListener(map, 'move', function() {
		xy = map.getCenter();
		map.removeOverlay(c_mark);
		cpoint = new GLatLng(xy.lat(), xy.lng());
		c_mark = new GMarker(cpoint,icon);
		map.addOverlay(c_mark);
	});

	GEvent.addListener(map, 'moveend', function() {
		xy = map.getCenter();
		document.getElementById("show_latlng").innerHTML = "地図の中心緯度経度(WGS84)："+xy.lat()+","+xy.lng();
	});
//end of extension

}
// --------------------
if (GBrowserIsCompatible()) {
	var map;
	var geocoder;
	var baseurl = 'http://travel.kuroneko-square.net/articles/wp-content/plugins/lightweight-google-maps/locations.php?format=xml&';
	onload = main;
	onunload = GUnload;
}
//]]>

