
var xml_http = null;


// 座標オブジェクト
function Point(_x, _y)
{
  Point.prototype.x = _x;
  Point.prototype.y = _y;
}

// 日本測地系（度）から世界測地系（度）に変換
// ＜参考資料＞
// 　http://groups.google.com/group/Google-Maps-API-Japan/browse_thread/thread/d0ce529ce20edc4d/285aac6e0d3497a1
function ChangeLocationJapanToGlobal(jx, jy)
{
  var wy = jy - jy * 0.00010695 + jx * 0.000017464 + 0.0046017;
  var wx = jx - jy * 0.000046038 - jx * 0.000083043 + 0.010040;

  return new Point(wx, wy);
}

// 世界測地系（度）から日本測地系（度）に変換
function ChangeLocationGlobalToJapan(wx, wy)
{
  var jy = wy * 1.000106961 - wx * 0.000017467 - 0.004602017;
  var jx = wx * 1.000083049 + wy * 0.000046047 - 0.010041046;

  return new Point(jx, jy);
}

// 検索実行
function search()
{
  var API_URL = "http://jws.jalan.net/APIAdvance/HotelSearch/V1/";
  var API_KEY = "cap10def157a21";
  
  // 値を取得
  var y_rad = parseFloat(document.frmSearch.y_rad.value);
  var y_min = parseFloat(document.frmSearch.y_min.value);
  var y_sec = parseFloat(document.frmSearch.y_sec.value);
  var y = y_rad + y_min / 60 + y_sec / 3600;
  var x_rad = parseFloat(document.frmSearch.x_rad.value);
  var x_min = parseFloat(document.frmSearch.x_min.value);
  var x_sec = parseFloat(document.frmSearch.x_sec.value);
  var x = x_rad + x_min / 60 + x_sec / 3600;
  var range = parseFloat(document.frmSearch.range.value);

  // 日本測地系に変換する
  var jPoint = ChangeLocationGlobalToJapan(x, y);
  var jx_ms = parseInt(jPoint.x * 3600 * 1000);
  var jy_ms = parseInt(jPoint.y * 3600 * 1000);

  // 検索URLの作成
  var query = API_URL + "?order=4&xml_ptn=1&pict_size=0&key=" + API_KEY
    + "&x=" + jx_ms + "&y=" + jy_ms + "&range=" + range;

  // 検索
  document.all.Results.innerHTML = "";
  try
    {
      xml_http = new ActiveXObject("Microsoft.XMLHTTP");
    }
  catch( ex )
    {
      try
        {
          xml_http = new XMLHttpRequest();
        }
      catch( ex2 )
        {
          xml_http = null;
        }
    }

  if( xml_http == null )
    {
      alert("XMLHttpオブジェクトが作成できないため、検索できません");
      return;
    }

  xml_http.OnReadyStateChange = SearchResult;
  xml_http.Open("GET", query, true);
  xml_http.Send();
}

// GoogleMapへリンク
function linkMap()
{
  var y_rad = parseFloat(document.frmSearch.y_rad.value);
  var y_min = parseFloat(document.frmSearch.y_min.value);
  var y_sec = parseFloat(document.frmSearch.y_sec.value);
  var y = y_rad + y_min / 60 + y_sec / 3600;
  var x_rad = parseFloat(document.frmSearch.x_rad.value);
  var x_min = parseFloat(document.frmSearch.x_min.value);
  var x_sec = parseFloat(document.frmSearch.x_sec.value);
  var x = x_rad + x_min / 60 + x_sec / 3600;

  document.frmLinkMap.q.value = "" + y + "," + x;
  document.frmLinkMap.submit();
}

// 宿泊施設の地図を表示
function viewMap(x, y)
{
  // 世界測地系に変換
  var wPoint = ChangeLocationJapanToGlobal(x / 1000 / 3600, y / 1000 / 3600);

  document.frmLinkMap.q.value = "" + wPoint.y + "," + wPoint.x;
  document.frmLinkMap.submit();
}

// 検索結果取得
function SearchResult()
{
  if( xml_http.readyState == 4 )
    {
      // 検索結果を表示
      var str_html = "";
      if( xml_http.Status == 200 )
        {
          var res_xml = xml_http.responseXML;

          if( res_xml != null )
            {
              try
                {
                  // 総件数
                  var res_count = res_xml.selectSingleNode("/Results/NumberOfResults").text;
                  var view_count = res_xml.selectSingleNode("/Results/DisplayPerPage").text;
                  str_html += "<div class=\"ResultsCount\">検索結果：" + res_count +
                    " 件<span class=\"view_count\">（うち " + view_count + "件 表示）</span></div>";
                  // 宿泊施設リスト
                  str_html += "<table class=\"HotelList\">";
                  str_html += "<tr><th>写真</th><th>ホテル名</th><th>住所</th><th>種別</th>";
                  str_html += "<th>参考料金</th><th>コメント</th><th>詳細</th><th>地図で確認</th></tr>";
                  var hotel_list = res_xml.selectNodes("/Results/Hotel");
                  for( var i = 0; i < hotel_list.length; i++ )
                    {
                      var hotel_node = hotel_list.item(i);
                      str_html += "<tr class=\"" + (i % 2 == 0 ? "ev" : "od") + "\">";
                      str_html += "<td><img src=\"" + hotel_node.selectSingleNode("PictureURL").text + "\" alt=\"" +
                        hotel_node.selectSingleNode("PictureCaption").text + "\" border=\"0\"></td>";
                      str_html += "<td>" + hotel_node.selectSingleNode("HotelName").text + "</td>";
                      str_html += "<td>" + hotel_node.selectSingleNode("HotelAddress").text + "</td>";
                      str_html += "<td>" + hotel_node.selectSingleNode("HotelType").text + "</td>";
                      str_html += "<td>" + hotel_node.selectSingleNode("SampleRateFrom").text + "</td>";
                      str_html += "<td>" + hotel_node.selectSingleNode("HotelCatchCopy").text + "</td>";
                      str_html += "<td><a href=\"" + hotel_node.selectSingleNode("HotelDetailURL").text
                        + "\" target=\"_blank\">詳細を見る</a></td>";
                      str_html += "<td><button onclick=\"javascript:viewMap(" +
                        hotel_node.selectSingleNode("X").text + "," +
                          hotel_node.selectSingleNode("Y").text + ");\">地図で確認</button></td>";
                      str_html += "</tr>";
                    }
                  str_html += "</table>";
                }
              catch( ex )
                {
                  str_html += "<div class=\"Error\">エラーが発生しました。　" + ex.description + "</div>";
                }
            }
          else
            {
              str_html += "<div class=\"Error\">エラーが発生しました。　responseXML is null</div>";
            }
        }
      else
        {
          str_html += "<div class=\"Error\">エラーが発生しました。　status code:" + xml_http.Status + "</div>";
        }
      document.all.Results.innerHTML = str_html;
      xml_http = null;
    }
}
