// <!--

// creates a checkbox select menu.

_all_checkbox_selects = new Array();

function checkbox_select(name, options, lblText, lblText2) {
	if(typeof(lblText) == 'undefined') { lblText = 'Choose...'; }
	if(typeof(lblText2) == 'undefined') { lblText2 = 'Click when done...'; }
	
	// represents a checkbox select dropdown thinger.
	var self = this;
	self.element = document.createElement("div");
	self.element.className = "cbs";
	self.element.myObject = self;
	self.name = name;

	self.label = document.createElement("div");
	self.label.className = "cbslabel";
	self.label.innerHTML = lblText;
	self.text1 = lblText;
	self.text2 = lblText2;

	self.menu = document.createElement("div");
	self.menu.className = "cbsm"
	self.menu_visible = false;

	self.show_menu = function() {
		if(!self.menu_visible) {
			self.menu.style.display = "block";
			self.menu_visible = true;
			self.label.innerHTML = self.format_value();
			self.label.className = "cbslabel2";
			for(var k = 0; k < _all_checkbox_selects.length; k++) {
				if(_all_checkbox_selects[k] == self) continue;
				_all_checkbox_selects[k].hide_menu();
			}
		}
	}

	self.hide_menu = function() {
		if(self.menu_visible) {
			self.menu.style.display = "none";
			self.menu_visible = false;
			self.label.innerHTML = self.format_value();
			self.label.className = "cbslabel";
			self._set_value();
			if(self.old_value != self.value)
				self._on_change();
		}
	}

	// when the dropdown thinger is clicked, show the options...
	self.handle_click = function() {
		if(self.menu_visible) self.hide_menu();
		else if(self.options.length > 0) self.show_menu(); // don't show it if there's no items
	}

	/**
	 * Set the "value" property from the UI elements. NOT FOR PUBLIC CONSUMPTION.
	 */
	self._set_value = function() {
		self.old_value = self.value;
		self.value = "";
		for(var k = 0; k < self.options.length; k++) {
			if(self.options[k].checked) {
				self.value += self.options[k].name + ":";
			}
		}
		if(self.value.length > 0) {
			self.value = self.value.substr(0, self.value.length - 1);
		}
		Noise("cbmenu: set value "+self.value);
	}

	self._on_change = function() {
		for(var k = 0; k < self.change_handlers.length; k++) {
			self.change_handlers[k](self);
		}
	}

	self.format_value = function() {
		var s = '';
		for(var k = 0; k < self.options.length; k++) {
			if(self.options[k].checked) {
				s += self.options[k].myTitle + ", ";
			}
		}
		if(s.length == 0) {
			s = self.menu_visible ? self.text2 : self.text1;
		} else {
			s = s.substr(0, s.length - 2);
			if(s.length >= 40) {
				s = s.substr(0, 37) + "...";
			}
		}
		return s;
	}

	self.set_options = function(opts) {
		var old_value = self.value;
		Noise("old value: "+old_value);
		self.clear_options();
		for(var j = 0; j < opts.length; j++) {
			var menu_item = document.createElement("div");
			menu_item.className = "cbsmi";
			
			var cb = document.createElement("input");
			cb.type = "checkbox";
			cb.name = self.name+"_"+opts[j].id;
			cb.myTitle = opts[j].name;
			cb.checked = false;

			menu_item.myCheckbox = cb;
			add_event_handler(menu_item, 'click', function(eva) { 
				var tgt = null;
				var ev = window.event || eva;
				if(window.event) { tgt = ev.srcElement; } 
				else { tgt = ev.target; } // non-IE
				if(tgt.tagName.toLowerCase() == "input") return(true);
				while(tgt && !tgt.myCheckbox) 
					tgt = tgt.parentNode;
				tgt.myCheckbox.checked = ! tgt.myCheckbox.checked;
				return false;
			});

			var label = document.createElement("span");
			label.innerHTML = opts[j].name;
			
			menu_item.appendChild(cb);
			menu_item.appendChild(label);
			
			self.menu.appendChild(menu_item);
			self.options.push(cb);
			self.options_by_id[opts[j].id] = cb;
		}
		self.set_value(old_value);
	}

	/**
	 * Set the value. Can either take a value string as we usually format
	 * or an array of integer IDs.
	 */
	self.set_value = function(v) {
		var k, arr=null;
		for(k = 0; k < self.options.length; k++) {
			self.options[k].checked = false;
		}
		switch(typeof v) {
			case 'undefined': case 'null': break;
			case 'string':
				var vs = v.split(/:/);
				arr = new Array();
				var re = new RegExp(self.name+"_(\\d+)");
				for(k = 0; k < vs.length; k++) {
					var m = re.exec(vs[k]);
					if(m != null) {
						Noise("checking task "+m[1]);
						arr.push(parseInt(m[1]));
					}
				}
				break;
			case 'Array':
				arr = v;
				break;
		}
		if(arr != null) {
			for(k = 0; k < arr.length; k++) {
				if(typeof self.options_by_id[arr[k]] != 'undefined') {
					self.options_by_id[arr[k]].checked = true;
				}
			}
		}
		self._set_value();
	}

	self.clear_options = function() {
		self.menu.innerHTML = "";
		self.options = new Array();
		self.options_by_id = new Array();
		self.value = "";
	}

	self.set_labels = function(hidText, visText) {
		self.text1 = hidText;
		self.text2 = visText;
		self.label.innerHTML = self.format_value();
	}

	var eunder = document.createElement("div");
	eunder.className = "cbsm_under";
	eunder.appendChild(self.menu);

	self.element.appendChild(self.label);
	self.element.appendChild(eunder);
	self.set_options(options);
	self.change_handlers = new Array();
	self.old_value = null;
	self.value = "";
	
	add_event_handler(self.label, 'click', self.handle_click);
	_all_checkbox_selects.push(self);	
	return self;
}

function normal_select(name, options) {
	// represents a checkbox select dropdown thinger.
	var self = this;
	self.element = document.createElement("select");
	self.element.name = name;
	self.element.className = "ns";
	self.element.myObject = self;

	self.set_options = function(opts) {
		self.clear_options();
		for(var j = 0; j < options.length; j++) {
			var menu_item = document.createElement("option");
			menu_item.className = "nsmi";
			
			menu_item.value = options[j].id;
			menu_item.innerHTML = options[j].name;
			
			self.element.appendChild(menu_item);
		}
	}

	self.clear_options = function() {
		self.element.innerHTML = "";		
	}

	self.set_options(options);
	
	return self;
}

// -->
