var httpObj;
var timerId;
var timeout_sec = 10;
var suggest_list = new Array();
var itemId = -1;
var itemnumber = 0;
var keyword = "";

function fncReview() {
	if (isSpace(document.reviewform.keyword.value)) {
		alert('キーワードを指定してください。');
		document.reviewform.keyword.focus();
	} else {
		return true;
	}

	return false;
}

function highlightMenu(e) {
	if (itemId > -1 && itemId < itemnumber) {
		target_node = document.getElementById('c' + itemId);
		target_node.style.backgroundColor = '#ffffff';
		target_node.style.color = '#000000';
		itemId = -1;
	}

	var target_node = getTargetNode(e);
	
	target_node.style.backgroundColor = '#0000ff';
	target_node.style.color = '#ffffff';
	itemId = parseInt(target_node.id.substr(1));
}

function lowlightMenu(e) {
	var target_node = getTargetNode(e);

	target_node.style.backgroundColor = '#ffffff';
	target_node.style.color = '#000000';
}

function callMenu(e) {
	eliminateDropdownList();

	var target_node = getTargetNode(e);
	var target_node_id = target_node.id;
	
	document.getElementById('suggest').blur();
	document.getElementById('suggest').value = suggest_list[target_node_id];
	document.getElementById('suggest').focus();
	keyword = suggest_list[target_node_id];
}

function eliminateDropdownList() {
	if (document.getElementById('dropframe')) {
		var dropframe = document.getElementById('dropframe');
		dropframe.parentNode.removeChild(dropframe);
	}
	itemId = -1;
	itemnumber = 0;
}

function getTargetNode(e) {
	var target_node;
	
	if (e.target) {
		target_node = e.target;
	} else {
		target_node = e.srcElement;
	}
	
	if (target_node.nodeType == 3) {
		target_node = target_node.parentNode;
	}
	
	return target_node;
}

function getElemPos(elem) {
	var obj = new Object();
	obj.x = elem.offsetLeft;
	obj.y = elem.offsetTop;
	while (elem.offsetParent) {
		elem = elem.offsetParent;
		obj.x += elem.offsetLeft;
		obj.y += elem.offsetTop;
	}
	
	return obj;
}

function generateDropdownList(text_data) {
	var lines = text_data.split("\n");
	var dropframe = document.createElement('div');
	dropframe.id = 'dropframe';

	for (i = 0; i < lines.length; i++) {
		if (lines[i] == '') break;
		var id_value = 'c' + i;
		
		suggest_list[id_value] = lines[i];
		
		var child_div = document.createElement('div');
		
		child_div.id = id_value;
		child_div.style.padding = '1px 3px';
		
		var caption = document.createTextNode(suggest_list[id_value]);
		
		child_div.appendChild(caption);
		
		dropframe.appendChild(child_div);

		addListener(child_div, 'mouseover', highlightMenu, false);
		addListener(child_div, 'mouseout', lowlightMenu, false);
		addListener(child_div, 'mousedown', callMenu, false);
	}
	itemnumber = i;
	
	if (itemnumber > 0) {
		var suggest_elem = document.getElementById('suggest');
		var post_obj = getElemPos(suggest_elem);
		post_obj.y += document.getElementById('suggest').offsetHeight - 1;
		dropframe.style.left = post_obj.x + 'px';
		dropframe.style.top = post_obj.y + 'px';
		document.body.appendChild(dropframe);
	}
}

function submitKeydown(e) {
	var key_code = e.keyCode;
	var target_node;

	if (key_code == 13 && itemId > -1 && itemId < itemnumber) {
		target_node = document.getElementById('c' + itemId);
		var target_node_id = target_node.id;
		document.getElementById('suggest').value = suggest_list[target_node_id];
		keyword = suggest_list[target_node_id];
		eliminateDropdownList();
	}
}

function printItemList(e) {
	var key_code = e.keyCode;
	var target_node;

	if ((key_code == 38 && itemId > 0) || (key_code == 40 && itemId < itemnumber - 1)) {
		if (itemId > -1 && itemId < itemnumber) {
			target_node = document.getElementById('c' + itemId);
			target_node.style.backgroundColor = '#ffffff';
			target_node.style.color = '#000000';
		}

		if (key_code == 38) itemId--; else itemId++;
		target_node = document.getElementById('c' + itemId);
		target_node.style.backgroundColor = '#0000ff';
		target_node.style.color = '#ffffff';
	} else if ((key_code == 38 || key_code == 40) && itemnumber > 0) {
		eliminateDropdownList();
	} else {
		eliminateDropdownList();
	
		var in_code = document.getElementById('suggest').value;
		var target_url;

		if (in_code.length > 0 && in_code != keyword) {
			target_url = 'suggest.php?keyword=' + encodeURIComponent(in_code);
			httpRequest(target_url, generateDropdownList);
		}
	}
}

function httpRequest(target_url, functionReference) {
	try {
		if (window.XMLHttpRequest) {
			httpObj = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			httpObj = new ActiveXObject("Microsoft.XMLHTTP");
		} else {
			httpObj = false;
		}
	} catch (e) {
		httpObj = false;
		
	}
	if (!httpObj) {
		httpObjGenerateFail();
	}
	
	timerId = setInterval('timeoutCheck()', 1000);

	httpObj.open("GET", target_url, true);
	httpObj.onreadystatechange = function() {
		if (httpObj.readyState == 4) {
			clearInterval(timerId);
			if (httpObj.status == 200) {
				functionReference(httpObj.responseText);
			} else {
				return false;
			}
		}
	}
	
	httpObj.send('');
}

function httpObjGenerateFail() {
	return false;
}

function timeoutCheck() {
	timeout_sec--;
	if (timeout_sec <= 0) {
		clearInterval(timerId);
		httpObj.abort();
		return false;
	}
}

function setListeners(e) {
	var suggest = document.getElementById('suggest');
	addListener(suggest, 'keyup', printItemList, false);
	addListener(suggest, 'keydown', submitKeydown, false);
}

function addListener(elem, eventType, func, cap) {
	if (elem.addEventListener) {
		elem.addEventListener(eventType, func, cap);
	} else if (elem.attachEvent) {
		elem.attachEvent('on' + eventType, func);
	} else {
		return false;
	}
}

addListener(window, 'load', setListeners, false);
