
//-----------------------------------------------------------
//	ウィンドウ全体の処理
//-----------------------------------------------------------

// イベントリスナを登録
function addListener(elem, eventType, func, cap) {
	if (elem.attachEvent) {
		elem.attachEvent('on' + eventType, func);
	} else if (elem.addEventListener) {
		elem.addEventListener(eventType, func, cap);
	} else {
		alert('No support on your browser');
		return false;
	}
};

// イベントリスナを削除
function removeListener(elem, eventType, func, cap) {
	if (elem.detachEvent) {
		elem.detachEvent('on' + eventType, func);
	} else if (elem.removeEventListener) {
		elem.removeEventListener(eventType, func, cap);
	} else {
		alert('No support on your browser');
		return false;
	}
};

function getEventTarget(e) {
	var target = null;
	if (e && e.target) {
		target = e.target;
	} else if (e && e.srcElement) {
		target = e.srcElement;
	}
	return target;
};

function init() {
	//print map
	var p = document.getElementById("print");
	if (p) addListener(p, "click", printMap, false);
	// HTML読込完了後に地図作成処理を開始する
	AlpsMapUtil.callAlpsOnload();
}

function unload() {
	_m.release();
	_ms.release();
}

addListener(window, "load", init, false);

//addListener(window, "unload", unload, false);

//-----------------------------------------------------------
//	WebDrive
//-----------------------------------------------------------

var defpos = null;

var _m  = null;	// 地図操作クラス（ProAtlasMapCtrl）インスタンス
var _ms = null;	// 図形操作クラス（MapsvrCtrl）インスタンス

function alpsAspOnload() {
	// 吹き出し型ポップアップ
	//AlpsPOIUtil.setBalloonPopup();

	// 地図操作クラス（ProAtlasMapCtrl）インスタンスの作成
	_m  = AlpsMapUtil.createMapCtrl('map', defpos);
	// 図形操作クラス（MapsvrCtrl）インスタンスの作成
	_ms = AlpsMapUtil.createMapsvrCtrl(_m, USR_POI_CATEGORY);

	// POI作成1
	if (typeof(_iconpoints) != "undefined") {
		var a = new Array();
		var clist = _ms.getCategoryList();
		for (var i = 0; i < _iconpoints.length; i++) {
			//alert(_iconpoints[i].icon);
			for (var j = 0; j < clist.length; j++) {
				if (clist[j].id == _iconpoints[i].icon) {
					var poi = new MapsvrPOI(i.toString(10), "", new LLPoint(_iconpoints[i].pos), _iconpoints[i].icon, null);
					a.push(_iconpoints[i].icon);
					_ms.addContents(poi);
					//alert("addContents("+_iconpoints[i].pos+", "+_iconpoints[i].icon+")");
					break;
				}
			}
		}
		_ms.showCategories(a);
	}

	// アルプス定義カテゴリ カテゴリに追加
	addUserCategory("../alpspoi_shape.xml", "xml");
	var a = _ms.category;
	a.push(ROUTE_LINE_CATEGORY);
	a.push(STATION_ICON_CATEGORY);
	a.push(IC_ICON_CATEGORY);
	_ms.showCategories(a);

	// 地図操作イベントハンドラの登録
	// 地図の移動、縮尺変更等の操作時に、
	// 登録したイベントハンドラが呼び出されます。
	AlpsEvent.addEvent(_m, "mapMoved", mapMoved);				// 地図移動時のイベントハンドラ
	AlpsEvent.addEvent(_m, "layerChanged", layerChanged);		// 縮尺変更時のイベントハンドラ
//	AlpsEvent.addEvent(_m, "layerListChanged", layerListChanged);

	// ホイール操作を無効にする
	_m.setEnableWheelOperation(false);
	_m.setEnableAutoLayerChange(true);
	_m.setEnableKeyboardOperation(false);
	_m.setVisibleCenterMark(false);

	// PackageCtrl
	//AlpsMapUtil.setPackageCtrlUI(_m, new ImgPkgCtrlUI());

	// LayerCtrl
	AlpsMapUtil.setLayerCtrlUI(_m, LAYER_CTRL);

	AlpsMapUtil.createScalebar(_m, 'scale_bar');				// スケールバー

	//Sub Map
	if (document.getElementById('submap')) {
		AlpsMapUtil.createSubMap(_m, 'submap', false);
	}

	// 戻るボタンにイベントリスナを登録
	var e = document.getElementById('init');
	if (e)addListener(e, "click", initMap, false);

	// 最寄駅
	var ne = document.getElementById("nrstroute");
	if (ne) {
		nearStationSearch();
	}

	// 最寄IC
	var ic = document.getElementById('nricroute');
	if (ic) {
		nearStationSearch();
		nearICSearch();
	}

	// 略地図
	// 地図+リストは変数が宣言されていないので宣言しておく
	if (typeof _ryakuMapFlg == 'undefined') {
		_ryakuMapFlg = undefined;
	}
	// 略地図初回切替時に一瞬「×」アイコンが出ると見苦しいので空白画像を表示しておく
	if (_ryakuMapFlg) {
		document.getElementById('ryakumap').src = "../images/spc.gif"
	}

	sokodoko();		// 中心点の住所表示
	mapcode();		// マップコード

	alpsAspOnloaded();
};

