// 数字付きマーカーを生成する
function create_marker(point, number, id) {
  var icon = new GIcon(base_icon);
  icon.image = 'icon/' + number + '.png';
  icon.printImage = 'icon/' + number + '.gif';
  icon.mozPrintImage = 'icon/' + number + '.png';
  var marker = new GMarker(point, icon);
  
  marker.id = id; // plc_id
  GEvent.addListener(marker, 'click', markerclickfn);
  
  return marker;
}
// オーバレイをリロードする
function reload_overlays(src) {
  var json_obj = eval('('+src+')');
  if (!json_obj) { return; }
  var src = json_obj.src;
  
  // 高頻度な更新などによるマーカーの重複を(ちょっぴり)回避
  if (markers.length > 0) { map.clearOverlays(); }
  
  for (var i = 0, len = src.length; i < len; i++) {
    var point = new GLatLng(parseFloat(src[i].lat), parseFloat(src[i].lng));
    var num   = i + 1;
    var id    = src[i].id;
    
    markers[id] = create_marker(point, num, id);
    map.addOverlay(markers[id]);
  }
}
// Ajaxなリクエスト用のURLを作る
function get_url() {
  var ajax = '?a=on';
  var loid = '&loc_id=' + loc_id;
  var paid = '&parental_id=' + parental_id;
  var caid = '&cat_id=' + cat_id;
  var plid = '&plc_id=' + plc_id;
  var swll = '&swll=' + sw_lat + ',' + sw_lng;
  var nell = '&nell=' + ne_lat + ',' + ne_lng;
  var oc   = '&o=' + o + '&c=' + c;
  var url  = base_url + ajax + loid + paid + caid + plid + swll + nell + oc;
  
  return url;
}
// 特定スポットを地図の中心に移動する
function pan_to_plc() {
  var infowin = map.getInfoWindow();
  var point   = infowin.getPoint();
  map.closeInfoWindow();
  map.panTo(point);
}
// GMap2.zoomOut()のエイリアス
function my_zoom_out() {
  map.zoomOut();
}
// GMap2.panTo()のエイリアス
function my_pan_to(lat, lng) {
  map.panTo(new GLatLng(lat, lng));
}





////////// 地図が動き終わったときの処理
function moveendfn() {
  // infowindowが開いていれば一切リロードしない
  if (anchor == 1) { return; }
  
  map.clearOverlays();
  plc_menu.html('');
  
  var bs = map.getBounds();
  var sw = bs.getSouthWest();
  var ne = bs.getNorthEast();
  
  // 緯度経度を小数点以下6ケタに丸める
  sw_lat = Math.round(sw.lat() * 1000000) / 1000000;
  sw_lng = Math.round(sw.lng() * 1000000) / 1000000;
  ne_lat = Math.round(ne.lat() * 1000000) / 1000000;
  ne_lng = Math.round(ne.lng() * 1000000) / 1000000;
  
  GDownloadUrl(get_url(), reload_at_moveend);
}
////////// オーバレイがクリアされたときの処理
function clearoverlaysfn() {
  anchor = 0;
  markers = [];
}
////////// infowindowが開閉されたときの処理
function infowindowopenfn() {
  anchor = 1;
}
function infowindowclosefn() {
  anchor = 2;
}
////////// マーカーがクリックされたときの処理
function markerclickfn() {
  // 既にinfowindowが開いてる状態で別のマーカーをクリックしたとき、
  // infowindowopenイベントより先にmoveendイベントが発生する場合がある。
  // そんな場合、infowindowが開く前にリロード処理が始まってしまい、
  // 開くはずだったinfowindowの描画がキャンセルされてしまう。
  // そのため、あらかじめ意図的にinfowindowを閉じて、さらにフラグを立てておく。
  if (anchor == 1) {
    map.closeInfoWindow();
    anchor = 1;
  }
  
  $('#plc_menu_body li').removeClass('oo');
  $('#plc_menu'+this.id).addClass('oo').show();
  
  this.openInfoWindowHtml(info_window_default_html);
  plc_detail.html('');
  
  GDownloadUrl(base_url+'?a=on&plc_id='+this.id, reload_at_marker_click);
}
////////// infowindowの閉じるボタンがクリックされたときの処理
function infowindowcloseclickfn() {
  $('#plc_menu_body li').removeClass('oo');
}
////////// 地域が変更されたときの処理
function change_loc() {
  map.clearOverlays();
  plc_menu.html('');
  
  var loc_select = document.getElementById('loc_select');
  var selected_value = loc_select.options[loc_select.selectedIndex].value;
  var loc_value = selected_value.split(',');
  
  loc_id = loc_value[0];
  
  set_custom_center(parseFloat(loc_value[1]), parseFloat(loc_value[2]), 0);
}
////////// 親ジャンルが変更されたときの処理
function change_parental() {
  map.clearOverlays();
  cat_menu.html('');
  plc_menu.html('');
  
  var parental_select = document.getElementById('parental_select');
  parental_id = parental_select.options[parental_select.selectedIndex].value;
  cat_id = 0;
  
  GDownloadUrl(get_url(), reload_at_change_parental);
  
  window.focus();
}
////////// 子ジャンルが変更されたときの処理
function change_cat() {
  map.clearOverlays();
  plc_menu.html('');
  
  var cat_select = document.getElementById('cat_select');
  var id = cat_select.options[cat_select.selectedIndex].value;
  cat_id = (id != 0)? id: 0;
  
  GDownloadUrl(get_url(), reload_at_change_cat);
  
  window.focus();
}
////////// スポットが変更されたときの処理
function change_plc(id) {
  GEvent.trigger(markers[id], 'click');
}
////////// スポットメニューがページめくりされたときの処理
function change_plcs(new_o) {
  o = new_o;
  
  switch (anchor) {
    case 0:
      GEvent.trigger(map, 'moveend');
      break;
    
    case 1:
    case 2:
      map.clearOverlays();
      plc_menu.html('');
      GDownloadUrl(get_url(), reload_at_moveend);
      break;
  }
  
  o = 0;
}





