/*@cc_on _d = document; eval("var document = _d"); @*/
$(function() {

var maps;
var sight;
var route;
var course;
var toilet;

var lng_area  = { left: 135.7646656036377, right: 135.79564640808105};
var rect_area = [
  { area: 1, color: '#FF0000', top: 35.010736668115754, bottom: 34.996886561767674, left: lng_area.left, right: lng_area.right}, // 三条-八坂
  { area: 2, color: '#00FF00', top: 34.9978709106735,   bottom: 34.98619858298793,  left: lng_area.left, right: lng_area.right}, // 八坂-七条
  { area: 3, color: '#0000FF', top: 34.98700858298793,  bottom: 34.971711331934856, left: lng_area.left, right: lng_area.right}  // 七条以南
];

var elements = {
  maps  : $("#maps"),
  sight : $("#maps_menu dl.sight"),
  route : $("#maps_menu dl.route"),
  course: $("#maps_menu dl.course"),
  toilet: $("#maps_menu dl.toilet"),
  search: $("#maps_menu dl.sight form"),
  loader: $("div.loader"),
  area1 : $("#maps_menu dl.area1"),
  area2 : $("#maps_menu dl.area2"),
  area3 : $("#maps_menu dl.area3")
};
elements.loader.css("opacity", 0.75);

google.load("maps", "2.93", { callback: function() {
  maps = new google.maps.Map2(elements.maps.get(0));
  maps.setCenter(new google.maps.LatLng(34.993170002733384, 135.77637344598770), 14);
  maps.enableContinuousZoom();
  maps.addControl(new google.maps.LargeMapControl());
  maps.addControl(new google.maps.MenuMapTypeControl());
//  maps.addControl(new google.maps.OverviewMapControl());
  maps.addControl(new google.maps.ScaleControl());

  // エリア枠描画
  $.each(rect_area, function(index, rect) {
    var points = [
      new GLatLng(rect.top,    rect.left),
      new GLatLng(rect.bottom, rect.left),
      new GLatLng(rect.bottom, rect.right),
      new GLatLng(rect.top,    rect.right),
      new GLatLng(rect.top,    rect.left)
    ];

    var polygon = new GPolygon(
      points,     // 座標値
      rect.color, // 線の色
      0.5,        // 線の太さ
      1.0,        // 不透明度
      rect.color, // 塗りつぶす色
      0.1         // 塗りつぶす色の不透明度
    );
    maps.addOverlay(polygon);

    GEvent.addListener(polygon, 'click', function showClick() {
      elements['area' + rect.area].find("dt").trigger("click");
    });
  });

  $(window).unload(google.maps.Unload);

  elements.search.find("input:text").val("");

  // 施設情報初期化
  elements.loader.fadeIn(1000, function() {
    sight = new Sight(maps, "js/data.sight.100402.json");
    elements.loader.fadeOut(1000);
  });

}});

var loader = function(method) {
  elements.loader.fadeIn(1000, function() {
    (method)(function() {
      if (this.rect) {
        anchor_area(this, this.rect.area);
        redraw_area(this, this.rect.area);
      } else {
        anchor(this);
        redraw(this);
      }
      elements.loader.fadeOut(1000);
    });
  });
};
var anchor = function(target) {
  var element = elements[target.name.toLowerCase()];
  var anchors = target.getAnchors();
  element.find("ul.anchors li").remove();
  $.each(anchors, function(index, anchor) {
    var local_index = $.data(anchor.get(0), 'index');
    if (local_index) index = local_index;
    if (anchor.css("display") != "none")
      element.find("ul.anchors").append($("<li />").addClass("li" + (++index < 10 ? "0" + index : index)).append(anchor));
  });
  element.find("ul.anchors").css("height", element.find("ul.anchors").height() >= 260 ? 260 : "auto");
};
var redraw = function(target) {
  var element = elements[target.name.toLowerCase()];
  element.prevAll().andSelf().animate({ top: "0px" });
  element.nextAll().animate({ top: element.find("dd").height() + 20 });
  if (!element.hasClass("enabled")) {
    element.addClass("enabled").siblings().removeClass("enabled");
    //$.each([sight, route, course, toilet], function(index, value) {
    $.each([route, course, toilet], function(index, value) {
      if (value) value.hide();
    });
    target.show();
  }
  target.setCenter();
};

// エリア別用 ----------------------------
var anchor_area = function(target, area) {
  var element = elements['area' + area];
  var anchors = target.getAreaAnchors(area);
  element.find("ul.anchors li").remove();
  $.each(anchors, function(index, anchor) {
    if (anchor.css("display") != "none") {
      var markerindex = target.getAreaIndex(area, index) + 1;
      markerindex = (markerindex < 10 ? "0" : '') + markerindex;
      element.find("ul.anchors").append($("<li />").addClass("li" + markerindex).append(anchor));
      element.find("ul.anchors").find("li:last").css("background", 'url("image/icon_sight' + markerindex + '.gif") no-repeat');
    }
  });
  element.find("ul.anchors").css("height", element.find("ul.anchors").height() >= 280 ? 280 : "auto");
};
var redraw_area = function(target, area) {
  var element = elements['area' + area];
  element.prevAll().andSelf().animate({ top: "0px" });
  element.nextAll().animate({ top: element.find("dd").height() + 20 });
  if (!element.hasClass("enabled")) {
    element.addClass("enabled").siblings().removeClass("enabled");
    $.each([sight, route, course, toilet], function(index, value) {
      if (value) value.hide();
    });
    target.showArea(area);
  }
  target.setCenterArea(area);
};
// エリア別用 ----------------------------

elements.sight.find("dt").click(function() {
  if (elements.search.find("input:text").val()) {
    loader(function(callback) {
      sight.search(elements.search.find("input:text").val());
      (callback).apply(sight);
    });
  } else {
    redraw(sight);
  }
  return false;
});
elements.search.submit(function() {
  loader(function(callback) {
    sight.search(elements.search.find("input:text").val());
    (callback).apply(sight);
  });
  return false;
});
elements.area1.find("dt").click(function() {
  loader(function(callback) {
    sight.setMarker(rect_area[0], callback);
  });
  return false;
});
elements.area2.find("dt").click(function() {
  loader(function(callback) {
    sight.setMarker(rect_area[1], callback);
  });
  return false;
});
elements.area3.find("dt").click(function() {
  loader(function(callback) {
    sight.setMarker(rect_area[2], callback);
  });
  return false;
});

elements.route.find("dt").click(function() {
  route ? redraw(route) : (function() {
    loader(function(callback) {
      route = new Route(maps, "js/data.route.json", callback);
    });
  })();
  return false;
});

elements.course.find("dt").click(function() {
  course ? redraw(course) : (function() {
    loader(function(callback) {
      course = new Course(maps, "js/data.course.json", callback);
    });
  })();
  return false;
});

elements.toilet.find("dt").click(function() {
  toilet ? redraw(toilet) : (function() {
    loader(function(callback) {
      toilet = new Toilet(maps, "js/data.toilet.json", callback);
    });
  })();
  return false;
});

});