/**
 * 鳥取県防災映像統合システム
 * マップ表示JavaScript
 */


/**
 * 基本設定
 */
var config = {
  "map_id": "gmap",             // GoogleMapsを表示するdivタグのID値
  "overlay_id": "overlay_map",  // マップオーバービュー用divタグのID値
  "area": {
    "all": {                  // 全県の中心位置
      "lat": 35.405842,
      "lng": 133.792877,
      "zoom": 9
    },
    "tottori": {              // 鳥取地区の中心位置
      "name": "鳥取地区",
      "lat": 35.49422,
      "lng": 134.235764,
      "zoom": 11
    },
    "yazu": {                 // 八頭地区の中心位置
      "name": "八頭地区",
      "lat": 35.381493,
      "lng": 134.290695,
      "zoom": 11
    },
    "kurayoshi": {            // 倉吉地区の中心位置
      "name": "倉吉地区",
      "lat": 35.428225,
      "lng": 133.829269,
      "zoom": 11
    },
    "yonago": {               // 米子地区の中心位置
      "name": "米子地区",
      "lat": 35.371695,
      "lng": 133.37265,
      "zoom": 11
    },
    "hino": {                 // 日野地区の中心位置
      "name": "日野地区",
      "lat": 35.221783,
      "lng": 133.328705,
      "zoom": 11
    }
  },
  "kind": {
    "rain": {
      "name": "雨量"
    },
    "water": {
      "name": "水位"
    },
    "snow": {
      "name": "積雪"
    }
  }
};



/**
 * 観測地点種別(画像ファイル名を兼ねる)
 */
var observation_types = null;

var map = null;                // google.maps.Mapオブジェクト
var overlayMap = null;         // マップオーバービュー用google.maps.Mapオブジェクト
var icons = [];                // アイコン種別配列
var mgr = null;                // マーカーマネージャ
var observations = [];         // 観測地点マーカーデータ格納配列
//2010/6/22 ADD S.Miki Start
var observation_values = {};   // 観測種別毎の配列
//2010/6/22 ADD S.Miki End
var all_markers = [];          // 全観測地点格納配列
var defaultCenter = null;      // デフォルト中心位置
var iconSize = 20;
var selected = {
  "type": null,
  "area": null
};

//2010/5/7 ADD S.Miki Start
var infowindow = null;    // 外部サイトへの案内を表示するウィンドウオブジェクト
//2010/5/7 ADD S.Miki End

//2010/6/22 ADD S.Miki Start
var roadcamera_makerset = false;
var rivercamera_makerset = false;
var rain_makerset = false;
var water_makerset = false;
var snow_makerset = false;
var other_makerset = false;
//2010/6/22 ADD S.Miki End

//2010/6/1 ADD S.Miki Start
/**
 * しばらくお待ちくださいメッセージ表示
 */
var wait_message = null;
var WaitMessage = function() {
  var max = null;
  
  this.show = function() {
    $("#wait_message").css("display", "block");
  }
  
  this.hide = function() {
    $("#wait_message").css("display", "none");
  }
  
};
//2010/6/1 ADD S.Miki End

/**
 * 観測地点マーカー表示管理
 */
