$jq.rating = {
	cancel : "Cancel Rating",
	cancelValue : "",
	split : 0,
	widthKeepAttrName:"",//Added this attribute for keep width when the rating div was hidden (by zhuzhuzhen)
	groups : {},
	event : {
		fill : function(n, el, settings, state) {
			this.drain(n);
			$jq(el).prevAll(".star_group_" + n).andSelf().addClass("star_"
					+ (state || "hover"));
			var lnk = $jq(el).children("a");
			val = lnk.text();
			if (settings.focus) {
				settings.focus.apply($jq.rating.groups[n].valueElem[0], [val,
						lnk[0]])
			}
		},
		drain : function(n, el, settings) {
			$jq.rating.groups[n].valueElem.siblings(".star_group_" + n)
					.removeClass("star_on").removeClass("star_hover")
		},
		reset : function(n, el, settings) {
			if (!$jq($jq.rating.groups[n].current).is(".cancel")) {
				$jq($jq.rating.groups[n].current).prevAll(".star_group_" + n)
						.andSelf().addClass("star_on")
			}
			var lnk = $jq(el).children("a");
			val = lnk.text();
			if (settings.blur) {
				settings.blur.apply($jq.rating.groups[n].valueElem[0], [val,
						lnk[0]])
			}
		},
		click : function(n, el, settings) {
			$jq.rating.groups[n].current = el;
			var lnk = $jq(el).children("a");
			val = lnk.text();
			$jq.rating.groups[n].valueElem.val(val);
			$jq.rating.event.drain(n, el, settings);
			$jq.rating.event.reset(n, el, settings);
			if (settings.callback) {
				settings.callback.apply($jq.rating.groups[n].valueElem[0], [
						val, lnk[0]])
			}
		}
	}
};
$jq.fn.rating = function(instanceSettings) {
	if (this.length == 0) {
		return this
	}
	instanceSettings = $jq.extend({}, $jq.rating, instanceSettings || {});
	var firsttime = true;
	this.each(function(i) {
		var settings = $jq.extend({}, instanceSettings || {}, ($jq.metadata
				? $jq(this).metadata()
				: ($jq.meta ? $jq(this).data() : null))
				|| {});
		var n = this.name;
		if (firsttime) {
			$jq.rating.groups[n] = null;
			firsttime = false
		}
		if (!$jq.rating.groups[n]) {
			$jq.rating.groups[n] = {
				count : 0
			}
		}
		i = $jq.rating.groups[n].count;
		$jq.rating.groups[n].count++;
		$jq.rating.groups[n].readOnly = $jq.rating.groups[n].readOnly
				|| settings.readOnly || $jq(this).attr("disabled");
		if (i == 0) {
			$jq.rating.groups[n].valueElem = $jq('<input type="hidden" name="'
					+ n + '" value=""'
					+ (settings.readOnly ? ' disabled="disabled"' : "") + ">");
			$jq(this).before($jq.rating.groups[n].valueElem);
			if ($jq.rating.groups[n].readOnly || settings.required) {
			} else {
				$jq(this).before($jq('<div class="cancel"><a title="'
						+ settings.cancel + '">' + settings.cancelValue
						+ "</a></div>").mouseover(function() {
					$jq.rating.event.drain(n, this, settings);
					$jq(this).addClass("star_on")
				}).mouseout(function() {
					$jq.rating.event.reset(n, this, settings);
					$jq(this).removeClass("star_on")
				}).click(function() {
					$jq.rating.event.click(n, this, settings)
				}))
			}
		}
		eStar = $jq('<div class="star"><a title="' + (this.title || this.value)
				+ '">' + this.value + "</a></div>");
		$jq(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($jq(eStar).width()
					/ settings.split);
/**Added determine the 'widthKeepAttrName' is empty .(by zhuzhenhua)*/
if(settings.widthKeepAttrName != ""){
	if(spw <= 0){
		spw = parseInt(window[settings.widthKeepAttrName]);
	}else{
		window[settings.widthKeepAttrName] = spw;
	}
}

			$jq(eStar).width(spw).find("a").css({
				"margin-left" : "-" + (spi * spw) + "px"
			})
		}

		$jq(eStar).addClass("star_group_" + n);
		if ($jq.rating.groups[n].readOnly) {
			$jq(eStar).addClass("star_readonly")
		} else {
			$jq(eStar).addClass("star_live").mouseover(function() {
				$jq.rating.event.drain(n, this, settings);
				$jq.rating.event.fill(n, this, settings, "hover")
			}).mouseout(function() {
				$jq.rating.event.drain(n, this, settings);
				$jq.rating.event.reset(n, this, settings)
			}).click(function() {
				$jq.rating.event.click(n, this, settings)
			})
		}
		if (this.checked) {
			$jq.rating.groups[n].current = eStar
		}
		$jq(this).remove();
		if (i + 1 == this.length) {
			$jq.rating.event.reset(n, this, settings)
		}
	});
	for (n in $jq.rating.groups) {
		(function(c, v, n) {
			if (!c) {
				return
			}
			$jq.rating.event.fill(n, c, instanceSettings || {}, "on");
			$jq(v).val($jq(c).children("a").text())
		})($jq.rating.groups[n].current, $jq.rating.groups[n].valueElem, n)
	}
	return this
};
$jq(function() {
	$jq("input[@type=radio].star").rating()
});