﻿/*
GoogleMapsに関する共通操作

created:2007/03/15, updated:2007/04/12
*/

var map = null;
var geocoder = null;

var strXmlUrl;                 //読み込むXMLファイルのURL
var startZoom = 12;                 //初期ズームサイズ
var maxZoom = 15;                   //最大ズームサイズ

//インデックスマップのサイズ
var indexMapWidth = 200;
var indexMapHeight = 150;

//GoogleMaps内のバルーン色
var balloonColor = "yellow";

/* マーカー情報 */
var marker_set = new Array(30);		//マーカーオブジェクトの保存
var html_set = new Array(30);		  //マーカーの内容の保存
var alias_set = new Array(30);		//共通マーカーの保存。参照先となるマーカーナンバーを入れる。
var lng_set = new Array(30);		  //東経の保存
var lat_set = new Array(30);		  //北緯の保存
  
//GeoCoding結果によって表示したmarkerオブジェクト
var geoSearchMarker = null;

//一度でもmarkerを生成するとtrueになる。
//falseの場合、先頭マーカーの座標へ自動移動する。
var markerCreated = 0;


//地図描画を開始します。strURLは、XMLファイルのURLを指定します。
function readMap(strURL, layerNumber) {

  //window.open(strURL);
  
  if(!(layerNumber >= 0)) layerNumber = 0;

  marker_set[layerNumber] = new Array();		//マーカーオブジェクトの保存
  html_set[layerNumber] = new Array();		  //マーカーの内容の保存
  alias_set[layerNumber] = new Array();		//共通マーカーの保存。参照先となるマーカーナンバーを入れる。
  lng_set[layerNumber] = new Array();		  //東経の保存
  lat_set[layerNumber] = new Array();		  //北緯の保存

  //GoogleMapオブジェクト */
  if(map == null)
    map = new GMap2(document.getElementById("map"));
  
  //GeoCorderオブジェクト
  if(geocoder== null)
    geocoder = new GClientGeocoder();

  //プログレスバーの表示
  var progressBar = document.getElementById("progressBar");
  if(progressBar != null) progressBar.style.display = "block";

  var request = GXmlHttp.create();
  request.open( "GET", strURL, true );
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      
      var markers = xmlDoc.documentElement.getElementsByTagName("marker");
      var descriptions = xmlDoc.documentElement.getElementsByTagName("description");
      var icons = xmlDoc.documentElement.getElementsByTagName("icon");
      var categories = xmlDoc.documentElement.getElementsByTagName("category");
      
      
      for (var i=0; i < markers.length; i++) {
        lng_set[layerNumber][i] = markers[i].getAttribute("lng");
        lat_set[layerNumber][i] = markers[i].getAttribute("lat");
        
        //最初のメインレイヤーの場合、先頭マーカーの座標へ移動する
        if(i == 0 && layerNumber == 0) {
          //マーカーを1度も作成していなければ、ズームも行う
          if(markerCreated == 0) {
            //地図を先頭マーカーまで移動し、ズームも行う
            map.setCenter(
              new GLatLng( lat_set[layerNumber][0], lng_set[layerNumber][0] ),
              startZoom
            );
            
            //マーカー作成フラグをtrue
            markerCreated = 1;
          } else {
            //地図の移動のみ行う
            map.panTo(
              new GLatLng( lat_set[layerNumber][0], lng_set[layerNumber][0] )
            );
          }
        }
        
        // 同じ経緯度のマーカーがあるかチェック
        var same_num = (-1);
        for(var j=0 ; j<i ; j++){
          if(lng_set[layerNumber][i]==lng_set[layerNumber][j] && lat_set[layerNumber][i]==lat_set[layerNumber][j]){
            //同じ経緯度のマーカーのナンバーを保存
            same_num = j;
            break;
          }
        }
        
        var point = new GPoint(
          parseFloat(markers[i].getAttribute("lng")),
          parseFloat(markers[i].getAttribute("lat"))
        );
        
        //マーカー作成
        var marker = createMarker(
          point, i, same_num,
          markers[i].getAttribute("img"),
          icons[i],
          descriptions[i].firstChild.nodeValue,
          layerNumber
        );
        
        map.addOverlay(marker);
      }

      //プログレスバーを非表示
      if(progressBar != null)  progressBar.style.display = "none";
    }
  }
  request.send(null);
}