var ObservationMarkerManager = function() {
  var layers = [];
  var visibleMarkers = [];
  var bounds;
  var limit_x;
  var limit_y;
  
  /**
   * マーカーの重なりチェック
   *
   * 種別や優先度を考慮してマーカーとの重なり状態をチェックし、結果を返す。
   */
  this.checkVisible = function(marker, click) {
    var flag = true;
    var bounds = map.getBounds();
    if (click) {
      var span = bounds.toSpan();
      limit_x = (span.lng() / 500) * iconSize;
      limit_y = (span.lat() / 400) * iconSize;
    }
    
    //2010/5/24 UPD S.Miki Start
    //if (click && $('#all_observation').attr('class') == 'active') {
    //  var check_markers = all_markers;
    //} else {
    //  var check_markers = this.visibleMarkers;
    //}
    var check_markers = this.visibleMarkers;
    //2010/5/24 UPD S.Miki End
    
    for (i = 0; i < check_markers.length; i++) {
      var diff_x = check_markers[i]['lng'] - marker.lng;
      var diff_y = check_markers[i]['lat'] - marker.lat;
      
      if (diff_x == 0 && diff_y == 0) continue;
      if (!click && $('#all_observation').attr('class') == 'active') {
        if (check_markers[i]['type_id'] == marker.type_id) {
          if (marker.type == 'road-camera' || marker.type == 'river-camera') {
            if (check_markers[i]['important_level'] == marker.important_level) {
              continue;
            }
          } else {
            continue;
          }
        }
      }
      if (!bounds.contains(marker.position) || ((Math.abs(diff_x) < limit_x) && (Math.abs(diff_y) < limit_y))) {
        flag = false;
        break;
      }
    }
    return flag;
  }
  
  /**
   * マーカー追加
   * 
   * 複数のマーカーを一括で各レイヤにセットする。
   */
  this.addMarkers = function(markers) {
    for (var i in markers) {
      if (!layers[markers[i].type]) {
        layers[markers[i].type] = [];
      }
      layers[markers[i].type].push(markers[i]);
    }
  }
  
  /**
   * レイヤ表示
   *
   * 指定したレイヤのマーカーを表示する。
   */
  this.showLayer = function(type_id) {
    //2010/6/1 UPD S.Miki Start
    //layers[type_id][index].setIcon(layers[type_id][index].single_icon);
    //layers[type_id][index].setVisible(true);
    //this.visibleMarkers.push(layers[type_id][i]);
    if (layers[type_id]) {
      wait_message.show();
      //wait_message.start(layers[type_id].length);

      //2010/6/22 UPD S.Miki Start
      //プログレスバーを使用しないのであればsetTimeoutを使用しない
      //  var index = 0;
      //  var recursion = function() {
      //    setTimeout(function(){
      //      if (index < layers[type_id].length) {
      //        layers[type_id][index].setIcon(layers[type_id][index].single_icon);
      //        layers[type_id][index].setVisible(true);
      //        index += 1;
      //       
      //        if ((Math.floor(index / layers[type_id].length * 100)) % 20 == 0 && hit) {
      //          //wait_message.update(index);
      //        }
      //        recursion();
      //      } else {
      //       wait_message.hide();
      //      }
      //    }, 0);
      //  }
      //  recursion();

      for (var i in layers[type_id]) {
        if (layers[type_id][i].single_icon == null) continue;
        layers[type_id][i].setIcon(layers[type_id][i].single_icon);
        layers[type_id][i].setVisible(true);
      }
      wait_message.hide();
      //2010/6/22 UPD S.Miki End

    }
    //2010/6/1 UPD S.Miki End
  }
  
  /**
   * レイヤ非表示
   *
   * 指定したレイヤのマーカーを非表示にする。
   */
  //2010/6/1 ADD S.Miki Start
  var hideLayerIndex = 0;
  //2010/6/1 ADD S.Miki End
  this.hideLayer = function(type_id) {
    //2010/6/1 UPD S.Miki Start
    //for (var i in observation_types) {
    //  this.hideLayer(observation_types[i].id);
    //}
    if (layers[type_id]) {
      wait_message.show();
      //wait_message.start(layers[type_id].length);

      //2010/6/22 UPD S.Miki Start
      //プログレスバーを使用しないのであればsetTimeoutを使用しない
      //var index = 0;
      //var recursion = function() {
      //  setTimeout(function(){
      //    if (index < layers[type_id].length) {
      //      layers[type_id][index].setVisible(false);
      //      index += 1;
      //      
      //      if ((Math.floor(index / layers[type_id].length * 100)) % 20 == 0 && hit) {
      //        //wait_message.update(index);
      //      }
      //      recursion();
      //    } else {
      //      wait_message.hide();
      //    }
      //  }, 0);
      //}
      //recursion();

      for (var i in layers[type_id]) {
        if (layers[type_id][i].single_icon == null) continue;
        layers[type_id][i].setVisible(false);
      }
      wait_message.hide();
      //2010/6/22 UPD S.Miki End
    }
    //2010/6/1 UPD S.Miki End
  }
  
  /**
   * 全レイヤ表示
   *
   * すべてのレイヤのマーカーを表示する。
   */
  this.showAllLayers = function() {
    bounds = map.getBounds().toSpan();
    limit_x = (bounds.lng() / 500) * iconSize;
    limit_y = (bounds.lat() / 400) * iconSize;
    
    this.visibleMarkers = [];
    for (var i in observation_types) {
      for (var j in layers[observation_types[i].id]) {
        if (this.checkVisible(layers[observation_types[i].id][j])) {
          layers[observation_types[i].id][j].setIcon(layers[observation_types[i].id][j].multi_icon);
          layers[observation_types[i].id][j].setVisible(true);
          this.visibleMarkers.push(layers[observation_types[i].id][j]);
        } else {
          layers[observation_types[i].id][j].setVisible(false);
        }
      }
    }
  }
  
  /**
   * 全レイヤ非表示
   *
   * すべてのレイヤのマーカーを非表示にする。
   */
  this.hideAllLayers = function() {
    for (var i in observation_types) {
      this.hideLayer(observation_types[i].id);
    }
  }
  
  //2010/5/24 ADD S.Miki Start
  /**
   * visibleMarkersを作成するかチェック
   *
   * Map表示しているMakerの配列を作成する。
   */
  this.checkVisibleMarkers = function(type_id) {
    if ($("#" + type_id).attr('class') == 'active') {
      this.makeVisibleMarkers(type_id);
    }
    if ($("#other").attr('class') == 'active') {
      this.makeVisibleMarkers("weather");
      this.makeVisibleMarkers("chlorine");
      this.makeVisibleMarkers("water_quality");
      this.makeVisibleMarkers("weir");
    }
  }
  
  /**
   * visibleMarkers作成
   *
   * Map表示しているMakerの配列を作成する。
   */
  this.makeVisibleMarkers = function(type_id) {
    for (var i in layers[type_id]) {
      this.visibleMarkers.push(layers[type_id][i]);
    }
  }
  //2010/5/24 ADD S.Miki End
}



