﻿TRAILS.utils.SearchManager = function TRAILS_utils_SearchManager($form, $input, $tabs){
	var self = this,
		lastSelectedType = null,
		selectedType = null,
		$selectedTab = null,
		selectedTabClassName = 'selected',
		SearchType = TRAILS.utils.SearchManager.SearchType,
		searchTypes = [
			new SearchType('trails', '/advancedfind.aspx', 'Enter Keywords (e.g. Breakneck Ridge, etc.)', 'keyword'),
			new SearchType('photos', '/csearch.aspx', 'Enter Keywords (e.g. glacier, rainier, etc.)', 'search', { p: 'photosearch' }),
			new SearchType('members', '/csearch.aspx', 'Enter Member Name (e.g. TrailsTeam, etc.)', 'search', { p: 'membersearch' }),
			new SearchType('gear', '/gear/results.aspx', 'Enter Keywords (e.g. hiking boots, gps, etc.)', 'keyword'),
			new SearchType('articles', '/cms/search.aspx', null, 'keyword', null, 'GoogleCustomSearchWatermark')
		];
		
	function initInput(searchType){
		$input.val(searchType.hint).addClass(searchType.classNames);
	}
	function clearInput(searchType){
		$input.val(String.empty).removeClass(searchType.className);
	}

	this.getTab = function TRAILS_utils_SearchManager_getTab(value){
		switch(typeof value){
			case Object.type:
				return value;
			case Number.type:
				return $tabs.eq(index);
			case String.type:
				return $tabs.filter(':contains(' + type + ')');
		}
		
		return null;
	};
	this.setType = function TRAILS_utils_SearchManager_setType(index){
		if(selectedType === index) return;
		
		lastSelectedType = selectedType;
		selectedType = index;
		
		$form.attr('action', searchTypes[index].path);
	};
	this.setSelectedTab = function TRAILS_utils_SearchManager_setSelectedTab($tab){		
		if($selectedTab)
			$selectedTab.removeClass(selectedTabClassName);		
		if($tab)
			$tab.addClass(selectedTabClassName);
			
		$selectedTab = $tab;
	};
	this.getSelectedTab = function TRAILS_utils_SearchManager_getSelectedTab(){
		return $selectedTab;
	};
	this.getTypeIndex = function TRAILS_utils_SearchManager_getTypeIndex(value){
		switch(typeof value){
			case Number.type:
				if(value >= searchTypes.length)
					return searchTypes.length - 1
				break;
			case String.type:
				if(value.length !== 0)
					return searchTypes.indexOf(value) || 0;
				break;
		}
		
		return 0;
	};
	this.getTypeIndexByPath = function(path){		
		for(var i = 0, l = searchTypes.length; i < l; i++){
			var type = searchTypes[i];
			
			if(path.indexOf(type.path.split('?')[0]) !== -1){
				if(!type.extraParameters) return i;
				
				var url = new TRAILS.utils.QuerystringParser(path);
				var hasParameters = true;
				
				for(var parameter in type.extraParameters)
					if(!url.contains(parameter) || url.getField(parameter) != type.extraParameters[parameter])
						hasParameters = false;
				
				if(hasParameters)
					return i;
			}
		}
		
		return 0;
	};
	this.getQuery = function TRAILS_utils_SearchManager_getQuery(type, keywords){
		if(!type)
			type = searchTypes[selectedType];

		var url = [ 'http://', document.location.host, type.path, '?', type.keywordParameter, '=', keywords ];
		
		for(var parameter in type.extraParameters){
			url.push('&');
			url.push(parameter);
			url.push('=');
			url.push(type.extraParameters[parameter]);
		}
		
		return url.join(String.empty);
	};
	this.submitQuery = function TRAILS_utils_SearchManager_submitQuery(type, keywords){
		document.location = self.getQuery(type || searchTypes[selectedType], keywords);
	};
	
	if($tabs){
		$tabs.each(function(i, e){
			var $tab = jQuery(e);
			
			$tab.bind('click', function _onclick_tab(event){
				var value = $input.val();
				
				if(selectedType !== null && value.length === 0)
					clearInput(searchTypes[selectedType]);
				
				self.setSelectedTab($tab);
				self.setType(i);
				
				if(value.length === 0 || (searchTypes[lastSelectedType] && searchTypes[lastSelectedType].hint == value))
					initInput(searchTypes[i]);

				return false;
			});
		});
		
		if($tabs.length == 0)
			$tabs = null;
		else
			$tabs.eq(this.getTypeIndexByPath(document.location.toString())).trigger('click');
	}
	
	lastSelectedType = selectedType;
	
	for(var i = 0, v = $input.val(), l = searchTypes.length; i < l; i++)
		if(searchTypes[i].hint !== null && v.indexOf(searchTypes[i].hint))
			$input.val(String.empty);
	
	$form.bind('submit', function _onsubmit_form(){
		var keywords = $input.val();
		
		if(String.isNullOrEmpty(keywords) || keywords.indexOf(searchTypes[selectedType].hint) !== -1)
			return false;
		
		self.submitQuery(searchTypes[selectedType], keywords);
		
		return false;
	});
	$input
		.bind('focus', function _onfocus_input(){
			$input.removeClass(searchTypes[selectedType].classNames);
			
			if(searchTypes[selectedType].hint !== null && this.value.indexOf(searchTypes[selectedType].hint) !== -1)
				return clearInput(searchTypes[selectedType]);
		})
		.bind('blur', function _onblur_input(){			
			if(this.value.length === 0)
				return initInput(searchTypes[selectedType]);
		})
		.blur();
};
TRAILS.utils.SearchManager.SearchType = function TRAILS_utils_SearchManager_SearchType(id, path, hint, keywordParameter, extraParameters, classNames){
	this.id = id;
	this.path = path;
	this.hint = hint;
	this.keywordParameter = keywordParameter;
	this.extraParameters = extraParameters;
	this.classNames = classNames;
};