//GMap2クラス
//** objId     :GooleMaps表示オブジェクトのID名:String
//** point     :緯度経度格納オブジェクト:Object
//** sCategory :絞込み条件「カテゴリ」：String
//** infoWindow:情報ウィンドウ内要素格納オブジェクト:Object
var GDMap2 = function(objId,point,sCategory,infoWindow) {
	//* GoogleMaps...
	this.gmap;																//GMap2インスタンス
	this.gmapArea = $(objId);									//GoogleMaps表示オブジェクト
	this.lat = point.lat;											//緯度
	this.lng = point.lng;											//経度
	this.zoom = 12;														//ズームレベル
	this.searchBtnOnId  = 'bmapresearch_no';	//検索ボタンONのオブジェクト
	this.searchBtnOffId = 'bmapresearch';			//検索ボタンOFFのオブジェクト
	this.searchOff_zoomLevel = 11;							//検索ボタンをOFFにするズームレベル
	this.marker       = new Object();					//マーカー格納
	this.iconPath     = "./images/icon/";			//アイコンファイルへのパス
	this.icon_width   = "18";									//アイコン幅
	this.icon_height  = "29";									//アイコン高さ
	this.iconFile     = {											//カテゴリごとのアイコンファイル
		 "1":"ico_cat_map01.gif",
		 "2":"ico_cat_map02.gif",
		 "3":"ico_cat_map03.gif",
		 "4":"ico_cat_map04.gif",
		 "5":"ico_cat_map05.gif",
		 "6":"ico_cat_map06.gif",
		 "7":"ico_cat_map07.gif",
		 "8":"ico_cat_map08.gif",
		 "9":"ico_cat_map09.gif",
		"10":"ico_cat_map10.gif",
		"11":"ico_cat_map11.gif"
	};
	this.infoHtml     = {											//情報ウィンドウ内HTMLフォーマット
		title  :'<p style="margin:3px 0px;font-size:12pt;"><strong>#TITLE#</strong><p>',
		address:'<p style="margin:2px;font-size:10pt;">住所：#ADDRESS#</p>',
		tel    :'<p style="margin:2px;font-size:10pt;">電話：#TEL#</p>',
		url    :'<p align="right" style="margin:2px;font-size:10pt;"><a href="#URL#">詳細情報を見る</a></p>'
	};
	this.infoOption   = {maxWidth:400};				//情報ウィンドウオプション
	this.infoDataObj  = infoWindow;						//情報ウィンドウデータオブジェクト
	//* Ajax...
	this.s_category   = sCategory;						//絞込み条件「カテゴリコード」（カンマ区切り）
	this.s_method     = "POST";								//フォームデータのMETHOD属性値（GET/POST）
	this.s_async      = true;									//非同期通信（TRUE=有効 , FALSE=無効）
	this.s_path       = "./map_search.php";		//検索プログラムパス
	//* Result...
	this.resultData;													//検索結果リスト格納オブジェクト
	this.listArea       = "resultList";				//検索結果リスト表示オブジェクトID名
	this.listNormal     = "normal";						//リストの通常クラス名称
	this.listMsover     = "msover";						//リストのマウスオーバー時クラス名称
	this.listIconPath   = "./images/icon/";					//アイコンファイルへのパス
	this.listIconWidth  = "15";								//アイコン幅
	this.listIconHeight = "15";								//アイコン高さ
	this.listIconFile   = {										//カテゴリごとのアイコンファイル
		 "1":"category01.gif",
		 "2":"category02.gif",
		 "3":"category03.gif",
		 "4":"category04.gif",
		 "5":"category05.gif",
		 "6":"category06.gif",
		 "7":"category07.gif",
		 "8":"category08.gif",
		 "9":"category09.gif",
		"10":"category10.gif",
		"11":"category11.gif"
	};
	//* Search
	var form = $("mapsearch");
	form.onsubmit = this.reSearch;

	//周囲検索フラグ true:有効 false:無効
	this.searchFlg    = (this.infoDataObj.id)? false : true;

	//周囲検索フラグ==FALSEの場合、マーカー用緯度経度を設定
	if(!this.searchFlg) {
		this.infoDataObj.lat = this.lat;
		this.infoDataObj.lng = this.lng;
	}

	//カテゴリ初期フォーム設定
	if(this.searchFlg && this.s_category!="") this.initForm();

	//* Check
	if(!this.gmapArea) {
		alert("System Error! [Constructor]\nGoogle Maps表示領域が存在しない...");
		return;
	}
	if(!this.lat || !this.lng) {
		var nopoint_msg = "位置情報が登録されていないため、地図を表示することができません。";
		if(this.gmapArea) {
			this.gmapArea.innerHTML = "<p>"+nopoint_msg+"</p>";
		} else {
			alert(nopoint_msg);
		}
		return;
	}

	this.loading();
}

