var mapId = 'gmap';
var mapsvId = 'gmapsv';
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);
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));
}
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;
		}
		showGoogleMap(latlng, iconId);
		gsvclient = new GStreetviewClient();
		gsvclient.getNearestPanorama(latlng, updateStreetView);
	});
}
function loadStreetView(latitude, longitude, direction, zoom, viewpoint){
	if (!GBrowserIsCompatible()) {
		return;
	}
	showGoogleMap(new GLatLng(latitude, longitude), 1);
	map.setCenter(new GLatLng(latitude, longitude), 19);
	gsvclient = new GStreetviewClient();
	var location = {
		latlng: new GLatLng(latitude, longitude),
		pov: {
			yaw: parseInt(direction,10),
			pitch: parseInt(viewpoint,10),
			zoom: parseInt(zoom,10)
		}
	};
	initializeStreetView(location);
}
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);
	});
}
function updateStreetView(data){
	switch (data.code) {
		case 200:
			if (!gsv) {
				initializeStreetView(data.location);
			} else {
				if (gsv.isHidden()) {
					gsv.show();
				}
				gsv.setLocationAndPOV(data.location.latlng);
				gsvMarker.setLatLng(data.location.latlng);
			}
			break;
		case 500:
		case 600:
		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;
	}
}
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(49, 52);
	
	
	icon.iconAnchor    = new GPoint(24, 26);
	
	
	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/man_fly_right.png";
		} else if (gsvMarkerBeforeLng > latlng.lng()) {
			image = "img/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:
				msg = "<img src=\"img/gsv/estStreet_att.gif\" alt=\"ストリートビューをご利用になるには、Flash Player が必要です。\" />";
				break;
			case 600:
			default:
				msg = "<img src=\"img/gsv/estStreet_na.gif\" alt=\"この地域はストリートビューがサポートされていません。\" />";
				break;
		}
		document.getElementById(mapsvId).innerHTML = msg;
	});
}
function changeStreetViewImageByYaw(yaw){
	yaw = yaw % 360;
	var image = getStreetViewImageByYaw(yaw);
	gsvMarker.setImage(image);
}
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/man_arrow-" + no + ".png";
	return image;
}
function unload(){
	GUnload();
}
function getIconInfo(id){
	if (!(id in icons)) {
		id = defaultIconId;
	}
	return icons[id];
}
