﻿//-----------------------------------------------
/* 定数 */
//-----------------------------------------------

// 地図アイコンイメージファイル
var SHISETSUICON = '/common/images/map/m_destination.gif';		//目的地アイコン
var STATIONICON = '/common/images/map/m_station.png'			//最寄り駅アイコン
var STATIONICON_SHADOW = '/common/images/map/list_shadow.png'			//最寄り駅アイコン
var AROUNDSHISETSUICON = '/common/images/map/m_shisetsu.gif';	//周辺施設アイコン
var NATUREICON = '/common/images/map/m_nature.gif';				//景勝地アイコン
var SHRINEICON = '/common/images/map/m_shrine.gif';				//神社仏閣アイコン
var STRUCTUREICON = '/common/images/map/m_structure.gif';		//建築物･史跡アイコン
var PARKICON = '/common/images/map/m_park.gif';					//動物園･公園アイコン
var MUSEUMICON = '/common/images/map/m_museum.gif';				//美術館･博物館アイコン
var INFOCENTERICON = '/common/images/map/m_infocenter.gif';		//観光センターアイコン
var OTHERSICON = '/common/images/map/m_others.gif';				//その他アイコン
var THEMEPARKICON = '/common/images/map/m_themepark.gif';		//テーマパークアイコン
var SPORTSICON = '/common/images/map/m_sports.gif';				//スポーツ・アウトドアアイコン
var ACTIVITYICON = '/common/images/map/m_activity.gif';			//体験施設アイコン
var SHOPPINGICON = '/common/images/map/m_shopping.gif';			//ショッピングモールアイコン
var FASHIONICON = '/common/images/map/m_shopping.gif';			//ファッション･バラエティーストアアイコン
var ONSENICON = '/common/images/map/m_onsen.gif';				//温泉施設アイコン

// 初期縮尺決定時の最大縮尺レベル
var MAXSCALE = 7;

// 地図コントロールのデザイン
var CONTROL = '3';

// 縮尺レベル
var SCALE = [
	{LEVEL:18,DISTANCE:40},
	{LEVEL:17,DISTANCE:70},
	{LEVEL:16,DISTANCE:100},
	{LEVEL:15,DISTANCE:150},
	{LEVEL:14,DISTANCE:230},
	{LEVEL:13,DISTANCE:300},
	{LEVEL:12,DISTANCE:450},
	{LEVEL:11,DISTANCE:600},
	{LEVEL:10,DISTANCE:1500},
	{LEVEL:9,DISTANCE:3000},
	{LEVEL:8,DISTANCE:4500},
	{LEVEL:7,DISTANCE:7700},
	{LEVEL:6,DISTANCE:15000},
	{LEVEL:5,DISTANCE:30000},
	{LEVEL:4,DISTANCE:45000},
	{LEVEL:3,DISTANCE:90000},
	{LEVEL:2,DISTANCE:200000},
	{LEVEL:1,DISTANCE:400000}
]

var strUrl = 'ajax/AroundShisetsu.aspx';
//var strUrl = 'AroundShisetsu.txt';


//-----------------------------------------------
/* 変数 */
//-----------------------------------------------
var lat;			//緯度
var lon;			//経度
var lang;			//1:日本語,5:英語
var stat;			//最寄駅名
var area;			//エリアコード（都道府県コード）
var shisetsu;		//施設名
var shisetsuEng;	//施設名英語
var statlat;		//最寄り駅緯度
var statlon;		//最寄り駅経度
var map;			//地図
var ratio;			//1:施設詳細,1.5:アクセスマップ
var userlay;		//ユーザーレイヤ
var markstation;	//最寄り駅のマーカー
var routeopts;		//ルート探索条件指定オブジェクト
var shisetsulayer;	//周辺施設レイヤ
var sightlayer;		//周辺観光レイヤ
var sightUrl;		//観光情報URL

//-----------------------------------------------
/* 関数 */
//-----------------------------------------------

// 施設詳細用の地図を表示
// latitude:緯度, longitude:経度
function loadMap(latitude, longitude, language) {
	lat = latitude;
	lon = longitude;
	ratio = 1; // 地図の大きさに合わせて縮尺を調整する
	if(language!=null){lang = language;}
	else{lang = '5';}

	// 最寄駅を検索し縮尺を決定、地図を表示する
	searchNearStation(execResult);
}

