/**
 * Search Suggestion
 */
var SearchSuggest = new Class({

	searchUrl: _searchurl,

	request: null,
	searchTimer: 0,
	searching: false,
	searchField: null,
	searchResult: null,
	searchContainer: null,
	suggest: null,

	initialize: function() {
		this.suggest = $('searchSuggest');
		this.searchContainer = this.suggest.getElement('div.searchContainer');
		this.searchResult = this.searchContainer.getChildren()[0].clone();
		this.searchResult = this.searchContainer.getElement('div.searchResult').clone();

		this.searchField = $('searchText');
		this.searchField.addEvents({
			'keyup': this.search.bind(this),
			'click': this.search.bind(this)
		});
	},

	search: function() {
		this.searchField.focus();

		if (this.searchField.value.length < 2) {
			this.suggest.removeClass('searching');
			this.suggest.addClass('hide');
			this.searching = false;
			return;
		}

		if (this.searchField.value == this.searchField.retrieve('lastvalue', '')) return;
		this.searchField.store('lastvalue', this.searchField.value);

		// show searching....
		this.searchContainer.empty().grab(this.searchResult.clone());

		this.suggest.addClass('searching');
		this.suggest.removeClass('hide');

		if (this.searching) return;

		if (this.searchTimer) $clear(this.searchTimer);
		this.searchTimer = this.searchSubmit.delay(400, this);
	},

	searchSubmit: function() {
		if (!this.request) {
			this.request = new Request({
				url: this.searchUrl,
				method: 'post',
				link:'cancel'
			});
			this.request.addEvent('success', this.searchRequestSuccess.bind(this));
			this.request.addEvent('failure', this.searchRequestFailure.bind(this));
		}
		this.request.options.data = {'searchSuggest': this.searchField.value};
		this.request.cancel();
		this.request.send();
	},

	searchRequestSuccess: function(text, xml) {
		this.searching = false;

		this.suggest.removeClass('searching');

		if (this.ratingWidth == undefined) {
			this.ratingWidth = this.suggest.getElement('div.rating').getScrollSize().x;
		}
		
		this.searchContainer.empty();

		results = JSON.decode(text);

		if (!results) {
			this.suggest.addClass('searching');
			this.suggest.removeClass('hide');
			var r = this.searchResult.clone();
			r.getElement('div.title').set('html', r.getElement('div.title').get('title'));
			r.getElement('div.body').set('html', r.getElement('div.body').get('title'));
			this.searchContainer.grab(r);
			return;
		}

		results.each(function(result, index) {

			var r = this.searchResult.clone();

			r.addEvents({
				'mouseover': function() {this.addClass('over');},
				'mouseout': function() {this.removeClass('over');},
				'click': function() {window.location = result.link}
			});
			
			r.getElement('div.title').set('html', result.title);
			r.getElement('li.excerpt').set('html', result.excerpt);
			r.getElement('li.tag').set('html', result.tags);
			r.getElement('div.body').set('html', result.body ? result.body : '');

			var ratingPxl = Math.round((result.rating.toInt() / 100) * this.ratingWidth);
			r.getElement('div.ratingOverlay').setStyle('width', ratingPxl + 'px');
			
			this.searchContainer.grab(r);

		}, this);
	},

	searchRequestFailure: function(text, xml) {
		this.searching = false;
	},

	more: function() {
		window.location = _searchurl + "/?s=" + escape(this.searchField.value);
	},

	close: function() {
		this.suggest.addClass('hide');
	},
	
	setupWidget: function() {
		// Setup Widget Tabs
		var items = $$('#widgetContainer div.tab a');
		items.addEvent('click', function() {
			items.each(function (item,index) {item.removeClass('active');});
			this.addClass('active');
		});
		// Setup Widget Tags
		var tabs = $('tagWidget').getElements('ul.tags li');
		var lastTab = null;
		tabs.each(function(tab,index) {
			if (index == 0) tab.addClass('first');
			if (lastTab && lastTab.hasClass('active')) tab.addClass('belowActive');
			lastTab = tab;
		});
	}
});

var searchSuggest = {};
window.addEvent('domready', function() {
	searchSuggest = new SearchSuggest();
});