/*
GoogleMaps内にマーカーを作り出します。
createMarker（GPoint、連番、同じ位置だった場合の連番番号、バルーン色、画像、コメント）
*/
function createMarker(point, index, same_index, img, icon, description, layerNumber) {

	var html = "";

	// 他のマーカーと同じ位置であれば、以前のマーカーを一度削除し、
	// 以前のマーカーのhtmlを継承する
	if(same_index>=0){
		map.removeOverlay(marker_set[layerNumber][same_index]);
		html = html_set[layerNumber][same_index] + "<hr class='kugiri' />";
	}
  
  //アイコンを生成
	gicon = createIcon(icon);
	
	//マーカー生成
	var marker = new GMarker(point, gicon);
  
  html += "<div class='gmap_balloon_wrapper'>";
	if (img.match("^.*\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG)$")) {
		html += "<div class='gmap_balloon_image'><img src='" + img + "' style='float:left; margin-left:5px;' /></div>";
	}
	html += "<div class='gmap_balloon_description'>" + description + "</div>";
  html += "</div>";  

  //マーカーのクリック時に、バルーン表示するイベント登録
	GEvent.addListener(
	  marker,
	  "click",
	  function(){
	    marker.openInfoWindowHtml(html);
	  }
	);

	// 以前のマーカーと同じ位置の場合、マーカーナンバーを以前のナンバーにする
	// その上で、alias_setを使って、ナンバーのエイリアス設定を行う
	if(same_index>=0){
		marker_set[layerNumber][same_index] = marker;
		html_set[layerNumber][same_index] = html;
		alias_set[layerNumber][index] = same_index;
	}else{
		marker_set[layerNumber][index] = marker;
		html_set[layerNumber][index] = html;
		alias_set[layerNumber][index] = -1;
	}
	
	return marker;
}

/*
アイコン生成
createIcon（色を文字列で指定。画像URLも可。）
*/
function createIcon(icon){
  var iconWidth=20, iconHeight=34;
  var shadowWidth=37, shadowHeight=37;
  var strIconDir = "/image/map/icon/";
  var strIcon = strIconDir + "icon_yellow20.png";
  var strIconShadow = strIconDir + "icon_shadow50.png";
	var gicon = new GIcon();

	
	if(icon.firstChild.nodeValue != "")
	  color = icon.firstChild.nodeValue;
	
	switch(color) {
	  case "yellow":
      strIcon = strIconDir + "icon_yellow20.png";	  
	    break;
	  case "red":
      strIcon = strIconDir + "icon_red20.png";	  
	    break;
	  case "blue":
      strIcon = strIconDir + "icon_blue20.png";	  
	    break;
	  case "green":
      strIcon = strIconDir + "icon_green20.png";	  
	    break;
	  default:
	    if(color != "")  strIcon = color;
	}
	
	//アイコンの設定
	gicon.image = strIcon;

  var tmpIconWidth = icon.getAttribute("iconWidth");
	var tmpIconHeight = icon.getAttribute("iconHeight");
  if(!isNaN(tmpIconWidth))
    if(tmpIconWidth>0)  iconWidth = tmpIconWidth;
  if(!isNaN(tmpIconHeight))
    if(tmpIconHeight>0)  iconHeight = tmpIconHeight;
  
	gicon.iconSize = new GSize(iconWidth, iconHeight);
  
  //アイコンの影の部分
  var tmpShadowImage = icon.getAttribute("shadowImage");
  if(tmpShadowImage != null) {
    if(tmpShadowImage != "-") {
	    var tmpShadowWidth = icon.getAttribute("shadowWidth");
	    var tmpShadowHeight = icon.getAttribute("shadowHeight");
	    if(!isNaN(tmpShadowWidth))
	      if(tmpShadowWidth>0)  shadowWidth = tmpShadowWidth;
	    if(!isNaN(tmpShadowHeight))
	      if(tmpShadowHeight>0)  shadowHeight = tmpShadowHeight;
	    
      gicon.shadow = tmpShadowImage;
	    gicon.shadowSize = new GSize(shadowWidth, shadowHeight);
    }
  } else {
    gicon.shadow = strIconShadow;
    gicon.shadowSize = new GSize(shadowWidth, shadowHeight);
  }

	gicon.iconAnchor = new GPoint(iconWidth/2, iconHeight);
	gicon.infoWindowAnchor = new GPoint(iconWidth/2, 1);
  
  return gicon;
}

/*
レイヤーをグループ毎、削除する。
削除したいグループの、レイヤー番号を与える。
*/
function clearLayerGroup(layerNumber){
  
  if(marker_set[layerNumber] != null){
    for(var i=0; i<marker_set[layerNumber].length ; i++){
      if(marker_set[layerNumber][i] != null){
        map.removeOverlay( marker_set[layerNumber][i] );
      }else{
        //break;
      }
    }
  }
}

/*
Geocodingによって、住所や目標物を探す
showAddress（住所や目標物）
*/
function showAddress(address) {
  if (geocoder) {
    geocoder.getLocations( address, checkGeo );
  }
}

