﻿//<![CDATA[

//---------------------------------------------------------------------------------------------------
//-- グローバル定数
//---------------------------------------------------------------------------------------------------


//---------------------------------------------------------------------------------------------------
//-- グローバル変数
//---------------------------------------------------------------------------------------------------
var map;						// mapオブジェクト
var ovc;						// GOverviewMap
//var centerIcon;					// 中心十字アイコンオブジェクト
//var centerMarker;				// 中心十字マーカーオブジェクト
var items = new Array();		// データ配列オブジェクト
var tooltip;

//---------------------------------------------------------------------------------------------------
//-- Google Maps API に関する共通関数
//---------------------------------------------------------------------------------------------------

	// --------------------------------------------------------------------------
	// □ブラウザチェック
	// 　Google Maps API-GBrowserIsCompatibleメソッドが読み込めるかどうかで判定し
	// 　msgArea引数が指定されていれば指定要素に、そうでなければ画面遷移する。
	// --------------------------------------------------------------------------
	function CheckBrowser(msgArea){
		var invalidPage = "GMapInvalid.html";
		var msgLbl;
		if (msgArea!=null && msgArea){ msgLbl = document.getElementById(msgArea); }

		if (typeof(GBrowserIsCompatible) == "undifined"){
			// インターネットに接続していないか、GoogleAPIが読み込まれない
			if (msgLbl){msgLbl.innerHTML = "インターネットに接続されていないか、APIが読み込めません。";}
			else {window.location.href = "GMapInvalid.html";}
			return false;
		}
		else if (!GBrowserIsCompatible()){
			// GoogleMapsAPIを利用不可能なブラウザ
			if (msgLbl){msgLbl.innerHTML = "この環境ではマップを使用することはできません。";}
			else {window.location.href = "GMapInvalid.html";}
			return false;
		}
		else
		{
			// 正常時
			if (msgLbl){msgLbl.innerHTML = "読み込み中…";}
			return true;
		}
	}

	function GMapControlUnload(){
	    map = null;
	    ovc = null;
	    items = null;
	    tooltip = null;
        GUnload(); 
	}

	// --------------------------------------------------------------------------
	// □マップ初期化
	// 　グローバル変数に設定された情報より地図の基本的設定を行う
	// --------------------------------------------------------------------------
	function GMapControlInit(){
		if (!html_id_googlemap || !document.getElementById(html_id_googlemap)){return false;}

		map = new GMap2( document.getElementById( html_id_googlemap ) );

		// パン・ズームコントロールの表示
		if (gmap_control_mapcontrol=="L"){ map.addControl( new GLargeMapControl() ); }
		if (gmap_control_mapcontrol=="S"){ map.addControl( new GSmallMapControl() ); }
		if (gmap_control_mapcontrol=="Z"){ map.addControl( new GSmallZoomControl() ); }
		// マップタイプコントロール
		if (gmap_control_typecontrol){ map.addControl( new GMapTypeControl() ); }
		// 尺度コントロール
		if (gmap_control_scalecontrol){ map.addControl( new GScaleControl() ); }
		// 概観コントロール
		if (gmap_control_oviewsize==null){ ovc = new GOverviewMapControl(); }
		else							 { ovc = new GOverviewMapControl(gmap_control_oviewsize); }
		if (gmap_control_oviewcontrol){ map.addControl( ovc ); }

		// 初期表示位置の設定
		var defaultPoint;
		defaultPoint = new GLatLng(map_default_latPoint,map_default_lonPoint);
		map.setCenter(defaultPoint, map_default_zoomLevel);

		if (gmap_control_maptype=="H" && isHybridMap()){ map.setMapType(G_HYBRID_TYPE); }
		if (gmap_control_maptype=="S"){ map.setMapType(G_SATELLITE_MAP); }

		// 拡張キーボードハンドリング
		if (gmap_keyboradhandle){ new GKeyboardHandlerExt(html_id_documentbody); }
		
		if (gmap_control_alwaysShow==false){
			map.hideControls();
			GEvent.addListener(map,'mouseover',function(){ map.showControls(); });
			GEvent.addListener(map,'mouseout', function(){ map.hideControls(); });			
		}
		// ダブルクリックズーム
		if ((typeof(map_doubleclickzoom)!='undefined')&&(map_doubleclickzoom==true)){
			map.enableDoubleClickZoom();
		}
		// アニメーションズーム
		if ((typeof(map_animatezoom)!='undefined')&&(map_animatezoom==true)){
			map.enableContinuousZoom();
		}

		// ツールチップ		
		tooltip = document.createElement("div");
		map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
		tooltip.style.visibility="hidden";

		return true;
	}

