var _map;							// 地図オブジェクト
var _areaBounds = new Array();		// 地図エリア(GLatLngBounds)の配列
var _currentView = MAPVIEW;			// 現在の表示画面(地図・一覧)
var _currentArea = ALLFUKUI;		// 現在の表示エリア
var _currentMarker = ROADINDICATOR;	// 現在の表示マーク
var _zIndex = 100;					// 情報ボックスのzIndex
var _updateTimer = null;			// 自動更新タイマー
var _infoListLen = 0;				// 状態リストの長さ
var _showingInfoboxList = null;		// 現在表示中の情報ボックス位置(GLatLng)のリスト
var _params = new Array();			// 外部公開のパラメータ(パラメータ名の連想配列)
var _ajax = null;					// Ajax

function setCurrentView(view) {
	_currentView = view;
}
function getCurrentView() {
	return _currentView;
}
function setCurrentArea(area) {
	_currentArea = area;
}
function getCurrentArea() {
	return _currentArea;
}
function setCurrentMarker(marker) {
	_currentMarker = marker;
}
function getCurrentMarker() {
	return _currentMarker;
}
function getZindex() {
	return ++_zIndex;
}
function getUpdateTimer() {
	return _updateTimer;
}
function setUpdateTimer(updateTimer) {
	return _updateTimer = updateTimer;
}
function setInfoListLen(infoListLen) {
	_infoListLen = infoListLen;
}
function getInfoListLen() {
	return _infoListLen;
}
function setShowingInfoboxList() {
	_showingInfoboxList = null;
	var si = 0;
	for (var i = 0; i < getInfoListLen(); i++) {
		if (_infoList[i][INFOBOXINDEX] != null &&
			!_infoList[i][INFOBOXINDEX].isHidden()) {
			if (_showingInfoboxList == null) {
				_showingInfoboxList = new Array();
			}
			_showingInfoboxList[si++] =
				new GLatLng(_infoList[i][LATINDEX], _infoList[i][LNGINDEX]);
		}
	}
}
function addParam(key, val) {
	_params[key] = val;
}
function getParam(key) {
	var val = _params[key];
	if (val == UNDEF) val = null;
	return val;
}
function getAjax() {
	if (_ajax != null)
		return _ajax;

	if(window.XMLHttpRequest) {
		// not IE
		_ajax = new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		// IE
		try {
			_ajax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			_ajax = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return _ajax;
}

/**
 * 地図の中心とズームレベルを初期値に戻す.
 */
function setDefCenter() {
	_map.setCenter(new GLatLng(DEFLAT, DEFLNG), DEFZOOMLEVEL);
}

/**
 * 地図を生成する.
 */
function createMap() {
	_map = new GMap2(document.getElementById(MAPPANE));
	_map.addControl(new GSmallMapControl());
	_map.addControl(new GScaleControl());
	_map.addControl(new GOverviewMapControl());
	_map.disableDoubleClickZoom();
	_map.disableScrollWheelZoom();
	GEvent.addListener(_map, "dblclick", zoomArea);
	GEvent.addListener(_map, "zoomend", function(oldZoomLevel, newZoomLevel) {
		if (MAX_ZOOMLEVEL < newZoomLevel)
			_map.setZoom(MAX_ZOOMLEVEL);
		if (newZoomLevel < MIN_ZOOMLEVEL)
			_map.setZoom(MIN_ZOOMLEVEL);
	});
	setDefCenter();
}

/**
 * エリア区切りを描画する.
 * @param areano エリア番号(0:嶺北北部 1:奥越 2:嶺北南部 3:嶺南東部 4:嶺南西部)
 */
function drawAreaBorder(areano) {
 	var latlng = AREALATLNG[areano];
 	var bcolor = AREACOLOR[areano];
	var bwidth = 5;	// 区切り線の太さ
	if (areano != NORTH_REIHOKU)
		_map.addOverlay(new GPolyline(new Array(latlng[0], latlng[1]), bcolor, bwidth));
	if (areano != WEST_REINAN)
		_map.addOverlay(new GPolyline(new Array(latlng[1], latlng[2]), bcolor, bwidth));
	if (areano != EAST_REINAN)
		_map.addOverlay(new GPolyline(new Array(latlng[2], latlng[3]), bcolor, bwidth));
	if (areano != OKUETSU)
		_map.addOverlay(new GPolyline(new Array(latlng[3], latlng[0]), bcolor, bwidth));
	_areaBounds[areano] = new GLatLngBounds(latlng[0], latlng[2]);
}

/**
 * ロード時処理.
 */
function load(io) {
   	if (GBrowserIsCompatible()) {
   		// 情報リスト長設定
   		setInfoListLen(_infoList.length);

		// パラメータ取得(外部更新)
		// if (io != "") getParameters();
   		
   		// 地図生成
   		createMap();
   		
		// エリア区切り描画
		drawAreaBorder(NORTH_REIHOKU);
		drawAreaBorder(OKUETSU);
		drawAreaBorder(SOUTH_REIHOKU);
		drawAreaBorder(EAST_REINAN);
		drawAreaBorder(WEST_REINAN);

		// マーカー生成
		addMarker(ROADINDICATOR);
		selectMarker(ROADINDICATOR);

		// マウスホイールイベント追加
		if (navigator.userAgent.match("MSIE"))
			document.getElementById("mappane").attachEvent("onmousewheel", mouseWheelZooming );
		else if (navigator.userAgent.match("Gecko"))
			document.getElementById("mappane").addEventListener("DOMMouseScroll" , mouseWheelZooming , false );
		else if (navigator.userAgent.match( "Safari" ))
			document.getElementById("mappane").onmousewheel = mouseWheelZooming;
		
		// 現在日時設定
		setCurrentDateTime();
		
		// 更新前状態復元(外部公開のみ)
		//if (io != "")
		//	restoreView();
		
		// 自動更新タイマー起動
		restartTimer(io);
   	} else {
   		// ToDo
   		// GoogleMapが使用できない場合の処理(未実装)
   	}
}

/**
 * アンロード処理
 */
function unload() {
	GUnload();
}

/**
 * □マウスホールによるズーム処理
 */
function mouseWheelZooming(event){
	var delta;
	//マウスホイールの上／下の取得と、スクロールのキャンセル
	if(navigator.userAgent.match("MSIE")) {
		delta = event.wheelDelta * -1;
		event.returnValue = false;
	} else if(navigator.userAgent.match("Gecko")) {
		delta = event.detail * -1;
		event.preventDefault();
	} else if(navigator.userAgent.match("Safari")) {
		delta = event.wheelDelta;
		event.returnValue = false;
	}
	//ズーム処理
	_map.setZoom(_map.getZoom() + (delta < 0 ? 1 : -1 ));
}

/**
 * 要素が画像かどうかを返す.
 * @param element 要素データ
 * @return true:画像 false:テキスト
 */
function isImage(element) {
	if (0 <= element.indexOf(".png") ||
		0 <= element.indexOf(".gif") ||
		0 <= element.indexOf(".jpg"))
		return true;
	return false;
}

/**
 * 外部公開のパラメータ取得
 */
function getParameters() {
	var src = document.location.search;
	
	// パラメータなし
	if (src == "") return;
	
	var nCur = 0, nRet = 0;
	var sSearch = src.substr(1, src.length - 1);
	var sName, sValue;
				
	nRet = sSearch.indexOf('=', nCur)		// 最初の'='を検索
	while(nRet >= 0) {
		// '='以前が変数名
		sName = sSearch.substring(nCur, nRet);
		nCur = nRet + 1;
			
		// 値を取り出す
		nRet = sSearch.indexOf('&', nCur);	// 変数の区切りを検索
		if (nRet == -1) nRet = sSearch.length + 1;		// なければ最後まで
		sValue = sSearch.substring(nCur, nRet);
			
		// 配列に格納
		addParam(sName, sValue);
			
		// 次を検索
		nCur = nRet + 1;
		nRet = sSearch.indexOf('=', nCur);
	}
}





/*-----     情報一覧テーブル     -----*/

/**
 * 一覧情報HTMLを生成する.
 * @return 一覧情報ヘッダHTML
 */
function createInfoHeaderHTML() {
	return "<table border=\"1\" cellspacing=\"0\">" +
		"<tr><th>名称</th>" +
		"<th colspan=\"2\">設置路線名</th>" +
		"<th>方向</th>" +
		"<th>内容</th>" +
		"<th>地図</th></tr>";
}

/**
 * 一覧情報HTMLを生成する.
 * @param index _infoListのインデックス
 * @return 一覧情報HTML
 */
function createInfoHTML(index) {
	var info = _infoList[index];

	var strHTML = "<tr><td align=\"center\" valign=\"bottom\" style=\"border-bottom:0px\">";
	strHTML = strHTML + info[PLACENAMEINDEX] + "</td>";

	strHTML = strHTML + "<td align=\"center\" rowspan=\"2\">";
	if (isImage(info[ROADICONINDEX]))
		strHTML = strHTML + "<img src=\"" +	info[ROADICONINDEX] + "\"/></td>";
	else
		strHTML = strHTML + info[ROADICONINDEX] + "</td>"; 

	strHTML = strHTML + "<td align=\"left\" rowspan=\"2\">";
	strHTML = strHTML + info[ROADNAMEINDEX] + "</td>";

	strHTML = strHTML + "<td align=\"center\" rowspan=\"2\">";
	if (isImage(info[EASYMAPINDEX])) {
		strHTML = strHTML + "<img src=\"" +	info[EASYMAPINDEX] + "\"/></td>";
	} else {
		if (info[EASYMAPINDEX] == "")
			strHTML = strHTML + "-</td>";
		else
			strHTML = strHTML + info[EASYMAPINDEX] + "</td>";
	}

	strHTML = strHTML + "<td align=\"center\" rowspan=\"2\"><table>";
	for (var i = INFOINDEX; i < info.length; i++) {
		if (info[i] == "") continue;
		if (isImage(info[i])) {


			var imgSize = "";
			if (info[TYPEINDEX] == ROADINDICATOR) {
				// 道路標示板画像
				if (0 <= _infoList[index][MARKERICONINDEX].indexOf("HL7", 0)) {
					imgSize = "width=\"" + HL7_WIDTH + "\" height=\"" + HL7_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("A3", 0)) {
					imgSize = "width=\"" + A3_WIDTH + "\" height=\"" + A3_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("A", 0)) {
					imgSize = "width=\"" + A_WIDTH + "\" height=\"" + A_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("B", 0)) {
					imgSize = "width=\"" + B_WIDTH + "\" height=\"" + B_HEIGHT + "\"";
				} else {
					imgSize = "";
				}
			} else if (info[TYPEINDEX] == CAMERA) {
				imgSize = "width=\"" + CAM_WIDTH + "\" height=\"" + CAM_HEIGHT + "\"";
			}
			strHTML = strHTML + "<tr><td align=\"center\"><img " + imgSize + " src=\"" + info[i] + "\"></td></tr>";
		} else {
			strHTML = strHTML + "<tr><td NOWARP align=\"center\">" + info[i] + "</td></tr>";
		}
	}

	strHTML = strHTML + "</table></td><td align=\"center\" rowspan=\"2\">"
	strHTML = strHTML + "<a href=\"javascript:goMap(" + index + ")\">表示</a></td></tr>";

	strHTML = strHTML + "<tr><td align=\"center\" valign=\"top\" style=\"border-top:0px\">(";
	strHTML = strHTML + info[CITYNAMEINDEX] + ")</td></tr>";

	return strHTML;
}

/**
 * 情報一覧テーブルを生成する.
 */
function createInfoTable() {
	var strHTML = createInfoHeaderHTML();
	var areano = getCurrentArea();
	var marker = getCurrentMarker();
	for (var i = 0; i < getInfoListLen(); i++) {
		if ((areano == ALLFUKUI || areano == _infoList[i][AREAINDEX]) && 
			(marker == _infoList[i][TYPEINDEX]))
			strHTML = strHTML + createInfoHTML(i);
	}
	strHTML = strHTML + "</table>";
	document.getElementById(LISTVIEW).innerHTML = strHTML;
}




/*-----     マーカー     -----*/

/**
 * マーカを生成する.
 * @param index _infoListのインデックス
 * @return マーカーオブジェクト
 */
function createMarker(index) {
	var icon = new GIcon();
	icon.image = _infoList[index][MARKERICONINDEX];
	icon.iconAnchor = new GPoint(_infoList[index][ICONANCHORXINDEX], 
								 _infoList[index][ICONANCHORYINDEX]);
	var marker = new GMarker(new GLatLng(
							_infoList[index][LATINDEX], 
							_infoList[index][LNGINDEX]), 
							{ icon: icon });

	// リスナー登録(click)
	GEvent.addListener(marker, "click", function() {
		createInfobox(index, true);
	});
	// リスナー登録(mouseover)
	GEvent.addListener(marker, "mouseover", function() {
		createInfoboxTmp(index, true);
	});
	// リスナー登録(mouseout)
	GEvent.addListener(marker, "mouseout", function() {
		hideInfoboxTmp(index);
	});

	// point配列にマーカを保持する.
	_infoList[index][MARKERINDEX] = marker;
	return marker;
}

/**
 * 指定されたマーカを地図に追加する.
 *
 * @param marker マーカタイプ
 */
function addMarker(marker) {
	for (var i = 0; i < getInfoListLen(); i++) {
		if (marker == ALLTYPE || marker == _infoList[i][TYPEINDEX]) {
			if (_infoList[i][MARKERINDEX] == null)
				_map.addOverlay(createMarker(i));
			else
				_infoList[i][MARKERINDEX].show();
		}
	}
	_currentMarker = marker;
}

/** 
 * マーカーを非表示にする.
 */
function hideMarker(index) {
	if (_infoList[index][MARKERINDEX] != null)
		_infoList[index][MARKERINDEX].hide();
}

/**
 * すべてのマーカを非表示にする.
 */
function hideAllMarker() {
	for (var i = 0; i < getInfoListLen(); i++)
		hideMarker(i);
}


/**
 * マーカーに応じた凡例表示制御を行う.
 * @param marker マーカータイプ
 */
function changeHanrei(marker) {
	for (var i = 0; i < MARKERNUM; i++) {
		var hanreiObj = document.getElementById(HANREI + i);
		if (hanreiObj == null || hanreiObj == UNDEF)
			continue;
		if (marker == ALLTYPE || marker == i)
			hanreiObj.style.display = "";
		else
			hanreiObj.style.display = "none";
	}
}



/*-----     ビュー(地図/一覧)     -----*/

/**
 * 地図・一覧画面を切り替える.
 * @param view ビュー
 */
function changeView(view) {
	// viewオブジェクト
	var mapView = document.getElementById(MAPVIEW);
	var listView = document.getElementById(LISTVIEW);

	// 表示切替
	var buttonLabel;
	if (view == MAPVIEW) {
		// 地図画面へ遷移
		mapView.style.display = "block";
		listView.style.display = "none";
		setCurrentView(MAPVIEW);
	} else if (view == LISTVIEW) {
		// 一覧画面へ遷移へ遷移
		mapView.style.display = "none";
		listView.style.display = "block";
		setCurrentView(LISTVIEW);
	} else {
		return;
	}
}




/*-----     情報ボックス     -----*/

/**
 * InfoBoxクラス
 * param index _infoListのインデックス
 * param latlng マーカーの緯度経度
 * param point アンカーポイント
 */
function InfoBox(index, latlng, point) {
	this.index_ = index;
	this.latlng_ = latlng;
	this.point_ = point;
	this.setTmpShow(false);
}
InfoBox.prototype = new GOverlay();

InfoBox.prototype.initialize = function(map) {
	var infoBox = document.createElement("div");
	infoBox.style.position = "absolute";
//	infoBox.style.backgroundColor = "#FFFFFF";
//	infoBox.style.border = "1px #000000 solid";
	infoBox.style.display = "block";
	infoBox.style.zIndex = getZindex();
	infoBox.innerHTML = createInfoboxHTML(this.index_);
	map.getPane(G_MAP_FLOAT_PANE).appendChild(infoBox);
	this.map_ = map;
	this.infobox_ = infoBox;
}

InfoBox.prototype.copy = function() { }

InfoBox.prototype.remove = function() {
	this.infobox_.parentNode.removeChild(this.infobox_);
	this.infobox_ = null;
	this.latlng_ = null;
	this.point_ = null;
}

InfoBox.prototype.redraw = function(force) {
	if (!force) return;
	var p = this.map_.fromLatLngToDivPixel(this.latlng_);
	this.infobox_.style.left = (p.x + this.point_.x) + "px";
	this.infobox_.style.top = (p.y - this.infobox_.offsetHeight - this.point_.y) + "px";
}

InfoBox.prototype.panTo = function() {
	var ip = new GPoint(
			this.infobox_.offsetLeft + this.infobox_.offsetWidth,
			this.infobox_.offsetTop);
	var ilatlng = this.map_.fromDivPixelToLatLng(ip);
	var ilat = ilatlng.lat();
	var ilng = ilatlng.lng();

	var bounds = this.map_.getBounds();
	var nelatlng = bounds.getNorthEast();
	var nepoint = this.map_.fromLatLngToDivPixel(nelatlng);
	// 地図切替コントロール分(30px)下に調整
	nelatlng = this.map_.fromDivPixelToLatLng(new GPoint(nepoint.x, nepoint.y + 30));
	bounds = new GLatLngBounds(bounds.getSouthWest(), nelatlng);
	if (bounds.contains(ilatlng)) return;
	var nelat = nelatlng.lat();
	var nelng = nelatlng.lng();
	
	var dlat = (0 <= ilat - nelat) ? ilat - nelat : 0;
	var dlng = (0 <= ilng - nelng) ? ilng - nelng : 0;

	var clatlng = this.map_.getCenter();
	this.map_.panTo(new GLatLng(clatlng.lat() + dlat, clatlng.lng() + dlng));
}

InfoBox.prototype.hide = function() {
	this.infobox_.style.display = "none";
}
InfoBox.prototype.show = function(pt) {
	this.infobox_.style.display = "block";
	this.infobox_.style.zIndex = getZindex();
	if (pt) {
		this.redraw(true);
		this.panTo();
	}
	this.setTmpShow(false);
}
InfoBox.prototype.refresh = function(showing) {
	this.latlng_ = new GLatLng(_infoList[this.index_][LATINDEX],
							   _infoList[this.index_][LNGINDEX]);
	this.point_ = new GPoint(_infoList[this.index_][INFOANCHORXINDEX],
						     _infoList[this.index_][INFOANCHORYINDEX]);
	this.infobox_.innerHTML = createInfoboxHTML(this.index_);
	if (showing) {
		this.infobox_.style.display = "block";
		this.infobox_.style.zIndex = getZindex();
		this.redraw(true);
	}
}
InfoBox.prototype.isHidden = function() {
	if (this.infobox_.style.display == "block") {
		return false;
	}
	return true;
}
InfoBox.prototype.setTmpShow = function(tmpShow) {
	this.tmpShow = tmpShow;
}
InfoBox.prototype.isTmpShow = function() {
	return this.tmpShow;
}

/**
 * マーカーの情報ボックスを生成する.
 *
 * @param index _infoListのインデックス
 * @param panto true:panTo()する false:panTo()しない
 */
function createInfobox(index, panto) {
	// すでに生成済みの場合は，表示する.
	if (_infoList[index][INFOBOXINDEX] != null) {
		_infoList[index][INFOBOXINDEX].show(panto);
		return;
	}
	// 生成
	var infoBox = new InfoBox(index,
		new GLatLng(_infoList[index][LATINDEX], _infoList[index][LNGINDEX]),
		new GPoint(_infoList[index][INFOANCHORXINDEX], _infoList[index][INFOANCHORYINDEX])
	);
	_infoList[index][INFOBOXINDEX] = infoBox;
	_map.addOverlay(infoBox);
	if (panto) infoBox.panTo();
}

/**
 * マーカーの情報ボックスを一時的(mouseover時)に表示する.
 *
 * @param index _infoListのインデックス
 * @param panto true:panTo()する false:panTo()しない
 */
function createInfoboxTmp(index, panto) {
	if (_infoList[index][INFOBOXINDEX] != null 
		&& !_infoList[index][INFOBOXINDEX].isHidden())
		return;
	createInfobox(index, panto);
	_infoList[index][INFOBOXINDEX].setTmpShow(true);
}

/**
 * すべてのマーカの情報ボックスを生成する.
 */
function createAllInfobox() {

	for (var i = 0; i < getInfoListLen(); i++)
	{
		if (_currentMarker == ALLTYPE || _currentMarker == _infoList[i][TYPEINDEX])
		{
			createInfobox(i, true);
		}
	}
}

/**
 * マーカーの情報ボックスを非表示にする.
 *
 * @param index _infoListのインデックス
 */
function hideInfobox(index) {
	if (_infoList[index][INFOBOXINDEX] == null) return;
	_infoList[index][INFOBOXINDEX].hide();
}

/**
 * 一時的に表示(mouseover)したマーカーの情報ボックスを非表示にする.
 *
 * @param index _infoListのインデックス
 */
function hideInfoboxTmp(index) {
	if (_infoList[index][INFOBOXINDEX] == null) return;
	if (!_infoList[index][INFOBOXINDEX].isTmpShow()) return;
	_infoList[index][INFOBOXINDEX].hide();
	_infoList[index][INFOBOXINDEX].setTmpShow(false);
}

/**
 * すべてのマーカの情報ボックスを非表示にする.
 */
function hideAllInfobox() {
	for (var i = 0; i < getInfoListLen(); i++)
		hideInfobox(i);
}


/**
 * 情報ボックスの内容を生成する.
 * 
 *
 * @param index _infoListのインデックス
 */
function createInfoboxHTML(index) {
	var info = _infoList[index];
	
	var strHTML = "<table cellspacing=\"0\" cellpadding=\"1\" bgColor=\"#FFFFFF\">";
	strHTML = strHTML + "<tr><td colspan=\"2\" NOWRAP align=\"right\" class=\"infobox_top\" style=\"background-color:#9999FF;\" >";
	strHTML = strHTML + "<a class=\"js\" href=\"javascript:hideInfobox(";
	strHTML = strHTML + index + ")\"><b>×</b></a></td></tr>";
	strHTML = strHTML + "<tr><td NOWRAP  onclick=\"infoClicked("
	strHTML = strHTML + index + ")\" class=\"infobox_top_l\">&lt;" + info[PLACENAMEINDEX] + "&gt;&nbsp";
	strHTML = strHTML + info[CITYNAMEINDEX] + "</td><td align=\"right\" class=\"infobox_top_r\">";
	strHTML = strHTML + "　</td></tr>";
	strHTML = strHTML + "<tr><td colspan=\"2\" NOWRAP  onclick=\"infoClicked(";
	strHTML = strHTML + index + ")\" class=\"infobox_lr\">" + info[ROADNAMEINDEX] + "</td></tr>";

	if (isImage(info[EASYMAPINDEX])) {
		strHTML = strHTML + "<tr><td colspan=\"2\" align=\"center\" onclick=\"infoClicked("
			+ index + ")\" class=\"infobox_lr\"><img src=\"" + info[EASYMAPINDEX] + "\"></td></tr>";
	} else {
		if (info[EASYMAPINDEX] != "")
			strHTML = strHTML + "<tr><td colspan=\"2\" NOWRAP align=\"center\" onclick=\"infoClicked("
				+ index + ")\"  class=\"infobox_lr\">" + info[EASYMAPINDEX] + "</td></tr>";
	}
	
	var styleName = "infobox_top";
	for (var i = INFOINDEX; i < info.length; i++) {
		if (info[i] == "") continue;
		if (isImage(info[i])) {
			var imgSize = "";
			if (_infoList[index][TYPEINDEX] == ROADINDICATOR) {
				// 道路標示板画像
				if (0 <= _infoList[index][MARKERICONINDEX].indexOf("HL7", 0)) {
					imgSize = "width=\"" + HL7_WIDTH + "\" height=\"" + HL7_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("A3", 0)) {
					imgSize = "width=\"" + A3_WIDTH + "\" height=\"" + A3_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("A", 0)) {
					imgSize = "width=\"" + A_WIDTH + "\" height=\"" + A_HEIGHT + "\"";
				} else if (0 <= _infoList[index][MARKERICONINDEX].indexOf("B", 0)) {
					imgSize = "width=\"" + B_WIDTH + "\" height=\"" + B_HEIGHT + "\"";
				} else {
					imgSize = "";
				}
			} else if (_infoList[index][TYPEINDEX] == CAMERA) {
				imgSize = "width=\"" + CAM_WIDTH + "\" height=\"" + CAM_HEIGHT + "\"";
			}
			strHTML = strHTML + "<tr><td colspan=\"2\" align=\"center\" onclick=\"infoClicked("
				+ index + ")\" class=\"" + styleName + "\"><img " + imgSize + " src=\"" + info[i] + "\"></td></tr>";
		} else {
			strHTML = strHTML + "<tr><td colspan=\"2\" NOWRAP onclick=\"infoClicked("
				+ index + ")\" class=\"" + styleName + "\">" + info[i] + "</td></tr>";
		}
		styleName = "infobox_lr";
	}
	strHTML = strHTML + "<tr><td colspan=\"2\" class=\"infobox_b\"><img src=\"images/spacer.gif\"></td></tr></table>";
	strHTML = strHTML + "<img src=\"images/infoline.gif\" onclick=\"infoClicked("	+ index + ")\">";
	return strHTML;
}





/*-----     タイマー     -----*/
/**
 * 自動更新タイマー再起動
 */
function restartTimer(io) {
	if (getUpdateTimer() != null)
		clearTimeout(getUpdateTimer());
	// 更新タイマー再起動
	var intval = document.getElementById(UPDATEINTERVAL).value;
	var callbackProc;
	if (io == "")
		callbackProc = autoUpdateIn;
	else
		callbackProc = autoUpdateOt;
	if (0 < intval) {
		setUpdateTimer(setTimeout(callbackProc, intval * 60 * 1000));
	}
}






/*-----     自動更新     -----*/
/**
 * マーカー変更
 * @param index 状態配列のインデックス
 */
function autoUpdateMarker(index) {
	var marker = _infoList[index][MARKERINDEX];
	var currentmk = getCurrentMarker();
	// マーカー生成
	if (marker == null) {
		if (currentmk == ALLTYPE || currentmk == _infoList[index][TYPEINDEX]) {
			_map.addOverlay(createMarker(index));
		}
		return;
	}
	// マーカー消去
	if (currentmk != ALLTYPE && currentmk != _infoList[index][TYPEINDEX]) {
		if (!_infoList[index][MARKERINDEX].isHidden()) {
			 _infoList[index][MARKERINDEX].hide();
		}
	}
	
	// アイコン画像変更
 	var image = _infoList[index][MARKERICONINDEX];
	if (marker.getIcon().image != _infoList[index][MARKERICONINDEX]) {
		_infoList[index][MARKERINDEX].setImage(image);
		marker.getIcon().image = image;
	}
	// マーカー位置変更
	var latlng = marker.getLatLng();
	if (latlng.lat() != _infoList[index][LATINDEX] ||
		latlng.lng() != _infoList[index][LNGINDEX]) {
		marker.setLatLng(
			new GLatLng(_infoList[index][LATINDEX], _infoList[index][LNGINDEX]));
	}
}

/**
 * 情報ボックス変更
 * @param index 状態配列のインデックス
 */
function autoUpdateInfobox(index) {
	var infobox = _infoList[index][INFOBOXINDEX];

	// 情報ボックス全消去
	hideInfobox(index);
	
	if (_showingInfoboxList != null) {
		// 表示中の情報ボックスがあるとき
		for (var i = 0; i < _showingInfoboxList.length; i++) {
			var latlng = _showingInfoboxList[i];
			if (_infoList[index][LATINDEX] == latlng.lat() &&
				_infoList[index][LNGINDEX] == latlng.lng()) {
				// 表示中のとき
				if (infobox == null) {
					// 情報ボックス生成
					createInfobox(index, false);
				} else {
					// リフレッシュ
					infobox.refresh(true);
				}
				return;
			}
		}
		// 表示中でないとき
		if (infobox != null) {
			// リフレッシュ
			infobox.refresh(false);
		}
	} else {
		// 表示中の情報ボックスがないとき
		if (infobox != null) {
			// リフレッシュ
			infobox.refresh(false);
		}
	}
}
 
/**
 * 地図ページ再描画
 */
function autoUpdateMapPage() {
	for (var i = 0; i < getInfoListLen(); i++) {
		// マーカー変更
		autoUpdateMarker(i);
		// 情報ボックス変更
		autoUpdateInfobox(i);
	}
}

/**
 * 一覧ページ再描画
 */
function autoUpdateListPage() {
	createInfoTable(getCurrentMarker());
}

/**
 * 自動更新
 */
function autoUpdatePage() {
	// 地図ページ自動更新
	autoUpdateMapPage();
	if (getCurrentView() == LISTVIEW) {
		// 一覧ページ自動更新
		autoUpdateListPage();
	}
}

/**
 * 更新日時設定
 */
function setUpdateTime(dt) {
	_updateTime = dt;
}

/**
 * 現在日時設定
 */
function setCurrentDateTime() {
	var currentDate = _updateTime.substr(0, 4) + "年";
	currentDate = currentDate + _updateTime.substr(5, 2) + "月";
	currentDate = currentDate + _updateTime.substr(8, 2) + "日&nbsp;";
	currentDate = currentDate + _updateTime.substr(11, 2) + "時";
	currentDate = currentDate + _updateTime.substr(14, 2) + "分現在";
	document.getElementById(CURRENTDATETIME).innerHTML = currentDate;
}





/*---------- イベントハンドラ ----------*/
/**
 * イベント契機：地図をダブルクリックした時.
 * クリックされた地域にズームする.
 * @param ov OverLayオブジェクト
 * @param point クリックされた地理座標(GLatLng)
 */
function zoomArea(ov, point) {
	if (typeof(point) == 'undefined') return;
	var found = false;
	var lat = point.lat();
	var lng = point.lng();
	for (var i = 0; i < _areaBounds.length; i++) {
		if (_areaBounds[i].getSouthWest().lat() <= lat &&
			lat <= _areaBounds[i].getNorthEast().lat() &&
			_areaBounds[i].getSouthWest().lng() <= lng &&
			lng <= _areaBounds[i].getNorthEast().lng()) {
			found = true;
			changeArea(i);
			break;
		}
	}
	if (!found)
		changeArea(ALLFUKUI);
}

/**
 * イベント契機：メニューから表示情報をクリックした時.
 * マーカを変更する.
 * @param marker マーカタイプ
 */
function changeMarker(marker) {
	// 地図ビューへ切り替え
	changeView(MAPVIEW);
	// 現在のマーカセット
	setCurrentMarker(marker);
	// 全マーカ削除
	hideAllMarker();
	// 全情報ボックス削除
	hideAllInfobox();
	// マーカ追加
	addMarker(marker);
	// 凡例表示制御
	changeHanrei(marker);
	// 地域変更
	changeArea(getCurrentArea());
	// 選択TD色変更
	selectMarker(marker);
}

/**
 * イベント契機：一覧をクリックした時.
 * 一覧情報を表示する.
 *
 * @param marker マーカタイプ
 */
function changeTable(marker) {
	// すべて，規制情報の場合は，一覧表示はない
	if (marker == ALLTYPE || marker == ROADREGULATION)
		return;
	// 全情報ボックス削除
	hideAllInfobox();
	// 一覧ビューへ切り替え
	changeView(LISTVIEW);
	// 現在のマーカセット
	setCurrentMarker(marker);
	// 一覧テーブル作成
	createInfoTable();
	// 選択TD色変更
	selectMarker(marker);
}

/** 
 * イベント契機：地域を変更した時.
 * 表示エリアを変更する.
 *
 * @param areano エリア番号
 */
function changeArea(areano) {
	// 現在のエリアセット
	setCurrentArea(areano);
	// 地域選択セレクト設定
	document.getElementById(AREASELECT).value = areano;
	
	// 一覧表示の時
	if (getCurrentView() == LISTVIEW) {
		createInfoTable();
		return;
	}
	
	// マップ表示の時
	for (var i = 0; i < AREANUM; i++) {
		if (areano == i) {
//			_map.setCenter(_areaBounds[areano].getCenter(), LOCALZOOMLEVEL);
			_map.setCenter(AREACENTER[areano], LOCALZOOMLEVEL);
			return;
		}
	}
	// 福井県全域
	setDefCenter();
}

/**
 * イベント契機：一覧の地図表示をクリックした時.
 * 地図表示に切り替え，マーカーにズームインし，情報ボックスを表示する.
 *
 * @param index pointのインデックス
 */
function goMap(index) {
	changeMarker(_infoList[index][TYPEINDEX]);
	changeArea(_infoList[index][AREAINDEX]);
	_map.setCenter(new GLatLng(_infoList[index][LATINDEX], 
					_infoList[index][LNGINDEX]), LOCALZOOMLEVEL);
	createInfobox(index, true);
}

/**
 * イベント契機：情報ボックスがクリックされた時
 * 情報ボックスを再表示する.再表示でxIndexが最大になるため最前面に表示される.
 * @param index _infoListのインデックス
 */
function infoClicked(index) {
	hideInfobox(index);
	createInfobox(index, false);
}

/**
 * イベント契機：表示対象または一覧がクリックされた時
 * 背景色を設定する.
 * @param marker 選択されたマーカーのインデックス
 */
function selectMarker(marker) {
	for (var i = ALLTYPE; i < MARKERNUM; i++) {
		var markerObj = document.getElementById(MARKER + i);
		if (markerObj == null || markerObj == UNDEF) continue;
		markerObj.style.backgroundColor = "#FFFFFF";
	}
	document.getElementById(MARKER + marker).style.backgroundColor = "#CCFF99";
}

/**
 * イベント契機：自動更新タイマータイムアウト時
 */
function autoUpdateIn() {
	EquipmentStateLogic.getCurrentEquipmentStateForDWR(function(data) {
		var updatetime = "0000-00-00 00:00:00";
		// 現在表示中の情報ボックスを記憶する．
		setShowingInfoboxList();

		for (var i = 0; i < data.length; i++) {
			if (i < getInfoListLen() && 
				_infoList[i][TYPEINDEX] != data[i].typeId &&
				_infoList[i][MARKERINDEX] != null) {
				_map.removeOverlay(_infoList[i][MARKERINDEX]);
				_infoList[i][MARKERINDEX] = null;
			}
			if (getInfoListLen() <= i) _infoList[i] = new Array();
			_infoList[i][TYPEINDEX] = data[i].typeId;
			_infoList[i][LATINDEX] = data[i].lat;
			_infoList[i][LNGINDEX] = data[i].lng;
			_infoList[i][MARKERICONINDEX] = data[i].iconImgUrl;
			_infoList[i][ICONANCHORXINDEX] = data[i].anchorX;
			_infoList[i][ICONANCHORYINDEX] = data[i].anchorY;
			_infoList[i][INFOANCHORXINDEX] = data[i].infoAnchorX;
			_infoList[i][INFOANCHORYINDEX] = data[i].infoAnchorY;
			_infoList[i][PLACENAMEINDEX] = data[i].equipmentName == null ? "" : data[i].equipmentName;
			_infoList[i][CITYNAMEINDEX] = data[i].placeName == null ? "" : data[i].placeName;
			_infoList[i][ROADNAMEINDEX] = data[i].roadName == null ? "" : data[i].roadName;
			_infoList[i][ROADICONINDEX] = data[i].roadImgUrl == null ? "" : data[i].roadImgUrl;
			_infoList[i][EASYMAPINDEX] = data[i].suppliment == null ? "" : data[i].suppliment;
			_infoList[i][AREAINDEX] = data[i].areaId;
			_infoList[i][INFOINDEX] = data[i].info01 == null ? "" : data[i].info01;
			_infoList[i][INFOINDEX+1] = data[i].info02 == null ? "" : data[i].info02;
			_infoList[i][INFOINDEX+2] = data[i].info03 == null ? "" : data[i].info03;
			_infoList[i][INFOINDEX+3] = data[i].info04 == null ? "" : data[i].info04;
			_infoList[i][INFOINDEX+4] = data[i].info05 == null ? "" : data[i].info05;
			_infoList[i][INFOINDEX+5] = data[i].info06 == null ? "" : data[i].info06;
			_infoList[i][INFOINDEX+6] = data[i].info07 == null ? "" : data[i].info07;
			_infoList[i][INFOINDEX+7] = data[i].info08 == null ? "" : data[i].info08;
			_infoList[i][INFOINDEX+8] = data[i].info09 == null ? "" : data[i].info09;
			_infoList[i][INFOINDEX+9] = data[i].info10 == null ? "" : data[i].info10;
			if (getInfoListLen() <= i) {
				_infoList[i][MARKERINDEX] = null;
				_infoList[i][INFOBOXINDEX] = null;
			}
			// 最新更新日取得
			var dt = data[i].updatetime == null ? "0000-00-00 00:00:00" : data[i].updatetime;
			if (updatetime < dt)
				updatetime = dt;
		}
		// 現在時刻設定
		setUpdateTime(updatetime);
		setCurrentDateTime();
		// 未使用要素非表示
		for (var j = data.length; j < getInfoListLen(); j++) {
			hideMarker(j);
			hideInfobox(j);
		}
		// _infoListLen設定
		setInfoListLen(data.length);
		// 再描画
		autoUpdatePage();
	});

	
	// タイマー再起動
	restartTimer("");
}


/**
 * イベント契機：自動更新タイマータイムアウト時
 */
function autoUpdateOt() {
	var ajax = getAjax();
	ajax.open("GET", STATEXML + "?" + (new Date()).getTime());
	ajax.onreadystatechange = function() {
		if (ajax.readyState == 4 && ajax.status == 200) {
			var updatetime = "0000-00-00 00:00:00";
			// 現在表示中の情報ボックスを記憶する．
			setShowingInfoboxList();
			
			var xmlData = ajax.responseXML;
			var stateTags = xmlData.getElementsByTagName("state");
			var typeIdTags = xmlData.getElementsByTagName("typeId");
			var latTags = xmlData.getElementsByTagName("lat");
			var lngTags = xmlData.getElementsByTagName("lng");
			var iconImgUrlTags = xmlData.getElementsByTagName("iconImgUrl");
			var anchorXTags = xmlData.getElementsByTagName("anchorX");
			var anchorYTags = xmlData.getElementsByTagName("anchorY");
			var infoAnchorXTags = xmlData.getElementsByTagName("infoAnchorX");
			var infoAnchorYTags = xmlData.getElementsByTagName("infoAnchorY");
			var equipmentNameTags = xmlData.getElementsByTagName("equipmentName");
			var placeNameTags = xmlData.getElementsByTagName("placeName");
			var roadNameTags = xmlData.getElementsByTagName("roadName");
			var roadImgUrlTags = xmlData.getElementsByTagName("roadImgUrl");
			var supplimentTags = xmlData.getElementsByTagName("suppliment");
			var areaIdTags = xmlData.getElementsByTagName("areaId");
			var info01Tags = xmlData.getElementsByTagName("info01");
			var info02Tags = xmlData.getElementsByTagName("info02");
			var info03Tags = xmlData.getElementsByTagName("info03");
			var info04Tags = xmlData.getElementsByTagName("info04");
			var info05Tags = xmlData.getElementsByTagName("info05");
			var info06Tags = xmlData.getElementsByTagName("info06");
			var info07Tags = xmlData.getElementsByTagName("info07");
			var info08Tags = xmlData.getElementsByTagName("info08");
			var info09Tags = xmlData.getElementsByTagName("info09");
			var info10Tags = xmlData.getElementsByTagName("info10");
			var updatetimeTags = xmlData.getElementsByTagName("updatetime");
			
			for (var i = 0; i < stateTags.length; i++) {
				var typeId = parseInt(typeIdTags[i].childNodes[0].nodeValue);
				if (i < getInfoListLen() && 
					_infoList[i][TYPEINDEX] != typeId &&
					_infoList[i][MARKERINDEX] != null) {
					_map.removeOverlay(_infoList[i][MARKERINDEX]);
					_infoList[i][MARKERINDEX] = null;
				}
				if (getInfoListLen() <= i) _infoList[i] = new Array();

				_infoList[i][TYPEINDEX] = typeId;
				_infoList[i][LATINDEX] = parseFloat(latTags[i].childNodes[0].nodeValue);
				_infoList[i][LNGINDEX] = parseFloat(lngTags[i].childNodes[0].nodeValue);
				_infoList[i][MARKERICONINDEX] = iconImgUrlTags[i].childNodes[0].nodeValue;
				_infoList[i][ICONANCHORXINDEX] = parseInt(anchorXTags[i].childNodes[0].nodeValue);
				_infoList[i][ICONANCHORYINDEX] = parseInt(anchorYTags[i].childNodes[0].nodeValue);
				_infoList[i][INFOANCHORXINDEX] = parseInt(infoAnchorXTags[i].childNodes[0].nodeValue);
				_infoList[i][INFOANCHORYINDEX] = parseInt(infoAnchorYTags[i].childNodes[0].nodeValue);
				_infoList[i][PLACENAMEINDEX] = 
					equipmentNameTags[i].childNodes.length <= 0 ? 
						"" : equipmentNameTags[i].childNodes[0].nodeValue;
				_infoList[i][CITYNAMEINDEX] = 
					placeNameTags[i].childNodes.length <= 0 ? 
						"" : placeNameTags[i].childNodes[0].nodeValue;
				_infoList[i][ROADNAMEINDEX] = 
					roadNameTags[i].childNodes.length <= 0 ? 
						"" : roadNameTags[i].childNodes[0].nodeValue;
				_infoList[i][ROADICONINDEX] = 
					roadImgUrlTags[i].childNodes.length <= 0 ? 
						"" : roadImgUrlTags[i].childNodes[0].nodeValue;
				_infoList[i][EASYMAPINDEX] = 
					supplimentTags[i].childNodes.length <= 0 ? 
						"" : supplimentTags[i].childNodes[0].nodeValue;
				_infoList[i][AREAINDEX] = parseInt(areaIdTags[i].childNodes[0].nodeValue);
				_infoList[i][INFOINDEX] = 
					info01Tags[i].childNodes.length <= 0 ? 
						"" : info01Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+1] = 
					info02Tags[i].childNodes.length <= 0 ? 
						"" : info02Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+2] = 
					info03Tags[i].childNodes.length <= 0 ? 
						"" : info03Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+3] = 
					info04Tags[i].childNodes.length <= 0 ? 
						"" : info04Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+4] = 
					info05Tags[i].childNodes.length <= 0 ? 
						"" : info05Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+5] = 
					info06Tags[i].childNodes.length <= 0 ? 
						"" : info06Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+6] = 
					info07Tags[i].childNodes.length <= 0 ? 
						"" : info07Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+7] = 
					info08Tags[i].childNodes.length <= 0 ? 
						"" : info08Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+8] = 
					info09Tags[i].childNodes.length <= 0 ? 
						"" : info09Tags[i].childNodes[0].nodeValue;
				_infoList[i][INFOINDEX+9] = 
					info10Tags[i].childNodes.length <= 0 ? 
						"" : info10Tags[i].childNodes[0].nodeValue;
				if (getInfoListLen() <= i) {
					_infoList[i][MARKERINDEX] = null;
					_infoList[i][INFOBOXINDEX] = null;
				}
				// 最新更新日取得
				if (0 < updatetimeTags[i].childNodes.length) {
					var dt = updatetimeTags[i].childNodes[0].nodeValue;
					if (updatetime < dt) updatetime = dt;
				}
			}
			// 現在時刻設定
			setUpdateTime(updatetime);
			setCurrentDateTime();
			// 未使用要素非表示
			for (var j = stateTags.length; j < getInfoListLen(); j++) {
				hideMarker(j);
				hideInfobox(j);
			}
			// _infoListLen設定
			setInfoListLen(stateTags.length);
			// 再描画
			autoUpdatePage();
			// タイマー再起動
			restartTimer("o");
		}
	}
	ajax.send(null);
}

