var map;
var default_set = new Array();

$(function(){
	$("body").unload(function() {
		GUnload();
	});
});

function loadUserMap(map_sets) {
	for (var i = 0; i < map_sets.length; i++) {
		map_set = map_sets[i];
		var tmp_set = {
			id: 'defaultMap',
			lat: null,
			lng: null,
			zoom: 12,
			display: [],
			scale: 'large',
			overview: true,
			maptype: true,
			open_message: false
		};
		for (var key in map_set) {
			tmp_set[key] = map_set[key];
		}
		if (!tmp_set.lat && map_set.display.length) {
			tmp_set.lat = map_set.display[0].lat;
		}
		if (!tmp_set.lng && map_set.display.length) {
			tmp_set.lng = map_set.display[0].lng;
		}
		default_set.push(tmp_set);
	}
	mapload();
}

function mapload() {
	if(GBrowserIsCompatible()) {
		for(var i = 0; i < default_set.length; i++) {
			map = new GMap2(document.getElementById(default_set[i].id));
			// 各コントロール追加
			if(default_set[i].scale == 'large') {
				map.addControl(new GLargeMapControl());
			} else if(default_set[i].scale == 'small') {
				map.addControl(new GSmallMapControl());
			}
			if(default_set[i].overview) {
				map.addControl(new GOverviewMapControl());
			}
			if(default_set[i].maptype) {
				map.addControl(new GMapTypeControl());
			}
			map.setCenter(new GLatLng(default_set[i].lat, default_set[i].lng), default_set[i].zoom);
	
			if(default_set[i].display != undefined && default_set[i].display.length) {
				// displayのマーカーのみ表示
				for (var j = 0; j < default_set[i].display.length; j++) {
					marker = default_set[i].display[j];
					marker.marker = set_marker(map, marker);
					// ウィンドウをポップアップか吹き出しか
					if(marker.message.length && marker.message.match(/^POPUP\:(.*)$/))
					{
						var popurl = RegExp.$1;
						set_popup_action(map, marker, marker.marker, popurl);
					}
					else
					{
						set_action(map, marker, marker.marker, default_set[i].open_message);
					}
				}
			}
		}
	}
}

// mapにmarker_dataをセットする
function set_marker(map, marker_data) {
	if (marker_data.icon != undefined) {
		var m_icon = new GIcon();
		m_icon.image = marker_data.icon;
		m_icon.iconSize = new GSize(marker_data.icon_width, marker_data.icon_height);
		m_icon.iconAnchor = new GPoint(10,10);
		m_icon.infoWindowAnchor = new GPoint(10,10);
		var marker = new GMarker(new GPoint(marker_data.lng, marker_data.lat), m_icon);
	} else {
		var marker = new GMarker(new GPoint(marker_data.lng, marker_data.lat));
	}
	map.addOverlay(marker);

	return marker;
}

// mapに動きをセットする
function set_action(map, marker_data, marker, open_message) {
	GEvent.addListener(marker, 'click', function() {
		map.panTo(new GLatLng(marker_data.lat, marker_data.lng));
		var timer = window.setTimeout(function() {
			marker.openInfoWindowHtml(marker_data.message);
			clearTimeout(timer);
		}, '500');
	});

	if(open_message == true) {
		// 最初から表示
		marker.openInfoWindowHtml(marker_data.message);
	}
}

// mapに動きをセットする
// FOR POPUP
function set_popup_action(map, marker_data, marker, popurl) {
	GEvent.addListener(marker, 'click', function() {
		window.open(popurl,'map','width=600,height=768,scrollbars=yes');
		map.panTo(new GLatLng(marker_data.lat, marker_data.lng));
	});
}

// 指定された名前のマーカーを開く
function open_map_window(set_index, marker_title)
{
	for(var i = 0; i < default_set[set_index].display.length; i++)
	{
		if(default_set[set_index].display[i].title == marker_title)
		{
			default_set[set_index].display[i].marker.openInfoWindowHtml(default_set[set_index].display[i].message);
			break;
		}
	}
}

/* ===============================================================================================================
* 以下はインスタンス重複生成回避：ステーション検索用
*/

var mapCache = {};
function loadUserMap2(map_set) {
	var data_set = {
		id: 'defaultMap',
		lat: null,
		lng: null,
		zoom: 12,
		display: [],
		scale: 'large',
		overview: true,
		maptype: true,
		open_message: false
	};
	for (var key in map_set) {
		data_set[key] = map_set[key];
	}
	if (!data_set.lat && map_set.display.length) {
		data_set.lat = map_set.display[0].lat;
	}
	if (!data_set.lng && map_set.display.length) {
		data_set.lng = map_set.display[0].lng;
	}
	
	if(mapCache[data_set.id])
	{
		mapupdate2(mapCache[data_set.id], data_set);
	}
	else
	{
		mapCache[data_set.id] = mapload2(data_set);
	}
	
	if(Number(data_set.zoom))
	{
		mapCache[data_set.id].setZoom(Number(data_set.zoom));
	}
	
	return mapCache[data_set.id];
}

