if (typeof(KUSA) == 'undefined' ) {
 var KUSA = {
  "map": new GMap2(document.getElementById("map")),
  "geocoder": new GClientGeocoder(),
  "toggle": true,
  "grData": undefined,
  "bcData": undefined,
  "grIcon": new GIcon(),
  "bcIcon": new GIcon(),
  "stIcon": new GIcon(),
  "foodIcon": new GIcon(),
  "grItem": [],
  "bcItem": [],
  "grMarker": [],
  "bcMarker": [],
  "grHtml": [],
  "bcHtml": [],
  "preMarker": undefined,
  "stationMarkers": [],
  "foodMarkers": []
 };
}

KUSA.init = function() {
 KUSA.setupIcon();
 KUSA.map.setCenter(new GLatLng(35.69690522138987, 139.73854064941406), 11);
 KUSA.map.addControl(new GLargeMapControl());
 KUSA.map.addControl(new GMapTypeControl());
 GEvent.addListener(KUSA.map, "click", function(overlay, point) {
  if (!$("register_check").checked) {
   return;
  }
  if (KUSA.preMarker && !overlay) {
   KUSA.map.removeOverlay(KUSA.preMarker);
  }
  if (point) {
   var str = [
    '<div id="info">球場・グランド名を入力して登録<br/><input type="text" id="g"/>',
    '<input type="button" value="登録" onClick="KUSA.groundAdd(',
    point.x,
    ', ',
    point.y,
    ')"/><br/><br/>',
    'バッティングセンターを登録<br/><input type="text" id="b"/>',
    '<input type="button" value="登録" onclick="KUSA.bcAdd(',
    point.x,
    ', ',
    point.y,
    ')"/></div>'
   ].join('');
   var marker = new GMarker(point);
   GEvent.addListener(marker, "click", function() {
    KUSA.map.closeInfoWindow();
    KUSA.map.removeOverlay(marker);
   });
   KUSA.map.addOverlay(marker);
   marker.openInfoWindowHtml(str);
   KUSA.preMarker = marker;
  }
 });
 KUSA.readData();
 if (location.href.match(/\?q=(.+)/)) {
  var q = decodeURIComponent(RegExp.$1);
  setTimeout(function(){
   document.forms[0].q.value = q;
   KUSA.search(q);
  }, 1000);
 } else {
  setTimeout(function(){KUSA.listToggle();}, 1000);
 }
}

// register ground information
KUSA.groundAdd = function(x, y) {
 if ($F('g') != "") {
  var g = $F('g');
  var ajax = new Ajax.Request("regist.cgi?y="+y+"&x="+x+"&g="+encodeURI(g),{method:'get',onComplete:KUSA.showResponse});
 }
}

// register batting center information
KUSA.bcAdd = function(x, y) {
 if ($F('b') != "") {
  var b = $F('b');
  var ajax = new Ajax.Request("bRegist.cgi?y="+y+"&x="+x+"&b="+encodeURI(b),{method:'get',onComplete:KUSA.showResponse});
 }
}

KUSA.showResponse = function(req) {
 $("info").innerHTML = req.responseText;
 KUSA.readData();
}

KUSA.setupIcon = function() {
 KUSA.grIcon.image = 'http://map.fkoji.com/kusayakyu/img/greenpin.gif';
 KUSA.grIcon.iconSize = new GSize(24, 18);
 KUSA.grIcon.iconAnchor = new GPoint(0, 18);
 KUSA.grIcon.infoWindowAnchor = new GPoint(18, 4);

 KUSA.bcIcon.image = 'http://map.fkoji.com/kusayakyu/img/bcenter.gif';
 KUSA.bcIcon.iconSize = new GSize(23, 21);
 KUSA.bcIcon.iconAnchor = new GPoint(0, 21);
 KUSA.bcIcon.infoWindowAnchor = new GPoint(18, 4);

 KUSA.stIcon.image = 'http://map.fkoji.com/kusayakyu/img/station.gif';
 KUSA.stIcon.iconSize = new GSize(27, 26);
 KUSA.stIcon.iconAnchor = new GPoint(27, 26);
 KUSA.stIcon.infoWindowAnchor = new GPoint(7, 7);

 KUSA.foodIcon.image = 'http://map.fkoji.com/kusayakyu/img/restaurant.gif';
 KUSA.foodIcon.iconSize = new GSize(14, 25);
 KUSA.foodIcon.iconAnchor = new GPoint(7, 25);
 KUSA.foodIcon.infoWindowAnchor = new GPoint(7, 4);
}

