// グローバル変数
var objMap = null;	// マップオブジェクト

// getElementByIdの戻り値
var objDivMap = null;
var objSelPref = null;
var objSelCity = null;
var objSelType = null;
var objSelTop = null;

var objGeocoder = null;
var objMarker = null;


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;
	///他のイベントは、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 text取得
	Select.prototype.getSelectedText = function()
	{
		// 選択されている文字列を返す
		return this.elementSelect.options[this.elementSelect.selectedIndex].text;
	}

	// 選択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;
}





//innerText設定
function fncSetInnerText(objElement, strInnerText)
{
	if (typeof objElement.textContent != "undefined")
	{
		// ねすけ用
		objElement.textContent = strInnerText;
	}
	else
	{
		// IE用
		objElement.innerText = strInnerText;
	}
}

//innerHtml設定
function fncSetInnerHtml(objElement, strInnerHtml)
{
	objElement.innerHTML = strInnerHtml;
		// fncSetInnerTextと違い、意味が無い…
}


// 地図初期化
function fncInitMap()
{
	// map領域divを設定
	objDivMap = $("id_map");

	// form.inputオブジェクト設定
	objSelPref = new Select("id_sel_pref");
	objSelCity = new Select("id_sel_city");
//	objSelType = new Select("id_sel_type");
	objSelTop = new Select("id_sel_top");

	objSelPref.addOption("－－－", -1);
	objSelCity.addOption("－－－", -1);

	// イベント設定
	objSelPref.setOnChange(fncOnSelectPref);
	objSelCity.setOnChange(fncOnSelectCity);
	$("id_btn_geocoding").onclick = fncGeocoding;

	$("id_form").onsubmit = fnc_regist;

	objGeocoder = new GClientGeocoder();


	// 地図設定
	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("建物種別データ受信に失敗しました。");}
			}
		);
*/

	// 直属データ取得開始
	var ojbAjax3 = new Ajax.Request(
		"./php/bldg_search.php?sel_top=0&page_rows=300"
		,{method: "get"
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRecvTop
			, onFailure: function(){alert("直属データ受信に失敗しました。");}
			}
		);

	return;
}

// GMap作成
function fncMakeMap()
{
	objMap = new GMap2(objDivMap);
	objMap.addControl(new GLargeMapControl());	//ズームコントロール大
	objMap.addControl(new GMapTypeControl());	//地図タイプ選択コントロール
	objMap.addControl(new GOverviewMapControl());	//Overview地図コントロール
	objMap.addControl(new GZoomControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5, 280)));	//ドラッグした範囲を拡大するコントロール

	objMap.enableDoubleClickZoom();	//左ダブルクリックでズームイン、右ダブルクリックでズームアウト
	objMap.enableContinuousZoom();	//スムーズにズーム
	objMap.enableScrollWheelZoom();	//ホイールでズーム


	//日本全体を通常の地図で表示
	objMap.setCenter(new GLatLng(35.045519825, 135.074992775), 5, G_NORMAL_MAP);

	// アイコン初期化
	fncInitIcon();
}


// 都道府県データ受信イベント
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 fncOnRecvTop(objReq)
{
	//jsonデータを建物種別配列に変換
	var aryType = JSON.parse(objReq.responseText);

	for( var i=0; i < aryType.length; i++ )
	{
		// 都道府県名と、都道府県配列オブジェクトのインデックスを設定
		objSelTop.addOption(aryType[i][0] + " " + aryType[i][3], aryType[i][9]);
	}
}

// アイコン初期化
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 fncMakeIcon(baseIcon, uriImage)
{
	var icon = new GIcon(baseIcon);
	icon.image = uriImage;
	icon.transparent = uriImage;

	return icon;
}


