/**
 * エリアマップ用 Googple Maps 関数群
 */
// $Id$

var mapObj = null; // GMap2インスタンスを保持する変数
var spotList = []; // スポットリスト
var transportList = []; // 運送リスト

var strMapDocRoot = ''; // マップのDocRoot
var strTarget = null; // ターゲット名(spot, event, hotel)
var strTargetId = null; // 中心に表示しているターゲットのID

var majorGenreShowList = [];

var visibleNearSpot = true; // 近隣スポットの表示状態
var defaultNearSpotLimit = 10; // 近隣スポットのデフォルト取得件数

//var markerThis = null; // 現在のマップで表示したい場所アイコン。GMarkerのインスタンス
var markerPoint = null; // 現在選択している場所アイコン。GMarkerのインスタンス
var markerPointIndex = null; // 現在選択している場所アイコンが居るインデックス

// アイコン用番号リスト
var iconNumberList = new Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

/**
 * スポット詳細用マップを作成
 *
 * @param docroot   起点URL
 * @param mapElemId マップをはめる要素ID
 * @param lat       緯度
 * @param lng       経度
 */
function makeMapForArea(docroot, mapElemId, lat, lng, zoom)
{
	return makeMapForArea(docroot, mapElemId, lat, lng, zoom, null, null)
}

function makeMapForArea(docroot, mapElemId, lat, lng, zoom, target, targetId)
{
	var elemMap = document.getElementById(mapElemId);
	
	// DocRootを確保
	strMapDocRoot = docroot;
	
	// ターゲット情報
	strTarget = target;
	strTargetId = targetId;
	
	// 中心点の緯度経度インスタンス
	var llCenter = new GLatLng(lat, lng);
	
	// Google Maps を作成
	mapObj = new GMap2(elemMap);
	
	// コントロール追加
	mapObj.addControl(new GLargeMapControl()); // 大きいマップコントローラー
	//mapObj.addControl(new GSmallMapControl()); // 小さいマップコントローラー
	//mapObj.addControl(new GSmallZoomControl()); // ズームのみのコントローラー
	mapObj.addControl(new GScaleControl()); // スケール表示
	mapObj.addControl(new GMapTypeControl()); // 地図・航空写真選択
	mapObj.addControl(new GOverviewMapControl()); // 全体図
	
	// センター設定
	mapObj.setCenter(llCenter, zoom);
	mapObj.setMapType(G_NORMAL_MAP);
	
	// イベントリスナー
	GEvent.addListener(mapObj, 'dragend', function () { loadNearSpots(docroot, mapObj, 0.009); loadNearTransports(docroot, mapObj, 0.009); });
	GEvent.addListener(mapObj, 'zoomend', function () {loadNearSpots(docroot, mapObj, 0.009);});
//	GEvent.addListener(mapObj, 'moveend', function () {loadNearSpots(docroot, mapObj, 0.009);});
	
//	// Thisマーカー
//	markerThis = createSelfMarker(docroot, lat, lng);
//	mapObj.addOverlay(markerThis);
	
	// Pointマーカー
	markerPoint = createPointMarker(docroot);
	
	return mapObj;
}

/**
 * 自身の位置用マーカーを作成する
 *
 * @param docroot   起点URL
 * @param lat       緯度
 * @param lng       経度
 * @return GMarkerインスタンス
 */
function createSelfMarker(docroot, lat, lng)
{
	var icon = createIcon(docroot, 'self.gif');
	
	return new GMarker(new GLatLng(lat, lng), {icon:icon});
}

/**
 * 位置用マーカーを作成する
 *
 * @param docroot   起点URL
 * @return GMarkerインスタンス
 */
function createPointMarker(docroot)
{
	var icon = createIcon(docroot, 'pointing.gif');
	
	return new GMarker(new GLatLng(0, 0), {icon:icon});
}

/**
 * 指定されたアイコンURLでGIconを作る
 *
 * @param docroot 起点URL
 * @param iconFile アイコンファイル
 * @return GIconインスタンス
 */
