var ListBox = function(options) {

	this.END = 0;
	this.BEGIN = 1;
	this.AFTER = 2;
	this.BEFORE = 3;
	this.INSERT_OK = 0;
	this.INSERT_EMPTY = 1;
	this.INSERT_FULL = 2;
	this.INSERT_UNIQUE = 3;
	
	this.errno = 0;
	this.input = document.getElementById(options.name);
	this.output = document.getElementById(options.name+'Output');
	this.button = document.getElementById(options.name+'Insert');
	this.objects = options.value != null ? options.value : new Array();
	this.options = options;

	this.parse = function() {
		var html = '';
		for (var i=0; i<this.objects.length; i++) {
			var value = eval('this.objects[i].'+this.options.field);
			html += '<li'+(this.selected == i ? ' class="selected"': '')+
				' onclick="window.'+this.options.name+'.select('+i+');">'+value+'</li>';
		}
		if (this.button != null) {
			this.button.src = !this.full() ? 'i/listbox/tool_add.gif' : 'i/s.gif';
		}
		this.output.innerHTML = html;
		if (this.input != null) {
			this.input.value = this.objects.length > 0 ? this.objects.toJSON() : '[]';
		}
	}
	
	this.full = function() {
		return !(this.options.size == -1 || this.options.size > this.objects.length);
	}

	this.setScroll = function() {
		if (this.objects.length > 0 && this.selected > 0) {
			this.output.scrollTop = Math.floor(this.output.scrollHeight/this.objects.length*this.selected);
		} else {
			this.output.scrollTop = 0;
		}
	}

	this.oninsert = function() {
		eval(this.options.oninsert.replace(/\n/g, '\\n'));
	}

	this.onupdate = function() {
		if (this.selected >=0) {
			eval(this.options.onupdate.replace(/\n/g, '\\n'));
		}
	}

	this.insert = function(object) {
		var ok = true;
		this.errno = this.INSERT_OK;
		if (eval('object.'+this.options.field)) {
			if(this.options.size != 0){
				if (!this.full()){
					if (this.options.unique != null) {
						for (var i=0; i<this.objects.length; i++) {
							if (eval('this.objects[i].'+this.options.unique+'==object.'+this.options.unique)) {
								ok = false;
								this.errno = this.INSERT_UNIQUE;
							}
						}
					}
				} else {
					ok = false;
					this.errno = this.INSERT_FULL;
				}
			} else {
				ok = false;
				this.errno = this.INSERT_EMPTY;
			}
		} else {
			ok = false;
		}
		if (ok) {
			var clone = {};
			for (key in object) {
				eval('clone.'+key+' = object.'+key);
			}
			var objects = new Array();
			var insert = this.options.insert ? this.options.insert : 0;
			if (this.selected < 0 && insert > 1) insert -= 2;
			for (var i=0; i<=this.objects.length; i++) {
				switch (insert) {
					case this.END:
						if (i < this.objects.length) objects[objects.length] = this.objects[i];
						if (i == this.objects.length-1 || this.objects.length == 0) objects[objects.length] = clone;
						break;
					case this.BEGIN:
						if (i == 0) objects[objects.length] = clone;
						if (i < this.objects.length) objects[objects.length] = this.objects[i];
						break;
					case this.AFTER:
						if (i < this.objects.length) objects[objects.length] = this.objects[i];
						if (i == this.selected) objects[objects.length] = clone;
						break;
					case this.BEFORE:
						if (i == this.selected) objects[objects.length] = clone;
						if (i < this.objects.length) objects[objects.length] = this.objects[i];
						break;
				}
			}
			switch (insert) {
				case this.END:
					this.selected = objects.length-1;
					break;
				case this.BEGIN:
					this.selected = 0;
					break;
				case this.AFTER:
					this.selected++;
					break;
				case this.BEFORE:
					break;
			}
			this.objects = objects;
			this.parse();
			this.setScroll();
			eval(this.options.onchange.replace(/\n/g, '\\n'));
		}
		
		return this;
	}

	this.update = function(object) {
		if (this.selected >= 0) {
			var clone = {};
			for (key in object) {
				eval('clone.'+key+' = object.'+key);
			}
			this.objects[this.selected] = clone;
			this.parse();
		}
	}

	this.select = function(selected) {
		this.selected = this.selected != selected ? selected : -1;
		this.parse();
		eval(this.options.onchange.replace(/\n/g, '\\n'));
	}

	this.remove = function() {
		var objects = new Array();
		for (var i=0; i<this.objects.length; i++) {
			if (this.selected != i) {
				objects[objects.length] = this.objects[i];
			}
		}
		if (this.selected >= objects.length) {
			this.selected = objects.length-1;
		}
		this.objects = objects;
		this.parse();
		this.setScroll();
		eval(this.options.onchange.replace(/\n/g, '\\n'));
	}

	this.up = function() {
		if (this.selected > 0) {
			var object = this.objects[this.selected];
			this.objects[this.selected] = this.objects[this.selected-1];
			this.objects[this.selected-1] = object;
			this.selected--;
			this.parse();
			this.setScroll();
		}
	}

	this.down = function() {
		if (this.selected >=0 && this.selected < this.objects.length-1) {
			var object = this.objects[this.selected];
			this.objects[this.selected] = this.objects[this.selected+1];
			this.objects[this.selected+1] = object;
			this.selected++;
			this.parse();
			this.setScroll();
		}
	}

	this.parse();
	eval('window.'+options.name+'= this;');
}
