/*!
* 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);