/*
 * autoCompleter
 * Examples and documentation at: http://
 * Version: 1.0.0 (26/04/2011)
 * Copyright © 2011 
 * Licensed under the MIT License: http://en.wikipedia.org/wiki/MIT_License
 * Requires: jQuery v1.4.4+
*/
;(function($) {

	$.fn.autoCompleter = function( options ){
		
		var _this = $(this);
		var defaults = {	
			'reqSearch':'templates/gethint.asp',
			'input':$( "#search_qu", _this ).attr("autocomplete","off")
		};
		
		var options = $.extend( {}, defaults, options );
		
		options.content = $('<div id="searchAssist"/>').css({
			'top':_this.offset().top + _this.height() - 1,
			'left':_this.offset().left,
			'width':_this.width() - 2
		}).append($('<p class="searchAssistline"/>').css({
			'width':_this.width() - 4
		})).hide();
		
		$('body').append( options.content );
		
		var self = this;

		options.input.blur(function(){
			options.content.fadeOut();
		}).keypress(function(e){
			switch ( e.keyCode ) {
				case 13:// Enter
					e.preventDefault();
					
					if( options.content.is(':visible') )
					{
						var lis = $("li", options.content);
						var breaks = 0;
						lis.each(function(i,o){
							if( $(o).is('.selected') )
							{
								$(o).trigger("click");
								return false;
							}
							else
							{
								breaks++;
							}
						})
						if( breaks == lis.length )
						{
							_this.submit();
						}
					}
					
					//return false;
					break;
				case 38:// Up
					e.preventDefault();
					
					shiftUpDown( 1 );
					
					return false;
					break;
				case 40:// Down
					e.preventDefault();
					
					shiftUpDown( 0 );
					
					return false;
					break;
				case 27: case 9:// Esc Tab
					options.content.fadeOut();
				break;
				default:
				return;
			}
		}).keyup(function(e){
			switch (e.keyCode) {
			case 38: //KEY_UP:
			case 40: //KEY_DOWN:
			case 27: case 9:// Esc Tab
			  return;
		  }
			e.preventDefault();
			self.activate();
			return false;
		});
		
		function shiftUpDown( v )
		{
			if( options.content.is(':visible') )
			{
				var lis = $("li", options.content);
				var breaks = 0;
				lis.each(function(i,o){
					if( $(o).is('.selected') )
					{
						lis.removeClass("selected");
						if( v ){ $(o).prev().addClass("selected") } else { $(o).next().addClass("selected") }
						return false;
					}
					else
					{
						breaks++;
					}
				})
				if( breaks == lis.length )
				{
					lis.removeClass("selected");
					if( v ){ lis.last().addClass("selected") } else { lis.first().addClass("selected") }
				}
			}
		}
		
		this.activate = function() {
			var self = this;

			if( this.keyTimeout )
			{
				clearTimeout( this.keyTimeout );
			}
			this.keyTimeout = setTimeout(function(){

				if( options.input.val().length ){
				
					$.ajax({
						url: options.reqSearch+"?q="+options.input.val(),
						type: 'GET',
						dataType: 'html',
						success: function( data ){
							var data = $( data );
							$("ul",options.content).remove();
							if(data.length)
							{
								options.content.append( packUL(data) ).fadeIn();
							}
							else
							{
								options.content.hide();
							}
						},
						async: false,
						cache: false
					});
				}
				
			}, 500);
			
		};
		
		function packUL( data )
		{
			var ul = $('<ul/>');
			data.each(function( i, o ){
				ul.append( $("<li>"+setSelection( $(o).text(), options.input.val() )+"</li>").click(function(){
					options.input.val( $(this).text() );
					options.content.fadeOut();
					$("#search_top").submit();
				}) );
			})
			return ul;
		}
		
		function setSelection( str, subStr )
		{
			return str.replace(new RegExp("("+subStr+")",'i'), "<strong>$1</strong>");
		}

	};
})(jQuery);