function addUserCategory(param, strType) {
	if (typeof(param) != "string") return this.loadParamObject(param);
	//var contentsServer = null;	// サーバーはアルプス定義ファイルで設定されているはず
	//var drawServer = null;
	var doc = null;
	var popupxsl = null;
	var popupxslServer = null;

	if (strType != null && strType == "string") {
		doc = AlpsUtil.getXMLDOMFromStr(param);
	} else {
		doc = AlpsUtil.getXMLDOM(param);
	}
	if (!doc) return;
	var n = doc.getElementsByTagName("poi")[0];
	if (n) {
		//_ms.contentsServer = n.getAttribute("server");
		var popup = AlpsUtil.getElementAttribute(n, "popup", "href");
		if (popup) {
			if (typeof(XSLTProcessor) != "undefined") {
				popupxsl = new XSLTProcessor();
				popupxsl.importStylesheet(AlpsUtil.getXMLDOM(popup));
			} else {
				popupxsl = AlpsUtil.getXMLDOM(popup);
			}
		}
		popupxslServer = AlpsUtil.getElementAttribute(n, "popup", "server");
		var nl0 = n.getElementsByTagName("category");
		for (var i = 0 ; i < nl0.length; i++) {
			var n0 = nl0[i];
			var c = new MapsvrCategory(n0.getAttribute("id"), n0.getAttribute("name"));
			if (n0.getAttribute("auto") == "no") c.auto = false;
			var nl1 = n0.childNodes;
			for (var j = 0; j < nl1.length; j++) {
				var n1 = nl1[j];
				if (n1.nodeType != 1) continue;
				if (n1.nodeName == "icon") {
					var s = parseInt(n1.getAttribute("status") || "0");
					c.iconImage[s] = n1.getAttribute("src");
					c.iconSize[s] = parseInt(n1.getAttribute("size") || "16");
					var dx = parseInt(n1.getAttribute("dx") || "0");
					var dy = parseInt(n1.getAttribute("dy") || "0");
					c.iconDiff[s] = new Point(dx, dy);
				} else if (n1.nodeName == "expand") {
					var s = parseInt(n1.getAttribute("status") || "0");
					c.expandImage[s] = n1.getAttribute("src");
					c.expandSize[s] = parseInt(n1.getAttribute("size") || "16");
					var dx = parseInt(n1.getAttribute("dx") || "0");
					var dy = parseInt(n1.getAttribute("dy") || "0");
					c.expandDiff[s] = new Point(dx, dy);
				}
			}
			_ms.addCategory(c);
		}
	}
	n = doc.getElementsByTagName("shape")[0];
	if (n) {
		// これをセットしないと図形描画されない
		//_ms.drawServer = n.getAttribute("server");
		var nl0 = n.getElementsByTagName("category");
		for (var i = 0; i < nl0.length; i++) {
			var n0 = nl0[i];
			var c = new MapsvrCategory(n0.getAttribute("id"), n0.getAttribute("name"));
			var nl1 = n0.childNodes;
			for (var j = 0; j < nl1.length; j++) {
				var n1 = nl1[j];
				if (n1.nodeType != 1) continue;
				if (n1.nodeName == "line") {
					var s = parseInt(n1.getAttribute("status") || "0");
					var style = n1.getAttribute("style");
					c.style[s] = style?("line:"+style):"line";
				} else if (n1.nodeName == "area") {
					var s = parseInt(n1.getAttribute("status") || "0");
					var style = n1.getAttribute("style");
					c.style[s] = style?("area:"+style):"area";
				} else if (n1.nodeName == "circle") {
					var s = parseInt(n1.getAttribute("status") || "0");
					var style = n1.getAttribute("style");
					c.style[s] = style?("circle:"+style):"circle";
				}
			}
			_ms.addCategory(c);
		}
	}
};

/**
 * 「戻る」ボタン（初期位置・縮尺に戻る）を押したときのイベントハンドラ
 */
function initMap() {
    if (_ryakuMapFlg) {
    	// 略地図表示が可能な場合はセッションを初期化
		crearRyakuMapInSession(doInitMap);
	} else {
		doInitMap();
	}
};

/**
 * 初期位置・縮尺に戻す処理
 */
function doInitMap() {
	if (!_m) return;
	if (_dispmap == true ) {
		// 略地図がオモテ面になっている場合は標準地図に戻す
		doDispChange();
		_dispmap = false;
	}
	routeClear(ROUTE_LINE_ID, STATION_POI_ID);
	AlpsMapUtil.defaultTo(_m);
};

var iconMode = -1;

// 地図で表示している縮尺が変化した際に呼び出される、イベントハンドラです。
// このイベントハンドラは、AlpsEvent.addEvent()にて、ProAtlasMapCtrlに登録されています。
function layerChanged() {
//	set_layers();		// 表示している縮尺リストの更新
	var scale = _m.getLayerScale(_m.getCurrentLayerId());
	var mode = (scale <= LIMITSCALE) ? 0 : 1 ;
	if (mode != iconMode) {
		iconMode = mode;
		iconChange(mode);
	}
//	if (typeof(clearPointList) != "undefined") {
		clearPointList();
//	}
};

