/* ********************************************
	== googleMap.getLatLngについて
	都道府県選択用のselectタグ及び、市区町村以下の住所を入力するテキストフィールドがある事を前提としています。
	
		e.g.
			<input type="hidden" id="element_latitude" />
	    <input type="hidden" id="element_longitude" />
	
	
	== googleMap.getAddressについて
	都道府県選択用のselectタグ及び、市区町村以下の住所を入力するテキストフィールドがある事を前提としています。
	getAddressの中身は、想定する住所の文字列が返るよう、適宜修正を行ってください。
	
		e.g. 
			<select id="element_prefectural_id">
				<option value="1">北海道</option>
			</select>
			<input type="text" id="element_address" />
	

	== Mapの描画タイミングについて
	showMapFromAddress() または showMapFromLatLng() が呼ばれた際、内部的にshowMap()が呼ばれます。
	showMap()の中にMapの描画ロジックが含まれます。

	== 簡単な使い方
	googleMap.mapID = "hoge";   // ここで、GoogleMapと差し替えたいDOMオブジェクトのIDを指定します。デフォルトは"google_map"です。
	googleMap.markerDraggable = false;   // マーカーオブジェクトをドラッグ不可にしたい場合、左のように記述します。デフォルトはtrueです。
	googleMap.showMapFromAddress();   // 住所を元にからGoogleMapを表示させたい場合、左のように記述します。
	
******************************************** */

var googleMap = {
	// Google Map と置き換える部分の DOM ID
	mapID: "google_map", 
	
	// マーカー
	marker: null, // マーカーオブジェクト
	markerDraggable: true,  // ドラッグ可能かどうか
	elementType: 'store', // DOM操作を行う場合のデフォルト
	markerIconImage: "/images/marker.png", 
	markerIconShadow: "/images/marker_shadow.png", 
	markerIconImageSize: [40, 49], 
	markerIconShadowSize: [40, 49], 
	markerIconAnchorPoint: [20, 49], 
	
	// lat, lonのhiddenエリアvalueを変更
	setLatLng: function() {  // イベントリスナ
	  var point = googleMap.marker.getLatLng();
	  document.getElementById(googleMap.elementType + '_latitude').value  = point.lat();
	  document.getElementById(googleMap.elementType + '_longitude').value = point.lng();
	}, 
	
	// 地図表示
	showMap: function(gLatLng) {  // イベントリスナ
		if(gLatLng == null){
			alert("住所から地図を取得できませんでした。");
			gLatLng = new GLatLng(35.689488, 139.691706);
		}
		// マーカーアイコンを作成
	  var markerIcon = new GIcon();
	  markerIcon.image  = googleMap.markerIconImage;
	  markerIcon.shadow = googleMap.markerIconShadow;
	  markerIcon.iconSize   = new GSize(googleMap.markerIconImageSize[0], googleMap.markerIconImageSize[1]);
		markerIcon.ShadowSize = new GSize(googleMap.markerIconShadowSize[0], googleMap.markerIconShadowSize[1]);
	  markerIcon.iconAnchor = new GPoint(googleMap.markerIconAnchorPoint[0], googleMap.markerIconAnchorPoint[1]);

	  // マップの初期化
	  var map = new GMap2(document.getElementById(googleMap.mapID));
	  map.addControl(new GLargeMapControl());
	  map.addControl(new GMapTypeControl());
		map.enableDragging();
	  map.enableInfoWindow();
	  map.enableDoubleClickZoom();
	  map.setCenter(gLatLng, 15);

	  // マーカーアイコンを配置
	  googleMap.marker = new GMarker(gLatLng, {icon:markerIcon, draggable:googleMap.markerDraggable});
	  map.addOverlay(googleMap.marker);

		// マーカーがドラッグ可能なら、lat,lonを逐次保存する
		if(googleMap.markerDraggable) {
		  // 緯度経度を取得し、hiddenを書き換え
		  googleMap.setLatLng();

		  // ----- イベントリスナ発行 -----
		  // Listen: ドラッグ&ドロップ時に移動後の緯度経度を取得し、hiddenを書き換え
		  GEvent.addListener(googleMap.marker,"dragend", googleMap.setLatLng);
		}
	}, 
	
	// lat, lngの値から地図を表示
	showMapFromLatLng: function() {
	  this.showMap(this.getLatLng());
	}, 
	
	// 住所欄に入力された値から地図を表示
	showMapFromAddress: function() {
	  // サーバーからきちんと戻り値があった場合のみMapを表示する
	  var gc = new GClientGeocoder();
		  gc.getLatLng(this.getAddress(), this.showMap);
	}, 
		
	// サーバーに送るlat, lonの値を取得
	getLatLng: function() {
		return new GLatLng(
			document.getElementById(this.elementType + '_latitude').value, 
			document.getElementById(this.elementType + '_longitude').value
		);
	}, 
	
  // サーバーに送る住所を生成
	getAddress: function() {
	  var i = document.getElementById(this.elementType + "_prefectural_id").selectedIndex;
	  var obj = document.getElementById(this.elementType + "_prefectural_id").getElementsByTagName("option");
	  return obj[i].innerHTML + document.getElementById(this.elementType + "_address").value;
	}
}