var markers = {};

function mapload2(data_set) {
	if(GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById(data_set.id));
		// 各コントロール追加
		if(data_set.scale == 'large') {
			map.addControl(new GLargeMapControl());
		} else if(data_set.scale == 'small') {
			map.addControl(new GSmallMapControl());
		}
		if(data_set.overview) {
			map.addControl(new GOverviewMapControl());
		}
		if(data_set.maptype) {
			map.addControl(new GMapTypeControl());
		}
		map.setCenter(new GLatLng(data_set.lat, data_set.lng), data_set.zoom);
		
		if(data_set.display != undefined && data_set.display.length) {
			// displayのマーカーのみ表示
			for (var j = 0; j < data_set.display.length; j++) {
				marker = data_set.display[j];
				marker.marker = set_marker(map, marker);
				set_action(map, marker, marker.marker, data_set.open_message);
				markers[marker.station_id] = marker;
			}
		}
		
		return map;
	}
}

function mapupdate2(map, data_set)
{
	if(GBrowserIsCompatible()) {
		// 吹き出しを閉じる
		map.closeInfoWindow();
		
		map.setCenter(new GLatLng(data_set.lat, data_set.lng), data_set.zoom);
		
		if(data_set.display != undefined && data_set.display.length) {
			// displayのマーカーのみ表示
			for (var j = 0; j < data_set.display.length; j++) {
				marker = data_set.display[j];
				marker.marker = set_marker(map, marker);
				set_action(map, marker, marker.marker, data_set.open_message);
				markers[marker.station_id] = marker;
			}
		}
		
		return map;
	}
}

var getCircle_created = null;
// 円を描く：ポリゴンを取得する
/*
サンプル
var params = {
	point: point,			 // 中心点
	radius: 1.59,			 // 半径
	vertex: 32,				 // 頂点の数
	bordercolor: "#ff0000",	 // 線の色
	borderweight: 5,		 // 線の太さ
	borderopacity: 0.5,		 // 線の透過レベル
	fillcolor: "#0000ff",	 // 塗りつぶしの色
	fillopacity: 0.1		 // 塗りつぶしの透過レベル
};
var circle = getCircle( params );
map.addOverlay(circle);
*/
function getCircle(params) {
	var vertex = params.vertex; // 頂点の数
	var point = params.point; // 中心点
	var radius = params.radius; // 半径
	var color = params.bordercolor; // 線の色
	var weight = params.borderweight; // 線の太さ
	var opacity = params.borderopacity; // 線の透過レベル
	var fillcolor = params.fillcolor; // 塗りつぶしの色
	var fillopacity = params.fillopacity; // 塗りつぶしの透過レベル
	
	var EquatorialRadius = 6378137; // 赤道半径 (WGS-84)
	var F = 298.257223563;          // 扁平率の逆数 (WGS-84)
	
	// 離心率の２乗
	var E = ((2 * F) -1) / Math.pow(F, 2);
	
	// π × 赤道半径
	var PI_ER = Math.PI * EquatorialRadius;
	
	// 1 - e^2 sin^2 (θ)
	var TMP = 1 - E * Math.pow(Math.sin(point.latRadians()), 2);
	
	// 経度１度あたりの長さ(m)
	var arc_lat = (PI_ER * (1 - E)) / (180 * Math.pow(TMP, 3/2)); 
	
	// 緯度１度あたりの長さ(m)
	var arc_lng = (PI_ER * Math.cos(point.latRadians())) / (180 * Math.pow(TMP, 1/2)); 
	
	// 半径をｍ単位に
	var R = radius * 1000;
	var points = new Array(vertex);
	for (i = 0; i <= vertex; i++) {
		var rad = (i / (vertex / 2)) * Math.PI;
		var lat = (R / arc_lat) * Math.sin(rad) + point.lat();
		var lng = (R / arc_lng) * Math.cos(rad) + point.lng();
		
		points[i] = new google.maps.LatLng(lat, lng);
	}
	//return new google.maps.Polyline(points, color, weight, opacity);
	getCircle_created = new GPolygon(points, color, weight, opacity, fillcolor, fillopacity);
	return getCircle_created;
}
