/*
 * JavaScriptファイル読み込み
 * 
 * ▼prototype.js参考
 * マニュアル：http://www.openspc2.org/JavaScript/Ajax/ref/prototype.js/ver1.5.0/index.html
 * チュートリアル：http://www.imgsrc.co.jp/~kuriyama/prototype/prototype.js.html
 **************************************************************************/
document.write('<script type="text/javascript" src="js/prototype.js"></script>');
document.write('<script type="text/javascript" src="js/sys_common.js"></script>');
document.write('<script type="text/javascript" src="pc/js/suggest.js"></script>');
document.write('<script type="text/javascript" src="pc/js/suggest_search_route.js"></script>');
document.write('<script type="text/javascript" src="http://maps.google.co.jp/maps?file=api&v=2&key=ABQIAAAAxb0FgU_2pymPUvAzmiaJPxSWNDLXGKvW_uKCMBo_m6PgvNs7bxQQcw1FHTrksgdb5qXnsKUd2DDPAA"></script>');

/*
 * 定数宣言
 **************************************************************************/
// HTTPリクエストベースURL
var BASE_URL = 'ajax.php';

// デフォルト会津若松駅(緯度)
var DEFAULT_CENTER_LAT = 37.50805773706982;
// デフォルト会津若松駅(経度)
var DEFAULT_CENTER_LNG = 139.93101596832275;
// デフォルトズームレベル
var DEFAULT_ZOOM_LEVEL = 16;
// 管轄情報一覧
var KNKT_LIST = new Array(12);
// 若松営業所
KNKT_LIST[0] = {
	'cd': 'KNKT-00',
	'nm': '若松営業所',
	'nm_hira': 'わかまつえいぎょうしょ',
	'lat': 37.507932,
	'lng': 139.934314,
	'yubn_no': '965-0024',
	'addr_1': '会津若松市白虎町195番地',
	'addr_2': '',
	'tel_no': '（0242）22-5555',
	'fax_no': '（0242）22-5562',
	'html_info': ''
};
// 若松駅前ターミナル
KNKT_LIST[1] = {
	'cd': 'KNKT-01',
	'nm': '若松駅前ターミナル',
	'nm_hira': 'わかまつえきまえたーみなる',
	'lat': 37.50735,
	'lng': 139.932134,
	'yubn_no': '965-0024',
	'addr_1': '会津若松市白虎町227',
	'addr_2': '',
	'tel_no': '（0242）22-5555',
	'fax_no': '',
	'html_info': ''
};
// 神明通り案内所
KNKT_LIST[2] = {
	'cd': 'KNKT-02',
	'nm': '神明通り案内所',
	'nm_hira': 'しんめいどおりあんないじょ',
	'lat': 37.496521,
	'lng': 139.926669,
	'yubn_no': '965-0878',
	'addr_1': '会津若松市中町4の36',
	'addr_2': '',
	'tel_no': '（0242）26-8000',
	'fax_no': '',
	'html_info': ''
};
// 米代バスセンター
KNKT_LIST[3] = {
	'cd': 'KNKT-03',
	'nm': '米代バスセンター',
	'nm_hira': 'よねだいばすせんたー',
	'lat': 37.496521,
	'lng': 139.926669,
	'yubn_no': '965-0875',
	'addr_1': '会津若松市米代2丁目1の10',
	'addr_2': '',
	'tel_no': '（0242）27-2591',
	'fax_no': '',
	'html_info': ''
};
// 竹田病院前案内所
KNKT_LIST[4] = {
	'cd': 'KNKT-04',
	'nm': '竹田病院前案内所',
	'nm_hira': 'たけだびょういんまえあんないじょ',
	'lat': 37.490278,
	'lng': 139.922767,
	'yubn_no': '965-0876',
	'addr_1': '会津若松市山鹿町3番27号',
	'addr_2': '',
	'tel_no': '（0242）26-4904',
	'fax_no': '',
	'html_info': ''
};
// 猪苗代営業所
KNKT_LIST[5] = {
	'cd': 'KNKT-05',
	'nm': '猪苗代営業所',
	'nm_hira': 'いなわしろえいぎょうしょ',
	'lat': 37.547256,
	'lng': 140.102711,
	'yubn_no': '969-3133',
	'addr_1': '耶麻郡猪苗代町大字千代田字扇田5-10',
	'addr_2': '',
	'tel_no': '（0242）62-2231',
	'fax_no': '（0242）62-2231',
	'html_info': ''
};
// 喜多方営業所
KNKT_LIST[6] = {
	'cd': 'KNKT-06',
	'nm': '喜多方営業所',
	'nm_hira': 'きたかたえいぎょうしょ',
	'lat': 37.645961,
	'lng': 139.868106,
	'yubn_no': '966-0847',
	'addr_1': '喜多方市字町田8285の1',
	'addr_2': '',
	'tel_no': '（0241）22-1151',
	'fax_no': '（0241）22-1152',
	'html_info': ''
};
// 坂下営業所
KNKT_LIST[7] = {
	'cd': 'KNKT-07',
	'nm': '坂下営業所',
	'nm_hira': 'ばんげえいぎょうしょ',
	'lat': 37.567444,
	'lng': 139.812746,
	'yubn_no': '969-6561',
	'addr_1': '河沼郡会津坂下町字大道2408',
	'addr_2': '',
	'tel_no': '（0242）83-0979',
	'fax_no': '',
	'html_info': ''
};
// 野沢営業所
KNKT_LIST[8] = {
	'cd': 'KNKT-08',
	'nm': '野沢営業所',
	'nm_hira': 'のざわえいぎょうしょ',
	'lat': 37.590064,
	'lng': 139.645417,
	'yubn_no': '969-4406',
	'addr_1': '耶麻郡西会津町野沢字下小屋乙3178-6',
	'addr_2': '',
	'tel_no': '（0241）45-3130',
	'fax_no': '（0241）45-3130',
	'html_info': ''
};
// 田島営業所
KNKT_LIST[9] = {
	'cd': 'KNKT-09',
	'nm': '田島営業所',
	'nm_hira': 'たじまえいぎょうしょ',
	'lat': 37.18946754704597,
	'lng': 139.75873231887817,
	'yubn_no': '967-0005',
	'addr_1': '南会津郡南会津町中荒井字油燈下108の1',
	'addr_2': '',
	'tel_no': '（0241）62-0134',
	'fax_no': '（0241）62-0259',
	'html_info': ''
};
// 山口営業所
KNKT_LIST[10] = {
	'cd': 'KNKT-10',
	'nm': '山口営業所',
	'nm_hira': 'やまぐちえいぎょうしょ',
	'lat': 37.222129,
	'lng': 139.538121,
	'yubn_no': '967-0611',
	'addr_1': '南会津郡南会津町山口字村上825-1',
	'addr_2': '',
	'tel_no': '（0241）72-2001',
	'fax_no': '',
	'html_info': ''
};
// 郡山湖南営業所
KNKT_LIST[11] = {
	'cd': 'KNKT-11',
	'nm': '郡山湖南営業所',
	'nm_hira': 'こおりやまこなんえいぎょうしょ',
	'lat': 37.395622,
	'lng': 140.085458,
	'yubn_no': '963-1633',
	'addr_1': '郡山市湖南町福良字町浦83の1',
	'addr_2': '',
	'tel_no': '（024）983-2321',
	'fax_no': '（024）983-2321',
	'html_info': ''
};

