// Copyright SportsDelta 2009 All Rights Reserved
(function ($) {
	
    $.fn.autocompleter = function (options) {

		var defaults = {
			single_select: false,
			autocompleter_class: 'autocompleter',
			json_url: '',
			hidden_field_name: '',
			initial_load: false
		};
		
		var options = $.extend(defaults, options);

		function loadSuggestions(autocompleterElement, autocompleterChoices, element)
		{
			var id = element.attr('id');
			
			var autocompleterElement = $('#' + id + '_autocompleter');
			var autocompleterChoices = $('#' + id + '_choices');
			
			var query_text = jQuery.trim(element.val());

			$.getJSON(options.json_url + "/" + query_text,
		    function(data)
		    {
				autocompleterElement.html('');
		    	if(data.length > 0)
		    	{
		    		autocompleterElement.append('<ul>');
		    		for( var i=0, l = data.length; i < l; i++)
		    		{
		    			var item = data[i];
		    			var sport_name = item[1];
		    			if(sport_name.toLowerCase().indexOf(element.val().toLowerCase()) != -1)
		    			{
		    				if(autocompleterChoices.find("ul li input[value='" + item[0] + "']").length == 0)
		    				{
		    					addAutocompleterItem(autocompleterElement, autocompleterChoices, element, item[0], sport_name);
		    				}
		    			}
		    		};
		    		
		    		autocompleterElement.show();
		    	}
		    	else
		    	{
		    		autocompleterElement.hide();
		    	}
		    });
		}
		
		function addAutocompleterItem(autocompleterElement, autocompleterChoices, element, itemId, itemName)
		{
			var itemList = autocompleterElement.find('ul');
			
			if(options.single_select == false)
			{
				itemList.append('<li><a href="#" id="item_' + itemId + '"><span class="item_add">&lt;&lt;Add</span> <span class="item_name">' + itemName + '</span></a></li>');
			
				itemList.find("#item_" + itemId).bind('click', function(event)
				{
	    			addToChoices(autocompleterElement, autocompleterChoices, element, $(this));
	    			return false;
				});
			}
			else
			{
				itemList.append('<li><a href="#" id="item_' + itemId + '"><span class="item_add"></span> <span class="item_name">' + itemName + '</span></a></li>');
			
				itemList.find("#item_" + itemId).bind('click', function(event)
				{
	    			selectChoice(autocompleterElement, autocompleterChoices, element, $(this));
	    			return false;
				});
			}
		}
		
		function selectChoice(autocompleterElement, autocompleterChoices, element, item)
		{
			var itemId = item.attr('id');
			var itemValueId = itemId.replace(/item_/, '');
			var itemName = item.find('.item_name').text();
			
			$("input[name='" + options.hidden_field_name + "']").val(itemValueId);
			
			$('span.item_remove').each(function()
			{
				$(this).addClass('item_add');
				$(this).removeClass('item_remove');
				
				$(this).text('');
			});
			
			item.html('<a href="#" id="item_' + itemId + '"><span class="item_remove"></span> <span class="item_name">' + itemName + '</span></a>');
		
			element.trigger('item_selected');
		}
		
		function addToChoices(autocompleterElement, autocompleterChoices, element, item)
		{
			var itemId = item.attr('id');
			var itemValueId = itemId.replace(/item_/, '');
			var itemName = item.find('.item_name').text();
			item.remove();
			
			addChoiceItem(autocompleterElement, autocompleterChoices, element, itemValueId, itemName);
			
			autocompleterChoices.find('ul li a').bind('click', function(event)
			{
    			removeFromChoices(autocompleterElement, autocompleterChoices, element, $(this));
    			return false;
			});
		}
		
		function addChoiceItem(autocompleterElement, autocompleterChoices, element, itemId, itemName)
		{
			var itemList = autocompleterChoices.find('ul');
			itemId = itemId.toString();
			var itemValueId = itemId.replace(/item_/, '');
			itemList.prepend('<input name="' + options.hidden_field_name + '" type="hidden" value="' + itemValueId + '" /><a href="#" id="item_' + itemId + '"><span class="item_remove">&lt;&lt;Remove</span> <span class="item_name">' + itemName + '</span></a>');
			
			itemList.find("#item_" + itemValueId).bind('click', function(event)
			{
    			removeFromChoices(autocompleterElement, autocompleterChoices, element, $(this));
    			return false;
			});
		}
		
		function removeFromChoices(autocompleterElement, autocompleterChoices, element, item)
		{
			var itemId = item.attr('id');
			var itemValueId = itemId.replace(/item_/, '');
			var itemName = item.find('.item_name').text();
			item.parent().remove();
			
			if(itemName.toLowerCase().indexOf(element.val().toLowerCase()) != -1)
			{
				addAutocompleterItem(autocompleterElement, autocompleterChoices, element, itemValueId, itemName);
			}
		}
	
		return this.each(function(){
		
			var element = $(this);
			var id = element.attr('id');
			element.attr('autocomplete', 'off');
			
			if(options.single_select == false)
			{
				element.after('<div class="' + options.autocompleter_class + '_buffer"></div><div id="' + id + '_choices" class="' + options.autocompleter_class + '_choices"></div>');
			}
			element.after('<div id="' + id + '_autocompleter" class="' + options.autocompleter_class + '_autocompleter"></div>')
			
			element.bind('keyup', function(event)
			{
				loadSuggestions(autocompleterElement, autocompleterChoices, element);
			});
			
			var autocompleterElement = $('#' + id + '_autocompleter');
			autocompleterElement.hide();
			var autocompleterChoices = $('#' + id + '_choices');
			
			if(options.single_select == false)
			{
				autocompleterChoices.append('<ul>');
				
				choices_ids = '';
				$("input[name='" + options.hidden_field_name + "']").each(function()
				{
					choices_ids += $(this).val() + ',';
				});
				if(choices_ids.length > 0)
				{
					$.getJSON(options.json_url + "?choices=" + choices_ids,
				    function(data)
				    {
						$("input[name='" + options.hidden_field_name + "']").remove();
						if(data.length > 0)
				    	{
				    		for( var i=0, l = data.length; i < l; i++)
				    		{
				    			var item = data[i];
			    				addChoiceItem(autocompleterElement, autocompleterChoices, element, item[0], item[1]);
				    		};
				    	}
						else
						{
							//autocompleterElement.hide();
						}
				    });
				}
			}
			
			if(options.initial_load == true)
			{
				loadSuggestions(autocompleterElement, autocompleterChoices, element);
			}
		});
	};
})(jQuery);
