// params start
var mapId = 'gmap';
var mapsvId = 'gmapsv';
// params end

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

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

var iconDir = '/img/';
var defaultIconId = 101;
var shadowIconId = 0;
var defaultIconExt = '.png';
var printIconExt = '.gif';
var icons = new Array();
icons[0]   = new Array('gmshadow', 82, 51, 41, 51);
icons[1]   = new Array('gmIcon0',  43, 51, 22, 51);
icons[101] = new Array('gmIcon3',  43, 51, 22, 51);
icons[201] = new Array('gmIcon1',  43, 51, 22, 51);
icons[202] = new Array('gmIcon4',  43, 51, 22, 51);
icons[301] = new Array('gmIcon2',  43, 51, 22, 51);
icons[302] = new Array('gmIcon5',  43, 51, 22, 51);
icons[999] = new Array('gmset6',  115, 40, 40, 35);

/**
 * アクセスマップの表示
 * 
 * @param float lat 目的地の緯度
 * @param float lng 目的地の経度
 * @param float clat 中心点の緯度
 * @param float clng 中心点の経度
 * @param integer zoom ズーム倍率
 * 
 */
function loadAccessmap(lat, lng, clat, clng, zoom)
{

	if (!GBrowserIsCompatible()) {
		return;
	}

	var office = new GPoint(lng, lat);
	var center = new GLatLng(clat, clng);
	var iconId = 999;

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

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

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

	// 中心点
	map.setCenter(center, zoom);

	var iconInfo = getIconInfo(iconId);
	var icon = new GIcon();
	icon.image         = iconDir + iconInfo[0] + defaultIconExt;
	icon.printImage    = iconDir + iconInfo[0] + printIconExt;
	icon.mozPrintImage = iconDir + iconInfo[0] + printIconExt;
	icon.iconSize      = new GSize(iconInfo[1], iconInfo[2]);
	icon.iconAnchor    = new GPoint(iconInfo[3], iconInfo[4]);

	// マーカーを表示
	map.addOverlay(new GMarker(office, icon));

}

/**
 * Googleマップ＋ストリートビューの初期化
 * 
 * @param integer id 物件ID
 * @param string address 物件の住所
 * @param integer iconId 物件のアイコンID
 * 
 */
function load(id, address, iconId)
{

	if (!GBrowserIsCompatible()) {
		return;
	}

	geocoder = new GClientGeocoder();
	geocoder.getLatLng(address, function(latlng) {

		if (!latlng) {
			var msg = "<img src=\"/img/gsv/estStreet_na.gif\" alt=\"この地域はストリートビューがサポートされていません。\" />";
			document.getElementById(mapsvId).innerHTML = msg;
			return;
		}

		// Google マップの表示
		showGoogleMap(latlng, iconId);

		// addressから取得したlatlngに最も近いストリートビューの座標を元に
		// ストリートビューを更新
		gsvclient = new GStreetviewClient();
		gsvclient.getNearestPanorama(latlng, updateStreetView);

	});

}

/**
 * Googleマップ＋ストリートビュー（サンプル）の初期化
 */
function loadStreetViewSample()
{
	if (!GBrowserIsCompatible()) {
		return;
	}

	// Google マップの表示
	showGoogleMap(new GLatLng(35.680658, 139.704348), 1);

	// 中心位置を修正
	map.setCenter(new GLatLng(35.68073164981616, 139.704307615757), 19);

	// ストリートビューの表示
	gsvclient = new GStreetviewClient();
	var location = {
		latlng: new GLatLng(35.68069, 139.704522),
		pov: {
			yaw: 265.26315789473705,
			pitch: -4.0000000000000036,
			zoom: 0
		}
	};
	initializeStreetView(location);
}

/**
 * Googleマップの表示
 * 
 * @param object latlng GLatLngオブジェクト
 * @param integer iconId 物件のアイコンID
 * 
 */
function showGoogleMap(latlng, iconId)
{

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

	var iconInfo = getIconInfo(iconId);
	var shadowIconInfo = getIconInfo(shadowIconId);
	var icon = new GIcon();
	icon.image         = iconDir + iconInfo[0] + defaultIconExt;
	icon.printImage    = iconDir + iconInfo[0] + printIconExt;
	icon.mozPrintImage = iconDir + iconInfo[0] + printIconExt;
	icon.iconSize      = new GSize(iconInfo[1], iconInfo[2]);
	icon.iconAnchor    = new GPoint(iconInfo[3], iconInfo[4]);
	icon.shadow      = iconDir + shadowIconInfo[0] + defaultIconExt;
	icon.printShadow = iconDir + shadowIconInfo[0] + printIconExt;
	icon.shadowSize  = new GSize(shadowIconInfo[1], shadowIconInfo[2]);

	// 拡大・縮小
	//		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 GMarker(latlng, icon));

	// ストリートビューを表示
	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 = "<img src=\"/img/gsv/estStreet_na.gif\" alt=\"この地域はストリートビューがサポートされていません。\" />";
				document.getElementById(mapsvId).innerHTML = 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);
	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 = "/img/gsv/man_fly_right.png";
		} else if (gsvMarkerBeforeLng > latlng.lng()) {
			image = "/img/gsv/man_fly_left.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 = "<img src=\"/img/gsv/estStreet_att.gif\" alt=\"ストリートビューをご利用になるには、Flash Player が必要です。\" />";
				break;

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

		}

		document.getElementById(mapsvId).innerHTML = msg;

	});

}

/**
 * ストリートビューのアイコン変更
 * 
 * @param integer yaw 角度
 * 
 */
function changeStreetViewImageByYaw(yaw)
{
	// 稀に360度以上の値が入ってくるので正規化
	yaw = yaw % 360;

	var image = getStreetViewImageByYaw(yaw);
	gsvMarker.setImage(image);
}

/**
 * ストリートビューのアイコンファイルパス取得
 * 
 * @param integer yaw 角度
 * 
 */
function getStreetViewImageByYaw(yaw)
{
	var no;

	if (!yaw) {
		yaw = 0;
	}

	no = Math.floor((yaw + 11.25) / 22.5);
	if (16 <= no) {
		no = 0;
	}

	var image = "/img/gsv/man_arrow-" + no + ".png";

	return image;
}

function unload()
{
	GUnload();
}

function getIconInfo(id)
{
	if (!(id in icons)) {
		id = defaultIconId;
	}

	return icons[id];
}
