﻿//
// http://www.0x0000.com/windowslivefan/ve/v02/vesample-tour-editor.htm
//

//
// Default Values
//
var DefaultSearchATagF          = '<a href=\"http://search.live.com/results.aspx?mkt=ja-jp&FORM=MSHUP0&q='; 
var DefaultSearchATagM          = '\" target=\"_new\">';
var DefaultSearchATagR          = '</a>';

var DefaultImageSearchATagF     = '<a href=\"http://search.live.com/images/results.aspx?mkt=ja-jp&FORM=MSHUP0&q='; 
var DefaultImageSearchATagM     = '\" target=\"_new\">';
var DefaultImageSearchATagR     = '</a>';

var DefaultImgTagF              = '<a href=\"'; 
var DefaultImgTagM              = '\" target=\"_new\"><img src=\"';
var DefaultImgTagR              = '\" width=\"200\"></a><br />';

var DefaultPinImgTagF           = '<a href=\"'; 
var DefaultPinImgTagM           = '\" target=\"_new\"><img src=\"';
var DefaultPinImgTagR           = '\" style=\"height: 50\; width: 50\; float: left\;\"></a> ';

//
// VE map related objects & values
//
var map             = null;
var MyLatLong       = null;
//var MyPrevLatLong   = null;
var pinID           = 1; // pinID will start with 1
var maxPinNum       = 200; // Pin の最大数は 200
MyPin               = new Array(maxPinNum); 


var NavString                   = "";
var NavStepString               = "";
var NavStepStringCurrentNum     = 0;
var NavStepStringElements       = "";

//Record ID 
var RecID = 0;

//
//enumeration {ElementREC, ElementLatitude, ElementLongitude, ElementZoom, ElementMapStyle, ElementScenID, ElementScenOrientation, ElementIMGURL, ElementTITLE, ElementCOMMENT};
//
var ElementREC              = 0;
var ElementLatitude         = 1;
var ElementLongitude        = 2;
var ElementZoom             = 3;
var ElementMapStyle         = 4;
var ElementScenID           = 5;
var ElementScenOrientation  = 6;
var ElementIMGURL           = 7;
var ElementTITLE            = 8;
var ElementCOMMENT          = 9;
var ElementCOMMAND          = 10;

//
// Event Control
//
var ActionFlag              = 0;
//
var ActionFlagInitialize    = 0;
var ActionFlagContinue      = 1;
var ActionFlagPause         = 2;
var ActionFlagStop          = 3;
//
var IntervalTime            = 2000;
var IntervalID              = null;

//
//
//
function ChangeIntervalTime()
{
    var selectednumber = document.getElementById('SelectInterval').selectedIndex;
    switch (selectednumber){
        case 0:
            IntervalTime = 1000;  
            break;
        case 1:
            IntervalTime = 2000;  
            break;
        case 2:
            IntervalTime = 3000;  
            break;
        case 3:
            IntervalTime = 4000;  
            break;
        case 4:
            IntervalTime = 5000;  
            break;
    }

}

