/**
 * autocomplete.js - Category/company input autocomplete
 * 
 * Example: var autocomplete = new Autocomplete(jQuery('#categories-input'), '/lite/autocomplete/categories');
 * 
 * @author R. Coupland <richard.coupland@strategyeye.com>
 */


/**
 * Form input autocomplete
 * 
 * @param element Form input element
 * @param url AJAX 
 * @return object
 */
var Autocomplete = function(element, url) {
	var self = this;
	var $ = jQuery;

	self._cacheEnabled = true;
	
	var element = $(element);
	
	if (element.size() != 1)
		throw "Invalid value for 'element' parameter; expected 1 jQuery object, found " + element.size();
	if (typeof url != 'string')
		throw "Invalid value for 'url' parameter; expected string, found " + (typeof url);

	self._url = url;
	self._cache = {};
	self._xhr = null;

	// Handle autocomplete request
	self.doRequest = function(request, response) {
		var term = request.term;
		if (self._cacheEnabled && term in self._cache) {
			response(self._cache[term]);
			return;
		}
		self._xhr = $.getJSON(self._url, request, function(data, status, xhr) {
			self.doResponse(request, response, data, xhr);
		});
	};

	// Handle autocomplete response
	self.doResponse = function(request, response, data, xhr) {
		var term = request.term;
		self._cache[term] = data;
		if (xhr = self._xhr) {
			response(data);
		}
	};

	element.autocomplete({
		source: self.doRequest,
		minLength: 1,
		delay: 300
	});
};

