/* ------------------------------------------------------------+/
/+ 拡張機能
/+ ------------------------------------------------------------*/
var $ = function(id) {
  return document.getElementById(id);
}

Function.prototype.applyTimeout = function(self, args, ms) {
  var func = this;
  return setTimeout(function () { func.apply(self, args) }, ms);
};

Function.prototype.applyInterval = function(self, args, ms) {
  var func = this;
  return setInterval(function () { func.apply(self, args) }, ms);
};

Function.prototype.applyEventWithDOM = function(element, type, args, ignoreEvent) {
  var self = this;
  var _chk = function(event, args, ignoreEvent){
    var ev = event || window.event;
    if (ignoreEvent != true)
      if (typeof args[0] !== typeof ev)
        args.unshift(ev)
      else if (typeof args[0] === typeof ev)
        args[0] = ev
    
    self.apply(self, args);
  }
  if (element.addEventListener)
    element.addEventListener(type, function(event){ _chk(event, args, ignoreEvent) }, false);
  else
    element.attachEvent('on'+type, function(event){ _chk(event, args, ignoreEvent) });
}

/* ------------------------------------------------------------+/
/+ ユーティリティ
/+ ------------------------------------------------------------*/

// Ajax
function ajaxRequest(uri, callback) {
  var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Msxml2.XMLHTTP') || new ActiveXObject('Microsoft.XMLHTTP');
  xmlhttp.open('GET', uri, true);
  xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4) {
      if (callback)
        callback(eval(xmlhttp.responseText));
      else
        eval(xmlhttp.responseText);
    }
  }
  xmlhttp.send(null);
}

// JS再生成
function reMakeJs(id, uri) {
  document.body.removeChild($(id));
  var jsElement = document.createElement('script');
  jsElement.id = id;
  jsElement.type = 'text/javascript';
  jsElement.src = uri;
  document.body.appendChild(jsElement);
}

// リストに要素追加
function addListElement(doc, id, uri, name) {
  var list = document.createElement('li');
  if (id)
    list.id = id;
  doc.appendChild(list);
  var anchor = document.createElement('a');
  if (uri)
    anchor.href = uri;
  anchor.innerHTML = name;
  list.appendChild(anchor);
}

// リストの要素削除
function clearListElements(doc) {
  for (var i=doc.childNodes.length-1;i>=0;i--)
    doc.removeChild(doc.childNodes[i]);
}

// リストの要素読込中
function loadingElements(doc) {
  clearListElements(doc);
  addListElement(doc, null, null, '<img src="/images/load.gif" /><br />Now loading...');
}

// マーカー作成
function createMarker(lat, lng, name, uri) {
  var marker = new GMarker(new GLatLng(lat, lng));
  marker.lat = lat;
  marker.lng = lng;
  marker.name = name;
  
  var p = document.createElement('p');
  p.innerHTML = '<a href="' + uri + '">' + name + '</a><br />';
  GEvent.addListener(marker, 'click', function() {
    map.openInfoWindow(new GLatLng(this.lat, this.lng),
      p
    );
  });
  return marker;
}

/* ------------------------------------------------------------+/
/+ メイン処理
/+ ------------------------------------------------------------*/
var SuggestURI = 'http://api.doko.jp/v1/getStation.do?key=36f94354b886467daf7293ca6b002ddf&format=json&callback=jsonDoko&pagesize=10&name=';
var RestaulantDokoURI = 'http://api.doko.jp/v1/searchPOI.do?key=36f94354b886467daf7293ca6b002ddf&format=json&pagenum=1&pagesize=5&order=2&callback=jsonRestaulantDoko';
var RestaulantHotURI  = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=6d5303ea09e2b4c1&range=4&datum=world&format=jsonp&callback=jsonRestaulantHot&count=5';
var RestaulantTabeURI = 'http://gourmet.sorauta.net/api/tabelog?';
var RestaulantGuruURI = 'http://gourmet.sorauta.net/api/gurunavi?';
var wordChecker = null;
var oldValue = null;