/*
 * 変数宣言
 **************************************************************************/
// GoogleMapオブジェクト
var gm_map;
// クリックポイントコード
var clickPointCd = null;

/*
 * GoogleMap操作メソッド
 **************************************************************************/
/**
 * 初期化メソッド
 * 
 * GoogleMapを初期化して表示する。
 * 
 * @return id⇒gm-map
 */
function gmInit(){

	// GoogleMap初期設定
	gm_map = new GMap2($('gm-map'));
	gm_map.setCenter(new GLatLng(DEFAULT_CENTER_LAT, DEFAULT_CENTER_LNG), DEFAULT_ZOOM_LEVEL);
	new GKeyboardHandler(gm_map);

	gm_map.addControl(new GLargeMapControl());
	gm_map.addControl(new GOverviewMapControl());

	// マーカー配置
	GEvent.addListener(gm_map, 'load', function(){ gmSearchMarkerList(); });
	GEvent.addListener(gm_map, 'moveend', function(){ gmSearchMarkerList(); });

	// 初期表示地図範囲内マーカー検索
	gmSearchMarkerList();
}

/**
 * デストラクタメソッド
 * 
 * GoogleMapを破棄する。
 */
function gmDestructor(){

	GUnload();
}

/**
 * 中央移動
 * 
 * 指定された緯度／経度をGoogleMap中央ーに配置されるよう移動する。
 * 
 * @param  lat 緯度
 * @param  lng 経度
 */