// アクセスマップ用の地図を表示
// latitude:緯度, longitude:経度, language:言語, stationName:最寄駅名, areaCode:エリアコード, shisetsuName:施設名, shisetsuNameEng:施設名英語（韓国語時のみ）
function loadAccessMap(latitude, longitude, language, stationName, areaCode, shisetsuName, shisetsuNameEng) {
	lat = latitude;
	lon = longitude;
	ratio = 1.5; // 地図の大きさに合わせて縮尺を調整する
	stat = stationName;
	area = areaCode;
	shisetsu = shisetsuName;
	shisetsuEng = shisetsuNameEng;
	shisetsulayer = new ZdcUserLayer();
	sightlayer = new ZdcUserLayer();
	if(language!=null){lang = language;}
	else{lang = '5';}
	// 言語に対応した言語のラジオボックスにチェックを入れる
	if(lang == '5')
	{
		document.getElementById('Eng').checked = true;
	}
	else if(lang == '4')
	{
		document.getElementById('Jpn').checked = true;
	}
	// ルートと周辺ホテルのチェックボックスにチェックを入れる
	//document.getElementById('Rte').checked = true;
	//document.getElementById('Htl').checked = true;

	// 最寄駅を検索し縮尺を決定、地図を表示する
	if(stat.length > 0) {
		searchStation(stationSearchResult);
	} else {
		searchNearStation(execResult);
	}
}

// 地図の表示言語切り替え
// language:言語
function changeLanguage(language) {
    lang = language;
    map.setMapType(lang);
    map.reflashMap();
}

// 最寄駅検索の応答から縮尺を決定する(最寄駅検索のイベントにセットする)
// result:最寄駅検索結果
function execResult(result) {
	var scale;
	if(result.status == '1') {
		// エラー
//		msg =('パラメータエラーが発生しました');
//		alert(msg);
	} else if(result.status == '0') {
		// 検索に成功した場合

//		msg = result.items[0].stationName + '(' + result.items[0].lineName + ')/' + result.items[0].distance + 'm';
//		alert(msg);

		// 縮尺を決定する

		var dist = result.items[0].distance;
		for(var i=0; i<SCALE.length && MAXSCALE<=SCALE[i].LEVEL; i++)
		{
			if(SCALE[i].DISTANCE*ratio>dist)
			{
				scale = SCALE[i].LEVEL;
				break;
			}
		}
		if(scale==null)
		{
			scale = MAXSCALE;
		}
	}
	if(scale==null)
	{
		scale = 12;	//適当に…
	}

	if(result.items[0] != undefined){//--2011.1206 brain add
		statlat = result.items[0].lat;
		statlon = result.items[0].lon;
	}
	else{
		
		var rmobj=document.getElementById('Rte').parentNode;
		while(rmobj.firstChild){
			rmobj.removeChild(rmobj.firstChild);
		}
		
	}
	// 地図の表示
	showMap(scale);
}

// 最も近い最寄駅1件を検索
// func:応答関数
function searchNearStation(func) {
	/* 検索オブジェクトと検索条件指定オブジェクトを生成する */
	var nstat = new ZdcNearStation();
	var opts = new ZdcNearStationOptions();

	/* 検索条件を指定する */
	opts.pointFlg = '1'; // 緯度経度を標準形式で取得する

	opts.lon = lon;
	opts.lat = lat;
	opts.limitCount = 1; // 1件
	opts.radius = 0; // 最も距離が近いものを検索

	/* 検索終了後に実施する関数をイベントリスナ登録する */
	ZdcEvent.addListener(nstat,'end',func);

	/* 検索を実施する */
	nstat.search(opts);
}

