// JavaScript Document

this._autoSuggestItems = '';

(function($) {
    $.fn.extend({
        autosuggest: function(options) {
			
			var defaults = {
    			  url: '',
				  action: 'requestItems',
				  maxItems: 8,
				  evenClass: 'even',
				  oddClass: 'odd'
			};

			
			var options = $.extend(defaults, options);
			
			return this.each(function() { 
				var obj = $(this);
				var op = options;
				var objOffset = obj.offset();
				var leftPos = objOffset.left;
				var topPos  = ((objOffset.top) + (obj.height()) + 4);
				
				
				var suggestBox  = '<div class="autoSuggestBox">';
					suggestBox += '</div>';
				
				
				var formElement = obj.parents('form').attr('id');
				$('#' + formElement).keydown(function(e){
					if (e.keyCode == 13) {
						return false;	
					}
				});
				
				
				$('body').append(suggestBox);
				$('.autoSuggestBox').css({'display': 'none', 'position': 'absolute', 'left': leftPos + 'px', 'top': topPos + 'px', 'z-index': '1000'});
				
				
				obj.keyup(function(e){
					if (e.keyCode != 13 && e.keyCode != 38) {
						if (e.keyCode == 40 && $('.autoSuggestBox').children('ul').length > 0) {
							return false;			   	
						} else {
							obj.requestItems(obj, op.url, op.action, op.maxItems, obj.val(), op.oddClass, op.evenClass);				   
						}
					} else {
						obj.navigate(obj, e.keyCode);
					}
				});
				
				obj.keydown(function(e){
					
					if (e.keyCode == 38 || e.keyCode == 40) {
						obj.navigate(obj, e.keyCode);
					}
				});
				
				$('.autoSuggestBox').click(function(e){
					obj.setValue(obj, e.target);																						 
				});
			})
        }
    });
	
	$.fn.requestItems = function(target, url, action, maxItems, string, oddClass, evenClass)
	{
		$.post(url, {
			action: action,
			string: string
	    }, function(data){
			_autoSuggestItems = data;
			var DataResult = data.replace(/^\s+|\s+$/g,"");
			if (DataResult != 'false') {
				$('.autoSuggestBox').html('');
				var itemsList = '<ul>';
				var itemsArray = data.split('#@#');
				
				for (var i = 0; i < itemsArray.length; i++)
				{
					if (i < maxItems) {
						itemsList += '<li>' + itemsArray[i];
						itemsList += '<input type="hidden" value="' + itemsArray[i] + '" />';
						itemsList += '</li>';
					}
				}
				
				itemsList += '</ul>';
				$('.autoSuggestBox').append(itemsList);
				
				$('.autoSuggestBox ul li:odd').addClass(oddClass);
				$('.autoSuggestBox ul li:even').addClass(evenClass);				
				
				$('.autoSuggestBox').slideDown(500);
				
				$('.autoSuggestBox').children('ul').children('li').hover(function(){
					$(this).siblings('li.active').removeClass('active');																			   																		   
					$(this).addClass('active');																			   
				});
				
				$('.autoSuggestBox').children('ul').children('li').mouseleave(function(){
					$(this).removeClass('active');																			   
				});
			} else { 
				$('.autoSuggestBox').slideUp(500);
			}
		});
	}
	
	$.fn.navigate = function(target, key)
	{
		var searchList = $('.autoSuggestBox').children('ul');
		var activeItem = searchList.find('li.active');
		
		switch (key)
		{
			case 40:
				if (activeItem.length > 0) {
					activeItem.removeClass('active');
					activeItem.next().addClass('active');	
				} else {
					searchList.children('li:first').addClass('active');	
				}
				break;
			case 38:
				if (activeItem.length > 0) {
					activeItem.removeClass('active');
					activeItem.prev().addClass('active');	
				} else {
					searchList.children('li:last').addClass('active');	
				}
				break;
			default:
				if (activeItem.length > 0) {
					target.val(activeItem.children('input').val().replace(/^\s+|\s+$/g,""));
					$('.autoSuggestBox').children('ul').remove();
					$('.autoSuggestBox').slideUp(500);
				}
		}
	}
	
	$.fn.setValue = function(target, clickedTarget)
	{
		target.val($(clickedTarget).children('input').val().replace(/^\s+|\s+$/g,""));
		$('.autoSuggestBox').slideUp(500);	
	}
	
})(jQuery);


