/*** サジェスト用変数 ***/
//前回入力文字格納
var oldvalue;
//サジェストテキストボックス名称格納
var suggest_elements;
//サジェストリストボックス名称格納
var suggest_selects;
//サジェスト領域(DIV)名称格納
var suggest_divs;
//使用中サジェスト番号（複数対応の為）
var suggest_target=-1;
//↓キーダウン時用フラグ（マウスによるリスト選択時にも使用）
var keydown_flg=0;
//onclickイベント用
var flag = true;
//ユーザエージェント
var ua = navigator.userAgent;
//ブラウザ判定
var safari	= ua.indexOf("Safari")!=-1;
var konqueror = ua.indexOf("Konqueror")!=-1;
var mozes	 = ((a=navigator.userAgent.split("Gecko/")[1] )?a.split(" ")[0]:0) >= 20011128;
//OS判定
var mac = ua.indexOf("Mac")!=-1;

/**
	フォーカスロスト時処理（100ms後に発動）

	↓キーダウン押下／マウスによるリスト選択の場合を考慮し、keydown_flgによる分岐を行う。
	フォーカスロスト処理として、使用中サジェスト番号をクリアし、
	サジェストリストボックスのクリアを行う。
*/
function suggestBlurDelay() {
	if(keydown_flg == 0) {
		if(suggest_target != -1) {
			if(document.getElementById(suggest_selects[suggest_target]).style.visibility=="visible") {
				suggest_target=-1;
			}else{
				if(oldvalue[suggest_target] == document.getElementById(suggest_elements[suggest_target]).value) {
					suggest_target=-1;
				}
			}
		}
		setSuggestOut();
	}
	keydown_flg=0;
}

/**
	サジェストコントロール　フォーカスロスト時処理
	引数：target	該当サジェスト番号

	↓キーダウンによるフォーカス移動の場合を考慮し、keydown_flgによる分岐を行う。
	移動先のフォーカス内容を取得し、該当のサジェストコントロール(テキスト・リスト)以外の場合、
	100ms後にsuggestBlurDelayを行う。
*/
function suggestBlur(target) {
	if(getElementId() != suggest_elements[target] && getElementId() != suggest_selects[target]) {
		setTimeout(suggestBlurDelay,100);
	}else{
		if(keydown_flg != 0) {
			keydown_flg=0;
			setTimeout(suggestBlur,100);
		}
	}
}

/**
	サジェストテキスト　キーダウン時処理
	引数：key	キーコード

	サジェストコントロール上でキーダウンが行われた際に実行される。
	↓キーダウン且つサジェストリストが表示されている場合、サジェストリストへフォーカスを移動。
	また、Enterキーダウン時に、次画面遷移処理を実行。
*/
function suggestKeyDown(key) {
	//「↓」押下時処理
	if(key==40 && document.getElementById(suggest_selects[suggest_target]).style.visibility=="visible") {
		keydown_flg=key;
		document.getElementById(suggest_selects[suggest_target]).selectedIndex = -1;
		document.getElementById(suggest_selects[suggest_target]).focus();
	}
//	//「↑」押下時処理
//	if(key==38 && document.getElementById(suggest_selects[suggest_target]).style.visibility=="visible") {
//		keydown_flg=key;
//		document.getElementById(suggest_selects[suggest_target]).selectedIndex = document.getElementById(suggest_selects[suggest_target]).length-1;
//		document.getElementById(suggest_selects[suggest_target]).focus();
//	}
	//「Enter」押下時処理
	if(key==13) {
		send();
	}
	return false;
}

/**
	サジェストテキスト　キーダウン時処理
	引数：key	キーコード

	サジェストコントロール上でキーダウンが行われた際に実行される。
	↓キーダウン且つサジェストリストが表示されている場合、サジェストリストへフォーカスを移動。
	また、Enterキーダウン時に、次画面遷移処理を実行。
*/
function suggestKeyDownT(key) {
	//「↓」押下時処理
	if(key==40 && document.getElementById(suggest_selects[suggest_target]).style.visibility=="visible") {
		keydown_flg=key;
		document.getElementById(suggest_selects[suggest_target]).selectedIndex = -1;
		document.getElementById(suggest_selects[suggest_target]).focus();
	}
//	//「↑」押下時処理
//	if(key==38 && document.getElementById(suggest_selects[suggest_target]).style.visibility=="visible") {
//		keydown_flg=key;
//		document.getElementById(suggest_selects[suggest_target]).selectedIndex = document.getElementById(suggest_selects[suggest_target]).length-1;
//		document.getElementById(suggest_selects[suggest_target]).focus();
//	}
	//「Enter」押下時処理
	if(key==13) {
		sendTimeTable();
	}
	return false;
}

