function TreeSelect() {

	this.data = new Object();
	this.data.entries = new Array();

	this.orphans = new Array();

	this.add = function(id, pid, value, text, selected) {
		var e = new Object();
		e.id = id;
		e.pid = pid;
		e.value = value;
		e.text = text;
		e.selected = selected;
		e.level = -1;

		var r = this.addEntry(e);
		if (typeof(r) != 'object') {
			this.orphans[this.orphans.length] = e;
		}
	};

	this.addEntry = function(e) {
		var addSucc = false;
		if (e.pid <= -1) {
			e.level = 0;
			this.data.entries[this.data.entries.length] = e;
			addSucc = true;
		} else {
			var de = this.lookup(this.data.entries, e.pid);
			if (typeof(de) == 'object') {
				e.level = de.level + 1;
				if (typeof(de.entries) == 'object') {
					de.entries[de.entries.length] = e;
				} else {
					de.entries = new Array();
					de.entries[0] = e;
				}
				addSucc = true;
			}
		}
		if (addSucc){
			return e;
		}
	};

	this.lookup = function(entries, id) {
		if (typeof(entries) == 'object' && entries.length > 0) {
			for (i in entries) {
				var e = entries[i];
				if (id == e.id){
					return e;
				} else {
					e = this.lookup(e.entries, id);
					if (typeof(e) == 'object'){
						return e;
					}
				}
			}
		}
	};

	this.cleanOrphans = function() {
		var n;
		var newOrphans;
		do {
			n = 0;
			newOrphans = new Array();
			var e;
			while (typeof(e = this.orphans.shift()) == 'object'){
				if (typeof(this.addEntry(e)) == 'object'){
					n++;
				} else {
					newOrphans[newOrphans.length] = e;
				}
			}
			this.orphans = newOrphans;
		} while (n > 0);
	};

	this.printEntry = function(entries, path, pre) {
		var r = "";
		if (typeof(entries) == 'object' && entries.length > 0) {
			entries.sort(this.sortBy);
			for (i in entries) {
				var e = entries[i];
				r += "<option value=\"" + e.value + "\"";
				if (e.selected == 1){
					r += " selected=\"selected\"";
				}
				r += ">";
				r += pre;
				for (var j=0;j<e.level;j++) {
					r += path;
				}
				r += e.text;
				r += "</option>\n";
				r += this.printEntry(e.entries, path, pre);
			}
		}
		return r;
	};

	this.toString = function() {
		if (this.orphans.length > 0){
			this.cleanOrphans();
		}
		return this.printEntry(this.data.entries, "&nbsp;&nbsp;", "") + this.printEntry(this.orphans, "", "*");
	};

	this.sortBy = function(a, b) {
		return a.id - b.id;
	};
}
