/**
 * @author danielpotzinger
 */


var livesearch = {
	isInit:0,
	searchBoxContainerId:'searchbox-container',
	suggestionContainerId:'searchbox-suggestion-container',
	resultContainerId:'searchbox-result-container',
 	statusContainerId:'searchbox-status-container',
	ajaxStatusContainerId:'searchbox-ajaxstatus-container',
	searchInputId:'searchbox-sword',
	searchFormId:'search-mini-form',
	searchBoxContainerObject:null,
	searchInputObject:null,
	statusContainerObject:null,
	ajaxStatusContainer:null,
	lastSearchWord:'',
	status:'',
	ajaxStatus:'',
	ajaxCallNumber:0,
	
	init: function() {

		if (this.isInit==1) 
				return false;
		
		this.isInit=1
		
		this.searchBoxContainerObject=$(this.searchBoxContainerId);
		this.searchInputObject=$(this.searchInputId);
		this.statusContainerObject=$(this.statusContainerId);
		this.ajaxStatusContainer=$(this.ajaxStatusContainerId);
		this.searchInputObject.addEvent('focus', function(event) {

				livesearch.showSearchBox();
			});
		
		this.searchInputObject.addEvent('change', function() {
		
				livesearch.hideSearchBox();
			});
		this.searchInputObject.addEvent('blur', function() {
		
			livesearch.hideSearchBox();
			});
		this.searchInputObject.addEvent('keyup', function() {
		
				livesearch.keyEvent();
			});
		
		
		
 	},

	keyEvent: function() {	    
	 	 //call ajax with delay	 	
		this.updateStatus('typing');
	 	this.delayedCallForAjax(livesearch.searchInputObject.value);	 	 
	 
	},
 	delayedCallForAjax: function(lastValue) {
	 	 (function() { livesearch.checkAndDoAjaxCall(lastValue,0) }).delay(200);
    },
	
	checkAndDoAjaxCall: function(lastValue,recursioncallLevel) {
		if (recursioncallLevel>5)
			return;
			
	 	//only call if there was no typing in last second and ajax call is finished
	 	if (this.searchInputObject.value == lastValue && lastValue !='') {
			//check if still a process is running:
			if (this.ajaxStatus!='ajax') {
				this.updateAjaxStatus('ajax');
				if (ajaxRequestURLLucene != '') {
					livesearch.ajaxCallNumber++;
					new Ajax(ajaxRequestURLLucene, {
						method: 'post',
						data: $(this.searchFormId),
						update: this.searchBoxContainerId,
						evalScripts: true,
						onComplete: function(){this.updateAjaxStatus('ajaxready');}.bind(this)
					}).request();
				}
				else {
					alert('ajaxRequestURLLucene is not configured');
				}
			}
			else {
				 currentNr=livesearch.ajaxCallNumber;
				 (function() { livesearch.checkAndDoAjaxCall(lastValue,(recursioncallLevel++)) }).delay(1000);
				 (function() { livesearch.flushAjaxCalls(currentNr) }).delay(10000);
			}
	  	}
	 },
	//updates internal status
	updateStatus: function(status) {
		this.status=status;
		//this.statusContainerObject.innerHTML=this.status;
	},
	flushAjaxCalls: function(nr) {
	
		if (livesearch.ajaxCallNumber==nr && this.ajaxStatus!='ajaxready') {
			this.updateAjaxStatus('ajaxready');
			//this.searchBoxContainerObject.innerHTML='timeout';
			this.statusContainerId.innerHTML='timeout';
		}
	},
	updateAjaxStatus: function(status) {
		this.ajaxStatus=status;
		if (status=='ajaxready') {
			this.ajaxStatusContainer.style.display='none';
		}
		else {
			this.ajaxStatusContainer.style.display='block';
		}
	},
	showSearchBox:function() {
		if (this.status!='shown') {
			var myFx = new Fx.Scroll(window,{
			    offset: {
			        'x': 0,
			        'y': -200
			    }
			}).toElement(this.searchInputId);
			this.updateStatus('shown');
	 		this.searchBoxContainerObject.setStyle('display', 'block');
 			this.searchBoxContainerObject.setStyle('opacity', '0');

			var fx = new Fx.Styles(this.searchBoxContainerObject, {duration:400, wait:false});

			fx.start({
				'width': '400px',
				'height': '220px',
				'opacity': 0.9
			});
		}
	},

	hideSearchBox:function() {
		if (this.status!='hide') {
 			this.updateAjaxStatus('ajaxready');
			this.updateStatus('hide');
			var fx = new Fx.Styles(this.searchBoxContainerObject, {duration:400, wait:false});
			fx.start({
				'width': '20px',
				'height': '20px',
				'opacity': 0
			});
		}
	}
	
}



