var multiCheckbox = new Class ({	
	initialize: function () {
		checkboxes = [];
		var me = this;
		last = -1;
		shift = false;

		$$ ('input.multicheckbox').each (function (checkbox) {
			checkboxes.push (checkbox);
			checkbox.addEvent ('click',  me.check);
		});
		
		document.addEvent ('keydown', function (e) {
			evt = new Event (e);
			shift = evt.shift;
		});
	},
	
	
	check: function (e) {
		var evt = new Event (e);

		for (var i = 0; i < checkboxes.length; i++)
			if (checkboxes[i] == evt.target) var pos = i;
		
		if (shift && last != -1) {
			if (pos < last) {
				var tmp = last;
				last = pos;
				pos = tmp;
			}
			last++;
			pos--;
			
			for (var i = last; i <= pos; i++) checkboxes[i].checked = !checkboxes[i].checked;
			
			last = -1;
		} else last = pos;
	},
	
	
	all: function () {
		this.toAll ('all');
	},
	
	
	none: function () {
		this.toAll ('none');
	},
	
	inverse: function () {
		this.toAll ('inverse');
	},
	
	
	toAll: function (type) {
		for (var i = 0; i < checkboxes.length; i++) {
			if (type == 'all') checkboxes[i].checked = true;
			else if (type == 'none') checkboxes[i].checked = false;
			else if (type == 'inverse') checkboxes[i].checked = !checkboxes[i].checked;
		}	
	},
	
	
	checked: function () {
		var r = 0;
		for (var i = 0; i < checkboxes.length; i++) {
			if (checkboxes[i].checked) r++;
		}
		
		return r;
	},
	
	
	unchecked: function () {
		var r = 0;
		for (var i = 0; i < checkboxes.length; i++) {
			if (!checkboxes[i].checked) r++;
		}
		
		return r;
	},
	
	
	possibilities: function () {
		return checkboxes.length;
	}
});

window.addEvent ('load', function () { a = new multiCheckbox (); });