//*********************************************
// for Google Maps API v2
//*********************************************

var map;
var cur_cross;
var baseIcon;
var aryMarker = new Array;
var markerIndex = 0;
GMJ = new GMJ();

var aryProvince = new Object();
aryProvince['北海道']   = new Array(43.065, 141.347, 12);
aryProvince['青森県']   = new Array(40.824, 140.740, 12);
aryProvince['秋田県']   = new Array(39.719, 140.102, 12);
aryProvince['岩手県']   = new Array(39.704, 141.153, 12);
aryProvince['宮城県']   = new Array(38.269, 140.872, 12);
aryProvince['山形県']   = new Array(38.240, 140.364, 12);
aryProvince['新潟県']   = new Array(37.903, 139.023, 12);
aryProvince['福島県']   = new Array(37.750, 140.468, 12);
aryProvince['富山県']   = new Array(36.695, 137.211, 12);
aryProvince['長野県']   = new Array(36.651, 138.181, 12);
aryProvince['石川県']   = new Array(36.595, 136.626, 12);
aryProvince['栃木県']   = new Array(36.563, 139.883, 12);
aryProvince['群馬県']   = new Array(36.391, 139.060, 12);
aryProvince['茨城県']   = new Array(36.342, 140.447, 12);
aryProvince['福井県']   = new Array(36.065, 136.222, 12);
aryProvince['埼玉県']   = new Array(35.857, 139.649, 12);
aryProvince['東京都']   = new Array(35.689, 139.692, 12);
aryProvince['山梨県']   = new Array(35.664, 138.568, 12);
aryProvince['千葉県']   = new Array(35.605, 140.123, 12);
aryProvince['鳥取県']   = new Array(35.504, 134.238, 12);
aryProvince['島根県']   = new Array(35.472, 133.050, 12);
aryProvince['神奈川県'] = new Array(35.448, 139.642, 12);
aryProvince['岐阜県']   = new Array(35.391, 136.722, 12);
aryProvince['愛知県']   = new Array(35.180, 136.907, 12);
aryProvince['京都府']   = new Array(35.021, 135.756, 12);
aryProvince['滋賀県']   = new Array(35.005, 135.869, 12);
aryProvince['静岡県']   = new Array(34.977, 138.383, 12);
aryProvince['三重県']   = new Array(34.730, 136.509, 12);
aryProvince['兵庫県']   = new Array(34.691, 135.183, 12);
aryProvince['大阪府']   = new Array(34.686, 135.520, 12);
aryProvince['奈良県']   = new Array(34.685, 135.833, 12);
aryProvince['岡山県']   = new Array(34.662, 133.934, 12);
aryProvince['広島県']   = new Array(34.397, 132.460, 12);
aryProvince['香川県']   = new Array(34.340, 134.043, 12);
aryProvince['和歌山県'] = new Array(34.227, 135.167, 12);
aryProvince['山口県']   = new Array(34.186, 131.471, 12);
aryProvince['徳島県']   = new Array(34.066, 134.559, 12);
aryProvince['愛媛県']   = new Array(33.842, 132.766, 12);
aryProvince['福岡県']   = new Array(33.607, 130.418, 12);
aryProvince['高知県']   = new Array(33.560, 133.531, 12);
aryProvince['佐賀県']   = new Array(33.249, 130.300, 12);
aryProvince['大分県']   = new Array(33.238, 131.613, 12);
aryProvince['熊本県']   = new Array(32.790, 130.742, 12);
aryProvince['長崎県']   = new Array(32.745, 129.874, 12);
aryProvince['宮崎県']   = new Array(31.911, 131.424, 12);
aryProvince['鹿児島県'] = new Array(31.560, 130.558, 12);
aryProvince['沖縄県']   = new Array(26.212, 127.681, 12);

//======================================================================
// class GMJ
//======================================================================
function GMJ() {
	this.init = init;
	this.movePointer = movePointer;
	this.loadMarkers = loadMarkers;
}