/**
 * 観測地点アイコン取得
 * 
 * 指定タイプの画像をセットしたアイコンを生成し、返す。
 */
function getObservationIcon(observation, kind) {
  var observation_level = observation.level;
  var key = observation.type + "_" + observation.nation_flag + "_" + kind + "_" + observation.level;
  if (!icons[key]) {
    if (kind == "multi") {
      observation_level = "";
    }
    
    var image_name = observation_types[observation.type]['icon'];
    if (image_name == "camera") {
      if (!observation.nation_flag) { image_name += "_pref"; }
    } else {
      if (kind == "single" && image_name == "water_level") {
        image_name = "keep";
        switch (observation.fluctuation) {
          case '1':
            image_name = "up";
            break;
          case '-1':
            image_name = "down";
            break;
        }
      }
      
      if (kind == "multi" && (image_name == "rain" || image_name == "water_level" || image_name == "snow")) {
        image_name += "_1";
      }
    }
    if (observation_level !== "") {
      image_name += "_" + observation_level;
    }
    
    var image_path = app_root + "img/marker/" + image_name + ".png";
    var icon = new google.maps.MarkerImage(
      image_path,
      new google.maps.Size(iconSize, iconSize),
      new google.maps.Point(0, 0),
      new google.maps.Point(iconSize / 2, iconSize / 2)
    );
    
    icons[key] = icon;
  }
  return icons[key];
}


/**
 * 観測地点マーカー生成
 * 
 * 指定観測地点のマーカーを生成し、返す。
 * ※クリック時のイベント等はここで指定する。
 */
function createObservationMarker(observation) {
  var icon_name = observation.name;
  if (observation.type.substr(0, 1) == "t") {
    icon_name += "\n" + observation.value;
  }
  var options =  {
    map: map,
    lat: observation.lat,
    lng: observation.lng,
    //2010/5/27 ADD S.Miki Start
    visible: false,
    //2010/5/27 ADD S.Miki End
    position: new google.maps.LatLng(observation.lat, observation.lng),
    icon: getObservationIcon(observation, "multi"),
    multi_icon: getObservationIcon(observation, "multi"),
    single_icon: getObservationIcon(observation, "single"),
    title: icon_name,
    zIndex: observation_types[observation.type].zindex,
    type: observation_types[observation.type].id,
    type_id: observation.type,
    url: observation.url,
    id: observation.id,
    important_level: observation.important_level
  };
  var marker = new google.maps.Marker(options);
  google.maps.event.addListener(marker, "click", function() {
    if (mgr.checkVisible(marker, true)) {
      var url = marker.url;
      var test
      if (url == null || url == "") {
        //2010/5/7 UPD S.Miki Start
        //url = observation_types[marker.type_id].page + marker.id + "&another_window=true" + from_admin_char;
        setTimeout(function(){
          url = observation_types[marker.type_id].page + marker.id + "&another_window=true" + from_admin_char;
          window.open(url, 'detail');
        }, 0);
        //2010/5/7 UPD S.Miki End
      //2010/5/7 UPD S.Miki Start
      //}
      //window.open(url, 'detail');
        } else {
          if (infowindow) {
            infowindow.close();
          }
          var setcontents = "<div style='width:260px;height:90px;'>";
          setcontents += "<form>";
          setcontents += "<b>" + icon_name + "<b/>";
          //setcontents += "<br ><img src='/img/top/fing.gif'><A href=" + url + " target='_blank'>国等のサイトへジャンプ</A><br >";
          setcontents += "<br ><img src='/img/top/fing.gif'><A href=JavaScript:fn_sitemove('" + url + "')>国等のサイトへジャンプ</A><br >";
          setcontents += "<input type='button' value='閉じる' onclick='infowindow.close();'>";
          setcontents += "</form>";
          setcontents += "</div>";
          infowindow = new google.maps.InfoWindow();
          var positions =new google.maps.LatLng(observation.lat, observation.lng);
          infowindow.setContent(setcontents);
          infowindow.setPosition(positions);
          infowindow.open(map);
          //floatShadow
        }
       //2010/5/7 UPD S.Miki End
    } else {
      map.panTo(marker.position);
      map.setZoom(map.getZoom() + 1);
    }
  });
  
  //2010/5/7 ADD S.Miki Start
  //var cationwindow;
  //google.maps.event.addListener(marker, "mouseover", function() {
  //  if (!mgr.checkVisible(marker, true)) {
  //    var setcontents = "<b>アイコンが重なっています。<br >クリックすると拡大します。<b/>";
  //    cationwindow = new google.maps.InfoWindow();
  //   var positions =new google.maps.LatLng(observation.lat, observation.lng);
  //    cationwindow.setContent(setcontents);
  //   cationwindow.setPosition(positions);
  //    cationwindow.open(map);
  //  }
  //});
    
  //google.maps.event.addListener(marker, "mouseout", function() {
  //  if (cationwindow) {
  //    cationwindow.close();
  //  }
  //});
  //2010/5/7 ADD S.Miki End
  return marker;
}