// 地図が移動した際に呼び出される、イベントハンドラです。
// このイベントハンドラは、AlpsEvent.addEvent()にて、ProAtlasMapCtrlに登録されています。
function mapMoved() {
	sokodoko();		//中心点の住所表示
	mapcode();		//マップコード
};

// アイコンの種類を切り替えます。
// mode 1:ノーマル 2:スモール
function iconChange(mode) {
	//alert("mode = "+mode);

	if (!_iconpoints || _iconpoints.length == 0) return;
	if (!_ms) return;

	for (var i = 0; i < _iconpoints.length; i++) {
		_ms.setContentsStatus(i.toString(10), mode);
	}
};

//-----------------------------------------------------------
//	Near Station Routing
//-----------------------------------------------------------

var _ls    = null;
var _lsin  = null;
var _lsout = null;

var stations = new Array();
var stios    = new Array();
var ics      = new Array();

var _selroute = -1;			//最寄検索フラグ

function Landmark(item, no) {
	this.item = item;
	this.no = no;
};

/**
 * 最寄駅検索 初期化処理
 */
function nearStationSearch() {
	if (typeof(USER_ROUTE) != 'undefined') {
		setNrStation(USER_ROUTE.lsout);
		return;
	}

	if (!_ls) {
		_ls = new LandmarkSearchService();
//		AlpsEvent.addEvent(_ls, "landmarkSearched", landmarkSearched);
	}
	if (_lsin) {
		delete _lsin;
	}

	_lsin = new LandmarkSearchInput();	//検索条件
	setLandmarkSearchInput();			//検索条件のセット

	_ls.landmarkSearch(_lsin, landmarkSearched);
};

function landmarkSearched(lsout) {
	setNrStation(lsout);
};

function genreListed() {
	setResult();
};

function setLandmarkSearchInput() {
	if (!_iconpoints || _iconpoints.length == 0) return;
	if (MAX_RADIUS == 'undefined') MAX_RADIUS = "10000";
	_lsin.search = "";
	_lsin.genre = "12,99";
	_lsin.point = new LLPoint(_iconpoints[0].pos);
	_lsin.radiusmax = MAX_RADIUS;
	_lsin.radiusstep = STEP_RADIUS;
	_lsin.radiusmin = MIN_RADIUS;
	_lsin.address = "";
	_lsin.outdatum = "Tokyo97";
	_lsin.searchstation = "true";
	_lsin.rrso = "true";
	_lsin.sort = "2,4";  // 距離, 駅コードでソート
};

/**
 * 最寄駅検索部品を生成するDOMオブジェクト操作
 */
function setNrStation(lsout) {
	var label = document.getElementById("nrstlabel");
	if (label) {
		for (var i = label.childNodes.length-1; i >= 0; i--) {
			label.removeChild(label.childNodes[0]);
		}
		label.appendChild(document.createTextNode("最寄駅:"));
	}
	var td = document.getElementById("nrstlist");
	if (td || tdic) {
		for (var i = td.childNodes.length-1; i >= 0; i--) {
			td.removeChild(td.childNodes[0]);
		}
		var items = lsout.resultItem;
		if (!items || items.length == 0) {
			var d = parseFloat(MAX_RADIUS);
			d = d / 1000;
			var r = d.toString();
			var n = r.indexOf(".");
			if (n != -1 && r.length > n + 2) r = r.substring(0, n + 2);
			var text = " 半径" + r + "km以内に駅がありません。";
			td.appendChild(document.createTextNode(text));
			return;
		}
		else if (items.length > 0) {

			for (var i = 0; i < items.length; i++) {
				var item = items[i];
				var land = new Landmark(item, i + 1);
				if (item.genreCode == "12") {
					stations.push(land);
				}
				else if (item.genreCode == "99") {
					stios.push(land);
				}
			}
//			stations.sort(landmarkSort);
//			stios.sort(landmarkSort);
			//最寄駅プルダウンリスト
			var selStation = createStationList("station", stations, null);
			if (selStation) {
				td.appendChild(selStation);
				td.appendChild(document.createElement("br"));
				var station = getStationName(stations, selStation.value);
				addListener(selStation, "change", stationChanged, false);
				//
				var matchname = station;
				var index = station.indexOf("【");
				var index2 = station.indexOf("［");
				if (index2 != -1) index = index2;
				if (index != -1)matchname = station.substring(0, index);
				else matchname = station;
				var selStio = createStationList("stio", stios, matchname);
				td.appendChild(selStio);
			}

			//ルート表示ボタン・クリアボタン
			var td2 = document.getElementById("nrstbtn");
			if (td2) {
				_initRouteButtons();
				_appendRouteButtonsTo(td2);
			}
		}
	}
};

//------------------------------------------------
//	Near IC Routing
//------------------------------------------------