//
//
//
function OnPageLoad()
{
    var mapstyle = DefaultMapStyle;
    MyLatLong = new VELatLong(parseFloat(DefaultLatitude),parseFloat(DefaultLongtitude));
    //MapCenterLatLong = = new VELatLong(parseFloat(DefaultLatitude),parseFloat(DefaultLongtitude));
    //MyPrevLatLong = new VELatLong(parseFloat(DefaultLatitude),parseFloat(DefaultLongtitude)); // Rout Finder Test...
    var zoom = DefaultMapZoomValue;
    
    map = new VEMap('myMap');
    map.onLoadMap = function(){ alert('マップが読み込まれました。｢ツアー開始」ボタンを押してください！') }; // Call Back Function Test...
    map.LoadMap(MyLatLong, zoom ,mapstyle ,false);
  
    //
    // Attach Local Functions to the map events
    //
    map.AttachEvent('onendcontinuouspan', MyOnEndContinuouSpan);
    map.AttachEvent('onendzoom', MyOnEndZoom);
    map.AttachEvent('onclick', MyOnClick);

    function MyUpdateMapInfo(e)
    {
        //
        // Display Map Values
        //
        //document.getElementById('latitude').innerHTML = e.view.latlong.latitude;
        //document.getElementById('longitude').innerHTML = e.view.latlong.longitude;
        //document.getElementById('zoom').innerHTML = e.view.zoomLevel;
        //document.getElementById('MapStyle').innerHTML = e.view.mapStyle;
        //document.getElementById('ScenID').innerHTML = e.view.sceneId;
        //document.getElementById('ScenOrientation').innerHTML = e.view.sceneOrientation; 

/*
MapCenterLatLong = map.GetCenter();
new VELatLong(parseFloat(DefaultLatitude),parseFloat(DefaultLongtitude));
var points = new Array(
              new VELatLong(45.01188,-111.06687),
              new VELatLong(45.01534,-104.06324),
              new VELatLong(41.01929,-104.06),
              new VELatLong(41.003,-111.05878),
              new VELatLong(45.01188,-111.06687)
);
*/

    }
   
    function MyOnEndContinuouSpan(e)
    {
        MyUpdateMapInfo(e);
    }
    
    function MyOnEndZoom(e)
    {
        MyUpdateMapInfo(e);
    }
    
    function MyOnClick(e)
    {
        MyUpdateMapInfo(e);
    }

    //
    // Attache OnKeyDown function to the document object
    //
    document.getElementById('myMap').onkeydown = MyOnKeyDown;
    //document.getElementById('myMap').ondblclick = MyOnDblClick;

    //
    // Initializing ActionRecords data
    //
	document.getElementById('ActionRecords').value 	= InitialString; // Initial String を別ファイルとして読み込むように変更すること

    map.Pan(0,0); //マップパンイベントを利用して位置情報のアップデート - うまく機能せず？

}

/*
//
//
//
function MyOnDblClick()
{

}
*/

//
// Document 内で Key が押されたときの Function
//
function MyOnKeyDown()
{
	var MyChar = String.fromCharCode(window.event.keyCode);

	// z か Z key を押したときに現在のマップ情報を ActionRecords エリアの最後に追加します、データを作るときのために利用します
	if(MyChar == 'z' || MyChar == 'Z'){ 
		document.getElementById('ActionRecords').value
			= document.getElementById('ActionRecords').value // Preious String
			+ "REC:" + RecID
			+ "\tlatitude:" + document.getElementById('latitude').innerHTML
			+ "\tlongitude:" + document.getElementById('longitude').innerHTML
			+ "\tzoom:" + document.getElementById('zoom').innerHTML
			+ "\tMapStyle:" + document.getElementById('MapStyle').innerHTML
			+ "\tScenID:" + document.getElementById('ScenID').innerHTML
			+ "\tScenOrientation:" +document.getElementById('ScenOrientation').innerHTML
			+ "\tImageURL:" + "IMGURL"
			+ "\tTitle:" + "TITLE"
			+ "\tComment:" + "COMMENT"
			+ "\tCommand:" + "COMMAND"
			
			+ "\n"; // CR
		
		RecID = RecID + 1; // RecID は 0 から順番に増えているだけ
		return true;
	}
	
	// x か X key が押されたときにマウスの位置を中心に移動する
	if(MyChar == 'x' || MyChar == 'X'){
        var onclickx = window.event.offsetX;
        var onclicky = window.event.offsetY;
        var onclicklatlong = map.PixelToLatLong(onclickx, onclicky);

        map.SetCenter(onclicklatlong);
		return true;
	}
	else{
		return false;
	}
}

