if(window.addEventListener) {
	window.addEventListener('load', gsv_load, false);
	window.addEventListener('unload', GUnload, false);
} else if(window.attachEvent){
	window.attachEvent('onload', gsv_load);
	window.attachEvent('unload', GUnload);
} else {
	window.onload = load;
	window.unload = GUnload;
}

var mapId = 'map_box';
var mapsvId = 'view_box';

var map;
var gsv;
var gsvclient;
var gsvMarker;
var gsvMarkerDragStart;
var gsvMarkerBeforeLng;

// 物件詳細の初期ズーム
var defaultZoom = 17;

/**
 * Googleマップ＋ストリートビューの初期化
 */
function gsv_load()
{
	//緯度
	elm_lt = document.getElementById('lt');
	latitude = elm_lt.value;
	//経度
	elm_lg = document.getElementById('lg');
	longitude = elm_lg.value;
	//方角・・・0=北を基点とする角度(時計回り)。90=東,180=南,270=西
	elm_yw = document.getElementById('yw');
	yaw = elm_yw.value;
	//表示する角度・・・0が水平で、真上は-90,真下は90
	elm_pt = document.getElementById('pt');
	pitch = elm_pt.value;

	if (!GBrowserIsCompatible()) {
		return;
	}

	// Google マップの表示
	showGoogleMap(new GLatLng(latitude, longitude));

	// 中心位置を修正
	map.setCenter(new GLatLng(latitude, longitude), defaultZoom);

	// ストリートビューの表示
	gsvclient = new GStreetviewClient();
	var location = {
		latlng: new GLatLng(latitude, longitude),
		pov: {
			yaw: yaw,
			pitch: pitch
		}
	};
	initializeStreetView(location);
}

/**
 * Googleマップの表示
 * 
 * @param object latlng GLatLngオブジェクト
 * 
 */
function showGoogleMap(latlng)
{

	// 初期化
	map = new GMap2(document.getElementById(mapId));

	// 拡大・縮小
	//		map.addControl(new GLargeMapControl());
	map.addControl(new GSmallMapControl());

	// 地図・航空写真・地図+航空写真
	map.addControl(new GMapTypeControl());

	// 右下の概要
	//		map.addControl(new GOverviewMapControl());

	// 中心地点を設定
	map.setCenter(latlng, defaultZoom);

	// オーバーレイを全消去
	map.clearOverlays();

	// ストリートビューを表示
	map.addOverlay(new GStreetviewOverlay());

	// クリックイベントを捕捉
	GEvent.addListener(map, "click", function(overlay, latlng) {

		if (overlay) {
			return;
		}

		// マップを移動
		map.panTo(latlng);

		// ストリートビューを更新
		gsvclient.getNearestPanorama(latlng, updateStreetView);

	});

}

/**
 * ストリートビューの更新
 * 
 * @param object data GStreetviewDataオブジェクト
 * 
 */
function updateStreetView(data)
{
	switch (data.code) {

		case 200: // SUCCESS
			if (!gsv) {

				// ストリートビューが生成されていない場合は初期化
				initializeStreetView(data.location);

			} else {

				// ストリートビューを再表示
				if (gsv.isHidden()) {
					gsv.show();
				}

				// 表示位置を更新
				gsv.setLocationAndPOV(data.location.latlng);

				// マップ上のマーカーを移動
				gsvMarker.setLatLng(data.location.latlng);

			}
			break;

		case 500: // SERVER_ERROR
		case 600: // NO_NEARBY_PANO
		default:
			// ストリートビューが初期化されていないときのみ表示を切り替える
			if (!gsv) {

				var msg = "この地域はストリートビューがサポートされていません。";
				alert(msg);

			} else {

				if (gsvMarkerDragStart) {
					gsvMarker.setLatLng(gsvMarkerDragStart);
					gsvMarkerDragStart = null;
					gsvMarkerBeforeLng = null;
				}

			}
			break;
	}
}

/**
 * ストリートビューの初期化
 * 
 * @param object location GStreetviewLocationオブジェクト
 * 
 */
function initializeStreetView(location)
{
	var opts = {latlng:location.latlng, pov:location.pov};
	gsv = new GStreetviewPanorama(document.getElementById(mapsvId), opts);

	var icon = new GIcon();
	icon.image         = getStreetViewImageByYaw(location.pov.yaw);
	//icon.iconSize      = new GSize(69, 54);
	//icon.iconAnchor    = new GPoint(35, 33);
	icon.iconSize      = new GSize(49, 52);
	icon.iconAnchor    = new GPoint(25, 35);
	gsvMarker = new GMarker(location.latlng, {icon:icon, draggable:true, bouncy:true});

	// マップにマーカーを表示
	map.addOverlay(gsvMarker);

	GEvent.addListener(gsvMarker, "dragstart", function(latlng) {

		gsvMarkerDragStart = latlng;
		gsvMarkerBeforeLng = latlng.lng();

	});

	GEvent.addListener(gsvMarker, "drag", function(latlng) {

		var image;

		if (gsvMarkerBeforeLng < latlng.lng()) {
			image = "http://maps.gstatic.com/intl/ja_jp/mapfiles/cb/man_fly_left.png";
		} else if (gsvMarkerBeforeLng > latlng.lng()) {
			image = "http://maps.gstatic.com/intl/ja_jp/mapfiles/cb/man_fly_right.png";
		}

		if (image) {
			gsvMarker.setImage(image);
		}

		gsvMarkerBeforeLng = latlng.lng();

	});

	GEvent.addListener(gsvMarker, "dragend", function(latlng) {

		// ストリートビューを更新
		gsvclient.getNearestPanorama(latlng, updateStreetView);

	});

	// 表示座標が変わった場合はマップを更新
	GEvent.addListener(gsv, "initialized", function(location) {

		map.panTo(location.latlng);
		gsvMarker.setLatLng(location.latlng);
		changeStreetViewImageByYaw(location.pov.yaw);

	});

	// 表示向きが変わった場合は画像を入れ替え
	GEvent.addListener(gsv, "yawchanged", function(yaw) {

		changeStreetViewImageByYaw(yaw);

	});

	// ストリートビューが表示不可能な場合はエラーメッセージを表示
	GEvent.addListener(gsv, "error", function(errorCode) {

		gsv.remove();

		var msg;

		switch (errorCode) {

			case 603: // FLASH_UNAVAILABLE
				msg = "ストリートビューをご利用になるには、Flash Player が必要です。";
				break;

			case 600: // NO_NEARBY_PANO
			default:
				// ロジック上、ココはありえないが念のため書いておく
				msg = "この地域はストリートビューがサポートされていません。";
				break;

		}
		alert(msg);
	});

}

/**
 * ストリートビューのアイコン変更
 * 
 * @param integer yaw 角度
 * 
 */
function changeStreetViewImageByYaw(yaw)
{
	var image = getStreetViewImageByYaw(yaw);
	gsvMarker.setImage(image);
}

/**
 * ストリートビューのアイコンファイルパス取得
 * 
 * @param integer yaw 角度
 * 
 */
function getStreetViewImageByYaw(yaw)
{
	var GUY_NUM_ICONS = 16;
	var GUY_ANGULAR_RES = 360/GUY_NUM_ICONS;
	if (yaw < 0) {
		yaw += 360;
	}
	guyImageNum = Math.round(yaw/GUY_ANGULAR_RES) % GUY_NUM_ICONS;
	guyImageUrl = "http://maps.gstatic.com/intl/en_us/mapfiles/cb/man_arrow-" + guyImageNum + ".png";
	return guyImageUrl;
}

function unload()
{
	GUnload();
}
