// グローバル変数
var objMap = null;	// マップオブジェクト

// getElementByIdの戻り値
var objDivMap = null;
var objDivList = null;
var objSelPref = null;
var objSelCity = null;
var objSelType = null;

var aryMarker = null;	//建物Marker配列

var aryPref = null;	// 都道府県配列

var iconHon = null;	// 本部関連アイコン
var iconCho = null;	// 教務支庁アイコン
var iconDai = null;	// 大教会アイコン
var iconBun = null;	// 分教会アイコン
var iconFu = null;	// 布教所アイコン
var iconTume = null;	// 詰所アイコン
var iconIe = null;	// 布教の家アイコン
var iconOther = null;	// その他アイコン

// onloadイベント設定
window.onload = fncInitMap;
// onunloadイベント設定
window.onunload = GUnload;
// リサイズイベント設定
window.onresize = fncResizeMap;
	///他のイベントは、onloadイベントで設定。


// GMapにメソッド追加

// 必要な範囲から最適な縮尺中心を設定
GMap2.prototype.centerAndZoomOnBounds = function(boundsLatLon)
{
	//boundsLatLonの中心を取得
	var center = new GLatLng(
		(boundsLatLon.getNorthEast().lat() + boundsLatLon.getSouthWest().lat())/2
		,(boundsLatLon.getNorthEast().lng() + boundsLatLon.getSouthWest().lng())/2
		);

	//boundsLatLonが収まるズームのサイズを取得
	var zoom = this.getBoundsZoomLevel(boundsLatLon);
		///端に余裕を持たせるため、boundsLatLonを少し拡張してもよいかもしれない

	//中心とサイズを変更
	this.setCenter(center, zoom);

	return;
}


// スクリプト処理マーカー追加
GMap2.prototype.fncAddMarkerScript = function(latlng, icon, strScript)
{
	// マーカー作成
	var marker = new GMarker(latlng, icon);

	// マーカークリック時の処理を設定
	GEvent.addListener(marker, "click", function(){ eval(strScript); });

	// 地図に設定
	this.addOverlay(marker);

	return marker;
}

// バルーン表示マーカー追加
GMap2.prototype.fncAddMarkerBalloon = function(point, icon, strHtml)
{
	// マーカー作成
	var marker = new GMarker(point, icon);

	// マーカークリック時のバルーン表示を設定
	GEvent.addListener(marker, "click", function(){ marker.openInfoWindowHtml(strHtml); });

	// 地図に設定
	this.addOverlay(marker);

	return marker;
}

// バルーン表示マーカー追加
GMap2.prototype.fncAddMarkerBalloon2 = function(point, icon, strHtmlScript)
{
	// マーカー作成
	var marker = new GMarker(point, icon);

	// マーカークリック時のバルーン表示を設定
	GEvent.addListener(marker, "click", function(){ marker.openInfoWindowHtml(eval(strHtmlScript)); });

	// 地図に設定
	this.addOverlay(marker);

	return;
}


