//<![CDATA[

// GMapSite Map Control JavaScript
// ver 1.0
// Copyright (c) 2006 hami
// http://www.gmapsite.jp/

function gmapsiteAddOnLoad(func) {
  var oldOnLoad = window.onload;
  if (typeof oldOnLoad != 'function') {
    window.onload = func;
  } else {
    window.onload = function(e) { oldOnLoad(e); return func(e); };
  }
}

function gmapsiteAddOnUnload(func) {
  var oldOnUnload = window.onunload;
  if (typeof oldOnUnload != 'function') {
    window.onunload = func;
  } else {
    window.onunload = function(e) { oldOnUnload(e); return func(e); };
  }
}

function gmapsiteView(mapID, center, zoom, data) {
  if (GBrowserIsCompatible() == false) {
    window.alert("お使いのブラウザでは表示することができません。");
    return;
  }

  //表示すべきデータが存在するなら、Googleマップクラスを作成
  var map = new GMap2(document.getElementById(mapID));

  //コントローラの追加
  map.addControl(new GLargeMapControl());
  //map.addControl(new GMapTypeControl());
  map.addControl(new GOverviewMapControl());

  //マップの中央を設定
  var centerPoint = new GLatLng(center.lat, center.lng);
  map.setCenter(centerPoint, zoom);

  //マーカーの作成
  gmapsiteCreateMarkers(map, data);

  return map;
}

function gmapsiteCreateMarkers(map, data) {
  for (var i in data) {
    //表示されるマーカーの作成
    data[i].marker = new GMarker(new GPoint(data[i].lng, data[i].lat), { title: data[i].title })

    //マーカーにウィンドウ表示用データを付加
    data[i].marker.gmapsiteInfo = data[i].info;

    //マーカーをマップに追加
    gmapsiteAddOverlayMarker(map, data[i].marker);
  }
}

function gmapsiteAddOverlayMarker(map, marker) {
  map.addOverlay(marker);
  if ((marker.gmapsiteInfo != "") &&
      (marker.gmapsiteInfo != undefined)) {
    GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(marker.gmapsiteInfo);
    });
  }
}

function gmapsiteOpenInfoWindow(map, marker) {
  //表示されているウィンドウを閉じる
  map.closeInfoWindow();

  //情報ウィンドウの表示
  marker.openInfoWindowHtml(marker.gmapsiteInfo);
}

function gmapsiteXmlView(mapID, centerData, zoom, baseDataURL, baseViewURL) {
  if (GBrowserIsCompatible() == false) {
    window.alert("お使いのブラウザでは表示することができません。");
    return;
  }

  //表示すべきデータが存在するなら、Googleマップクラスを作成
  var map = new GMap2(document.getElementById(mapID));

  //マーカー管理配列を付加
  map.gmapsiteMarkers = new Array();

  //コントローラの追加
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GOverviewMapControl());

  //マップの中央を設定
  var centerPoint = new GLatLng(centerData.lat, centerData.lng);
  map.setCenter(centerPoint, zoom);

  //マーカーを表示
  gmapsiteXmlCreateMarker(map, gmapsiteXmlCreateDataURL(baseDataURL, map, centerData), baseViewURL);

  //移動終了イベントの設定
  GEvent.addListener(map, "moveend", function() {
    //移動後のマーカーを再設定
    gmapsiteXmlCreateMarker(map, gmapsiteXmlCreateDataURL(baseDataURL, map, centerData), baseViewURL);
  });

  //拡大終了イベントの設定
  GEvent.addListener(map, "zoomend", function() {
    //拡大後のマーカーを再設定
    gmapsiteXmlCreateMarker(map, gmapsiteXmlCreateDataURL(baseDataURL, map, centerData), baseViewURL);
  });
  return map;
}

function gmapsiteXmlCreateDataURL(baseDataURL, map, centerData) {
  //マップの表示領域を取得
  var bounds = map.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();

  //データ取得URLを生成
  var dataURL = baseDataURL;
  dataURL = dataURL + "/blog=" + centerData.blog;
  if (centerData.category != undefined) {
    dataURL = dataURL + "/category=" + centerData.category;
  }
  dataURL = dataURL + "/minlng=" + southWest.lng() + "/maxlng=" + northEast.lng() + "/minlat=" + southWest.lat() + "/maxlat=" + northEast.lat();

  return dataURL;
}

