/*
* Googleマップ表示ライブラリ
* @version 1.02
*/

/**
* GoogleマップマーカーDataBeanクラス
* @access public
*/
function GMapDataBean() {
	this.numLatitude = 0;  //緯度
	this.numLongitude = 0; //経度
	this.strName = "";     //名前
	this.strHTML = "";     //HTML
	this.objGIcon = null;    //GIconオブジェクト
	this.flgUseIcon = true; //アイコンを使用する。
	this.arrBelongingLinkIdList = new Array(); //このデータをリンクとして表示する場所のIDのリスト
}

/**
* GoogleマップマーカーDataBeanクラスのプロトタイプ
*/
GMapDataBean.prototype = {
	/**
	* 緯度、経度を設定する。
	*/
	setLatLng : function (numLatitude, numLongitude) {
		this.numLatitude = numLatitude;
		this.numLongitude = numLongitude;
	},

	/**
	* 緯度を設定する。
	*/
	setLatitude : function(numLatitude) {
		this.numLatitude = numLatitude;
	},

	/**
	* 緯度を取得する。
	*/
	getLatitude : function() {
		return this.numLatitude;
	},

	/**
	* 経度を設定する。
	*/
	setLongitude : function(numLongitude) {
		this.numLongitude = numLongitude;
	},

	/**
	* 経度を取得する。
	*/
	getLongitude : function() {
		return this.numLongitude;
	},

	/**
	* 名前を設定する。
	*/
	setName : function(strName) {
		this.strName = strName;
	},

	/**
	* 名前を取得する。
	*/
	getName : function() {
		return this.strName;
	},

	/**
	* HTMLを設定する。
	*/
	setHTML : function(strHTML) {
		this.strHTML = strHTML;
	},

	/**
	* HTMLを取得する。
	*/
	getHTML : function() {
		return this.strHTML;
	},

	/**
	* GIconオブジェクトを設定する。
	*/
	setIcon : function(objGIcon) {
		this.objGIcon = objGIcon;
	},

	/**
	* GIconオブジェクトを取得する。
	*/
	getIcon : function() {
		return this.objGIcon;
	},

	/**
	* アイコン使用フラグを設定する。
	*/
	setUseIconFlag : function(flgUseIcon) {
		this.flgUseIcon = flgUseIcon;
	},

	/**
	* アイコン使用フラグを取得する。
	*/
	getUseIconFlag : function() {
		return this.flgUseIcon;
	},

	/**
	* このデータをリンクとして表示する場所のIDのリストを設定する。
	*/
	setBelongingLinkIdList : function(arrBelongingLinkIdList) {
		this.arrBelongingLinkIdList = arrBelongingLinkIdList;
	},

	/**
	* このデータをリンクとして表示する場所のIDのリストを取得する。
	*/
	getBelongingLinkIdList : function() {
		return this.arrBelongingLinkIdList;
	}
};

/**
* GoogleマップマーカーDataBeanリストクラス
*/
function GMapDataList() {
	this.arrDataList = new Array(); //マーカーDataBeanリスト
}

/**
* GoogleマップマーカーDataBeanリストクラスのプロトタイプ
*/
GMapDataList.prototype = {
	/**
	* データを追加する。
	* @access public
	* @param object
	* @return void
	*/
	add : function(objDataBean) {
		this.arrDataList.push(objDataBean);
	},

	/**
	* データの数を取得する。
	* @access public
	* @return array
	*/
	getSize : function() {
		return this.arrDataList.length;
	},

	/**
	* 指定したインデックスのデータを取得する。
	* @access public
	* @param numeric
	* @return array
	*/
	get : function(numIndex) {
		return this.arrDataList[numIndex];
	},

	/**
	* 物件データのリストを取得する。
	* @access public
	* @return array
	*/
	getList : function() {
		return this.arrDataList;
	}
};

/**
* Googleマップマーカーオブジェクト
*/
var GMapGMarker = {
	objGMap2 : null,
	arrGLatLngObject : [],
	arrGMarkerObject : [],
	arrHTML : [],
	arrUseIconFlag : [],
	clicked : function(i) {
		if(this.arrUseIconFlag[i]) {
			this.arrGMarkerObject[i].openInfoWindowHtml(this.arrHTML[i]);
		} else {
			this.objGMap2.panTo(this.arrGLatLngObject[i]);
		}
	}
};

/**
* Googleマップ表示クラス
* @access public
*/
function GMapDisplayer() {
	this.objGMapDataList = null;   //GMapDataListオブジェクト
	this.numCenterLatitude = 0;    //GoogleMapsの中心の緯度
	this.numCenterLongitude = 0;   //GoogleMapsの中心の経度
	this.numZoomLevel = 0;         //GoogleMapsのズームレベル
	this.arrControl = new Array(); //GoogleMapsのコントロールリスト
	this.mapDelim = {};            //各ID毎の区切り文字列(デフォルトは&nbsp;)
}

