//------------------------------------------------------------------------------------
//座標取得
//------------------------------------------------------------------------------------
var agt			= navigator.userAgent.toLowerCase();
var is_ie		= ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_gecko	= (agt.indexOf('gecko') != -1);
var is_opera	= (agt.indexOf("opera") != -1);
var is_firefox	= (agt.indexOf("firefox") != -1);

/* 要素のスタイル属性を取得 */
function getElementStyle(targetElm, IEStyleProp, CSSStyleProp)
{
	var elem = targetElm;
	if(elem.currentStyle){
		return elem.currentStyle[IEStyleProp];
	}
	else if(window.getComputedStyle){
		var compStyle = window.getComputedStyle(elem, "");
		return compStyle.getPropertyValue(CSSStyleProp);
	}
}

/* 絶対座標取得 */
function getPosition(that)
{
	var targetEle = that; // thatは位置を取得したい要素Object
	var pos = new function(){
		this.x = 0;
		this.y = 0;
	}
	while(targetEle){
		pos.x += targetEle.offsetLeft;
		pos.y += targetEle.offsetTop;
		targetEle = targetEle.offsetParent;
		// IEの補正：上記計算で無視されてしまう各親要素のborder幅を加算
		if((targetEle) && (is_ie)){
			pos.x += (parseInt(getElementStyle(targetEle, "borderLeftWidth", "border-left-width")) || 0);
			pos.y += (parseInt(getElementStyle(targetEle, "borderTopWidth", "border-top-width")) || 0);
		}
	}
	// geckoの補正：カウントしないbody部border幅をマイナスしてしまうので２倍して加算
	if(is_gecko){
		// 以下の部分でbody部を取得し、borderの減算を補正する。
		var bd = document.getElementsByTagName("BODY")[0]; // body部を取得
		pos.x += 2*(parseInt(getElementStyle(bd, "borderLeftWidth", "border-left-width")) || 0);
		pos.y += 2*(parseInt(getElementStyle(bd, "borderTopWidth", "border-top-width")) || 0);
	}
	return pos;
}

//------------------------------------------------------------------------------------
//キーコード取得
//------------------------------------------------------------------------------------
var gzKeyCode;
document.onkeydown = checkKeyCode
function checkKeyCode(e){
	if(window.event)	gzKeyCode = window.event.keyCode;
	else if(e)			gzKeyCode = e.which;
	else				gzKeyCode = "";
}

//------------------------------------------------------------------------------------
//キー操作
//------------------------------------------------------------------------------------
function controlKeyOperation(mode, kidx, iidx)
{
	if(mode == 1){ // テキストボックス上
		if(gzKeyCode == 0x28 && document.getElementById("AUTOCOMPLETE_LAYER").style.visibility == "visible"){ // カーソル下andレイヤー表示中
			document.getElementById("REL_CONTENTS").focus();
			document.getElementById("REL_CONTENTS").selectedIndex = 0;
		}
		else if((gzKeyCode < 0x25 || 0x28 < gzKeyCode) && gzKeyCode != 0x0D && gzKeyCode != 0x09){ // カーソル、[TAB]、[ENTER]以外
			searchModelExec(kidx, iidx);
		}
	}
	else if(mode == 2){ // レイヤー上
		if(gzKeyCode == 0x26 && document.getElementById("REL_CONTENTS").selectedIndex == 0){ // カーソル上andインデックス=0
			document.getElementById(kidx).focus();
		}
		else if(gzKeyCode == 0x0D || gzKeyCode == 0x09){ // [TAB]or[ENTER]
			setLayerValue(kidx, iidx);
			dispCarInfoExec(2, iidx); // ページの表示処理。※オートコンプリートは関係ない。
			document.getElementById(kidx).focus();
		}
	}
	else{
		setLayerValue(kidx, iidx);
		dispCarInfoExec(2, iidx); // ページの表示処理。※オートコンプリートは関係ない。
		document.getElementById(kidx).focus();
	}
}

//------------------------------------------------------------------------------------
//オートコンプリートリスト表示
//------------------------------------------------------------------------------------
function visibleLayerSelBox(kidx, iidx, conts)
{
	var textbox = document.getElementById(kidx);
	var pos = getPosition(textbox);
	
	if(document.layers){
		document.layers["AUTOCOMPLETE_LAYER"].visibility				= "show";
	}
	else{
		document.getElementById("AUTOCOMPLETE_LAYER").style.visibility	= "visible";
	}
	
	var doc = '';
	doc += '<div id="AUTOCOMPLETE_LIST" style="position: absolute; top: '+(pos.y + textbox.offsetHeight - 1)+'px; left: '+pos.x+'px;">';
/*　フォーカスが外れたときに非表示にする場合はこちら
	doc += '<select id="REL_CONTENTS" name="rel_conts" size="'+(10 < conts.length?11:conts.length + 1)+'" onKeyup="controlKeyOperation(2, \''+kidx+'\', \''+iidx+'\');" onClick="controlKeyOperation(3, \''+kidx+'\', \''+iidx+'\');" onBlur="hiddenLayerSelBox();">';
*/
	doc += '<select id="REL_CONTENTS" name="rel_conts" size="'+(10 < conts.length?11:conts.length + 1)+'" onKeyup="controlKeyOperation(2, \''+kidx+'\', \''+iidx+'\');" onClick="controlKeyOperation(3, \''+kidx+'\', \''+iidx+'\');">';
	for(var i = 0; i < conts.length; i++){
		doc += '<option value="'+conts[i][0]+'">'+conts[i][1]+'</option>';
	}
	doc += '</select>';
	doc += '</div>';
	document.getElementById("AUTOCOMPLETE_LAYER").innerHTML = doc;
}

