var SearchBox = {
	suggestbox: null,
	searchButton: null,
	search: null,
	lastTab: null,
	searchBox: null,
	suggestsBox: null,
	suggestsList: null,
	currentTimeout: 250,
	searchCache: [],
	lastRequest: '',
	workingAnim: null,
	lastAction: null,
	lastText: null,
	siteSearchDiv: null,
	defaultString: 'search for',
	errorMessage: 'please type something to search for',

	init: function() {
		this.searchBox = $('header-search');
		this.searchButton = $('header-search-button');
		this.search = $('search-form');

		this.siteSearchDiv = $('site_search');
		this.searchBox.setAttribute('autocomplete', 'off');
		this.lastRequest = this.searchBox.defaultValue;

		this.workingAnim = document.createElement("img");
		this.workingAnim.id = 'suggests-working';
		this.workingAnim.src = '/graphics/loading_large_pink.gif';
		this.workingAnim.alt = 'Loading...'; 
		this.workingAnim.className = 'hide';
		this.searchBox.parentNode.insertBefore(this.workingAnim, this.searchBox.nextSibling);

		this.suggestsBox = document.createElement("div");
		this.suggestsBox.id = 'suggests-box';
		this.suggestsBox.className = 'hide';

		var suggestsHeader = document.createElement("h3");
		suggestsHeader.appendChild(document.createTextNode("Did you mean..."));
		this.suggestsBox.appendChild(suggestsHeader);

		this.searchBox.parentNode.insertBefore(this.suggestsBox, this.searchBox.nextSibling);

		this.boundHandler = this.initTimer.bindAsEventListener(this);
		
		this.searchButton.observe('click', this.runSearch.bindAsEventListener(this));

		Event.observe(this.searchBox, 'keypress', this.boundHandler);
		Event.observe(this.searchBox, 'focus', function() { if ($F(this.searchBox)==this.defaultString||$F(this.searchBox)==this.errorMessage) this.searchBox.value = this.lastText = ''; }.bind(this));
	},
	runSearch: function(event){
		if(this.searchBox.value == this.defaultString || this.searchBox.value == this.errorMessage || this.searchBox.value == ''){
		  this.searchBox.addClassName('search_error');
			this.searchBox.value = this.errorMessage;
			Event.stop(event);
		} else {
		  return true;
		}
	},
	// AJAX suggestions (moved from suggests.js	
	initTimer: function(evt) {
		Event.stopObserving(this.searchBox, 'keypress', this.boundHandler);
		this.searchBox.removeClassName('search_error');
		this.setSuggestsTimeout();
	},
	setSuggestsTimeout: function(timeout) {
		if (typeof timeout != 'undefined') {
			this.currentTimeout = timeout;
		}

		if (this.currentTimeout > 0) {
			window.setTimeout(this.checkSearchBox.bind(this), this.currentTimeout);
		}
	},
	checkSearchBox: function() {
		if ($F(this.searchBox).length > 0 && !($F(this.searchBox) == this.lastRequest && this.search.action == this.lastAction) && $F(this.searchBox)!=this.defaultString) {
			if (typeof (this.searchCache[this.search.action + $F(this.searchBox)]) == 'undefined') {
				this.lastRequest = $F(this.searchBox);
				this.lastAction = this.search.action;

				new Ajax.Request('/search/suggest.php', { 
					method: 'get', 
					parameters: { 
						location: this.search.action, 
						s: $F(this.searchBox) 
					},
					onLoading: function() { this.workingAnim.className = 'loading_animation'; }.bind(this),
					onSuccess: function(transport) { this.workingAnim.className = 'hide'; eval(transport.responseText); this.setSuggestsTimeout(); }.bind(this)
				});

				// don't re-set the timeout - we'll do that once the AJAX call has returned
				return;
			} else {
				if($F(this.searchBox) != this.lastRequest){
					this.displaySuggests(this.searchCache[this.search.action + $F(this.searchBox)], true);
				}
			}
		} else if ($F(this.searchBox).length == 0) {
			this.suggestsBox.className = 'hide';
		}

		this.lastRequest = $F(this.searchBox);
		this.setSuggestsTimeout();
	},
	displaySuggests: function(data, cache) {
		if (!cache) this.searchCache[this.lastAction + this.lastRequest] = data;

		var newSuggestsList = document.createElement('ul');
		var suggestsBoxClass;

		if (data.length == 0) {
			suggestsBoxClass = 'hide';
		} else {
			suggestsBoxClass = 'suggests_box';

			data.each(function(datum) {
				if (typeof datum == 'undefined' || datum == '_') return;

				var listItem = document.createElement('li');
				var aHref = document.createElement('a');
				
				aHref.href = this.search.action + '?' + this.searchBox.name + '=' + escape(datum);

				aHref.appendChild(document.createTextNode(datum));
				listItem.appendChild(aHref);

				newSuggestsList.appendChild(listItem);
			}.bind(this));
		}
		if (null == this.suggestsList) {
			this.suggestsBox.appendChild(newSuggestsList);
		} else {
			this.suggestsBox.replaceChild(newSuggestsList, this.suggestsList);
		}

		this.suggestsList = newSuggestsList;
		this.suggestsBox.className = suggestsBoxClass;
	}
};

Event.observe(window, 'load', SearchBox.init.bind(SearchBox));
