var SelectFill = Class.create( {
	
	sel: null,
	data_src: null,
	zero_name: null,	
	value: null,
	block: false,
	on_data: null,

	initialize: function(sel, dataSource, zeroName, initialValue) {
	
		// Save data in this class.
		this.sel          = $(sel);
		this.data_src     = dataSource;
		this.zero_name    = zeroName;
		this.value        = initialValue;
		this.run();		
	},
	
	update: function(dataSource) {
		if(this.data_src != dataSource)
		{
			this.value = this.sel.value;
			this.data_src     = dataSource;
			this.run();
		}
	},
	
	set: function(val) {
		this.value = val;
		for(var i = 0; i < this.sel.options.length; i++)
			if(this.sel.options[i].value == this.value)
				this.sel.options[i].selected = "selected";
	},
	
	run: function() {
		var lthis = this;
		if(this.block)
			return;
		this.block=true;
		this.sel.disabled = true;
		// Use Ajax-Request to fech autocomplete-data
		new Ajax.Request(this.data_src, {
			asynchronous: true,
			onComplete: function(trunk) {				
				lthis.handleData(trunk.responseText);					
				lthis.block=false;
				if(lthis.on_data)
					lthis.on_data();
			}
		});		
		
	},
	
	handleData: function(text) {
		var lthis = this;
		
		// Clear options
		this.sel.update();
		
		// Add header row
		if(this.zero_name)
		{
			this.sel.insert(new Element("option",  {"value": "0","class": "bold"}).update(this.zero_name));
		}
		
		this.sel.disabled = text.length < 3;
		if(this.sel.disabled)
			return;

		var data = text.evalJSON();
		
		// Add data
		for(row in data)
		{
			this.sel.insert(new Element("option", {"value" : row}).update(data[row]));
		}
		
		// Set selected
		this.set(this.value);
	}
	
});