// Form Select処理クラス
function Select(strId)
{
	this.aryLatLng = new Array();

	// コンストラクタメイン処理
	/// SelectElement設定
	this.elementSelect = $(strId);
		///コンストラクタの終わりのreturn this;は、全メソッドを設定した後


	//メソッド設定

	// 全Option削除
	Select.prototype.clearOptions = function()
	{
		this.elementSelect.options.length = 0;

		this.aryLatLng = new Array();
	}

	// 初期化
	/// この処理専用です…
	Select.prototype.initOptions = function()
	{
		this.elementSelect.options.length = 1;

		this.aryLatLng = new Array();
		this.aryLatLng.push(null);
	}

	// Option追加
	Select.prototype.addOption = function(text, value)
	{
		var intLastIndex = this.elementSelect.options.length++;

		this.elementSelect.options[intLastIndex].text = text;
		this.elementSelect.options[intLastIndex].value = value;
	}

	// Option数取得
	Select.prototype.getOptionsCount = function()
	{
		return this.elementSelect.options.length;
	}

	// Option index指定選択
	Select.prototype.setSelectedIndex = function(index)
	{
		this.elementSelect.selectedIndex = index;
	}

	// Option 選択済みindex取得
	Select.prototype.getSelectedIndex = function()
	{
		// 選択されているインデックスを返す
		return this.elementSelect.selectedIndex;
	}

	// Option value指定選択
	Select.prototype.setSelectedValue = function(value)
	{
		var objOpts = this.elementSelect.options;

		for(var i=0; i<objOpts.length; i++)
		{
			if(objOpts[i].value == value)
			{
				// 最初に一致したvalueを選択し、indexを返す
				this.elementSelect.selectedIndex = i;
				return i;
			}
		}
		// 見つかんなかったので、nullを返す。
		return null;
	}

	// Option value取得
	Select.prototype.getSelectedValue = function()
	{
		return $F(this.elementSelect.id);
	}

	// 選択Optionに対応するGPoint取得
	Select.prototype.getLatLng = function()
	{
		var objOpts = this.elementSelect.options;

		if(objOpts.length <= 0)
			//なにも選択というか、設定すらされていないので、nullを返す
			return null;

		//選択されているvalueを返す。
		return this.aryLatLng[this.elementSelect.selectedIndex];
	}

	// disabled設定
	Select.prototype.setDisabled = function(disabled)
	{
		this.elementSelect.disabled = disabled;
	}

	// disabled取得
	Select.prototype.getDisabled = function()
	{
		return this.elementSelect.disabled;
	}

	// 全選択
	Select.prototype.setAllSelect = function()
	{
		var objOpts = this.elementSelect.options;

		for(var i=0; i<objOpts.length; i++)
		{
			objOpts[i].selected = true;
		}
		// 選択数を返す
		return objOpts.length;
	}

	//changeイベント処理関数設定
	Select.prototype.setOnChange = function(fnc)
	{
		this.elementSelect.onchange = fnc;
	}


	// コンストラクタ終わり
	return this;
}


// 地図初期化
function fncInitMap()
{
	// map領域divを設定
	objDivMap = $("id_map");
	objDivList = $("id_list");

	// form.inputオブジェクト設定
	objSelPref = new Select("id_sel_pref");
	objSelCity = new Select("id_sel_city");
	objSelType = new Select("id_sel_type");

	objSelPref.addOption("－－－", -1);
	objSelCity.addOption("－－－", -1);

	// イベント設定
	objSelPref.setOnChange(fncOnSelectPref);
	objSelCity.setOnChange(fncOnSelectCity);
	$("id_form").onsubmit = fncOnSubmit;


	// 地図領域のサイズを最適化?
	fncResizeMap();

	// 地図設定
	fncMakeMap();

	// 都道府県データ取得開始
	var ojbAjax1 = new Ajax.Request(
		"./php/pref.php"
		,{method: "get"
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRecvPref
			, onFailure: function(){alert("都道府県データ受信に失敗しました。");}
			}
		);

	// 建物種別データ取得開始
	var ojbAjax2 = new Ajax.Request(
		"./php/bldg_type.php"
		,{method: "get"
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRecvBType
			, onFailure: function(){alert("建物種別データ受信に失敗しました。");}
			}
		);

	return;
}

// GMap作成
function fncMakeMap()
{
	objMap = new GMap2(objDivMap);
	objMap.addControl(new GLargeMapControl());	//ズームコントロール大
	objMap.addControl(new GOverviewMapControl());	//Overview地図コントロール
	objMap.addControl(new GZoomControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5, 290)));	//ドラッグした範囲を拡大するコントロール

