Sequenzia/lib/assets/javascripts/moe-legacy/vote-widget.js
2013-10-26 18:06:58 -05:00

164 lines
4.4 KiB
JavaScript
Executable File

VoteWidget = function(container)
{
this.container = container;
this.post_id = null;
this.displayed_hover = -1;
this.displayed_set = -1;
if(container.down(".vote-up"))
container.down(".vote-up").on("click", function(e) { e.stop(); this.vote_up(); }.bindAsEventListener(this));
var vote_descs =
{
"0": "Remove vote",
"1": "Good",
"2": "Great",
"3": "Favorite"
};
for(var stars = 0; stars <= 3; ++stars)
{
var s = this.container.down(".star-" + stars);
if(!s)
continue;
s.star = stars;
s.desc = vote_descs[stars];
}
this.container.on("click", ".star", function(e) { e.stop(); this.activate_item(e.target); }.bindAsEventListener(this));
this.container.on("mouseover", ".star", function(e) { this.set_mouseover(e.target); }.bindAsEventListener(this));
this.container.on("mouseout", ".star", function(e) { this.set_mouseover(e.relatedTarget); }.bindAsEventListener(this));
document.on("posts:update", this.post_update_event.bindAsEventListener(this));
}
VoteWidget.prototype.get_star_element = function(element)
{
if(!element)
return null;
if(element.hasClassName("star"))
return element;
else
return element.up(".star");
}
VoteWidget.prototype.set_mouseover = function(element)
{
if(element)
element = this.get_star_element(element);
if(!element)
{
this.set_stars(null);
var text = this.container.down(".vote-desc");
if(text)
text.update();
return false;
}
else
{
this.set_stars(element.star);
var text = this.container.down(".vote-desc");
if(text)
text.update(element.desc);
return true;
}
}
VoteWidget.prototype.activate_item = function(element)
{
element = this.get_star_element(element);
if(!element)
return null;
this.vote(element.star);
return element.star;
}
/* One or more posts have been updated; see if the vote we should be displaying
* has changed. */
VoteWidget.prototype.post_update_event = function(e)
{
var post_id = this.post_id;
if(e.memo.post_ids.get(post_id) == null)
return;
this.set_stars(this.displayed_hover);
if(this.container.down("#post-score-" + post_id))
{
var post = Post.posts.get(post_id);
if(post)
this.container.down("#post-score-" + post_id).update(post.score)
}
if(e.memo.resp.voted_by && this.container.down("#favorited-by")) {
this.container.down("#favorited-by").update(Favorite.link_to_users(e.memo.resp.voted_by["3"]))
}
}
VoteWidget.prototype.set_post_id = function(post_id)
{
var vote = Post.votes.get(post_id) || 0;
this.post_id = post_id;
this.set_stars(null);
}
VoteWidget.prototype.init_hotkeys = function()
{
OnKey(192, null, function(e) { this.vote(+0); return true; }.bindAsEventListener(this)); // `
OnKey(49, null, function(e) { this.vote(+1); return true; }.bindAsEventListener(this));
OnKey(50, null, function(e) { this.vote(+2); return true; }.bindAsEventListener(this));
OnKey(51, null, function(e) { this.vote(+3); return true; }.bindAsEventListener(this));
}
VoteWidget.prototype.vote_up = function()
{
var current_vote = Post.votes.get(this.post_id);
return this.vote(current_vote + 1);
}
VoteWidget.prototype.vote = function(score)
{
return Post.vote(this.post_id, score);
}
var array_select = function(list, y, n, val)
{
if(val)
list.push(y);
else
list.push(n);
}
VoteWidget.prototype.set_stars = function(hovered_vote)
{
var set_vote = Post.votes.get(this.post_id);
if(this.displayed_hover == hovered_vote && this.displayed_set == set_vote)
return;
this.displayed_hover = hovered_vote;
this.displayed_set = set_vote;
for(var star_vote = 0; star_vote <= 3; ++star_vote)
{
var star = this.container.down(".star-" + star_vote);
if(!star)
continue;
var className = star.className;
className = className.replace(/(star-hovered|star-unhovered|star-hovered-upto|star-hovered-after|star-set|star-unset|star-set-upto|star-set-after)(\s+|$)/g, " ");
className = className.strip();
var classes = className.split(" ");
if(hovered_vote != null)
{
array_select(classes, "star-hovered", "star-unhovered", hovered_vote == star_vote);
array_select(classes, "star-hovered-upto", "star-hovered-after", hovered_vote >= star_vote);
}
array_select(classes, "star-set", "star-unset", set_vote != null && set_vote == star_vote);
array_select(classes, "star-set-upto", "star-set-after", set_vote != null && set_vote >= star_vote);
star.className = classes.join(" ");
}
}