/*
Script Name: ShowSpace GSV
Script URI: http://www.2next.co.jp/
Version: 1.0.0
Author: 2NEXT
Author URI: http://www.2next.co.jp/
*/

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 = gsv_load;
	window.unload = GUnload;
}

var map;
var panorama;
var panoramaclient;
var zoomingIn = true;
var marker;
var renderer;
var yw;
var pt;
var zm;
var lt;
var lg;
var mlt;
var mlg;
var houseLt;
var houseLg;
var streetOverray;
var streetToggle = true;
var cameraSetted = true;
var houselatlng;

var mylatlng;
var defaultYaw;
var defaultPitch;
var defaultZoom;
var lastestX;
var timer;
var prevLating = 0;

function gsv_load() {
	yw = document.getElementById('yw');
	pt = document.getElementById('pt');
	zm = document.getElementById('zm');
	lt = document.getElementById('lt');
	lg = document.getElementById('lg');
	mlt = document.getElementById('mlt');
	mlg = document.getElementById('mlg');
	var houseKiller = false;
	
	if(mlt.value==null || mlg.value==null || mlt.value=="" || mlg.value=="") houseKiller = true;
	
	mylatlng = new GLatLng(lt.value, lg.value);
	defaultYaw = Number(yw.value);
	defaultPitch = Number(pt.value);
	defaultZoom = Number(zm.value);
	if(defaultYaw == "" || defaultYaw == null){
		cameraSetted = false;
		defaultYaw = 0;
		defaultPitch = -10;
		defaultZoom = 0;
	}
	
	var guyIcon = new GIcon();
	guyIcon.image = rebuildGUY(defaultYaw);
	guyIcon.transparent = "http://maps.gstatic.com/intl/en_us/mapfiles/cb/man-pick.png";
	guyIcon.imageMap = [
		26,13, 30,14, 32,28, 27,28, 28,36, 18,35, 18,27, 16,26,
		16,20, 16,14, 19,13, 22,8
	];
	guyIcon.iconSize = new GSize(49, 52);
	guyIcon.iconAnchor = new GPoint(25, 35);  // near base of guy's feet
	guyIcon.infoWindowAnchor = new GPoint(25, 5);  // top of guy's head
	guyIcon.shadow = null;

	
	map = new GMap2(document.getElementById("mymap"));
	map.setCenter(mylatlng, 19);
	
	marker = new GMarker(mylatlng,{ icon: guyIcon , draggable:true , bouncy:true , bounceGravity:0.5 });
	streetOverray = new GStreetviewOverlay();
	map.addOverlay(marker);
	map.addControl(new GLargeMapControl());
	map.addControl(new GScaleControl());
	map.addControl(new GMapTypeControl());
	map.setCenter(new GLatLng(35.172304,136.908306), 17);
	
	panoramaclient = new GStreetviewClient();
	panorama = new GStreetviewPanorama(document.getElementById("pano"));
	if(window.location.href.match("admin.cgi")){
		panoramaclient.getNearestPanorama(mylatlng,renderer);
	}
	panorama.setLocationAndPOV(mylatlng, {yaw: defaultYaw, pitch: defaultPitch, zoom: defaultZoom});
	
	if((mlt.value==null || mlt.value=="") && (mlg.value==null || mlg.value=="")){
		houselatlng = mylatlng;
	} else {
		houselatlng = new GLatLng(mlt.value, mlg.value);
	}
	if(!houseKiller){ // 家アイコン
		var icon = new GIcon();
		icon.image = "http://src.2next.co.jp/img/icon/house-2_64.png";
		icon.iconSize = new GSize(64, 64);
		icon.iconAnchor = new GPoint(48, 59);
		var markeropts = new Object();
		markeropts.icon = icon;
		var housemarker = new GMarker(houselatlng, markeropts);
		map.addOverlay(housemarker);
	}
	
	yw.value = defaultYaw;
	pt.value = defaultPitch;
	zm.value = defaultZoom;
	
	GEvent.addListener(marker, "dragstart", function() {
		lastestX = map.fromLatLngToContainerPixel(marker.getLatLng()).x;
		iconsrc = "http://maps.gstatic.com/intl/ja_jp/mapfiles/cb/man_fly_left.png";
		marker.setImage(iconsrc);
	});
	GEvent.addListener(marker, "drag", function() {
		var currentX;
		latlng = marker.getLatLng();
		currentX = map.fromLatLngToContainerPixel(latlng).x;
		if(currentX != lastestX){
			iconsrc = (currentX > lastestX) ? "http://maps.gstatic.com/intl/ja_jp/mapfiles/cb/man_fly_right.png" : "http://maps.gstatic.com/intl/ja_jp/mapfiles/cb/man_fly_left.png";
			marker.setImage(iconsrc);
			lastestX = currentX;
		}
	});
	GEvent.addListener(marker, "dragend", function() {
		marker.setImage(rebuildGUY(panorama.getPOV().yaw));
		latlng = marker.getLatLng();
		panoramaclient.getNearestPanorama(latlng,renderer);
	});

	//カメラ視点の方向が変更された時に発生するイベント
	GEvent.addListener(panorama, "yawchanged", function(yaw) {
		yw.value = Math.round(yaw);
		marker.setImage(rebuildGUY(yaw));
		if(cameraSetted == false){
			cameraSetted = true;
			clearInterval(timer);
		}
	});
	GEvent.addListener(panorama, "pitchchanged", function(pch) {
		pt.value = Math.round(pch);
	});
	GEvent.addListener(panorama, "zoomchanged", function(zoom) {
		zm.value = zoom;
	});
	
	GEvent.addListener(panorama, "initialized", panoramaInitialized);
	
	GEvent.addListener(marker, "click", function(pixel){
		var message;
		var latlng;
		
		latlng = marker.getLatLng();
		message = '<p>このアイコンをドラッグしてください。<br />右クリックでその方向を向きます。</p>';
		
		map.openInfoWindowHtml(latlng, message);
	});
	
	GEvent.addListener(map, "singlerightclick", function(point) {
		r = getYew(point,map.fromLatLngToContainerPixel(marker.getPoint()));
		var pov = panorama.getPOV();
		panorama.panTo({yaw:r, pitch:pov.pitch, zoom:pov.zoom});
	});

	function spiral(){
		if(houselatlng.x != marker.getPoint().x || houselatlng.y != marker.getPoint().y){
			r = getYew(map.fromLatLngToContainerPixel(houselatlng) , map.fromLatLngToContainerPixel(marker.getPoint()));
			var pov = panorama.getPOV();
			if (window.navigator.userAgent.toLowerCase().indexOf("opera") > -1) {
				panorama.panTo({yaw:r, pitch:pov.pitch, zoom:pov.zoom});
			}
			else {
				panorama.setPOV({yaw:r, pitch:pov.pitch, zoom:pov.zoom});
			}
		}
	}
	
	if(cameraSetted==false) timer = window.setInterval(spiral, 300);

}