function fn_sitemove(url) {
  window.open(url, 'detail');
  if (infowindow) {
    infowindow.close();
  }
}


///**
// * 観測地点マーカー取得
// * 
// * 設定された全観測地点のマーカーを生成し、配列で返す。
// * 
// */

//2010/6/22 UPD S.Miki Start
//指定種別のみを対象としたマーカー作成処理に作り替え
////2010/5/27 ADD S.Miki Start
//var markers = [];
//var observationsIndex = 0;
//var cnt = 0;
//var id = "";
//var type_cnt = 0;
//var hit = false;
////2010/5/27 ADD S.Miki End
////function getObservationMarkers(type_id) {
//function getObservationMarkers(type_id, observation_cnt) {
//2010/5/27 UPD S.Miki Start
////  var markers = [];
////  for (var i in observations) {
////    markers.push(createObservationMarker(observations[i]));
////  }
////  all_markers = observations;
////  return markers;
//  cnt = observation_cnt;
//  id  = type_id;
//  //if (observation_types[observations[observationsIndex].type].id == "weather" || observation_types[observations[observationsIndex].type].id == "chlorine" || observation_types[observations[observationsIndex].type].id == "weir" || observation_types[observations[observationsIndex].type].id == "water_quality" ) {
//  if (observation_types[observations[observationsIndex].type].id == type_id) {
//    markers.push(createObservationMarker(observations[observationsIndex]));
//    type_cnt += 1;
//    hit = true;
//  }
//
//  observationsIndex += 1;
//  
//  //if (markers.length < observations.length) {
//  if (type_cnt < cnt) {
//    if ((Math.floor(type_cnt / cnt * 100)) % 20 == 0 && hit) {
//      //wait_message.update(type_cnt);
//      hit = false;
//    }
//    //setTimeout('getObservationMarkers()', 0.01);
//    setTimeout("getObservationMarkers(id, cnt)", 0.01);
//  } else {
//    setMakerset(type_id);
//    //wait_message.hide();
//    all_markers = observations;
//    mgr = new ObservationMarkerManager();
//    mgr.addMarkers(markers);
//    //2010/6/7 UPD S.Miki Start
//    //changeType("road-camera");
//    changeType(type_id);
//    //2010/6/7 UPD S.Miki End
//    
//    observationsIndex = 0;
//    type_cnt = 0;
//    //markers = [];
//  }
////2010/5/27 UPD S.Miki End
//}

/**
 * 観測地点マーカー取得
 * 
 * 指定種別に設定された全観測地点のマーカーを生成する。
 */
var markers = {};
var observationsIndex = {};
function getObservationMarkers(type_id) {
  if (observationsIndex[type_id] == null) {
    observationsIndex[type_id] = 0;
    markers[type_id] = [];
  }
  
  var observation_value = observation_values[type_id][observationsIndex[type_id]];
  markers[type_id].push(createObservationMarker(observation_value));
  observationsIndex[type_id] += 1;
  
  if (observationsIndex[type_id] < observation_values[type_id].length) {
    setTimeout("getObservationMarkers('" + type_id + "')", 0);
  } else {
    mgr.addMarkers(markers[type_id]);
    setMakerset(type_id);
    changeType(type_id);
  }
}
//2010/6/22 UPD S.Miki End

/**
 * 観測地点マーカーセットアップ
 * 
 * 設定された観測地点のマーカーをMarkerManagerに追加する。
 */