//======================================================================
// init(str)
//----------------------------------------------------------------------
// do init GMJ object
//----------------------------------------------------------------------
// arguments;
//   strings  strArg  (omission allow)
//
// usage;
//   init("type=mini, overview=0");
//======================================================================
function init(strArg) {

	var params = new Object();
	// set default
	params['ctrl']		= "mini";		// ControlerType
	params['overview']	= false;		// OverView
	params['type']		= false;		// MapTypeChanger
	params['lat']		= 35.70216;		// Lat
	params['lng']		= 139.7436;		// Lng
	params['zoom']		= 17;			// ZoomRatio
	params['prov']		= false;		// Province

	if(strArg != undefined) {
		aryArg = strArg.split(",");
		for(i=0 ; i<aryArg.length ; i++) {
			keyval = aryArg[i].split("=");
			params[keyval[0].replace(/^\s+|\s+$/g, "")] = keyval[1].replace(/^\s+|\s+$/g, "");
		}
	}

	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		//上下左右＋－
		switch(params['ctrl']) {
			case 'mini': 
				map.addControl(new GSmallMapControl());
				break;
			default:
				map.addControl(new GLargeMapControl());
				break;
		}
		//マップ サテライト デュアル
		if(params['type']) {
			map.addControl(new GMapTypeControl());
		}
		//Km
		if(params['scale']) {
			map.addControl(new GScaleControl());
		}

		// overview
		if(params['overview']) {
			map.addControl(new GOverviewMapControl(new GSize(100,100)));
		}


		//座標表示
		GEvent.addListener(map, "moveend", function() {
			for(i=1 ; i<=markerIndex ; i++) {
				if(typeof aryMarker[i] == "object") {
					map.removeOverlay(aryMarker[i]);
				}
			}
			markerIndex = 1;

			switch(params['mode']) {
				case 'admin':
						var center = map.getCenter();
						document.coordinate.lng.value = center.x
						document.coordinate.lat.value = center.y
						break;

				case 'admin_confirm':
						break;

				case 'admin_resort':
						var center = map.getCenter();
						loadMarkersAdminResort(params['primary_key']);
						break;

				case 'resort':
						var center = map.getCenter();
						loadMarkersResort(params['key_ids']);
						break;

				case 'inn':
						var center = map.getCenter();
						var result = loadMarkersInn(params['key_id']);
						break;

				case 'inn_detail':
						var center = map.getCenter();
						var result = loadMarkersInnDetail(params['key_id']);
						break;

				case 'all':
						document.getElementById('abcdefg').innerHTML = "";
						if(map.getZoom() > 7) {
							loadMarkersAll();
						}
						break;

				default:
						loadMarkers();
						break;
			}
			if(typeof cur_cross == "object") {
				map.removeOverlay(cur_cross);
			}
			cur_cross = createCross();
			map.addOverlay(cur_cross);
		});

		//zoom表示
		GEvent.addListener(map, "zoomend", function(oldZ, newZ) {
			for(i=1 ; i<=markerIndex ; i++) {
				if(typeof aryMarker[i] == "object") {
					map.removeOverlay(aryMarker[i]);
				}
			}
			markerIndex = 1;

			switch(params['mode']) {

				case 'admin':
						document.coordinate.zoom.value = newZ;
						break;

				case 'admin_confirm':
						break;

				case 'admin_resort':
						if(params['zinput'] != 'false') {
							document.coordinate.zoom.value = newZ;
						}
						break;

				case 'resort':
						var center = map.getCenter();
						loadMarkersResort(params['key_ids']);
						break;

				case 'inn':
						var center = map.getCenter();
						loadMarkersInn(params['key_id']);
						break;

				case 'inn_detail':
						var center = map.getCenter();
						loadMarkersInnDetail(params['key_id']);
						break;

				case 'all':
						document.getElementById('abcdefg').innerHTML = "";
						if(map.getZoom() > 7) {
							loadMarkersAll();
						}
						break;

				default:
						loadMarkers();
						break;
			}
		});

		//座標
		if(params['province']) {
			map.setCenter(new GLatLng(aryProvince[params['province']][0], aryProvince[params['province']][1]), aryProvince[params['province']][2]);
		} else if(params['lat'] && params['lng'] && params['zoom']) {
			map.setCenter(new GLatLng(parseFloat(params['lat']), parseFloat(params['lng'])), parseInt(params['zoom']));
		}

		// デフォマーカー
		baseIcon = new GIcon();
		baseIcon.image = "/shared/js/marker.png";
		baseIcon.iconSize = new GSize(27, 26);
		baseIcon.iconAnchor = new GPoint(13, 13);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);

	}

}


