/*! * jQuery Raty - A Star Rating Plugin * * Licensed under The MIT License * * @version 2.5.2 * @author Washington Botelho * @documentation wbotelhos.com/raty * */ ;(function (b) { var a = { init: function (c) { return this.each(function () { a.destroy.call(this); this.opt = b.extend(true, {}, b.fn.raty.defaults, c); var e = b(this), g = ["number", "readOnly", "score", "scoreName"]; a._callback.call(this, g); if (this.opt.precision) { a._adjustPrecision.call(this); } this.opt.number = a._between(this.opt.number, 0, this.opt.numberMax); this.opt.path = this.opt.path || ""; if (this.opt.path && this.opt.path.slice(this.opt.path.length - 1, this.opt.path.length) !== "/") { this.opt.path += "/"; } this.stars = a._createStars.call(this); this.score = a._createScore.call(this); a._apply.call(this, this.opt.score); var f = this.opt.space ? 4 : 0, d = this.opt.width || (this.opt.number * this.opt.size + this.opt.number * f); if (this.opt.cancel) { this.cancel = a._createCancel.call(this); d += (this.opt.size + f); } if (this.opt.readOnly) { a._lock.call(this); } else { e.css("cursor", "pointer"); a._binds.call(this); } if (this.opt.width !== false) { e.css("width", d); } a._target.call(this, this.opt.score); e.data({settings: this.opt, raty: true}); }); }, _adjustPrecision: function () { this.opt.targetType = "score"; this.opt.half = true; }, _apply: function (c) { if (c && c > 0) { c = a._between(c, 0, this.opt.number); this.score.val(c); } a._fill.call(this, c); if (c) { a._roundStars.call(this, c); } }, _between: function (e, d, c) { return Math.min(Math.max(parseFloat(e), d), c); }, _binds: function () { if (this.cancel) { a._bindCancel.call(this); } a._bindClick.call(this); a._bindOut.call(this); a._bindOver.call(this); }, _bindCancel: function () { a._bindClickCancel.call(this); a._bindOutCancel.call(this); a._bindOverCancel.call(this); }, _bindClick: function () { var c = this, d = b(c); c.stars.on("click.raty", function (e) { c.score.val((c.opt.half || c.opt.precision) ? d.data("score") : this.alt); if (c.opt.click) { c.opt.click.call(c, parseFloat(c.score.val()), e); } }); }, _bindClickCancel: function () { var c = this; c.cancel.on("click.raty", function (d) { c.score.removeAttr("value"); if (c.opt.click) { c.opt.click.call(c, null, d); } }); }, _bindOut: function () { var c = this; b(this).on("mouseleave.raty", function (d) { var e = parseFloat(c.score.val()) || undefined; a._apply.call(c, e); a._target.call(c, e, d); if (c.opt.mouseout) { c.opt.mouseout.call(c, e, d); } }); }, _bindOutCancel: function () { var c = this; c.cancel.on("mouseleave.raty", function (d) { b(this).attr("src", c.opt.path + c.opt.cancelOff); if (c.opt.mouseout) { c.opt.mouseout.call(c, c.score.val() || null, d); } }); }, _bindOverCancel: function () { var c = this; c.cancel.on("mouseover.raty", function (d) { b(this).attr("src", c.opt.path + c.opt.cancelOn); c.stars.attr("src", c.opt.path + c.opt.starOff); a._target.call(c, null, d); if (c.opt.mouseover) { c.opt.mouseover.call(c, null); } }); }, _bindOver: function () { var c = this, d = b(c), e = c.opt.half ? "mousemove.raty" : "mouseover.raty"; c.stars.on(e, function (g) { var h = parseInt(this.alt, 10); if (c.opt.half) { var f = parseFloat((g.pageX - b(this).offset().left) / c.opt.size), j = (f > 0.5) ? 1 : 0.5; h = h - 1 + j; a._fill.call(c, h); if (c.opt.precision) { h = h - j + f; } a._roundStars.call(c, h); d.data("score", h); } else { a._fill.call(c, h); } a._target.call(c, h, g); if (c.opt.mouseover) { c.opt.mouseover.call(c, h, g); } }); }, _callback: function (c) { for (i in c) { if (typeof this.opt[c[i]] === "function") { this.opt[c[i]] = this.opt[c[i]].call(this); } } }, _createCancel: function () { var e = b(this), c = this.opt.path + this.opt.cancelOff, d = b("", { src: c, alt: "x", title: this.opt.cancelHint, "class": "raty-cancel" }); if (this.opt.cancelPlace == "left") { e.prepend(" ").prepend(d); } else { e.append(" ").append(d); } return d; }, _createScore: function () { return b("", {type: "hidden", name: this.opt.scoreName}).appendTo(this); }, _createStars: function () { var e = b(this); for (var c = 1; c <= this.opt.number; c++) { var f = a._getHint.call(this, c), d = (this.opt.score && this.opt.score >= c) ? "starOn" : "starOff"; d = this.opt.path + this.opt[d]; b("", {src: d, alt: c, title: f}).appendTo(this); if (this.opt.space) { e.append((c < this.opt.number) ? " " : ""); } } return e.children("img"); }, _error: function (c) { b(this).html(c); b.error(c); }, _fill: function (d) { var m = this, e = 0; for (var f = 1; f <= m.stars.length; f++) { var g = m.stars.eq(f - 1), l = m.opt.single ? (f == d) : (f <= d); if (m.opt.iconRange && m.opt.iconRange.length > e) { var j = m.opt.iconRange[e], h = j.on || m.opt.starOn, c = j.off || m.opt.starOff, k = l ? h : c; if (f <= j.range) { g.attr("src", m.opt.path + k); } if (f == j.range) { e++; } } else { var k = l ? "starOn" : "starOff"; g.attr("src", this.opt.path + this.opt[k]); } } }, _getHint: function (d) { var c = this.opt.hints[d - 1]; return (c === "") ? "" : (c || d); }, _lock: function () { var d = parseInt(this.score.val(), 10), c = d ? a._getHint.call(this, d) : this.opt.noRatedMsg; b(this).data("readonly", true).css("cursor", "").attr("title", c); this.score.attr("readonly", "readonly"); this.stars.attr("title", c); if (this.cancel) { this.cancel.hide(); } }, _roundStars: function (e) { var d = (e - Math.floor(e)).toFixed(2); if (d > this.opt.round.down) { var c = "starOn"; if (this.opt.halfShow && d < this.opt.round.up) { c = "starHalf"; } else { if (d < this.opt.round.full) { c = "starOff"; } } this.stars.eq(Math.ceil(e) - 1).attr("src", this.opt.path + this.opt[c]); } }, _target: function (f, d) { if (this.opt.target) { var e = b(this.opt.target); if (e.length === 0) { a._error.call(this, "Target selector invalid or missing!"); } if (this.opt.targetFormat.indexOf("{score}") < 0) { a._error.call(this, 'Template "{score}" missing!'); } var c = d && d.type == "mouseover"; if (f === undefined) { f = this.opt.targetText; } else { if (f === null) { f = c ? this.opt.cancelHint : this.opt.targetText; } else { if (this.opt.targetType == "hint") { f = a._getHint.call(this, Math.ceil(f)); } else { if (this.opt.precision) { f = parseFloat(f).toFixed(1); } } if (!c && !this.opt.targetKeep) { f = this.opt.targetText; } } } if (f) { f = this.opt.targetFormat.toString().replace("{score}", f); } if (e.is(":input")) { e.val(f); } else { e.html(f); } } }, _unlock: function () { b(this).data("readonly", false).css("cursor", "pointer").removeAttr("title"); this.score.removeAttr("readonly", "readonly"); for (var c = 0; c < this.opt.number; c++) { this.stars.eq(c).attr("title", a._getHint.call(this, c + 1)); } if (this.cancel) { this.cancel.css("display", ""); } }, cancel: function (c) { return this.each(function () { if (b(this).data("readonly") !== true) { a[c ? "click" : "score"].call(this, null); this.score.removeAttr("value"); } }); }, click: function (c) { return b(this).each(function () { if (b(this).data("readonly") !== true) { a._apply.call(this, c); if (!this.opt.click) { a._error.call(this, 'You must add the "click: function(score, evt) { }" callback.'); } this.opt.click.call(this, c, {type: "click"}); a._target.call(this, c); } }); }, destroy: function () { return b(this).each(function () { var d = b(this), c = d.data("raw"); if (c) { d.off(".raty").empty().css({cursor: c.style.cursor, width: c.style.width}).removeData("readonly"); } else { d.data("raw", d.clone()[0]); } }); }, getScore: function () { var d = [], c; b(this).each(function () { c = this.score.val(); d.push(c ? parseFloat(c) : undefined); }); return (d.length > 1) ? d : d[0]; }, readOnly: function (c) { return this.each(function () { var d = b(this); if (d.data("readonly") !== c) { if (c) { d.off(".raty").children("img").off(".raty"); a._lock.call(this); } else { a._binds.call(this); a._unlock.call(this); } d.data("readonly", c); } }); }, reload: function () { return a.set.call(this, {}); }, score: function () { return arguments.length ? a.setScore.apply(this, arguments) : a.getScore.call(this); }, set: function (c) { return this.each(function () { var e = b(this), f = e.data("settings"), d = b.extend({}, f, c); e.raty(d); }); }, setScore: function (c) { return b(this).each(function () { if (b(this).data("readonly") !== true) { a._apply.call(this, c); a._target.call(this, c); } }); } }; b.fn.raty = function (c) { if (a[c]) { return a[c].apply(this, Array.prototype.slice.call(arguments, 1)); } else { if (typeof c === "object" || !c) { return a.init.apply(this, arguments); } else { b.error("Method " + c + " does not exist!"); } } }; b.fn.raty.defaults = { cancel: false, cancelHint: "Cancel this rating!", cancelOff: "cancel-off.png", cancelOn: "cancel-on.png", cancelPlace: "left", click: undefined, half: false, halfShow: true, hints: ["bad", "poor", "regular", "good", "gorgeous"], iconRange: undefined, mouseout: undefined, mouseover: undefined, noRatedMsg: "Not rated yet!", number: 5, numberMax: 20, path: "", precision: false, readOnly: false, round: {down: 0.25, full: 0.6, up: 0.76}, score: undefined, scoreName: "score", single: false, size: 16, space: true, starHalf: "star-half.png", starOff: "star-off.png", starOn: "star-on.png", target: undefined, targetFormat: "{score}", targetKeep: false, targetText: "", targetType: "hint", width: undefined }; })(jQuery);