// Mapインスタンスvar mainmap;// 計算用GMapインスタンスvar hmap;// Geocoderインスタンスvar geocoder;// 全レストランデータvar restaurantsData = new Array();// 現在表示中レストランデータvar markerDataSet = new Array();// 初期化終了フラグINIT      = "init";RECOMMEND = "recommend";SEARCH    = "search";var mode = INIT;// マーカーの最大表示数var MAX_MARKER_NUM = 20// サーバURLvar BASE_URL = "http://www.gargery.com";// 動作後アップデートが動かないようにロックするvar enable_update = true;var mouseMoveListener = null;function onLoadMapApp() {	var o = this;		if(GBrowserIsCompatible()) {		mainmap = new GMap2($('gggmap'), { size: new GSize(433,440) });		mainmap.addControl(new GLargeMapControl());		mainmap.addControl(new GScaleControl());		mainmap.addControl(new GMapTypeControl());		mainmap.setCenter(new GLatLng(35.681631, 139.764982), 16);				geocoder = new GClientGeocoder();				hmap = new GMap2($('gggmap2'), { size: new GSize(433,415) });		hmap.setCenter(new GLatLng(35.681631, 139.764982), 16);		hmap.addControl(new GScaleControl());	}		// レストランデータを取得	restaurantsData = [];		mouseMoveListener = GEvent.addListener(mainmap, 'moveend', function(overlay, point) {		o.onFinishMove();	});		if($('sq').value == "") {		getRestaurants();	} else {		$('searchInput').value = $('sq').value;		searchRestaurants();	}}/** * レストランデータを取得する */function getRestaurants() {	//console.log("getRestaurants()");		var myAjax = new Ajax.Request(		BASE_URL + "/php/get_restaurants_data.php",		{			method: 'get', 			onComplete: result_getRestaurants		}	)}function result_getRestaurants(originalRequest) {	//console.log("result_getRestaurants()");		var o = this;		var xotree = new XML.ObjTree();	var tree = xotree.parseXML(originalRequest.responseText);		if(tree.restaurants.restaurant != undefined) {		restaurantsData = optimizeRestaurantsData(tree.restaurants.restaurant);	}		mode = RECOMMEND;		// recommendフラグがたっているレストランデータを探す	var rcmmId = getRecommendRestaurantId();	//console.log("recommendId : " + rcmmId);		// レコメンドフラグのレストラン位置からの距離順に並び替える	var rcmmLatLng = new GLatLng(restaurantsData[rcmmId]["-latitude"], restaurantsData[rcmmId]["-longitude"]);	//console.log("sortDataByDistance1");	sortDataByDistance(rcmmLatLng);	//console.log("sortDataByDistance2");		// debug	for(var i = 0; i < restaurantsData.length; i++) {		var item = restaurantsData[i];		//console.log("id : " + item["-id"] + ", enable : " + item.enable + ", lat : " + item["-latitude"] + ", lng : " + item["-longitude"] + ", distance : " + item.distance);	}		// マーカーの生成	updateMarkers(restaurantsData);		// 中央位置に移動	optimizeCenterAndZoomLevel(markerDataSet);		// サイドリストの更新	updateSideList();		// 地図の移動が終わったら呼び出される	// マーカーのリフレッシュ//	GEvent.addListener(mainmap, 'moveend', function(overlay, point) {//		o.onFinishMove();	//	console.log("moveend");//	});}/** * Recommendフラグが立っているレストラン情報のIDを取得 * （最初だけ使用） */function getRecommendRestaurantId(){	for(var i = 0; i < restaurantsData.length; i++) {		var item = restaurantsData[i];		if(item["-recommend"] == "1") {			return i;		}	}		// ない場合はランダムで返す	////console.log("ランダムでRecommendレストランを取得");	return Math.floor(Math.random() * (restaurantsData.length - 1));}/** * レストラン情報配列からマーカーを再配置する * in_restaurantList : レストラン情報配列 */ function updateMarkers(in_restList) {	//console.log("updateMarkers() : " + in_restList.length + "件");		var o = this;		mainmap.clearOverlays();		markerDataSet = [];		var max = MAX_MARKER_NUM;	if(in_restList.length < MAX_MARKER_NUM) max = in_restList.length;		for(var i = 0; i < max; i++) {		var iconurl;		if(i < 9) {			iconurl = BASE_URL + "/images/rb/mark_00"+(i+1)+".png";		} else {			iconurl = BASE_URL + "/images/rb/mark_0"+(i+1)+".png";		}				// マーカーの追加		var myIcon = new GIcon();		myIcon.image = iconurl;		myIcon.shadow = BASE_URL + "/images/rb/mark_shadow.png";		myIcon.iconSize = new GSize(30,45);		myIcon.shadowSize = new GSize(30,45);		myIcon.iconAnchor = new GPoint(15,35);				if(in_restList[i].enable) {			//console.log(i + "番目生成");			var customMarkerObj = new GMarker(in_restList[i].latlng, {				icon: myIcon			});						customMarkerObj.data = in_restList[i];						mainmap.addOverlay(customMarkerObj);			markerDataSet.push(customMarkerObj);									GEvent.addListener(customMarkerObj, "click", function() {			//	alert("マーカーのID : " + this.data["-id"]);								o.clickMarker(this.data["-id"]);			});		}	}	}/** * 表示されているマーカーからズームレベルと表示位置を算出、設定する * in_markerList : マーカーの要素の配列 */function optimizeCenterAndZoomLevel(in_markerList) {	var gb;	var first = 1;		for(var i = 0; i < in_markerList.length; i++) {		var marker = in_markerList[i];		if(first) {			gb = new GLatLngBounds(marker.getPoint(), marker.getPoint());			first = 0;		}		else {			var point = marker.getPoint();			gb.extend(point);		}	}		mainmap.setCenter(gb.getCenter(), mainmap.getBoundsZoomLevel(gb));}/** * 引数の位置（緯度経度）からの距離を計算し、ソートする */function sortDataByDistance(in_centerLatLng) {	// 引数の位置（緯度経度）からの距離を計算	for(var i = 0; i < restaurantsData.length; i++) {		if(restaurantsData[i].enable) {			restaurantsData[i].latlng = new GLatLng(restaurantsData[i]["-latitude"], restaurantsData[i]["-longitude"]);			restaurantsData[i].distance = in_centerLatLng.distanceFrom(restaurantsData[i].latlng);		}	}		var a = [];	// 距離順にソート	for(var j = 0; j < restaurantsData.length; j++) {		var item = restaurantsData[j];		if(item.enable) {			if(a.length > 0) {				var fin = false;				for(var k = 0; k < a.length; k++) {					if(item.distance < a[k].distance) {						a.splice(k, 0, item);						fin = true;						break;					}				}				if(!fin) {					a.push(item);				}			} else {				a.push(item);			}		} else {			a.push(item);		}	}		restaurantsData = a.slice(0);}/** * サーバから取得したレストラン情報を最適化する */function optimizeRestaurantsData(in_restData) {	////console.log("optimizeRestaurantsData()");		var ret_arr = new Array();		if(in_restData == undefined) {		//console.log("情報なし");	} else {		if(in_restData[0] == undefined) {			//console.log("情報1件");						if(in_restData["-latitude"] > 0 && in_restData["-longitude"] > 0) {				in_restData.latlng = new GLatLng(in_restData["-latitude"], in_restData["-longitude"]);				in_restData.enable = true;				in_restData.distance = 0;			} else {				in_restData.latlng = null;				in_restData.enable = false;				in_restData.distance = 1000000000;			}			ret_arr[0] = in_restData;		} else {			if(in_restData[1] != undefined) {				//console.log("情報" + in_restData.length + "件");								for(var i = 0; i < in_restData.length; i++) {					if(in_restData[i]["-latitude"] > 0 && in_restData[i]["-longitude"] > 0) {						in_restData[i].latlng = new GLatLng(in_restData[i]["-latitude"], in_restData[i]["-longitude"]);						in_restData[i].enable = true;						in_restData[i].distance = 0;					} else {						in_restData[i].latlng = null;						in_restData[i].enable = false;						in_restData[i].distance = 1000000000;					}										ret_arr.push(in_restData[i]);				}			}		}	}		return ret_arr;}/** * レストランデータを検索し、合致した情報を取得する */function searchRestaurants() {	////console.log("searchRestaurants()");		var pars = 'keywords=' + $F('searchInput');		var myAjax = new Ajax.Request(		BASE_URL + "/php/search_restaurants_data.php",		{			method: 'get', 			parameters: pars,			onComplete: result_searchRestaurants		}	);}function result_searchRestaurants(originalRequest) {	////console.log("result_searchRestaurants()");		var xotree = new XML.ObjTree();	var tree = xotree.parseXML(originalRequest.responseText);		var updateData_arr = [];		if(tree.restaurants.restaurant != undefined) {		updateData_arr = optimizeRestaurantsData(tree.restaurants.restaurant);	}		if(parseInt(tree.restaurants["-num"]) > 0) {		//console.log("最新データに更新");				mode = SEARCH;		restaurantsData = updateData_arr.slice(0);				// 全データで地図の中央点を算出		var centerLatLng = calcCenterLatLng(restaurantsData);				// 中央の距離順にデータをソート		sortDataByDistance(centerLatLng);				// サイドリストの更新		updateSideList();				// マーカーの生成		updateMarkers(restaurantsData);		optimizeCenterAndZoomLevel(markerDataSet);	} else {		//console.log("ヒットしませんでした表示");				showNotFound();				mode = SEARCH;		restaurantsData = new Array();				updateMarkers(restaurantsData);		optimizeCenterAndZoomLevel(markerDataSet);	}}/** * 計算用Mapを使って中央値を計算 */function calcCenterLatLng(in_list) {	////console.log("calcCenterLatLng() : " + in_list.length + "件");		hmap.clearOverlays();		var thisMarker = [];		for(var i = 0; i < in_list.length; i++) {		if(in_list[i].enable) {	//		//console.log("in_list[i] : " + in_list[i].latlng.lat() + ", " + in_list[i].latlng.lng());			var markerObj = new GMarker(in_list[i].latlng);			hmap.addOverlay(markerObj);			thisMarker.push(markerObj);		}	}		var gb;	var first = 1;		for(var j = 0; j < thisMarker.length; j++) {		var marker = thisMarker[j];		if(first) {			gb = new GLatLngBounds(marker.getPoint(), marker.getPoint());			first = 0;		}		else {			var point = marker.getPoint();			gb.extend(point);		}	}		hmap.setCenter(gb.getCenter(), hmap.getBoundsZoomLevel(gb));		////console.log("calcCenterLatLng() 中央値 : " + hmap.getCenter().lat() + ", " + hmap.getCenter().lng());		return hmap.getCenter();}/** * マップが動き終わったときに実行されるイベントハンドラメソッド */function onFinishMove() {	////console.log("onFinishMove()");		if(enable_update) {		if(restaurantsData.length > 0) {			// 地図の中央点を算出			var centerLatLng = mainmap.getCenter();			////console.log("地図の中央点 : " + centerLatLng.lat() + ", " + centerLatLng.lng());						// 中央の距離順にデータをソート			sortDataByDistance(centerLatLng);						// マーカーの生成			updateMarkers(restaurantsData);						// サイドリストの更新			updateSideList();		}	} else {		enable_update = true;	}}function updateSideList() {	////console.log("updateSideList()");		var max = MAX_MARKER_NUM;	if(restaurantsData.length < MAX_MARKER_NUM) max = restaurantsData.length;		if(max > 0) {		var out = "";		$('resultDataList').innerhtml = "";				for(var i = 0; i < max; i++) {			var item = restaurantsData[i];			////console.log(item);						var numstr;			if(i < 9) numstr = "0"+(i+1);			else      numstr = ""+(i+1);						out += '<li>';			out += '<dl class="ico'+numstr+'">';			out += '<dt><a href="javascript:clickSideListItem('+item["-id"]+')">'+item.name+'</a></dt>';			out += '<dd>'+item.gyoutai+'</dd>';			out += '<dd>'+item.beer_type+'</dd>';			out += '<dd>'+item.tel+'</dd>';			out += '</dl>';			out += '</li>';		}				$('resultDataList').innerHTML = out;	}}function showNotFound() {	var out = "";	out += '<li>';	out += '<dl>';	out += '<dt style="color:#000000;">該当の店舗は見つかりませんでした。</dt>';	out += '</dl>';	out += '</li>';	$('resultDataList').innerHTML = out;	$('shopData').innerHTML = "";}function clickMarker(in_id) {	GEvent.removeListener(mouseMoveListener);		var item = getRestaurantDataById(in_id);		if(item != null) {		enable_update = false;		mainmap.setCenter(new GLatLng(item["-latitude"], item["-longitude"]), 18);		showDetail(in_id);	}}function clickSideListItem(in_id) {	GEvent.removeListener(mouseMoveListener);		var item = getRestaurantDataById(in_id);		if(item != null) {		enable_update = false;		mainmap.setCenter(new GLatLng(item["-latitude"], item["-longitude"]), 18);		showDetail(in_id);	}}function showDetail(id) {		var pars = 'id=' + id;		var myAjax = new Ajax.Request(		BASE_URL + "/php/get_restaurants_detail.php",		{			method: 'get', 			parameters: pars,			onComplete: return_showDetail		}	);}function return_showDetail(originalRequest) {	var o = this;		var xotree = new XML.ObjTree();	var tree = xotree.parseXML(originalRequest.responseText);		var item;		if(tree.restaurants.restaurant != undefined) {		item = optimizeRestaurantsData(tree.restaurants.restaurant)[0];	}		var out = "";		out += '<h4 class="shopTitle">'+item.name+'</h4>';	out += '<p>'+item.description+'</p>';	out += '<p><span class="dealTitle">&lt;取扱い&gt;</span><span class="dealItem">'+item.beer_type+'</span></p>';	out += '<dl class="shopInfo">';	out += '<dt>営業時間</dt>';	out += '<dd>'+item.business_hours+'</dd>';	out += '<dt>定休日</dt>';	out += '<dd>'+item.holiday+'</dd>';	out += '<dt>住所</dt>';    out += '<dd>'+item.address+'';    if(item.address2 != undefined) {    	out += '　'+item.address2+'</dd>';    } else {    	out += '</dd>'    }    out += '<dt>TEL</dt>';    out += '<dd>'+item.tel+'</dd>';	out += '<dt>アクセス</dt>';    out += '<dd>'+item.access_route+'</dd>';	if(item.url != undefined) {		out += '<dd class="shopLink"><a href="'+item.url+'" target="_blank"><img src="/images/rb/rb_toHpBtn.gif" alt="ショップホームページへ" width="34" height="9" /></a></dd>';	}	out += '</dl>';		$('shopData').innerHTML = out;			// infoパネルの表示	var info = mainmap.getInfoWindow();	mainmap.openInfoWindowHtml(new GLatLng(item["-latitude"], item["-longitude"]), 		'<div style="font-size:8pt;width:280px;">' +		item.name+'<br />' +		item.gyoutai+'<br />' +		item.beer_type+'<br />' +		item.tel + '</div>', { pixelOffset: new GSize(5, -15) }	);		mouseMoveListener = GEvent.addListener(mainmap, 'moveend', function(overlay, point) {		o.onFinishMove();	});}function getRestaurantDataById(in_id) {	for(var i = 0; i < restaurantsData.length; i++) {		var item = restaurantsData[i];		if(item["-id"] == in_id) {			return item;		}	}	return null;}if (window.addEventListener) { //for W3C DOM  window.addEventListener("load", onLoadMapApp, false);} else if (window.attachEvent) { //for IE  window.attachEvent("onload", onLoadMapApp);} //window.onload = onLoadMapApp;