// 地図を表示
// scale:縮尺
function showMap(scale) {
	map = new ZdcMap(document.getElementById('Map'));
	map.setMapType(lang);
	map.reflashMap();
	map.addZdcKeyControl();	// キーボード操作を可能に
	map.setWheelType(2);	// マウスホイールの拡大縮小方向

	map.setMapLocation(new ZdcPoint(lon,lat),scale);
	map.saveMapLocation();

	/* 地図コントロールを追加する */
	map.addMapCenter(new ZdcMapCenter('1'));
	map.addMapScaleBar(new ZdcScaleBar('1'));
	map.addMapControl(new ZdcControl(CONTROL));

	/* マーカーを表示する */
	userlay = new ZdcUserLayer();
	userlay.setLayerScale(1,18); // すべてのスケールでマーカーを動作させる
	userlay.setLayerType('manual'); // 縮尺レベル変更時にレイヤを自動削除する
	var icon = new ZdcIcon(new ZdcIcon(),SHISETSUICON);
	var mark = new ZdcMarker(new ZdcPoint(lon,lat),icon);
	userlay.addMarker(mark);
	
	/* ダブルクリック時に地図を拡大する */
	ZdcEvent.addListener(map,'dblclickend',function(){
		map.mapZoomIn();
	});
	
	if(shisetsu != null) {
			
		// 施設マーカーにカーソルを合わせたら施設名を表示する
		ZdcEvent.addListener(mark, 'mouseovermarker', function(){ 
			map.closeMsgWindow(); // 他の吹き出しが開いている場合閉じる
			if(shisetsuEng.length > 0) {
				var node = document.createElement('div');
				node.appendChild(document.createTextNode(shisetsuEng));
				node.appendChild(document.createElement('br'));
				node.appendChild(document.createTextNode(shisetsu));
			} else {
				var node = document.createTextNode(shisetsu);
			}
			map.createMsgWindow();
			map.openMsgWindow(new ZdcPoint(lon,lat), node, node, new ZdcPixel(0,-10), true);
		});
		
		// 施設マーカーからカーソルが外れたら吹出しを消す
		ZdcEvent.addListener(mark, 'mouseoutmarker', function(){ 
			map.closeMsgWindow();
		});
		
		// 施設マーカーをクリックしたら施設詳細画面を開く
		ZdcEvent.addListener(mark, 'mouseclickmarker', function(){ 
			var url = document.getElementById('ShisetsuName').href;
			window.open(url, '_blank');
		});

		if(statlon != undefined && statlat != undefined){//--2011.1206 brain add
			// 最寄り駅アイコンを表示する
			var stationIcon = new ZdcIcon(new ZdcIcon(), STATIONICON, STATIONICON_SHADOW);
			stationIcon.shdoffset = new ZdcPixel(1,22);
			markstation = new ZdcMarker(new ZdcPoint(statlon, statlat), stationIcon);
			
			// ルートの検索
			searchRoute(routeResult);
			userlay.addMarker(markstation);
		}
		showShisetsu();
	}
	map.addUserLayer(userlay);
}

// 指定された駅を検索
// func:応答関数
function searchStation(func) {
	/* 検索オブジェクトと検索条件指定オブジェクトを生成する */
	var station = new ZdcSearchStation();
	var opts = new ZdcSearchStationOptions(stat);
	
	/* 検索条件を指定する */
	opts.pointFlg = '1'; // 緯度経度を標準形式で取得する
	opts.todCode = area; // 地区コードを指定して検索範囲を絞る
	
	/* 検索終了後に実地する関数をイベントリスナ登録する */
	ZdcEvent.addListener(station, 'end', func);
	
	/* 検索を実地する */
	station.search(opts);
}

