﻿/***********************************************************
 【Virtual Earth Interactive SDK】
 http://dev.live.com/virtualearth/sdk/

 【The Virtual Earth Documents on MSDN Library】
 http://msdn2.microsoft.com/en-us/library/aa905677.aspx

 【Virtual Earth Map Control SDK, version 5.0 クラスリファレンス】
 http://msdn2.microsoft.com/en-us/library/bb429565.aspx

 【VEMap Event Object Properties】
 http://msdn2.microsoft.com/en-us/library/bb429584.aspx

 【Live Search Maps 担当ブログ】
 http://virtual-earth.spaces.live.com/
***********************************************************/

var map = null;
var pinID = 1;
var g_longitude = null;	// クリック経度(X)
var g_latitude = null;	// クリック緯度(Y)
var offset_X = null;	// X方向オフセット(pixel)
var offset_Y = null;	// Y方向オフセット(pixel)
var zmlvl = 12;			// ズームレベル
var panCtrl = null;		// パンコントロール

/******************************************
	初期化
******************************************/
function Init(){

	// Virtual Earth 初期化
	GetMap();

	// ウォーターマーク表示
	ShowWaterMark("whattext");
	ShowWaterMark("wheretext");
	ShowWaterMark("fromtext");
	ShowWaterMark("totext");
}


/******************************************
	Virtual Earth 初期化
******************************************/
function GetMap(){
	map = new VEMap('myMap');
	map.LoadMap(new VELatLong(34.70542284969138, 135.49824714660644), zmlvl);

	// イベントハンドラの追加
	map.AttachEvent("onchangeview", ViewChangeHandler);
	map.AttachEvent("onmousedown", MouseHandler);

	// 地図情報の初期表示
	ShowMapInfo(null);

	// 画面コントロールの制御
	ControlElements(null);

	// オフセット(ページの左上から地図の左上の差)
	offset_X = map.GetLeft();
	offset_Y = map.GetTop();

	// バージョン表示
	document.getElementById("version").innerHTML = "map control version :<br />" + VEMap.GetVersion();
}


/******************************************
	マウスイベントハンドラ
******************************************/
function MouseHandler(e){

	if(e.eventName == "onmousedown" && e.rightMouseButton){

		if(map.GetMapStyle() != VEMapStyle.Birdseye){

			document.getElementById("menu").style.display = "inline";
			document.getElementById("menu").style.top = e.mapY + offset_Y + "px";
			document.getElementById("menu").style.left = e.mapX + offset_X + "px";

			var latlong = map.PixelToLatLong(new VEPixel(e.mapX, e.mapY));
			g_latitude = latlong.Latitude;
			g_longitude = latlong.Longitude;
			zmlvl = map.GetZoomLevel();
		}
	}else{
		DeleteMenu();
	}
}


/******************************************
	地図表示変更イベントハンドラ
******************************************/
function ViewChangeHandler(e){

	// 地図情報の表示
	ShowMapInfo(e);

	// 画面コントロールの制御
	ControlElements(e);
}


/******************************************
	地図情報の表示
******************************************/
function ShowMapInfo(e){
	var point = map.GetCenter();
	document.getElementById("px").innerHTML = point.Longitude;
	document.getElementById("py").innerHTML = point.Latitude;
	document.getElementById("zoomlevel").innerHTML = e==null ? zmlvl:map.GetZoomLevel();
}


/******************************************
	画面コントロールの制御
******************************************/
function ControlElements(e){

	// 鳥瞰図ビュー
	if(map.IsBirdseyeAvailable()){
		document.getElementById("optBridseyeView").disabled = false;
	}else{
		document.getElementById("optBridseyeView").disabled = true;
	}
}


/******************************************
	プッシュピンの追加
******************************************/
function AddPin(){
	var detail = '<a href="javascript:DeletePin(' + pinID + ')">このピンを削除</a>';
	var pin = new VEPushpin(
				pinID,								// プッシュピンID
				new VELatLong(g_latitude, g_longitude),		// ピンを刺す場所(VELatLong)
				null,								// ピンのアイコン(画像を指定)
				pinID.toString()+"番目のピンです",	// タイトル
				detail,								// 本文
				null,								// アイコンのスタイル
				null,								// タイトルのスタイル
				null								// 本文のスタイル
				);
	map.AddPushpin(pin);
	pinID++;
	DeleteMenu();
}


