﻿// 地図
var map;

// 対象地点座標
var wrkLat;
var wrkLng;
var pointStr;
var pointLat;
var pointLng;

// 最寄り駅情報
var stationName;
var stationLat;
var stationLong;
var stationDist;
var stationLine;

var host = 'http://www.tato.co.jp/mashup/snavi/';
var file = 'returnXml.php3';

//ボタンクリック
function searchExec() {
  
  pointStr = document.getElementById('txtSearch').value;
  
  // Geocorderで住所の座標を取得
　getCoordinates(pointStr);
  
}

//座標取得
function getCoordinates(address) {
	
	var geocoder = null;
	
	if (GBrowserIsCompatible()) {
		geocoder = new GClientGeocoder();
	}
	else {
		return null;
	}
      
      if (geocoder) {
        geocoder.getLatLng(address,stationSearch);
      }
	
}

//駅検索
function stationSearch(point) {

	if (point) {
		// 世界測地系を日本測地系に変換
		wrkLat = point.lat();
		wrkLng = point.lng();
		
		pointLat = wrkLat;
		pointLng = wrkLng;
		
		// 最寄り駅情報取得
     		// XMLHttpRequestオブジェクトの生成
		try {
			// IEの場合
			xmlHttpStation = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e) {
			// Firefoxなどそのほかのブラウザの場合
			xmlHttpStation = new XMLHttpRequest();
		}
		var stationURL = host + file + '?execdiv=station';
		stationURL += '&x=' + pointLng + '&y=' + pointLat;
		
		xmlHttpStation.onreadystatechange = GetStationData;
		try {
			xmlHttpStation.open("GET",stationURL,true);
			xmlHttpStation.send(null);
		}
		catch(ex){
			window.alert('エラー発生：申し訳ございませんが、しばらく経ってからもう一度表示して下さい。');
			return;
		}

	} else {
		window.alert('"' + pointStr + '"の座標が取得できませんでした。\r\n(スポット名を入力している場合、住所で検索してみてください)');
	}

}

// 最寄り駅情報の取得
function GetStationData() {
	if (xmlHttpStation.readyState == 4 && xmlHttpStation.status == 200) {
		var xmlObj = xmlHttpStation.responseXML;
		
	  	if (xmlObj!=null &&
		    xmlObj.documentElement!=null) {
			var StationInfo = xmlObj.documentElement.getElementsByTagName('station');
			stationName = new Array(StationInfo.length);
			stationLat = new Array(StationInfo.length);
			stationLong = new Array(StationInfo.length);
			stationDist = new Array(StationInfo.length);
			stationLine = new Array(StationInfo.length);
			
			for ( i=0; i < StationInfo.length; i++ ) {
				var StationData = StationInfo[i];
				stationName[i] = StationData.getElementsByTagName('name')[0].firstChild.data;
				stationLong[i] = StationData.getElementsByTagName('x')[0].firstChild.data;
				stationLat[i] = StationData.getElementsByTagName('y')[0].firstChild.data;
				stationDist[i] = StationData.getElementsByTagName('distance')[0].firstChild.data;
				stationLine[i] = StationData.getElementsByTagName('line')[0].firstChild.data;
			}
			
			// データ表示
			StationDataDsp();
			
		}
		else {
			window.alert('エラー発生：申し訳ございませんが、しばらく経ってからもう一度表示して下さい。');
			return;
		}
	}
}