function createIcon(docroot, iconFile)
{
	var icon = new GIcon(G_DEFAULT_ICON);
	
	icon.image = docroot + '/map/image/' + iconFile;
	icon.shadow = '';
	icon.iconSize = new GSize(23, 31);
	icon.iconAnchor = new GPoint(11, 30);
	icon.infoWindowAnchor = new GPoint(11, 15);
	
	return icon;
}

/**
 * 近隣のスポット情報を取得する
 */
function loadNearSpots(docroot, map, radius)
{
	loadNearSpotsWithLimit(docroot, map, radius, defaultNearSpotLimit);
}

/**
 * 近隣のスポット情報を取得する
 */
function loadNearSpotsWithLimit(docroot, map, radius, limit)
{
	// マップの中心を取得
	var llCenter = map.getCenter();
	var lng = llCenter.x;
	var lat = llCenter.y;
	
	// URL作成
	var requestUrl = docroot + '/map/map_response.php?mode=getNearSpots2&lat=' + lat + '&lng=' + lng + '&rad=' + radius + '&limit=' + limit;
	if (null != strTarget && null != strTargetId)
		requestUrl+= '&ignore_' + target + '_id=' + targetId;
	
	// デフォルトリミットを上書き
	defaultNearSpotLimit = limit;
	
	var xmlHttp = GXmlHttp.create();
	xmlHttp.open('get', requestUrl);
	xmlHttp.onreadystatechange = function () { onreadystatechange_getNearSpots(xmlHttp, map, docroot); };
	xmlHttp.send(null);
}

function loadNearTransports(docroot, map, radius)
{
	loadNearTransportsWithLimit(docroot, map, radius, 20);
}

function loadNearTransportsWithLimit(docroot, map, radius, limit)
{
	// マップの中心を取得
	var llCenter = map.getCenter();
	var lng = llCenter.x;
	var lat = llCenter.y;
	
	// URL作成
	var requestUrl = docroot + '/map/transport.php?lat=' + lat + '&lng=' + lng + '&rad=' + radius + '&limit=' + limit;
	
	// デフォルトリミットを上書き
	//defaultNearSpotLimit = limit;
	
	var xmlHttp = GXmlHttp.create();
	xmlHttp.open('get', requestUrl);
	xmlHttp.onreadystatechange = function () { onreadystatechange_loadNearTransports(xmlHttp, map, docroot); };
	xmlHttp.send(null);
}

/**
 * 近隣のスポット読み込み情報処理
 * 
 * @param xmlHttp 通信を実行しているXmlHttpRequest
 * @param map     対象のGMap2
 */
function onreadystatechange_getNearSpots(xmlHttp, map, docroot)
{
	if (4 != xmlHttp.readyState || 200 != xmlHttp.status)
		return;
	
	// JSON展開
	var resSpots = eval(xmlHttp.responseText);
	
	// 変数
	var lastSpotList = spotList;
	var countSpot = 0; // スポット数
	var countEvent = 0; // イベント数
	var countHotel = 0; // 宿泊施設数
/*
	var htmlSpotList = ''; // スポットのHTML
	var htmlEventList = ''; // イベントのHTML
	var htmlHotelList = ''; // 宿泊施設のHTML
	var htmlMapList = ''; // マップリストHTML
*/
	// 現行スポットクリア
	spotList = [];
	
	// ループ
	for (i in resSpots)
	{
		var iconFile = '';
		
		// データの種類判断
		if (98 == resSpots[i]['major_genre_id'])
		{
			// イベント
			// アイコンファイル
			iconFile = 'event_icon_' + iconNumberList[countEvent] + '.gif';
			
			//// HTML
			//htmlEventList+= createEventHtml(docroot, resSpots[i], i, countEvent);
			
			countEvent++;
		}
		else if (97 == resSpots[i]['major_genre_id'])
		{
			// 宿泊施設
			// アイコンファイル
			iconFile = 'hotel_icon_' + iconNumberList[countHotel] + '.gif';
			
			//// HTML
			//htmlHotelList+= createHotelHtml(docroot, resSpots[i], i, countHotel);
			
			countHotel++;
		}
		else
		{
			// スポット
			// アイコンファイル
			iconFile = 'spot_icon_' + iconNumberList[countSpot] + '.gif';
			
			//// HTML
			//htmlSpotList+= createSpotHtml(docroot, resSpots[i], i, countSpot);
			
			countSpot++;
		}
		
		// アイコン作成
		var icon = createIcon(docroot, iconFile);
		
		// マーカー作成
		var marker = new GMarker(new GLatLng(resSpots[i]['lat'], resSpots[i]['lng']), {icon:icon});
		setSpotMarkerEvent(i, resSpots[i], marker);
		
		// スポットリストに加える
		spotList.push({info:resSpots[i], marker: marker});
	}
/*
	//
	// HTML 合成
	//
	// スポット
	if ('' != htmlSpotList)
	{
		htmlMapList+= '<div class="result" style="background-color: #FFC522; color: #FFFFFF;">スポット</div>';
		htmlMapList+= htmlSpotList;
	}
	// イベント
	if ('' != htmlEventList)
	{
		htmlMapList+= '<div class="result" style="background-color: #5561FF; color: #FFFFFF;">イベント</div>';
		htmlMapList+= htmlEventList;
	}
	// 宿泊
	if ('' != htmlHotelList)
	{
		htmlMapList+= '<div class="result" style="background-color: #EE9FEE; color: #FFFFFF;">宿</div>';
		htmlMapList+= htmlHotelList;
	}
	
	$('map_list').innerHTML = htmlMapList;
*/
	//
	// スポットの切り替え
	//
	addSpotMarker(spotList);
	removeSpotMarker(lastSpotList);
	lastSpotList = [];
/*
	//
	// 中点アイコン変更
	//
	mapObj.removeOverlay(markerThis);
	mapObj.addOverlay(markerThis);
*/
}

