(function($) {

	var buildRating = function(obj, lock) {
	
		var rating = averageRating(obj),
			obj    = buildInterface(obj, lock),
			stars  = $("div.star", obj),
			cancel = $("div.cancel", obj)
			
		var fill = function() {
			drain();
			$("a", stars).css("width", "100%");
			$("div.star:lt(" + (stars.index(this) + 1) + ")", obj).addClass("hover");
		},

		drain = function() {
			stars.removeClass("on").removeClass("hover");
		},
		
		reset = function() {
			drain();
			$("div.star:lt(" + (rating[0]) + ")", obj).addClass("on");
			if(percent = rating[1] ? rating[1] * 10 : null) {
				stars.eq(rating[0]).addClass("on").children("a").css("width", percent + "%");
			}
		},
		
		cancelOn = function() {
			drain();
			$(this).addClass("on");
		},
		cancelOff = function() {
			reset();
			$(this).removeClass("on")
		}
		
		stars
		.hover(fill, reset).focus(fill).blur(reset)
		.click(function() {
			rating = [stars.index(this) + 1, 0];
			$.post(obj.url, { rating: rating[0], isAjaxRequest: true });
			reset();
			stars.unbind().addClass("done");
			$(this).css("cursor", "default");
			$('#ratetext').fadeOut('normal', function() {
				$(this).html('Your rating').fadeIn('slow');
				$('#article_post .average_rating').fadeIn('slow');
			});
			return false;
		});
		
		reset();
		
		if (lock) {
			stars.unbind().addClass("done");
			stars.css("cursor", "default");
		}
		
		return obj;
	}

	var buildInterface = function(form, lock) {
    	var container = $("<div></div>").attr({"title": form.title, "class": form.className});
    	$.extend(container, {url: (form.action + '?_frameset') })
    	var optGroup  = $("option", $(form));
    	var size      = optGroup.length;
    	optGroup.each(function() {
			container.append($('<div class="star"><a href="#' + this.value + '" title="' + (' Give it ' + this.value + '/' + size) + '">' + this.value + '</a></div>'));
    	});
    	$(form).after(container).remove();
    	return container;
	}

	var averageRating = function(el) {
  		return el.title.split(":")[1].split(".")
	}

	$.fn.rating = function(lock) {
		return $($.map(this, function(i) {
			return buildRating(i, lock)[0]
		}));
	}

	if ($.browser.msie) {
		try { document.execCommand("BackgroundImageCache", false, true) } catch(e) { }
	}


})(jQuery)