//
// { と } で囲まれた文字を検索できるようにする function
//
function ModifyString(str)
{
    var startchar   = '{';
    var endchar     = '}';

    var frontstring;
    var encodestring;
    var rearstring;

    var startcount  = 0;
    var endcount    = 0;
    var startflag   = 0; 
    var endtflag    = 0; 

    var flag        = true;

    while(flag){

        startflag = str.indexOf(startchar,startcount);
        endflag = str.indexOf(endchar,endcount);

        if(startflag >= 0 && endflag >= 0){
            frontstring = str.substring(0,startflag);
            encodestring = str.substring((startflag+1),endflag);
            rearstring = str.substring((endflag+1),str.length);
            str = frontstring + DefaultSearchATagF + encodeURIComponent(encodestring) + DefaultSearchATagM + encodestring + DefaultSearchATagR + rearstring;
        }
        else{
            flag = false;
        }
    }
    return str;
}

//
//
//
function OnButtonClickCenterMap(lat, lon, mapstyle)
{
    var LatLong = new VELatLong(parseFloat(lat),parseFloat(lon));

	map.SetMapStyle(mapstyle);
	map.SetCenter(LatLong);
}

//
// Start Navigation が押されたときの Function
//
function StartMyNavigation()
{
	if(ActionFlag == ActionFlagContinue){

		tempREC = new Number();
		var tempLatitude;// = new Number();
		var tempLongitude;// = new Number();
		tempZoom = new Number();
		var tempMapStyle;
		tempScenID = new Number();
		var tempScenOrientation;
		var tempIMGURL;
		var tempTITLE;
		var tempCOMMENT;
		var tempCOMMAND;

		NavStepStringElements = NavStepString[NavStepStringCurrentNum].split("\t");// 一行の中をタブで String Array 要素に分解
		
		tempREC = NavStepStringElements[ElementREC].substring((NavStepStringElements[ElementREC].indexOf(":")+1),NavStepStringElements[ElementREC].length);
		tempLatitude = NavStepStringElements[ElementLatitude].substring((NavStepStringElements[ElementLatitude].indexOf(":")+1),NavStepStringElements[ElementLatitude].length);
		tempLongitude = NavStepStringElements[ElementLongitude].substring((NavStepStringElements[ElementLongitude].indexOf(":")+1),NavStepStringElements[ElementLongitude].length);
		tempZoom = NavStepStringElements[ElementZoom].substring((NavStepStringElements[ElementZoom].indexOf(":")+1),NavStepStringElements[ElementZoom].length);
		tempMapStyle = NavStepStringElements[ElementMapStyle].substring((NavStepStringElements[ElementMapStyle].indexOf(":")+1),NavStepStringElements[ElementMapStyle].length);
		tempScenID = NavStepStringElements[ElementScenID].substring((NavStepStringElements[ElementScenID].indexOf(":")+1),NavStepStringElements[ElementScenID].length);
		tempScenOrientation = NavStepStringElements[ElementScenOrientation].substring((NavStepStringElements[ElementScenOrientation].indexOf(":")+1),NavStepStringElements[ElementScenOrientation].length);
		tempIMGURL = NavStepStringElements[ElementIMGURL].substring((NavStepStringElements[ElementIMGURL].indexOf(":")+1),NavStepStringElements[ElementIMGURL].length);
		tempTITLE = NavStepStringElements[ElementTITLE].substring((NavStepStringElements[ElementTITLE].indexOf(":")+1),NavStepStringElements[ElementTITLE].length);
		tempCOMMENT = NavStepStringElements[ElementCOMMENT].substring((NavStepStringElements[ElementCOMMENT].indexOf(":")+1),NavStepStringElements[ElementCOMMENT].length);
		tempCOMMAND = NavStepStringElements[ElementCOMMAND].substring((NavStepStringElements[ElementCOMMAND].indexOf(":")+1),NavStepStringElements[ElementCOMMAND].length-1);// \n の分を引く

        document.getElementById('RecID').innerHTML = tempREC;

	    tempCOMMENT = ModifyString(tempCOMMENT);
		
		MyLatLong.Latitude = tempLatitude;
		MyLatLong.Longitude = tempLongitude;
		
        if(tempMapStyle == 'o'){// Birds Eyes にした場合、画像が追いつかない現象あり		
    		//map.SetMapStyle(tempMapStyle);
    		//map.SetBirdseyeScene(tempScenID);
	    	//map.SetBirdseyeOrientation(tempScenOrientation);
    		map.SetCenter(MyLatLong);
    		//map.SetZoomLevel(tempZoom);
		}
		else{
    		//map.SetMapStyle(tempMapStyle);
    		map.SetCenter(MyLatLong);
    		//map.SetZoomLevel(tempZoom);
        }

		if(tempIMGURL != 'IMGURL'){
			var PrevInnerHTML = document.getElementById('CommentArea').innerHTML;
			document.getElementById('CommentArea').innerHTML = DefaultImgTagF + tempIMGURL + DefaultImgTagM + tempIMGURL + DefaultImgTagR + PrevInnerHTML;
		}

		if(tempTITLE != 'TITLE' || tempCOMMENT != 'COMMENT'){
			var PrevInnerHTML = document.getElementById('CommentArea').innerHTML;
		    if(tempTITLE == 'TITLE'){
		        tempTITLE = "Virtual Earth...";
		    }
		    if(tempCOMMENT == 'COMMENT'){
		        tempCOMMENT = "...";
		    }
			document.getElementById('CommentArea').innerHTML = '<input id=\"OnButtonClickCenterMapButton' + pinID + '\" onclick=\"OnButtonClickCenterMap(' + tempLatitude + ',' + tempLongitude + ',\'' + tempMapStyle + '\')\" type=\"button\" value=\"No.' + pinID + '\" name=\"OnButtonClickCenterMapButton' + pinID + '\">' + DefaultSearchATagF + encodeURIComponent(tempTITLE) + DefaultSearchATagM + tempTITLE + DefaultSearchATagR + ' ' +DefaultImageSearchATagF + encodeURIComponent(tempTITLE) + DefaultImageSearchATagM + '<img src="http://www.0x0000.com/windowslivefan/ve/v02/IMG.jpg">' + DefaultImageSearchATagR + '<br />' + tempCOMMENT + '<br />' + PrevInnerHTML;
		}
		
		if(tempIMGURL != 'IMGURL' || tempTITLE != 'TITLE' || tempCOMMENT != 'COMMENT'){
		    if(tempIMGURL == 'IMGURL'){
		        tempIMGURL = TourPinImgURL;
		    }

		    if(tempTITLE == 'TITLE'){
		        tempTITLE = "Virtual Earth...";
		    }
		    if(tempCOMMENT == 'COMMENT'){
		        tempCOMMENT = "...";
		    }
		
            if(tempCOMMAND != 'NOPIN' && pinID < maxPinNum){
                MyPin[pinID] = new VEPushpin(
                    pinID, 
                    map.GetCenter(), 
                    TourPinImgURL, 
                    DefaultSearchATagF + encodeURIComponent(tempTITLE) + DefaultSearchATagM + tempTITLE + DefaultSearchATagR + ' ' +DefaultImageSearchATagF + encodeURIComponent(tempTITLE) + DefaultImageSearchATagM + '<img src="http://www.0x0000.com/windowslivefan/ve/v02/IMG.jpg">' + DefaultImageSearchATagR, 
                    DefaultPinImgTagF + tempIMGURL + DefaultPinImgTagM + tempIMGURL + DefaultPinImgTagR + 'No.' + pinID +': '+ tempCOMMENT + MoreLink
                    );
                map.AddPushpin(MyPin[pinID]);
                pinID++;
            }
/*
            if((MyPrevLatLong.Latitude != MyLatLong.Latitude) || (MyPrevLatLong.Longitude != MyLatLong.Longitude)){
                map.GetRoute(MyPrevLatLong, MyLatLong);
            }
    		MyPrevLatLong.Latitude = MyLatLong.Latitude;
    		MyPrevLatLong.Longitude = MyLatLong.Longitude;
*/
        }		
		

		NavStepStringCurrentNum++;
		if(NavStepString[NavStepStringCurrentNum].length <= 0 || NavStepString[NavStepStringCurrentNum].indexOf("REC:",0) < 0){
			// alert('ストリングサイズ'+NavStepString[NavStepStringCurrentNum].length) // Debug Purpose
			ActionFlag = ActionFlagStop;
		}
	}

    //
    // Navigation が開始されたときに最初に処理をおこなうルーチン
    //
	if(ActionFlag == ActionFlagInitialize){
		NavString = document.getElementById('ActionRecords').value; // document の AcrionRecords Text Area のデータを読み込む
		NavStepString = NavString.split("\n"); // 読み込んだデータを改行文字で String Array に分解
		NavStepStringCurrentNum = 0; // Navigation のステップをイニシャライズ
        document.getElementById('CommentArea').innerHTML =　""; // コメントエリアをクリアー
		map.DeleteAllPushpins(); // プッシュピンを削除
		pinID = 1; // プッシュピン番号を 1 に戻す
        if(NavStepString[NavStepStringCurrentNum].length > 0 && NavStepString[NavStepStringCurrentNum].indexOf("REC:",0) >= 0){// Navigation する情報があるかをチェック
    		ActionFlag = ActionFlagContinue // 実際の Navigation を開始するフラグを設定
        }
        else{
			ActionFlag = ActionFlagStop;
        }		
	}	
	
    //
    //
    //
	if(ActionFlag == ActionFlagStop){
		clearInterval(IntervalID);
		ActionFlag = ActionFlagInitialize;
		alert('再生が終了しました！');
	}
		
}

