var SimpleComplete = new Class({
	Implements: Options,
	
	oCompleteEl: null,
	oRequest: null,
	aExtraData: null,
	
	options: {
		'afterComplete': function(){},
		'url': false,
		'fieldName': false,
		'minLength': 3,
		'returnKey': false
	},
	
	initialize: function(oCompleteEl, options){
		this.oCompleteEl = $(oCompleteEl);
		this.setOptions(options);
		
		this.build();
	},
	
	build: function(){
		var o_this = this;
		this.oCompleteEl.addEvent('keyup', function(oEvent){
			if (o_this.oRequest !== null){
				o_this.oRequest.cancel();
			}
			
			if (o_this.options.fieldName === false){
				return;
			}
			
			// don't mess with backspace
			switch (oEvent.code){
				case 8: // backspace
				case 46: // delete
				case 37: // left
				case 39: // right
					return;
			}
			
			var s_value = oEvent.target.get('value');
			if (s_value.length < o_this.options.minLength){
				return;
			}
			var s_fieldname = o_this.options.fieldName;
			
			var a_data = $H();
			if (o_this.aExtraData !== null){
				a_data = $H(o_this.aExtraData);
			}
			
			a_data[s_fieldname] = s_value;
			o_this.oRequest = new Request.JSON({
				'url': o_this.options.url,
				'method': 'post',
				'data': a_data.toQueryString(),
				'onComplete': (o_this.HandleResponse).bind(o_this)
			}).send();
		});
	},
	
	HandleResponse: function(oResponse){
		if (oResponse.length > 0){
			var m_item = oResponse[0];
			if (typeof m_item == 'object'){
				m_item = $H(m_item);
				if (this.options.returnKey !== false && m_item.has(this.options.returnKey)){
					m_item = m_item[this.options.returnKey];
				} else {
					m_item = m_item.getValues()[0];
				}
			}
		
			// determine selected part
			var i_pre_length = this.oCompleteEl.get('value').length;
			this.oCompleteEl.set('value', m_item);
			this.oCompleteEl.selectRange(i_pre_length, this.oCompleteEl.get('value').length);
		}
		
		if (typeof this.options.afterComplete == 'function'){
			this.options.afterComplete(oResponse);
		}
	},
	
	SetExtraData: function(aData){
		this.aExtraData = aData;
	}
});