
/**
 * Google Map Wrapper Class
 */


/**
 * コンストラクタ
 *
 * パラメータをオブジェクトで渡す。
 * container: 表示する要素のID 
 * panorama:  ストリートビューを表示させる要素のID
 */
var PBmap = function(optionObj){
	
	// ブラウザが対応していない場合
	if (!GBrowserIsCompatible()) {
		return false;
	}
	
	// jQuery が呼び出されていない場合
	if (!jQuery) {
		alert('このライブラリには jQuery が必要です。');
		return false;
	}
	
	// コンテナの指定
	if (optionObj.container && $('#'+optionObj.container).length>0) {
		this.container = optionObj.container;
	} else {
		alert('表示させるコンテナを指定してください。');
		return false;
	}
	
	// 必要なプロパティ
	this.map = null;
	this.geocoder = null;
	this.panorama = null;
	this.zoom = null;
	
	// ストリートビューのパノラマが指定されていたとき
	if (optionObj.streetview && $('#'+optionObj.streetview).length>0) {
		this.panorama = new GStreetviewPanorama($('#'+optionObj.streetview)[0]);
	}
};


/**
 * マップを表示する
 */
PBmap.prototype.show = function(){
	this.gmap = new GMap2($('#'+this.container)[0]);
};


/**
 * コントロールを表示させる
 *
 * オプションの値は次の通り
 * size [small | large] : サイズ
 * zoom [int] : 縮尺
 * streetview [bool] : ストリートビュー
 *
 * @param Object option オプション
 */
PBmap.prototype.setControl = function(option){
	
	// size
	if (option.size) {
		if (option.size == 'large')
			this.gmap.addControl(new GLargeMapControl());
		else if (option.size == 'small')
			this.gmap.addControl(new GSmallMapControl());
	}
	
	// zoom
	if (option.zoom) {
		this.zoom = option.zoom;
	}
	
	// type
	this.gmap.addControl(new GMapTypeControl());

};


/**
 * ストリートビューの青線を表示
 *
 * @param boolean bool 表示するときはtrue、表示しないときはfalse
 */
PBmap.prototype.showStreetView = function(bool){
	if (bool==undefined || bool)
		this.gmap.addOverlay(new GStreetviewOverlay());
	else
		this.gmap.removeOverlay(new GStreetviewOverlay());
};


/**
 * 指定した場所を表示
 * @param Object point 緯度経度
 */
PBmap.prototype.showPoint = function(point) {

	var zoom = (this.zoom) ? this.zoom: 13;
	this.gmap.setCenter(point, zoom);
	this.zoom = null;
		
	if (this.panorama) {
		var client = new GStreetviewClient();
		var panorama_tmp = this.panorama;
		client.getNearestPanorama(point, function(data){
			if (data.code != 200){
				return;
			}
			panorama_tmp.setLocationAndPOV(data.location.latlng);
			panorama_tmp.show();
		});
	}
};


/**
 * 指定した場所にズーム
 *
 * @param int zoom
 */
PBmap.prototype.setZoom = function(zoom) {
	this.gmap.setZoom(zoom);
	this.zoom = zoom;
};


/**
 * 指定した場所にマーカーを表示
 *
 * オプションで渡せるプロパティは以下の通り
 * onclick [Function] クリック時のコールバック関数
 * html [string] クリック時に表示させるhtml 
 * option [Object] addMarkerメソッドのオプション
 *
 * @param Object point 緯度経度
 * @param Object option オプション。onclickイベントなどを渡すことができる
 */
PBmap.prototype.addMarker = function(point, option) {
	var paramoption = null;
	if (option && option.option)
		paramoption = option.option;
	var marker = new GMarker(point, paramoption);
	if (option && (option.onclick || option.html)) {
		GEvent.addListener(marker, 'click', function(){
			if (option.onclick) {
				option.onclick;
			}
			if (option.html) {
				marker.openInfoWindowHtml(option.html);
			}
		});
	}
	this.gmap.addOverlay(marker);
	return marker;
};


/**
 * マーカーを削除
 * @param GMarker marker マーカー
 */
PBmap.prototype.removeMarker = function(marker) {
	this.gmap.removeOverlay(marker);
};


/**
 * 住所から緯度経度を取得する
 * @param string address 住所やキーワード
 * @param Function eventFunc 取得後の処理
 */
PBmap.prototype.getLatLngByAddress = function(address, eventFunc){
	
	var owner = this;
	
	// geocoder のインスタンスを得る
	this.geocoder = new GClientGeocoder();
	
	this.geocoder.getLatLng(address, eventFunc);
};