function createCross() {
	// cross表示
	var crossMarkerOptions = new Object();
	crossMarkerOptions.icon = new GIcon();
	crossMarkerOptions.icon.image = "/shared/js/cross.gif";
	crossMarkerOptions.icon.iconSize = new GSize(9, 9);
	crossMarkerOptions.icon.iconAnchor = new GPoint(5, 5);
	var cross = new GMarker(map.getCenter(), crossMarkerOptions);

	return cross;
}

//======================================================================
// loadMarkersAdminResort()
//----------------------------------------------------------------------
// load Markers for Admin Resort  as present Rectant
//----------------------------------------------------------------------
// arguments;
//   p_key
//======================================================================
function loadMarkersAdminResort(p_key) {
	var objRect = map.getBounds();

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();
	GDownloadUrl("/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/" + p_key + "/admin_resort/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			var str = ''
			str += '<div style="text-align:left">';
			str += '<a href="/search/detail.php?id=' + markers[i].getAttribute("id") + '">';
			str += '<b>' + markers[i].getAttribute("name") + '<\/b>';
			str += '<\/a><br />';
			str += markers[i].getAttribute("address") + '<br />';
			str += markers[i].getAttribute("tel");
			str += '<\/div>';
			map.addOverlay(createMarker(point, i, str));
		}
	});
}


//======================================================================
// loadMarkers()
//----------------------------------------------------------------------
// load Markers as present Rectant
//----------------------------------------------------------------------
// arguments;
//   none
//======================================================================
function loadMarkers() {
	var objRect = map.getBounds();

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();

	GDownloadUrl("/maps/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			str += '<b>' + markers[i].getAttribute("name") + '<\/b>';
			map.addOverlay(createMarker(point, i, str));
		}
	});
}


//======================================================================
// loadMarkersAll()
//----------------------------------------------------------------------
// load Markers as present Rectant
//----------------------------------------------------------------------
// arguments;
//   none
//======================================================================
function loadMarkersAll() {
	var objRect = map.getBounds();

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();

	GDownloadUrl("/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/all/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		var status = "";
		var st=0;
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			var str  = '<a href="/search/detail.php?id=' + markers[i].getAttribute("id") + '">';
			str += '<b>' + markers[i].getAttribute("name") + '<\/b><br />';
			str += '<\/a>';
			str += markers[i].getAttribute("address") + '<br />';
			str += markers[i].getAttribute("tel");

			aryMarker[++markerIndex] = createMarker(point, i, str);
			map.addOverlay(aryMarker[markerIndex]);

			// ステータス表示
			if(st++ < 10) {
				distance = parseInt(point.distanceFrom(map.getCenter()));
				if(distance > 1000) {
					distance = parseInt(distance / 1000);
					distance = distance.toString().replace(/([\d]+?)(?:(\d{3}\.\d+)|(?=(?:\d{3})+(?:\.\d+)?$))/g, "$1,$2") + "k";
				} else {
					distance = distance.toString().replace(/([\d]+?)(?:(\d{3}\.\d+)|(?=(?:\d{3})+(?:\.\d+)?$))/g, "$1,$2");
				}
				status += '<dt><a href="/search/detail.php?id=' + markers[i].getAttribute("id") + '">' + markers[i].getAttribute("name") + '</a></dt>';
				status += '<dd>中心から ' + distance  + 'm ';
				status += '（<a href="#" onClick="GMJ.movePointer(' + markers[i].getAttribute("lat") + ',' + markers[i].getAttribute("lng") + ');">移動</a>）';
				status += '</dd>';
			}
			if(i > 50) { break; }

		}
		document.getElementById('abcdefg').innerHTML = status;
	});
}


