// Google map
// Ajax処理用
// mini_ajax is originally by Tim Morgan <http://snippets.dzone.com/posts/show/2025>
function _elem(e){if(typeof e=='string')e=document.getElementById(e);return e};
function _collect(a,f){var n=[];for(var i=0;i<a.length;i++){var v=f(a[i]);if(v!=null)n.push(v)}return n};
ajax={};
ajax.x=function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}};
ajax.serialize=function(f){var g=function(n){return f.getElementsByTagName(n)};var nv=function(e){if(e.name)return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);else return ''};var i=_collect(g('input'),function(i){if((i.type!='radio'&&i.type!='checkbox')||i.checked)return nv(i)});var s=_collect(g('select'),nv);var t=_collect(g('textarea'),nv);return i.concat(s).concat(t).join('&');};
ajax.send=function(u,f,m,a){var x=ajax.x();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseText)};if(m=='POST')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a)};
ajax.get=function(url,func){ajax.send(url,func,'GET')};
ajax.gets=function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText};
ajax.post=function(url,func,args){ajax.send(url,func,'POST',args)};
ajax.update=function(url,elm){var e=_elem(elm);var f=function(r){e.innerHTML=r};ajax.get(url,f)};
ajax.submit=function(url,elm,frm){var e=_elem(elm);var f=function(r){e.innerHTML=r};ajax.post(url,f,ajax.serialize(frm))};
// 地図オブジェクトと地図表示条件
var map;
// 地図初期表示
function initMap()
{
	if (lat && lng && zoom) {	// 指定の場所
		// 固定の場所で表示
		var mapLatLng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));
		// マップオプションを変数に格納
		var mapOptions = {
			zoom : parseInt(zoom),          // 拡大倍率
			center : mapLatLng,  // 緯度・経度
		//	fullscreenControl : false
		};
		// マップオブジェクト作成
		map = new google.maps.Map(
			document.getElementById("map"), // マップを表示する要素
			mapOptions         // マップオプション
		);
		//google.maps.event.addListener(map, 'bounds_changed', map_search);
		google.maps.event.addListener(map, 'dragend', map_search);
		google.maps.event.addListener(map, 'zoom_changed', map_search);
		google.maps.event.addListenerOnce(map,  "tilesloaded", map_search);
		return;
	}
	// Geolocation APIに対応している
	if (navigator.geolocation) {
		// 現在地を取得
		navigator.geolocation.getCurrentPosition(
			// 取得成功した場合
			function(position) {
				// 緯度・経度を変数に格納
				var mapLatLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
				// マップオプションを変数に格納
				var mapOptions = {
					zoom : 12,          // 拡大倍率
					center : mapLatLng,  // 緯度・経度
					fullscreenControl : fullScreen
				};
				// マップオブジェクト作成
				map = new google.maps.Map(
					document.getElementById("map"), // マップを表示する要素
					mapOptions         // マップオプション
				);
				//google.maps.event.addListener(map, 'bounds_changed', map_search);
				google.maps.event.addListener(map, 'dragend', map_search);
				google.maps.event.addListener(map, 'zoom_changed', map_search);
				google.maps.event.addListenerOnce(map,  "tilesloaded", map_search);
			},
			// 取得失敗した場合
			function(error) {
				// 固定の場所で表示
				var mapLatLng = new google.maps.LatLng(35.68552997035451,139.7535678396179);
				// マップオプションを変数に格納
				var mapOptions = {
					zoom : 12,          // 拡大倍率
					center : mapLatLng,  // 緯度・経度
					fullscreenControl : fullScreen
				};
				// マップオブジェクト作成
				map = new google.maps.Map(
					document.getElementById("map"), // マップを表示する要素
					mapOptions         // マップオプション
				);
				//google.maps.event.addListener(map, 'bounds_changed', map_search);
				google.maps.event.addListener(map, 'dragend', map_search);
				google.maps.event.addListener(map, 'zoom_changed', map_search);
				google.maps.event.addListenerOnce(map,  "tilesloaded", map_search);
			}
		);
	} else {
		// Geolocation APIに対応していない
		// 固定の場所で表示
		var mapLatLng = new google.maps.LatLng(35.68552997035451,139.7535678396179);
		// マップオプションを変数に格納
		var mapOptions = {
			zoom : 12,			// 拡大倍率
			center : mapLatLng,	// 緯度・経度
			fullscreenControl : fullScreen
		};
		// マップオブジェクト作成
		map = new google.maps.Map(
			document.getElementById("map"), // マップを表示する要素
			mapOptions         // マップオプション
		);
		//google.maps.event.addListener(map, 'bounds_changed', map_search);
		google.maps.event.addListener(map, 'dragend', map_search);
		google.maps.event.addListener(map, 'zoom_changed', map_search);
		google.maps.event.addListenerOnce(map,  "tilesloaded", map_search);
	}
}
// マーカー処理
var MarkerArray = new Array();
function deleteMakers()
{
	for (i = 0; i < MarkerArray.length; i++) {
		var marker = MarkerArray[i]["marker"];
		if (marker) {
			marker.setMap(null);
		}
	}
	MarkerArray = new Array();
}
// マップ上の吹き出しを開く
function openMap(id)
{
	for (i = 0; i < MarkerArray.length; i++) {
		if (id == MarkerArray[i]["id"]) {
			var marker = MarkerArray[i]["marker"];
			google.maps.event.trigger(marker, 'click');
			location = '#top';
		}
	}
	return false;
}
// マーカー追加
var open_infowindow = null;
function addMarker(point, html, kind)
{
	var infowindow = new google.maps.InfoWindow({
		content: html,
		position: point
	});
	opt = {
		map : map,             // 対象の地図オブジェクト
		position: point
	};
	if (icon != '') {
		opt['icon'] = icon[kind];
	}
	var marker = new google.maps.Marker(opt);
	marker.addListener("click", function (event) {
		console.log(event);
		console.log(open_infowindow);
		if (open_infowindow) {
			open_infowindow.close();
		}
		infowindow.open(map, marker);
		open_infowindow = infowindow;
	});
	return marker;
}
// 個別表示
var Item = function()
{
	//
};
Item.prototype.create = function(ent)
{
	var marker;
	if (ent.length > 1) {
		lat = ent[0]['lat'];
		lon = ent[0]['lon'];
		kind = ent[0]['kind'];
		var text = '';
		for (var i = 0; i < ent.length; i++) {
			text += ent[i]['html_s'];	// 縮小版
		}
		marker = addMarker(new google.maps.LatLng(lat,lon), text, kind);
		MarkerArray.push({id: ent[0]['info_id'], marker: marker});
	} else {
		ent = ent[0];
		marker = addMarker(new google.maps.LatLng(ent['lat'],ent['lon']), ent['html'], ent['kind']);
		MarkerArray.push({id: ent['info_id'], marker: marker});
	}
	return marker;
}
// クラスター表示
var Item2 = function()
{
	//
};
Item2.prototype.create = function(ent)
{
	var opt = {
		map: map,
		position: new google.maps.LatLng(ent.cx,ent.cy),
		icon: ent.icon
	};
	var marker = new google.maps.Marker(opt);
	marker.addListener("click", function (event) {
		map_move(ent.cx, ent.cy, map.getZoom() + 2);
	});
	MarkerArray.push({id: 0, marker: marker});
	return marker;
}
// 指定位置とズームレベルに地図を移動
function map_move(cx, cy, zoom)
{
	var latlng = new google.maps.LatLng(cx, cy);
	map.setCenter(latlng);
	map.setZoom(zoom);
	map_search();
}
// 地図検索・表示
var search_flag = false;
function map_search()
{
	if (search_flag) return;	// 2重処理防止
	// ズームレベルでアイコン表示を抑制
	if (map.getZoom() < 12) {
		deleteMakers();
		if (document.fullscreenElement) {
			alert("情報を表示するには、地図を拡大してください。");
		}
		document.getElementById('map-alert').style.display = "block";
		return;
	}
	document.getElementById('map-alert').style.display = "none";
	//
	var latlng = map.getCenter();
	document.form1.ce.value = latlng.lat() + "," + latlng.lng();
	document.form1.zoom.value = map.getZoom();
	//
	if (latlng) {
		deleteMakers();
		if (document.getElementById('map_item')) {
			document.getElementById('map_item').innerHTML = "";
		}
		// 現在の表示範囲
		var ll_ul = map.getBounds().getNorthEast();
		var ll_lr = map.getBounds().getSouthWest();
		document.form1.ul.value = ll_ul.lat() + "," + ll_lr.lng();
		document.form1.lr.value = ll_lr.lat() + "," + ll_ul.lng();
		document.form1.act.value = "map_search";
		req = "./?" + ajax.serialize(document.form1);
		document.form1.act.value = "list";
		search_flag = true;
		ajax.get(req, function(res) {
			search_flag = false;
			if (res == '') return;
			map.overlayMapTypes.setAt(0, null);
			eval("result = " + res);
			//
			place = result.list;
			document.getElementById('total').innerHTML = place.length;
			var text = "";
			for (i = 0; i < place.length; i++) {
				if (place[i]) {
					if (result.type == 1) {
						var s = new Item();
						s.create(place[i]);
						//
						for (j = 0; j < place[i].length; j++) {
							text += place[i][j]["item"];
						}
					} else {
						// クラスター表示
						var s = new Item2();
						s.create(place[i]);
					}
				}
			}
			if (document.getElementById('map_item')) {
				document.getElementById('map_item').innerHTML = text;
			}
		});
	}
}