// 都道府県設定
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);

	// 住所入力を無効に
	$("id_txt_address").disabled = true;
	$("id_btn_geocoding").disabled = true;

	// 位置も初期化
	objMap.clearOverlays();
	objMarker = null;
	$("id_txt_lat").value = "";
	$("id_txt_lng").value = "";

	if(intPrefCode == -1)
	{
		// 未選択の場合、全国表示に
		fncSetPref()
		return;
	}

	// 市区町村データ取得
	var ojbAjax = new Ajax.Request(
		"./php/city.php"
		,{method: "get"
			, parameters: ("pref=" + intPrefCode + "&all_city=1")
//			, 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();

	// 位置も初期化
	objMap.clearOverlays();
	objMarker = null;
	$("id_txt_lat").value = "";
	$("id_txt_lng").value = "";

	if(intCityCode == -1)
	{
		// 未選択の場合、都道府県選択に
		$("id_txt_address").disabled = true;
	$("id_btn_geocoding").disabled = true;
		fncOnSelectPref();
		return;
	}

	// 住所入力を有効に
	$("id_txt_address").disabled = false;
	$("id_btn_geocoding").disabled = false;

	return;
}

// 位置検索ボタン クリックイベント処理
function fncGeocoding()
{
	if(!objGeocoder)
	{
		return;
	}

	if($F("id_txt_address").length <= 0)
	{
		$("id_txt_address").focus();
		alert("住所を入力してください。");
		return;
	}

	var strAddress = objSelPref.getSelectedText() + objSelCity.getSelectedText() + $F("id_txt_address");


/*
	objGeocoder.getLatLng(
		strAddress
		,function( objPoint ) {
			if(!objPoint)
			{
				alert(strAddress +
				" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002");
			}
			else
			{
				// 地図を初期化して、位置を移動
				objMap.clearOverlays();
				objMap.setCenter(objPoint, 13);

				// ドラッグできるマーカーを置く
				objMarker = new GMarker(objPoint, {draggable:true});
				objMap.addOverlay(objMarker);
			}
		}
	);
*/

// http://ido.nu/kuma/2006/06/13/using-google-maps-api-gclientgeocodergetlocations/
// http://www.tatamilab.jp/rnd/archives/000219.html
	objGeocoder.getLocations(
		strAddress
		,function(objLoc){

			if( objLoc.Status.code != G_GEO_SUCCESS || objLoc.Placemark.length <= 0)
			{
				// 住所が分からない、または結果が無い(?)場合、エラー
				/// http://www.google.com/apis/maps/documentation/reference.html#GGeoStatusCode
				alert("住所を認識できません。(" + objLoc.Status.code + ")\n" +  objLoc.name);
				return;
			}

			//とりあえず、最初の結果を使用
			var objPlace = objLoc.Placemark[0];
/*
	// http://www.google.com/apis/maps/documentation/#Geocoding_Structured
			alert(objPlace.address);	// 国名付き住所

			alert(objPlace.AddressDetails.Country.CountryNameCode);	// 国コード
			alert(objPlace.AddressDetails.Country.AdministrativeArea);
			alert(objPlace.AddressDetails.Accuracy);

			alert(objPlace.AddressDetails.Country.AddressLine[0]);	// 国名無し住所
			alert(objPlace.Point.coordinates[0] + " , " + objPlace.Point.coordinates[1] + " , " + objPlace.Point.coordinates[2]);
*/

			var objPoint = new GLatLng(objPlace.Point.coordinates[1], objPlace.Point.coordinates[0]);

			objMap.clearOverlays();
			objMap.setCenter(objPoint, 13);
			objMap.savePosition();

			// ドラッグできるマーカーを置く
			objMarker = new GMarker(objPoint, {draggable:true});
			objMap.addOverlay(objMarker);

			test = GEvent.addListener(objMarker, 'dragend'
					, function(){
						var objPoint = objMarker.getPoint();
						$("id_txt_lat").value = objPoint.lat();
						$("id_txt_lng").value = objPoint.lng();

						objMap.panTo(objPoint);
						objMap.savePosition();
			    	}
				); 

			$("id_txt_lat").value = objPoint.lat();
			$("id_txt_lng").value = objPoint.lng();
		}
	);

}


// 登録処理
/// 常にfalseを返して、submitは実行させない。
function fnc_regist()
{
	if($F("id_txt_bldg_name").length <= 0)
	{
		$("id_txt_bldg_name").focus();
		alert("教会名を入力してください。");
		return false;
	}

	if($F("id_sel_pref") <= 0)
	{
		$("id_sel_pref").focus();
		alert("都道府県を選択してください。");
		return false;
	}

	if($F("id_sel_city") <= 0)
	{
		$("id_sel_city").focus();
		alert("市区町村を選択してください。");
		return false;
	}

	if($F("id_txt_address").length <= 0)
	{
		$("id_txt_address").focus();
		alert("住所を入力してください。");
		return false;
	}

	if(objMarker == null)
	{
		$("id_btn_geocoding").focus();
		alert("緯度経度検索ボタンを押して、位置を特定してください。");
		return false;
	}

	if(objMap.getZoom() < objMap.getCurrentMapType().getMaximumResolution())
	{
		alert("地図を一番詳細まで拡大して、位置を確認してください。\nとりあえず、一段階詳細にします。");
		objMap.zoomIn();
		return false;
			// getMaximumResolutionは最大のズームを返さない場合もあるようですが…
	}

	if($F("id_txt_register_name").length <= 0)
	{
		$("id_txt_register_name").focus();
		alert("あなたの名前を入力してください。");
		return false;
	}

	if($F("id_txt_mail").length <= 0)
	{
		$("id_txt_mail").focus();
		alert("あなたのメールアドレスを入力してください。");
		return false;
	}


	if(!confirm("この情報を登録申請してよろしいでしょうか?"))
	{
		return false;
	}


	// ボタンを無効に
	$("id_submit").disabled = true;

	// 緯度経度がdisabledだと、データが送信されないので有効に
	/// 前は大丈夫だったのに、今のブラウザでは対応しないと…
	$("id_txt_lat").disabled = false;
	$("id_txt_lng").disabled = false;


	// 登録処理実行
	var ojbAjax = new Ajax.Request(
		"./php/bldg_regist.php"
		,{method: "get"
			, parameters: Form.serialize("id_form")
//			, onComplete: function(){alert("onComplete");}
			, onSuccess: fncOnRegistResult
			, onFailure: function(){alert("登録処理に失敗しました。");}
			}
		);

	//GoogleAnalyticsに登録
	if(typeof urchinTracker == "function")	// 関数urchinTrackerが定義されている場合だけ実行
	{
		urchinTracker("/maps/php/bldg_regist.php");
	}

	// 緯度経度をdisabledに戻す。
	$("id_txt_lat").disabled = true;
	$("id_txt_lng").disabled = true;

	return false;
}

// 登録処理結果受信イベント
function fncOnRegistResult(objReq)
{
	alert("登録申請を受付けました。\n登録まで少々お待ちください。");

	// リロードで初期化
	/// リセットしないと、テキストボックスの内容がそのままなので…
	/// 手抜きやね…
	$("id_form").reset();
	$("id_submit").disabled = false;	//これも元に戻さないと…
	location.reload();
}