// 検索結果から最寄駅を絞り込み緯度経度を取得
// result:駅検索結果
function stationSearchResult(result) {
	var scale;
	var nearStation; // 最寄り駅
	var nearestStation; // DBの駅名に一致しなかった最寄り駅
	var geo = new ZdcGeometric();	
	var p1 = new ZdcPoint(lon, lat); // 施設の座標
	var dist = 10000; // 施設からの距離。適当に10000mと設定
	var dis; // 最寄駅名が一致しなかった場合、距離を保持する変数
	
	if(result.status == '1') { // 検索成否はresult.statusに格納される
//		msg = ('パラメータエラーが発生しました');
//		alert(msg);
	} else if(result.status == '5') { // 検索結果が０件の場合は最寄り駅を検索する
		searchNearStation(execResult);	
	} else if(result.status == '0') {
		for(i = 0; i < result.recCount; i++) { // 最寄り駅を取得する
			var p2 = new ZdcPoint(result.items[i].lon, result.items[i].lat);
			var distp2 = Math.floor(geo.getPoint2PointDistance(p1, p2)); //	駅と施設の距離

			if(stat == result.items[i].stationName && dist >= distp2) { // 検索結果から最寄駅名に一致する一番近い駅を取得
				dist = distp2;
				nearStation = result.items[i];
			} else if(nearStation == null && dist >= distp2) { // 最寄駅名に一致しなかった場合、一番近い駅を取得
				dis = distp2;
				nearestStation = result.items[i];
			}
		}		
		if(nearStation == null) { // 検索結果とDBの駅名が一致しなかったら距離が一番近い駅を設定
			nearStation = nearestStation;
			dist = dis;
		}
		
//		msg = nearStation.stationName + nearStation.lat + '　' + nearStation.lon;
//		alert(msg); //検索に成功した場合のみ、表示する
		
		for(var i=0; i<SCALE.length && MAXSCALE<=SCALE[i].LEVEL; i++)
		{
			if(SCALE[i].DISTANCE*1.5>dist)
			{
				scale = SCALE[i].LEVEL;
				break;
			}
		}
		if(scale==null)
		{
			scale = MAXSCALE;
		}
			
		statlat = nearStation.lat;
		statlon = nearStation.lon;
		
		// 地図の表示
		showMap(scale);	
	}
}

// 最寄り駅からホテルまでのルートを検索
// func:応答関数
function searchRoute(func) {
		/* 探索オブジェクトと徒歩ルート探索条件指定オブジェクトを生成する */
		var route = new ZdcPRouteSearch();
		routeopts = new ZdcPRouteSearchOptions();
		
		/* 探索条件を指定する */
		routeopts.departurePoint.point = new ZdcPoint(statlon, statlat); // 最寄り駅から
		routeopts.departurePoint.stationFlg = '1'; // 始点は駅
		routeopts.arrivalPoint.point = new ZdcPoint(lon, lat); // ホテルまで
		routeopts.pointFlg = '1';
		routeopts.psc = '0';
		routeopts.showMarker = false;

		/* 探索結果を地図に反映する */
//T.S		map.addPRouteSearch(route);
			
		/* 探索終了後に実施する関数を指定する */
//T.S		ZdcEvent.addListener(route, 'end', func);

		/* 探索を実施する */
//T.S	route.search(routeopts);
}

// ルート検索の結果を判定
// result:ルート検索結果
function routeResult(result) {
	if(result.status == '1') { // 検索成否はresult.statusに格納される
//		msg = ('パラメータエラーが発生しました');
//		alert(msg);
	} else if(result.status == '0') {
//		msg = ('探索に成功しました');
//		alert(msg);
	}
}

// ルートの表示･非表示
function showRoute() {
	var route = new ZdcPRouteSearch();
	if(map.getPRouteSearch() != null && document.getElementById('Rte').checked == false) { 
		map.removePRouteSearch();				
	} 
	else if(map.getPRouteSearch() == null && document.getElementById('Rte').checked == true) 	{
		map.addPRouteSearch(route);
		route.search(routeopts);
	}
}

// 周辺施設アイコンのの表示･非表示
function showShisetsu() {
	if(shisetsulayer.getMarkerCount() == 0 && document.getElementById('Htl').checked == true) { //周辺施設マーカーがなかったら表示させる
		var latdms = ZdcCommon.DEG2DMS(lat); // 緯度を度→度分秒に変換
		var londms = ZdcCommon.DEG2DMS(lon); // 緯度を度→度分秒に変換
		var param = '?';
		param += 'lat=' + latdms.deg + '.' + latdms.min + '.' + latdms.sec; // パラメータに緯度を設定
		param += '&lon=' + londms.deg + '.' + londms.min + '.' + londms.sec; // パラメータに経度を設定
		param += '&ardinfo=shisetsu'
		sendRequest(strUrl+param, true, makeShisetsuMarker);
	} else { //すでに周辺施設マーカーが表示されていたら削除する
		shisetsulayer.clearMarker();
	}
}