// 駅付近のデータ検索
function searchReastaulants(lat_tky, lon_tky, lat_jgd, lon_jgd) {
  var category = document.getElementById('category').value;

  // どこいく
  loadingElements($('restaulantDokoUl'));
  reMakeJs('jsonRestaulantDoko', RestaulantDokoURI + '&lat_jgd=' + lat_jgd + '&lon_jgd=' + lon_jgd);
  
  // ほとぺぱー
  loadingElements($('restaulantHotUl'));
  reMakeJs('jsonRestaulantHot', RestaulantHotURI + '&lat=' + lat_jgd + '&lng=' + lon_jgd);
  
  // たべろぐ
  loadingElements($('restaulantTabeUl'));
  ajaxRequest(RestaulantTabeURI + 'lat=' + lat_jgd + '&lon=' + lon_jgd + "&category=" + category);
  
  // ぐるなび
  loadingElements($('restaulantGuruUl'));
  ajaxRequest(RestaulantGuruURI + 'lat=' + lat_jgd + '&lon=' + lon_jgd + "&category=" + category);
}

// サジェスト駅名一覧
function jsonDoko(data) {
  var stationList = $('stationList');
  var landmarks = data.results.landmark;
  
  clearListElements(stationList);
  for (var i in landmarks) {
    addListElement(
      stationList,
      landmarks[i].lat_tky + ':::' + landmarks[i].lon_tky + ':::' + landmarks[i].lat_jgd + ':::' + landmarks[i].lon_jgd,
      'javascript:changeList('+landmarks[i].lat_tky+', '+landmarks[i].lon_tky+', '+landmarks[i].lat_jgd+', '+landmarks[i].lon_jgd+')',
      landmarks[i].name
    );
  }
}

// 駅付近のテンポ一覧(ドコイク)
function jsonRestaulantDoko(data) {
  var restaulantDokoUl = $('restaulantDokoUl');
  var restaulants = data.results.poi;
  
  clearListElements(restaulantDokoUl);
  for (var i in restaulants)
    addListElement(restaulantDokoUl, null, '/jump?uri='+restaulants[i].dokopcurl, restaulants[i].name);
}

// 駅付近のテンポ一覧(ほっとペッパー)
function jsonRestaulantHot(data) {
  var restaulantHotUl = $('restaulantHotUl');
  var restaulants = data.results.shop;
  var markers = [];
  
  clearListElements(restaulantHotUl);
  for (var i in restaulants) {
    // リストの要素追加
    addListElement(
      restaulantHotUl,
      null,
      'javascript:changeCenter('+restaulants[i].lat+', '+restaulants[i].lng+', "'+restaulants[i].name+'", "/jump?uri='+restaulants[i].urls.pc+'")',
      restaulants[i].name
    );
    
    // マーカー作成
    markers[markers.length] = createMarker(restaulants[i].lat, restaulants[i].lng, restaulants[i].name, '/jump?uri='+restaulants[i].urls.pc);
  }
  mapAddMarkers(markers);
}

// 駅付近のテンポ一覧(食べログ)
function jsonRestaulantTabe(data) {
  var restaulantTabeUl = $('restaulantTabeUl');
  var restaulants = data.rest;
  var markers = [];
  
  clearListElements(restaulantTabeUl);
  for (var i in restaulants) {
    // リストの要素追加
    addListElement(
      restaulantTabeUl,
      null,
      'javascript:changeCenter('+restaulants[i].latitude+', '+restaulants[i].longitude+', "'+restaulants[i].name+'", "/jump?uri='+restaulants[i].url+'")',
      restaulants[i].name
    );
    
    // マーカー作成
    markers[markers.length] = createMarker(restaulants[i].latitude, restaulants[i].longitude, restaulants[i].name, restaulants[i].url);
  }
  mapAddMarkers(markers);
}

// 駅付近のテンポ一覧(ぐるなび)
function jsonRestaulantGuru(data) {
  var restaulantGuruUl = $('restaulantGuruUl');
  var restaulants = data.rest;
  var markers = [];
  
  clearListElements(restaulantGuruUl);
  for (var i in restaulants) {
    // リストの要素追加
    addListElement(
      restaulantGuruUl,
      null,
      'javascript:changeCenter('+restaulants[i].latitude+', '+restaulants[i].longitude+', "'+restaulants[i].name+'", "/jump?uri='+restaulants[i].url+'")',
      restaulants[i].name
    );
    
    // マーカー作成
    markers[markers.length] = createMarker(restaulants[i].latitude, restaulants[i].longitude, restaulants[i].name, '/jump?uri='+restaulants[i].url);
  }
  mapAddMarkers(markers);
}

window.onload = function() {
  // サジェスト用
  wordChecker = setInterval(function(){
    if ($('suggestName').value && $('suggestName').value != oldValue)
      reMakeJs('jsonDoko', SuggestURI + encodeURIComponent($('suggestName').value));
    
    oldValue = $('suggestName').value;
  }, 1000);
}

window.onunload = function() {
  GUnload();
}

