// 2006-06-12 Google Maps を利用して地図を表示する。

var gMap;	// GMap2 オブジェクト。

/* ***************************************************** */
/* マーカーを作成する。                                  */
/* ***************************************************** */
function createMarker(point, name, icon_num) {
	var marker = new GMarker(point, {
		icon : makeIcon(icon_num)
	});
	// click イベントを受取ったら、情報ウィンドウ(店舗情報)を表示して
	// マーカーアイコンを変更する。
	GEvent.addListener(marker, "click", function(){
		if (icon_num) {
			marker.setImage("/world/img/icons/icon" + icon_num + "b.png");
		} else {
			marker.setImage("/world/img/icons/iconrb.png");
		}
		marker.openInfoWindowHtml(name);
	});
	GEvent.addListener(marker, "infowindowclose", function(){
		if (icon_num) {
			marker.setImage("/world/img/icons/icon" + icon_num + "a.png");
		} else {
			marker.setImage("/world/img/icons/iconra.png");
		}
	});
	return marker;
}
/* ****************************************************** */
/* アイコンを作成する。                                   */
/* ****************************************************** */
function makeIcon(icon_no) {
	var icon = new GIcon();
	if (icon_no) {
		// アイコン番号指定用(リストページ)アイコン
		icon.image  = ("/world/img/icons/icon" + icon_no + "a.png");
	}else{
		// アイコン番号指定無し用(クーポンページ)アイコン
		icon.image  = "/world/img/icons/iconra.png";
	}
	icon.shadow = "/world/img/icons/icon_transparent.png";
	icon.transparent = "/world/img/icons/icon_transparent.png";
	icon.imageMap = [0,0,0,25,25,25,25,0];
	icon.iconSize   = new GSize(26, 26);
	icon.shadowSize = new GSize(26, 26);
	icon.iconAnchor = new GPoint(13, 13);
	icon.infoWindowAnchor = new GPoint(13, 2);
	return icon; 
}
/* ****************************************************** */
/* ロード時に実行される関数。                             */
/* ****************************************************** */
function onLoad(c_lat, c_lng, scale) {

	// ブラウザの互換性をチェックする。
	if (GBrowserIsCompatible()) {
		// メイン処理。

		// 地図オブジェクトを作成する。
		gMap = new GMap2(document.getElementById("map"));
		
		// 中心座標と縮尺を設定する。
		var sw = new GLatLng(parseFloat(viewDomain.south),
							 parseFloat(viewDomain.west));
		var ne = new GLatLng(parseFloat(viewDomain.north),
							 parseFloat(viewDomain.east));
		var bounds = new GLatLngBounds(sw, ne);
		gMap.setCenter(bounds.getCenter(), gMap.getBoundsZoomLevel(bounds));

		// 各種コントロール部品を設定する。
		gMap.addControl(new GLargeMapControl());
		gMap.addControl(new GMapTypeControl());
		gMap.addControl(new GScaleControl());
		gMap.addControl(new GOverviewMapControl());

		// 縮尺が変更されたら、店舗を纏め直して再表示する。
		GEvent.addListener(gMap, "zoomend", function(oldLeve, newLevel) {
			// 一旦全てのマーカー(オーバーレイ)を削除する。
			gMap.clearOverlays();
			// 新たにマーカーを設置する。
			setMarkers();
		});

		// 地図にマーカーを設置する。
		setMarkers();
	} else {
		var errMsg = ('<p style="text-align:center;">' +
					  '申し訳ありません。<br />' +
					  'ご使用のブラウザでは地図を閲覧する事は出来ません。');
		if (document.all) {
			document.all("map_view").innerHTML = errMsg;
		} else if (document.getElementById()) {
			document.getElementById("map_view").innerHTML = errMsg;
		}
	}
}
/* ****************************************************** */
/* 地図にマーカーを設定する。                             */
/* ****************************************************** */
function setMarkers() {
	// 表示領域の対角線の実距離を求める。
	var bounds = gMap.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	var distance = sw.distanceFrom(ne);
	// 対角線距離の1/20を近傍半径とする。
	var radius = distance / 20.0;

	// 店舗の配列を緯度、経度順に整列する。
	// 常に同じ仕方で纏まるように。
	shopInfos.sort(reorderLatLng);

	// 或る店舗の近傍半径以内に在る店舗は、同じ緯度経度と
	// みなして表示する。
	var latLngList = new Array();
	for (var i=0; i<shopInfos.length; i++) {
		var point = new GLatLng(parseFloat(shopInfos[i].lat),
								parseFloat(shopInfos[i].lng));
		for (var j=0; j<latLngList.length; j++) {
			if (latLngList[j].point.distanceFrom(point) < radius) {
				latLngList[j].shops.push(shopInfos[i]);
				break;
			}
		}
		if (! (j<latLngList.length)) {
			latLngList.push({"point":point, "shops":[shopInfos[i]]});
		}
	}

	// JSON形式で設定されている店舗の件数分ループ
	for (var i = 0; i < latLngList.length; i++) {
		var point = latLngList[i].point;
		var shops = latLngList[i].shops;
		var icon_num = null;
		var html_val = ("<div ");
		html_val += ("style=\"max-width:400px;width:400px;text-align:left;");
		if (shops.length >= 3) {
			html_val += ("height:200px;overflow:scroll;");
		}
		html_val += ("\">");
		html_val += ("<table cellspacing=\"2\" " +
					 "cellpadding=\"0\" border=\"0\">\n");
		for (var j=0; j<shops.length; j++) {
			html_val += ('<tr>' +
						 '<td width="30" valign="top" rowspan="4">' +
						 '<img width="26" height="26" alt="" ' +
						 'src="/world/img/icons/icon' +
						 shops[j].shop_order +
						 "a.png\"></td>" +
						 "<td width=\"55\" rowspan=\"2\" " +
						 "valign=\"top\" nowrap>" +
						 '<font class="text8">店　　名： </font></td>' +
						 '<td nowrap><font class="text8"><b>' +
						 shops[j].kana +
						 "</b></font></td></tr>\n"+
						 '<tr><td nowrap><font class="text8"><b>' +
						 '<a href="'+
						 shops[j].url +
						 '">' +
						 shops[j].name +
						 "</a></b></font></td></tr>\n" +
						 '<tr><td width="55" valign="top" nowrap>' +
						 '<font class="text8">住　　所： </font></td>' +
						 '<td><font class="text8">' +
						 shops[j].address +
						 "</td></tr>\n" +
						 "<tr><td width=\"55\" valign=\"top\" " +
						 "nowrap>" +
						 "<font class=\"text8\">アクセス： " +
						 "</font></td>" +
						 "<td><font class=\"text8\">" +
						 shops[j].access +
						 "</td></tr>\n" +
						 "<tr><td colspan=\"2\" valign=\"top\" " +
						 "nowrap=\"nowrap\"><img " +
						 "src=\"/world/img/spacer.gif\" " +
						 "border=\"0\" alt=\"\" width=\"1\" " +
						 "height=\"10\"></td></tr>\n");
		}
		html_val += ("</table>");
		html_val += ("</div>\n");
		if (shops.length == 1) {
			icon_num = shops[0].shop_order;
		}
		var mark = createMarker(point, html_val, icon_num);
		gMap.addOverlay(mark);
	}
}
/* ****************************************************** */
/* 店舗を緯度、経度順に整列する。                         */
/* ****************************************************** */
function reorderLatLng(a, b) {
	if (a.lat == b.lat) {
		return b.lng - a.lng;
	} else {
		return b.lat - a.lat;
	}
}