/******************************************
	任意のプッシュピンの削除
******************************************/
function DeletePin(id){
	map.DeletePushpin(id);
}


/******************************************
	全てのプッシュピンの削除
******************************************/
function DeleteAllPins(){
	map.DeleteAllPushpins();
	pinID = 1;
}


/******************************************
	ここへズームイン
******************************************/
function ZoomInHere(){
	map.SetCenterAndZoom(new VELatLong(g_latitude, g_longitude), ++zmlvl);
	DeleteMenu();
}


/******************************************
	ここをズームアウト
******************************************/
function ZoomOutHere(){
	map.SetCenterAndZoom(new VELatLong(g_latitude, g_longitude), --zmlvl);
	DeleteMenu();
}


/******************************************
	ここを地図の中心に
******************************************/
function Center(){
	map.SetCenter(new VELatLong(g_latitude, g_longitude));
	DeleteMenu();
}


/******************************************
	コンテキストメニューを非表示にする
******************************************/
function DeleteMenu(){
	document.getElementById("menu").style.display = "none";
}


/******************************************
	ズームイン
******************************************/
function ZoomIn(){map.ZoomIn();}


/******************************************
	ズームアウト
******************************************/
function ZoomOut(){map.ZoomOut();}


/******************************************
	2D-3Dの変更
******************************************/
function ChangeMapMode(mode){
	var m;
	switch(mode){
		case "2D":
			m = VEMapMode.Mode2D;
			break;
		case "3D":
			m = VEMapMode.Mode3D;
			break;
		default:
			m = VEMapMode.Mode2D;
			break;
	}
	map.SetMapMode(m);
}


/******************************************
	地図の表示スタイルを変更
******************************************/
function ChangeMapStyle(style){
	var s;
	switch(style){
		case "r":
			s = VEMapStyle.Road;
			break;
		case "a":
			s = VEMapStyle.Aerial;
			break;
		case "h":
			s = VEMapStyle.Hybrid;
			break;
		case "o":
			s = VEMapStyle.Birdseye;
			break;
		default:
			s = VEMapStyle.Road;
			break;
	}
	map.SetMapStyle(s);
}


/******************************************
	検索
******************************************/
function Find(){
	/* usage:VEMap.Find(what, where, findType, shapeLayer, startIndex, numberOfResults, showResults, createResults, useDefaultDisambiguation, setBestMapView, callback);*/

	var what = document.getElementById("whattext").value;
	var where = document.getElementById("wheretext").value;

	try{
		map.Find(what, where, null, null, 0, 10, true, true, true, true, onFind);
	}catch(e){
		alert("見つかりませんでした。");
	}

	return false;
}


/******************************************
	function Find のコールバック
******************************************/
// ※VEMap.Findメソッドはwhereの場合VEPlaceクラスを、whatの場合VEFindResultクラスを返す。
function onFind(a, b, location, found, msg){
	//if(results)
	//document.getElementById("results").innerHTML = results.length;
	//ShowResults(results);

/* 大阪とかでも見つかりませんでしたになる（移動はするけど）
	if(!found){
		alert(msg);
	}
*/

	//for(i in a)alert(i+":"+a[i]+"\n");		// JSとか定数の大群。→よってaはコレクション
/*
	alert("a="+a.Name);						// たぶん検索結果のコレクション
	alert("b="+b[0].Name);					// これが結果(配列)
	alert("location="+location[0].Name);	// たぶん住所(場所)
	alert("found="+found);					// 見つかったときtrue、見つからなかったときfalse
	alert("msg="+msg);						// 見つからなかったときにメッセージが入ってた。
*/
}


/******************************************
	検索結果を表示
******************************************/
function ShowResults(results){
	var outStr = "";
	for(i=0;i<results.length;i++){
		if(results[i].Name != "undefined"){
			outStr += "<p>";
			outStr += "<span class='blue'>Name</span>:" + results[i].Name + "<br />";
			outStr += "<span class='blue'>Description</span>:" + results[i].Description + "<br />";
			outStr += "<span class='blue'>Phone</span>:" + results[i].Phone + "<br />";
			outStr += "</p>";
		}
	}
	document.getElementById("results").innerHTML = outStr;
}


