if (typeof(Magic) == 'undefined') Magic = {};

Magic.Rating = Class.create({
	initialize: function(element, options) {
		element = $(element);
		options = Object.extend({
			max: 5
		}, options || {});

		element.addClassName('selector').select('input:not([checked])').invoke('up', 'li').invoke('hide');
		var selected = element.down('input[checked]'),
			els = element.select('li'), opts = element.select('label').invoke('observe', 'click', function(e) {
				opts.invoke('writeAttribute', 'checked', false);
				selected = this.down('input').writeAttribute('checked', true);
			}).invoke('down', 'input');

		var dimensions = element.getDimensions(), 
			offset = element.cumulativeOffset(),
			box = {
				top:		offset.top, 
				right:		offset.left + dimensions.width, 
				bottom:		offset.top + dimensions.height, 
				left:		offset.left, 
				contains:	function(p) {
					return this.top < p.y && this.bottom >= p.y && this.left <= p.x && this.right > p.x;
				}
			};
		
		function select(e) {
			var x = e.pointerX() - box.left,
				rating = (x / dimensions.width * options.max).ceil();
			
			rating = rating ? rating - 1 : 0;
			var part =els.partition(function(e, idx) { return idx == rating; });
			part[0][0].show();
			part[1].invoke('hide');
		}
		
		element.observe('mouseover', function(e) {
			select(e);
		}).observe('mousemove', function(e) {
			select(e);
		}).observe('mouseout', function(e) {
			if (box.contains({ x: e.pointerX(), y: e.pointerY() })) return;
			element.select('input').reject(function(i) { return i == selected; }).invoke('up', 'li').invoke('hide');
			selected.up('li').show();
		});
	}
});