// 周辺施設情報からマーカーとそれに関連するイベント作成
// res:サーバーからの応答文字列(周辺施設情報)
function makeShisetsuMarker(res) {
	var allItem = eval('(' + res + ')'); // 文字列をevalで評価し配列にする
	if(allItem.data.length != 0) { //それぞれの施設のマーカーを作成
		for(i = 0; i < allItem.data.length; i++) {
			shisetsulayer.setLayerScale(1,18); // すべてのスケールでマーカーを動作させる
			var icon = new ZdcIcon(new ZdcIcon(),AROUNDSHISETSUICON);
			var marker = new ZdcMarker(new ZdcPoint(allItem.data[i][1], allItem.data[i][0]), icon);
			shisetsulayer.addMarker(marker);
			
			// 施設マーカーにカーソルを合わせたら施設名称を表示
			ZdcEvent.addListener(marker, 'mouseovermarker', function() { 
				map.closeMsgWindow(); // 他の吹き出しが開いている場合閉じる
				for(i = 0; i < allItem.data.length; i++) {
					var shisetsupoint = new ZdcPoint(allItem.data[i][1], allItem.data[i][0]);				
					if(shisetsupoint.lat == this.Point.lat && shisetsupoint.lon == this.Point.lon) { // マーカーの緯度経度に一致する施設名を取得する
						if(allItem.data[i].length == 8) {　// 韓国語の場合英語名と韓国語名の併記
							var node = document.createElement('div');
							node.appendChild(document.createTextNode(allItem.data[i][7]));
							node.appendChild(document.createElement('br'));
							node.appendChild(document.createTextNode(allItem.data[i][2]));
						} else {
							var node = document.createTextNode(allItem.data[i][2]);
						}
						map.createMsgWindow();
						map.openMsgWindow(shisetsupoint, node, node, new ZdcPixel(0,-10), true);
						break;
					}
				}
			});
			
			//施設マーカーからカーソルが離れたら吹出しを削除
			ZdcEvent.addListener(marker, 'mouseoutmarker', function() { 
				map.closeMsgWindow();
			});
			
			//施設マーカーをクリックしたら施設詳細画面を別ウィンドウで開く
			ZdcEvent.addListener(marker, 'mouseclickmarker', function() { 
				for(i = 0; i < allItem.data.length; i++) {
					var shisetsupoint = new ZdcPoint(allItem.data[i][1], allItem.data[i][0]);				
					if(shisetsupoint.lat == this.Point.lat && shisetsupoint.lon == this.Point.lon) {　// マーカーの緯度経度に一致する地区施設コード、エリアコードを取得する
						var url = 'ShisetsuDetail.aspx?ar=';
						url += allItem.data[i][6];
						url += '&st=' + allItem.data[i][4] + allItem.data[i][5];
						window.open(url, "_blank");
						break;
					}
				}
			});
		}
		map.addUserLayer(shisetsulayer); // 周辺施設のマーカーを表示
	}
}

// 周辺観光地アイコンのの表示･非表示
function showSightseeing(sightseeingURL) {
	if(sightlayer.getMarkerCount() == 0 && document.getElementById('Sst').checked == true) { //周辺観光地マーカーがなかったら表示させる
		sightUrl = sightseeingURL;
		var latdms = ZdcCommon.DEG2DMS(lat); // 緯度を度→度分秒に変換
		var londms = ZdcCommon.DEG2DMS(lon); // 緯度を度→度分秒に変換
		var param = '?';
		param += 'lat=' + latdms.deg + '.' + latdms.min + '.' + latdms.sec; // パラメータに緯度を設定
		param += '&lon=' + londms.deg + '.' + londms.min + '.' + londms.sec; // パラメータに経度を設定
		param += '&ardinfo=sight'
		sendRequest(strUrl+param, true, makeSighteMarker);
	} else { //すでに周辺観光マーカーが表示されていたら削除する
		sightlayer.clearMarker();
	}
}

