/**
 * @author mtanaka
 */

var RestaurantGeoInfoManager = Class.create();

RestaurantGeoInfoManager.prototype = {

	nRemainingRestaurantRequest: 0, // 未終了の検索リクエストの数
	arrayDestinations: new Array(), // 地点の配列 GeoInfo[]
	hashGeoInfo: new Hash(), // 地理情報のハッシュ．　id, GLatLng, name, address, desc．キーはid
	mapHandler: null, // Google mapsのハンドラ
	manager: null,  // GeoInfoManager
	tabId: "restaurant-table",
	
	infoWindowTextName: '<div class="infowindow_name"><a target="_blank" href="__GEOINFO_URL__">__GEOINFO_NAME__</a></div>',
	infoWindowTextAddDestination: '<div class="infowindow_operation" onClick="manager.addDestinationById(\'__GEOINFO_ID__\');"><img src="img/icon_add.gif"/>目的地に追加</div>',
	infoWindowTextSetStart: '<div class="infowindow_operation"  onClick="manager.setStart(\'__GEOINFO_ID__\')"><img src="img/icon_start.gif"/>出発地点に設定</div>',
	infoWindowTextSetEnd: '<div class="infowindow_operation"  onClick="manager.setEnd(\'__GEOINFO_ID__\')"><img src="img/icon_end.gif"/>到着地点に設定</div>',
	infoWindowTextSearchHotel: '<div class="infowindow_operation"  onClick="hotelManager.addHotelSearchResult(\'__GEOINFO_ID__\')"><img src="img/icon_hotel.png"/>付近のホテル</div>',
	infoWindowTextSearchRestaurant: '<div class="infowindow_operation"  onClick="restaurantManager.addRestaurantSearchResult(\'__GEOINFO_ID__\')"><img src="img/icon_restaurant.png"/>付近のレストラン</div>',
	infoWindowTextSearchArticle: '<div class="infowindow_operation"  onClick="articleManager.addArticleSearchResult(\'__GEOINFO_ID__\')"><img src="img/icon_article.png"/>付近に関する記事</div>',
	
	/**
	 * コンストラクタ
	 * @param {Object} params
	 *  params.map Google mapsのハンドラ GMap2
	 */
	initialize: function(params){
		this.mapHandler = params.handler;
		this.manager = params.manager;
	},
	
	/**
	 * レストラン検索
	 * @param {string} id
	 */
	addRestaurantSearchResult: function(id) {
		var info = this.manager.hashGeoInfo.get(id);
		var point = info.getPoint();
		this.createRestaurantSearchRequest(point);
	},
	
	
	/**
	 * レストラン検索 (引数なし)
	 */
	addRestaurantSearchResultNearCenter: function() {
		var point = this.mapHandler.gmap.getCenter();
		this.createRestaurantSearchRequest(point);
	},
	
	createRestaurantSearchRequest: function(point) {
		new GnaviRequest ({
			lat: point.lat(),
			lng: point.lng(),
			handler: this.mapHandler,
			restaurantManager: this
		});
		
		showTab('divSearchResultTabView', 2);
		$('spanRestaurantLoad').innerHTML = '<img src="img/loader.gif"/>';

		this.nRemainingRestaurantRequest++;
	},
	
	/**
	 * ホテル検索が終了した際にこのメソッドを介して通知される
	 * （ホテル検索のリクエスト数をデクリメント.
	 * 全てのリクエストが完了していれば，notifyAllHotelRequestCompletedを呼び出す．）
	 * @param {GeoInfo[]} infos
	 */
	notifyRestaurantRequestFinished: function(infos) {

		this.clear();

		
		this.nRemainingRestaurantRequest--;
		if(this.nRemainingRestaurantRequest == 0)
			this.notifyAllRestaurantRequestCompleted();
			
		if (infos.length == 0) {
			$('spanRestaurantTable').innerHTML = '<div>検索結果が見つかりませんでした</div>';
			return;
		}
		
		for (var i = 0; i < infos.length; i++) {
			this.hashGeoInfo.set(infos[i].getId(), infos[i]);
		}
		
		for (var i = 0; i < infos.length; i++) {
			var info = infos[i];
			var strHtml = this.makeInfoWindowHtml(info.getId());
			this.mapHandler.addSearchResultOverlay(info, strHtml, 'restaurant');
		}
		

					
		var tableSource = new Array();
		for (var i = 0; i < infos.length; i++) {

			var name = infos[i].name;
			var address = infos[i].address;
	
			var lng = infos[i].point.lng();
			var lat = infos[i].point.lat();

			name = '<span onClick="restaurantManager.showInfoWindow(\'' + infos[i].getId() + '\');">' + name + "</span>";
			address = '<span onClick="restaurantManager.showInfoWindow(\'' + infos[i].getId() + '\');">' + address + "</span>";
			tableSource.push({ name: name, address: address });
		}

		var tabId= 'tabView' + 'divSearchResultTabView_2';

//		$(tabId).innerHTML = '<div id="' + this.tabId + '"></div>';
		$('spanRestaurantTable').innerHTML = '<div id="' + this.tabId + '"></div>';
	
        this.dataSource = new YAHOO.util.DataSource(tableSource);
        this.dataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
        this.dataSource.responseSchema = {
            fields: [
                {key:"name"},
                {key:"address"}
            ]
        };
		this.columnDefs = [
			{key:"name", label:"名前"},
			{key:"address", label:"住所"}
		];
		this.dataTable = createTableInTab(this.tabId, this.columnDefs, this.dataSource);


	},
	
	/**
	 * 全てのリクエストが完了した際に呼ばれるコールバック関数
	 */
	notifyAllRestaurantRequestCompleted: function() {
		$('spanRestaurantLoad').innerHTML = '';
	},
	
	
	showInfoWindow: function(id) {
		var info = this.hashGeoInfo.get(id);
		var strHtml = this.makeInfoWindowHtml(id);
		var map = this.mapHandler.getMap();
		map.openInfoWindowHtml(info.getPoint(), strHtml);
	},
	
	makeInfoWindowHtml: function(id) {
		var info = this.hashGeoInfo.get(id);
		var infoWindowText = '<div class="destination_infowindow">';
		infoWindowText += this.infoWindowTextName;
		if(this.manager.containsDestination(id)) {
			infoWindowText += this.infoWindowTextSetStart + " " + this.infoWindowTextSetEnd;
		} else {
			infoWindowText += this.infoWindowTextAddDestination;
		}
		infoWindowText += this.infoWindowTextSearchHotel
							+ this.infoWindowTextSearchRestaurant
							+ this.infoWindowTextSearchArticle;
		infoWindowText += '</div>';
		infoWindowText = infoWindowText.replace(/__GEOINFO_NAME__/g, info.getName());
		infoWindowText = infoWindowText.replace(/__GEOINFO_ID__/g, info.getId());
		infoWindowText = infoWindowText.replace(/__GEOINFO_URL__/g, info.getUrl());

		return infoWindowText;
	},
	
	clear: function() {
		var ids = this.hashGeoInfo.keys();
	
		for (var i = 0; i < ids.length; i++) {
			var info = this.hashGeoInfo.get(ids[i]);
			this.mapHandler.removeSearchResultOverlay(info);
		}
		
		this.hashGeoInfo = new Hash();
		$('spanRestaurantTable').innerHTML = '';
	},

	resize: function(){
		if (this.dataTable == null) return;

		createTableInTab(this.tabId, this.columnDefs, this.dataSource);
	}
	
}
