
AWC.widget.LiveSearch = Class.create();

/**
 * going to need: 
 * - url of results
 * - parameters
 * 
 * 
 * 
 * - time until 
 */

AWC.widget.LiveSearch.prototype = {
	
	timer: null,
	url: null,
	suffix: null,
	input: null,
	displaypane: null,
	
	initialize: function(input, form, parentElement, url, suffix, options) {
		this.suffix = suffix;
		this.url = url;
		this.input = input;
		
		// attach handlers to form and input
		Event.observe(input, 'keydown', AWC.util.Delegate.create(this, 'keyPress'), false);
		Event.observe(input, 'blur', AWC.util.Delegate.create(this, 'searchHide'), false);
		// Event.observe(form, 'submit', AWC.util.Delegate.create(this, 'searchRequest'), false);
		
		// disable browser autocomplete
		input.setAttribute('autocomplete', 'off');
		
		var div = document.createElement('div');
		div.setAttribute('id', 'ls-displaypane'+this.suffix);
		div.className = 'ls-displaypane';
		div.innerHTML = 'here';
		this.displaypane = div;
		
		AWC.util.Element.insertAfter(parentElement, div, input);
		Element.hide(this.displaypane);
		
	    this.options = {
	      linkname:		false
	    };
	    Object.extend(this.options, options || {});
		
	},
	
	keyPress: function() {
		var e = arguments[0];

		// handle bad/control characters to simulate expected behaviour
		switch(e.keyCode)
		{
			case 9: // tab
				this.searchStop();
				this.searchHide();
				break;
			
			case 38: // keyup
				this.searchStop();
				
				if($('ls-highlight'+this.suffix)) {
					this.highlightRow($('ls-highlight'+this.suffix).previousSibling);
				} else {
					// shadow contains results div, which contains the five rows
					this.highlightRow(this.displaypane.firstChild.firstChild.lastChild)
				}
				break;
			
			case 40: // keydown
				this.searchStop();
				
				if($('ls-highlight'+this.suffix)) {
					this.highlightRow($('ls-highlight'+this.suffix).nextSibling);
				} else {
					// shadow contains results div, which contains the five rows
					this.highlightRow(this.displaypane.firstChild.firstChild)
				}
				break;
				
			
			case 27: // escape
			case 13: // enter
				this.searchStop();
				if($('ls-highlight'+this.suffix)) {
					var highlight = $('ls-highlight'+this.suffix);
					highlight.removeAttribute('id');
					highlight.setAttribute('class', 'ls-row');
				}
				break;
				
			default:
				this.searchStart();
				break;
		}
	},
	
	highlightRow: function(element) {
		if(element == null)
			return;
			
		// var results = $('ls-displaypane');
		var rows = $A(this.displaypane.getElementsByTagName('div'));
		
		for(var i = 0; i < rows.length; i++) {
			if(rows[i].className != 'ls-results') {
				rows[i].className = 'ls-row';
				rows[i].removeAttribute('id');
			}
		}
		element.setAttribute('id', 'ls-highlight'+this.suffix);
		element.className = 'ls-row ls-highlight';
		this.input.value = element.title;
		
	},
	
	searchStop: function() {
		if(this.timer != null) {
			window.clearTimeout(this.timer);
		}
	},
	
	searchHide: function() {
		Element.hide(this.displaypane);
	},
	
	searchStart: function() {
		if(this.timer) {
			window.clearTimeout(this.timer);
		}
		this.timer = window.setTimeout(AWC.util.Delegate.create(this, 'searchRequest'), 1000);
	},
	
	searchRequest: function() {
		if(arguments[0] != null)
			Event.stop(arguments[0]);
		
		if(this.input.value == '') {
			this.searchHide();
			return;
		}
		
		var options = {
			asynchronous: true,
			method: 'get',
			parameters: { linkname : this.options.linkname },
			onSuccess: AWC.util.Delegate.create(this, 'showResult'),
			onFailure: AWC.util.Delegate.create(this, 'showFailure')
		};
		
		//var ajax = new Ajax.Request(this.url + this.input.value, options);
		// Encode search text in case of non-ascii chars
		var ajax = new Ajax.Request(this.url + encodeURI(this.input.value), options);
	},
	
	attachMouseEvents: function() {
		var links = $A(this.displaypane.getElementsByTagName('div'));
		for(var i = 0; i < links.length; i++) {
			if(links[i].className == 'ls-row')
				Event.observe(links[i], 'mouseover', AWC.util.Delegate.create(this, 'mouseOver'), false);
		}
		
		links = $A(this.displaypane.getElementsByTagName('a'));
		for(var i = 0; i < links.length; i++) {
			Event.observe(links[i], 'mouseover', AWC.util.Delegate.create(this, 'mouseOver'), false);
		}
	},
	
	mouseOver: function() {
		var event = arguments[0];
		var target = event.target || event.srcElement;
		if(target.nodeName == 'A' || target.nodeName == 'IMG')
			target = target.parent;
		this.highlightRow(target);
	},
	
	showResult: function() {
		var response = arguments[0].responseText;
		this.displaypane.innerHTML = response;
		this.attachMouseEvents();
		Element.show(this.displaypane);
	},
	
	showFailure: function() {
	}
};