KUSA.listToggle = function () {
 if (KUSA.toggle) {
  // 400px -> 1px(0.25%)
  $('bc-list').style.display = 'none';
  new Effect.Scale('gr-list', 0.25, {"duration":1.2, "scaleX":false});
 } else {
  // 1px ->400px(40000%)
  new Effect.Scale('gr-list', 40000, {"duration":1.2, "scaleX":false, "afterFinish": function() {
   $('bc-list').style.display = 'block';
  }});
 }
 KUSA.toggle = !KUSA.toggle;
}

KUSA.readData = function() {
 KUSA.map.clearOverlays();
 var grAjax = new Ajax.Request("data.xml", {method:'get', onComplete:KUSA.putMarkerG});
 var bcAjax = new Ajax.Request("bdata.xml", {method:'get', onComplete:KUSA.putMarkerB});
}

KUSA.putMarkerG = function(r) {
 var m = r.responseXML.getElementsByTagName("marker");
 for (var i = m.length - 1; i >= 0; i--) {
  var item = document.createElement("div");
  item.className = 'data-list';
  item.id = 'gr_' + i;
  //item.setAttribute("onclick", "KUSA.showGroundInfo(" + i + ")");
  item.appendChild(document.createTextNode(m[i].getAttribute("n")));
  item.title = m[i].getAttribute("n");
  KUSA.grItem[i] = item;
  KUSA.createMarker(
   m[i].getAttribute("x"),
   m[i].getAttribute("y"),
   m[i].getAttribute("n"),
   i,
   "ground"
  );
 }
 KUSA.putMarker("ground");
}

KUSA.putMarkerB = function(r) {
 var m = r.responseXML.getElementsByTagName("marker");
 for (var i = m.length - 1; i >= 0; i--) {
  var item = document.createElement("div");
  item.className = 'data-list';
  item.id = 'bc_' + i;
  //item.setAttribute("onclick", "KUSA.showBcInfo(" + i + ")");
  item.appendChild(document.createTextNode(m[i].getAttribute("n")));
  item.title = m[i].getAttribute("n");
  KUSA.bcItem[i] = item;
  KUSA.createMarker(
   m[i].getAttribute("x"),
   m[i].getAttribute("y"),
   m[i].getAttribute("n"),
   i,
   "bc"
  );
 }
 KUSA.putMarker("bc");
}

KUSA.showGroundInfo = function(i) {
 KUSA.map.panTo(KUSA.grMarker[i].getPoint());
 KUSA.grMarker[i].openInfoWindowHtml(KUSA.grHtml[i]);
}

KUSA.showBcInfo = function(i) {
 KUSA.map.panTo(KUSA.bcMarker[i].getPoint());
 KUSA.bcMarker[i].openInfoWindowHtml(KUSA.bcHtml[i]);
}