/**
 * 近隣の運送読み込み情報処理
 * 
 * @param xmlHttp 通信を実行しているXmlHttpRequest
 * @param map     対象のGMap2
 */
function onreadystatechange_loadNearTransports(xmlHttp, map, docroot)
{
	if (4 != xmlHttp.readyState || 200 != xmlHttp.status)
		return;
	
	// JSON展開
	var resTransports = eval(xmlHttp.responseText);
	
	// 変数
	var lastTransportsList = transportList;
	
	// 現行運送リスト
	transportList = [];
	
	// ループ
	for (i in resTransports)
	{
		var iconFile = '';
		
		// データの種類判断
		if (1 == resTransports[i]['transport_type'])
		{
			// レンタカー
			// アイコン
			iconFile = 'transport_icon_1.gif';
		}
		else
		{
			// タクシー
			// アイコンファイル
			iconFile = 'transport_icon_0.gif';
		}
		
		// アイコン作成
		var icon = createIcon(docroot, iconFile);
		
		// マーカー作成
		var marker = new GMarker(new GLatLng(resTransports[i]['lat'], resTransports[i]['lng']), {icon:icon});
		setTransportMarkerEvent(i, resTransports[i], marker);
		
		// スポットリストに加える
		transportList.push({info:resTransports[i], marker: marker});
	}
	
	//
	// スポットの切り替え
	//
	addSpotMarker(transportList);
	removeSpotMarker(lastTransportsList);
	lastTransportsList = [];
	
	//
	// 中点アイコン変更
	//
	//mapObj.removeOverlay(markerThis);
	//mapObj.addOverlay(markerThis);
}

/**
 * スポットマーカー用イベントを設定
 *
 * @param marker
 */
function setSpotMarkerEvent(index, info, marker)
{
	//GEvent.addListener(marker, 'click', function () { movePointer(index, marker.getLatLng().lat(), marker.getLatLng().lng()); });
	GEvent.addListener(marker, 'click', function () { openSpotInfoWindow(index, info, marker); });
}