function gmapsiteXmlCreateMarker(map, dataURL, baseViewURL) {
  GDownloadUrl(dataURL, function(data, responseCode) {
    //マーカー生成用データ配列
    var markerData = new Array();

    //マーカーを新規作成
    var xml = GXml.parse(data);
    var marker = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < marker.length; i++) {
      var nodes = marker[i].childNodes;

      //マーカー用データの読み込み
      var blog = undefined;
      var entry = undefined;
      var lng = undefined;
      var lat = undefined;
      var title = undefined;
      for (var j = 0; j < nodes.length; j++) {
        if (nodes[j].nodeName == "blog") {
          blog = GXml.value(nodes[j]);
        } else if (nodes[j].nodeName == "entry") {
          entry = GXml.value(nodes[j]);
        } else if (nodes[j].nodeName == "lng") {
          lng = GXml.value(nodes[j]);
        } else if (nodes[j].nodeName == "lat") {
          lat = GXml.value(nodes[j]);
        } else if (nodes[j].nodeName == "title") {
          title = GXml.value(nodes[j]);
        }
      }

      if ((blog == undefined) ||
          (entry == undefined) ||
          (lng == undefined) ||
          (lat == undefined) ||
          (title == undefined)) {
        //データ不足
        continue;
      }

      //マーカー生成用データを保存
      var last = markerData.length;
      markerData[last] = new Object();
      markerData[last].blog = blog;
      markerData[last].entry = entry;
      markerData[last].lng = lng;
      markerData[last].lat = lat;
      markerData[last].title = title;
      markerData[last].info = "<iframe frameborder='0' src='" + baseViewURL + "/blog=" + blog + "/entry=" + entry + "'></iframe>";
    }

    //マーカーをマップに追加
    for (var i = 0; i < markerData.length; i++) {
      gmapsiteXmlCreateAddOverlayMarker(map, markerData[i]);
    }

    //表示されていないマーカーを検索
    for (var i in map.gmapsiteMarkers) {
      if (map.gmapsiteMarkers[i] != undefined) {
        var exist = false;
        for (var j = 0; j < markerData.length; j++) {
          if (map.gmapsiteMarkers[i].gmapsiteID == markerData[j].entry) {
            exist = true;
            break;
          }
        }
        if (exist == false) {
          //表示されていないマーカーを削除
          map.removeOverlay(map.gmapsiteMarkers[i]);
          delete map.gmapsiteMarkers[i];
          map.gmapsiteMarkers[i] = undefined;
        }
      }
    }
  });
}

function gmapsiteXmlCreateAddOverlayMarker(map, markerData) {
  var index = "'" + "entry:" + markerData.entry + "'";

  if (map.gmapsiteMarkers[index] != undefined) {
    if (map.gmapsiteOpenMarkerID == markerData.entry) {
      map.gmapsiteMarkers[index].openInfoWindowHtml(map.gmapsiteMarkers[index].gmapsiteInfo);
      map.gmapsiteOpenMarkerID = undefined;
    }
    return;
  }

  //表示されるマーカーの作成
  map.gmapsiteMarkers[index] = new GMarker(new GPoint(markerData.lng, markerData.lat), { title: markerData.title })

  //識別番号を付加
  map.gmapsiteMarkers[index].gmapsiteID = markerData.entry;

  //マーカーにウィンドウ表示用データを付加
  map.gmapsiteMarkers[index].gmapsiteInfo = markerData.info;

  //マーカーをマップに追加
  gmapsiteAddOverlayMarker(map, map.gmapsiteMarkers[index]);

  if (map.gmapsiteOpenMarkerID == markerData.entry) {
    map.gmapsiteMarkers[index].openInfoWindowHtml(map.gmapsiteMarkers[index].gmapsiteInfo);
    map.gmapsiteOpenMarkerID = undefined;
  }
}

function gmapsiteXmlOpenInfoWindow(map, entryid, lng, lat) {
  //表示されているウィンドウを閉じる
  map.closeInfoWindow();

  //マップの中央を設定
  var centerPoint = new GLatLng(lat, lng);
  map.panTo(centerPoint);

  //ウィンドウを表示したいマーカーIDを設定
  map.gmapsiteOpenMarkerID = entryid;
}

//]]>