/* ＜未使用＞
	function CreateCenterMarker(img,shadow,imgW,imgH,shadowW,shadowH,anchorX,anchorY,winanchorX,winanchorY){
		centerIcon = new GIcon();
		centerIcon.image = img;
		centerIcon.iconSize = new GSize(imgW,imgH);

		if (shadow!=null){ 
			centerIcon.shadow = shadow; 
			centerIcon.shadowSize = new GSize(shadowW,shadowH);
		}
		if (anchorX==null){ anchorX = Math.floor(imgW / 2 ); }
		if (anchorY==null){ anchorY = Math.floor(imgH / 2 ); }

		centerIcon.iconAnchor = new GPoint(anchorX, anchorY);
		centerMarker = new GMarker(map.getCenterLatLng(),centerIcon);
		map.addOverlay(centerMarker);

		GEvent.addListener(map, 'moveend', Map_MoveEndHandler);
	}

	function RemoveCenterMarker(){
		if (centerMarker!=null && !centerMarker){
			map.removeOverlay(centerMarker);
		}
	}
	
	function Map_MoveEndHandler(){
		// 中心アイコンの再表示
		map.removeOverlay(centerMarker);
		centerMarker = new GMarker(map.getCenterLatLng(),centerIcon);	
		map.addOverlay(centerMarker);
	}
*/

	// --------------------------------------------------------------------------
	// □マーカーオブジェクト生成
	// 　指定ポイントに表示するマーカーオブジェクトを生成し返す。
	// 　html引数が指定されている場合は情報ウィンドウを表示するイベントを割り当てる。
	// --------------------------------------------------------------------------
	function createDataMarkerHTML(pointX,pointY,html,tipHTML,icon,infoMaxUrl){
		var newMarker;
		if (icon!=null){ 
		var point = new GPoint(pointX,pointY);
		newMarker = new GMarker(point,icon);
		 }
		else           { newMarker = new GMarker(new GPoint(pointX,pointY)); }
		if (html!=null && html!=''){
			GEvent.addListener(newMarker,"click",function(){
			    newMarker.openInfoWindowHtml(html);
			});
		}
		if (tipHTML!=null && tipHTML!=''){
			newMarker.tooltip = tipHTML;
			GEvent.addListener(newMarker,"mouseover",function(){
				showTooltip(newMarker);
			});
			GEvent.addListener(newMarker,"mouseout",function(){
				tooltip.style.visibility='hidden';
			});
		}
		
		return newMarker;
	}

	function createDataMarkerTabHTML(pointX,pointY,tabs,tipHTML,icon,infoMaxUrl){
		var newMarker;
		if (icon!=null){ newMarker = new GMarker(new GPoint(pointX,pointY),icon); }
		if (tabs!=null && tabs!=''){
			GEvent.addListener(newMarker,"click",function(){
		        if (infoMaxUrl!=null && infoMaxUrl!=''){
        		    newMarker.openInfoWindowTabsHtml(tabs,{maxUrl:infoMaxUrl})
		        }else{
				    newMarker.openInfoWindowTabsHtml(tabs);
				}
			});
		}
		if (tipHTML!=null && tipHTML!=''){
			newMarker.tooltip = tipHTML;
			GEvent.addListener(newMarker,"mouseover",function(){
				showTooltip(newMarker);
			});
			GEvent.addListener(newMarker,"mouseout",function(){
				tooltip.style.visibility='hidden';
			});
		}
		
		return newMarker;
	}

	function showTooltip(marker){
		tooltip.innerHTML = marker.tooltip;
		var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
		var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
		var anchor=marker.getIcon().iconAnchor;
		var width=marker.getIcon().iconSize.width;
//		var height=tooltip.clientHeight;
//		var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
		var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width,- offset.y + point.y +anchor.y - 15)); 
		pos.apply(tooltip);
		tooltip.style.visibility="visible";
	}
	
	// --------------------------------------------------------------------------
	// □HTMLによる情報ウィンドウの表示
	// 　地図外からのイベントにより情報ウィンドウを表示するときに使用する
	// --------------------------------------------------------------------------
	function openInfoWindow(marker,html){
		marker.openInfoWindowHtml(html);
	}

	function moveMarker(marker,zLevel){
	    map.setCenter(marker.getPoint(),zLevel);
	}

	// --------------------------------------------------------------------------
	// □AjaxによるXMLデータ読み込み
	// 　filepath：読み込むデータファイルパス
	// 　func    ：正常に読み込みが完了したときに実行する関数
	// --------------------------------------------------------------------------
	function XMLDataRead( filepath , func ){
		//XMLファイルを読み込む
		GDownloadUrl(filepath, function(data,statusCode){
//			if (statusCode==0){
				var xmlDoc = GXml.parse(data);
				if( !xmlDoc.documentElement ){ 
					alertShow("XMLDataRead:ファイルが存在しないか、XMLファイルではありません。"); 
					return false; 
				}
				if (func!=null){
					func.apply( this , new Array(xmlDoc) );		// 引数で指定した関数を実行（第２引数は呼び出し先の関数へ引数を渡している
				}
//			}		
		});		
	}
		
	// --------------------------------------------------------------------------
	// □ハイブリッドマップタイプチェック
	// 　現在表示しているマップがハイブリッドタイプに対応しているかどうかをチェック。
	// 　対応していない場合は、グローバル変数のマップタイプをサテライトに書き換えます。
	// --------------------------------------------------------------------------
	function isHybridMap(){
		if (typeof(G_HYBRID_TYPE)=="object"){ 
			return true; 
		}else{
			alertShow('ハイブリッドタイプには対応していません。');			
			return false;
		}
	}
	
	// --------------------------------------------------------------------------
	// □GKeyboardHandler拡張
	//   GKeyboardHandlerインスタンスでは「十字キー・PageUp・PageDown・Home・End」キー
	//   によるキーボードハンドリングしかできないので、地図上でのマウスホイールによるズームイン／アウトを
	//   有効にする機能を拡張する。
	// [補足]MozilaとIEではスクロールデルタの符号が逆
	// --------------------------------------------------------------------------
	function GKeyboardHandlerExt(bodyEle){
		var listener = new GKeyboardHandler(map);
		if (document.getElementById(html_id_googlemap).addEventListener){
			// Mozila系ブラウザ
//			GEvent.addDomListener(document.getElementById(bodyEle),'DOMMouseScroll',function(oEvent){
			GEvent.addDomListener(document.getElementById(html_id_googlemap),'DOMMouseScroll',function(oEvent){
				if (oEvent.detail<0){ map.zoomIn();  }
 				 				else{ map.zoomOut(); }
			});			
		}else{
			// IE系ブラウザ
//			GEvent.addDomListener(document.getElementById(bodyEle),'mousewheel',function(){
			GEvent.addDomListener(document.getElementById(html_id_googlemap),'mousewheel',function(){
				if (event.wheelDelta>0){ map.zoomIn();  }
 				 		 		   else{ map.zoomOut(); }
			});	
		}
	}

	// □矩形中心移動
	//   引数に設定された矩形領域の中心を地図の中心に設定して移動します。
	//   また、矩形領域が表示できるズームレベルにして表示します。
	function setBoundsCenter(bounds){
//alert(bounds.getCenter().toString());
		var zLevel = map.getBoundsZoomLevel(bounds);		
        map.setCenter(bounds.getCenter(),zLevel);
//        map.panTo(bounds.getCenter());
//		map.panTo(new GLatLng(
//					(bounds.getNorthEast().lat()+(bounds.getSouthWest().lat()-bounds.getNorthEast().lat())/2),
//					(bounds.getNorthEast().lng()+(bounds.getSouthWest().lng()-bounds.getNorthEast().lng())/2)
//				      )
//				 );
//		map.setZoom(zLevel);
	}