//////////////////// マーカーがクリックされたときのリロード処理
function reload_at_marker_click(xml, response_code) {
  var result01 = xml.match(new RegExp('<info_window>((?:\n|\r|.)*?)</info_window>'));
  var result02 = xml.match(new RegExp('<plc_detail>((?:\n|\r|.)*?)</plc_detail>'));
  
  $('#info_window').html((result01)? result01[1]: '');
  plc_detail.html((result02)? result02[1]: '');
}
//////////////////// 地図が動き終わったときのリロード処理
function reload_at_moveend(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<plc_menu>((?:\n|\r|.)*?)</plc_menu>'));
  
  if (result01) { reload_overlays(result01[1]); }
  plc_menu.html((result02)? result02[1]: '');
}
//////////////////// 地域が変更されたときのリロード処理
function reload_at_change_loc(xml, response_code) {
//  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<search_title>((?:\n|\r|.)*?)</search_title>'));
//  var result03 = xml.match(new RegExp('<plc_menu>((?:\n|\r|.)*?)</plc_menu>'));
  var result04 = xml.match(new RegExp('<cat_menu>((?:\n|\r|.)*?)</cat_menu>'));
  
//  if (result01) { reload_overlays(result01[1]); }
  search_title.html((result02)? result02[1]: '');
//  plc_menu.html((result03)? result03[1]: '');
  cat_menu.html((result04)? result04[1]: '');
}
//////////////////// 親カテゴリが変更されたときのリロード処理
function reload_at_change_parental(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<search_title>((?:\n|\r|.)*?)</search_title>'));
  var result03 = xml.match(new RegExp('<cat_menu>((?:\n|\r|.)*?)</cat_menu>'));
  var result04 = xml.match(new RegExp('<plc_menu>((?:\n|\r|.)*?)</plc_menu>'));
  var result06 = xml.match(new RegExp('<parental_ad>((?:\n|\r|.)*?)</parental_ad>'));
  
  if (result01) { reload_overlays(result01[1]); }
  search_title.html((result02)? result02[1]: '');
  cat_menu.html((result03)? result03[1]: '');
  plc_menu.html((result04)? result04[1]: '');
  parental_ad.html((result06)? result06[1]: '');
}
//////////////////// 子カテゴリが変更されたときのリロード処理
function reload_at_change_cat(xml, response_code) {
  var result01 = xml.match(new RegExp('<overlay_src>((?:\n|\r|.)*?)</overlay_src>'));
  var result02 = xml.match(new RegExp('<search_title>((?:\n|\r|.)*?)</search_title>'));
  var result03 = xml.match(new RegExp('<plc_menu>((?:\n|\r|.)*?)</plc_menu>'));
  
  if (result01) { reload_overlays(result01[1]); }
  search_title.html((result02)? result02[1]: '');
  plc_menu.html((result03)? result03[1]: '');
}
//////////////////// 検索オプションがリセットされたときのリロード処理(の一部)
function reload_at_reset_search_options(xml, response_code) {
  var result01 = xml.match(new RegExp('<search_title>((?:\n|\r|.)*?)</search_title>'));
  var result02 = xml.match(new RegExp('<cat_menu>((?:\n|\r|.)*?)</cat_menu>'));
  var result03 = xml.match(new RegExp('<plc_detail>((?:\n|\r|.)*?)</plc_detail>'));
  var result04 = xml.match(new RegExp('<parental_ad>((?:\n|\r|.)*?)</parental_ad>'));
  
  search_title.html((result01)? result01[1]: '');
  cat_menu.html((result02)? result02[1]: '');
  plc_detail.html((result03)? result03[1]: '');
  parental_ad.html((result04)? result04[1]: '');
}