/**
* Googleマップ表示クラスのプロトタイプ
*/
GMapDisplayer.prototype = {

	setGMapDataList : function(objGMapDataList) {
		this.objGMapDataList = objGMapDataList;
	},


	getGMapDataList : function() {
		return this.objGMapDataList;
	},


	setCenterLatLng : function(numCenterLatitude, numCenterLongitude) {
		this.numCenterLatitude = numCenterLatitude;
		this.numCenterLongitude = numCenterLongitude;
	},


	setCenterLatitude : function(numCenterLatitude) {
		this.numCenterLatitude = numCenterLatitude;
	},


	getCenterLatitude : function() {
		return this.numCenterLatitude;
	},


	sumCenterLongitude : function (numCenterLongitude) {
		this.numCenterLongitude = numCenterLongitude;
	},


	gumCenterLongitude : function() {
		return this.numCenterLongitude;
	},


	setZoomLevel : function(numZoomLevel) {
		this.numZoomLevel = numZoomLevel;
	},


	getZoomLevel : function() {
		return this.numZoomLevel;
	},


	addControl : function(strControlName) {
		var objControl = null;
		switch(strControlName) {
			case "GSmallMapControl":
				objControl = new GSmallMapControl();
				break;
			case "GLargeMapControl":
				objControl = new GLargeMapControl();
				break;
			case "GSmallZoomControl":
				objControl = new GSmallZoomControl();
				break;
			case "GScaleControl":
				objControl = new GScaleControl();
				break;
			case "GMapTypeControl":
				objControl = new GMapTypeControl();
				break;
			case "GOverviewMapControl":
				objControl = new GOverviewMapControl();
				break;
			default:
				//Nothing to do.
				break;
		}
		if(objControl != null) {
			this.arrControl.push(objControl);
		}
	},


	setDelimiter4LinkString : function(strId, strDelim) {
		this.mapDelim[strId] = strDelim;
	},


	getDelimiter4LinkString : function(strId) {
		var strDelim = this.mapDelim[strId];
		if(!strDelim) {
			strDelim = "&nbsp;";
		}
		return strDelim;
	},


	display : function(strTargetGMapId, arrTargetLinkIdList) {
		var objGMapDataList = this.objGMapDataList;

		var objGMap2 = new GMap2(document.getElementById(strTargetGMapId));
		
		

		GMapGMarker.objGMap2 = objGMap2;

		for(var i=0; i<this.arrControl.length; i++) {
			objGMap2.addControl(this.arrControl[i]);
		}
		objGMap2.setCenter(new GLatLng(this.numCenterLatitude, this.numCenterLongitude), this.numZoomLevel);

		var mapLinkIdHTML = {};
		for(var i=0; i<objGMapDataList.getSize(); i++) {
			var objDataBean = objGMapDataList.get(i);

			var strName = objDataBean.getName();
			var strHTML = objDataBean.getHTML();
			var numLatitude = objDataBean.getLatitude();
			var numLongitude = objDataBean.getLongitude();
			var arrBelongingLinkIdList = objDataBean.getBelongingLinkIdList();
			var objGIcon = objDataBean.getIcon();
			var flgUseIcon = objDataBean.getUseIconFlag();

			var objPoint = new GLatLng(numLatitude, numLongitude);

			var objMarker = null;
			if(flgUseIcon) {
				if(objGIcon) {
					objMarker = new GMarker(objPoint, objGIcon);
				} else {
					objMarker = new GMarker(objPoint);
				}
				if(i!=39)this.addInfoWindowHtmlEventListener(objMarker, strHTML);
				objGMap2.addOverlay(objMarker);
			}


			GMapGMarker.arrGLatLngObject[i] = objPoint;
			GMapGMarker.arrGMarkerObject[i] = objMarker;
			GMapGMarker.arrHTML[i] = strHTML;
			GMapGMarker.arrUseIconFlag[i] = flgUseIcon;

			for(var j=0; j<arrBelongingLinkIdList.length; j++) {
				var strId = arrBelongingLinkIdList[j];
				if(strId == strTargetGMapId) {
					//Nothing to do.
				} else {
					if(this.idExists(strId, arrTargetLinkIdList)) {
						if(strName != "") {
							if(!mapLinkIdHTML[strId]) {
								mapLinkIdHTML[strId] = "";
							}
							if(mapLinkIdHTML[strId] != "") {
								var strDelim = this.getDelimiter4LinkString(strId)
								mapLinkIdHTML[strId] += strDelim;
							}
							mapLinkIdHTML[strId] += "<a href=\"#map\" onclick=\"JavaScript:GMapGMarker.clicked(" + i + ")\">" + strName + "</a>";
						}
					}
				}
			}
		}

		for(var i=0; i<arrTargetLinkIdList.length; i++) {
			var strId = arrTargetLinkIdList[i];
			if(!mapLinkIdHTML[strId]) {
				mapLinkIdHTML[strId] = "";
			}

			document.getElementById(strId).innerHTML = mapLinkIdHTML[strId];
		}
	},


	idExists : function(strId, arrIdList) {
		var flg = false;
		for(var i=0; i<arrIdList.length; i++) {
			if(strId == arrIdList[i]) {
				flg = true;
				break;
			}
		}
		return flg;
	},


	addInfoWindowHtmlEventListener : function(objMarker, strHTML) {
		GEvent.addListener(objMarker, "click", function() {objMarker.openInfoWindowHtml(strHTML);});
	}
};