//------------------------------------------------------------------------------------
//オートコンプリートリスト非表示
//------------------------------------------------------------------------------------
function hiddenLayerSelBox()
{
	var doc = '';
	doc += '<div id="AUTOCOMPLETE_LIST" style="position: absolute; top: 1px; left: 1px; visibility: hidden;"></div>';
	document.getElementById("AUTOCOMPLETE_LAYER").innerHTML			= doc;
	if(document.layers){
		document.layers["AUTOCOMPLETE_LAYER"].visibility				= "hide";
	}
	else{
		document.getElementById("AUTOCOMPLETE_LAYER").style.visibility	= "hidden";
	}
}

//------------------------------------------------------------------------------------
//モデル名セット
//------------------------------------------------------------------------------------
function setLayerValue(kidx, iidx)
{
	var rel = document.getElementById("REL_CONTENTS");
	var num = rel.selectedIndex;
	if(rel.options[num].value != ""){
		document.getElementById(kidx).value = rel.options[num].text;
		document.getElementById(iidx).value = rel.options[num].value;
	}
	hiddenLayerSelBox();
}

//------------------------------------------------------------------------------------
//モデル検索
//------------------------------------------------------------------------------------
var gzXmlHttp	= 0;
var gzOldQuery	= "";

/* XmlHttpRequest */
function createXmlHttpRequest()
{
	var xmlhttp = false;
	if(window.XMLHttpRequest){
		xmlhttp = new XMLHttpRequest();
	}
	else if(window.ActiveXObject){
		try{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e){
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlhttp;
}

/* 型式問い合わせ実行 */
function searchModelExec(kidx, iidx)
{
	hiddenLayerSelBox();
	var TimerID01 = setInterval(
		function(){
			var ret = searchModel(kidx, iidx);
			if(ret){
				clearInterval(TimerID01);
			}
		},
		10);
}

/* 型式問い合わせ処理 */
function searchModel(kidx, iidx)
{
	if(!gzXmlHttp) gzXmlHttp = createXmlHttpRequest();
	
	if(!gzXmlHttp || gzXmlHttp.readyState == 1 || gzXmlHttp.readyState == 2 || gzXmlHttp.readyState == 3){
		return false; 
	}
	
	var kwbox = document.getElementById(kidx);
	var len = kwbox.value.length;
	var query = EscapeUTF8(kwbox.value);
	
	if(query == "" || len < 2){
		hiddenLayerSelBox();
	}
	else{
//	else if(gzOldQuery != query){
		gzXmlHttp.open("GET", "/js/query/searchModel.php?kw="+query, true);
		gzXmlHttp.onreadystatechange = function(){
			if(gzXmlHttp.readyState == 4 && gzXmlHttp.status == 200 && gzXmlHttp.responseText != ""){
				var resArray = gzXmlHttp.responseText.split("\n");
				var conts = new Array(resArray.length);
				for(var i = 0; i < resArray.length; i++){
					var setval = resArray[i].split("\t");
					conts[i] = new Array(2);
					conts[i][0] = setval[0];
					conts[i][1] = setval[1];
				}
				visibleLayerSelBox(kidx, iidx, conts);
				gzOldQuery = EscapeUTF8(kwbox.value);
			}
		}
		gzXmlHttp.send(null);
	}
	return true;
}

//------------------------------------------------------------------------------------
//車種選択ボックス操作
//------------------------------------------------------------------------------------
var gzLock02 = false;
function selCarExec(midx, cidx)
{
	if(!gzLock02){
		gzLock02 = true;
		TimerID02 = setInterval(
			function(){
				var ret = selCar(midx, cidx);
				if(ret){
					clearInterval(TimerID02);
					gzLock02 = false;
				}
			},
			10);
	}
}

function selCar(midx, cidx)
{
	if(!gzXmlHttp) gzXmlHttp = createXmlHttpRequest();
	
	if(!gzXmlHttp || gzXmlHttp.readyState == 1 || gzXmlHttp.readyState == 2 || gzXmlHttp.readyState == 3){
		return false; 
	}
	else{
		clearInterval(TimerID02);
	}
	
	var mbox = document.getElementById(midx);
	var cbox = document.getElementById(cidx);
	var query = EscapeUTF8(mbox.value);
	gzXmlHttp.open("GET", "/js/query/selCar.php?mid="+query, true);
	gzXmlHttp.onreadystatechange = function()
	{
		if(gzXmlHttp.readyState == 4 && gzXmlHttp.status == 200 && gzXmlHttp.responseText != ""){
			var resArray = gzXmlHttp.responseText.split("\n");
			cbox.disabled = false;
			cbox.options.length = resArray.length;
			for(var i = 0; i < resArray.length; i++){
				var setval = resArray[i].split("\t");
				cbox.options[i] = new Option(setval[1], setval[0]);
			}
			cbox.selectedIndex = 0;
			if(resArray.length == 1 && setval[0] == "0"){
				cbox.disabled = true;
			}
		}
	}
	gzXmlHttp.send(null);
	
	return true;
}

//------------------------------------------------------------------------------------
//関連ボックス初期化　※ページ毎に作り直す必要がある。
//------------------------------------------------------------------------------------
function initRelBox(mode)
{
	val_co2_keisu = 0;
	if(mode != 1){ // 燃費直接入力の初期化
		document.getElementById("InpFuelCostBox").value = "";
	}
	if(mode != 2){ // 車種選択の初期化
		document.getElementById("SelMakerBox").selectedIndex = 0;
		carbox = document.getElementById("SelCarBox");
		carbox.disabled = false;
		carbox.options.length = 0;
		carbox.options[0] = new Option("選択できません", "0");
		carbox.disabled = true;
	}
	if(mode != 3){ // 型式選択の初期化
		document.getElementById("PutModelBox").value = "";
		document.getElementById("InpModelBox").value = "";
		hiddenLayerSelBox();
		gzOldQuery = "";
	}
	document.getElementById("PutCarInfoBox").innerHTML = "";
	document.getElementById("PutCarInfoBox").style.visibility = "hidden";
}

//------------------------------------------------------------------------------------
//車種情報表示　※ページ毎に作り直す必要がある。
//------------------------------------------------------------------------------------
var gzLock03	= false;

/* 車種情報問い合わせ実行 */
function dispCarInfoExec(mode, idx)
{
	if(!gzLock03){
		gzLock03 = true;
		TimerID03 = setInterval(
			function(){
				var ret = dispCarInfo(mode, idx);
				if(ret){
					clearInterval(TimerID03);
					gzLock03 = false;
				}
			},
			10);
	}
}

/* 車種情報問い合わせ実行 */
function dispCarInfo(mode, idx)
{
	if(!gzXmlHttp) gzXmlHttp = createXmlHttpRequest();
	
	if(!gzXmlHttp || gzXmlHttp.readyState == 1 || gzXmlHttp.readyState == 2 || gzXmlHttp.readyState == 3){
		return false; 
	}
	else{
		clearInterval(TimerID03);
	}
	
	var fbox = document.getElementById("InpFuelCostBox");
	var pbox = document.getElementById("PutCarInfoBox");
	var qbox = document.getElementById(idx);
	var query = EscapeUTF8(qbox.value);
	if(query == ""){
		return true;
	}
	gzXmlHttp.open("GET", "/js/query/dispCarInfo.php?mode="+mode+"&car="+query, true);
	gzXmlHttp.onreadystatechange = function(){
		if(gzXmlHttp.readyState == 4 && gzXmlHttp.status == 200 && gzXmlHttp.responseText != ""){
			var resArray = gzXmlHttp.responseText.split("\n");
			if(resArray.length == 1){
				var setval = resArray[0].split("\t");
				var doc = '';
				if(setval[0] != 0){
					doc += '<table>';
					doc += '<tr>';
					doc += '<td>'+setval[0]+'　　'+setval[1]+'</td>';
					doc += '</tr>';
					doc += '<tr>';
					if(mode == 1){
						doc += '<td>&nbsp;</td>';
					}
					else{
						doc += '<td>'+setval[2]+'</td>';
					}
					doc += '</tr>';
					doc += '<tr>';
					doc += '<td><font color="#6998CC">燃費</font>　　'+setval[3]+'km/l<input type="hidden" name="keisu" value="'+setval[4]+'"></td>';
					doc += '</tr>';
					doc += '</table>';
					doc += '<table>';
					doc += '<tr>';
					doc += '<td><font color="#6998CC"><b>一口メモ</b></font><br>各メーカーが届け出ている公表値は理想的な条件におけるものであり、<br>実際の走行では一般的に60-80％前後の燃費となることが多いようです<br>（走行条件による）</td>';
					doc += '</tr>';
					doc += '</table>';
					fbox.value = setval[3];
				}
				document.getElementById("PutCarInfoBox").style.visibility = "visible";
				pbox.innerHTML = doc;
			}
		}
	}
	gzXmlHttp.send(null);
	return true;
}