/******************************************
	ルート検索
******************************************/
function GetRoute(){
	/* usage:VEMap.GetRoute(start, end, units, route_type, callback);*/

	var from = document.getElementById("fromtext").value;
	var to = document.getElementById("totext").value;

	try{
		map.GetRoute(from, to, VEDistanceUnit.Kilometers, VERouteType.Shortest, onGetRoute);
	}catch(e){
		alert("見つかりませんでした。");
	}

	return false;
}


/******************************************
	function GetRoute のコールバック
******************************************/
function onGetRoute(route){

}


/******************************************
	コレクション読み込み
******************************************/
function LoadCollection(){
	/* usage:VEMap.ImportShapeLayerData(shapeSource, callback, setBestView);*/

	var colid = document.getElementById("collectionidtext").value;

	try{
		var shapeLayer = new VEShapeLayer();
		var shapeSpec = new VEShapeSourceSpecification(VEDataType.VECollection, colid, shapeLayer);
		map.ImportShapeLayerData(shapeSpec, onLoadCollection, true);
	}catch(e){
		alert("読み込みに失敗しました。");
	}

	return false;
}


/******************************************
	function LoadCollection のコールバック
******************************************/
function onLoadCollection(){

}


/******************************************
	ルートの消去
******************************************/
function DeleteRoute(){
	map.DeleteRoute();
}


/******************************************
	ミニマップを表示
******************************************/
function ShowMiniMap(){
	map.ShowMiniMap();
}


/******************************************
	ミニマップを非表示
******************************************/
function HideMiniMap(){
	map.HideMiniMap();
}


/******************************************
	ファインドコントロールを表示
******************************************/
function ShowFindControl(){
	map.ShowFindControl();
}


/******************************************
	ファインドコントロールを非表示
******************************************/
function HideFindControl(){
	map.HideFindControl();
}


/******************************************
	パンコントロールを表示/非表示
******************************************/
function TogglePanControl(){
	if(panCtrl){
		RemovePanControl();
	}else{
		AddPanControl();
	}
}


/******************************************
	パンコントロールを表示
******************************************/
function AddPanControl(){
	if (panCtrl == null){
		panCtrl = document.getElementById("panControl").cloneNode(true);
		panCtrl.style.display = "inline";
		panCtrl.style.top = "10px";		// スタイルシートで設定するとだめみたい
		panCtrl.style.left = "570px";	// スタイルシートで設定するとだめみたい
		map.AddControl(panCtrl);
		addShim(panCtrl);
	}
}

function addShim(el)
{
	var shim = document.createElement("iframe");
	shim.id = "myShim";
	shim.frameBorder = "0";
	shim.style.position = "absolute";
	shim.style.zIndex = "1";
	shim.style.top  = el.offsetTop;
	shim.style.left = el.offsetLeft;
	shim.width  = el.offsetWidth;
	shim.height = el.offsetHeight;
	el.shimElement = shim;
	el.parentNode.insertBefore(shim, el);
}


/******************************************
	パンコントロールを非表示
******************************************/
function RemovePanControl()
{
	if(panCtrl){
		map.DeleteControl(panCtrl);
		panCtrl.style.display = "none";
		panCtrl = null;
	}
}


/******************************************
	パン(連続)スタート
******************************************/
function StartContinuousPan(x, y){
	map.StartContinuousPan(x, y);
}


/******************************************
	パン(連続)ストップ
******************************************/
function EndContinuousPan(){
	map.EndContinuousPan();
}


/******************************************
	検索ウォーターマーク
******************************************/
function HideWaterMark(id){
	var waterMarkText = GetWaterMarkText(id);
	var tb = document.getElementById(id);
	if(tb.value == waterMarkText){
		tb.value = "";
		tb.className = "";
	}
}

function ShowWaterMark(id){
	var waterMarkText = GetWaterMarkText(id);
	var tb = document.getElementById(id);
	if(!tb.value.match(/\S+/)){
		tb.value = waterMarkText;
		tb.className = "watermark";
	}
}

function GetWaterMarkText(id){
	var t = "";
	switch(id){
		case "whattext":
			t = "What";
			break;
		case "wheretext":
			t = "Where";
			break;
		case "fromtext":
			t = "ここから";
			break;
		case "totext":
			t = "ここまで";
			break;
		default:
			t = "";
			break;
	}
	return t;
}