function setupObservationMarkers() {
  //2010/6/1 ADD S.Miki Start
  wait_message.show();
  //2010/6/1 ADD S.Miki End
  $.ajax({
    url: json_url,
    dataType: "json",
    success: function(data) {
      observations = data.observations;
      //2010/6/22 UPD S.Miki Start
      //2010/6/1 ADD S.Miki Start
      ////各観測種別地点数カウント
      //for (var i in observations) {
      //  switch(observation_types[observations[i].type].id){
      //   case "road-camera": 
      //         roadcamera_cnt += 1; 
      //         break;
      //   case "river-camera": 
      //         rivercamera_cnt += 1; 
      //         break;
      //   case "water": water_cnt += 1; break;
      //   case "snow": snow_cnt += 1; break;
      //   case "rain": rain_cnt += 1; break;
      //   default : other_cnt += 1;break;
      //  }
      //}
      
      // 観測値データを種別をキーにした配列に分けて格納する
      for (var i in observations) {
        var type_id = observation_types[observations[i].type].id;
        if (isOther(type_id)) type_id = "other";
        if (observation_values[type_id] == null) {
          observation_values[type_id] = [];
        }
        observation_values[type_id].push(observations[i]);
      }
      mgr = new ObservationMarkerManager();
      setTimeout("getObservationMarkers('river-camera')", 0);
      //2010/6/22 UPD S.Miki End
      //2010/6/22 DEL S.Miki Start
      //setTimeout("getObservationMarkers('river-camera', rivercamera_cnt)", 0);
      //2010/6/22 DEL S.Miki Start
      //2010/6/1 ADD S.Miki End
    },
    error: function() {
      alert("ERROR: マーカーデータ読み込みに失敗しました。");
    }
  });
}

//2010/6/22 ADD S.Miki Start
/**
 * その他扱いチェック
 * 
 * 塩分濃度、気象、水質、堰諸量の場合には「その他」扱いとしてtrueを返す。
 */
function isOther(type_id) {
  if ($.browser.msie) {   // IEにはArrayオブジェクトにindexOfメソッドが無いため定義追加
    if (!Array.indexOf) {
      Array.prototype.indexOf = function(object) {
        for (var i in this) {
          if (this[i] == object) return i;
        }
        return -1;
      }
    }
  }
  var items = ["chlorine", "weather", "water_quality", "weir"];
  return (items.indexOf(type_id) >= 0);
}
//2010/6/22 ADD S.Miki End



/**
 * 指定エリアへ移動
 * 
 * GoogleMapにて指定エリアに移動する。
 */
function moveToArea(area_id) {
  var area = eval("config.area." + area_id);
  activateArea(area_id);
  map.panTo(new google.maps.LatLng(area.lat, area.lng));
  map.setZoom(area.zoom);
}


/**
 * エリア選択有効化
 * 
 * 選択したエリアのメニューをアクティブ状態にする。
 */
function activateArea(area_id) {
  $("#all").removeClass("active");
  $("#tottori").removeClass("active");
  $("#yazu").removeClass("active");
  $("#kurayoshi").removeClass("active");
  $("#yonago").removeClass("active");
  $("#hino").removeClass("active");
  
  $("#" + area_id).addClass("active");
  selected.area = null;
  if (area_id != "all") {
    selected.area = eval("config.area." + area_id + ".name");
  }
  
  resetGrid(selected.type, selected.area);
}


/**
 * 表示種別変更
 * 
 * 表示する観測種別を切り替える。
 */
