
var map,lat,lng,zoom,maptype;
var list;
var keys;

function mapload(mode,id,lat,lng,zoom,maptype){
  if(GBrowserIsCompatible()){
    var c = mapCookie();
    if(!lat) lat = c['lat'];
    if(!lng) lng = c['lng'];
    if(!zoom) zoom = c['zoom'];
    if(!maptype) maptype = c['maptype'];
    
    map = new GMap2(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 GScaleControl());
    map.addControl(new GMapTypeControl(true, false));
    var overviewmap = new GOverviewMapControl(new GSize(140,140));
    map.addControl(overviewmap);
    overviewmap.hide(true);
    
    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;
    }
    
    GEvent.addListener(map,'maptypechanged',function(){
      var newmaptype = getMapType();
      cookie_set('map',newmaptype,3);
    });
    
    list = new Object();
    keys = new Array();

    GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel){
      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(marker,dpoint) {
      map.clearOverlays();
      map.panTo(dpoint);
      var marker = mk.create(dpoint);
      map.addOverlay(marker);
      var str = 'lat=' + dpoint.y + '&lng=' + dpoint.x;
      gh('read|addr','addrDisp',str,'','addr-loader');
    });
    
  }
}


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


function mapCookie(){
  var n = ['lat','lng','zoom','maptype','parse'];
  var d = ['35.68112','139.76703','13','normal',''];
  var v = new Array(5)
  if(getCookie('map')){
    var v = getCookie('map').split('*');
  }
  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 mapfit(m){
  if(!m){m = 79}
  if(window.opera){
    var h = document.body.clientHeight;
//  }else if(navigator.userAgent.indexOf('Safari') != -1){
//    var h = window.innerHeight;
  }else{
    var h = document.documentElement.clientHeight;
  }
  
  var nh = h - m;
  $('mapwrapper').style.height = nh + 'px';
  $('map').style.height = nh + 'px';
  $('mapside').style.height = nh + 'px';
}


function mapAddr(addr){
  geocoder = new GClientGeocoder();
  geocoder.getLatLng(
    addr,
    function(point){
      if(!point){
        alert('「' + addr + '」がみつかりません');
      }else{
        cookie_set('map','scr',4);
        zoom = map.getZoom();
        if(zoom >= 13){
          zoom += 2;
        }else{
          zoom = 15;
        }
        map.setCenter(point,zoom);
      }
    }
  );
}


//marker
var mk = {
  create: function(point,id,iconN,mode){
    if(!iconN) iconN = '';
    var icon = new GIcon();
    icon.image = bp + 'parts/marker/' + iconN + '-marker.png';
    icon.shadow = bp + 'parts/marker/-shadow.png';
    icon.iconSize = new GSize(22,30);
    icon.shadowSize = new GSize(33, 30);
    icon.iconAnchor = new GPoint(11, 30);
    icon.infoWindowAnchor = new GPoint(18,5);
    marker = new GMarker(point,icon);
    marker.id = id;
//    GEvent.addListener(marker, 'click', this.click(marker,mode));
    return marker;
  },
  
  click: function(marker,mode){
    return function(){
      iw.m(marker,mode);
    }
  },
  
  remove: function(id){
    if(!id) return;
    if(!list[id]) return;
    map.removeOverlay(list[id]);
  }
}


//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/move-marker.png';
    icon.shadow = bp + 'parts/marker/-shadow.png';
    icon.iconSize = new GSize(22,30);
    icon.shadowSize = new GSize(33, 30);
    icon.iconAnchor = new GPoint(11, 30);
    icon.infoWindowAnchor = new GPoint(18,5);
    d_marker = new GMarker(point,{icon:icon,draggable:true});
    return d_marker;
  },
  
  remove: function(){
    if(d_marker){
      map.removeOverlay(d_marker);
      if(id = d_marker.id){
        if(list[id]){
          map.removeOverlay(list[id]);
          map.addOverlay(list[id]);
        }
      }
    }
  }
}