function panoramaInitialized(loc){
	var latlng = loc.latlng;	
	if(String(prevLating) != String(latlng)){
		panoramaclient.getNearestPanorama(latlng,renderer);
		prevLating = latlng;
	}
}

function getYew(point,zero){
	var x = zero.x - point.x;
	var y = point.y - zero.y;
	var r = (Math.atan2(x,y)*180/Math.PI+180);
	return r;
}

function rebuildGUY(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 renderer(data){
	if(data.code == 600){
		alert("この近くにはグーグルストリートビューがありません。");
		return false;
	} else if(data.code == 500){
		alert("サーバーエラーです。");var manPoint = new GLatLng;

		return false;
	} else if(data.code == 200){
		latlng = data.location.latlng;
		panorama.setLocationAndPOV(latlng);
		
		lt.value = data.location.lat;
		lg.value = data.location.lng;
		marker.setPoint(latlng);
		if(cameraSetted==true){
			map.panTo(latlng);
		} else {
			map.setCenter(latlng);
		}
		
	}
}

function toggleStreetOverray(){
	if(streetToggle){
		map.removeOverlay(streetOverray);
		map.removeOverlay(marker);
	} else {
		map.addOverlay(streetOverray);
		map.addOverlay(marker);
		marker.setImage(rebuildGUY(panorama.getPOV().yaw));
	}
	streetToggle = (streetToggle) ? false : true ;
}
