searchAsYouType = new Class({
	options: {
		fadedurration:600,  					// time for animation
		fps:50,									// frames per second
		urlAjaxSearch:'search.cfm',				// URL to search with JSON display 
		startAtChar:3,							// count of chars when the first search hat so start
		maxRows:8,								// count of max entrys to display
		delayToHideBox:3000,					// time in ms to hide box after a search 
		delayToHideBoxAfterMouseOut:1000,		// time in ms to hide box after leaving the Box with the mouse 
		delayToSearch:300						// delay to start a new search while typing
	},
	initialize: function(elInput,elBox,elList,options){
		this.setOptions(options);

		// check data
		if($type(elInput) == 'element'){
			this.elInput = elInput;
		}else{
			// exit quietly 
			return false;
		}
		if($type(elBox) == 'element'){
			this.elBox = elBox;
		}else{
			// exit quietly 
			return false;
		}
		if($type(elList) == 'element'){
			this.elList = elList;
		}else{
			// exit quietly 
			return false;
		}
		
		// AJAX call
		this.oAjaxSearch = new Request.JSON({
			method: 'GET',
			onSuccess:this.displayResult.bind(this),
			url:this.options.urlAjaxSearch
		});
		
		this.bBoxVisible = false; 
		
		$(this.elBox.id).setStyle('opacity',0);
		this.fxHideBox = new Fx.Tween(this.elBox,{fps:this.options.fps, duration: this.options.fadedurration,
			onComplete:(function(el){
				if(el.getStyle('opacity')){
					this.bBoxVisible = true;
				}else{
					this.bBoxVisible = false;
					el.setStyle('display','none');
					this.selectedItem = -1;
				}
			}).bind(this)});
		
		this.hideboxDelay = 0;
		this.bHideBox = false;
		
		this.searchDelay = 0;
		this.bStartSearch = false;
		
		this.data = new Array();
		
		elInput.onkeyup = this.checkForSearch.bindWithEvent(this);
		elBox.addEvent('mouseleave', this.outBox.bind(this));
		elBox.addEvent('mouseenter', this.overBox.bind(this));
		
		//document.addEvent('click', this.hideBox.bind(this,true));
		
		this.selectedItem = -1;
	},
	checkForSearch:function(evnt){
		switch(evnt.keyCode){
			case 38:
				// onKey cursor up
				this.hideboxDelay = $clear(this.hideboxDelay);
				this.selectPrevious();
			break;
			case 40:
				// onKey cursor down
				this.hideboxDelay = $clear(this.hideboxDelay);
				this.selectNext();
			break;
			case 39:
				// onKey cursor right
				this.hideboxDelay = $clear(this.hideboxDelay);
				//this.selectNext();
			break;
			case 37:
				// onKey cursor left
				this.hideboxDelay = $clear(this.hideboxDelay);
				//this.selectPrevious();
			break;
			case 27:
				// onKey Esc
				this.bHideBox = true;
				this.hideBox(false);
			break;
			case 13:
				this.useCurrSelection();
			break;
			default:
				this.searchDelay = $clear(this.searchDelay);
				if(this.elInput.value.length >= this.options.startAtChar){
					this.searchDelay = this.startSearch.delay(this.options.delayToSearch,this,this.elInput.value);
				}
		}
	},
	startSearch:function(criteria){
		
		var oSearchParams = new Object();
		// add params
		oSearchParams.criteria = criteria; 
		oSearchParams.maxRows = this.options.maxRows;
		this.fxHideBox.pause();
		this.oAjaxSearch.get(oSearchParams);
	},
	displayResult:function(oData,sData){
		this.data = eval(sData);
		this.elList.empty();
		// generate HTMLElements
		var eLI = 0;
		var eA = 0;
		var eSPAN = 0;
		for(var i = 0; i< this.data.length; i++){
			eLI = 0;
			eA = 0;
			eSPAN = 0;	
			
			if(i == 0){
				eLI = new Element('LI',{'class':'first'});
			}else{
				eLI = new Element('LI');
			}
			eA = new Element('a',{'href':'javascript:void(0);'}).set('html',this.data[i].DATA);
			eA.addEvent('click',this.doClick.bind(this,this.data[i].DATA));
			/*
			if(this.data[i].METADESC.length){
				eSPAN = new Element('SPAN').setHTML(this.data[i].METADESC);
			}else{
				eSPAN = new Element('SPAN').setHTML(this.data[i].SUMMARY);
			}*/
			eA.injectInside(eLI);
			//eSPAN.injectInside(eLI);
			
			this.elList.adopt(eLI);
		}

		this.bBoxVisible = true; 
		this.elBox.setStyle('display','block');
		this.fxHideBox.start('opacity',1);
		
		this.hideboxDelay = $clear(this.hideboxDelay); 
		this.bHideBox = true;
		this.hideboxDelay = this.hideBox.delay(this.options.delayToHideBox,this,false);
	},
	outBox:function(){
		this.hideboxDelay = $clear(this.hideboxDelay); 
		this.bHideBox = true;
		this.hideBox.delay(this.options.delayToHideBoxAfterMouseOut,this,false);
	},
	overBox:function(){
		this.hideboxDelay = $clear(this.hideboxDelay); 
		this.bHideBox = false;
	},
	hideBox:function(force){
		if(this.bHideBox || force){
			this.elBox.setStyle('display','none');
			this.fxHideBox.start('opacity',0);
		}
	},
	doClick: function(val){
		this.elInput.set('value',val);
	},
	selectNext: function(){
		$clear(this.hideboxDelay); 
		var elsLi = this.elList.getElements('LI');
		var elsLiCount = elsLi.length;
		elsLi.removeClass('sel');
		
		this.selectedItem++;
		if(this.selectedItem > elsLiCount-1){
			this.selectedItem = 0;
		}
		elsLi[this.selectedItem].addClass('sel');			
		
		
	},
	selectPrevious: function(){
		$clear(this.hideboxDelay); 
		var elsLi = this.elList.getElements('LI');
		var elsLiCount = elsLi.length;
		elsLi.removeClass('sel');
		
		this.selectedItem--;
		if(this.selectedItem < 0){
			this.selectedItem = elsLiCount-1;
		}
		elsLi[this.selectedItem].addClass('sel');			

		
	},
	useCurrSelection: function(){
		if(this.selectedItem >= 0 ){
			this.doClick(this.data[this.selectedItem].DATA);
			this.hideBox();
			/*this.fxHideBox.start('opacity',0);
			this.selectedItem = -1;*/
		}
	}
});
searchAsYouType.implement(new Options, new Events);

function clearsearchbox(txt) {
	if (document.searchsat.criteria.value==txt) 
		document.searchsat.criteria.value="";
}