/**
 * apply経由でスコープを保持して関数を呼び出す
 */
function  b(obj, func){
    return function(){
//		return func.apply(obj, arguments);
		try {
			return func.apply(obj, arguments);
		}
		catch(e){
			//log(obj.name + "::" +e);
			return null;
		}
    };
}

function log(str){
	return;
	$("#debug").prepend("<span>" + str + "</span><br>\n");
}

function AutoComplete(){
	this.id = "";
	this.textbox = null;
	this.initialzie.apply(this,arguments);
}

AutoComplete.prototype = {
	id : "",
	prev : "",
	timeout : null,
	$textbox : null,
	delay : 200,
	$suggests : null,
	
	initialzie : function(id){
		this.id = id;
		var $textbox = $("#" + id);
		this.$textbox = $textbox;
		$textbox.bind("keyup",b(this,this.onTextChange));
		$textbox.bind("blur",b(this,this.hideResults));
		var div = document.createElement("div");
		div.setAttribute("class","ac_results");
		div.id = "suggests";
		$suggests = $(div);
		$suggests.hide();
		$suggests.css("position","absolute");
		$("body").append($suggests);
		this.$suggests = $suggests;
	},
	
	//テキストボックス上でユーザがなにかするたびに実行
	onTextChange : function(event){
		keyCode = event.keyCode;
		var v = this.$textbox.val();
		v = v.replace(/^[ 　]/,"").replace(/[ 　]$/,"");
		len = v.split(/[ 　]/).length;
		if(len >= 2){	//2ワード以上で補完
			log("getresult::" + v)
			this.getResult(v);
		}
	},
	
	hideResults : function(){
		this.$suggests.html("")
		this.$suggests.hide();
	},

	showResults: function(){
		var textbox = this.$textbox.get(0);
		var pos = this.findPos(textbox);
		var width = this.$textbox.width();
		log("width=" + width);
		$suggests.css({
			width: parseInt(width) + "px",
			top: (pos.y + textbox.offsetHeight) + "px",
			left: pos.x + "px"
		});
		$suggests.show();
	},
		
	//テキストボックスのデータを基に補完クエリを取得する
	getResult : function(text){
		req = new Request();
		req.get(text,b(this,this.receiveResult));
//		log(text);
//		r = Test.get(text);
//		if(r){
//			log("GET");
//			this.receiveResult(r);
//		}
	},
	
	receiveResult : function(results){
		log("Receive");
		this.renderResult(results);
	},
	

	
	format : '<ul>#s</ul>',
	
	renderResult : function(results){
		if(!results && results.length == 0) return;
		this.hideResults();
		$suggest = this.$suggest;
		var ul = document.createElement("ul");
		for(var i = 0, n = results.length; i < n; i++){
			var li = document.createElement("li");
			li.innerHTML = results[i];
			ul.appendChild(li);
			$(li).hover(
				function() {	//mouseenter
					$("li",ul).removeClass("ac_over");
					$(this).addClass("ac_over");
//					active = $("li",ul).indexOf($(this).get(0));
				},
				function(){	//mouseout
					$(this).removeClass("ac_over");
				}
			);
		}
		this.$suggests.append(ul);
		this.bindEvent();
		this.showResults();
	},
	
	bindEvent : function(){
		$("ul span").hover(
			function(){
				$("ul span").removeClass("term_over");
				$(this).addClass("term_over");		
			},
			function(){
				$(this).removeClass("term_over");
			}
		);
		log("bind");
		$("ul span").bind("mousedown",b(this,this.clickTerm));
	},
	
	clickTerm : function(event){
		var element = event.target;
		term = element.textContent;
		var li = element.parentNode;
		var text = li.textContent;
		var phrase = text.replace(term,'"' + term + '"');
		this.$textbox.val(phrase);
	},
	
	findPos : function(obj) {
		var curleft = obj.offsetLeft || 0;
		var curtop = obj.offsetTop || 0;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
		return {x:curleft,y:curtop};
	},
	
	
}

$(document).ready(function(){
	comp = new AutoComplete("query");
})