//
//
//
function PauseMyNavigation()
{
	clearInterval(IntervalID);
}

//
//
//
function StopMyNavigation()
{
	clearInterval(IntervalID); 

	ActionFlag = ActionFlagInitialize;
    //MyPrevLatLong = null;
}

//
//
//
function ClearMyRecord()
{
    StopMyNavigation();
	document.getElementById('ActionRecords').value = "";
	RecID = 0;
	return true;
}

//
// Generate JS Code Function
//
function GenerateCode()
{
    var winobj = null;
    var codestring = "";
    var fso;
     
    StopMyNavigation();

/*　
    // File IO - そのままコード書き出すようにする
   
    if((fso = new ActiveXObject("Scripting.FileSystemObject")) != null){
        var a = fso.CreateTextFile(".\result.txt", true);
        var b = fso.OpenFile(".\vesample12.htm", true);
        
        a.WriteLine("This is a test.");
        a.Close();
    }
    else{
*/

        // Open html page
        winobj = window.open("http://www.0x0000.com/windowslivefan/ve/v02/tk-vesample-editor-code.htm","CodeTxtWin","toolbar=yes,location=yes,directories=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes");

        // Replace \t, \n., \r 
        codestring = document.getElementById('ActionRecords').value;
        codestring = codestring.replace(/\t/g,"\\t");
        codestring = codestring.replace(/\n/g,"\\n");
        codestring = codestring.replace(/\r/g,"");

        // Write code to the opened window text area
        try{
            winobj.document.getElementById('CodeActionRecords').innerHTML 
            = 
            winobj.document.getElementById('FrontCodeArea').innerHTML 
            + "\n" 
            + 'var InitialString = \"' + codestring + "\";" 
            + "\n" 
            + winobj.document.getElementById('RearCodeArea').innerHTML
            + "\n";       
        }
        catch (e) {
    		alert('コードをうまく書き出せませんでした。\n新しく開いた Window を閉じずに\nもう一度「HTMLデータの作成」ボタンを押してください。');
        }
/*
    }
*/        

}

//
//
//
function FindBoth()
{
    map.Find(document.getElementById('txtWhat').value, document.getElementById('txtWhere').value);
}

//
// Map Control Functions...
//
function DoPanUp()
{
    map.Pan(0, -10, null);
}

function DoPanDown()
{
    map.Pan(0, 10, null);
}

function DoPanLeft()
{
    map.Pan(-10, 0, null);
}

function DoPanRight()
{
    map.Pan(10, 0, null);
}

function DoZoomIn()
{
    map.ZoomIn();
}

function DoZoomOut()
{
    map.ZoomOut();
}

