(function($) {
	$.rating_manager = function(selector, hover_class) {
		this.selector = selector;
		this.hover_class = hover_class;
		this.locked = false;
		this.clean_at = 0;
	};
	
	$.rating_manager.prototype = {
		default_at: function(pos) {
			this.clean_at = pos;
			this.set_at(pos);
			
			return this;
		},
		
		clean: function() {
			return this.set_at(this.clean_at);
		},
		
		set_at: function(pos) {
			this.selector.removeClass(this.hover_class);
			
			return this.selector.slice(0, pos + 1).addClass(this.hover_class);
		},
		
		lock_at: function(pos) {
			this.set_at(pos);
			this.locked = true;
			
			return this;
		}
	};
	
	$.fn.rating = function(callback, hover_class) {
		var p = 0;
		
		var manager = new $.rating_manager(this, hover_class);
		
		this.each(function() {
			var el = $(this);
			
			el.hover((function() {
				var x = p;
				
				return function() {
					if (manager.locked) return;
					
					manager.set_at(x);
				}
			})(), function() {
				if (manager.locked) return;
				
				manager.clean();
			});
			
			el.click((function() {
				var x = p;
				
				return function() {
					callback.call(manager, x, this);
					
					return false;
				}
			})());
			
			p++;
		});
		
		return manager;
	}
})(jQuery);