KUSA.createMarker = function(x, y, n, i, dn) {
 function sanitize(str) {
  return str.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
 }
 function convertWorld2Japan(p, flag) {
  var p1 = Math.floor(p);
  p = (p - p1) * 60;
  var p2 = Math.floor(p);
  p = (p - p2) * 60;
  var p3 = my_round(p);
  if (flag == "x") {
   p3 += 12;
   if (p3 >= 60) {
    p3 = p3 - 60;
    p2 = p2 + 1;
   }
   if (p2 >= 60) {
    p2 = p2 - 60;
    p1 = p1 + 1;
   }
  }
  else if (flag == "y") {
   p3 -= 12;
   if (p3 < 0) {
    p3 = 60 + p3;
    p2 = p2 - 1;
   }
   if (p2 < 0) {
    p2 = 60 + p2
    p1 = p1 - 1;
   }
  }
  return p1 + "." + p2 + "." + p3;
 }
 function my_round(x) {
  return Math.round(x * 1000) / 1000;
 }
 var icon;
 if (dn == "ground") {
  icon = KUSA.grIcon;
 }
 else if (dn == "bc") {
  icon = KUSA.bcIcon;
 }
 var marker = new GMarker(new GPoint(x, y), icon);
 var html = '<div class="info">'
          + '<p><b>' + sanitize(n) + '</b></p>'
          + '<p><a href="http://map.yahoo.co.jp/pl?sc=3&lat='
          + convertWorld2Japan(y, "y")
          + '&lon='
          + convertWorld2Japan(x, "x")
          + '" target="_blank">Yahoo!地図情報</a></p>'
          + '<p><input type="button" value="最寄り駅" onclick="KUSA.showStation(' + x + ', ' + y + ');KUSA.map.closeInfoWindow();"/>'
          + '<input type="button" value="近くの飲食店" onclick="KUSA.showFoodShop(' + x + ', ' + y + ');KUSA.map.closeInfoWindow();"/>'
          + '<input type="button" value="ズームイン" onclick="KUSA.map.setZoom(17);" /></p>'
          + '</div>';
 GEvent.addListener(marker, "click", function() {
  //var url = '/lib/getInvgeocoder.php?x=' + x + '&y=' + y;
  //var ajax = new Ajax.Request(url, {method:'get', onComplete:showWeatherInfo});
  marker.openInfoWindowHtml(html);
 });
 if (dn == "ground") {
  KUSA.grMarker[i] = marker;
  KUSA.grHtml[i] = html;
 }
 else if (dn == "bc") {
  KUSA.bcMarker[i] = marker;
  KUSA.bcHtml[i] = html;
 }
}

KUSA.putMarker = function(dataName) {
 if (dataName == "ground") {
  KUSA.addData("", $("gr-list"), KUSA.grItem);
  for (var i = 0; i < KUSA.grMarker.length; i++) {
   KUSA.map.addOverlay(KUSA.grMarker[i]);
  }
 } else {
  KUSA.addData("", $("bc-list"), KUSA.bcItem);
  for (var i = 0; i < KUSA.bcMarker.length; i++) {
   KUSA.map.addOverlay(KUSA.bcMarker[i]);
  }
 }
}

KUSA.addData = function(q, list, item) {
 var re = new RegExp(q, "i");
 while (list.firstChild) {
  list.removeChild(list.firstChild);
 }
 var marker = (list.id == "gr-list") ? KUSA.grMarker : KUSA.bcMarker;
 for (var i = item.length - 1; i >= 0; i--) {
  if (q == "" || item[i].title.match(re)) {
   list.appendChild(item[i]);
  }
 }
 if (!KUSA.toggle) {
  KUSA.listToggle();
 }
}

KUSA.search = function(q) {
 KUSA.addData(q, $("gr-list"), KUSA.grItem);
 KUSA.addData(q, $("bc-list"), KUSA.bcItem);
}

KUSA.resetList = function() {
 KUSA.search("");
}

KUSA.xmlToJson = function(url, callback) {
 KUSA.appendScript('http://api.fkoji.com/xml_to_json.php?url=' + encodeURIComponent(url) + '&callback=' + callback);
}

KUSA.appendScript = function(url) {
 var script = document.createElement("script");
 script.src = url;
 script.type = 'text/javascript';
 script.charset = 'UTF-8';
 document.lastChild.appendChild(script);
}

// station api JSONP callback function
KUSA.putStation = function(json) {
 for (var i = 0; i < KUSA.stationMarkers.length; i++) {
  KUSA.map.removeOverlay(KUSA.stationMarkers[i]);
 }
 KUSA.stationMarkers = [];
 for (var i = 0; i < json.length; i++) {
  KUSA.searchStation(json[i].name, json[i].line, json[i].distance, json[i].traveltime);
 }
}

