/**
 * RadioList is a OL or UL element with one and only one LI item having a 'selected' class.
 * Clicking on LIs selects them by assigning them 'selected' class, and deselects 
 * the previously selected LI. A callback function can be assigned through 'options.onChange' parameter.
 *
 * Usage:
 *
 * <ul id="menu">
 *   <li class="selected">Borschtsch</li>
 *   <li>Bliny</li>
 *   <li>Pelmeni</li>
 * </ul>
 *
 * new RadioList("menu", {
 *   onClick: function(selected) {
 *     // Do something with selected LI. 
 *   }
 * });
 *
 * @author Stepan Stolyarov 
 */
var RadioList = Class.create({

	initialize: function(listElement) {
		var e = Prototype.emptyFunction;
		this.config = Object.extend({
			multiSelect: false,
			onChange: e
		}, arguments[1] || { });
		
		this.list = $(listElement);
		this.selected = this.list.down('.selected');
		
		this.list.observe('click', this.handleClick.bindAsEventListener(this));
	},

	handleClick: function(event) {
		var element = Event.element(event);

		if (element.tagName.toLowerCase() == 'a') {
			Event.stop(event);
		}

		if (element.tagName.toLowerCase() != 'li') {
			element = element.up('li');
		}

		if (element != null) {
			this.select(element);
		}
	},
	
	select: function(element, bSelect) {
		element = $(element);
		if (this.config.multiSelect) {
			this.selected = (element.hasClassName('selected') && !bSelect) ?  element.removeClassName('selected') : element.addClassName('selected');
		} else {
			this.list.select('li').invoke('removeClassName', 'selected');
			this.selected = element.addClassName('selected');
		}

		this.config.onChange(this.selected);
	},
	
	addItem: function(item, bSelect) {
		if (item.tagName.toLowerCase() != 'li') return null;
		this.list.insert(item);
		if (bSelect) {
			this.select(item, bSelect);
		}		
		return item;
	},
	
	selectAll: function() {
		if (!this.config.multiSelect) return false;
		this.list.select('li').invoke('addClassName', 'selected');
		this.selected = this.list.down('.selected');
	},
	
	deselectAll: function() {
		if (!this.config.multiSelect) return false;
		this.list.select('li').invoke('removeClassName', 'selected');
		this.selected = null;
	},
	
	getSelected: function() {
		return this.list.select('li.selected');
	}
});

if (Object.isUndefined(eRabota)) { var eRabota = { } };
if (Object.isUndefined(eRabota.Controls)) { eRabota.Controls = { } };
eRabota.Controls.RadioList = RadioList;