//editMarker
var em = {
  form: function(id){
    dm.remove();
    if(id){
      var point = list[id].getPoint();
      map.removeOverlay(list[id]);
    }else{
      var point = map.getCenter();
    }
    d_marker = dm.create(point);
    map.addOverlay(d_marker);
    if(id) d_marker.id = id;
    iw.m(d_marker,'form');
    
    GEvent.addListener(map.getInfoWindow(),'closeclick',function(){
      dm.remove();
    });
    
    GEvent.addListener(d_marker, 'dragstart', function(){
      iw.tmp();
      map.closeInfoWindow();
    });
    
    GEvent.addListener(d_marker, 'dragend', function(){
      iw.m(d_marker,'form');
    });
  },
  
  sd: function(id){
    mfm.reset_all(document.mfrm);
    sd('map|edit','mfrm','iw_disp',this.end,id);
  },
  
  end: function(){
    var point = d_marker.getPoint();
    var id = $('new_id').value;
    var iconN = $('new_icon').value;
    marker = mk.create(id,point,iconN);
    map.addOverlay(marker);
    iw.m(marker);
    list[id] = marker;
    map.removeOverlay(d_marker);
  },
  
  del: function(id){
    if(id){
      if(!window.confirm('マーカーを削除します')) return;
      gt('map|edit','id=' + id + '&opt=del');
    }
    map.removeOverlay(list[id]);
    list[id] = undefined;
  },
  
  icon: function(v){
    var path = bp + 'parts/marker/' + v + '-marker.png';
    if($('icon')){
      var isMSIE = /*@cc_on!@*/false;
      if(isMSIE){
       $('icon').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + path + ', sizingMethod='scale')";
      }else{
        $('icon').src = path;
      }
      document.mfrm.icon.value = v;
    }
    hide('fd');
  }
  
}


var iw = {
  m: function(marker,mode){
    var id = '';
    if(marker.id) var id = marker.id;
    if(!mode) var mode = '';
    var file = bp + 'ajax?type=map|iw&mode=' + mode + '&id=' + id;
    GDownloadUrl(file, function(data){
      marker.openInfoWindowHtml(data);
      var f = document.mfrm;
      if(mode == 'form' && f){
        var mp = marker.getPoint();
        f.lat.value = mp.y;
        f.lng.value = mp.x;
        iw.tmp(1);
        iw.f();
        mfm.reset_all(f,1);
        if(!id) regeocode.iw(mp);
      }
    });
  },
  
  s: function(id){
    if(list[id]){
      this.m(list[id]);
      return;
    }
    var file = bp + 'ajax?type=map|bounds&mode=marker&id=' + id;
    GDownloadUrl(file, function(data){
      var xml = GXml.parse(data);
      var m = xml.documentElement.getElementsByTagName('marker');
      var lat =  parseFloat(m[0].getAttribute('lat'));
      var lng =  parseFloat(m[0].getAttribute('lng'));
      var iconN = m[0].getAttribute('icon');
      var point = new GLatLng(lat,lng);
      var marker = mk.create(id,point,iconN);
      map.addOverlay(marker);
      list[id] = marker;
      marker.id = id;
      iw.m(marker);
    });
  },
  
  f: function(){
    var f = document.mfrm;
    if(!f) return;
    if(f.zoom) f.zoom.value = map.getZoom();
    if(f.maptype) f.maptype.value = getMapType();
  },
  
  tmp: function(opt){
    var f = document.mfrm;
    if(!f) return;
    var n = ['title','body','tag'];
    for(i=0; i < n.length; i++){
      if(!opt){
        setCookie('tmp_' + n[i],f.elements[n[i]].value,1);
      }else if(getCookie('tmp_' + n[i])){
        f.elements[n[i]].value = getCookie('tmp_' + n[i]);
        setCookie('tmp_' + n[i],'',1/60/60/24);
      }
    }
  }

}


var mfm = {
  arr: function(){
    var a = new Array;
    a['title'] = 'ﾀｲﾄﾙ(必須)';
    a['body'] = 'ﾒﾓ';
    a['tag'] = 'ﾀｸﾞ(複数登録はｽﾍﾟｰｽ区切り)';
    a['city'] = '市区町村';
    a['town'] = '以下';
    return a;
  },
  
  reset: function(self,opt){
    var a = this.arr();
    fm.reset(self,a,opt);
  },
  
  reset_all: function(f,opt){
    var a = this.arr();
    for(i=0; i < f.elements.length; i++){
      if(a[f.elements[i].name]){
        this.reset(f.elements[i],opt);
      }
    }
  }
}


var regeocode = {
  iw: function(point){
    if(!point) return;
    var str = 'lat=' + point.y + '&lng=' + point.x;
    gh('map|regeocode','iwAddr',str,'','iw_loader');
  }
}