// 周辺観光情報からマーカーとそれに関連するイベント作成
// res:サーバーからの応答文字列(周辺観光情報)
function makeSighteMarker(res) {
	var allItem = eval('(' + res + ')'); // 文字列をevalで評価し配列にする
	if(allItem.data.length != 0) { //それぞれの観光地のマーカーを作成
		for(i = 0; i < allItem.data.length; i++) {
			sightlayer.setLayerScale(1,18); // すべてのスケールでマーカーを動作させる
			var icon= new ZdcIcon();
			switch(allItem.data[i][3]) { // 観光地の種類に合わせたアイコンを設定
				case '10': // 景勝地
					icon = new ZdcIcon(new ZdcIcon(), NATUREICON);
					break;
				case '11': // 神社仏閣
					icon = new ZdcIcon(new ZdcIcon(), SHRINEICON);
					break;
				case '12': // 建築物・史跡
					icon = new ZdcIcon(new ZdcIcon(), STRUCTUREICON);
					break;
				case '13': // 動物園・公園
					icon = new ZdcIcon(new ZdcIcon(), PARKICON);
					break;
				case '14': // 博物館･美術館
					icon = new ZdcIcon(new ZdcIcon(), MUSEUMICON);
					break;
				case '18': // 観光センター
					icon = new ZdcIcon(new ZdcIcon(), INFOCENTERICON);
					break;
				case '19': // その他
					icon = new ZdcIcon(new ZdcIcon(), OTHERSICON);
					break;
				case '20': // テーマパーク
					icon = new ZdcIcon(new ZdcIcon(), THEMEPARKICON);
					break;
				case '21': // スポーツ・アウトドア
					icon = new ZdcIcon(new ZdcIcon(), SPORTSICON);
					break;
				case '22': // 体験施設
					icon = new ZdcIcon(new ZdcIcon(), ACTIVITYICON);
					break;
				case '29': // その他
					icon = new ZdcIcon(new ZdcIcon(), OTHERSICON);
					break;
				case '60': // ショッピングモール
					icon = new ZdcIcon(new ZdcIcon(), SHOPPINGICON);
					break;
				case '61': // ファッション・バラエティストア
					icon = new ZdcIcon(new ZdcIcon(), FASHIONICON);
					break;
				case '71': // 温泉施設
					icon = new ZdcIcon(new ZdcIcon(), ONSENICON);
					break;
			}
			var marker = new ZdcMarker(new ZdcPoint(allItem.data[i][1], allItem.data[i][0]), icon);
			sightlayer.addMarker(marker);
			
			// 観光地マーカーにカーソルを合わせたら施設名称を表示
			ZdcEvent.addListener(marker, 'mouseovermarker', function() { 
				map.closeMsgWindow(); // 他の吹き出しが開いている場合閉じる
				for(i = 0; i < allItem.data.length; i++) {
					var shisetsupoint = new ZdcPoint(allItem.data[i][1], allItem.data[i][0]);				
					if(shisetsupoint.lat == this.Point.lat && shisetsupoint.lon == this.Point.lon) { // マーカーの緯度経度に一致する施設名を取得する
						if(allItem.data[i].length == 7) { // 韓国語の場合英語名と韓国語名の併記
							var node = document.createElement('div');
							node.appendChild(document.createTextNode(allItem.data[i][6]));
							node.appendChild(document.createElement('br'));
							node.appendChild(document.createTextNode(allItem.data[i][2]));
						} else {
							var node = document.createTextNode(allItem.data[i][2]);
						}
						map.createMsgWindow();
						map.openMsgWindow(shisetsupoint, node, node, new ZdcPixel(0,-10), true);
						break;
					}
				}
			});
			
			// 観光地マーカーからカーソルが離れたら吹出しを削除
			ZdcEvent.addListener(marker, 'mouseoutmarker', function() { 
				map.closeMsgWindow();
			});
			
			// 観光地マーカーをクリックしたら観光詳細画面を別ウィンドウで開く
			ZdcEvent.addListener(marker, 'mouseclickmarker', function() { 
				for(i = 0; i < allItem.data.length; i++) {
					var shisetsupoint = new ZdcPoint(allItem.data[i][1], allItem.data[i][0]);				
					if(shisetsupoint.lat == this.Point.lat && shisetsupoint.lon == this.Point.lon) {　// マーカーの緯度経度に一致する地区施設コード、エリアコードを取得する
						var url = sightUrl;
						url += '?BookID=' + allItem.data[i][4];
						url += '&category=' + allItem.data[i][5];
						window.open(url, "_blank");
						break;
					}
				}
			});
		}
		map.addUserLayer(sightlayer); // 周辺観光地のマーカーを表示
	}
}