/*
showAddressによって呼び出される。
Geocodingが成功した場合、地図内にポインタを表示する。
checkGeo（getLocationsによって渡されるlocationオブジェクト）
*/
function checkGeo(locations){
  if (locations.Status.code != 200 ) {
    alert("見つかりませんでした");
    return;
  }

  //前回検索時のmarker削除
  if(geoSearchMarker) geoSearchMarker.remove();
    
  var point = locations.Placemark[0].Point.coordinates;
  var glatlng = new GLatLng(point[1], point[0]);
  map.setCenter(glatlng, 15);

  var marker = new GMarker(glatlng);
  map.addOverlay(marker);
  var country = locations.Placemark[0].AddressDetails.Country;
  
  //情報ウィンドウを表示
  //marker.openInfoWindowHtml("▼該当住所<br>" + country.AddressLine[0] + "<br>" + glatlng.x + "," + glatlng.y);
  
  //タブ付き情報ウィンドウを表示
  var strHosoku = "」<br /><br /><span style='color:#FF3333; font-size:smaller;'>▲入力した住所と違う場合、うまく一致しなった可能性があります。<br />検索し直す事も出来ます。</span>";
  var tabWindow = [
    new GInfoWindowTab("該当住所", "「" + country.AddressLine[0] + strHosoku),
    new GInfoWindowTab("座標", glatlng.x + "," + glatlng.y)
  ]
  map.openInfoWindowTabsHtml(glatlng, tabWindow);

  //markerクリック時のイベント登録
	GEvent.addListener(
	  marker,
	  "click",
	  function(){
	    marker.openInfoWindowTabsHtml(tabWindow);
	  }
	);
  
  //後でRemoveするため、markerを保存
  geoSearchMarker = marker;
}

// 目標物や駅へ地図を移動
function mapMove(strEN){
	// 経緯度をカンマ区切りで取得
	var arrEN = strEN.split(",");

	if(arrEN[0]>0 && arrEN[1]>0){	
		map.setCenter(new GLatLng(arrEN[1], arrEN[0]), 15);
	}
}

/* 順番の数字を与えて、その順番のマーカーまでMapを移動する */
function moveMarker(i, layerNumber){
  
	map.setZoom(15);
  
  if(!(layerNumber >= 0)) layerNumber=0;
  
	// 他のマーカーを参照している場合
	if(alias_set[layerNumber][i]>=0){
		marker_set[layerNumber][alias_set[layerNumber][i]].openInfoWindowHtml(html_set[layerNumber][alias_set[layerNumber][i]]);
	}else{
		marker_set[layerNumber][i].openInfoWindowHtml(html_set[layerNumber][i]);
	}
}

/*
拡大制限
setMaxZoom（上限ズーム）
*/
function setMaxZoom(getMaxZoom) {
	GEvent.addListener(
	  map,
	  "zoomend",
	  function(oldZoomLevel, newZoomLevel) {
		  if(map.getZoom() > getMaxZoom){
		    map.setZoom(oldZoomLevel);
		  }
	  }
	);
}

// 大きなコントローラーを追加
function addGLargeMapControl() {
  map.addControl(new GLargeMapControl());
}

//インデックスマップを追加
function addGOverviewMapControl() {
  map.addControl(new GOverviewMapControl(new GSize(indexMapWidth, indexMapHeight)));
}

//地図／衛星写真の切り替えボタンを追加
function addGMapTypeControl() {
  map.addControl(new GMapTypeControl());
}

/*
// define global variables for drawCircle
var PGradius = 50; // radius in meters of polygon vertices （半径（メートル））
var PGcolor = "#0000ff"; // polygon color blue （線の色）
var PGwidth = 3; // width pixels （線の幅）
var PGtrans = 0.5; // transparency 0 - 1 （透過度）
var d2r = Math.PI/180; // degrees to radians
var r2d = 180/Math.PI; // radians to degrees
var PGsides = 36; // number of sides of polygon （分割数）
                  // (use 36 for circle)
var PGstart = 0;


// lng：経度
// lat：緯度
// PGradius：半径
// PGsides：分割数
function drawCircle(lng,lat,PGradius,PGsides) {
　if (PGsides%2 == 1) {
　　PGstart = (0.5 - 2/PGsides) * Math.PI;
　} else {
　　PGstart = -Math.PI/PGsides;
　}
　var PGlat = (PGradius/6378800)*r2d; // using 6378800 meters as earth's radius
　var PGlng = PGlat/Math.cos(lat*d2r);
　var PGpoints = [];
　for (var i=-1; i < PGsides; i++) {
　　var theta = 2*i*Math.PI/PGsides + PGstart;
　　PGx = lng + (PGlng * Math.cos(theta));
　　PGy = lat + (PGlat * Math.sin(theta));
　　PGpoints.push(new GPoint(PGx,PGy));
　}
　map.addOverlay(new GPolyline(PGpoints,PGcolor,PGwidth,PGtrans));
}
*/

