// This script uses prototype.js functions!

var Suggester = 
{
	suggest_url : "",
	element_input : "",
	element_results : "",
	
	onclicked_url : "",
	element_onclicked : "",
	
	element_value : "",
	
	_hide : function(elt)
	{
		if (elt) elt.style.display = 'none';
	},
	
	_show : function(elt)
	{
		if (elt) elt.style.display = 'block';
	},
	
	_is_hidden : function(elt)
	{
		return elt.style.display == 'none';
	},
	
	_handleup : function(elt)
	{
		if (this._is_hidden(elt)) 
		{
			this._show(elt);
			return;
		}
	},
	
	_handledown : function(elt)
	{
		if (this._is_hidden(elt)) 
		{
			this._show(elt);
			return;
		}
	},
	
	_getkeycode : function(e)
	{
		if (document.layers)
			return e.which;
		else if (document.all)
			return event.keyCode;
		else if (document.getElementById)
			return e.keyCode;
		return 0;
	},
	
	_onkeydown : function(e)
	{
		switch(this._getkeycode(e)) 
		{
			case 27: // escape
				this._hide($(this.element_results));
				return false;
			case 38: // up arrow
				this._handleup($(this.element_results));
				return false;
			case 40: // down arrow
				this._handledown($(this.element_results));
				return false;
			default:
				setTimeout(this._ontimeout.bind(this), 1000);
		}
		return true;
	},
	
	_empty_results : function(elt)
	{
		if (!elt) return;
	
		elt.innerHTML = '';
		elt.numResults = 0;
		elt.selectedIndex = 0;
		elt.results = [];
		this._hide(elt);
	},
	
	_mouseover : function(id)
	{
		var divs = $(this.element_results).childNodes;
		for(var i = 0; i < divs.length; i++)
		{
			divs[i].style.backgroundColor = "#FFFFFF";
		}
		$(id).style.backgroundColor = "#FFFFA0";
	},
	
	_mouseout : function(id)
	{
		$(id).style.backgroundColor = "#FFFFFF";
	},
	
	_mouseclick : function(id)
	{
		var val = $(id).innerHTML;
		val = val.replace("&amp;", "&");
		$(this.element_input).value = val;
		$(this.element_input).focus();
		if(this.element_onclicked != "")
		{
			new Ajax.Request(this.onclicked_url, 
								{ 
									method: "get",
									parameters: "suggest=" + encodeURI($(id).innerHTML),
									onComplete: this._complete2.bind(this) 
								} );
		}
	},
	
	_ontimeout : function()
	{
		if(this.element_value != $(this.element_input).value)
		{
			if(this.element_onclicked != "")
				$(this.element_onclicked).innerHTML = "";
				
			this.element_value = $(this.element_input).value;
			if(this.element_value.length > 2)
			{
				new Ajax.Request(this.suggest_url, 
									{	method: "get", 
										parameters : "suggest=" + encodeURI(this.element_value),
										onComplete: this._complete.bind(this) 
									} );
			}
			else
			{
				$(this.element_results).innerHTML = "";
				this._hide($(this.element_results));
			}
		}
	},
	
	_complete : function(req)
	{
		var suggest_str = "suggest_result";
		var suggest_arr = req.responseText.split(";");
		if(suggest_arr[0] == suggest_str && suggest_arr[1] == this.element_value)
		{
			var innerH = req.responseText.slice(suggest_str.length + this.element_value.length + 2);
			$(this.element_results).innerHTML = innerH;
			if(innerH.length > 0)
				this._show($(this.element_results));
			else
				this._hide($(this.element_results));
		}
	},
	
	_complete2 : function(req)
	{
		var suggest_str = "suggest_result";
		var suggest_arr = req.responseText.split(";");
		if(suggest_arr[0] == suggest_str)
		{
			$(this.element_onclicked).innerHTML = req.responseText.slice(suggest_str.length + 1);
			this._show($(this.element_onclicked));
		}
	}
}

Suggester.Start = Class.create();
Suggester.Start.prototype = Suggester.extend
(
	{
		initialize : function(url, input, results, url2, onclicked)
		{
			this.suggest_url = url;
			this.element_input = input;
			this.element_results = results;
			
			this.onclicked_url = url2;
			this.element_onclicked = onclicked;
			
			$(this.element_input).onkeydown = this._onkeydown.bind(this);
		}
	}
);