/**
	サジェストリスト　キーダウン時処理
	引数：key	キーコード

	サジェストコントロール上でキーダウンが行われた際に実行される。
	↑／↓キーダウン且つサジェストリストが表示されている場合、サジェストリストの選択肢内をループ移動。
	※マルチブラウザ非対応
	※処理実装検討中！
*/
function suggestListKeyDown(key) {
	if(key==38 && document.getElementById(suggest_selects[suggest_target]).selectedIndex==0) {
		document.getElementById(suggest_selects[suggest_target]).selectedIndex = document.getElementById(suggest_selects[suggest_target]).length-1;
		event.returnValue = false;
	}
	if(key==40 && document.getElementById(suggest_selects[suggest_target]).selectedIndex==document.getElementById(suggest_selects[suggest_target]).length-1) {
		document.getElementById(suggest_selects[suggest_target]).selectedIndex = 0;
		event.returnValue = false;
	}
}

/**
	サジェストリスト　キーダウン時処理
	引数：key	キーコード

	サジェストコントロール上でキーダウンが行われた際に実行される。
	↑／↓キーダウン且つサジェストリストが表示されている場合、サジェストテキストへフォーカスを移動。
	※処理実装検討中！
*/
function suggestListKeyDown2(key) {
	if(key==38 && document.getElementById(suggest_selects[suggest_target]).selectedIndex==0) {
		document.getElementById(suggest_elements[suggest_target]).focus();
		return false;
	}
	if(key==40 && document.getElementById(suggest_selects[suggest_target]).selectedIndex==document.getElementById(suggest_selects[suggest_target]).length-1) {
		document.getElementById(suggest_selects[suggest_target]).selectedIndex = -1;
		document.getElementById(suggest_elements[suggest_target]).focus();
		return false;
	}
	return true;
}

/**
	現フォーカス情報取得処理

	各種ブラウザにより、フォーカス情報取得処理を分岐。
	取得できない場合にはnullを返却。（FireFox2.0が該当）
*/
function getElementId(){
	if(window.opera || safari || mozes){
		if(window.getSelection().focusNode != null) {
			return window.getSelection().focusNode.id;
		} else {
			return null;
		}
	} else {
		return document.activeElement.id;
	}
}

/**
	サジェストテキスト設定処理

	サジェストリストより選択している内容をサジェストテキストへ設定する。
	設定後、サジェストリストのクリアを行い、サジェストテキストへフォーカス移動。
*/
function setSuggest(){
	oldvalue[suggest_target] = document.getElementById(suggest_selects[suggest_target])[document.getElementById(suggest_selects[suggest_target]).selectedIndex].value;
	document.getElementById(suggest_elements[suggest_target]).value = oldvalue[suggest_target];
	setSuggestOut();
	keydown_flg=0;
	document.getElementById(suggest_elements[suggest_target]).focus();
}

/**
	サジェストリスト消去処理

	サジェストリストのクリアと、サジェストリスト表示時に
	一時的に消えていたコントロールの表示を行う。
*/
function setSuggestOut(){
	//全コントロール復活
	l=suggest_selects.length;
	for(i=0;i<l;i++) {
		if(document.getElementById(suggest_selects[i])!=null) {
			document.getElementById(suggest_selects[i]).style.visibility="hidden";
		}
		if(document.getElementById(suggest_divs[i])!=null) {
			document.getElementById(suggest_divs[i]).style.visibility="hidden";
		}
	}
}

/**
	Ajax用オブジェクト作成処理

	各種ブラウザにより分岐を行い、Ajax用オブジェクトを生成。
*/
function createObject() {
	if(window.ActiveXObject){
		 //Win e4,e5,e6用
		try {
		  return new ActiveXObject("Msxml2.XMLHTTP") ;
		} catch (e) {
		  try {
		    return new ActiveXObject("Microsoft.XMLHTTP") ;
		  } catch (e2) {
		    return null ;
 		  }
 		}
	} else if(window.XMLHttpRequest){
		 //Win Mac Linux m1,f1,o8 Mac s1 Linux k3用
		return new XMLHttpRequest() ;
	} else {
		return null ;
	}
}