//---------------------------------------------------------------------------------------------------
//-- 汎用関数
//---------------------------------------------------------------------------------------------------

	// --------------------------------------------------------------------------
	// □HTMLテンプレート変換
	// --------------------------------------------------------------------------
	function ConvertTemplate( value , replaceList){
		for( var key in replaceList){ 
			if( key != null && key != 'undifined' ){ 
				value = value.replace( new RegExp( "%" + key + "%" , "g" ) , replaceList[ key ] ); 
			} 
		}
		return value;
	}

	// --------------------------------------------------------------------------
	// □指定文字が含まれるかどうかの判定（単語）
	// 　value値にkey値の文字が含まれるかどうかを判定します。
	// --------------------------------------------------------------------------
	function isIndexOf(key,value){
		if (value.indexOf(key,0)>-1){ return true; }
		else{ return false; }
	}

	// --------------------------------------------------------------------------
	// □指定文字が含まれるかどうかの判定（復語）
	// 　配列で渡されたvalue値群内にkey値の文字が含まれるかどうかを判定します。
	// --------------------------------------------------------------------------
	function isIndexOfValues(key,values){
		for (var value in values){
			if( values[value] != null && values[value] != 'undifined' ){ 
				if (values[value].indexOf(key,0)>-1){ return true; }
			}
		}
		return false;
	}

	// --------------------------------------------------------------------------
	// □イベント登録
	// 　指定した要素にイベントを動的に割り当てます。
	// 　（クロスブラウザ対応）
	// --------------------------------------------------------------------------
	function addListener(elem,eventType,func,cap){
		if (elem.addEventListener){
			elem.addEventListener(eventType,func,cap);
		} else if (elem.attachEvent){
			// IEの場合、イベント名にonを付加する
			elem.attachEvent('on'+eventType,func);
		} else {
			alert("利用中のブラウザではサポート外です。");
			return false;
		}
	}

	// --------------------------------------------------------------------------
	// □selectアイテム要素追加
	// 　指定idのselect要素に、text，valueのoption要素を生成し追加する。
	// --------------------------------------------------------------------------
	function CreateOptionItem(id,text,value){
		var objSelect,objOption;
		objSelect = document.getElementById(id);
		if (objSelect){
			objOption = document.createElement('option');
			objOption.value = value;
			objOption.text  = text;
			try{
				objSelect.add(objOption,null);		// DOM
			}catch(e){
				objSelect.add(objOption,-1);		// IE
			}
		}
	}
