/* 
 * GoogleMap関連処理
 */

//<![CDATA[

	//GoogleMAPオブジェクト
	var map;							//Gmapオブジェクト
	var crossMarker;					//中央表示用のマーカー
	var crossIcon = new GIcon();		//中央表示用のアイコン

	var CODE_SUCCESS = "0";
	var ZOOM_THRESHOLD = 12;
	var ICON_NAME = "./img/cross.png";	//中央表示用の画像
	
	var markers = new Array();			//マーカー

	/*
	 * GoogleMap初期化処理
	 */
	function initGMap(mode) { 
	
		//GoogleMap動作判定
		if (GBrowserIsCompatible()) {

			map = new GMap2(document.getElementById("map"));

			//map.setCenter(new GLatLng(36.358921350196255, 139.07278954982758), 13);
			map.setCenter(new GLatLng(36.427927571229624, 139.03196901082993), 10);
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.addControl(new GOverviewMapControl());
			map.addControl(new GScaleControl());

			switch (mode) {
				case "0":		//閲覧モード

					//マウスドラッグイベント定義
					GEvent.addListener(map, "moveend", function() {
						//現在の拡大率を取得
						var nowZoom = map.getZoom();
			
						//拡大値が規定値以上ならマーカー配置
						if (ZOOM_THRESHOLD <= nowZoom) {
							getMarkerData();
						}
					});
	
					//ズームイベント定義
					GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
						//拡大率によるマーカー設置判定(2008/02/04 MIMURA 限定解除)
//						if (newLevel < ZOOM_THRESHOLD ) {
//							eraseMarker();
//						}
//						else {
							getMarkerData();
//						}
					});
	
					//マーカー初期配置
					getMarkerData();
					break;

				case "1":		//投稿モード

					//中央アイコン読み込み
					var crossImg = new Image();
					
					//中央アイコン作成
					crossImg.src = ICON_NAME;
					crossIcon.image = ICON_NAME;
					crossIcon.iconSize = new GSize(crossImg.width, crossImg.height);
					crossIcon.iconAnchor = new GPoint(Math.floor(crossImg.width / 2), Math.floor(crossImg.height / 2));
					crossImg = null;
					
					//中央マーカー作成
					crossMarker = new GMarker(map.getCenter(), crossIcon);
					map.addOverlay(crossMarker);

					GEvent.addListener(map, "move", function () {
						map.removeOverlay(crossMarker);
						crossMarker = new GMarker(map.getCenter(), crossIcon);
						map.addOverlay(crossMarker);
					});

					//マップ上マウスクリックイベント定義
					GEvent.addListener(map, "click", function(overlay, point) {
						//クリック位置にマーカー等が無ければ
						if (!overlay) {
							//クリック位置の座標を表示
							
							var value;
							var deg;
							var min;
							var sec;
							var amari;

							//経度を百分率から時分秒に変換
							value = Math.round(point.x * 360000);
							deg = Math.floor(value / 360000);
							min = Math.floor(value / 6000) % 60;
							sec = Math.floor(value / 100) % 60;
							amari = value % 100;
							document.getElementById("kdo_l").value = deg;
							document.getElementById("kdo_m").value = min;
							document.getElementById("kdo_s").value = sec;
							document.getElementById("kdo_ms").value = amari;
							document.getElementById("kdo").value = point.x;


							//緯度を百分率から時分秒に変換
							value = Math.round(point.y * 360000);
							deg = Math.floor(value / 360000);
							min = Math.floor(value / 6000) % 60;
							sec = Math.floor(value / 100) % 60;
							amari = value % 100;
							document.getElementById("ido_l").value = deg;
							document.getElementById("ido_m").value = min;
							document.getElementById("ido_s").value = sec;
							document.getElementById("ido_ms").value = amari;
							document.getElementById("ido").value = point.y;

						}
					});
					break;				
			}
	
		}
		else {
			//GoogleMap未対応ページへ飛ばす
			location.href = "system.html";
		}
	}

	/*
	 * 画面内のマーカー情報取得処理
	 */
	function getMarkerData () {	
	
		var nowZoom = map.getZoom();
//   2008/02/04 MIMURA 限定解除
//		if (nowZoom < ZOOM_THRESHOLD) return; 

		var bounds;
		var north_east;
		var south_west;

		//表示中の画面座標取得
		bounds = map.getBounds();
		north_east = bounds.getNorthEast();
		south_west = bounds.getSouthWest();
		
		//マーカー情報xml取得
		//var url = './marker.xml';

//   2008/03/25 MIMURA 撮影日
		if (nowZoom >= ZOOM_THRESHOLD){
			var url = './vpimap/VpImap_area.php';
		}else{
			var url = './vpimap/VpImap_area_month.php';
		}


		var callback = {success:setMarkerData, failure:getMarkerErr};
	
		try {
			//表示中のマップの左下、右上角の座標をhiddenにセット
			document.getElementById("map_n1").value = south_west.lat();
			document.getElementById("map_e1").value = south_west.lng();
			document.getElementById("map_n2").value = north_east.lat();
			document.getElementById("map_e2").value = north_east.lng();
			YAHOO.util.Connect.setForm("view")

			//YAHOO.util.Connect.asyncRequest('GET', url, callback);		
			YAHOO.util.Connect.asyncRequest('POST', url, callback);		
		}
		catch (e) {
		}
	}





	/*
	 * マーカーデータ取得通信エラー 
	 */
	function getMarkerErr () {	}


	/*
	 * マーカー詳細情報取得
	 */
	function showDetail (id) {

		//マーカー情報xml取得
		//var url = './detail' + id + '.xml';
		var url = './vpimap/VpImap_getaj.php';
		var callback = {success:setDetail, failure:getDetailErr};
	
		try {
			//投稿データNOをhiddenにセット
			document.getElementById("select_dt").value = id;
			YAHOO.util.Connect.setForm("view")

			//YAHOO.util.Connect.asyncRequest('GET', url, callback);		
			YAHOO.util.Connect.asyncRequest('POST', url, callback);		
		}
		catch (e) {

		}
	}

	/*
	 * 詳細情報取得通信エラー 
	 */
	function getDetailErr () {	}


	/*
	 * 全てのマーカーを削除
	 */
	function eraseMarker () {
		map.clearOverlays();
		markers = null;
		markers = new Array();
	}


	/*
	 * マーカー情報解析＋マーカー設置
	 */
	function setMarkerData (obj) {

		var res = obj.responseXML;
		var xmlDoc = res.documentElement;
		var errCode = xmlDoc.getElementsByTagName("error_code");

		//サーバー処理結果判定
		if (errCode[0].firstChild.nodeValue != CODE_SUCCESS ) {
			eraseMarker();
			return;
		}

		//マーカー情報数チェック
		var dataCount = xmlDoc.getElementsByTagName("data_cnt");
		if (dataCount[0].firstChild.nodeValue == "0") {
			eraseMarker();
			return;
		}

		var datas = xmlDoc.getElementsByTagName("data");
		var ids = xmlDoc.getElementsByTagName("id");
		var dates = xmlDoc.getElementsByTagName("date");
		var xs = xmlDoc.getElementsByTagName("mapx");
		var ys = xmlDoc.getElementsByTagName("mapy");
		var imgs = xmlDoc.getElementsByTagName("marker_img");
		var shadows = xmlDoc.getElementsByTagName("markerShadow_img");
		var makePoint;
		var i;
		var j;
		var newMarkers = new Array();
		var newMarker;
		var count = 0;
		var createFlg = new Array(datas.length);
		var findFlg;
		var eraseCnt = 0;
		var CreateCnt = 0;
		var imgName;
		var ShadowName;

		//表示中のマーカーがあったら
		if (markers.length != 0) {

			//今あるマーカーの「見つかった」フラグを初期化する
			for (i = 0; i < markers.length; i++) {
				markers[i].find = false;
			}

			for (i = 0; i < datas.length; i++) {
				findFlg = false;
				for (j = 0; j < markers.length; j++) {
					//既存のマーカーのIDと新しいマーカー情報のIDが一致するか？
					if (markers[j].d_id == ids[i].firstChild.nodeValue) {
						//見つかったマーカーを退避
						newMarkers[count] = markers[j];
						count++;
						//「見つかった」フラグON
						markers[j].find = true;
						//新規作成フラグOFF
						createFlg[i] = false;
						findFlg = true;
						break;
					}
				}
				//見つからなかった情報には新規作成フラグON
				if ( !findFlg ) {createFlg[i] = true;}
			}
	
			//表示対象外のマーカーを消す
			for (i = 0; i < markers.length; i++) {
				//「見つかった」フラグOFFのものはマップから消す
				if (!markers[i].find) {
					map.removeOverlay(markers[i]);
					eraseCnt++;
				}			
			}
		}
		else {
			//全て作成するフラグを立てる
			for (i = 0; i < createFlg.length; i++) {
				createFlg[i] = true;
			}				
		}

		//新たに表示すべきマーカーを作る
		for (i = 0; i < createFlg.length; i++) {
			//新規作成フラグONのものについてマーカーを作成する
			if (createFlg[i]) {
				if (imgs[i].firstChild) {
					imgName = imgs[i].firstChild.nodeValue;
					ShadowName = shadows[i].firstChild.nodeValue;
				}
				else {
					imgName = "";
					ShadowName = "";
				}
				makePoint = new GLatLng(ys[i].firstChild.nodeValue, xs[i].firstChild.nodeValue);
				newMarker = createMarker(makePoint, ids[i].firstChild.nodeValue, imgName, ShadowName);
				//作成したマーカーを配列に保持
				newMarkers.push(newMarker);
				CreateCnt++;
			}
		}		

		//配列入れ替え
		markers = null;
		markers = newMarkers;

		//alert( "作ったマーカー数:" + CreateCnt + "\n消したマーカー数:" + eraseCnt + "\n総マーカー数:" + markers.length );

	}


	/*
	 * マーカー作成	 
	 */
	function createMarker(point, id, img, shadow) {

		var icon = new GIcon();
		var imgMarker = new Image();
		var imgShadow = new Image();

		if (img != "") {
			//マーカーイメージパスがあれば	

			imgMarker.src = img;
			imgShadow.src = shadow;
			
			//マーカー画像を設定
			icon.image = img;
			icon.shadow = shadow;
			//マーカー画像サイズを設定
			icon.iconSize = new GSize(imgMarker.width, imgMarker.height);
			icon.shadowSize = new GSize(imgShadow.width, imgShadow.height);
			//表示位置オフセット設定
			icon.iconAnchor = new GPoint(Math.floor(imgMarker.width / 2), Math.floor(imgMarker.height / 2));

			imgMarker = null;
			imgshadow = null;

			//マーカー生成
			var marker = new GMarker(point, icon);
		}
		else {
			//マーカー生成
			var marker = new GMarker(point);
		}

		//マーカーオブジェクトの中に詳細情報IDを保持
		marker.d_id = id;
		//マップ上に配置
		map.addOverlay(marker);
		//マーカーのクリックイベント定義
		GEvent.addListener(marker, "click", function () { showMessage(marker); } );
		
		return marker;
	}


	/* 
	 * マーカークリック時に実行される関数
	 */
	function showMessage(marker) {
		//マーカー位置に情報ウィンドウ表示
		showDetail(marker.d_id);
	}


	/*
	 * マーカー詳細表示
	 */
	function setDetail (obj) {

		var res = obj.responseXML;
		var xmlDoc = res.documentElement;

		var errCode = xmlDoc.getElementsByTagName("error_code");

		//サーバー処理結果判定
		if (errCode[0].firstChild.nodeValue != CODE_SUCCESS ) {
			return;
		}

		//各種XML情報取得
		var titles = xmlDoc.getElementsByTagName("title");
		var dates = xmlDoc.getElementsByTagName("date");
		var dirct = xmlDoc.getElementsByTagName("dirct");
		var xs = xmlDoc.getElementsByTagName("mapx");
		var ys = xmlDoc.getElementsByTagName("mapy");
		var txts = xmlDoc.getElementsByTagName("txt");
		var thumbs = xmlDoc.getElementsByTagName("thumb");
		var imgs = xmlDoc.getElementsByTagName("image");
		var links = xmlDoc.getElementsByTagName("link");
		var title;
		var date;
		var img;
		var strHTML;
		var text;

		//情報が取れなかったら終了
		if (titles.length < 1) {
			return;
		}
		if (!titles[0].firstChild) {
			return;
		}

		var nowZoom = map.getZoom();

		//拡大率が規定値未満なら、規定値まで拡大する
		if (nowZoom < ZOOM_THRESHOLD) {
			nowZoom = ZOOM_THRESHOLD;
		}

		//ウィンドウ表示位置をマップの中央に移動
	    map.setCenter(new GLatLng(ys[0].firstChild.nodeValue, xs[0].firstChild.nodeValue), nowZoom);	

		//タイトル編集
		title = "<tr><td align='left'><B>";
		//リンク情報があったらアンカーにする
		if (links[0].firstChild) {
			title += "<a href='" + links[0].firstChild.nodeValue + "' target='_blank'>" + titles[0].firstChild.nodeValue + "</a>"
		}
		else {
			title += titles[0].firstChild.nodeValue;
		}
		title += "</td></tr>";

		img = "<tr><td align='center' style='height:190px'>";
		//サムネイル
		if (thumbs[0].firstChild) {
			//var tmpimg = new Image();

			img += "<a href='" + imgs[0].firstChild.nodeValue + "' target='_blank' ><img src='" 
				+ thumbs[0].firstChild.nodeValue 
				+ "' border='0' /></a><br>"; 

/*
			img = "<a href='" + imgs[0].firstChild.nodeValue + "' target='_blank' ><img src='" 
				+ thumbs[0].firstChild.nodeValue 
				+ "' border='0' width='" + String(tmpimg.width) + "' height='" + String(tmpimg.height) + "' /></a><br>"; 
*/
			//tmpimg = null;
		}
		else {
			img = "";
		}
		img += "</td></tr>";


		//撮影日、撮影方向編集
		date = "<tr><td align='left' style='font-size:10pt;'><font color='#4570f0'>";
		if (dates[0].firstChild) {
			date += "撮影日 " + dates[0].firstChild.nodeValue ;
			date += "&nbsp;&nbsp;";
		}
		//add 2007-08-09 A.Hyodo
		if (dirct[0].firstChild) {
			date += "撮影方向 [" + dirct[0].firstChild.nodeValue + "]";
		}
		date += "</td></tr>"
		
		text = "<tr><td align='left'  style='font-size:10pt;'>";
		if (txts[0].firstChild) {
			text += txts[0].firstChild.nodeValue;
		}
		text += "</td></tr>";


		//HTML文編集
		//strHTML = title + img + date + text;
		strHTML = "<table width='270px' cellpadding=0 cellspacing=4>" + title + img + date + text + "</table>";
		
		//情報ウィンドウを開く
		map.openInfoWindowHtml(map.getCenter(), strHTML);

	}

	function loadImage(img) {
	  checkCount++;
	  /* 画像読み込み完了または一定回数実行後は次の処理へ */
	  if (img.complete || (checkCount > checkCountMax)) {
	    if (img.complete) {
	      window.status = "画像読み込み完了";
	    } else {
	      window.status = "画像読み込み失敗";
	      alert("画像が読み込めませんでした。");
	    }
	    clearInterval(imgTimerID);
	    init2();
	  }
	}

	/*
	 * 時分秒表記の座標を百分率表記に変換
	 */
	function toPer () {

		var x;
		var y;
		var point = new Object();

		//百分率の緯度を求める
		y = parseFloat(document.getElementById("ido_l").value)
		y += parseFloat(document.getElementById("ido_m").value) / 60
		
		//edit 2007-08-02 A.hyodo
		if (document.getElementById("ido_ms").value != "" ) {
			y += (parseFloat(document.getElementById("ido_s").value) + parseFloat(document.getElementById("ido_ms").value) / 100 ) / 3600;
		}else{
			y += parseFloat(document.getElementById("ido_s").value) / 3600;
		}
		
		//百分率の経度を求める
		x = parseFloat(document.getElementById("kdo_l").value)
		x += parseFloat(document.getElementById("kdo_m").value) / 60
		
		//edit 2007-08-02 A.hyodo
		if (document.getElementById("kdo_ms").value != "" ) {
			x += (parseFloat(document.getElementById("kdo_s").value) + parseFloat(document.getElementById("kdo_ms").value) / 100 ) / 3600;
		}else{
			x += parseFloat(document.getElementById("kdo_s").value) / 3600;
		}
		
		//数値チェック Add 2007-08-02 A.hyodo
		if(isNaN(y)){alert("百分率が算出できません。経度を入力しなおしてください。");return null;}
		if(isNaN(x)){alert("百分率が算出できません。緯度を入力しなおしてください。");return null;}

		//オブジェクトとして返す
		point.x = x; 
		point.y = y;
		return point;
		
	}


	/*
	 * 画面の入力座標にマップの中央をあわせる
	 */
	function moveCenter () {

		//座標入力チェック edit 2007-08-02 A.hyodo
		if (!chkRange()) return;

		//百分率座標取得
		var point = toPer();
		if(point ==null ){return;}

		//拡大率取得
		var nowZoom = map.getZoom();

		//マップの中央を移動
		map.setCenter(new GLatLng(point.y , point.x ), nowZoom);

	}

//]]>