function openSpotInfoWindow(index, info, marker)
{
/*
spot_id=1218
major_genre_id=4
spot_name=深沢紅子野の花美術館
area_name=盛岡市
long_text=　中津川沿い、上の橋下流の蔵風の建物。盛岡市出身の画家、深沢紅子氏の油絵と野の花の水彩...
lat=39.703211
lng=141.155972
city_code=03201
*/
	//map.openInfoWindow(map.getCenter(), document.createTextNode("Hello, world"));
	
	var urlPrefix = '/spot';
	if (98 == info['major_genre_id'])
		urlPrefix = '/event';
	if (97 == info['major_genre_id'])
		urlPrefix = '/hotel';
	var url = strMapDocRoot + urlPrefix + '/detail/' + info['city_code'] + '/' + info['spot_id'] + '.html';
	
	var html = '<div style="font-size: 80%; width: 320px;">';
	
	html+= '<div><strong><a href="' + url + '">' + info['spot_name'] + '</a></strong><br/>(' + info['area_name'] + ')</div>';
	html+= '<br/>';
	
	html+= '<div>';
	
	// 画像
	if (info['image_id'])
	{
		var urlImage = strMapDocRoot + urlPrefix + '/image/' + info['image_id'] + '?width=120&quality=60';
		
		html+= '<div style="background: url(' + urlImage +') center center no-repeat; width: 120px; height: 120px; float: left; margin: 4px;"></div>';
	}
	
	// 概要
	if (info['long_text_full'])
		html+= info['long_text_full'];
	else if (info['long_text'])
		html+= info['long_text'];
	
	html+= '</div>';
	html+= '<br style="clear: both;" />';
	
	html+= '<div style="margin-top: 1em;"><a href="' + url + '">⇒詳細ページ</a></div>';
	
	html+= '</div>';
	
	marker.openInfoWindowHtml(html);
}

/**
 * 運送マーカー用イベントを設定
 *
 * @param marker
 */
function setTransportMarkerEvent(index, info, marker)
{
	GEvent.addListener(marker, 'click', function () { openTransportInfoWindow(index, info, marker); });
}

function openTransportInfoWindow(index, info, marker)
{
	//map.openInfoWindow(map.getCenter(), document.createTextNode("Hello, world"));
	var html = '<div style="font-size: 80%">';
	
	html+= '<div><strong>' + info['name'] + '</strong></div>';
	html+= '<br/>';
	
	// フリーダイヤル
	if ('' != info['freecall'])
		html+= '<div>【フリーダイヤル】<br/>' + info['freecall'] + '</div>';
	// 電話番号
	if ('' != info['tel'])
		html+= '<div>【電話番号】<br/>' + info['tel'] + '</div>';
	// FAX番号
	if ('' != info['fax'])
		html+= '<div>【FAX番号】<br/>' + info['fax'] + '</div>';
	// 住所
	if ('' != info['address'])
	{
		html+= '<div>【住所】<br/>';
		
		if ('' != info['post_code'])
			html+= '〒' + info['post_code'] + '<br/>';
			
		html+= info['address'];
		html+= '</div>';
	}
	// URL
	if ('' != info['url'])
		html+= '<div><a href="' + info['url'] + '">' + info['url'] + '</a></div>';
	
	html+= '</div>';
	
	marker.openInfoWindowHtml(html);
}

/**
 * 'marker'を持つリストからマーカーを登録する
 *
 * @param list マーカーリスト
 */
function addSpotMarker(list)
{
	for (i in list)
	{
		mapObj.addOverlay(list[i]['marker']);
	}
}

/**
 * 'marker'を持つリストを使ってGoogle Maps上のマーカーを削除する
 *
 * @param list マーカーリスト
 */
function removeSpotMarker(list)
{
	for (i in list)
	{
		mapObj.removeOverlay(list[i]['marker']);
	}
}

/**
 * スポットHTML
 *
 * @param docroot ルート
 * @param info    スポット情報
 * @param index   インデックス
 */
function createSpotHtml(docroot, info, index, spotIndex)
{
	var html = '';
	
	var iconFile = createIconFile(docroot, 'spot', spotIndex);
	var urlDetail = docroot + '/spot/detail/' + info['city_code'] + '/' + info['spot_id'] + '.html';
	
	return createHtml(info, index, iconFile, urlDetail)
}

/**
 * 宿泊施設HTML
 *
 * @param docroot ルート
 * @param info    宿泊施設情報
 * @param index   インデックス
 */
function createHotelHtml(docroot, info, index, hotelIndex)
{
	var html = '';
	
	var iconFile = createIconFile(docroot, 'hotel', hotelIndex);
	var urlDetail = docroot + '/hotel/detail/' + info['city_code'] + '/' + info['spot_id'] + '.html';
	
	return createHtml(info, index, iconFile, urlDetail)
}

