	// 必要な変数の準備
	var cgi          = null; // GETで与えられるクエリーを解析する
	 gMap         = null; // GoogleMapを呼び出す
	var geocoder     = null; // 住所より緯度経度を取得する
	var debugArea    = null; // 現在の緯度経度等の表示領域
	var addrInfo     = new Object();


	// Gmap等の初期関数
	function initGmap(mapID, debugId, lttd, lgtd, zoom) {
		gMap      = new GMap2(document.getElementById(mapID));
		cgi       = new cgiLib();
		degubArea = document.getElementById(debugId);
		geocoder  = new GClientGeocoder();

		gMap.addControl(new GLargeMapControl());
		gMap.addControl(new GMapTypeControl());
		gMap.addControl(new GScaleControl());

		cgi.args['lat']  = lttd;
		cgi.args['lng']  = lgtd;
		cgi.args['zoom'] = zoom;

		// 初期設定を行う
		initSettings();
	}

	//初回読み込み時に、初期設定を行う関数
	function initSettings() {

		// 初期中心点の設定
		// 緯度経度が与えられている場合は中心点を設定
		if(! cgi.args['zoom'] ) cgi.args['zoom'] = 15;
		if(! cgi.args['lat'] )  cgi.args['lat']  = 33.58861521890696;
		if(! cgi.args['lng'] )  cgi.args['lng']  = 130.40170669555664;

		setCenter(cgi.args['lat'], cgi.args['lng'], cgi.args['zoom']);


		// 地図上で中心点を示すマーカーのアイコンを準備
		centerIcon            = getGmapIcon("/api/img/centerMarker.gif");
	
		// 地図が移動した場合、中心点のマーカーを追尾させる
		centerMarker = new GMarker(gMap.getCenter(), centerIcon);
		GEvent.addListener(gMap, 'moveend', getDebuggingFunction() );
		df = getDebuggingFunction();
		df();

		// 住所が指定された場合は、その地点に移動する
		if(cgi.args['addr'])  {
			document.getElementById('q').value = cgi.args['addr'];
			search(cgi.args['addr']);
		}
	}

	// ジオコーディング完了時のイベントハンドラ
	function geocoderHandler(point) {
		if (!point) {
			alert(addr + " not found!!");
		} else {
			gMap.clearOverlays();
			text = addrInfo.Text;


			if(addrInfo.Text) 
				text = addrInfo.Text + "<br>" + addrInfo.Addr

			setMarker(point, text, addrInfo.Src, addrInfo.Width, addrInfo.Height);
			setCenter(point.y, point.x);
		}
	}

	// 住所が与えられたときの処理
	// 追加して、InfoWindowのテキストとアイコンを指定可能
	function search(address, text, src, w, h){
		addrInfo.Addr = address;
		if(text)
			addrInfo.Text        = text;
		if(src) {
			addrInfo.Src    = src;
			if(w)
				addrInfo.Width  = w;

			if(h)
				addrInfo.Height = h;
		}
	
		geocoder.getLatLng(address, geocoderHandler);
	}

	// 緯度経度が与えられたときの処理
	function setCenter(lttd, lgtd, zoom){
		if(! zoom) {
			zoom = gMap.getZoom();
		}
		gMap.setCenter(new GLatLng(lttd, lgtd), zoom);
	}


	// 指定された位置にマーカーを追加
	function setMarker(point, text, src, iconWidth, iconHeight){
		var marker;
		if(src) {
			icon = getGmapIcon(src, iconWidth, iconHeight);
			marker = new GMarker(point, icon);
		}
		else {
			marker = new GMarker(point);
		}

		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindow(text);
		});
		gMap.addOverlay(marker);
	}

	// マーカーのアイコンを準備
	function getGmapIcon(src, iconWidth, iconHeight) {
		width  = 20;
		height = 20;

		if(iconWidth)
			width = iconWidth;

		if(iconHeight) 
			height = iconHeight;
		

		var icon              = new GIcon();
		icon.image            = src;
		icon.iconSize         = new GSize (width, height);
		icon.iconAnchor       = new GPoint(10, 10);
		icon.infoWindowAnchor = new GPoint(Math.round(width / 2), Math.round(height / 2));
		return(icon);
	}

	// 線を引く
	function setLine(points, color, text, src) {
		if(! color) {
			color = "#ff0000";
		}

		gMap.addOverlay(new GPolyline(points, color));

		n = Math.round(points.length - 1 / 2);

		if(text) {
			setMarker(points[n], text, src);
		}
	}

	function getDebuggingFunction() {

		var debug = function () {
			var msg = "";
		
			// 表示中の中心座標の取得
			var centerPoint = gMap.getCenter();
			{ // デバック表示 中心座標の緯度経度を表示する
				msg += "中心点の緯度経度<br>";
				msg += "経度(lng)" + centerPoint.x + "<br>";
				msg += "緯度(lat)" + centerPoint.y + "<br>";
				msg += "<br>";
			}
			degubArea.innerHTML = msg;

			gMap.removeOverlay(centerMarker);
			centerMarker = new GMarker(gMap.getCenter(), centerIcon);
			gMap.addOverlay(centerMarker);
		};
		return(debug);
	}




	// 現在の中心点を観光マップ形式のデータで返す
	function getCenterPointFromGoogleMap() {
		var obj  = new Object();
		var cObj = gMap.getCenter();
		cObj.zy  = cObj.y + (cObj.y * 0.00010695 ) - (cObj.x * 0.000017464) - 0.0046017;
		cObj.zx  = cObj.x + (cObj.y * 0.000046038) + (cObj.x * 0.000083043) - 0.010040;
		
		zx = cObj.zx * 360 * 10000;
		zy = cObj.zy * 360 * 10000;

		obj.lttd = Math.ceil(zy);
		obj.lgtd = Math.ceil(zx);
		return(obj);
	}

	function getCenterZenrin(lttd, lgtd) {
		lttd = lttd / 360 / 10000
		lgtd = lgtd / 360 / 10000

		wlttd = lttd - (lttd * 0.00010695 ) + (lgtd * 0.000017464) + 0.0046017;
		wlgtd = lgtd - (lttd * 0.000046038) - (lgtd * 0.000083043) + 0.010040;

		obj = new GLatLng(wlttd, wlgtd);

		return(obj);
	}

	function getCenterPointFromZenrin(obj) {
		if(! obj.lttd || ! obj.lgtd)
			return(false);

		lttd = obj.lttd / 360 / 10000
		lgtd = obj.lgtd / 360 / 10000

		wlttd = lttd - (lttd * 0.00010695 ) + (lgtd * 0.000017464) + 0.0046017;
		wlgtd = lgtd - (lttd * 0.000046038) - (lgtd * 0.000083043) + 0.010040;

		setCenter(wlttd, wlgtd);
	}

