/*
	cbs_live_search v0.3
	by Christophe Beyls - http://www.digitalia.be
*/

CbsLiveSearch = Class.create();
CbsLiveSearch.prototype =
{
	initialize: function(textbox, results, default_value, webkit, resetimage, waitimage, _break, wraptag, max, excerpts, dates, noresults)
	{
		this.default_value = default_value;
		this._break = _break;
		this.wraptag = wraptag;
		this.max = max;
		this.excerpts = excerpts;
		this.dates = dates;
		this.noresults = '<p>' + noresults + '</p>';
		
		textbox = $(textbox);
		this.textbox = textbox;
		if(webkit)
			webkit = (parseInt(navigator.productSub)>=20020000) && (navigator.vendor.indexOf('Apple Computer')!=-1);
		results = $(results);
		this.results = results;
		
		if((resetimage != '') && !webkit) {
			this.resetimage = document.createElement('img');
			Element.addClassName(this.resetimage, 'livesearch_resetimage');
			this.resetimage.src = resetimage;
			this.resetimage.style.cursor = 'pointer';
			this.resetimage.style.visibility = 'hidden';
			textbox.parentNode.appendChild(this.resetimage);
			Event.observe(this.resetimage, "click", function() { textbox.value = ''; textbox.focus() });
		}
		else this.resetimage = null;
		if(waitimage != '') {
			this.waitimage = document.createElement('img');
			Element.addClassName(this.waitimage, 'livesearch_waitimage');
			this.waitimage.src = waitimage;
			this.waitimage.style.visibility = 'hidden';
			textbox.parentNode.appendChild(this.waitimage);
		}
		else this.waitimage = null;
		
		this.clone = results.cloneNode(false);
		this.clone.style.visibility = 'hidden';
		this.clone.style.position = 'absolute';
		this.clone.style.display = '';
		this.clone.style.height = '';
		results.parentNode.insertBefore(this.clone, results);
		
		this.resizeFx = new fx.Height(results, { duration: 500 });
		this.resizeFx.hide();
		this.fadeFx = new fx.Opacity(results, { duration: 500 });
		this.fadeFx.hide();
		this.visible = false;
		results.style.display = '';
		
		var _this = this;
		if(webkit) {
			Element.addClassName(textbox.form, 'livesearch_webkit');
			textbox.setAttribute('type', 'search');
			textbox.setAttribute('autosave', textbox.form.action);
			textbox.setAttribute('results', '5');
			textbox.setAttribute('placeholder', this.default_value);		
		} else {
			try { textbox.setAttribute('autocomplete', 'off'); } catch(exception) {};
			textbox.value = this.default_value;
			Element.addClassName(textbox, 'livesearch_inactive');
			Event.observe(textbox, "focus", this.onFocus.bindAsEventListener(this), false);
			Event.observe(textbox, "blur", this.onBlur.bindAsEventListener(this), false);
		}
		Observer = Class.create();
		Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return this.element.value; } });
		new Observer(textbox, 1, function(element, value) { _this.onTextChange(element, value) });
	},
	
	onFocus: function()
	{
		if(this.textbox.value == this.default_value) {
			this.textbox.value = '';
			Element.removeClassName(this.textbox, 'livesearch_blur');
		}
	},
	
	onBlur: function()
	{
		if(this.textbox.value == '') {
			this.textbox.value = this.default_value;
			Element.addClassName(this.textbox, 'livesearch_blur');
		}
	},
	
	hideResults: function()
	{
		if(!this.visible)
			return;
		this.visible = false;
		if(this.waitimage != null) {
			this.waitimage.style.visibility = 'hidden';
		}
		this.resizeFx.clearTimer();
		this.fadeFx.clearTimer();
		this.resizeFx.custom(this.results.offsetHeight, 0);
		this.fadeFx.custom(1, 0);
	},
	
	onTextChange: function(element, value)
	{
		if(this.request != null) {
			this.request.transport.abort();
			this.request = null;
		}
		if(this.resetimage != null) {
			this.resetimage.style.visibility = ((value == '') || (value == this.default_value)) ? 'hidden' : '';
		}
		if(value == this.default_value) {
			this.hideResults();
			return;
		}
		value = value.replace(/(^\s+)|(\s+$)/g, '');
		if(value.length < 3) {
			this.hideResults();
			return;
		}
		var _this = this;
		this.request = new Ajax.Request(window.location.href,
			{
				asynchronous: true,
				evalScripts: false,
				onComplete: function(request)
				{
					_this.request = null;
					if(_this.waitimage != null) {
						_this.waitimage.style.visibility = 'hidden';
					}
					_this.results.innerHTML = (request.responseText == '<none />') ? _this.noresults : request.responseText;
					_this.clone.innerHTML = _this.results.innerHTML;
					_this.clone.style.width = _this.results.clientWidth + 'px';
					if(!_this.visible) {
						_this.visible = true;
						_this.fadeFx.clearTimer();
						_this.fadeFx.custom(0, 1);
					}
					_this.resizeFx.clearTimer();
					_this.resizeFx.custom(_this.results.clientHeight, _this.clone.clientHeight);
				},
				onLoading: function(request)
				{
					if(_this.waitimage != null) {
						_this.waitimage.style.visibility = '';
					}
				},
				onFailure: function(request)
				{
					_this.request = null;
					if(_this.waitimage != null) {
						_this.waitimage.style.visibility = 'hidden';
					}
					_this.hideResults();
				},
				method: 'post',
				parameters: 'ls=' + value + '&break=' + _this._break + '&wraptag=' + _this.wraptag
							+ '&max=' + _this.max + '&excerpts=' + _this.excerpts + '&dates=' + _this.dates
			}
		);
	}
}
