var AutoComplete = function(_options) {
	var before_filter = function() {
		if (!_options) {
//			alert("are you kidding me..?")
			return false;
		}

		if (!_options.inputbox || !_options.suggestions) {
//			alert('inputbox, get is required..!');
			return false;
		}
	}
	before_filter();

	var _inputbox_id	= is_string(_options.inputbox)? _options.inputbox : $(_options.inputbox.id);
	var _suggestions_id	= "suggestions";
	var _selectbox_wrapper_id = "autocomplete_wrapper";

	var inputbox	= $(_inputbox_id);
	var suggestions	= _options.suggestions;
	var callback	= _options.callback;
	var ignore_case	= _options.ignore_case || true;
	var min_chars	= parseInt(_options.min_chars) || 1;
	var row_size	= parseInt(_options.row_size) || 10;
	var tab_index	= 2;

	//tabindex set
	if (!inputbox.tabIndex) {
		inputbox.tabIndex = 1;
	}
	else {
		tab_index = parseInt(inputbox.tabIndex) + 1;
	}

	//make html (selectbox)
	var make_selectbox = function() {
		var pos		= $(_inputbox_id).cumulativeOffset(); // 0:width, 1:height
		var dimensions = $(_inputbox_id).getDimensions();
		pos["x"]	= pos[0] + 2;
		pos["y"]	= pos[1] + dimensions.height;
		var css		= {
			"width"		: dimensions.width + "px" ,
			"display"	: "none",
			"position"	: "absolute",
			"zIndex"	: "10",
			"margin"	: "0",
			"padding"	: "0",
			"left"		: pos["x"] + "px",
			"top"		: pos["y"] + "px"
		}

//		inputbox.parentNode.parentNode.parentNode.parentNode.parentNode
		var selectbox_wrapper = document.createElement("div");
		selectbox_wrapper.id = _selectbox_wrapper_id;
		$(selectbox_wrapper).setStyle(css);
		selectbox_wrapper.innerHTML += "<select id='" + _suggestions_id + "' size='" + row_size + "' tabindex='" + tab_index + "' style='width:" + dimensions.width + "px'></select>";
		document.body.appendChild(selectbox_wrapper);
	}

	//make suggestions (option tag <option>)
	var make_options = function(list) {
		if (!is_exists(_suggestions_id)) {
			make_selectbox();
		}

		$(_suggestions_id).innerHTML = "";
		for (var i=0; i<list.length; i++) {
			$(_suggestions_id).options[i] = new Option(list[i]["value"],list[i]["key"]);
		}
	}
	var suggestions_data = new Array();
	if (is_function(suggestions)) {
		suggestions_data = suggestions();
	}
	else {
		suggestions_data = suggestions;
	}

	//serach engine-_-;
	var find_suggestions = function(_event) {
		var keyword = $(_inputbox_id).value;
		if (keyword.length < min_chars) {
			return false;
		}
		// esc: reset
		if (_event.keyCode == 27) {
			$(_inputbox_id).value = "";
		}
		// arrow-down: move to select-box
		else if (_event.keyCode == 40) {
			var dom_suggestions = $(_suggestions_id);
//			Log(dom_suggestions);
			if (dom_suggestions) {
				$(_suggestions_id).focus();
				$(_suggestions_id).selectedIndex = 0;
			}
			return;
		}
		if (keyword == "") {
			make_options(suggestions);
			return false;
		}

		var reg_flags = (ignore_case) ? "mi" : "m";
		var reg = new RegExp("^" + keyword, reg_flags);

		var result_list = new Array();
		for (var i=0; i<suggestions_data.length; i++) {
			if (reg.test(suggestions_data[i]["value"])) {

				result_list.push({"key":suggestions_data[i]["key"], "value":suggestions_data[i]["value"]});
			}
		}

		if (result_list.length < 1) {
//			status_notification("검색결과가 없으면 링크를 만들 수 없습니다.")
		}
		else {
//			status_notification();
			make_options(result_list);
			$(_selectbox_wrapper_id).show();

			//bind event selectbox (result list)
			bind_event_selectbox();
		}
	}

	var suggestion_keydown = function(_event) {
		if (_event.keyCode == 13) {
			choose_suggestion();
		}
		else if (_event.keyCode == 38) {
			var index = $(_suggestions_id).selectedIndex;
			if (index == 0) {
				$(_inputbox_id).focus();
			}
		}
	}
	var choose_suggestion = function() {
		if ($(_suggestions_id).selectedIndex < 0) {
			return false;
		}
		var index = $(_suggestions_id).selectedIndex;
		var key = $(_suggestions_id).options[index].value;
		var value = $(_suggestions_id).options[index].text;
		$(_selectbox_wrapper_id).remove();
		callback(key, value);
	}

	//event bind (input, select)
	//code is jjub;;;
	// bind_event_input는 inputbox에 거는 이벤트고, bind_event_selectbox는 코드는 검색 후 selectbox에 거는 이벤트.
	var binded_event_selectbox = false;
	var find_suggestions_func = find_suggestions.bindAsEventListener(this);
	var callback_func = choose_suggestion.bindAsEventListener(this);
	var suggestion_keydown_func = suggestion_keydown.bindAsEventListener(this);

	var bind_event_input = function(when) {
		$(_inputbox_id).observe("keyup", find_suggestions_func);
	}
	var bind_event_selectbox = function() {
		$(_suggestions_id).observe("click", callback_func);
		$(_suggestions_id).observe("keydown", suggestion_keydown_func);
	}
	var unbind_event = function() {
		$(_inputbox_id).stopObserving("keyup", find_suggestions_func);
		$(_suggestions_id).stopObserving("click", callback_func);
		$(_suggestions_id).stopObserving("keydown", suggestion_keydown_func);
	}
	bind_event_input();
}