function gmPanToMoveCenter(lat, lng){

	gm_map.panTo(new GLatLng(lat, lng));
}

/**
 * 地図範囲内マーカー検索
 * 
 * 地図に表示されている範囲の南西端、北東端の緯度／経度をもとに、
 * 範囲内にあるポイント一覧（バス停／駅）を検索する。
 */
function gmSearchMarkerList(){

	// 南西／北東端GLatLngオブジェクト取得
	var bounds = gm_map.getBounds();
	var south_west = bounds.getSouthWest();
	var north_east = bounds.getNorthEast();

	// HTTPリクエストパラメータ
	var param = {
			app_forward: 'AjaxMarkerListDispAction',
			map_south_west_lat: south_west.lat(),
			map_south_west_lng: south_west.lng(),
			map_north_east_lat: north_east.lat(),
			map_north_east_lng: north_east.lng()
	};

	// HTTPリクエスト送信オプション
	var option = {
			method: 'get',
			parameters: $H(param).toQueryString(),
			onSuccess: gmShowMarkerList,
			onFailure: alertFailureMsg,
			onException: alertExceptionMsg
	};

	// HTTPリクエスト送信
	new Ajax.Request(
			BASE_URL,
			option
	);
}

/**
 * 地図範囲内マーカー表示
 * 
 * 地図に表示されている範囲の南西端、北東端の緯度／経度をもとに、
 * 範囲内にあるポイント一覧を取得し、マーカーへ変換して地図上に配置する。
 * 
 * @param  req  XMLHttpRequestオブジェクト
 * @param  json JSONオブジェクト
 */
function gmShowMarkerList(res, json){

	json = eval('('+res.responseText+')');
	var html = '';
	var markerList = json['markerList'];

	for(var i = 0; i < markerList.length; i++){

		switch(markerList[i]['kbn']) {

			// バス停マーカー追加
			case 'BUS':
				gmAddMarkerBus(markerList[i]);
				break;

			// 駅マーカー追加
			case 'EKI':
				gmAddMarkerEki(markerList[i]);
				break;

			default:
				break;
		}
	}

	// 営業所マーカー追加
	for(var i = 0; i < KNKT_LIST.length; i++){

		gmAddMarkerKnkt(KNKT_LIST[i]);
	}
}

/**
 * バス停マーカー表示
 * 
 * バス停マーカーを表示する。
 * 
 * @param json JSONオブジェクト
 */