//最寄IC検索開始
function nearICSearch() {
	if (!_ls) {
		_ls = new LandmarkSearchService();
//		AlpsEvent.addEvent(_ls, "landmarkSearched", landmarkSearched);
	}
	if (_lsin) {
		delete _lsin;
	}

	_lsin = new LandmarkSearchInput();	//検索条件
	setICSearchInput();			//検索条件のセット

	_ls.landmarkSearch(_lsin, ICSearched);
};

function ICSearched(lsout) {
	setIC(lsout);
};

function setICSearchInput() {
	if (!_iconpoints || _iconpoints.length == 0) return;
	if (MAX_RADIUS_IC == 'undefined') MAX_RADIUS_IC = "30000";
	_lsin.search = "";
	_lsin.genre = "13";
	_lsin.point = new LLPoint(_iconpoints[0].pos);
	_lsin.radiusmax = MAX_RADIUS_IC;
	_lsin.radiusstep = "5000";
	_lsin.radiusmin = "5000";
//	_lsin.radius = MAX_RADIUS_IC;
	_lsin.address = "";
	_lsin.outdatum = "Tokyo97";
	_lsin.ico = "true";
};

function setIC(lsout) {
	var label = document.getElementById("nriclabel");
	if (label) {
		for (var i = label.childNodes.length-1; i >= 0; i--) {
			label.removeChild(label.childNodes[0]);
		}
		label.appendChild(document.createTextNode("最寄IC:"));
	}
	var td = document.getElementById("nriclist");
	if (td) {
		for (var i = td.childNodes.length-1; i >= 0; i--) {
			td.removeChild(td.childNodes[0]);
		}
		var d = parseFloat(MAX_RADIUS_IC);
		d = d / 1000;
		var r = d.toString();
		var n = r.indexOf(".");
		if (n != -1 && r.length > n + 2) r = r.substring(0, n + 2);
		var text = " 半径" + r + "km以内にICがありません。";
		var items = lsout.resultItem;
		if (!items || items.length == 0) {
			td.appendChild(document.createTextNode(text));
			return;
		}
		else if (items.length > 0) {

			for (var i = 0; i < items.length; i++) {
				var item = items[i];
				var land = new Landmark(item, i + 1);
				if (item.genreCode == "13") {
//					if (item.name.search(/ＰＡ|ＪＣＴ|ＳＡ|パーキング|駐車場|ミニＰ|料金所/) == -1)
						ics.push(land);
				}
			}
			if (ics.length == 0) {
				td.appendChild(document.createTextNode(text));
				return;
			}
			ics.sort(landmarkSort);
			//最寄ICプルダウンリスト
			var selIC = createStationList("ic", ics, null);
			if (selIC) {
				td.appendChild(selIC);
				td.appendChild(document.createElement("br"));
			}
			//ルート表示ボタン・クリアボタン
			var td2 = document.getElementById("nrstbtn");
			if (td2) {
				var btn = document.getElementById("route");
				if (btn == null || btn != 'undefined') {
					_initRouteButtons();
					_appendRouteButtonsTo(td2);
				}
			}
		}
	}
};

//------------------------------------------------

function landmarkSort(a, b) {
	var d1 = parseFloat(a.item.distance);
	var d2 = parseFloat(b.item.distance);
	return (d1-d2 < 0)?-1:((d1-d2 > 0)?1:0);
};

function createStationList(id, array, match) {
	if (!array || array.length == 0) return null;

	var e = document.createElement("select");
	e.setAttribute("id", id);
	for (var i = 0; i < array.length; i++) {
		var item = array[i].item;
		var name = item.name;
		var no = array[i].no;
		if (match == null || (match != null && name.indexOf(match)) == 0) {
			var o = document.createElement("option");
			o.setAttribute("value", no);
			o.appendChild(document.createTextNode(name));
			e.appendChild(o);
		}
	}
	return e;
};

function stationChanged() {
	var stationList = document.getElementById("station");
	var station = getStationName(stations, stationList.value);
	var stioList = document.getElementById("stio");
	if (stioList) {
//		stioList.style.marginRight = '0px';
		
		for (var i = stioList.childNodes.length-1; i >= 0; i--) {
			var op = stioList.childNodes.item(0);
			stioList.removeChild(op);
		}

		for (var i = 0; i < stios.length; i++) {
			var item = stios[i].item;
			var name = item.name;

			
			var matchname = station;
			var index = station.indexOf("【");
			var index2 = station.indexOf("［");
			if (index2 != -1) index = index2;
			if (index != -1) {
				matchname = station.substring(0, index);
			} else {
				matchname = station;
			}

			if (name != null && name.indexOf(matchname) == 0) {
				var o = document.createElement("option");
				o.setAttribute("value", stios[i].no);
				o.appendChild(document.createTextNode(name));
				
				stioList.appendChild(o);
			}
		}

	}
};
function _sleep(time){
	var d1 = new Date().getTime();
	var d2 = new Date().getTime();
	while( d2 < d1 + time ){
		d2=new Date().getTime();
	}
	return; 
}