//--------------------------------
//リストの初期化
//--------------------------------
function DelateOptionList(){
	objSelect_list = document.getElementById("itemlist");
	for (var i = objSelect_list.length; i >= 0; i--){
		objSelect_list.remove(i);
	}
}
//---------------------------------------------------------------------------
// リストプログラム
//-----------------------------------------------------------------------------
	function CreateOptionList(list_id,item_id_list,pdlist_list){
		var objSelect,objOption;
		objSelect = document.getElementById(list_id);
		if (objSelect){
			objOption = document.createElement('option');
			objOption.value = item_id_list;
			objOption.text  = pdlist_list;
			try{
				objSelect.add(objOption,null);		// DOM
			}catch(e){
				objSelect.add(objOption,-1);		// IE
			}
		}
	}

	// --------------------------------------------------------------------------
	// □HTMLメッセージ表示
	// --------------------------------------------------------------------------
	function setMessage(id,htmlMsg){
		var obj = document.getElementById(id);
		if (!obj) { return false; }
		obj.innerHTML = htmlMsg;
		return true;
	}

	// --------------------------------------------------------------------------
	// □Alertメッセージ表示
	// --------------------------------------------------------------------------
	function alertShow(Msg){
		alert(Msg);
	}

	// --------------------------------------------------------------------------
	// □２点間の距離を求める。
	// 　PointFx：開始地点x座標
	// 　PointFy：開始地点y座標
	// 　PointTx：目的地点x座標
	// 　PointTy：目的地点y座標
	// --------------------------------------------------------------------------
	function GetDistance(PointFx,PointFy,PointTx,PointTy){
		var fr_x = PointFx * Math.PI / 180;
		var fr_y = PointFy * Math.PI / 180;
		var to_x = PointTx * Math.PI / 180;
		var to_y = PointTy * Math.PI / 180;
		
		var deg = Math.sin(fr_y) * Math.sin(to_y) + Math.cos(fr_y) * Math.cos(to_y) * Math.cos(to_x-fr_x);
		var dis = (Math.atan(-deg / Math.sqrt(-deg * deg + 1)) + Math.PI / 2) * 6378140;
		return Math.round(dis); 
	}

//]]>
