/**
 * @class	W_AjaxSearchAutoComplete
 * @author	Marco Troost
 */
var W_AjaxSearchAutoComplete = new Class({
	
	/**
	 * initialize
	 * @param	string	handler_id
	 * @param	string	listener_id
	 * @param	string	http_url
	 * @param	unknown	handler_value
	 * @param	string	event_type
	 * @return	void
	 */
	initialize: function(handler_id, listener_id, http_url, handler_value, event_type)
	{
		// nodes
		this.handler_node	= $(handler_id);
		this.listener_node	= $(listener_id);
		
		// id
		this.listener_id 	= listener_id;
		
		// strings
		this.http_url		= http_url;
		this.handler_value	= !handler_value ? null : handler_value;
		
		// settings
		this.event_type	= !event_type ? 'keyup' : event_type;
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{	
		if (this.handler_node && this.listener_node)
		{
			// set events
			this.setEvents();
			
			// get data when default value exists
			if (this.handler_value)
			{
				this.handler_node.set('value', this.handler_value);
				
				this.getData(this.handler_value);
			}
		}
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		// set vars
		var _this = this;
		
		if (this.handler_node)
		{
			this.handler_node.removeEvents();
			this.handler_node.addEvent(this.event_type, function(event)
			{
				 if (event.key == "backspace" || event.key == "delete")
				 {					 
					var city_node	= $('search_field_city');
					var submit_node	= $('search_submit');
					if (city_node && submit_node)
					{
						var city_node_value = city_node.get('value');
						if (city_node_value.length == 0)
						{
							_this.disableSubmit();	
						}
					}						 
				 }
				 
				 if (!(event.key == "down" || event.key == "up" || event.key == "enter")) 
				 {	
					// get data
					_this.getData(this.value);	
					
					_this.enableSubmit();
					
					return false;
				 }					 
				 else if (event.key == "down")
				 {						 
					// handle
					if (_this.listener_node && _this.listener_node.getStyle('display') == 'block')
					{
						_this.listener_node.focus();
						_this.handleKey();
						
						var first_option = 	_this.listener_node.getElement('option')
						first_option.set('selected', 'selected');
					}
				 }
			});
			
			// disable enter key if another event is initialised
			if (this.event_type != 'keydown')
			{
				this.handler_node.addEvent('keydown', function(event)
				{
					if (event.key == 'enter') return false;
				});
			}
		}
	},
	
	/**
	 * get data
	 * @param	unknown	handler_value
	 * @return	void
	 */
	getData: function(handler_value)
	{
		var _this = this;
		
		// make request
		var http_request = new Request.HTML({
			url			: this.http_url,
			update		: this.listener_node,
			onRequest	: function()
			{
				
			},
			onComplete	: function()
			{
				// set complete events
				_this.setCompleteEvents();
			}
		});
		
		// get country_id
		var selectbox_node	= $('search_field_country');
		var country_id 		= selectbox_node.options[selectbox_node.selectedIndex].value;		
		
		http_request.get({'handler_value' : handler_value, 'country_id' : country_id});
		
		_this.listener_node.addEvent('click', function()
		{
	    	var selected_option = this.getSelected();
	    	_this.setSearchbox(selected_option.get('value'));
		});					
	},

	/**
	 * set complete events
	 * @return	void
	 */
	setCompleteEvents: function()
	{
		var _this				= this;
		
		// Make search result visible
		this.listener_node.setStyle('display', 'block');

		// get div's with loop
		var div_nodes		= this.listener_node.getElements('div');
		var total_div_nodes	= div_nodes.length;
		if (total_div_nodes)
		{
			div_nodes.each(function(div_node, index)
			{
				div_node.removeEvents();
				div_node.addEvents(
				{
					'click' : function()
					{					
						// get value from div
						var div_value 			= this.get('text');

						_this.setSearchbox(div_value);						
					}
				});
			});
		}			
	},
	
	/**
	 * set searchbox
	 * @return	void
	 */
	setSearchbox: function(div_value)
	{
		var _this				= this;
		
		this.handler_node.set('value', div_value);
		this.listener_node.setStyle('display', 'none');
		this.handler_node.focus();
	},
	
	/**
	 * handle key
	 * @return	void
	 */
	handleKey: function()
	{
		var _this				= this;
		
		this.listener_node.addEvent('keydown', function(event)
		{		
		    if (event.key == "enter") 
		    {
		    	var selected_option = this.getSelected();
		    	_this.setSearchbox(selected_option.get('value'));

		    	return false;
		    }
		    else if (event.key == "up") 
		    {
		    	// set focus on inputbox 
		    	var selected_option = this.getSelected();
		    	var selected_id = selected_option.get('id');
		    	if (selected_id == 'city_1')
		    	{
		    		_this.handler_node.focus();
		    		_this.listener_node.setStyle('display', 'none');
		    	}
		    }		    
		});
	},

	/**
	 * disable search field
	 * @return	void
	 */
	disableSubmit: function()
	{
		var submit_node	= $('search_submit');
		
		if (submit_node)
		{
			submit_node.disabled		= true;
			submit_node.selectedIndex	= 0;
			submit_node.set('class', 'disabled');
		}
	},
	
	/**
	 * disable search field
	 * @return	void
	 */
	enableSubmit: function()
	{
		var city_node	= $('search_field_city');
		var submit_node	= $('search_submit');
		if (city_node && submit_node)
		{
			var city_node_value = city_node.get('value');
			if (city_node_value != '')
			{
				var submit_node	= $('search_submit');
				if (submit_node)
				{
					submit_node.disabled	= false;
					submit_node.set('class', '');														
				}
			}
		}
	}
});