function getStationPoint(array, no) {
	if (!array || array.length == 0) return "";
	var pt = "";
	for (var i = 0; i < array.length; i++) {
		var item = array[i].item;
		if (array[i].no == no) {
			pt = item.point.toString();
		}
	}
	return pt;
};

function getStationName(array, no) {
	if (!array || array.length == 0) return "";
	var name = "";
	for (var i = 0; i < array.length; i++) {
		var item = array[i].item;
		if (array[i].no == no) {
			name = item.name;
		}
	}
	return name;
};

/**
 * ボタン表示に必要な初期設定を行う
 */
function _initRouteButtons() {
	var btnFileNames = {
		route_btn: 'route.gif',
		clear_btn: 'clear.gif',
		ryakumap_btn: 'ryakumapBtn.gif',
		mapchange_btn: 'mapchangeBtn.gif'
	};
	for (var key in btnFileNames) {
		if (!window[key]) {
			window[key] = CONTEXT + btnFileNames[key];
		}
	}
}

/**
 * 標準地図表示時のボタンを生成・表示
 * 内部関数
 * @param DOMObject td2 追加先のDOMオブジェクト
 */
function _appendRouteButtonsTo(td2) {
	// 現在表示されているボタンをすべて削除
	for (var i = td2.childNodes.length-1; i >= 0; i--) {
		td2.removeChild(td2.childNodes[0]);
	}
	
	// 「ルート表示」「クリア」ボタンを表示
	_appendInputImageTo(td2, "route", route_btn, "ルート表示", routing);
	td2.appendChild(document.createTextNode(" "));
	_appendInputImageTo(td2, "clear", clear_btn, "クリア", onRouteClear);

	//略地図ボタンを表示
	if (_ryakuMapFlg) {
		td2.appendChild(document.createTextNode(" "));
		_appendInputImageTo(td2, "ryaku_btn", ryakumap_btn, "略地図", onClickRyakuMap);
	}
}

/**
 * ボタンのDOMオブジェクトを生成して指定したDOMオブジェクト内に追加する
 * 内部関数
 * @param DOMObject td2 追加先のDOMオブジェクト
 * @param String id 生成するDOMオブジェクトのid属性
 * @param String src 生成するDOMオブジェクトのsrc属性
 * @param String alt 生成するDOMオブジェクトのalt属性
 * @param Function func 生成したDOMオブジェクトのclickイベントのイベントハンドラ
 */
function _appendInputImageTo(td2, id, src, alt, func) {
	var obj = document.createElement("input");
	obj.setAttribute("type", "image");
	obj.setAttribute("src", src);
	obj.setAttribute("id",  id);
	obj.setAttribute("alt", alt);

	td2.appendChild(obj);
	addListener(obj, "click", func, false);	
}

/**
 * 「クリア」ボタン（標準地図のルート表示を消去する）が押されたときのイベントハンドラ
 */
function onRouteClear() {
    if (_ryakuMapFlg) {
		crearRyakuMapInSession(doRouteClear);
	} else {
		doRouteClear();
	}
};

/**
 * 「クリア」ボタンの処理
 */
function doRouteClear() {
	routeClear(ROUTE_LINE_ID, STATION_POI_ID);
};

//-----------------------------------------------------------
//	SmartRouting
//-----------------------------------------------------------

var _sr   = null;
var _srin = null;

/**
 * 「ルート表示」ボタンが押されたときのイベントハンドラ
 * 検索条件を組み立て、SmartRoutingを呼ぶ
 * 略地図を表示する場合もこのメソッドが呼ばれる
 */
function routing() {
	// 現在表示されているルートの線を消去する
	doRouteClear();
	if (!_sr) {
		_sr = new SmartRoutingService();
		AlpsEvent.addEvent(_sr, "routinged", routinged);
	}

	if (!_srin) _srin = new SmartRoutingInput();		//検索条件
	//検索条件を初期化
	if (_srin != null) {
		_srin.point = "";
		_srin.tollPriority = "";
		_srin.costPriority = "";
		_srin.transport = "";
		_srin.travelingFlag = "";
		_srin.useAroundTollRoad = "";
		_srin.outdatum = "";
		_srin.selectNumAroundRoad = "";
	}

	setSmartRoutingInput();				//検索条件のセット

	if (typeof(USER_ROUTE) != 'undefined') {
		//駅出入口かICかを取得
		if (typeof(document.nrroute) != 'undefined') {
			var radio = document.nrroute.selroute;
			if (radio && radio.length == 2) {
				if (radio[0].checked) {
					setNrStRouteResult(USER_ROUTE.srout, new LLPoint(_rpt1), STATION_POI_ID, _stio, new LLPoint(_stiopt), ROUTE_LINE_ID);
					return;
				}
			} else {
				setNrStRouteResult(USER_ROUTE.srout, new LLPoint(_rpt1), STATION_POI_ID, _stio, new LLPoint(_stiopt), ROUTE_LINE_ID);
				return;
			}
		}
	}

	if (_stiopt != "") {
		_sr.routing(_srin, routinged);
	}
};

/**
 * routingメソッドで呼んだSmarttRoutingの結果を受け取って、結果表示メソッドに渡す
 * @param srout SmartyRouting結果
 */