// 最寄り駅情報等の表示
function StationDataDsp() {
	
	// 駅情報表示
	var stationWindow = new Array(stationName.length);
	
	var now = new Date();
	
	for ( i = 0; i < stationName.length; i++ ) {
		if (i >= 10) {
			break;
		}
		
		var gMonth = Math.abs(now.getMonth()) + 1;
		var gDay = now.getDate();
		var gHour = now.getHours();
		var gMin = now.getMinutes();
		
		if (gHour.length==1){
			gHour = "0" + gHour;
		}
		if (gMin.length==1){
			gMin = "0" + gMin;
		}
		
		stationWindow[i] = '<DIV style="font-size:8pt; text-align:left; width:200px;">' +
					 stationLine[i] +
					 '&nbsp;' +
					 stationName[i] + '<BR>' +
					 stationDist[i] + '<BR>' +
					 '<HR>' +
					 '<FORM METHOD="GET" ACTION="http://www.google.co.jp/transit" target="_blank">' +
					 '<input type="hidden" name="ie" value="UTF-8" />' +
    					 '<input type="hidden" name="f" value="d" />' +
					 '<input type="text" style="width:100px;" name="saddr">から' +
					 'この駅まで、<BR>' + 
					 '<input type="hidden" name="daddr" value="' + stationName[i] + '">' +
					 '<input type="text" style="width:40px;" name="date" value="' + gMonth + '/' + gDay + '">' +
					 '<input type="text" style="width:40px;" name="time" value="' + gHour + ':' + gMin + '">に<br>' +
					 '<input type="radio" name="ttype" value="dep" checked>出発' +
					 '<input type="radio" name="ttype" value="arr">到着<br>' +
					 'する経路を' +
					 '<input type="submit" value="検索">' + 
					 '</FORM>' +
					 '</DIV>';
	}
	
	// GoogleMapsへの反映
	map = new GMap2(document.getElementById('map'));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.setCenter(new GLatLng(Math.abs(wrkLat), Math.abs(wrkLng)), 15);
	
	// マーカーアイコン
	var icon_g = new GIcon();
	icon_g.image = "img/station_location.png";
	icon_g.shadow = "img/rail.shadow.png";
	icon_g.iconSize = new GSize(32, 40);
	icon_g.shadowSize = new GSize(70, 35);
	icon_g.iconAnchor = new GPoint(6, 20);
	icon_g.infoWindowAnchor = new GPoint(16, 30);
	
	// 指定位置用アイコン
	var icon_location = new GIcon();
	icon_location.image = "img/location.png";
	icon_location.shadow = "img/location_shadow.png";
	icon_location.iconSize = new GSize(32, 32);
	icon_location.shadowSize = new GSize(59,32);
	icon_location.iconAnchor = new GPoint(32,32);
	icon_location.infoWindowAnchor = new GPoint(16,16);
	
	var markerAry = new Array(Math.abs(stationName.length) + 1);
	
	// 最寄り駅は上位10個のみ表示
	if (stationName.length > 0) {
		var point0 = new GLatLng(stationLat[0],stationLong[0]);
		var marker0 = new GMarker(point0,icon_g);
		GEvent.addListener(marker0,"click",function() {
			marker0.openInfoWindowHtml(stationWindow[0]);
		});
		markerAry[1] = marker0;
		map.addOverlay(marker0);
	}
	if (stationName.length > 1) {
		var point1 = new GLatLng(stationLat[1],stationLong[1]);
		var marker1 = new GMarker(point1,icon_g);
		GEvent.addListener(marker1,"click",function() {
			marker1.openInfoWindowHtml(stationWindow[1]);
		});
		markerAry[2] = marker1;
		map.addOverlay(marker1);
	}
	if (stationName.length > 2) {
		var point2 = new GLatLng(stationLat[2],stationLong[2]);
		var marker2 = new GMarker(point2,icon_g);
		GEvent.addListener(marker2,"click",function() {
			marker2.openInfoWindowHtml(stationWindow[2]);
		});
		markerAry[3] = marker2;
		map.addOverlay(marker2);
	}
	if (stationName.length > 3) {
		var point3 = new GLatLng(stationLat[3],stationLong[3]);
		var marker3 = new GMarker(point3,icon_g);
		GEvent.addListener(marker3,"click",function() {
			marker3.openInfoWindowHtml(stationWindow[3]);
		});
		markerAry[4] = marker3;
		map.addOverlay(marker3);
	}
	if (stationName.length > 4) {
		var point4 = new GLatLng(stationLat[4],stationLong[4]);
		var marker4 = new GMarker(point4,icon_g);
		GEvent.addListener(marker4,"click",function() {
			marker4.openInfoWindowHtml(stationWindow[4]);
		});
		markerAry[5] = marker4;
		map.addOverlay(marker4);
	}
	if (stationName.length > 5) {
		var point5 = new GLatLng(stationLat[5],stationLong[5]);
		var marker5 = new GMarker(point5,icon_g);
		GEvent.addListener(marker5,"click",function() {
			marker5.openInfoWindowHtml(stationWindow[5]);
		});
		markerAry[6] = marker5;
		map.addOverlay(marker5);
	}
	if (stationName.length > 6) {
		var point6 = new GLatLng(stationLat[6],stationLong[6]);
		var marker6 = new GMarker(point6,icon_g);
		GEvent.addListener(marker6,"click",function() {
			marker6.openInfoWindowHtml(stationWindow[6]);
		});
		markerAry[7] = marker6;
		map.addOverlay(marker6);
	}
	if (stationName.length > 7) {
		var point7 = new GLatLng(stationLat[7],stationLong[7]);
		var marker7 = new GMarker(point7,icon_g);
		GEvent.addListener(marker7,"click",function() {
			marker7.openInfoWindowHtml(stationWindow[7]);
		});
		markerAry[8] = marker7;
		map.addOverlay(marker7);
	}
	if (stationName.length > 8) {
		var point8 = new GLatLng(stationLat[8],stationLong[8]);
		var marker8 = new GMarker(point8,icon_g);
		GEvent.addListener(marker8,"click",function() {
			marker8.openInfoWindowHtml(stationWindow[8]);
		});
		markerAry[9] = marker8;
		map.addOverlay(marker8);
	}
	if (stationName.length > 9) {
		var point9 = new GLatLng(stationLat[9],stationLong[9]);
		var marker9 = new GMarker(point9,icon_g);
		GEvent.addListener(marker9,"click",function() {
			marker9.openInfoWindowHtml(stationWindow[9]);
		});
		markerAry[10] = marker9;
		map.addOverlay(marker9);
	}
	
	// 店舗情報は通常のマーカーで
	var pointShop = new GLatLng(wrkLat, wrkLng);
	var markerShop = new GMarker(pointShop,icon_location);
	var strTarget = '<DIV style="font-size:8pt; text-align:left; width:200px;">' +
					 pointStr +
					 '<HR>' +
					 '<FORM METHOD="GET" ACTION="http://www.google.co.jp/transit" target="_blank">' +
					 '<input type="hidden" name="ie" value="UTF-8" />' +
    					 '<input type="hidden" name="f" value="d" />' +
					 '<input type="text" style="width:100px;" name="saddr">から' +
					 'この場所まで、<BR>' + 
					 '<input type="hidden" name="daddr" value="' + pointStr + '">' +
					 '<input type="text" style="width:40px;" name="date" value="' + (now.getMonth() + 1) + '/' + now.getDate() + '">' +
					 '<input type="text" style="width:40px;" name="time" value="' + now.getHours() + ':' + now.getMinutes() + '">に<br>' +
					 '<input type="radio" name="ttype" value="dep" checked>出発' +
					 '<input type="radio" name="ttype" value="arr">到着<br>' +
					 'する経路を' +
					 '<input type="submit" value="検索">' + 
					 '</FORM>' +
					 '</DIV>';
	
	GEvent.addListener(markerShop,"click",function() {
		markerShop.openInfoWindowHtml(strTarget);
	});
	markerAry[0] = markerShop;
	map.addOverlay(markerShop);
	
	var genBounds;
	var check = 1;
	for( var index in markerAry ){
		var marker = markerAry[index];
		if( check ){
			genBounds = new GLatLngBounds( marker.getPoint(), marker.getPoint() );
			check = 0;
		}else{
			var point = marker.getPoint();
			genBounds.extend( point );
		}
	}
	
	map.setCenter( genBounds.getCenter(), map.getBoundsZoomLevel(genBounds));
	
	map.enableScrollWheelZoom();
  	map.enableContinuousZoom();
  	GEvent.addDomListener(document.getElementById("map"),
     "DOMMouseScroll", CancelEvent); // Firefox
	GEvent.addDomListener(document.getElementById("map"),
     "mousewheel",     CancelEvent); // IE
	
	marker0.openInfoWindowHtml(stationWindow[0]);

}

  // 現在表示されている地図の中央から検索
  function searchFromMap(param) {
		var centerBounds = map.getBounds();
		param.lat = centerBounds.getCenter().lat();
		param.lon = centerBounds.getCenter().lng();
		
    		// APIリクエストURLの生成(GETメソッド)
    		var url = 'http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php?' +
                 	    obj2query( param );
		
		// script 要素の発行
    		var script  = document.createElement( 'script' );
    		script.type = 'text/javascript';
    		script.src  = url;
    		document.body.appendChild( script );
  }