function changeType(type_id) {

  //2010/6/22 ADD S.Miki Start
  wait_message.show();
  //2010/6/22 ADD S.Miki End
  if (getMakerset(type_id) == false) {
    getObservationMarkers(type_id);
    setMakerset(type_id);
  } else {

    activateType(type_id);
    showLegend(type_id);
    
    selected.type = null;
    if (type_id == "rain" || type_id == "water" || type_id == "snow") {
      selected.type = eval("config.kind." + type_id + ".name");
    } else if (type_id == "other") {
      selected.type = type_id;
    }
    
    if (type_id == "snow" && is_winter != '1') {
      selected.type = "気温";
    }
    
    if (map.getZoom() < config.area.all.zoom) {
      map.setZoom(config.area.all.zoom);
      map.setCenter(defaultCenter);
    }
    google.maps.event.clearListeners(map, "bounds_changed");

    if (type_id == "all_observation") {
      mgr.showAllLayers();
      google.maps.event.addListener(map, "bounds_changed", function() {
        mgr.showAllLayers();
      });
    } else if (type_id == "other") {
      //2010/5/24 UPD S.Miki Start
      //mgr.visibleMarkers = [];
      //mgr.hideAllLayers();
      //mgr.showLayer("weather");
      //mgr.showLayer("chlorine");
      //mgr.showLayer("water_quality");
      //mgr.showLayer("weir");
      if ($("#" + type_id).attr('class') == 'active') {
        mgr.showLayer("weather");
        mgr.showLayer("chlorine");
        mgr.showLayer("water_quality");
        mgr.showLayer("weir");
      } else {
        mgr.hideLayer("weather");
        mgr.hideLayer("chlorine");
        mgr.hideLayer("water_quality");
        mgr.hideLayer("weir");
      }
      //2010/5/24 UPD S.Miki End
    } else {
      //2010/5/24 UPD S.Miki Start
      //mgr.visibleMarkers = [];
      //mgr.hideAllLayers();
      //mgr.showLayer(type_id);
      if (type_id != "none") {
        if ($("#" + type_id).attr('class') == 'active') {
          mgr.showLayer(type_id);
        } else {
          mgr.hideLayer(type_id);
        }
      }
      //2010/5/24 UPD S.Miki End
    }
    
    //2010/5/24 ADD S.Miki Start
    //visibleMarkers再作成
    mgr.visibleMarkers = [];
    mgr.checkVisibleMarkers("road-camera");
    mgr.checkVisibleMarkers("river-camera");
    mgr.checkVisibleMarkers("rain");
    mgr.checkVisibleMarkers("water");
    mgr.checkVisibleMarkers("snow");
    mgr.checkVisibleMarkers("temperature");
    mgr.checkVisibleMarkers("other");
    //2010/5/24 ADD S.Miki End
    
    resetGrid(selected.type, selected.area);
  }
}


/**
 * 表示種別選択有効化
 * 
 * 選択した表示種別のメニューをアクティブ状態にする。
 */
function activateType(type_id) {
  //2010/5/24 UPD S.Miki Start
  //$("#all_observation").removeClass("active");
  //$("#road-camera").removeClass("active");
  //$("#river-camera").removeClass("active");
  //$("#rain").removeClass("active");
  //$("#water").removeClass("active");
  //$("#snow").removeClass("active");
  //$("#temperature").removeClass("active");
  //$("#other").removeClass("active");
  //$("#" + type_id).addClass("active");
  if ($("#" + type_id).attr('class') == 'active') {
    $("#" + type_id).removeClass("active");
  } else {
    $("#" + type_id).addClass("active");
  }
  //2010/5/24 UPD S.Miki End
  if (type_id == "snow") {
    if ($("#temperature").attr('class') == 'active') {
      $("#temperature").removeClass("active");
    } else {
      $("#temperature").addClass("active");
    }
  }
}


/**
 * 凡例の表示／非表示切り替え
 *
 * 選択した表示種別の凡例を表示する。
 */
function showLegend(type_id) {
  $("#legend-camera").css("display", "none");
  $("#legend-rain").css("display", "none");
  $("#legend-water").css("display", "none");
  $("#legend-snow").css("display", "none");
  $("#legend-other").css("display", "none");
  if (type_id == "road-camera" || type_id == "river-camera") {
    $("#legend-camera").css("display", "block");
  } else if (type_id != "all_observation") {
    $("#legend-" + type_id).css("display", "block");
  }
}


/**
 * マップオーバービューセット
 */