function routinged(srout) {
	setNrStRouteResult(srout, new LLPoint(_rpt1), STATION_POI_ID, _stio, new LLPoint(_stiopt), ROUTE_LINE_ID);
};

/**
 * 検索条件を組み立てて各種グローバル変数に代入する
 * routing()関数の内部関数
 */
var _station = null;
var _stio    = null;
var _stiopt  = null;
var _rpt1    = null;

function setSmartRoutingInput() {
	var p = "";
	if (!_iconpoints || _iconpoints.length > 1) p = _m.getCenterLatLon().toString();
	else p = _iconpoints[0].pos;

	_rpt1 = p;
	_stiopt = "";

	//駅出入口かICかを取得
	var type = 0;
	if (typeof(document.nrroute) != 'undefined') {
		var radio = document.nrroute.selroute;
		if (radio && radio.length == 2) {
			if (radio[0].checked) type = 0;
			else type = 1;
		}
	}

	var name = '';
	switch(type) {
	case 0:
		var stioList = document.getElementById("stio");
		if (stioList) {
			name = getStationName(stios, stioList.value);
			_stiopt = getStationPoint(stios, stioList.value);
			//出入口取得できなければ、駅で代用
			if (_stiopt == '') {
				var stationList = document.getElementById("station");
				if (stationList) {
					name = getStationName(stations, stationList.value);
					_stiopt = getStationPoint(stations, stationList.value);
				}
			}
			_stio = name;
		}
		break;
	case 1:
		var icList = document.getElementById("ic");
		if (icList) {
			name = getStationName(ics, icList.value);
			_stiopt = getStationPoint(ics, icList.value);
			_stio = name;
		}
		break;
	default:
	}
	if (_stiopt != "") {
		_srin.outdatum = "Tokyo97";
		if (type == 0) {					// 駅
			p = p + "," + _stiopt;
			_srin.point = p;
			_srin.tollPriority      = "3";	// 一般道のみ
			_srin.costPriority      = "1";
			_srin.transport         = "2";	// 徒歩
			_srin.travelingFlag     = "0";
			_srin.useAroundTollRoad = "0";	// 有料道路上の始終点の対象としない
			_srin.rrso = "true";			// 鉄道駅以外を除外するパラメータ
			_srin.selectNumAroundRoad = "1";// 地点から一番近い道路に無条件に出る
		}
		if (type == 1) {					// IC
			p = _stiopt + "," + p;
			_srin.point = p;
			_srin.tollPriority       = "2";	// 一般道優先
			_srin.costPriority       = "1";
			_srin.transport          = "1";	// 車
			_srin.travelingFlag      = "0";
			_srin.useAroundTollRoad  = "1";	// 有料道路上の始終点の対象とする
//			_srin.pointUseAroundRoad = "2,1";
		}
	}
};

var ROUTE_LINE_ID  = "route-line-1";
var STATION_POI_ID = "station-poi-1";

var ROUTE_LINE_CATEGORY   = "ROUTE_LINE";
var STATION_ICON_CATEGORY = "EKI_1";
var IC_ICON_CATEGORY      = "IC_1";

//ルートの表示
function setNrStRouteResult(srout, rpt1, stioId, name, stiopt, lineId) {
	//alert("setNrStRouteResult("+ srout + "," + stioId + "," + name+ "," + stiopt + "," + lineId+ ")");
	var text;
	var ritems = srout.routeItem;
	var pitems = srout.pointItem;
	var ditems = srout.distanceItem;

	if (!ritems) {
		//text = "検索エラー。";
		//alert(text);
		onRouteClear();
		return;
	}
	else if (ritems.length == 0) {
		//text = "0件";
		//alert(text);
		onRouteClear();
		return;
	}
	else {
		//アイコンを切り分け
		var nricon = STATION_ICON_CATEGORY;
		//駅出入口かICかを取得
		var type = 0;
		if (typeof(document.nrroute) != 'undefined') {
			var radio = document.nrroute.selroute;
			if (radio && radio.length == 2) {
				if (radio[0].checked) type = 0;
				else {
					type = 1;
					nricon = IC_ICON_CATEGORY;
				}
				_selroute = type;
			}
		}

		//緯度経度配列
		var points = new Array;

		var startPoint = rpt1;
		var endPoint = stiopt;

		switch(type) {
			case 0:
				break;
			case 1:
				startPoint = stiopt;
				endPoint = rpt1;
				break;
		}

		points.push(startPoint);
		for (var i = 0; i < ritems.length; i++) {
			var item = ritems[i];
			points.push(item.point);
		}
		points.push(endPoint);

		if (_dispmap) {
			// 略地図がオモテ面にある場合
			var ryakumapObj = document.getElementById('ryakumap');
			if (ryakumapObj) {
				// 略地図画像を更新
				var width = parseInt(ryakumapObj.style.width);
				var height = parseInt(ryakumapObj.style.height);
				createRyakumap(points, width, height, false);
			}
		}
		else {
			// 標準地図がオモテ面にある場合
			var line = new MapsvrLine(lineId, '', points, ROUTE_LINE_CATEGORY);
			//ライン描画
			_ms.addContents(line);
	
			//駅アイコン追加
			var poi = new MapsvrPOI(stioId, name, stiopt, nricon, null);
			_ms.addContents(poi);
		}
	}
};

