﻿var SearchController = function()
{	
	var searchInput = null;
	var searchButton = null;	
	
	var searchRequest = {
		url: '',
		param : 'search'
	};
	
	//*****************************************
	
	var initControls = function(config)
	{		
		searchInput = $(config.selector.searchInput);
		searchButton = $(config.selector.searchButton);			
	};	
	
	var initEventHandlers = function()
	{
		$('body').find('*').focus(syncSearchState);		
					
		searchInput.keypress(function (e) 
		{
			if (e.which == 13) // on Enter pressed
			{
				e.cancelBubble = true;
				e.preventDefault();
				e.stopPropagation();
				search();
	        }	      
	    });		
	    
	    searchButton.click(function(e)
	    {
			e.cancelBubble = true;			
			search();
	    });	
	};	
	
	var syncSearchState = function()
	{
		if (searchInput.is(':focus')||searchButton.is(':focus'))
		{
			searchButton.removeAttr("disabled");
		}
		else
		{
			searchButton.attr("disabled","disabled");
		}
	};
	
	var search = function()
	{
		var searchString = $.trim(searchInput.val());
		searchInput.val(searchString);
		
		if (searchString != '')
		{						
			var url = buildFullSearchRequestUrl(searchString);
			document.location.href = url;
		}
	}
	
	var buildFullSearchRequestUrl = function(searchString)
	{
		var encodedSearchString = encodeURIComponent(searchString);
		
		var url = searchRequest.url;		
		url += url.indexOf('?') == -1 ? '?' : '&';
		url += searchRequest.param+'='+encodedSearchString;
		
		return url;
	}
			   
    // return a public interface
    return {
		init: function(config)	
		{
			$.extend(searchRequest, config.searchRequest);
			
			initControls(config);
			initEventHandlers(config);
			
			syncSearchState();
		}		
    };
}();