var mapOptions = {
  lat: null,
  lng: null,
  zl: 13,
  pin: false,
  address: null,
  map_id: '#map_area',
  view_street: true,
  street_id: '#street_area',
  client:  null,  //GStreetViewClient
  m_dlocation: null,  //GMapデフォルト位置
  s_dlocation: null,  //ストリートビューデフォルト位置
  markerAdd: true,  //マーカーの表示
  zoom: 0,            //ズーム レベル（0が最大）
  pitch: 0,            //カメラの初期デフォルト ピッチから「上」または「下」の角度の差
  yaw: 0,             //カメラの中心回りの回転角（真北からの相対的な角度）
  FullScreen: true,  //フルスクリーンモード
  userPhotos: true,//ユーザー投稿写真の表示
  photoRepositories: [ 'panoramio', 'picasa']//ユーザー投稿写真のリポジトリ
};

var streetmap;
var marker2;
var geocoder;

$(document).ready(function(){
  if (GBrowserIsCompatible()) {
    mapOptions.m_dlocation = new GLatLng(mapOptions.lat, mapOptions.lng);
    //GMap2オブジェクトの生成と設定
    var map = new GMap2($(mapOptions.map_id).get(0));
    if (mapOptions.lat && mapOptions.lng) {
      //通常の位置移動
      map.setCenter(mapOptions.m_dlocation, mapOptions.zl);
      addPin(mapOptions);
    }
    else if (mapOptions.address) {
      //ジオコーダーオブジェクトで位置移動
      var geocoder = new GClientGeocoder();
      geoSearchAndMoove(mapOptions);
    }
    else {
      return;
    }
    
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());
    map.addControl(new GLargeMapControl());
//    map.enableScrollWheelZoom();
    map.enableContinuousZoom();
    map.enableDoubleClickZoom();
    
    //Panorama初期化
    if (mapOptions.view_street && mapOptions.pin) {
      $(mapOptions.street_id).show();
      initPanorama(mapOptions.lat, mapOptions.lng);
    }

    $(document).unload(function(){
      GUnload();
    });
  }
  
  //ストリートビュー初期化処理
  function initPanorama(lat,lng){
    var b = new google.maps.Marker(mapOptions.m_dlocation);
    geocoder = new google.maps.ClientGeocoder;
    var c = new google.maps.Icon;
    c.image = "/images/front/map/man_arrow-0.png";
//    c.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    c.iconSize = new google.maps.Size(49, 52);
//    c.shadowSize = new google.maps.Size(22, 20);
    c.iconAnchor = new google.maps.Point(23, 33);
    c.infoWindowAnchor = new google.maps.Point(5,1);
    marker2 = new google.maps.Marker(mapOptions.m_dlocation,c);
//    google.maps.Event.addListener(marker2,"click", function(d){
//      geocoder.getLocations(new google.maps.LatLng(d.y,d.x),function(e){
//        !e||e.Status.code!=200?marker2.openInfoWindowHtml("No address data was found."): marker2.openInfoWindowHtml("<strong>\u4f4f\u6240:</strong><br />"+e.Placemark[0].address.replace("\u65e5\u672c",""))
//      })
//    });
    c = {
      latlng: mapOptions.m_dlocation,
      yaw: mapOptions.yaw,
      pitch: mapOptions.pitch,
      zoom: mapOptions.zoom,
      enableFullScreen: mapOptions.FullScreen,
      features: {
        streetView: true,
        userPhotos: mapOptions.userPhotos
      },
      userPhotoOptions: {
        photoRepositories: mapOptions.photoRepositories
      }
    };

    mapOptions.s_dlocation = new GLatLng(mapOptions.lat, mapOptions.lng);
    streetmap = new GStreetviewPanorama($(mapOptions.street_id).get(0));
    mapOptions.client = new GStreetviewClient();
    mapOptions.client.getNearestPanoramaLatLng(mapOptions.s_dlocation, function(latlng){
      if(latlng==null){
        $(mapOptions.street_id).hide();
        return;
      }
      if(mapOptions.WindowHTML != "" && mapOptions.markerAdd){
        google.maps.Event.addListener(b,"click",clickListener);
      }else {
        mapOptions.WindowHTML != "" && !mapOptions.markerAdd && map.openInfoWindow(mapOptions.m_dlocation,mapOptions.WindowHTML);
      }

//    var screenXY = new GScreenPoint(0.5, 0.5, "fraction", "fraction");
//    var overlayXY = new GScreenPoint(0.5, 0.5, "fraction", "fraction");
//    var size = new GScreenSize(49, 52);
//    var soverlay = new GScreenOverlay("/images/front/map/man_arrow-0.png", screenXY, overlayXY, size);
//    map.addOverlay(soverlay);

      mapOptions.s_dlocation = latlng;
      streetmap.setLocationAndPOV(mapOptions.s_dlocation, {yaw: 0, pitch: 0, zoom: -1});
      GEvent.addListener(streetmap,"initialized", test);
    });

//    mapOptions.markerAdd && map.addOverlay(b);
    mapOptions.m_dlocation = new google.maps.StreetviewOverlay;
    map.addOverlay(mapOptions.m_dlocation);
    google.maps.Event.addListener(map, "click", clickListener);
    google.maps.Event.addListener(streetmap,"initialized", function(d){
      addSVMark(map, d.latlng);
    });
  }

  //initialized Event処理
  function test(location){
    if (location.latlng === null) {
      return;
    }
    map.panTo(location.latlng); 
  }

  function clickListener(a, b){
    if(b){
      streetmap.setLocationAndPOV(b);
      addSVMark(map,b)
    } else {
      a.x == mapOptions.lng && a.y == mapOptions.lat && this.openInfoWindow(mapOptions.WindowHTML);
    }
  }

  function addSVMark(map,d){
    if(d != null){
      $(mapOptions.street_id).show();
      map.setCenter(d,map.getZoom());
      map.removeOverlay(marker2);
      marker2.setLatLng(d);
      map.addOverlay(marker2);
    }
  } 
  //ストリートビューここまで
  
  //ジオコーディングを実行して、マップを移動。
  function geoSearchAndMoove(mapOptions) {
    mapOptions.address && geocoder.getLatLng(
      mapOptions.address,
      function(point) {
        if (point) {
          map.setCenter(point, mapOptions.zl);
          mapOptions.lat = point.lat();
          mapOptions.lng = point.lng();
          addPin(mapOptions);
        }
      }
    );
  }
  //中心位置にピンを立てる
  function addPin(mapOptions) {
    if (mapOptions.pin) {
      var marker = new GMarker(new GLatLng(mapOptions.lat,mapOptions.lng));
      map.addOverlay(marker);
      if (mapOptions.address) {
        var html = '<div style="width:210px;font-size:small">' + mapOptions.address + '</div>';
        GEvent.addListener(marker, 'click', function() {
          marker.openInfoWindowHtml(html);
        });
      }
    }
  }

});