/**
 * 現在標準地図の上に表示されているラインと駅アイコンを消去する
 */
function routeClear(lineId, stioId) {
	_ms.removeContents(lineId, true); // 第2引数true - removeOnly
	_ms.removeContents(stioId);
	_selroute = -1;
	// 2回も表示反映するのは無駄なので、1回目のremoveContentsはremoveOnlyにする
};

/**
 * 略地図生成
 * 略地図生成に必要なパラメータをセッションに保存する
 * @param point ルート座標列
 * @param width 略地図画像幅
 * @param height 略地図画像高さ
 * @param isMobile 携帯用略地図生成の場合,"true"をセットする
 */
function createRyakumap(point, width, height, isMobile) {
	var appid = 'x862_0f53';
	var async = false; // false:非同期
	// 略地図用routeパラメータ文字列を作成
    // 略地図のルート指定はなぜかルーティングと始点終点が逆なので、
    // 反転して渡す
    var resultPointText = '';
    var routeicons = '';
    var copyright = '';
    var compass = '';
    var tmp = point.slice(0);
    tmp.reverse();
    for (var i = 0; i < tmp.length; i++) {
      resultPointText += tmp[i].toString() + ","
    }
    resultPointText = resultPointText.replace(/,$/g, "");

    routeicons = createRyakuMapIcons();

	copyright =(document.getElementById("copyright").value).toLowerCase();

    compass = document.getElementById("ryaku_compass").value;

    sendRequest(createRyakumapResult, 
    				"&appid=" + appid + 
    				"&line=" + resultPointText + 
    				"&width=" + width + 
    				"&height=" + height +
    				"&ismobile=" + isMobile +
  		            "&pos=" + routeicons +
  		            "&copyright=" + copyright +
  		            "&compass=" + compass,
    			'POST', 
    			'../ryakumap/stored_in_session.php', 
    			async, 
    			true );
}

/**
 * createRyakumapが完了した際に呼ばれる
 * 略地図URLをimg.srcにセットする。(略地図が表示される。)
 */
function createRyakumapResult(res)
{
	var baseUrl = '../ryakumap/ryakumap.php';
	var url = baseUrl + '?cache=' + (new Date()).getTime();
	    
	document.getElementById('ryakumap').src = url;

	if (document.print) {
		document.print.url.value = url;
	}
}

/**
 * 略地図のアイコンパラメタを生成して返す
 * @return String パラメタ文字列
 */
function createRyakuMapIcons(){
	var traffic_icon = 'Ialps/eki:P' + _stiopt;
	var detail_icon = '';
	var route_icons = '';

	//駅かICかを取得
	if (typeof(document.nrroute) != 'undefined') {
		var radio = document.nrroute.selroute;
		if (radio && radio.length == 2) {
			if (radio[1].checked) {
				traffic_icon = 'Ialps/ic:P' + _stiopt;
			}
		}
	}

    var fail_name = document.getElementById("iconid").value;
	detail_icon = ':I' + fail_name + ':P' + this.ip.pos;

	route_icons = traffic_icon + detail_icon;

	return route_icons;
}

//-----------------------------------------------------------
//	Sokodoko
//-----------------------------------------------------------

var _sd   = null;
var _sdin = null;

//検索開始
function sokodoko() {
	var e = document.getElementById("sokodoko");
	if (!e) return;

	if (!_sd) {
		_sd = new SokodokoService();
//		AlpsEvent.addEvent(_sd, "geoDecoded", geoDecoded);
	}
	if (_sdin) {
		delete _sdin;
	}

	_sdin = new SokodokoInput();		//検索条件
	setSokodokoInput();				//検索条件のセット
	_sd.geoDecode(_sdin, geoDecoded);
};

function geoDecoded(sdout) {
	setSokodokoResult(sdout);
};

function setSokodokoInput() {
	var p = _m.getCenterLatLon();
	_sdin.point = p;
};

function setSokodokoResult(sdout) {
	var text;
	var items = sdout.resultItem;
	var d = document.getElementById("sokodoko");
	if (!d) return;
	for (var i = 0; i < d.childNodes.length; i++) {
		d.removeChild(d.childNodes[i]);
	}
	if (!items || items.length == 0) {
		text = "住所不明";
	}
	else if (items.length > 0) {
		var item = items[0];
		text = item.name;
		text += " 付近";
	}
	d.appendChild(document.createTextNode(text));
};

//-----------------------------------------------------------
//	MapCode
//-----------------------------------------------------------

function mapcode() {
	var e = document.getElementById("mapcode");
	if (!e)return;

	var xmlhttp = AlpsUtil.getXMLHttp();
	if (!xmlhttp)return;
	var url = '../mapcode.php?c=' + _m.getCenterLatLon();
	xmlhttp.open("GET", url, true);
	xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState == 4) {
			if (xmlhttp.status == 200) {
				var res = xmlhttp.responseText;
				var text = document.createTextNode(res);
				var d = document.getElementById("mapcode");
				var old = d.lastChild;
				if (d.childNodes.length > 1)d.removeChild(old);
				d.appendChild(text);
			}
		}
	}
	xmlhttp.send(null);
};