function setMapOverview() {
  var overlaydiv = document.getElementById(config.overlay_id);
  var overlayOptions = {
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    //2010/5/24 UPD S.Miki Start
    //disableDefaultUI: true,
    disableDefaultUI: false,
    //2010/5/24 UPD S.Miki End
    scrollwheel: false,
    //2010/5/24 UPD S.Miki Start
    //disableDoubleClickZoom: true
    disableDoubleClickZoom: false
    //2010/5/24 UPD S.Miki End
  };
  overlayMap = new google.maps.Map(overlaydiv, overlayOptions);
  
  var translucentBox = new google.maps.Polygon({
    strokeColor: "#4444BB",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#4444BB",
    fillOpacity: 0.25
  });
  translucentBox.setMap(overlayMap);
  
  var transparentBox = new google.maps.Polygon({
    strokeColor: "#4444BB",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#4444BB",
    fillOpacity: 0.01
  });
  transparentBox.setMap(overlayMap);
  
  function pathFromBounds(bounds) {
    var northEastCorner = bounds.getNorthEast();
    var southWestCorner = bounds.getSouthWest();
    var northEastLat = northEastCorner.lat();
    var northEastLng = northEastCorner.lng();
    var southWestLat = southWestCorner.lat();
    var southWestLng = southWestCorner.lng();
    var southEastCorner = new google.maps.LatLng(southWestLat, northEastLng);
    var northWestCorner = new google.maps.LatLng(northEastLat, southWestLng);
    
    return [
      northEastCorner,
      southEastCorner,
      southWestCorner,
      northWestCorner,
      northEastCorner
    ];
  }
  
  function updateOverlayMapCenter() {
    var newCenter = map.getCenter();
    if (overlayMap.getCenter() !== newCenter) {
      overlayMap.panTo(newCenter);
    }
  }
  
  function degToRad(degrees) {
    return degrees * Math.PI / 180;
  }
  
  function latToY(latitude) {
    var lat = degToRad(latitude);
    return Math.log(Math.tan(lat) + 1 / Math.cos(lat));
  }
  
  function radToDeg(radians) {
    return radians * 180 / Math.PI;
  }
  
  function yToLat(y) {
    var angle = 2 * Math.atan(Math.pow(Math.E, y)) - Math.PI / 2;
    return radToDeg(angle);
  }
  
  google.maps.event.addListener(overlayMap, 'bounds_changed', function () {
    var mapBounds = map.getBounds();
    if (mapBounds !== undefined) {
      var northEastCorner = mapBounds.getNorthEast();
      var southWestCorner = mapBounds.getSouthWest();
      var northEastLat = northEastCorner.lat();
      var northEastLng = northEastCorner.lng();
      var southWestLat = southWestCorner.lat();
      var southWestLng = southWestCorner.lng();
      
      var mapCenter = map.getCenter();
      var overlayCenter = overlayMap.getCenter();
      var lngDelta = overlayCenter.lng() - mapCenter.lng();
      northEastLng += lngDelta;
      southWestLng += lngDelta;
      
      var overlayMapBounds = overlayMap.getBounds();
      var overlayTopLat = overlayMapBounds.getNorthEast().lat();
      var overlayBottomLat = overlayMapBounds.getSouthWest().lat();
      var overlayTop = latToY(overlayTopLat);
      var overlayBottom = latToY(overlayBottomLat);
      var overlayHeight = Math.abs(overlayTop - overlayBottom);
      var mapHeight = Math.abs(latToY(northEastLat) - latToY(southWestLat));
      
      var bottomLatDelta = overlayBottom + (overlayHeight - mapHeight) / 2;
      var topLatDelta = overlayTop - (overlayHeight - mapHeight) / 2;
      northEastLat = yToLat(topLatDelta);
      southWestLat = yToLat(bottomLatDelta);
      
      var sw = new google.maps.LatLng(southWestLat, southWestLng);
      var se = new google.maps.LatLng(southWestLat, northEastLng);
      var ne = new google.maps.LatLng(northEastLat, northEastLng);
      var nw = new google.maps.LatLng(northEastLat, southWestLng);
      transparentBox.setPath([sw, nw, ne, se, sw]);
    }
  });
  
  google.maps.event.addListener(map, 'zoom_changed', function () {
    var newZoom = Math.max(map.getZoom() - 4, 0);
    if (overlayMap.getZoom() !== newZoom) {
      overlayMap.setZoom(newZoom);
    }
  });
  
  var mapDragInProgress = false;
  var panHasBegun = false;
  
  google.maps.event.addListener(map, 'center_changed', function () {
    if ((mapDragInProgress === false) && (panHasBegun === false)) {
      updateOverlayMapCenter();
    }
  });
  
  google.maps.event.addListener(map, 'idle', function () {
    if (panHasBegun === true) {
      panHasBegun = false;
      mapDragInProgress = false;
    }
  });
  
  google.maps.event.addListener(map, 'dragstart', function () {
    panHasBegun = false;
    mapDragInProgress = true;
  });
  
  google.maps.event.addListener(map, 'dragend', function () {
    updateOverlayMapCenter();
    mapDragInProgress = false;
  });
  
  google.maps.event.addListener(overlayMap, 'dragstart', function () {
    panHasBegun = false;
    mapDragInProgress = true;
  });
  
  google.maps.event.addListener(overlayMap, 'dragend', function () {
    panHasBegun = true;
    var newCenter = overlayMap.getCenter();
    if (map.getCenter() !== newCenter) {
      map.panTo(newCenter);
    }
  });
  
  google.maps.event.addListener(overlayMap, 'dblclick', function (mEvent) {
    mapDragInProgress = true;
    overlayMap.panTo(mEvent.latLng);
    map.panTo(mEvent.latLng);
  });
  
  google.maps.event.addListener(map, 'maptypeid_changed', function () {
    overlayMap.setOptions({mapTypeId: map.getMapTypeId()});
  });
  
  
  overlayMap.setZoom(config.area.all.zoom - 4);
  overlayMap.setCenter(defaultCenter);
}

