/* 
// Ajax auto suggest 
// Versie: 1.1
// Parameters: fieldId, minChars, url
// Wijziging: 07-09-2007
// Added: 'loading image' in input tijdens ajax request (class 'loading') en selecteren tekst (functie 'selectTextRange').
*/

var AutoSuggest = Class.create();

AutoSuggest.prototype = {
	initialize: function(fieldId, minChars, url) { 			
		this.results = null;	
		this.selectedItem = null;			
		this.input = $(fieldId);
		this.minChars = minChars;
		this.typedLength = 0;
		this.url = url;		
		if (this.input) {
			this.createSuggest();
			this.input.setAttribute('autocomplete', 'off'); //Schakel browser's eigen autocomplete uit!
			Event.observe(this.input, 'keyup', this.keyListener.bind(this), false);																				
		}		 			 
	},
	createSuggest: function() {					
		this.container = this.input.parentNode;				
		this.suggest = document.createElement('ul');
		this.suggest.className = 'autosuggest';				
		this.suggest.style.display = 'none';		
		this.container.appendChild(this.suggest);		
	},
	keyListener: function(event) {							
		if (event.keyCode == 40 || event.keyCode == 38){ // Key up & key down
			if (this.results != null) {
				this.keySelectSuggestItem(event);
			}
		} else if (event.keyCode == 39 || event.keyCode == 37){ // Key left & key right 
			//Doe niks					
		} else if (event.keyCode == 27 && this.suggest.visible()) { // Esc
			$(this.suggest).hide();
		} else if (this.input.value.length >= this.minChars) {
			this.typedLength = this.input.value.length;				
			this.getSuggestItems();			
		} else {
			$(this.suggest).hide();
		}
	},	
	mouseListener: function(event) {		
		this.selectedItem = Event.element(event);
		this.mouseSelectSuggestItem();			
	},		
	getSuggestItems: function() {		
		var _this = this;
		this.pars = '?searchTerm='+this.input.value;
		this.input.addClassName('loading');
		var ajax = new Ajax.Request(this.url, { parameters: this.pars, onComplete: function(t) { _this.updateSuggestList(t.responseXML) } } );
	},
	updateSuggestList: function(xml) {					
		this.results = xml.getElementsByTagName('result');			
		if (this.results.length > 0) {			
			this.suggest.update(''); //Verwijder oude termen			
			for (var i=0; i < this.results.length; i++) {				 
				var li = document.createElement('li');				 			
				li.appendChild(document.createTextNode(this.results[i].getAttribute('title')));					
				this.suggest.appendChild(li);
				Event.observe(li, 'mouseover', this.mouseListener.bind(this), false);
			}									
		} else {
			this.results = null;
			this.suggest.update('<li class="no-results">No suggestions</li>');				
		}		
		this.input.removeClassName('loading');
		this.suggest.show();
		this.input.focus();	
	},	
	mouseSelectSuggestItem: function(event) {
		this.selectedItem.addClassName('selected');		
		this.suggest.immediateDescendants().without(this.selectedItem).invoke('removeClassName', 'selected')					
		this.input.value = this.selectedItem.cleanWhitespace().innerHTML; //nodeValue ??
		this.selectTextRange();
		this.input.focus();			
		this.selectedItem.observe('click', function(event){
			Event.element(event).up('form').submit();
		});		
	},
	keySelectSuggestItem: function(event) {		
		if (this.selectedItem == null) {
				this.selectedItem = this.suggest.firstDescendant();				
		} else if (event.keyCode == 40) { //key down
			this.selectedItem.removeClassName('selected');
			var nextItem = this.selectedItem.next();
			if (nextItem) {
				this.selectedItem = nextItem;						
			} else {
				this.selectedItem = this.suggest.firstDescendant(); //Begin weer vanaf boven
			}							
		} else if (event.keyCode == 38) { //key up
			this.selectedItem.removeClassName('selected');						
			var prevItem = this.selectedItem.previous();
			if (prevItem) {
				this.selectedItem = prevItem;		
			} else {
				this.selectedItem = this.suggest.down(this.suggest.childNodes.length - 1); //Begin weer vanaf onder
			}					
		} 		
		
		if (this.selectedItem) {			
			this.selectedItem.addClassName('selected');
			if (this.selectedItem.scrollIntoView) {
				this.selectedItem.scrollIntoView(false)
			}
			this.input.value = this.selectedItem.cleanWhitespace().innerHTML; //nodeValue ??
			this.selectTextRange();
			this.input.focus();	
		}						
	},	
	selectTextRange: function(){
		var start = this.typedLength;
		var end = this.input.value.length;		
		if (this.input.createTextRange) {
			var itsTextRange = this.input.createTextRange();
			itsTextRange.moveStart("character", start);
			itsTextRange.moveEnd("character", end);
			itsTextRange.select();
		} 		
		if (this.input.setSelectionRange){
			this.input.setSelectionRange(start, end);	
		}
	}
		
};

/*
Event.observe(window,'load',function(){ new AutoSuggest('searchTerm', 3, '/autosuggest.aspx'); }, false);
*/