//	objMap.addControl(new GMapTypeControl());	//地図タイプ選択コントロール
	addMapTypeControl(objMap);

	objChkStView = new CheckboxStreetviewControl();	//ストリートビューチェックボックス
	objMap.addControl(objChkStView);


	objMap.enableDoubleClickZoom();	//左ダブルクリックでズームイン、右ダブルクリックでズームアウト
	objMap.enableContinuousZoom();	//スムーズにズーム
	objMap.enableScrollWheelZoom();	//ホイールでズーム


	//日本全体を通常の地図で表示
	objMap.setCenter(new GLatLng(35.045519825, 135.074992775), 5, G_NORMAL_MAP);


	// アイコン初期化
	fncInitIcon();
}

//地図タイプいろいろコントロール
function addMapTypeControl(objMap)
{
	//地形+地名を定義
	var G_HYBRID_PHYSICAL_MAP = new GMapType(
		[G_PHYSICAL_MAP.getTileLayers() [0], G_HYBRID_MAP.getTileLayers() [1]]
		, G_NORMAL_MAP.getProjection()
		, "Hybrid Physical"
		);

	//地図タイプに地形を追加
	objMap.addMapType(G_PHYSICAL_MAP);
	//地図タイプに地形+地名を追加
	objMap.addMapType(G_HYBRID_PHYSICAL_MAP);


	//プルダウンのコントロール部品を追加
	var objCtrl = new GHierarchicalMapTypeControl();
	objCtrl.clearRelationships();

	///衛星の下に、地名付き衛星を
	objCtrl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP,"地名を表示", false);	//衛星に地名表示のプルダウンを
	///地形の下に、地名付き地形を
	objCtrl.addRelationship(G_PHYSICAL_MAP, G_HYBRID_PHYSICAL_MAP, "地名を表示", false);	//地形に地名表示のプルダウンを

	///プルダウン付きを追加
	objMap.addControl(objCtrl); 
}

// 検索ボタン押下イベント
function fncOnSubmit()
{
	//GoogleAnalyticsに検索ワードだけを登録
	if(typeof urchinTracker == "function")	// 関数urchinTrackerが定義されている場合だけ実行
	{
		urchinTracker("/maps/php/bldg_search.php?" + Form.Element.serialize("id_txt_name") );
	}

	fncPageChange(0);
	return false;
}

// ページ遷移
/// submitボタンでなく、ページ遷移で、改めてForm.serialize("id_form")を取得するのは手抜き…
function fncPageChange(intPageNum)
{
	// リストクリア
	fncSetInnerHtml(objDivList, "");
	// マーカークリア
	objMap.clearOverlays();

	// ストリートビュー、人形アイコンが設定されていれば、
	if(objStViewOl)
		objMap.addOverlay(objStViewOl);
	if(objMarkerStv)
		objMap.addOverlay(objMarkerStv);


	//ページ初期化
	$("id_page_num").value = intPageNum;


	// 建物データ取得開始
	var ojbAjax = new Ajax.Request(
		"./php/bldg_search.php"
		,{method: "get"
			, parameters: Form.serialize("id_form")
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRecvBldg
			, onFailure: function(){alert("建物データ受信に失敗しました。");}
			}
		);

}

// 都道府県データ受信イベント
function fncOnRecvPref(objReq)
{
	//jsonデータを都道府県配列に変換
	aryPref = JSON.parse(objReq.responseText);

	// 都道府県データ設定
	fncSetPref();
}

// 建物種別データ受信イベント
function fncOnRecvBType(objReq)
{
	//jsonデータを建物種別配列に変換
	var aryType = JSON.parse(objReq.responseText);

	for( var i=0; i < aryType.length; i++ )
	{
		// 都道府県名と、都道府県配列オブジェクトのインデックスを設定
		objSelType.addOption(aryType[i][1], aryType[i][0]);
	}
	objSelType.setAllSelect();
}