/**
 * イベントHTML
 *
 * @param docroot ルート
 * @param info    イベント情報
 * @param index   インデックス
 */
function createEventHtml(docroot, info, index, eventIndex)
{
	var html = '';
	
	var iconFile = createIconFile(docroot, 'event', eventIndex);
	var urlDetail = docroot + '/event/detail/' + info['city_code'] + '/' + info['spot_id'] + '.html';
	
	return createHtml(info, index, iconFile, urlDetail)
}

/**
 * 情報HTML作成
 *
 * @param info      情報
 * @param index     インデックス
 * @param iconFile  アイコンへのURL
 * @param urlDetail 詳細ページへのURL
 */
function createHtml(info, index, iconFile, urlDetail)
{
	return '<div class="near_spot_list" id="r' + index + '" onmouseover="movePointer(' + index + ', ' + info['lat'] + ', ' + info['lng'] + ');">' +
			'<h2>' +
				'<a href="' + urlDetail + '">' +
					'<img class="marker" src="' + iconFile + '" width="23" height="31" alt="' + info['spot_name'] + '" />' +
					//'<span style="color: #61C0EC;">' + info['spot_name'] + '</span>' +
					info['spot_name'] +
				'</a>' +
			'</h2>' +
			'<p>' +
				info['long_text']/* + '<br/>' +
				'<div style="text-align: right;"><a href="' + urlDetail + '">詳細へ</a></div>'*/ +
			'</p>' +
		'</div>';
}

/**
 * アイコンファイルパスの作成
 *
 * @param docroot ルート
 * @param type    'spot', 'event', 'hotel'
 * @param index   インデックス
 */
function createIconFile(docroot, type, index)
{
	return docroot + '/map/image/' + type + '_icon_' + iconNumberList[index] + '.gif';
}

/**
 * 視点移動
 *
 * @param index インデックス
 * @param lat 緯度
 * @param lng 経度
 */
function movePointer(index, lat, lng)
{
	var newLatLng = new GLatLng(lat, lng);
	
	mapObj.panTo(newLatLng);
	
	var nowLatLng = markerPoint.getLatLng();
	
	if (nowLatLng.lat() != newLatLng.lat() || nowLatLng.lng() != newLatLng.lng())
	{
		mapObj.removeOverlay(markerPoint);
		mapObj.addOverlay(markerPoint);
		markerPoint.setLatLng(newLatLng);
		markerPoint.show();
	}
	
	if (null != markerPointIndex)
	{
		var elemLast = $('r' + markerPointIndex);
		if (elemLast)
			elemLast.style.background = '';
	}
	
	if (null != index)
	{
		var elem = $('r' + index);
		elem.style.background = '#FFFFB9';
		//elem.scrollIntoView(false);
	}
	
	markerPointIndex = index;
}

/**
 * 大ジャンルでの表示非表示切り替え
 *
 * @param majorGenreId 大ジャンルID
 * @param show true/false
 */
function showMajorGenreSpot(majorGenreId, show)
{
	var now = (undefined == majorGenreShowList[majorGenreId]) ? true : majorGenreShowList[majorGenreId];
	
	if (now != show)
	{
		majorGenreShowList[majorGenreId] = show;
		
		if (isNearSpotVisible())
		{
			for (i in spotList)
			{
				if (majorGenreId == spotList[i]['info']['major_genre_id'])
				{
					if (show)
						spotList[i]['marker'].show();
					else
						spotList[i]['marker'].hide();
				}
			}
		}
	}
}

/**
 * 近隣観光スポットの表示切り替え
 *
 * @param show true/false
 */
function setNearSpotVisible(show)
{
	if (visibleNearSpot == show)
		return;
	
	visibleNearSpot = show;
	
	for (i in spotList)
	{
		if (visibleNearSpot)
		{
			// 大ジャンル的にOK?
			if (false == majorGenreShowList[spotList[i]['info']['major_genre_id']])
				continue;
			spotList[i]['marker'].show();
		}
		else
			spotList[i]['marker'].hide();
	}
}

/**
 * 近隣スポットの表示状態
 */
function isNearSpotVisible()
{
	return visibleNearSpot;
}