function gmAddMarkerBus(json){

	// アイコン生成
	var icon = new GIcon();
	icon.image = 'pc/img/bus_stop1.png';
	icon.iconSize = new GSize(12, 27);
	icon.iconAnchor = new GLatLng(0, 0);
	icon.infoWindowAnchor = new GLatLng(1, 1);
	json['icon'] = icon;

	// 情報ウィンドウHTML生成
	var html =
	'<div id="gm-info-window">' +
	'  <div class="title">' + 
	'    [バス停]<br />' +
	'    ' + json['nm'] + '<br /><br />' +
	'    <input name="bt_set_syptt" type="button" value="出発地に設定" onClick="set(\'srcForm\', \'syptt_nm\', \'' + json['nm'] + '\');" />&nbsp;&nbsp;' +
	'    <input name="bt_set_mktkt" type="button" value="目的地に設定" onClick="set(\'srcForm\', \'mktkt_nm\', \'' + json['nm'] + '\');" /><br />' +
	'  </div>' +
	'  <div class="contents">';

	// カテゴリHTML生成
	var category = json['category'];
	var categoryHtml = '';

	for(var i = 0; i < category.length; i++){

		if(i == 0){
			categoryHtml = '    おすすめ：';
		}

		categoryHtml = categoryHtml +
		'[<a href="javascript:set(\'categoryForm\', \'bus_tei_cd\', \'' + category[i]['bus_tei_cd'] + '\'); javascript:set(\'categoryForm\', \'knku_category_cd\', \'' + category[i]['knku_category_cd'] + '\'); javascript:popupDetail(\'categoryForm\');">' + category[i]['knku_category_nm'] + '</a>]';

		if(i != 0 && (i % 5) == 0){
			categoryHtml = categoryHtml + '<br />';
		}
	}

	html += categoryHtml;

	// 時刻表HTML生成
	html +=
	'    <br />' +
	'    ⇒<a href="javascript:set(\'busTeiKeiroKituListForm\', \'syptt_cd\', \'' + json['cd'] + '\'); javascript:popupDetail(\'busTeiKeiroKituListForm\');">時刻表</a>を見る<br />' +
	'  </div>'+
	'</div>';

	json['html_info'] = html;

	gmAddGMarker(json);
}

/**
 * 駅マーカー表示
 * 
 * 駅マーカーを表示する。
 * 
 * @param json JSONオブジェクト
 */
function gmAddMarkerEki(json){

	// アイコン生成
	var icon = new GIcon();
	icon.image = 'pc/img/station.png';
	icon.iconSize = new GSize(36, 29);
	icon.iconAnchor = new GLatLng(-5, 30);
	icon.infoWindowAnchor = new GLatLng(1, 1);
	json['icon'] = icon;

	// 情報ウィンドウHTML生成
	var html =
	'<div id="gm-info-window">' +
	'  <div class="title">' + 
	'    [駅]<br />' +
	'    ' + json['nm'] + '<br /><br />' +
	'    <input name="bt_set_syptt" type="button" value="出発地に設定" onClick="set(\'srcForm\', \'syptt_nm\', \'' + json['nm'] + '\');" />&nbsp;&nbsp;' +
	'    <input name="bt_set_mktkt" type="button" value="目的地に設定" onClick="set(\'srcForm\', \'mktkt_nm\', \'' + json['nm'] + '\');" /><br />' +
	'  </div>' +
	'  <div class="contents">';

	// カテゴリHTML生成
	var category = json['category'];
	var categoryHtml = '';

	for(var i = 0; i < category.length; i++){

		if(i == 0){
			categoryHtml = '    おすすめ：';
		}

		categoryHtml = categoryHtml +
		'[<a href="javascript:set(\'categoryForm\', \'knku_category_cd\', \'' + category[i]['knku_category_cd'] + '\'); javascript:popupDetail(\'categoryForm\');">' + category[i]['knku_category_nm'] + '</a>]';

		if(i != 0 && (i % 5) == 0){
			categoryHtml = categoryHtml + '<br />';
		}
	}

	html +=
	'  </div>'+
	'</div>';

	json['html_info'] = html;

	gmAddGMarker(json);
}

/**
 * 営業所マーカー表示
 * 
 * 営業所マーカーを表示する。
 * 
 * @param json JSONオブジェクト
 */
function gmAddMarkerKnkt(json){

	// アイコン生成
	var icon = new GIcon();
	icon.image = 'pc/img/office.png';
	icon.iconSize = new GSize(36, 29);
	icon.iconAnchor = new GLatLng(5, -30);
	icon.infoWindowAnchor = new GLatLng(1, 1);
	json['icon'] = icon;

	// 情報ウィンドウHTML生成
	var html =
	'<div id="gm-info-window">' +
	'  <div class="title">' + 
	'    [営業所]<br />' +
	'    ' + json['nm'] + '<br />' +
	'  </div>' +
	'  <div class="contents">' +
	'    〒' + json['yubn_no'] + '<br />' +
	'    ' + json['addr_1'] + json['addr_2'] + '<br />' +
	'    TEL：' + json['tel_no'] + '<br />' +
	'    FAX：' + json['fax_no'] + '<br />' +
	'  </div>'+
	'</div>';

	json['html_info'] = html;

	gmAddGMarker(json);
}