//-----------------------------------------------------------
//	PrintMap
//-----------------------------------------------------------

/**
 * 「印刷」ボタンが押されたときのイベントハンドラ
 */
function printMap() {
	if (!_m) return;

	document.print.c.value     = _m.getCenterLatLon().toString();
	document.print.scale.value = _m.getLayerScale(_m.getCurrentLayerId());

	// ルートが表示されている場合（WebDrive上にルートが乗っている/略地図を表示している）はルート表示用のパラメタを取得する
	if ((-1 != _ms.getContentsIndex(ROUTE_LINE_ID)) || _dispmap) {

		//ルート検索方法に最寄駅と最寄ICのどちらが選択されているかを取得
		if (typeof(document.nrroute) != 'undefined') {
			var radio = document.nrroute.selroute;
			if (radio && (radio.length == 2) && radio[1].checked) {
				document.print.selroute.value = 'nric'; //最寄IC検索
			} else {
				document.print.selroute.value = 'nrst'; //最寄駅検索
			}
		}

		// 駅出入口名称を取得
		if (typeof(_stio) != 'undefined' && _stio != '') {
			document.print.stioname.value = _stio;
		}

		// ルート表示フラグを設定
		document.print.routing.value = 1;
	}
	else {
		// ルートが表示されていない場合のパラメタ設定
		document.print.stioname.value = '';
		document.print.routing.value = 0;
	}

	// 略地図フラグを設定
	// dispmap=trueであればroutingの値に関係なく略地図表示になるため、全パターンで設定
	if (typeof(document.print.dispmap) != 'undefined') {
		document.print.dispmap.value = _dispmap;
	}
};

//-------------------------------------------------------------

var _dispmap = false;

/**
 * 「略地図」ボタンが押されたときのイベントハンドラ
 */
function onClickRyakuMap() {
    var nir = document.getElementById('nricroute');

    if (nir != null) {
		var radio = document.nrroute.selroute;
		if (radio[0].checked) {
			var st = document.getElementById("station");
			if (st == null) {
				return;
			}
		}
		else {
			var ic = document.getElementById("ic");
			if (ic==null) {
				return;
			}
		}
	}
	if (_dispmap == false) {
		doDispChange();
		_dispmap = true;
	}
	routing();	
};

/**
 * 「地図切替」ボタン（略地図から標準地図に切り替える）が押されたときのイベントハンドラ
 */
function onClickMapChange() {
	// 再度略地図を表示したときに一瞬前の略地図画像が表示されると見苦しいので削除する
	document.getElementById('ryakumap').src = "../images/spc.gif"

	doDispChange();
	_dispmap = false;

	routing();
};

/**
 * 略地図/標準地図切替を行うDOMオブジェクト操作
 */
function doDispChange() {
	var mb = document.getElementById("mapbox");
	var rmb = document.getElementById("ryakumapbox");

	if (_dispmap == true) {
		//略地図→標準地図
		if (mb) {
			mb.style.display = 'block';
		}
		if (rmb) {
			rmb.style.display = 'none';
		}

		// displayスタイルを変更するとサイズの指定が無効になる場合があるので改めて指定する
	    var width  = parseInt(_m.getContainer().style.width);
	    var height = parseInt(_m.getContainer().style.height);
	    _m.setSize(width, height);
	}
	else {
		//標準地図→略地図
		if (mb) {
			mb.style.display = 'none';
		}
		if (rmb) {
			rmb.style.display = 'block';
		}
	}

	//ボタン表示
	var td2 = document.getElementById("nrstbtn");
	if (td2) {
		if (_dispmap) {
			// 標準地図用のボタンを表示する
			_appendRouteButtonsTo(td2);
		}
		else {
			// 略地図用のボタンを表示する
			
			// 既存のボタンを削除
			for (var i = td2.childNodes.length-1; i >= 0; i--) {
				td2.removeChild(td2.childNodes[0]);
			}
			
			// 「略地図」「地図切替」ボタンの順に生成・配置
			_appendInputImageTo(td2, "ryaku_btn", ryakumap_btn, "略地図", onClickRyakuMap);
			td2.appendChild(document.createTextNode(" "));
			_appendInputImageTo(td2, "mapchenge_btn", mapchange_btn, "地図切替", onClickMapChange);
		}
	}
}


/**
 * 略地図表示用のセッション情報の初期化
 * @param function callback リクエスト終了後に呼ばれる関数
 */
function crearRyakuMapInSession(callback) {
	var async = false; // false:非同期
	sendRequest(callback, 
    				"&appid=" + 
    				"&line=" + 
    				"&width=" + 
    				"&height=" +
    				"&ismobile=" +
  		            "&pos=" +
  		            "&copyright=" +
  		            "&compass=" +
  		            "&icon=",
    			'POST', 
    			'../ryakumap/stored_in_session.php', 
    			async, 
    			true );
}

