
//////////
// INIT //
//////////

$(document).ready(function(){
	QuickSearch.init();
});

//////////////////
// Quick Search //
//////////////////

var QuickSearch = {

	// Static config variables
	CONTAINER_ID : 'quicksearch-results',
	API_URL : '/ajax/entities/search/',
	
	// Elements
	opener : null,
	container : null,
	input : null,
	resultContainer : null,

	selectedResult : null,
	
	// Possible states of the QuickSearch
	requestCounter : 0,
	
	
	init : function(){
		QuickSearch.input = $('#query').click(QuickSearch.open).bind('keydown', QuickSearch.handleInputKeyUp );
		//$('#quicksearch-form').submit( function(){ return false;} );
		
		// Close by pressing escape: note keyup is used here -> escape key doesn't trigger keydown event) 
		$(document).keyup(  function(e){
			if(e.keyCode == 27 && active ){
				QuickSearch.close();
			}
		});

	},
	
	open : function(){
		if(!QuickSearch.container ){
			QuickSearch.container = $('#' + QuickSearch.CONTAINER_ID );
			$(document).click( QuickSearch.handleDocumentClick );
		}
		
		QuickSearch.container.show();
	},
	
	close : function(){
		QuickSearch.container.hide();
	},

	
	// Close the Quicksearch when clicked outside it
	handleDocumentClick : function(e){
		
		// If the event target isn't a child of our container, click happened outside the container
		if ( $('#' + QuickSearch.CONTAINER_ID ).is(':visible') && !$(e.target).parents('#' + QuickSearch.CONTAINER_ID ).length){
			QuickSearch.close();
		}

	},
	
	handleInputKeyUp : function(e){
		
		if( e.keyCode > 8 && e.keyCode < 48){

			// Not backspace or character, so no need to update
			return true;
		}
		
		setTimeout('QuickSearch.update();',10);
	},
	
	
	update : function(){
		QuickSearch.requestCounter++;
		var query = QuickSearch.input.val();
		$.getJSON( QuickSearch.API_URL, {c: QuickSearch.requestCounter, q: query}, QuickSearch.handleUpdate );

	},
	
	handleUpdate : function(resp){
		
		resp = resp.content;
		
		if (!QuickSearch.resultContainer){
			QuickSearch.setupResultDisplay();
		}
		
		if (resp.requestCount != QuickSearch.requestCounter ){
			// If this wasn't the last request, ignore it
			return false;
		}
		if (!resp.data.resultCount){
			QuickSearch.resultContainer.hide()
			QuickSearch.container.removeClass('listing-results');
			return false;
		}else{
			QuickSearch.resultContainer.show()
			QuickSearch.container.addClass('listing-results');
		}

		QuickSearch.resultContainer.html(resp.data.html);
		QuickSearch.selectedResult = null; // Previous list is gone		

	},

	
	setupResultDisplay : function(){
		
		if (QuickSearch.resultContainer){
			return true;
		}
		
		QuickSearch.resultContainer = $('#quicksearch-results');
		
		// Enable closing
		$('#quicksearch-close').click(QuickSearch.close);
		
		// Enable clicking on list items
		$('#quicksearch-results li').live( 'click', function(){
			QuickSearch.followLink( $(this) );

		});
		// Enable hovering list items
		$('#quicksearch-results li').live( 'mouseover', function(){	QuickSearch.select($(this));  });
		$('#quicksearch-results li').live( 'mouseout', function(){	QuickSearch.deselect($(this)); });
		
		// Enable keyboard navigation
		$(document).keyup( QuickSearch.handleDocumentKeyUp );
		
		return true;
	},
	
	
	handleDocumentKeyUp : function(e){

		if( e.keyCode == 40 || e.keyCode == 38 ){
			
			var toSelect;

			if( e.keyCode == 40 ){	// Pressed down arrow
				
				if( !QuickSearch.selectedResult ){
					// No selected list item yet, select the first one
					QuickSearch.select( $('li:not(.skip):first', QuickSearch.resultContainer) );
				}else{
					var next = QuickSearch.selectedResult.next('li');
					
					if(next.hasClass('skip')){
						next = QuickSearch.selectedResult.next('li').next('li');
					}
					
					if( next.length ){
						toSelect = next;
					}
				}
				
			}else if(e.keyCode == 38){	// Pressed up arrow
			
				var prev = QuickSearch.selectedResult.prev('li');
				
				if(prev.hasClass('skip')){
					prev = QuickSearch.selectedResult.prev('li').prev('li');
				}
				
				if( prev.length ){
					toSelect = prev;
				}

			}
			
			if (toSelect){
				QuickSearch.deselect( QuickSearch.selectedResult );
				QuickSearch.select( toSelect );	
			}

		}else if( e.keyCode == 13 ){
			// Enter key pressed
			if(QuickSearch.selectedResult){
				QuickSearch.followLink(QuickSearch.selectedResult);
			}
		}
	},
	
	select : function( $li ){
		QuickSearch.selectedResult = $li.addClass('hover');
	},
	
	deselect : function( $li ){
		$li.removeClass('hover');
		QuickSearch.selectedResult = null;
	},
	
	followLink : function( li ){
		window.location.href = $(li).find('a:first').attr('href');
		return false;
	}
}

