
if (jQuery)(function ($) {
	$.rating = {
		cancel: 'Cancel Rating',
		cancelValue: '',
		half: false,
		split: 0,
		required: true,
		readOnly: false,
		groups: {},
		event: {
			fill: function (n, el, state) {
				this.drain(n);
				$(el).prevAll('.star').andSelf().addClass('star_' + (state || 'hover'))
			},
			drain: function (n, el, settings) {
				$($.rating.groups[n].valueElem).siblings('.star').removeClass('star_on').removeClass('star_hover')
			},
			reset: function (n, el, settings) {
				if (!$($.rating.groups[n].current).is('.cancel')) $($.rating.groups[n].current).prevAll('.star').andSelf().addClass('star_on')
			},
			click: function (n, el, settings) {
				$.rating.groups[n].current = el;
				var curValue = $(el).children('a').text();
				$($.rating.groups[n].valueElem).val(curValue);
				$.rating.event.drain(n);
				$.rating.event.reset(n);
				if (settings.callback) settings.callback.apply($.rating.groups[n].valueElem, [curValue, el])
			}
		}
	};
	$.fn.rating = function (instanceSettings) {
		if (this.length == 0) return this;
		instanceSettings = $.extend({},
		$.rating, instanceSettings || {});
		this.each(function (i) {
			var settings = $.extend({},
			instanceSettings || {},
			($.metadata ? $(this).metadata() : ($.meta ? $(this).data() : null)) || {});
			var n = this.name;
			if (!$.rating.groups[n]) $.rating.groups[n] = {
				count: 0
			};
			i = $.rating.groups[n].count;
			$.rating.groups[n].count++;
			$.rating.groups[n].readOnly = $.rating.groups[n].readOnly || settings.readOnly || $(this).attr('disabled');
			if (i == 0) {
				$.rating.groups[n].valueElem = $('<input type="hidden" name="' + n + '" value=""' + (settings.readOnly ? ' disabled="disabled"': '') + '>');
				$(this).before($.rating.groups[n].valueElem);
				if ($.rating.groups[n].readOnly || settings.required) {} else {
					$(this).before($('<div class="cancel"><a title="' + settings.cancel + '">' + settings.cancelValue + '</a></div>').mouseover(function () {
						$.rating.event.drain(n, this, settings);
						$(this).addClass('star_on')
					}).mouseout(function () {
						$.rating.event.reset(n, this, settings);
						$(this).removeClass('star_on')
					}).click(function () {
						$.rating.event.click(n, this, settings)
					}))
				}
			};
			eStar = $('<div class="star"><a title="' + (this.title || this.value) + '">' + this.value + '</a></div>');
			$(this).after(eStar);
			if (settings.half) settings.split = 2;
			if (typeof settings.split == 'number' && settings.split > 0) {
				var spi = (i % settings.split),
				spw = Math.floor($(eStar).width() / settings.split);
				$(eStar).width(spw).find('a').css({
					'margin-left': '-' + (spi * spw) + 'px'
				})
			};
			if ($.rating.groups[n].readOnly) {
				$(eStar).addClass('star_readonly')
			} else {
				$(eStar).mouseover(function () {
					$.rating.event.drain(n, this, settings);
					$.rating.event.fill(n, this, 'hover')
				}).mouseout(function () {
					$.rating.event.drain(n, this, settings);
					$.rating.event.reset(n, this, settings)
				}).click(function () {
					$.rating.event.click(n, this, settings)
				})
			};
			if (this.checked) $.rating.groups[n].current = eStar;
			$(this).remove();
			if (i + 1 == this.length) $.rating.event.reset(n, this, settings)
		});
		for (n in $.rating.groups)(function (c, v, n) {
			if (!c) return;
			$.rating.event.fill(n, c, 'on');
			$(v).val($(c).children('a').text())
		})($.rating.groups[n].current, $.rating.groups[n].valueElem, n);
		return this
	}
})(jQuery);