/**
 * @author mtanaka
 */

// リクエスト例
// http://meisho-lab.net/cgi-bin/YahooLocalSearchWrapper.cgi?lat=35.0034&lon=135.7496&dist=1000&category=landmark&n=100

var YahooLocalSearchRequest = Class.create();

YahooLocalSearchRequest.prototype = {

	idPrefix: 'localsearch_',
	handler: null, // Googleマップのハンドラ
	numResultSize: 10, // 一度の検索で取得する件数             
	numDone: 0, // すでにリクエストした件数
	finished: false, // 検索結果を全て取得済みかどうか
	word: null, //空白で区切られた検索単語列・未エンコード
	bCompleted: false, // リクエストが完了ならtrue
	keywordManager: null,
	
	/**
	 * コンストラクタ
	 * @param {Object} params
	 *  params.word キーワード
	 *  params.lat 検索範囲中心の緯度
	 *  params.lng 検索範囲中心の経度
	 *  params.dist 中心からの検索範囲
	 */
	initialize: function(params){
	
		if(params.word != undefined) this.word = params.word.strip().stripTags(); //空白，タグの除去
		if (this.word == "") 
			return;
		
		this.handler = params.handler;
		
		this.serviceURL = 'http://' + host + '/cgi-bin/YahooLocalSearchWrapper.cgi';
		this.keywordManager = params.keywordManager;

		this.params = {};
		this.params.lat = params.lat;
		this.params.lon = params.lng;
		this.params.dist = params.dist;

		if(this.word != undefined) this.params.p = this.generateQueryString(this.word);
		else this.params.p = undefined;
		
		// toQueryString のエンコードを避ける
		if (this.params.p != undefined) {
			var strParams = 'p=' + this.params.p +
			'&lat=' + this.params.lat +
			'&lon=' + this.params.lon +
			'&datum=wgs' +
			'&dist=' + this.params.dist;
		} else {
			var strParams = 
			'&lat=' + this.params.lat +
			'&lon=' + this.params.lon +
			'&datum=wgs' +
			'&dist=' + this.params.dist;
		}

		// リクエスト発行
		var req = new Ajax.Request(this.serviceURL + "?" + strParams, 
				{	
					method: 'get', 
					onFailure    : function(httpObj) {},
					onSuccess : function(httpObj) {},
					onComplete: function (httpObj) {
						// サブクラスでオーバーライド
						this.complete(httpObj);
					}.bindAsEventListener(this, false)
				});
		
		this.bCompleted = false;
		this.numDone += this.numResultSize;
	},
	
	// 検索結果を追加
	complete: function(httpObj){
	
		var result = httpObj.responseXML;
		var titles = result.getElementsByTagName("Title");
		var addresses = result.getElementsByTagName("Address");
		var lats = result.getElementsByTagName("Lat");
		var lngs = result.getElementsByTagName("Lon");
	
		var infos = new Array();
		for (var i = 0; i < titles.length; i++) {

			var name = titles[i].firstChild.nodeValue;
			var address = addresses[i].firstChild.nodeValue;
			var desc = "";

			var lng = lngs[i*2+1].firstChild.nodeValue;
			var lat = lats[i*2+1].firstChild.nodeValue;
			var id = this.idPrefix + MD5_hexhash(name + address);
	
			var info = new GeoInfo(id, new GLatLng(lat, lng), name, address, desc);
			infos.push(info);
		}

		this.keywordManager.notifyKeywordRequestFinished(infos);
	},
	
	// クエリ文字列を生成 (UTF8をURLエンコード)
	generateQueryString: function(query){
		result = utf.URLencode(query);
		return result;
	
	}
}

/**
 * 逆ジオコーディング
 * @param {GLatLng} info
 * @return 住所の文字列．見つからなかったら "Unknown"
 */
function YahooReverseGeocoding(point) {
			
	var requestUrl = 
		"http://" + host + "/cgi-bin/YahooLocalSearchWrapper.cgi?"
		+ "lat=" + point.lat()
		+ "&lon=" + point.lng()
		+ "&datum=wgs"
		+ "&dist=5"
		+ "&category=address";
		
    xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", requestUrl, false);
    xmlHttp.send(null);
	
	var result = xmlHttp.responseXML;
	var addresses = result.getElementsByTagName("Address");
	if(addresses.length > 0) {
		return addresses[0].firstChild.nodeValue;
	}
	return "Unknown";
}



