jQuery.fn.rating = function(opts){

	var s = {
		maxValue: 10,
		curValue: 0,
		cancel: true,
		onclick: function(){}
	};
	jQuery.extend(s, opts || {});

	var con = this;
	
	if (s.maxValue == 1)
		s.cancel = false;
	else
		con.append('<div class="cancel"><a href="#" title="Cancel Rating">Cancel Rating</a></div>');

	for (var i = 1; i <= s.maxValue; i++)
		jQuery('<div class="star"><a href="#" title="Give it '+i+'/'+s.maxValue+'">'+i+'</a></div>').addClass('star-'+(i%2?'left':'right')).appendTo(con);

	var stars = con.children('.star');

	var e = {
		fill: function(el){
			var i = stars.index(el) + 1;
			stars.children('a').css('width', '100%');
			stars.slice(0, i).addClass('hover');
		},
		drain: function(){
			stars.removeClass('on');
			stars.removeClass('hover');
		},
		reset: function(){
			stars.slice(0, s.curValue).addClass('on');
		}
	};    
	e.reset();

	stars.hover(function(){
		e.drain();
		e.fill(this);
	}, function(){
		e.drain();
		e.reset();
	}).focus(function(){
		e.drain();
		e.fill(this);
	}).blur(function(){
		e.drain();
		e.reset();
	}).click(function(){
		if (s.cancel)
			s.curValue = stars.index(this) + 1;
		else {
			s.curValue = (s.curValue == 0) ? 1 : 0;
			jQuery(this).toggleClass('on');
		}
		s.onclick(s.curValue);
		return false;
	});

	con.children('.cancel').hover(function(){
		e.drain();
		jQuery(this).addClass('on');
	}, function(){
		e.reset();
		jQuery(this).removeClass('on');
	}).focus(function(){
		e.drain();
		jQuery(this).addClass('on');
	}).blur(function(){
		e.reset();
		jQuery(this).removeClass('on');
	}).click(function(){
		e.drain();
		s.curValue = 0;
		s.onclick(s.curValue);
		return false;
	});

	return this;	
};