/** 
 * @file jquery.ds.search.autocomplete.js
 * @ver 0.1
 *
 * Copyright (c) 2010 Dániel Sólyom (DS)
 *
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * 2010-07-19
 */


(function($) {
	var searchAutocompleteTimeout;

	$.fn.searchAutocomplete = function(settings)
	{
		me = $(this);

		var settings = me.SACSettings = $.extend({}, $.fn.searchAutocomplete.defaults, settings);

		me.SACLast = '';

		me.before($('<div></div>').attr('id', me.attr('id') + 'SACMainContainer')
								  .css('overflow', 'visible')
								  .css('position', 'relative')
		);

		var act = function() {
				/* normal key (well, mostly) */
			clearTimeout(searchAutocompleteTimeout);
			searchAutocompleteTimeout = setTimeout(me.actOnKeypressSearchAutocomplete, settings.delay); 
		}

		me.keydown(act)
		  .keypress(act)
		  .keyup(act);

		$(document).click(function() {
			$('#' + me.attr('id') + 'SACResultContainer').hide();
		});
	}
	
	$.fn.actOnKeypressSearchAutocomplete = function()
	{
		var current = me.attr('value');

		if (me.SACLast == current) {
			$('#' + me.attr('id') + 'SACResultContainer').show();
			return;
		}
		me.SACLast = current;

		if (current.length < me.SACSettings.minLength) {
			me.removeSACResultContainer();
			return;
		}
		$.ajax({ url: me.SACSettings.url, 
				 cache: false, 
				 context: me,
				 data: { 'SACdata' : current },
				 success: function() {
					var container;

					sR = (result = arguments[0].split('\n')).length;
					me.removeSACResultContainer();
					if (!sR || (sR == 1 && result[0] == '')) {
						return;
					}
					container = $('<div></div>').attr('id', me.attr('id') + 'SACResultContainer')
												.attr('class', 'SAC-result-container')
												.css('position', 'absolute')
												.css('top', me.height())
												.css('left', 0)
												.show();
					container.append(cUl = $('<ul></ul>'));

					for(var i = 0; i < sR; ++i) {
						if (!result[i]) {
							continue;
						}
						res = result[i].split('|');
						cUl.append($('<li><a href="' + res[1] + '">' + res[0] + '</a></li>'));
					}

					$('#' + me.attr('id') + 'SACMainContainer').append(container);
				 }
		});
                     
	}
	
	$.fn.removeSACResultContainer = function()
	{
		$('#' + me.attr('id') + 'SACResultContainer').remove();
		return true
	}
	
	$.fn.searchAutocomplete.defaults = {
		delay : 150,
		minLength : 3
    }
})(jQuery)

