var position = null;
var panorama = null;

var nextPanorama = null;
var currentPanorama = null;
var lastPanorama = null;

var loadRand = 2000 + Math.floor(Math.random()*30000);
var currentYaw = Math.floor(Math.random()*360);//yaw = 水平方向の角度
var currentZoom = 0;//ズームレベル
var currentPitch = 0;//pitch = 上下方向の角度
var randYaw;//currentYawにランダムな値を加える用
var theLat;
var theLng;
var addNumLat;
var addNumLng;
var myTxt;
var stateName;
var intervalRand;
var rl = 10;//登録ポイントにランダムな値を与える時のランダム係数
var l;
var r;
var mainTimer;
var walkTimer;
var viewTimer1;
var viewTimer2;
var viewTimer3;
var val;
var theRnd;
var rand1;
var rand2;
var rand3;
var keyword;
var preKeyword;

function oMy_GSaV() {

	clearTimeout(mainTimer);
	clearTimeout(walkTimer);
	clearInterval(viewTimer1);
	clearInterval(viewTimer2);
	clearInterval(viewTimer3);


	
	var alt = Math.floor(Math.random()*2);//ランダムにポイントを選ぶ用変数
	
	if(typeof initialPosition != "undefined" && initialPosition != null){
	    position = initialPosition;
	}else{
		switch( alt ){
			case 0:
				
				l = LOCATIONS.bombplace1;
				r = Math.floor(Math.random()*l.length);
			
				addNumLat = (Math.floor(Math.random()*(rl*2))-rl)*0.00005;//毎回着地するポイントが同じにならないようにちょっとずらす
				addNumLng = (Math.floor(Math.random()*(rl*2))-rl)*0.00005;//毎回着地するポイントが同じにならないようにちょっとずらす				
				break;
			
			case 1:

				l = LOCATIONS.bombplace2;
				r = Math.floor(Math.random()*l.length);

    		addNumLat = 0;
    		addNumLng = 0;
				break;
	  };

		intervalRand = 500 + Math.floor(Math.random()*10000);//Walkする間隔のランダム変数
		walkTimer = setTimeout(walk, intervalRand);//これで歩く, alt=1だと歩かない

		theLat = l[r].latitude + addNumLat;
		theLng = l[r].longtude + addNumLng;
		myTxt = l[r].cityName;
		


		if(l[r].key == "westside"){
			key = westside[Math.floor(Math.random()*westside.length)];
		} else {
			key = l[r].key;
		}
		
		val = Math.floor(Math.random()*3);
		if (val == 0) theRnd = 40;
		else if(val == 1) theRnd = 10;
		else theRnd = 120;
		
		rand1 = theRnd + Math.floor(Math.random()*(theRnd*theRnd));		
		rand2 = theRnd*theRnd + Math.floor(Math.random()*(theRnd*theRnd*theRnd));
		rand3 = theRnd*theRnd + Math.floor(Math.random()*(theRnd*theRnd));

		preKeyword = keyword;
		keyword = key;	
		if(keyword == preKeyword){ return; }
		else {
			search(theRnd);
		}

    position = new GLatLng(theLat, theLng);
	}
	
	


	
	
	initialPov = {yaw:Math.floor(Math.random()*360), pitch:0};
	if(typeof initialPov != "undefined" && initialPov != null){
	    panoramaOptions = {latlng:position, pov:initialPov};
	}else{
	}
	
	var firstClient = new GStreetviewClient();
	firstClient.getNearestPanoramaLatLng(position, function(point){
		if(point){
			panorama.setLocationAndPOV(point);
			panorama.panTo(point);
		} else {
			window.location.reload();
		}
	});
	
	panorama = new GStreetviewPanorama(document.getElementById("autowalk-street"), panoramaOptions);
	
	
	viewStyle();
	
	loadRand = 1000 + Math.floor(Math.random()*30000);
	mainTimer = setTimeout(My_GSaV, loadRand);
	
	document.title = "My_GSaV 2.0"
	setTimeout(theTxt,2000);
	setTimeout(eraseTxt,6000);
	
	GEvent.addListener(panorama, "error", handleNoFlash);
}



function handleNoFlash(errorCode) {
    if (errorCode == FLASH_UNAVAILABLE) {
        alert("Error: Flash Playerをインストールして下さい。");
        return;
    }
}




function walk(){

	clearTimeout(walkTimer);	
	
	
  var client = new GStreetviewClient();
  if(panorama != null){
    if(nextPanorama != null){
        panorama.followLink(nextPanorama.yaw);
        lastPanorama = currentPanorama;
        client.getPanoramaById(nextPanorama.panoId, processReturnedData);
    }else{
        client.getNearestPanorama(position, processReturnedData);
    }
  }
  
  intervalRand = 500 + Math.floor(Math.random()*10000);
  walkTimer = setTimeout(walk, intervalRand);
}



function processReturnedData(panoramaData) {
    if (panoramaData.code != 200) {
        return;
    }
    
    currentPanorama = panoramaData.location;

    var nextPanoramas = new Array();
    for(var linkIndex = 0; linkIndex < panoramaData.links.length; linkIndex++) {
        var link = panoramaData.links[linkIndex];
        if(lastPanorama == null || link.panoId != lastPanorama.panoId || panoramaData.links.length == 1){
            nextPanoramas.push(link);
        }
    }
    nextPanorama = nextPanoramas[Math.floor(Math.random() * nextPanoramas.length)];

    var pov = panorama.getPOV();
    pov.yaw = Math.floor(Math.random()*360);
    panorama.panTo(pov);
}

function theTxt() {
	document.getElementById('innerTxt').innerHTML = myTxt; //+ ', ' + val + ', ' + keyword; //stateName[stateName.length-1];
}
function eraseTxt() {
	document.getElementById('innerTxt').innerHTML = "";
	document.title = myTxt; //stateName[stateName.length-1];
}




function viewStyle() {
	randYaw = Math.floor(Math.random()*360);
	randPitch = Math.floor(Math.random()*180)-90;
	currentYaw = randYaw;
	currentPitch = randPitch;
	viewTimer1 = setInterval(spiral1, rand1);
  viewTimer2 = setInterval(spiral2, rand2);
  viewTimer3 = setInterval(spiral3, rand3);
}


function spiral1() {
		var turnSpeed = Math.floor(Math.random()*5);
		var dir = Math.floor(Math.random()*2);
	  if (turnSpeed ==1) { this.currentYaw += turnSpeed*-1; } else { this.currentYaw += turnSpeed; }
	  this.panorama.panTo({yaw:this.currentYaw});
}
function spiral2() {
  this.currentZoom = 2;
  this.panorama.panTo({zoom:this.currentZoom});
}
function spiral3() {
		this.currentPitch += 1;
		var rndPattern = Math.floor(Math.random()*4);
		var thePitch;
		if(rndPattern < 2) thePitch = 5;
		else thePitch = 90;
		if (this.currentPitch > thePitch) { this.currentPitch = thePitch*-1; }
		this.panorama.panTo( { pitch:this.currentPitch } );
}

