window.onresize=resizeApp;
var flag_win_open = false;  // 吹き出しが開いているかのフラグ
var map;

function load() {
  if (GBrowserIsCompatible()) {
    resizeApp();

    map = new GMap2(document.getElementById("map"));

    //maps ad unit
    var publisherID = 'ca-pub-8699795274467882';
    var adsManagerOptions = {
        maxAdsOnMap : 2,
        style: 'adunit',
	channel: '7936863932',
	//minZoomLevel: '10' 
    };
    adsManager = new GAdsManager(map, publisherID, adsManagerOptions);
    adsManager.enable();

    // :::::::::::::::::::::::: //
    // ::: 基本設定スタート ::: //
    var point = new GLatLng(35.69834806679821,137.296142578125);  // 地図中心座標
    map.setCenter(point, 8);      // ズームレベル設定
    // ::: 基本設定エンド ::: //
    // :::::::::::::::::::::: //
    map.addMapType(G_PHYSICAL_MAP);
    map.addControl(new GLargeMapControl());
    var mapControl = new GHierarchicalMapTypeControl();
    mapControl.clearRelationships();
    mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "地名を表示", true);
    map.addControl(mapControl);
    map.addControl(new GScaleControl());
    //    map.addControl(new GOverviewMapControl());
    map.enableDoubleClickZoom();
    map.enableScrollWheelZoom();

    GEvent.addListener(map, "infowindowopen", function(){ flag_win_open = true; });    // 吹き出しON時
    GEvent.addListener(map, "infowindowclose", function(){ flag_win_open= false; });  // 吹き出しOFF時

    // スクロールがし終わり、且つ吹き出しOFF時にマーカー更新
    GEvent.addListener(map, "moveend", function() {
      if(!flag_win_open){
//        map.clearOverlays();
        MapSelect();
      }
    });
    MapSelect();
  }
}

// 地図上の情報を取得
function MapSelect(){
  map.clearOverlays();

  // 表示領域情報を取得し、Ajax
  var bounds = map.getBounds();
  var category2 = '';
  $("input:checkbox[@name^='category2']").each(function(){
    if ($(this).attr('checked') == true && $(this).val() != 'on'){
      category2 += $(this).val() + ',';
    }
  });
  category2 = category2.substring(0, (category2.length - 1));
  //http://enjoy-live.net/hall_select.php?minX=139.71013069152832&minY=35.6661526098011&maxX=139.77270126342773&maxY=35.69543436818453
  var url = "/api/mapinfoArea?minx=" + bounds.getSouthWest().lng() + "&miny=" + bounds.getSouthWest().lat()
    + "&maxx=" + bounds.getNorthEast().lng() + "&maxy=" + bounds.getNorthEast().lat()
    + "&category2=" + category2;
  var request = GXmlHttp.create();
  request.open("GET",url,true);

  // コールバック関数
  request.onreadystatechange = function() {
    if ((request.readyState == 4) && (request.status == 200)) {
      var res = request.responseXML;

      // XMLのmarkerタグ要素の配列markersを作る
      var flag_res_error = res.getElementsByTagName("error")[0].getAttribute("flag");
      var markers = res.getElementsByTagName("marker");

      //条件分岐(3)
      if(flag_res_error == "zero"){
      }else if(flag_res_error == "over"){
      }else{  //no error
        for (var i = 0; i < markers.length; i++) {
          if (markers[i].getAttribute("longitude") == 0) continue;
          addMarker(new GLatLng(parseFloat(markers[i].getAttribute("longitude")),
                                parseFloat(markers[i].getAttribute("latitude"))),
                                markers[i].getAttribute("wayname"),
                                markers[i].getAttribute("title"),
                                markers[i].getAttribute("description"),
                                i,
                                markers[i].getAttribute("c1"),
                                markers[i].getAttribute("c2"),
                                markers[i].getAttribute("id")
          );
          if (markers[i].getAttribute("longitude2") == 0) continue;
          addLine(new GLatLng(parseFloat(markers[i].getAttribute("longitude")),
                              parseFloat(markers[i].getAttribute("latitude"))),
                  new GLatLng(parseFloat(markers[i].getAttribute("longitude2")),
                              parseFloat(markers[i].getAttribute("latitude2"))),
                  markers[i].getAttribute("c2")
          );
        }
      }
    }
  }
  request.send(null); // 送信

  //固定アイコン
  addFixIcon(new GLatLng(35.72912297561569, 139.70317840576172),
      "http://roadway.yahoo.co.jp/images/highway/shuto_600x450.jpg",
      "首都高");
  addFixIcon(new GLatLng(34.915890386349176, 136.81411743164062),
      "http://roadway.yahoo.co.jp/images/highway/chubu_600x450.jpg",
      "中部");
  addFixIcon(new GLatLng(34.601111029107905, 135.11260986328125),
      "http://roadway.yahoo.co.jp/images/highway/hanshin_600x450.jpg",
      "阪神高速");
}