// オブジェクトからクエリー文字列を生成する関数
function obj2query ( obj ) {
    var list = [];
    for( var key in obj ) {
        var k = encodeURIComponent(key);
        var v = encodeURIComponent(obj[key]);
        list[list.length] = k+'='+v;
    }
    var query = list.join( '&' );
    return query;
}

  function jsonReverseGeoApi(data){
	try{
		if (!data){
			window.alert('住所の検索が出来ませんでした。\r\n(日本以外や海上、無人島は\r\n検索できません)');
			return false;
		}
		if (!data.status){
			window.alert('住所の検索が出来ませんでした。\r\n(日本以外や海上、無人島は\r\n検索できません)');
			return false;
		}
		if (data.status!=true){
			window.alert('住所の検索が出来ませんでした。\r\n(日本以外や海上、無人島は\r\n検索できません)');
			return false;
		}
		
		var result = '';
		
		if (data.result.prefecture) {
			result = data.result.prefecture.pname;
		}
		if (data.result.municipality) {
			result += data.result.municipality.mname;
		}
		if (data.result.local && data.result.local.section) {
			result += data.result.local.section;
		}
		if (data.result.local && data.result.local.homenumber){
			result += data.result.local.homenumber;
		}
		
		document.getElementById('txtSearch').value = result;
		searchExec();
	}
	catch(e){
		window.alert(e.message);
	}
  }