var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}
Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

var AjaxHints = Class.create();
AjaxHints.prototype = {
	initialize: function(inputElement) {
		this.call_timer=null;
		this.selector_in="input[@id='"+inputElement.id+"']";
		this.selector_out="div[@id='"+inputElement.id+"_results']";
		this.selector_wait="div[@id='"+inputElement.id+"_wait']";
		this.selector_result=this.selector_out+" ul > li > a";
		inputElement.onkeyup=this.handle_key.bind(this);
	},
	handle_key: function(e) {
		if($(this.selector_out).css("display") != "none") {
			x=$(this.selector_result).get();
			switch(e.keycode) {
				case 37:	// links
				case 38:	// oben
				case 39:	// rechts
				case 40:	// runter
			}
		}
		if(this.call_timer) {
			clearTimeout(this.call_timer);
			this.call_timer=null;
		}
		this.call_timer=window.setTimeout(this.do_search.bind(this),1000);
	},
	handle_result_click: function(self,text) {
		$(self.selector_in).attr("value",text);
		$(self.selector_out).hide();
		window.setTimeout(function(){$(self.selector_in).get(0).form.submit();}.bind(this),100);
	},
	handle_result: function() {
		var results=0;
		$(this.selector_result).each(function() {
			results++;
			this.onclick=arguments[0].handle_result_click.bind(this,arguments[0],this.innerHTML);
		},[this]);
		$(this.selector_wait).hide();
		if(results > 0) $(this.selector_out).show();
	},
	do_search: function() {
		_in=$(this.selector_in);
		_out_results=$(this.selector_out);
		_out_wait=$(this.selector_wait);
		if(_in[0].value.length > 2) {
			_out_wait.show();
			_out_results.hide();
			_out_results.load( "/ajax.php",
							   {search:_in[0].value},
							   this.handle_result.bind(this)
							 );
		}
		// TODO: Überschreiben des globalen onclick-Handlers ok ?
		document.onclick=function(e){_out_results.hide()};
	}
}