var objChkStView = null;	//ストリートビュー　チェックボックス
var objStViewOl = null;	//ストリートビュー　オーバーレイ
var objStViewCl = null;	//ストリートビュー　クライアント
//var iconStv00 = null;	//ストリートビュー　アイコン北
var objLatLonStvLast = null;	//最後のストリートビューの場所
var objMarkerStv	= null;	//ストリートビューの人形マーカー
var objDivPano	= null;	//ストリートビューパノラマ
var aryIconStv = null;	//ストリートビュー アイコン配列
var intStvYawLast = -1; //最後のストリートビュー方向

var objWinStv = null;	//ストリートビュー用ウィンドウ


// スクリプト処理マーカー追加
GMap2.prototype.fncAddMarker = function(latlng, icon)
{
	// マーカー作成
	var marker = new GMarker(latlng, icon);

	// 地図に設定
	this.addOverlay(marker);

	return marker;
}


//ストリートビューチェックボックスコントロール
function CheckboxStreetviewControl(){}
CheckboxStreetviewControl.prototype = new GControl();

//ストリートビューチェックボックスコントロールの初期化
CheckboxStreetviewControl.prototype.initialize = function(map)
{
	var objContainer = null;	//コンテナ
	var objCheckbox = null;		//チェックボックス
	var objText = null;
	var objMap = map;			//地図
	var objStyle = null;

	//土台の設定
	objContainer = document.createElement("div");
	objStyle = objContainer.style;
	objStyle.font = "x-small Arial"
	objStyle.color = "black";
	objStyle.backgroundColor = "white";
	objStyle.border = "1px solid black";
	objStyle.vertical_align = "middle";

	//チェックボックス設定
	objCheckbox =  document.createElement("input");
	objCheckbox.setAttribute("type","checkbox"); 
	objCheckbox.setAttribute("name","chkStView");
	objCheckbox.defaultChecked = false; 

	objContainer.appendChild(objCheckbox);


	//テキスト設定
	objText =  document.createElement("span");
	fncSetInnerText(objText,"ストリートビュー");
	objStyle = objText.style;
	objStyle.vertical_align = "middle";
//	objStyle.border_style = "none";
	objContainer.appendChild(objText);


	//チェックボックスのクリックイベント設定
	GEvent.addDomListener(objCheckbox
		, "click"
		, function()
			{
				if(objCheckbox.checked)
				{
					//ストリートビュー可能な道を青く
					if(!objStViewOl)
						objStViewOl = new GStreetviewOverlay();
					if(!objStViewCl)
						objStViewCl = new GStreetviewClient();
					objMap.addOverlay(objStViewOl);
					objStyle.font_weight = "bolder";

					//地図の真ん中から一番近いストリートビューの場所を探す。
					///fncOnStvNearestで結果が来るのを待つ
					objLatLonStvLast = null;
					objStViewCl.getNearestPanorama(objMap.getCenter(), fncOnStvNearest);
				}
				else if(objStViewOl)
				{
					//ストリートビューの道を消す
					objMap.removeOverlay(objStViewOl);
//					objStViewOl =null;

					//ストリートビューの人形マーカーを消す
					objMap.removeOverlay(objMarkerStv);
					objMarkerStv = null;
					intStvYawLast = -1;

					//ストリートビューウィンドウを閉じる
					fncOnCloseWinStv();

					objStyle.font_weight = "normal";
				}
			}
		);

	//コンテナに土台のコンテナを設定
	objMap.getContainer().appendChild(objContainer);


	//人形アイコン作成
	fncMakeStvIcon();

	return objContainer;
}

//一番近いストリートビューのある場所を探した結果イベント(getNearestPanoramaの結果)
function fncOnStvNearest(objRes)
{
//alert(objRes.code);
	if(objRes.code == 200)
	{
		//見つかっつた!
//		objLatLonStvLast = new GLatLng(objRes.Location.lat, objRes.Location.lng);
		objLatLonStvLast = objRes.Location.latlng;
	}
	else
	{
		if(!objLatLonStvLast)
		{	//見つからなくって、チェックボックスをチェック直後
			alert("ストリートビューが記録された青い道路に、人形アイコンをドラッグしてください。");
			objLatLonStvLast = objMap.getCenter();
		}

//		if (panorama) {
//			openPanoramaBubble();
//		}
	}

	if(objMarkerStv)
		//人形マーカーを移動
		objMarkerStv.setLatLng(objLatLonStvLast);
	else
	{
		//人形マーカーを作成
		objMarkerStv = objMap.fncAddMarker(objLatLonStvLast, {clickable:true, draggable:true, icon:fncGetIconStv(0)});
		GEvent.addListener(objMarkerStv, "dragend", fncOnStvMakerDragEnd);
		GEvent.addListener(objMarkerStv, "click", fncOnStvMakerClick);
	}
	fncOnYawchangedPanorama(0);

	if(objRes.code == 200)
	{
		//パノラマ表示
		fncOnStvMakerClick();
	}
}

//ストリートビュー人形マーカーをドラッグし終わったら、一番近いストリートビューの場所を探す。
function fncOnStvMakerDragEnd()
{
//	objMarkerStv.closeInfoWindow();
	objStViewCl.getNearestPanorama(objMarkerStv.getLatLng(), fncOnStvNearest);
}

//ストリートビューチェックボックスコントロールの初期位置
CheckboxStreetviewControl.prototype.getDefaultPosition = function()
{
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(210, 8));
}