// アイコン表示
function addMarker(p,wayname,name,description,index,c1,c2,id){
  var image;
  var marker;
  var message;

  if (c2){
    image = "/images/mapicon_" + c2 + ".png";
    var icon = new GIcon(G_DEFAULT_ICON);
    icon.image = image;
    icon.iconSize = new GSize(32,32);
    icon.iconAnchor = new GPoint(17,43);
    var markeropts = new Object();
    markeropts.icon = icon;
    marker = new GMarker(p,markeropts);
    message = '<img src="'+ image +'" />　';
  } else {
    marker = new GMarker(p);
  }

  message += '<b>' + wayname + '<br />' + name + '</b><br /><br /><font size="-1">' + description + '</font>';
  var window_msg = function(){ marker.openInfoWindowHtml(message); }
  GEvent.addListener(marker,"click",window_msg);
  var marker_link = document.getElementById('link_marker' + index);
  if(marker_link){ marker_link.onmousedown = window_msg; }
  map.addOverlay(marker);
}
//ライン表示
function addLine(p1,p2,c2){
  var points = [];
  points[0] = p1;
  points[1] = p2;
  var linecolor = "";
  if (c2 == 2){
    linecolor = "#ffb32f"
  } else if (c2 == 3 || c2 == 5){
    linecolor = "#4e4efe"
  } else {
    linecolor = "#ff2b2b"
  }
  var polyline = new GPolyline(points, linecolor, 8, 0.8);
  map.addOverlay(polyline);
//  directions = new GDirections(map);
//  directions.loadFromWaypoints(points);
}
//固定アイコン
function addFixIcon(point,url,name){
  var icon = new GIcon();
  icon.image = url;
  icon.iconSize = new GSize(40, 40);
  icon.iconAnchor = new GPoint(0, 0);

  var markeropts = new Object();
  markeropts.icon = icon;

  var marker = new GMarker(point, markeropts);
  GEvent.addListener(marker, 'click', function() {
    var html="<h4>" + name + "</h4>"
      +"<center>"
      +"<img src='" + url + "'>"
      +"</center>"
      +"<img src='http://i.yimg.jp/images/roadway/color_sample.gif'>"
      ;
    $.nyroModalManual({
      content: html
    });
  });
  map.addOverlay(marker);
}
// 移動ボタン
function MapSearch(){
  geocoder = new GClientGeocoder();
  if(geocoder && $("#query").val()){
    geocoder.getLatLng($("#query").val(),
      function(point) {
        if (!point) {
          alert("移動できませんでした。");
        } else {
          map.setCenter(point, 10);
        }
      }
    );
  }
}
///////////////////////////////////////////////////////////////////////

function resizeApp() {
  var offsetTop = 85;
  var mapElem = e("map");
  for (var elem = mapElem; elem != null; elem = elem.offsetParent) {
    offsetTop += elem.offsetTop;
  }
  var height = getWindowHeight() - offsetTop;
  if (height >= 0) {mapElem.style.height = height + "px"}
  var width = getWindowWidth();
  var agt=navigator.userAgent.toLowerCase();
  if ((agt.indexOf('gecko') != -1)||(agt.indexOf('opera') != -1)||(agt.indexOf('safari') != -1)) width -=18;
  if (width >= 0) {mapElem.style.width = width + "px"}
}
function e(elemId){return document.getElementById(elemId)}
function getWindowHeight(){
  if (window.self && self.innerHeight) {return self.innerHeight}
  if (document.documentElement && document.documentElement.clientHeight) {
    return document.documentElement.clientHeight;
  }
  return 0;
}
function getWindowWidth(){
  if (window.self && self.innerWidth) {return self.innerWidth}
  if (document.documentElement && document.documentElement.clientWidth) {
    return document.documentElement.clientWidth;
  }
  return 0;
}
