var map;
bs.list;
bs.keys;

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

bs.mapload = function(mode,lat,lng,zoom,maptype,geokey,opt){
  if(GBrowserIsCompatible()){
    bs.list = new Object();
    bs.keys = new Array();
    if(mode == 'fd'){
      if(!lat) var lat = 35.6898;
      if(!lng) var lng = 139.692;
      if(!zoom) var zoom = 4;
    }else{
      var c = bs.mapCookie(mode);
      if(!lat) var lat = c['lat'];
      if(!lng) var lng = c['lng'];
      if(!zoom) var zoom = c['zoom'];
      if(!maptype) var 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 GSmallMapControl());
    map.addControl(new GMenuMapTypeControl(true, false));
    
    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);
    
    GEvent.addListener(map,'maptypechanged',function(){
      if(!bs.MARKER_ID){
        var newmaptype = bs.getMapType();
        bs.cookie.grp('map',newmaptype,3);
      }
    });
    
    GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel){
      if(!bs.MARKER_ID) bs.cookie.grp('map',newLevel,2);
      bs.parse_marker();
    });
    
    GEvent.addListener(map, 'moveend', function(){
      if(!bs.MARKER_ID){
        var center = map.getCenter();
        bs.cookie.grp('map',center.y,0);
        bs.cookie.grp('map',center.x,1);
      }
      bs.parse_marker();
      bs.tooltip.style.visibility='hidden';
    });
    
    bs.parse_marker();
    
    if(geokey){
      bs.mapAddr(geokey);
    }
  }
}


bs.mapCookie = function(mode){
  var n = ['lat','lng','zoom','maptype','parse'];
  var d = ['35.6898','139.692','10','normal',''];
  var v = new Array(9);
  if(bs.cookie.get('map')){
    var v = bs.cookie.get('map').split('*');
  }
//  if(!mode && !v[0]){
//    var g = google.loader.ClientLocation;
//    if(g && g.latitude) d[0] = g.latitude;
//    if(g && 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;
}


bs.getMapType = function(){
  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;
}


bs.mapBounds = function(){
  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];
}


bs.parse_marker = function(){
  var myDate = new Date();
  
  var bds = bs.mapBounds();
  var maxX = bds[0];
  var minX = bds[1];
  var maxY = bds[2];
  var minY = bds[3];
  var url = bp + 'ajax?type=home|bounds&maxX=' + maxX + '&minX=' + minX + '&maxY=' + maxY + '&minY=' + minY + '&t=' + myDate.getTime();
  //alert(url)
  var chk = new Array();
  GDownloadUrl(url, function(data) {
    var xml = GXml.parse(data);
    var markers = xml.documentElement.getElementsByTagName('marker');
    for (var i = 0; i < markers.length; i++) {
      var marker = markers[i];
      var id = marker.getAttribute('id');
      chk.push(id);
      if(typeof(bs.list[id]) != 'undefined'){
        continue;
      }
      var lat =  parseFloat(marker.getAttribute('lat'));
      var lng =  parseFloat(marker.getAttribute('lng'));
      var html = marker.getAttribute('html');
      var point = new GLatLng(lat,lng);
      var marker = bs.marker_create(id,point,html);
      bs.list[id] = marker;
      bs.keys.push(id);
      map.addOverlay(marker);
    }
  });
}

bs.marker_create = function(id,point,html){
  var icon = new GIcon();
  
  if(bs.MARKER_ID && bs.MARKER_ID == id){
    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);
  }else{
    icon.image = bp + 'parts/marker/tabby.png';
    icon.iconSize = new GSize(27,30);
    icon.iconAnchor = new GPoint(14,15);
  }
  var marker = new GMarker(point,icon);
  GEvent.addListener(marker, 'mouseover', function() {
    var z = map.getZoom();
    if(z > 1){
      marker.tip = html;
      bs.marker_tips(marker);
    }
  });
//  GEvent.addListener(marker,'mouseout', function() {
//    //bs.tooltip.style.visibility='hidden';
//  });
//  GEvent.addListener(marker, 'click', function(){
//    location.href = bp + 'spot/' + id;
//  });
  return marker;
}


bs.tooltip = document.createElement('div');

bs.marker_tips = function(marker){
  document.getElementById('map').appendChild(bs.tooltip);
  bs.tooltip.className = 'tooltip';
  bs.tooltip.innerHTML = marker.tip;
  var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
  var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
  var anchor = marker.getIcon().iconAnchor;
  var width = marker.getIcon().iconSize.width;
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width - 5,- offset.y + point.y +anchor.y - 10)); 
  pos.apply(bs.tooltip);
  bs.tooltip.style.visibility = 'visible';
}


bs.mapAddr = function(addr){
  if(!addr) return;
  geocoder = new GClientGeocoder();
  geocoder.getLatLng(
    addr,
    function(point){
      if(!point){
        //alert('「' + addr + '」がみつかりません');
      }else{
        var z = map.getZoom();
        if(z >= 14) z = 14
        map.setCenter(point,z+2);
        //map.panTo(point);
      }
    }
  );
}