KUSA.searchStation = function(name, line, dist, time) {
 KUSA.geocoder.getLatLng(name, function(point) {
  if (point) {
   var marker = new GMarker(point, KUSA.stIcon);
   KUSA.map.addOverlay(marker);
   GEvent.addListener(marker, "click", function() {
    var html = '<p>' + line + ' ' + name + '</p><p>グランドからの直線距離: ' + dist + 'm (' + time + ')</p><form method="get" action="http://transit.yahoo.co.jp/" name="f_yahoo" target="_blank" onsubmit="return false;" accept-charset="euc-jp"><input type="button" value="この駅を到着駅にして路線検索(by Yahoo!)" onclick="org=document.charset;document.charset=\'euc-jp\';document.f_yahoo.submit();document.charset=org;"/><input type="hidden" name="val_to" value="'+name+'"/></form>';
    marker.openInfoWindowHtml(html);
   });
   KUSA.stationMarkers.push(marker);
  }
 });
}

// called by input button
KUSA.showStation = function(x, y) {
 KUSA.map.setZoom(13);
 var url = 'http://map.simpleapi.net/stationapi?x='+x+'&y='+y+'&output=jsonp&callback=KUSA.putStation';
 KUSA.appendScript(url);
}

KUSA.showFoodShop = function(x, y) {
 KUSA.map.setZoom(14);
 var tabelog = [
  'http://api.tabelog.com/Ver1/RestaurantSearch/?',
  'ResultSet=large',
  'SearchRange=large',
  'Latitude=' + y,
  'Longitude=' + x
 ].join('&');
 var url = 'http://api.fkoji.com/xml_to_json.php?url=' + encodeURIComponent(tabelog) + '&callback=KUSA.putTabelog';
 KUSA.appendScript(url);
}

KUSA.putTabelog = function(json) {
 json = eval(json);
 for (var i = 0; i < KUSA.foodMarkers.length; i++) {
  KUSA.map.removeOverlay(KUSA.foodMarkers[i].marker);
 }
 KUSA.foodMarkers = [];
 if (!json.Item) {
  alert("検索結果は0件です。");
  return;
 }
 var items = [];
 if (!json.Item.length) {
  items[0] = json.Item;
 } else {
  items = json.Item;
 }
 for (var i = 0; i < items.length; i++) {
  var lat = items[i].Latitude;
  var lang = items[i].Longitude;
  var name = items[i].RestaurantName;
  var url = items[i].TabelogUrl;
  var category = items[i].Category;
  var totalScore = items[i].TotalScore;
  var tel = items[i].Tel;
  var hours  = items[i].BusinessHours;
  var holiday = items[i].Holiday;
  var html = '<p><a href="' + url + '" target="_blank">' + name + '</a> (総合評価: ' + totalScore + ')</p><p>' + category + '</p><p>TEL: ' + tel + '</p><p>' + hours + '</p><p>定休日: ' + holiday + '</p>';
  var marker = KUSA.createFoodShopMarker(lang, lat, html);
  KUSA.map.addOverlay(marker);
  KUSA.foodMarkers.push({marker: marker, html: html});
 }
}

KUSA.createFoodShopMarker = function(x, y, i) {
 var marker = new GMarker(new GPoint(x, y), KUSA.foodIcon);
 GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(i);
 });
 return marker;
}

KUSA.clickObserver = function(event) {
 event = event || window.event;
 var target = event.target || event.srcElement;
 if (target.id.match(/^gr_([0-9]+)$/)) {
  KUSA.showGroundInfo(RegExp.$1);
 }
 else if (target.id.match(/^bc_([0-9]+)$/)) {
  KUSA.showBcInfo(RegExp.$1);
 }
}

Event.observe($("list-header"), "click", KUSA.listToggle);
Event.observe($("list-footer"), "click", KUSA.listToggle);
Event.observe($("gr-tab"), "click", function() {
 $("gr-list").style.zIndex = '100';
 $("bc-list").style.zIndex = '50';
 if (!KUSA.toggle) {
  KUSA.listToggle();
 }
});
Event.observe($("bc-tab"), "click", function() {
 $("gr-list").style.zIndex = '50';
 $("bc-list").style.zIndex = '100';
 if (!KUSA.toggle) {
  KUSA.listToggle();
 }
});
Event.observe(window, "load", KUSA.init);
Event.observe(document.getElementsByTagName("html")[0], "click", KUSA.clickObserver);