jQuery.fn.rating = function(url, options) {
	if(url == null) return;

	var settings = {
		url : url,
		increment : 1,
		maxvalue  : 5,
		curvalue  : 0
	};
	
	if(options) {
		jQuery.extend(settings, options);
	};

	jQuery.extend(settings, {cancel: (settings.maxvalue > 1) ? false : false});

	var container = jQuery(this);

	jQuery.extend(container, {
		averageRating: settings.curvalue,
		url: settings.url
	});

	settings.increment = (settings.increment < .75) ? .5 : 1;

	var s = 0;
	for(var i= 0; i <= settings.maxvalue ; i++) {
		if (i == 0) {
			if(settings.cancel == true){
				var div = '<div class="cancel"><a href="#0" title="Cancel Rating">Cancel Rating</a></div>';
				container.append(div);
			}
		} else {
			var $div = $j('<div class="star"></div>').append('<a href="#' + i + '">' + i + '</a>').appendTo(container);
			if (settings.increment == .5) {
				if (s%2) {
					$div.addClass('star-left');
				} else {
					$div.addClass('star-right');
				}
			}
		}
		i = i-1+settings.increment;
		s++;
	}

	var stars = jQuery(container).children('.star');
	var cancel = jQuery(container).children('.cancel');
	var attachEvents = true;
	var cookieVal = $j.cookie(container.attr("id") + "_rating");

	if ( ($j.trim(cookieVal) != "") || ($j.trim(container.attr("title")) != "") ) {
		if (container.hasClass("finished")) {
			jQuery.extend(settings, {curvalue: container.attr("title")});
		} else {
			jQuery.extend(settings, {curvalue: cookieVal});
		}
		attachEvents = false;
		container.addClass("off");
		stars.click(function() { return false; });
	}

	if (attachEvents) {
		stars.mouseover(function() {
			event.drain();
			event.fill(this);
		}).mouseout(function(){
			event.drain();
			event.reset();
		}).focus(function(){
			event.drain();
			event.fill(this);
		}).blur(function(){
			event.drain();
			event.reset();
		});

		stars.click(function() {
			settings.curvalue = (stars.index(this) * settings.increment) + settings.increment;
			var ratingValue = jQuery(this).children('a')[0].href.split('#')[1];
			jQuery.post(
				container.url, 
				{
					"rating": ratingValue,
					"id": container.attr("id").replace("photo_", "")
				},
				function() {
					$j.cookie(container.attr("id") + "_rating", ratingValue, { expires: 7 });
					container.addClass("off");
					stars.unbind();
					stars.click(function() { return false; });
				}
			);
			return false;
		});

		// cancel button events
		if(cancel) {
			cancel.mouseover(function() {
				event.drain();
				jQuery(this).addClass('on');
			}).mouseout(function() {
				event.reset();
				jQuery(this).removeClass('on');
			}).focus(function() {
				event.drain();
				jQuery(this).addClass('on');
			}).blur(function() {
				event.reset();
				jQuery(this).removeClass('on');
			});
		
			// click events.
			cancel.click(function() {
				event.drain();
				settings.curvalue = 0;
				jQuery.post(container.url, { "rating": jQuery(this).children('a')[0].href.split('#')[1] });
				return false;
			});
		}
	}

	var event = {
		fill: function(el) { // fill to the current mouse position.
			var index = stars.index(el) + 1;
			stars.children('a').css('width', '100%').end().slice(0,index).addClass('hover').end();
		},
		drain: function() { // drain all the stars.
			stars.filter('.on').removeClass('on').end().filter('.hover').removeClass('hover').end();
		},
		reset: function() { // Reset the stars to the default index.
			stars.slice(0, settings.curvalue / settings.increment).addClass('on').end();
		}
	};
	event.reset();
	return(this);	
};