// $Id: map_google.js,v 1.7 2007/02/22 06:22:50 shiozaki Exp $

var mlMap;
var mlMapId;

function mlInitMap(id, longitude, latitude, zoom, mapType){
  mlMapId = id;
  mlMap = new GMap2(document.getElementById(mlMapId));
  //mlMap.addControl(new GLargeMapControl());
  mlMap.addControl(new GSmallMapControl());
  
  mlMap.addControl(new GMapTypeControl());
  mlMap.enableDoubleClickZoom();
  mlMap.enableContinuousZoom();
  mlMap.setCenter(new GLatLng(latitude, longitude), zoom);
  
  var cookieMaptype=getCookie("googlemaps_maptype");
  if(cookieMaptype!='') {
    mapType=cookieMaptype;
  }
  
  switch(mapType){
    case 'satellite':
        mlMap.setMapType(G_SATELLITE_MAP);
        break;
    case 'hybrid':
        mlMap.setMapType(G_HYBRID_MAP);
        break;
    case 'normal':
    default:
        mlMap.setMapType(G_NORMAL_MAP);
  }
  
  GEvent.addListener(mlMap, 'maptypechanged', function(){
    var currentType = '';
    switch(mlMap.getCurrentMapType()){
        case G_SATELLITE_MAP:
            currentType='satellite';
            break;
        case G_HYBRID_MAP:
            currentType='hybrid';
            break;
        case G_NORMAL_MAP:
            currentType='normal';
            break;
    }
    setCookie("googlemaps_maptype", currentType, getExpDate(180,0,0), '/');
  })
}

function mlInitAdminMap(id, longitude, latitude, zoom, mapType){
  mlMapId = id;
  mlMap = new GMap2(document.getElementById(mlMapId));
  mlMap.addControl(new GLargeMapControl());
  
  mlMap.addControl(new GMapTypeControl());
  mlMap.enableDoubleClickZoom();
  mlMap.enableContinuousZoom();
  mlMap.setCenter(new GLatLng(latitude, longitude), zoom);
  
  switch(mapType){
    case 'satellite':
        mlMap.setMapType(G_SATELLITE_MAP);
        break;
    case 'hybrid':
        mlMap.setMapType(G_HYBRID_MAP);
        break;
    case 'map':
    default:
        mlMap.setMapType(G_NORMAL_MAP);
  }
  
  var centerIcon = mlCreateIcon(adminUrl+'images/map/center.gif', 15, 15, 8, 8);
  var centerMarker = new GMarker(mlMap.getCenter(), centerIcon);
  mlMap.addOverlay(centerMarker);
  GEvent.addListener(mlMap, "move", function() {
    mlMap.removeOverlay(centerMarker);
    centerMarker = new GMarker(mlMap.getCenter(), centerIcon);
    mlMap.addOverlay(centerMarker);
  });
}

function mlSetMapSize(width, height){
  var center = mlMap.getCenter();
  document.getElementById(mlMapId).style.width  = width+'px';
  document.getElementById(mlMapId).style.height = height+'px';
  mlMap.checkResize();
  mlMap.setCenter(center);
}

function mlGetMapCenter(){
  var lng = mlMap.getCenter().lng();
  var lat = mlMap.getCenter().lat();
  
  return {longitude: lng, latitude: lat};
}

function mlGetMapZoom(){
  return mlMap.getZoom();
}

function mlAddMarker(longitude, latitude, html, icon){
  var marker = new GMarker(new GLatLng(latitude, longitude), icon);
  marker.popupHtml = html;
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  mlMap.addOverlay(marker);
  
  return marker;
}

function mlCreateIcon(url, width, height, offsetX, offsetY){
  var icon = new GIcon();
  icon.image = url;
  icon.iconSize = new GSize(width, height);
  icon.iconAnchor = new GPoint(offsetX, offsetY);
  icon.infoWindowAnchor = new GPoint(offsetX, offsetY);
  return icon;
}

function mlShowMarkerInfo(marker){
  marker.openInfoWindowHtml(marker.popupHtml);
}

function mlRemoveMarker(marker){
  mlMap.removeOverlay(marker);
}

function mlCloseInfoWindow(){
  mlMap.closeInfoWindow();
}

function mlMoveCenter(longitude, latitude){
  mlMap.panTo(new GLatLng(latitude, longitude));
}

function mlGetIconSize(icon){
  var w=icon.iconSize.width;
  var h=icon.iconSize.height;
  return {width:w, height:h};
}

function mlGetIconUrl(icon){
  return icon.image;
}

function mlGetBounds(){
    var bounds = mlMap.getBounds();
    var pointSW = bounds.getSouthWest();
    var pointNE = bounds.getNorthEast();
    
    return {minLng:pointSW.lng(), maxLng:pointNE.lng(), minLat:pointSW.lat(), maxLat:pointNE.lat()};}

function mlCalcZoomByBounds(bounds){
    var pointSW = new GLatLng(bounds.minLat, bounds.minLng);
    var pointNE = new GLatLng(bounds.maxLat, bounds.maxLng);
    var gbounds = new GLatLngBounds(pointSW, pointNE);
    
    result = mlMap.getBoundsZoomLevel(gbounds);
    
    return result;
}

function mlSetMapZoom(zoom){
    mlMap.setZoom(zoom);
}

function mlShowArea(lngMin, lngMax, latMin, latMax){
    var bounds = {minLng:lngMin, maxLng:lngMax, minLat:latMin, maxLat:latMax};
    var zoom = mlCalcZoomByBounds(bounds);
    mlSetMapZoom(zoom);
    
    // 中心計算
    // TODO メルカトルでちゃんと計算
    var centerLng = lngMin + (lngMax - lngMin) / 2;
    var centerLat = latMin + (latMax - latMin) / 2;
    mlMoveCenter(centerLng, centerLat);
}
