var map,lat,lng,zoom,maptype;

google.load('maps', '2.x',{'language':'ja'});

function mapload(mode,lat,lng,zoom,maptype){
  if(GBrowserIsCompatible()){
    var c = mapCookie(mode);
    if(!lat) lat = c['lat'];
    if(!lng) lng = c['lng'];
    if(!zoom) zoom = c['zoom'];
    if(!maptype) maptype = c['maptype'];
    
    map = new google.maps.Map2(document.getElementById('map'));
    var point = new GLatLng(lat,lng);
    map.setCenter(point,parseFloat(zoom));
    
    map.addMapType(G_PHYSICAL_MAP);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl(true, false));
    map.addControl(new GScaleControl());
    
    switch(maptype){
      case 'satellite': map.setMapType(G_SATELLITE_MAP); break;
      case 'hybrid': map.setMapType(G_HYBRID_MAP); break;
      case 'physical': map.setMapType(G_PHYSICAL_MAP); break;
    }
    
    new GKeyboardHandler(map);
    map.enableScrollWheelZoom()
    
    GEvent.addListener(map,'maptypechanged',function(){
      fput();
      var newmaptype = getMapType();
      cookie_set('map',newmaptype,3);
    });
    
    GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel){
      fput();
      cookie_set('map',newLevel,2);
    });
    
    GEvent.addListener(map, 'moveend', function(){
      var center = map.getCenter();
      cookie_set('map',center.y,0);
      cookie_set('map',center.x,1);
    });
    
    GEvent.addListener(map,'click',function(overlay,latlng){
      fput();
      d_marker = dm.create(latlng);
      map.addOverlay(d_marker);
    });
    
    if(mode == 'pin'){
      mk.create('',point)
    }
  }
}


function mapCookie(mode){
  var n = ['lat','lng','zoom','maptype'];
  var d = ['35.6901','139.7003','14','normal'];
  var v = new Array(9)
  if(getCookie('map')){
    var v = getCookie('map').split('*');
  }else if(!mode){
    var g = google.loader.ClientLocation;
    if(g){
      if(g.latitude && !isNaN(g.latitude)) d[0] = g.latitude;
      if(g.longitude && !isNaN(g.longitude)) d[1] = g.longitude;
    }
  }
  var c = new Array();
  for(i=0; i < n.length; i++){
    if(v[i] != undefined && v[i] != ''){
      c[n[i]] = v[i];
    }else{
      c[n[i]] = d[i];
    }
  }
  return c;
}


function mapBounds(){
  var bounds = map.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();
  var maxX = northEast.lng();
  var minX = southWest.lng();
  var maxY = northEast.lat();
  var minY = southWest.lat();
  return [maxX,minX,maxY,minY];
}


function getMapType(){
  var maptype = map.getCurrentMapType();
  var newmaptype
  switch (maptype){
    case G_NORMAL_MAP: newmaptype = 'normal'; break;
    case G_SATELLITE_MAP: newmaptype = 'satellite'; break;
    case G_HYBRID_MAP: newmaptype = 'hybrid'; break;
    case G_PHYSICAL_MAP: newmaptype = 'physical'; break;
  }
  return newmaptype;
}


function mapZoom(v){
  var z = map.getZoom();
  if(!v){
    z = (z <= 13) ? 15 : z + 2;
  }else if(v < 0){
    z = z + v;
  }
  map.setZoom(z);
}


function mapPan(lat,lng){
  map.panTo(new GLatLng(lat,lng));
}


var geo = {
  arr: function(){
    var a = new Array;
    a['addr'] = '住所、駅、東京タワーなど';
    return a;
  },
  
  move: function(addr,zoom){
    var a = this.arr();
    if(!addr || addr == a['addr']) return;
    geocoder = new GClientGeocoder();
    geocoder.getLatLng(
      addr,
      function(point){
        if(!point){
          alert('「' + addr + '」がみつかりません');
        }else{
          if(!zoom){
            zoom = map.getZoom();
            if(zoom < 13) zoom = 15;
          }
          map.setCenter(point,zoom);
        }
      }
    );
  },
  
  reset: function(self,opt){
    var a = this.arr();
    fm.reset(self,a,opt);
  }
}

//marker
var mk = {
  create: function(id,point){
    var icon = new GIcon();
    icon.image = bp + 'parts/marker/marker.png';
    icon.shadow = bp + 'parts/marker/shadow.png';
    icon.iconSize = new GSize(20,40);
    icon.shadowSize = new GSize(38,40);
    icon.iconAnchor = new GPoint(10,40);
    icon.infoWindowAnchor = new GPoint(15,5);
    marker = new GMarker(point,{icon:icon,clickable:false});
    map.addOverlay(marker);
  }
}

//draggableMarker
var d_marker;
var dm = {
  create: function(point){
    if(d_marker) map.removeOverlay(d_marker);
    var icon = new GIcon();
    icon.image = bp + 'parts/marker/marker.png';
    icon.shadow = bp + 'parts/marker/shadow.png';
    icon.iconSize = new GSize(20,40);
    icon.shadowSize = new GSize(38,40);
    icon.iconAnchor = new GPoint(10,40);
    icon.infoWindowAnchor = new GPoint(15,5);
    d_marker = new GMarker(point,{icon:icon,draggable:true});
    
    GEvent.addListener(d_marker, 'dragend', function(){
      var point = d_marker.getPoint();
      fput();
    });
    
    return d_marker;
  }
}


function fput(){
  var f = document.mfrm;
  if(f){
    f.make.disabled = false;
  }
  pinAgain();
}

var regeocode = {
  iw: function(point,opt){
    if(!point) return;
    if(!opt) opt = '';
    var str = 'lat=' + point.y + '&lng=' + point.x + '&opt=' + opt;
    gh('map|regeocode','iwAddr',str,'','iw_loader');
//    geocoder = new GClientGeocoder();
//    geocoder.getLocations(point, function(response){
//      if(!response || response.Status.code != 200) {
//        alert('Status Code:' + response.Status.code);
//      }else{
//        place = response.Placemark[0];
//        var str = 'addr=' + place.address + '&opt=' + opt;
//        gh('map|rg','iwAddr',str,'','iw_loader');
//        }
//    });
  }
}