/**
 * @file geocoding.js
 * @brief GeocodingにアクセスするJavaScriptファイル
 *
 * @author kinokorori
 * @date 2008. 9. 11
 */

var geocodingManager = new function()
{
	this.forMsgTag = "searchResultMessage";
	this.ENDPOINT = "http://www.geocoding.jp/api/";
}

geocodingManager.search = function(geoname)
{
	var proxy = "http://hiyoshisv.blogdns.com/tabesta/cgi-bin/proxy.php";
	var pars = "q=" + encodeURIComponent(geoname);
	var proxy_pars = "proxy_url=" + encodeURIComponent(this.ENDPOINT + "?" + pars);
	
	//this.showXML(this.ENDPOINT + "?" + pars);

	var ajax = new Ajax.Request(proxy,
		{
			method: 'get',
			parameters: proxy_pars,
			onComplete: this.completeAjax,
			onSuccess: this.succeededAjax,
			onFailure: this.callFail
		});

}

geocodingManager.showXML = function(url)
{
	var win = window.open(url, "", "width=640,height=480,toolbar=1,resizable=1,scrollbars=1");
}

geocodingManager.completeAjax = function(req)
{
}

geocodingManager.succeededAjax = function(req)
{
	geocodingManager.succeededProcess(req);
}

geocodingManager.callFail = function(req)
{
	$(geocodingManager.forMsgTag).innerHTML = "地名検索に失敗しました。";
}

geocodingManager.succeededProcess = function(req)
{
	var xmlData = req.responseXML;
	if (!xmlData) { return; }
	
	var errorNodes = xmlData.getElementsByTagName("error");
	if (errorNodes.length != 0) {
		$(this.forMsgTag).innerHTML = "候補となる地名・駅名がありません。";
		return;
	}
	
	var choiceNodes = xmlData.getElementsByTagName("choices");
	if (choiceNodes.length != 0) {
		this.showCands(xmlData);
		return;
	}
	
	var latNodes = xmlData.getElementsByTagName("lat");
	var lngNodes = xmlData.getElementsByTagName("lng");

	var lat = parseFloat(latNodes[0].firstChild.nodeValue);
	var lng = parseFloat(lngNodes[0].firstChild.nodeValue);

	//0,0のときも失敗
	if (lat == 0 && lng == 0) {
		$(this.forMsgTag).innerHTML = "候補となる地名・駅名がありません。";
		return;
	}
	
	if (lat > 45.6 || lat < 24) {
		$(this.forMsgTag).innerHTML = "国外へはパスポートが必要です。";
		return;
	}
	if (lng > 145.83 || lng < 122.93) {
		$(this.forMsgTag).innerHTML = "国外逃亡はできません。";
		return;
	}
	
	if ((lng > 123.97 && lng < 129.68) && (lat > 35.12 && lat < 45.6)) {
		$(this.forMsgTag).innerHTML = "そこへはジャンプしません。";
		return;
	}

	$(this.forMsgTag).innerHTML = "該当する地名に移動しました。";

	this.moveToGeocode(lat, lng);
}

geocodingManager.moveToGeocode = function(lat, lon)
{
	mapCtrl.moveMap(lat, lon);
	tabelogManager.newSearch(lat, lon);
}

geocodingManager.showCands = function(xmlData)
{
	var str = "地名を詳述して再検索してください。<br />";
	var choiceNodes = xmlData.getElementsByTagName("choice");
	var endloop = (choiceNodes.length > 3) ? 3 : choiceNodes.length;
	for (var i = 0; i < endloop; ++i) {
		var temp = choiceNodes[i].firstChild.nodeValue;
		str += temp;
		str += "， ";
	}
	str += " ...など";
	$(this.forMsgTag).innerHTML = str;
}