/**
 * マーカー表示
 * 
 * マーカーを表示する。
 * 
 * @param json JSONオブジェクト
 */
function gmAddGMarker(json){

	// 緯度／経度オブジェクト生成
	var latLng = new GLatLng(json['lat'], json['lng']);
	// マーカーオブジェクト生成
	var marker = new GMarker(latLng, json['icon']);

	// マーカークリック時のリスナー登録
	GEvent.addListener(marker, 'click', function(){
			gmPanToMoveCenter(json['lat'], json['lng']);
			marker.openInfoWindowHtml(json['html_info']);
	});

	// マーカー配置
	gm_map.addOverlay(marker);

	// 情報ウィンドウ初期表示
	if(clickPointCd != null && clickPointCd == json['cd']){
		marker.openInfoWindowHtml(json['html_info']);
		clickPointCd = null;
	}
}

/*
 * Ajaxメソッド
 **************************************************************************/
/**
 * ポイント一覧表示メソッド
 * 
 * ポイント名で検索を行い、一覧を表示する。
 */
function searchPointNmList(){

	// ポイント名が空の場合、検索は行わない。
	if($('point-nm').value == ""){
		$('point-list').innerHTML = "";
		return;
	}

	// HTTPリクエストパラメータ
	var param = {
			app_forward: 'AjaxPointListDispAction',
			point_nm: $('point-nm').value
	};

	// HTTPリクエスト送信オプション
	var option = {
			method: 'get',
			parameters: $H(param).toQueryString(),
			onSuccess: function (res, json){
				json = eval('('+res.responseText+')');
				var html = '';
				var pointList = json['pointList'];
				for(var i = 0; i < pointList.length; i++){
					var pointNm = '<a href="javascript:clickPointCd=\'' + pointList[i]['mktkt_cd'] + '\'; javascript:gmPanToMoveCenter(' + pointList[i]['lat'] + ', ' + pointList[i]['lng'] + ');">' + pointList[i]['mktkt_nm'] + '</a>';
					html += pointNm + '<br />';
				}
				$('point-list').innerHTML = html;
			},
			onFailure: alertFailureMsg,
			onException: alertExceptionMsg
	};

	// HTTPリクエスト送信
	new Ajax.Request(
			BASE_URL,
			option
	);
}

/**
 * 高速系統一覧表示メソッド
 * 
 * 高速系統一覧を表示する。
 * 
 * @return id：kusk-kitu-list要素
 */
function searchKuskKituList(){

	// HTTPリクエストパラメータ
	var param = {
			app_forward: 'AjaxKuskKituListDispAction'
	};

	// HTTPリクエスト送信オプション
	var option = {
			method: 'get',
			parameters: $H(param).toQueryString(),
			onSuccess: function (res, json){

				json = eval('('+res.responseText+')');
				var html = '';
				var kuskKituList = json['kuskKituList'];
				for(var i = 0; i < kuskKituList.length; i++){
					var kuskKituNm = '<a href="javascript:set(\'kuskKituBusTeiListForm\', \'kitu_cd\', \'' + kuskKituList[i]['kitu_cd'] + '\'); javascript:popupDetail(\'kuskKituBusTeiListForm\');">' + kuskKituList[i]['kitu_nm'] + '</a>';
					html += kuskKituNm + '<br />';
				}
				$('kusk-kitu-list').innerHTML = html;
			},
			onFailure: alertFailureMsg,
			onException: alertExceptionMsg
	};

	// HTTPリクエスト送信
	new Ajax.Request(
			BASE_URL,
			option
	);
}

/**
 * 営業所一覧表示メソッド
 * 
 * 営業所一覧を表示する。
 * 
 * @return id：knkt-list要素
 */
