/**
 * LiveSearch (requires the dimensions plug-in)
 *
 * Modified by Michael Wuori (michaelwuori.com)
 *
 * Applies "live search" to input-fields
 *
 * Usage: jQuery('#q').liveSearch({ajaxURL: '/ajax/search/?q='});
 *
 * @class liveSearch
 * @param {Object} conf, custom config-object
 *
 * Copyright (c) 2008 Andreas Lagerkvist (andreaslagerkvist.com)
 * Released under a GNU General Public License v3 (http://creativecommons.org/licenses/by/3.0/)
 */
// Hide all search-results if you click outside them
$(document.body).click(function(event) {
	if(!$(event.target).parents('div.live-search-results').length) {
		jQuery('div.live-search-results').slideUp(100);
	}
});


jQuery.fn.liveSearch = function(conf) {
	
	var config = jQuery.extend({
		ajaxURL: 'results.php?q=',
		classname: ''
	}, conf);
	


	return this.each(function() {
		var input		= jQuery(this);
		var tmpOffset	= input.offset();
		var inputDim	= {
			left:	tmpOffset.left, 
			top:	tmpOffset.top, 
			width:	input.outerWidth(), 
			height:	input.outerHeight()
		};
		var results			= jQuery('<div class="live-search-results '+config.classname+'"></div>').appendTo(document.body).hide().slideUp(0);
		var resultsShift	= 0;
		inputDim.topNHeight	= inputDim.top + inputDim.height;
		inputDim.widthNShit	= inputDim.width - resultsShift;
		results.css({
			position:	'absolute', 
			left:		inputDim.left +'px', 
			top:		inputDim.topNHeight +'px'
			//width:		inputDim.widthNShit +'px'
		});


		var KEY = {
			UP: 38,
			DOWN: 40,
			DEL: 46,
			TAB: 9,
			RETURN: 13,
			ESC: 27,
			COMMA: 188,
			PAGEUP: 33,
			PAGEDOWN: 34,
			BACKSPACE: 8
		};
		
		input.keyup(function(event) {
					 
			// How many results do we have?
			var matches = $('div.live-search-results li').length;	
			var selected = $('div.live-search-results li.selected').attr("id");
			
			switch(event.keyCode) {
			
				// Up
				case KEY.UP:
					if(matches > 1){
						if(selected && selected!='1'){
							var toSelect = eval(selected)-1;
							$("div.live-search-results #"+selected).removeClass("selected");
							$("div.live-search-results #"+toSelect).addClass("selected");
						}else{
							$("div.live-search-results #1").removeClass("selected");
						}										
					}
					return false;
					break;
				// Down
				case KEY.DOWN:
					if(matches){
						if(selected && selected!=matches){
							var toSelect = eval(selected)+1;
							$("div.live-search-results #"+selected).removeClass("selected");
							$("div.live-search-results #"+toSelect).addClass("selected");
						}else{
							$("div.live-search-results #1").addClass("selected");
						}										
					}
					return false;
					break;
					
				// Enter	
				case KEY.RETURN:
					
					$('#username').val($('div.live-search-results li.selected').attr('title'));
					$('#member_id').val($('div.live-search-results li.selected').attr('rel'));
					results.slideUp(100);
					return false;
					
					break;
					
				// Escape
				case KEY.ESC:
					results.slideUp(100);
					break;
				
				// No special key (alpha-numeric)
				default:			 
					//if(this.value != this.lastValue) {
						
						//input.addClass('ajax-loading');
						
						var q = this.value;
						
						if(this.timer) {
							clearTimeout(this.timer);
						}
		
						this.timer = setTimeout(function() {
							jQuery.get(config.ajaxURL +q, function(data) {
								//input.removeClass('ajax-loading');
		
								if(data.length) {
									results.html(data).slideDown(100);
								}
								else {
									results.slideUp(100);
								}
							});
						}, 200);
		
						this.lastValue = this.value;
					//}
					break;
			};
			
		});
	});
};