/**
 * GoogleMaps初期化
 * Version 3対応
 */
google.maps.event.addDomListener(window, 'load', function() {
  observation_types = {
    "c1": { id: "road-camera", icon: "camera", name: "道路カメラ", zindex: 4, page: app_root + "cameras/detail/" },
    "c2": { id: "river-camera", icon: "camera", name: "河川カメラ", zindex: 4, page: app_root + "cameras/detail/" },
    "t1": { id: "rain", icon: "rain", name: "雨量", zindex: 3, page: app_root + "telemeters/rainfall_detail?id=" },
    "t2": { id: "water", icon: "water_level", name: "河川", zindex: 2, page: app_root + "telemeters/water_level_detail?id=" },
    "t3": { id: "snow", icon: "snow", name: "積雪", zindex: 1, page: app_root + "telemeters/snow_depth_detail?id=" },
    "t4": { id: "weather", icon: "weather", name: "気象", zindex: 0, page: app_root + "telemeters/weather_detail?id=" },
    "t5": { id: "chlorine", icon: "chlorine", name: "塩分濃度", zindex: 0, page: app_root + "telemeters/salinity_detail?id=" },
    "t6": { id: "water_quality", icon: "water", name: "水質", zindex: 0, page: app_root + "telemeters/water_quality_detail?id=" },
    "t7": { id: "weir", icon: "weir", name: "堰諸量", zindex: 0, page: app_root + "telemeters/weir_detail?id=" }
  };
  if (is_winter != '1') {
    observation_types['t3']['icon'] = "temperature";
  }
  //window.document.body.runtimeStyle.zoom = "100%";  
  defaultCenter = new google.maps.LatLng(config.area.all.lat, config.area.all.lng);
  
  var mapdiv = document.getElementById(config.map_id);
  var myOptions = {
    zoom: config.area.all.zoom,                 // デフォルトズーム 
    center: defaultCenter,                      // 中心位置
    mapTypeId: google.maps.MapTypeId.ROADMAP,   // デフォルトマップタイプ 道路地図
    //2010/5/24 UPD S.Miki Start
    //scaleControl: true,                         // スケールコントロール
    //draggable: true,                            // ドラッグ許可
    //navigationControl: true,                    // ナビゲーションコントロール
    scaleControl: false,                         // スケールコントロール
    draggable: false,                            // ドラッグ不許可
    navigationControl: false,                    // ナビゲーションコントロール
    //2010/5/24 UPD S.Miki End
    //2010/5/10 UPD S.Miki Start
    //scrollwheel: true,                          // ホイールスクロール
    scrollwheel: false,                          // ホイールスクロール
    //2010/5/10 UPD S.Miki End
    //2010/5/24 UPD S.Miki Start
    //keyboardShortcuts: true                     // キーボード操作有効
    keyboardShortcuts: false,                     // キーボード操作無効
    disableDoubleClickZoom: false                 // ダブルクリックMap操作無効
    //2010/5/24 UPD S.Miki End
  };
  map = new google.maps.Map(mapdiv, myOptions);
  
  setMapOverview();

  //2010/6/1 ADD S.Miki Start
  wait_message = new WaitMessage();
  //2010/6/1 ADD S.Miki End
  
  // マーカーセット
  // setupObservationMarkers()
  //   ⇒ getObservationMarkers()
  //   ⇒ createObservationMarker()
  //   ⇒ getObservationIcon()



  window.setTimeout(setupObservationMarkers, 0);
  
  map.scaleControl = true;                          // スケールコントロール
  map.draggable = true;                             // ドラッグ許可
  map.navigationControl = true;                     // ナビゲーションコントロール
  map.disableDoubleClickZoom = true;                // ダブルクリックMap操作有効
});

/**
 * マーカ作成の有無
 */
function getMakerset(type_id) {

  switch(type_id){
   case "road-camera": 
         return roadcamera_makerset;
         break;
   case "river-camera":
         return rivercamera_makerset;
         break;
   case "water":
         return water_makerset;
         break;
   case "snow":
         return snow_makerset;
         break;
   case "rain":
         return rain_makerset;
         break;
   default : 
        return other_makerset;
        break;
  }

}

/**
 * マーカ作成フラグをTRUEにする
 */
function setMakerset(type_id) {

  switch(type_id){
   case "road-camera": 
         roadcamera_makerset = true;
         break;
   case "river-camera":
         rivercamera_makerset = true;
         break;
   case "water":
         water_makerset = true;
         break;
   case "snow":
         snow_makerset = true;
         break;
   case "rain":
         rain_makerset = true;
         break;
   default : 
        other_makerset = true;
        break;
  }

}