function showKnktNmList(res, json){

	var html = '';

	for(var i = 0; i < KNKT_LIST.length; i++){

			var knktNm = '<a href="javascript:clickPointCd=\'' + KNKT_LIST[i]['cd'] + '\'; javascript:gmPanToMoveCenter(' + KNKT_LIST[i]['lat'] + ', ' + KNKT_LIST[i]['lng'] + ');">' + KNKT_LIST[i]['nm'] + '</a>';

			html += knktNm + '<br />';
	}

	$('knkt-list').innerHTML = html;
}

/**
 * サジェスト機能：一覧取得メソッド
 * 
 * データ一覧を検索／一覧表示する。
 */
function suggestSearch(suggest){

	var text = suggest.getInputText();
	var tmpText = text.replace(/^[ 　]+/, '').replace(/[ 　]+$/, '');
	
	if (tmpText == '' || tmpText == null) return;
	if (tmpText == suggest.getInputValueBackup()) return;
	
	// HTTPリクエストパラメータ
	var param = {
	  app_forward: 'AjaxPointListDispAction',
	  point_nm: text
	};
	
	// HTTPリクエスト送信オプション
	var option = {
	  method: 'get',
	  parameters: $H(param).toQueryString(),
	  onSuccess: function (res, json){
		json = eval('('+res.responseText+')');
	    var pointList = json['pointList'];
	    var pointNmList = new Array();
	    for(var i = 0; i < pointList.length; i++){
	      pointNmList[i] = pointList[i]['mktkt_nm'];
	    }
		
	    suggest.reload(pointNmList);
	    suggest.search();
	  },
	  onFailure: alertFailureMsg,
	  onException: alertExceptionMsg
	};
	
	// HTTPリクエスト送信
	new Ajax.Request(
	  'ajax.php',
	  option
	);
}

/*
 * 共通メソッド
 **************************************************************************/
/**
 * Failureメッセージ表示メソッド
 * 
 * Ajax呼び出しが失敗した場合に呼び出される。
 * 
 * @param req  XMLHttpRequestオブジェクト
 * @param json JSONオブジェクト
 */
function alertFailureMsg(req, json){

	alert('ご迷惑をお掛けしております。\n\n只今、大変込み合っております。\nしばらく経ってから、再度ご利用くださるようお願い致します。');
}

/**
 * Exceptionメッセージ表示メソッド
 * 
 * Ajax呼び出しにおいて、クライアント側で不正なレスポンスや不正な引数のような例外が発生した際に呼び出される。
 * 
 * @param req       Ajax.Requestオブジェクト
 * @param exception 例外オブジェクト
 */
function alertExceptionMsg(req, exception){

	alert('ご迷惑をお掛けしております。\n\n只今、システムのメンテナンス中です。\nしばらく経ってから、再度ご利用くださるようお願い致します。\n' + exception);
}

/*
 * onload／onunload
 **************************************************************************/
/**
 * onloadメソッド
 * 
 * 画面ロード完了時に呼び出され、初期表示を行う。
 */
function appOnload(){
	
	// 営業所一覧表示
	showKnktNmList();

	// 高速系統一覧検索
	searchKuskKituList();

	var suggestSypttNm = new Suggest.Suggest_Search_Route("syptt-nm", "suggest-syptt-nm", new Array(), {dispMax: 20, listTagName: 'li', interval: 500});
	suggestSypttNm.register_hook('search', suggestSearch);

	var suggestMktktNm = new Suggest.Suggest_Search_Route("mktkt-nm", "suggest-mktkt-nm", new Array(), {dispMax: 20, listTagName: 'li', interval: 500});
	suggestMktktNm.register_hook('search', suggestSearch);

	// GoogleMap起動
	gmInit();
}

/**
 * onunloadメソッド
 * 
 * 画面アンロード完了時に呼び出され、終了処理を行う。
 */
function appOnUnload(){
	
	// GoogleMap破棄
	gmDestructor();
}

window.addEventListener ?
  window.addEventListener('load', appOnload, false) :
  window.attachEvent('onload', appOnload);

window.addEventListener ?
  window.addEventListener('unload', appOnUnload, false) :
  window.attachEvent('onunload', appOnUnload);