//======================================================================
// loadMarkersResort()
//----------------------------------------------------------------------
// load Markers for Resort  as present Rectant
//----------------------------------------------------------------------
// arguments;
//   key_ids
//======================================================================
function loadMarkersResort(key_ids) {
	var objRect = map.getBounds();

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();

	GDownloadUrl("/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/" + key_ids + "/resort/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			var str = ''
			str += '<div style="text-align:left">';
			str += '<a href="/search/detail.php?id=' + markers[i].getAttribute("id") + '">';
			str += '<b>' + markers[i].getAttribute("name") + '<\/b>';
			str += '<\/a><br />';
			str += markers[i].getAttribute("address") + '<br />';
			str += markers[i].getAttribute("tel");
			str += '<\/div>';
			map.addOverlay(createMarker(point, i, str));
		}
	});
}


//======================================================================
// loadMarkersInn()
//----------------------------------------------------------------------
// load Markers for Inn  as present Rectant
//----------------------------------------------------------------------
// arguments;
//   key_id
//======================================================================
function loadMarkersInn(key_id) {
	var objRect = map.getBounds();
	var buf;

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();

	GDownloadUrl("/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/" + key_id + "/inn/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			var str = '<b>' + markers[i].getAttribute("name") + '<\/b>';
			map.addOverlay(createMarker(point, i));
		}
	});
}


//======================================================================
// loadMarkersInnDetail()
//----------------------------------------------------------------------
// load Markers for Inn  as present Rectant
//----------------------------------------------------------------------
// arguments;
//   key_id
//======================================================================
function loadMarkersInnDetail(key_id) {
	var objRect = map.getBounds();
	var buf;

	objSouthWest = objRect.getSouthWest();
	objNorthEast = objRect.getNorthEast();

	GDownloadUrl("/" + Math.abs(objSouthWest.lat()) + "/" + Math.abs(objSouthWest.lng()) + "/" + Math.abs(objNorthEast.lat()) + "/" + Math.abs(objNorthEast.lng()) + "/" + key_id + "/inn/createXML.php", function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i=0 ; i<markers.length ; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
			var str = '<b>' + markers[i].getAttribute("name") + '<\/b><br />';
			str += markers[i].getAttribute("address") + '<br />';
			str += markers[i].getAttribute("tel");
			var marker = createMarker(point, i, str)
			map.addOverlay(marker);
			marker.openInfoWindowHtml(str);

		}
	});
}


//======================================================================
// movePointer(float, float, int)
//----------------------------------------------------------------------
// move map and set zoom-ratio
//----------------------------------------------------------------------
// arguments;
//   float  lat
//   float  lng
//   int    zoom  (omission allow)
//
// usage;
//   movePointer(35.032, 144.225, 8)
//======================================================================
function movePointer(lat, lng, zoom) {
	if(lat != undefined && lng != undefined) {
		map.panTo(new GLatLng(lat, lng));
	}
	if(zoom != undefined) {
		map.setZoom(parseInt(zoom));
	}
}


//======================================================================
// createMarker(obj, int, str)
//----------------------------------------------------------------------
// move map and set zoom-ratio
//----------------------------------------------------------------------
// arguments;
//   object   point
//   int      index
//   strings  str
//
// usage;
//   movePointer(35.032, 144.225, 8)
//======================================================================
function createMarker(point, index, str) {
	var letter = String.fromCharCode("A".charCodeAt(0) + index);
	var icon = new GIcon(baseIcon);

	var marker = new GMarker(point, icon);

	if(str) {
		GEvent.addListener(marker, "click", function() {
			var textnode = "" + str + "";
			marker.openInfoWindowHtml(textnode);
		});
	}

	return marker;
}

