window.onload = function(){
  
  if (location.search.indexOf("type=normal") !== -1){
    showMap();
  } else if (location.search.indexOf("type=streetview") !== -1){
    showStreetView();
  } else if (location.search.indexOf("type=navigation") !== -1){
    var height = (document.documentElement.clientHeight || document.body.clientHeight) - 80 + "px";
    document.getElementById("map").style.height = height;
    document.getElementById("map_sv").style.height = height;
    // HTML側で指定した経路データ（JSON形式）をダウンロード
    GDownloadUrl(fName, function(jsonData){
      json = eval("(" + jsonData + ")");
    });
  }
  
}

var map, marker, panorama, json, intervalId;
var i = t = j = 0;

function showMap(){
  
  // Normal Map
  map = new GMap2($("map"));
  var geocoder = new GClientGeocoder();
  var address  = decodeURI(location.search).replace(/^\?type=normal&location=/, '');
  
  geocoder.getLatLng(address, function (point){
    if (point != null){
      
      map.addControl(new GSmallMapControl());
      map.addControl(new GMapTypeControl());
      map.addControl(new GScaleControl());
      map.setCenter(point, 16, G_NORMAL_MAP);
      
    }
  });
  
}

function showStreetView(){
  
  // StreetView Map
  var geocoder = new GClientGeocoder();
  var client   = new GStreetviewClient();
  var address  = decodeURI(location.search).replace(/^\?type=streetview&location=/, '');
  
  geocoder.getLatLng(address, function (point){
    client.getNearestPanoramaLatLng(point, function(point2){
      if (point2 != null){
        
        options  = { latlng:point2 };
        panorama = new GStreetviewPanorama($("map"), options);
        GEvent.addListener(panorama, "error", handleNoFlash);
        
      }
    });
  });
  
}

function showNavigation(json){
  
  $("start").style.display = "none";
  
  // 初期位置を設定
  var point  = new GLatLng(json.start[0].lat, json.start[0].lng);
  var pitch  = ( json.points[0].pit ) ? json.points[0].pit : 5;
  var view   = { yaw:json.points[0].yaw, pitch:pitch };
  
  // 2D地図の生成
  map = new GMap2($("map"));
  map.addControl(new GSmallMapControl());
  map.setCenter(point, 18);
  addMarker(point, "出発地");
  addMarker(new GLatLng(json.goal[0].lat, json.goal[0].lng), "目的地");
  marker = addMarker(point, "現在地");
  //map.addOverlay(new GStreetviewOverlay());
  GEvent.addListener(map, "moveend", moveCenter);
  
  // ここでストリートビューオブジェクトを生成
  var options = { latlng:point, pov:view };
  panorama = new GStreetviewPanorama($("map_sv"), options);
  
  // 各種イベントハンドラを設定
  GEvent.addListener(panorama, "initialized", moveMap);
  GEvent.addListener(panorama, "yawchanged", displayYaw);
  GEvent.addListener(panorama, "pitchchanged", displayPitch);
  GEvent.addListener(panorama, "zoomchanged", displayZoom);
  GEvent.addListener(panorama, "error", handleNoFlash);
  
  changeStreetView("next");
  
}

function changeStreetView(type){
  
  // 経路を戻る場合
  // （[i-1] のイベントを実行し、iをそのままに）
  if (type == "back"){
    if (i == 0){
      return;
    } else{
      i--;
    }
  }
  
  // 規定回数に達したら終了
  if (i >= json.points.length){
    return;
  }
  
  // 次に向かう方向・視点を設定
  var pitch  = ( json.points[i].pit ) ? json.points[i].pit : 5;
  var view   = { yaw:json.points[i].yaw, pitch:pitch };
  
  // 視点を移動
  if ((i > 0) &&
      ((json.points[i].yaw != json.points[i-1].yaw) || (json.points[i].pit != json.points[i-1].pit))
     ){
    panorama.panTo(view, false);
  }
  
  // 位置を移動
  if (json.points[i].type == "walk"){
    panorama.followLink((type == "back") ? json.points[i].dir + 180 : json.points[i].dir);
  }
  
  if (json.points[i].com){
    $("comment").innerHTML = json.points[i].com;
  }
  
  if ((type != "back") && (i < json.points.length)){
    i++;
  }
  
}

function moveMap(location){
  
  // 地図とマーカーを移動
  marker.setLatLng(location.latlng);
  $("latlng").innerHTML = location.latlng;
  
  // 頻繁にすると処理が追いつかず固まるので5回に1回
  if ((i % 5) == 0){
    map.panTo(location.latlng);
  }
  
}

function moveCenter(){
  
  // 地図の位置を移動
  var center = map.getCenter();
  map.panTo(center);
  $("latlng").innerHTML = center;
  
}

function displayYaw(yaw){
  
  var position;
  $("yaw").innerHTML = Math.round(yaw);
  
  // 現在地マーカーの方向を変更
  if (yaw >= 315 || yaw < 45){
    position = "north";
  } else if (yaw >= 45 && yaw < 135){
    position = "east";
  } else if(yaw >= 135 && yaw < 225){
    position = "south";
  } else if(yaw >= 225 || yaw < 315){
    position = "west";
  }
  
  $("mtgt_unnamed_2").src = "../images/map_step_" + position + ".png";
  
}

function displayPitch(pitch){
  
  $("pitch").innerHTML = Math.round(pitch);
  
}

function displayZoom(zoom){
  
  $("zoom").innerHTML = Math.round(zoom);
  
}

function handleNoFlash(errorCode){
  
  if (errorCode == 600){ // 未対応エリア時
    $("map_sv").innerHTML = '<p>この地域はGoogleマップ・ストリートビューには対応していません<\/p>';
    return;
  }
  if (errorCode == FLASH_UNAVAILABLE) {
    $("map_sv").innerHTML = "<p>お使いのブラウザがFlashに対応していないためGoogleマップ・ストリートビューを表示できません<\/p>";
    return;
  }
  
}

function addMarker(point, html){
  
  customMarkerObj = new GIcon();
  customMarkerObj.iconSize = new GSize(40, 40);
  customMarkerObj.iconAnchor = new GPoint(20, 20);
  
  if (html == "現在地"){
    customMarkerObj.image = "../images/map_step.png";
  } else if (html == "出発地"){
    customMarkerObj.image = "../images/map_start.png";
  } else if (html == "目的地"){
    customMarkerObj.image = "../images/map_goal.png";
  }
  
  var marker = new GMarker(point, customMarkerObj);
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  map.addOverlay(marker);
  return marker;
  
}

function autoNavigate(){
  
  if (t == 0){
   
    intervalId = setInterval("changeStreetView('next')", 3000);
    $("button").value = "案内停止";
    t++;
    
  } else{
    
    clearInterval(intervalId);
    $("button").value = "自動案内";
    t--;
    
  }
  
}

function $(id){
  
  return document.getElementById(id);
  
}