/**
	Ajax用非同期処理
	引数：Ajax用オブジェクト

	Ajax処理により非同期に行われた処理から、クライアントへ戻った際に動作される処理。
	ここでは、サジェストテキスト内容を用いてDBより取得できたリスト内容を
	サジェストリストへ格納し、サジェストリストの表示を行う。
	また、リスト表示の際に一時的に非表示にするコントロールの設定を行う。
*/
function callback(http){
	var response = http.responseText;
	var esc = escape( response );
	if ( esc.indexOf("%u") < 0 && esc.indexOf("%") > -1 ) {
		response = decodeURIComponent( esc );
	}
	if(response != "" && response.length >= 2 && suggest_target >= 0){
		var options = response.split(",");
		var length = options.length-1;
		if(length == 0) {
			return;
		}
		document.getElementById(suggest_divs[suggest_target]).style.visibility="visible";
		document.getElementById(suggest_selects[suggest_target]).style.visibility="visible";
		for(i = 0;i < 10;i++){
			document.getElementById(suggest_selects[suggest_target]).options[0] = null;
		}
		j=0;
		for(i = 0;i < length;i++){
			if(i==0){
				document.getElementById(suggest_selects[suggest_target]).options[j] = new Option(options[i], options[i]);
				j++;
			}else{
				if(options[i]!=options[i-1]) {
					document.getElementById(suggest_selects[suggest_target]).options[j] = new Option(options[i], options[i]);
					j++;
				}
			}
		}
		//document.getElementById(suggest_selects[suggest_target]).selectedIndex = 0; /* ⇒未選択状態に変更 */
	}
}

/**
	サジェスト用メイン処理

	入力支援チェックボックスがON且つ、使用中サジェスト番号が指定している場合、
	非同期通信を行い、DBよりリストの取得を行う。
	また、このメイン処理は100ms毎に繰り返し実行される。
*/
function autosuggest() {

	// テキスト入力支援ありのチェックボックスにチェックがない場合
	if(document.getElementById('support')==null) {
		return;
	}

	if (document.getElementById('support').checked && suggest_target >= 0){

		var textbox = document.getElementById(suggest_elements[suggest_target]);

		// 記号のマッチング
		re = new RegExp("[#,&?{}\()-;~｜$!*%_]");
		if(re.test(textbox.value)){
			setTimeout(autosuggest,100);
			return;
		}

		var http = createObject();

		if (http != null){
			if (textbox.value == "") {
				setSuggestOut();
				oldvalue[suggest_target] = textbox.value;
			} else if(oldvalue[suggest_target] != textbox.value) {
				var q = textbox.value + "%";

				url = "/map/uc/PoiAttr?grp=nifty_transit&vo=mbml&sgrp=stall&pm=10&xsl=/nifty_transit/xsl/nifty_transit_Suggest&srt=poi_name_yomi,poi_name&unit=poi_name:poi_name_yomi";
				if(textbox.name == "isearchEki") {
					url = url + ",s_flg&s_flg=R";
				}else{
					url = url + ",s_flg&s_flg=R,A";
				}
				url = url + "&poi_name=" + q + "&poi_name_yomi=" + q;
				url = url + "&xml=0&ie=utf-8&oe=utf-8&output=" + suggest_selects[suggest_target];
				url = url + "&input=" + suggest_elements[suggest_target];

				url = encodeURI(url);

				http.open('GET', url, false);

				if(window.opera || safari || mozes){
					http.onload = function () {
						callback(http);
					}
				} else {
					http.onreadystatechange =function () {
						if ( http.readyState == 4 ){
							callback(http);
						}
					}
				}

				http.send(null);

				oldvalue[suggest_target] = textbox.value;
			} else {
				//他サジェストテキストにターゲットがある場合に、
				//サジェストリストが表示されたままのリストをクリア
				l=suggest_selects.length;
				for(i=0;i<l;i++){
					if(i!=suggest_target){
						if(document.getElementById(suggest_selects[i])!=null) {
							if(document.getElementById(suggest_selects[i]).style.visibility=="visible") {
								setSuggestOut();
								break;
							}
						}
					}
				}
			}
		}
	} else {
		setSuggestOut();
	}
	setTimeout(autosuggest,100);
}

/**
	onClick判断処理

	勝手に起動されるonClickイベントの制御を行う。
*/
function checkClick(e){
	if(mac){
    	flag = e.which ? false : true; //NN6は続けて移動先のonclickが発動するので制御
	}

    return false; //キーコードクリア
}