// アイコン初期化
function fncInitIcon()
{
	//ベース作成
	var baseIcon = new GIcon();
	baseIcon.shadow = "icon/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);

	// アイコン作成
	iconHon = fncMakeIcon(baseIcon, "icon/icon_hon.png");	// 本部関連アイコン
	iconCho = fncMakeIcon(baseIcon, "icon/icon_cho.png");	// 教務支庁アイコン
	iconDai = fncMakeIcon(baseIcon, "icon/icon_dai.png");	// 大教会アイコン
	iconBun = fncMakeIcon(baseIcon, "icon/icon_bun.png");	// 分教会アイコン
	iconFu = fncMakeIcon(baseIcon, "icon/icon_fu.png");	// 布教所アイコン
	iconTume = fncMakeIcon(baseIcon, "icon/icon_tume.png");	// 詰所アイコン
	iconIe = fncMakeIcon(baseIcon, "icon/icon_ie.png");	// 布教の家アイコン
	iconOther = fncMakeIcon(baseIcon, "icon/iconb.png");	// その他アイコン
}

// 地図をリサイズ
function fncResizeMap()
{
	// 幅は勝手に変わるので、高さだけ変更。
	// 初期サイズの倍より大きくなるあたりで、描画が更新されないけど気にしない。
	var intHeight = 0;
	var intWidth = 0;
	if(window.self && self.innerHeight)
	{
		// ねすけ用
		intHeight = self.innerHeight;
		intWidth = self.innerWidth;
	}
	else if(document.documentElement && document.documentElement.clientHeight)
	{
		// IE用
		intHeight = document.documentElement.clientHeight;
		intWidth = document.documentElement.clientWidth;
	}

	intHeight -= 70;
	if(intHeight >= 0)
	{
		objDivMap.style.height = intHeight + "px";
		objDivList.style.height = (intHeight-220) + "px";
	}

	intWidth -= 220;
	if(intWidth <= 300) intWidth = 300;
	objDivMap.style.width = intWidth + "px";

	return;
}

// 都道府県設定
function fncSetPref()
{
	// 都道府県プルダウン初期化
	objSelPref.initOptions();

	for( var i=0; i < aryPref.length; i++ )
	{
		// 都道府県名と、都道府県配列オブジェクトのインデックスを設定
		objSelPref.addOption(aryPref[i][1], aryPref[i][0]);
	}

	return;
}

// 都道府県選択イベント処理
function fncOnSelectPref()
{
	// 都道府県コードを取得
	var intPrefCode = objSelPref.getSelectedValue();

	// 市区町村プルダウン初期化
	objSelCity.initOptions();
	// 市区町村データを受信して設定が終わるまで無効
	objSelCity.setDisabled(true);

	if(intPrefCode == -1)
	{
		// 未選択の場合、全国表示に
		fncSetPref()
		return;
	}

	// 市区町村データ取得
	var ojbAjax = new Ajax.Request(
		"./php/city.php"
		,{method: "get"
			, parameters: ("pref=" + intPrefCode)
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRecvCity
			, onFailure: function(){alert("市区町村データ受信に失敗しました。");}
			}
		);
}

//市区町村受信イベント
function fncOnRecvCity(objReq)
{
	// jsonデータを配列に変換
	var aryCity = JSON.parse(objReq.responseText);

	// 市区町村連想配列を回す
	for( var i=0; i < aryCity.length; i++ )
	{
		//市区町村セレクト設定
		objSelCity.addOption(aryCity[i][1], aryCity[i][0]);
	}

	//市区町村プルダウンを有効
	objSelCity.setDisabled(false);

	return;
}

// 市区町村選択イベント処理
function fncOnSelectCity()
{
	// 市区町村コードを取得
	var intCityCode = objSelCity.getSelectedValue();

	if(intCityCode == -1)
	{
		// 未選択の場合、都道府県選択に
		fncOnSelectPref();
		return;
	}

	return;
}

