// 数字付きマーカーを生成する
function createMarker(point, n) {
  var icon = new GIcon(baseIcon);
  icon.image = 'icon/' + n + '.png';
  icon.printImage = 'icon/' + n + '.gif';
  icon.mozPrintImage = 'icon/' + n + '.png';
  var marker = new GMarker(point, icon);
  
  marker.n = n;
  GEvent.addListener(marker, 'click', markerclickfn);
  
  return marker;
}
// オーバレイをリロードする
function reload_overlays(src) {
  var json  = eval('('+src+')');
  if (!json) { return; }
  var src   = json.src;
  
  var swLat = 0, swLng = 0;
  var neLat = 0, neLng = 0;
  
  // 高頻度な更新などによるマーカーの重複を(ちょっぴり)回避
  if (markers.length > 0) { map.clearOverlays(); }
  
  for (var i = 0, len = src.length; i < len; i++) {
    var row   = src[i];
    var n     = row.num;
    var lat   = parseFloat(row.lat);
    var lng   = parseFloat(row.lng);
    var point = new GLatLng(lat, lng);
    
    markers[n] = createMarker(point, n);
    map.addOverlay(markers[n]);
    
    if (i == 0) {
      swLat = lat;
      swLng = lng;
      neLat = lat;
      neLng = lng;
    } else {
      if (swLat > lat) { swLat = lat; }
      if (swLng > lng) { swLng = lng; }
      if (neLat < lat) { neLat = lat; }
      if (neLng < lng) { neLng = lng; }
    }
  }
  
  // コースの各スポットを含む最小の矩形を求める
  var llbs = new GLatLngBounds(new GLatLng(swLat, swLng), new GLatLng(neLat, neLng));
  
  // 矩形に適した地図の中心およびズームレベルを計算
  var centerLat = (swLat + neLat) / 2;
  var centerLng = (swLng + neLng) / 2;
  // // 矩形をピッタリ含んでしまいマーカーが見えない場合があるため、
  // // zoom_level_offsetでズームレベルを調整する
  var zoom = map.getBoundsZoomLevel(llbs) - zoom_level_offset;
  
  map.setCenter(new GLatLng(centerLat, centerLng), zoom);
}
// Ajaxなリクエスト用のURLを作る
function get_url() {
  var mode = '?m=a';
  var arg1 = '&course_cat_id=' + course_cat_id;
  var arg2 = '&course_id=' + course_id;
  var arg3 = '&n=' + n;
  
  return base_url + mode + arg1 + arg2 + arg3;
}





////////// オーバレイがクリアされたときの処理
function clearoverlaysfn() {
  markers = [];
}
////////// マーカーがクリックされたときの処理
function markerclickfn() {
  n = this.n;
  
  $('#course_root .r').removeClass('o');
  $('#course_root .r').addClass('x').show();
  $('#course_root'+n).addClass('o').show();
  $('#course_root .o').removeClass('x');
  
  this.openInfoWindowHtml(info_window_default_html);
  
  GDownloadUrl(get_url(), reload_at_marker_click);
}
////////// infowindowの閉じるボタンがクリックされたときの処理
function infowindowcloseclickfn() {
  $('#course_root .o').addClass('x').show();
  $('#course_root .r').removeClass('o');
}
////////// コースカテゴリが変更されたときの処理
function change_course_cat(id) {
  course_cat_id = id;
  course_id     = 0;
  n             = 0;
  
  $('#course_maps').removeClass();
  $('#course_maps').addClass('course_cat'+id).show();
  
  map.clearOverlays();
  course_description.html('<h2>読み込み中...</h2>');
  course_root.html('');
  course_menu.html('');
  
  GDownloadUrl(get_url(), reload_at_change_course_cat);
}
////////// コースが変更されたときの処理
function change_course(id) {
  course_id = id;
  n         = 0;
  
  $('#course_menu li').removeClass('o');
  $('#course_menu li').addClass('x').show();
  $('#course_menu'+id).removeClass('x');
  $('#course_menu'+id).addClass('o').show();
  
  map.clearOverlays();
  course_description.html('<h2>読み込み中...</h2>');
  course_root.html('');
  
  GDownloadUrl(get_url(), reload_at_change_course);
}
////////// スポットが変更されたときの処理
function change_plc(id) {
  GEvent.trigger(markers[id], 'click');
}





//////////////////// マーカーがクリックされたときのリロード処理
function reload_at_marker_click(xml, response_code) {
  var result01 = xml.match(new RegExp('<info_window>((?:\n|\r|.)*?)</info_window>'));
  
  $('#info_window').html((result01)? result01[1]: '');
}
//////////////////// コースカテゴリが変更されたときのリロード処理
function reload_at_change_course_cat(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<course_description>((?:\n|\r|.)*?)</course_description>'));
  var result03 = xml.match(new RegExp('<course_root>((?:\n|\r|.)*?)</course_root>'));
  var result04 = xml.match(new RegExp('<course_menu>((?:\n|\r|.)*?)</course_menu>'));
  var result05 = xml.match(new RegExp('<sponsor_area>((?:\n|\r|.)*?)</sponsor_area>'));
  
  if (result01) { reload_overlays(result01[1]); }
  course_description.html((result02)? result02[1]: '');
  course_root.html((result03)? result03[1]: '');
  course_menu.html((result04)? result04[1]: '');
  sponsor_area.html((result05)? result05[1]: '');
}
//////////////////// コースが変更されたときのリロード処理
function reload_at_change_course(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<course_description>((?:\n|\r|.)*?)</course_description>'));
  var result03 = xml.match(new RegExp('<course_root>((?:\n|\r|.)*?)</course_root>'));
  
  if (result01) { reload_overlays(result01[1]); }
  course_description.html((result02)? result02[1]: '');
  course_root.html((result03)? result03[1]: '');
}
//////////////////// ページが読み込まれた直後のリロード処理
function init_overlays(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  
  if (result01) { reload_overlays(result01[1]); }
}