//ストリートビュー人形マーカーをクリックしたら、ウィンドウ表示
function fncOnStvMakerClick()
{
	if( !objWinStv )
	{
		objWinStv = new Window("WinStv"
			, { className: "dialog", title: "Flash® Street View Panorama ビューア"
				, left:500, top:60, width:320, height:240, zIndex:200
				, resizable:true, draggable:true }
			);
		objWinStv.getContent().innerHTML = "<div id='id_pano' style='width: 320px; height: 240px'></div>";

		//イベント設定
		///http://www.openspc2.org/JavaScript/Ajax/ref/PrototypeWindowClass/ver0.96/ref/window/addObserver/index.html
		msgMoveEvent = 
		{
			onEndResize: function(eventName, winObj) 
			{
				if(winObj.getId() == objWinStv.getId())
				{
					$('id_pano').style.width = objWinStv.getSize().width + "px";
					$('id_pano').style.height =  objWinStv.getSize().height + "px";
					objDivPano.checkResize();
				}
			}
			,
			onMaximize: function(eventName, winObj) 
			{
				if(winObj.getId() == objWinStv.getId())
				{
					$('id_pano').style.width = objWinStv.getSize().width + "px";
					$('id_pano').style.height =  objWinStv.getSize().height + "px";
					objDivPano.checkResize();
				}
			} 
		}
		Windows.addObserver(msgMoveEvent);

		//閉じたときのイベント設定
		objWinStv.setCloseCallback(fncOnCloseWinStv);
//		subwin.setDestroyOnClose();	//閉じられたとき破棄するように設定。


		objWinStv.show();
	}

	fncStreetviewPanorama();

//	var strHtml = "";
//	strHtml += "<div id='id_pano' style='width: 320px; height: 240px'></div>";
//	strHtml += "<script type='text/javascript'>fncStreetviewPanorama();</script>";
//
//	//バルーン表示
//	objMarkerStv.openInfoWindowHtml(strHtml);
}


//ストリートビューウィンドウを閉じるイベント
function fncOnCloseWinStv()
{
	if( objDivPano )
		objDivPano.remove();
	objDivPano = null;

	if( objWinStv )
		objWinStv.destroy();
	objWinStv = null;

	return true;
}

//ストリートビューのパノラマを表示
function fncStreetviewPanorama()
{
	if( !objDivPano)
	{
		objDivPano = new GStreetviewPanorama(document.getElementById("id_pano"));
		GEvent.addListener(objDivPano, "error", fncHandleNoFlash);  
		GEvent.addListener(objDivPano, "initialized", fncOnMovePanorama);
		GEvent.addListener(objDivPano, "yawchanged", fncOnYawchangedPanorama);
	}
	objDivPano.setLocationAndPOV(objMarkerStv.getLatLng());
}

//フラッシュに対応しない場合の処理
function fncHandleNoFlash(errorCode)
{
	if(errorCode == FLASH_UNAVAILABLE)
	{
		alert("Error: Flash doesn't appear to be supported by your browser");
		return;
	}
}

//ストリートビューのパノラマで移動した場合の処理
function fncOnMovePanorama(objStLoc)
{
	objLatLonStvLast = objStLoc.latlng;
	objMap.panTo(objLatLonStvLast);	//地図の中心を移動
	objMarkerStv.setLatLng(objLatLonStvLast);	//マーカーを移動
//	objMap.getInfoWindow().reset(objStLoc.latlng);	//情報ウィンドウも移動 だが動かない…
//	objMap.getInfoWindow().show();
}

//カメラのヨー角度に対応するアイコンを返す。
function fncGetIconStv( intYaw )
{
	//intYaw=  0 ↑北
	//        90 →東
	//       180 ↓南
	//       270 ←西
	var intLimit = 0;
	for( var i=0, intLimit=11.25; i<15; i++, intLimit+=22.5 )
	{
		if(intYaw < intLimit)
			return aryIconStv[i];
	}
	//360-11.25より大きい場合
	return aryIconStv[0];
}

//ストリートビューのパノラマで回転した場合の処理
function fncOnYawchangedPanorama(intYaw)
{
	//向きが前と同じ場合なにもしない
	if( intStvYawLast == intYaw )
		return;

	intStvYawLast = intYaw;

	//前のアイコンを消去
	if(objMarkerStv != null)
		objMap.removeOverlay(objMarkerStv);

	objMarkerStv = objMap.fncAddMarker(objLatLonStvLast, {clickable:true, draggable:true, icon:fncGetIconStv(intYaw)});
	GEvent.addListener(objMarkerStv, "dragend", fncOnStvMakerDragEnd);
	GEvent.addListener(objMarkerStv, "click", fncOnStvMakerClick);
}

//ストリートビュー用人形アイコン作成
function fncMakeStvIcon()
{
	//ベース作成
	var baseIcon = new GIcon();
	baseIcon.shadow = null;
	baseIcon.iconSize = new GSize(49, 52);
	baseIcon.iconAnchor = new GPoint(24, 35);

	aryIconStv = new Array(16);
	for(var i=0; i<16; i++)
	{
		aryIconStv[i] = fncMakeIcon(baseIcon, "http://msnr.net/maps/icon/man_arrow-" + i + ".png");
	}
}

// アイコン作成
function fncMakeIcon(baseIcon, uriImage)
{
	var icon = new GIcon(baseIcon);
	icon.image = uriImage;
	icon.transparent = uriImage;

	return icon;
}

//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と違い、意味が無い…
}