//建物データ受信イベント
function fncOnRecvBldg(objReq)
{
	// リストクリア
	var strList = "";
	fncSetInnerHtml(objDivList, strList);

	// マーカークリア
	objMap.clearOverlays();

	// ストリートビュー、人形アイコンが設定されていれば、
	if(objStViewOl)
		objMap.addOverlay(objStViewOl);
	if(objMarkerStv)
		objMap.addOverlay(objMarkerStv);


	// 件数を取得
	var intRowCnt = parseInt(objReq.getResponseHeader("x-row-count"));
	var intPageNum = parseInt(objReq.getResponseHeader("x-page-num"));
	var intPageRows = parseInt(objReq.getResponseHeader("x-page-rows"));

	var intRowPosStart = (intPageRows * intPageNum) + 1;
	var intRowPosLast = intPageRows * (intPageNum +1);
	if(intRowPosLast > intRowCnt)
	{
		intRowPosLast = intRowCnt;
	}

	var strPageInfo = intRowCnt + "件中　" + intRowPosStart + "-" + intRowPosLast + "件目";
	strPageInfo = strPageInfo + "<br>";

	if(intPageNum > 0)
	{
		strPageInfo = strPageInfo + "<a href='javascript:fncPageChange(" + (intPageNum -1).toString() + ")'>前へ</a>";
	}
	if(intRowPosLast < intRowCnt)
	{
		strPageInfo = strPageInfo + "　<a href='javascript:fncPageChange(" + (intPageNum +1).toString() + ")'>次へ</a>";
	}

	fncSetInnerHtml($("id_page_info"), strPageInfo);


	// jsonデータを配列に変換
	var aryBldg = JSON.parse(objReq.responseText);
	if(aryBldg.length == 0)
	{
		alert("条件に一致するデータが見つかりませんでした。");
		return;
	}


	// マーカーの範囲初期化
	var bounds = new GLatLngBounds();

	var intMarkerNum = 0;
	aryMarker = new Array();

	// 教会連想配列を回す
	for( var i=0; i < aryBldg.length; i++ )
	{
		if(aryBldg[i].length != 10)
			continue;

		/// マーカー追加
		var objLatLng = new GLatLng(aryBldg[i][7], aryBldg[i][8]);
		var strHtml = fncGetBalloonHtml(aryBldg[i]);
		aryMarker[intMarkerNum] = objMap.fncAddMarkerBalloon(objLatLng, fncGetIcon(aryBldg[i][1]), strHtml);

		/// マーカーの範囲に追加
		bounds.extend(objLatLng);


		///一覧用データ設定
		strList += "<a href='javascript:fncTriggerClickMarker(" + intMarkerNum.toString() + ");'>"
			+ fncGetBldgName(aryBldg[i]) + "</a><br>";

		intMarkerNum++;
	}

	// 位置と縮尺指定
	objMap.centerAndZoomOnBounds(bounds);

	// 市区町村の現在位置を保存
	objMap.savePosition();

	// リスト設定
	fncSetInnerHtml(objDivList, strList);

	return;
}

// 建物マーカークリックイベント発生
function fncTriggerClickMarker(intIndexAryBldg)
{
	GEvent.trigger(aryMarker[intIndexAryBldg], 'click');
}

// 建物名称取得
function fncGetBldgName(aryBldg)
{
	// 名称設定
	var strName = aryBldg[0] 
	if(aryBldg[2] != 0)
		strName += " " + aryBldg[3];

	return strName;
}

// マーカークリック時のバルーンhtml
function fncGetBalloonHtml(aryBldg)
{
	var strHtml = "";

	// 名称設定
	strHtml += "<span style='font-weight: bold;'>";
	strHtml += fncGetBldgName(aryBldg);
	strHtml += "</span><br>";

	// 住所設定
	strHtml += aryBldg[4];	//都道府県
	strHtml += aryBldg[5];	//市区町村
	strHtml += aryBldg[6];	//住所

	return strHtml;
}

// 教会アイコン取得
function fncGetIcon(intBldgType)
{
	switch(intBldgType)
	{
		case 0:	//本部施設
			return iconHon;
		case 10:	//大教会
			return iconDai;
		case 11:	//分教会
			return iconBun;
		case 12:	//布教所
			return iconFu;
		case 20:	//教務支庁
			return iconCho;
		case 30:	//詰所
			return iconTume;
		case 31:	//布教の家
			return iconIe;
		default:
			return iconOther;
	}
}