GDMap2.prototype = {
	//** Form Initalize **********************************************************************************//
	//:カテゴリ選択フォームの初期設定
	initForm : function() {
		var category = this.s_category.split(",");
		var checkbox = new Object();
		//
		var input = document.getElementsByTagName('INPUT');
		var obj;
		for(var i=0;i<input.length;i++) {
			obj = input[i];
			if(obj.type=="checkbox" && obj.name=="category") {
				checkbox[obj.value] = obj;
			}
		}
		//
		for(var j=0;j<category.length;j++) {
			checkbox[category[j]].checked = "checked";
		}
	},
	//** Loading *****************************************************************************************//
	loading : function() {
		var loading_html = '<div style="font-size:80%;padding:10px;">Loading...</div>';
		var ctrl = ($(this.listArea))? $(this.listArea) : false;
		var gmap = this.gmap_area;
		if(this.searchFlg && ctrl) ctrl.innerHTML = loading_html;
		if(gmap) gmap.innerHTML = loading_html;
		this.initGmap();
	},
	//** Google Maps *************************************************************************************//
	//:GoogleMaps初期化
	initGmap : function() {
		//* Check
		if(!GBrowserIsCompatible()) {
			alert("ご利用のブラウザではGoogleMapsを表示することができません。");
			return;
		}
		//* Setting
		this.gmap = new GMap2(this.gmapArea);
		var point = new GLatLng(this.lat, this.lng);
		this.gmap.setCenter(point, this.zoom);
		this.gmap.addControl(new GLargeMapControl());
		//this.gmap.addControl(new GMapTypeControl());;
		//this.gmap.addControl(new GOverviewMapControl(new GSize(150,150)));
		this.gmap.addControl(new GScaleControl());
		
		new GKeyboardHandler(this.gmap);
		this.gmap.enableContinuousZoom();			//連続した滑らかなズーム処理
		this.gmap.enableDoubleClickZoom();		//ダブルクリックによるズーム処理
		//this.gmap.enableScrollWheelZoom();	//マウスホイールによるズーム処理
		
		if(this.searchFlg) {
			//緯度経度範囲の抽出
			var pointRange = this.getFourLatLng();
			var lat_min = pointRange.lat_min;
			var lat_max = pointRange.lat_max;
			var lng_min = pointRange.lng_min;
			var lng_max = pointRange.lng_max;
			//AJAX処理 -->> PHP
			var query   = "lat_min="+lat_min+"&lat_max="+lat_max+"&lng_min="+lng_min+"&lng_max="+lng_max+"&category="+this.s_category;
			this.doQuery(query);
			
		} else {
			//情報ウィンドウ表示処理
			var marker = this.createMarker(this.infoDataObj);
			if(marker) {
				this.gmap.addOverlay(marker);
				var msg = this.createInfoWindowHtml(this.infoDataObj);
				marker.openInfoWindowHtml(msg,this.infoOption);
			}
			//
			this.resultData = new Object();
			this.resultData[this.infoDataObj.id] = this.infoDataObj;	//検索結果情報のセット
			this.createResultList(this.infoDataObj);									//検索結果リストのセット
		}
		
		//Event
		GEvent.addListener(this.gmap, "zoomend", function(oldLevel, newLevel) {
				if(gmap2.searchOff_zoomLevel<=newLevel) {
					//検索ボタンOFF
					$(gmap2.searchBtnOnId).style.display = "none";
					$(gmap2.searchBtnOffId).style.display = "block";
				} else {
					//検索ボタンON
					$(gmap2.searchBtnOffId).style.display = "none";
					$(gmap2.searchBtnOnId).style.display = "block";
				}
			}.bind(this)
		);
		
	},
	//GoogleMaps表示領域範囲の緯度経度取得
	getFourLatLng : function() {
		var bounds  = this.gmap.getBounds();	//矩形領域を取得
		var ne      = bounds.getNorthEast();	//矩形領域の北東ポイントを取得
		var sw      = bounds.getSouthWest();	//矩形領域の南西ポイントを取得
		var lat_min = sw.lat();								//最小緯度
		var lat_max = ne.lat();								//最大緯度
		var lng_min = sw.lng();								//最小経度
		var lng_max = ne.lng();								//最大経度
		
		//**test*****************************************************************************//
			var z = $("debug");
			if(z) {
				var e = Math.floor(this.gmap.getCenter().distanceFrom(new GLatLng(lat_max,this.lng))/1000) + "km";
				var f = Math.floor(this.gmap.getCenter().distanceFrom(new GLatLng(this.lat,lng_max))/1000) + "km";
				var g = Math.floor(this.gmap.getCenter().distanceFrom(new GLatLng(lat_max,lng_max))/1000) + "km";
				z.innerHTML  = 'ズームレベル：'+this.gmap.getZoom()+"<br>";
				z.innerHTML += '緯度：'+this.lat+"<br>";
				z.innerHTML += "経度："+this.lng+"<br>";
				z.innerHTML += '最小緯度：'+lat_min+"<br>";
				z.innerHTML += '最大緯度：'+lat_max+"<br>";
				z.innerHTML += '最小経度：'+lng_min+"<br>";
				z.innerHTML += '最大経度：'+lng_max+"<br>";
				z.innerHTML += "中心点からの距離（南北方向）：約 " + e + "<br>";
				z.innerHTML += "中心点からの距離（東西方向）：約 " + f + "<br>";
				z.innerHTML += "中心点からの距離（東北方向）：約 " + g + "<br>";
			}
		//**test*****************************************************************************//
		
		return {
			lat_min:lat_min,
			lat_max:lat_max,
			lng_min:lng_min,
			lng_max:lng_max
		};
	},
	//GoogleMapsマーカー生成
	createMarker : function(obj) {
		//* Check
		var key = (obj.id)? obj.id : "";
		if(key=="") {
			alert("System Error! [Func:createMarker]\nデータIDの取得に失敗...");
			return;
		}
		//* isExist
		if(this.marker[key]) {
			if(this.marker[key].isHidden()) this.marker[key].show();
			return this.marker[key];
		}
		//* Icon
		var icon;
		if(obj.category && this.iconFile[obj.category]) {
			icon = this.createIcon(this.iconFile[obj.category]);
		}
		//* Marker
		var marker;
		if(icon) {
			marker = new GMarker(new GLatLng(obj["lat"],obj["lng"]),{icon:icon,title:obj["title"]});
		} else {
			marker = new GMarker(new GLatLng(obj["lat"],obj["lng"],{title:obj["title"]}));
		}
		GEvent.addListener(marker, "click", function() {
				var msg = this.createInfoWindowHtml(obj);
				marker.openInfoWindowHtml(msg,this.infoOption);
			}.bind(this)
		);
		this.marker[key] = marker;
		return marker;
	},
	//GoogleMapsアイコン生成
	createIcon : function(iconFileName) {
		//* Check
		if(!this.iconPath || !this.icon_width || !this.icon_height || !iconFileName) return false;
		//*
		var path   = this.iconPath + iconFileName;
		var width  = this.icon_width;
		var height = this.icon_height;
		//*
		var icon = new GIcon();
		icon.image = path;
		icon.iconSize = new GSize(width, height);
		icon.iconAnchor = new GPoint(width/2, height);		//アイコンと地図ポイントの位置関係：中央×下
		icon.infoWindowAnchor = new GPoint(width/2, 0);
		return icon;
	},
	//GoogleMaps情報ウィンドウ内HTML生成
	createInfoWindowHtml : function(obj) {
		var html = '';
		if(obj.title)   html += this.infoHtml.title.replace("#TITLE#",obj.title);
		if(obj.address) html += this.infoHtml.address.replace("#ADDRESS#",obj.address);
		if(obj.tel)     html += this.infoHtml.tel.replace("#TEL#",obj.tel);
		if(obj.url)     html += this.infoHtml.url.replace("#URL#",obj.url);
		return html;
	},
	//GoogleMapsマーカー非表示
	hiddenMarker : function(key) {
		if(this.marker[key]) {
			this.marker[key].hide();
		}
	},

	//** Search *******************************************************************************//
	//1:検索クエリー
	doQuery : function( query ) {
		var method = this.s_method;						//メソッド形式（POST/GET）
		var async  = this.s_async;						//非同期通信フラグ(true/false)
		var data   = query;										//引数
		var chache = true;										//キャッシュ無効スイッチ(true/false)
		var xmlhttpobj = createHttpRequest();	//XMLHttpRequestオブジェクト
		var url    = this.s_path;							//URL

		xmlhttpobj.open( method , url , async ); //
		if(method=='POST') {
			xmlhttpobj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		}
		if(chache) {
    	xmlhttpobj.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");		/* キャッシュを見に行かないようにする */
    }
		xmlhttpobj.onreadystatechange = function()	{ 
			if (xmlhttpobj.readyState==4) {
				//if (xmlhttpobj.status == 200) {
					this.getResult(xmlhttpobj);
				//} else {
				//	alert('XMLのロードエラー');
				//}
			}
		}.bind(this);
		xmlhttpobj.send( data );
	},
	//2:結果取得
	getResult : function(obj) {
		var res = obj.responseText;
		if(res!="") {
			eval('var data='+res);
		} else {
			var data = new Object();
		}
		this.resultData = data;
		//
		var listArea = $(this.listArea);
		listArea.innerHTML = "";
		//
		var key,id,marker,result;
		for(key in data) {
			var result = data[key];
			//* マーカー表示
			if(this.marker[key]) {
				this.marker[key].show();
			} else {
				marker = this.createMarker(result);
				if(marker) this.gmap.addOverlay(marker);
			}
			//* 検索結果リスト表示
			this.createResultList(result);
		}
		//
		if(listArea.innerHTML=="") listArea.innerHTML = '<p>該当する情報はありません...</p>';
	},
	//3:結果リスト生成
	createResultList : function(obj) {
		var target = $(this.listArea);
		//* Check
		if(!target) {
			return;
		}
		//
		var data = document.createElement('p');
		data.id = obj.id;
		data.className = this.listNormal;
		var html = '';
		if(this.listIconFile[obj.category]) {
			html += '<img src="'+this.listIconPath+this.listIconFile[obj.category]+'" width="'+this.listIconWidth+'" height="'+this.listIconHeight+'" alt="" style="vertical-align:middle" />&nbsp;';
			//data.style.textIndent = "-" + this.listIconWidth + "px";
			//data.style.marginLeft = this.listIconWidth + 5 + "px";
		}
		html += "<span>"+obj.title+"</span>";
		data.innerHTML = html;
		target.appendChild(data);
		//click event
		data.onclick = function() {
			gmap2.listClickEventListener(this.id);
		};
		data.onmouseover = function() {
			this.className = gmap2.listMsover;
		}
		data.onmouseout = function() {
			this.className = gmap2.listNormal;
		};
	},
	//リスト結果クリックイベント
	listClickEventListener : function(key) {
		if(!this.marker[key] || !this.resultData[key]) {
			alert("System Error! [Func:listClickEventListener]\nマーカー情報の取得に失敗...");
			return;
		}
		this.marker[key].openInfoWindowHtml(this.createInfoWindowHtml(this.resultData[key]),this.info_option);
	},
	//表示範囲内：検索処理
	reSearch : function() {
		//情報ウィンドウ非表示
		gmap2.gmap.closeInfoWindow();
		//全マーカー非表示
		for(var key in gmap2.marker) {
			gmap2.hiddenMarker(key);
		}
		//緯度経度範囲の抽出
		var pointRange = gmap2.getFourLatLng();
		var lat_min = pointRange.lat_min;
		var lat_max = pointRange.lat_max;
		var lng_min = pointRange.lng_min;
		var lng_max = pointRange.lng_max;
		//カテゴリの取得
		var cateArray = new Array();
		var checkbox = document.getElementsByTagName('INPUT');
		var obj;
		for(var i=0;i<checkbox.length;i++) {
			obj = checkbox[i];
			if(obj.type=="checkbox" && obj.name=="category" && obj.checked) cateArray.push(obj.value);
		}
		var sCategory = cateArray.join(",");
		//AJAX処理 -->> PHP
		var query   = "lat_min="+lat_min+"&lat_max="+lat_max+"&lng_min="+lng_min+"&lng_max="+lng_max+"&category="+sCategory;
		gmap2.doQuery(query);
		return false;
	}
}
