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

452 lines
12 KiB
JavaScript
Executable File

PostModeMenu = {
mode: "view",
init: function(pool_id) {
try { /* This part doesn't work on IE7; for now, let's allow execution to continue so at least some initialization is run */
/* If pool_id isn't null, it's the pool that we're currently searching for. */
this.pool_id = pool_id;
var color_element = $("mode-box")
this.original_style = { border: color_element.getStyle("border") }
if (Cookie.get("mode") == "") {
Cookie.put("mode", "view")
$("mode").value = "view"
} else {
$("mode").value = Cookie.get("mode")
}
} catch (e) {}
this.vote_score = Cookie.get("vote")
if (this.vote_score == "") {
this.vote_score = 1
Cookie.put("vote", this.vote_score)
} else {
this.vote_score == +this.vote_score
}
Post.posts.each(function(p) {
var post_id = p[0]
var post = p[1]
var span = $("p" + post.id);
if(span == null)
return;
/* Use post_id here, not post, since the post object can be replaced later after updates. */
span.down("A").observe("click", function(e) { PostModeMenu.click(e, post_id); });
span.down("A").observe("mousedown", function(e) { PostModeMenu.post_mousedown(e, post_id); });
span.down("A").observe("mouseover", function(e) { PostModeMenu.post_mouseover(e, post_id); });
span.down("A").observe("mouseout", function(e) { PostModeMenu.post_mouseout(e, post_id); });
span.down("A").observe("mouseup", function(e) { PostModeMenu.post_mouseup(e, post_id); });
});
document.observe("mouseup", function(e) { PostModeMenu.post_mouseup(e, null); });
Event.observe(window, "pagehide", function(e) { PostModeMenu.post_end_drag(); });
this.change()
},
set_vote: function(score) {
this.vote_score = score
Cookie.put("vote", this.vote_score)
Post.update_vote_widget('vote-menu', this.vote_score);
},
get_style_for_mode: function(s)
{
if (s == "view") {
return {background: ""};
} else if (s == "edit") {
return {background: "#3A3"}
} else if (s == "rating-q") {
return {background: "#AAA"}
} else if (s == "rating-s") {
return {background: "#6F6"}
} else if (s == "rating-e") {
return {background: "#F66"}
} else if (s == "vote") {
return {background: "#FAA"}
} else if (s == "lock-rating") {
return {background: "#AA3"}
} else if (s == "lock-note") {
return {background: "#3AA"}
} else if (s == "approve") {
return {background: "#26A"}
} else if (s == "flag") {
return {background: "#F66"}
} else if (s == "add-to-pool") {
return {background: "#26A"}
} else if (s == "apply-tag-script") {
return {background: "#A3A"}
} else if (s == "reparent-quick") {
return {background: "#CCA"}
} else if (s == "remove-from-pool") {
return {background: "#CCA"}
} else if (s == 'reparent') {
return {background: "#0C0"}
} else if (s == 'dupe') {
return {background: "#0C0"}
} else {
return {background: "#AFA"}
}
},
change: function() {
if(!$("mode"))
return;
var s = $F("mode")
Cookie.put("mode", s, 7)
PostModeMenu.mode = s
if (s.value != "edit") {
$("quick-edit").hide()
}
if (s.value != "apply-tag-script") {
$("edit-tag-script").hide()
Post.reset_tag_script_applied()
}
if (s == "vote") {
Post.update_vote_widget('vote-menu', this.vote_score);
$("vote-score").show()
} else if (s == "apply-tag-script") {
$("edit-tag-script").show()
$("edit-tag-script").focus()
}
},
click: function(event, post_id) {
var s = $("mode")
if(!s)
return;
if (s.value == "view") {
return true
}
if (s.value == "edit") {
post_quick_edit.show(post_id);
} else if (s.value == 'vote') {
Post.vote(post_id, this.vote_score)
} else if (s.value == 'rating-q') {
Post.update_batch([{id: post_id, rating: "questionable"}]);
} else if (s.value == 'rating-s') {
Post.update_batch([{id: post_id, rating: "safe"}]);
} else if (s.value == 'rating-e') {
Post.update_batch([{id: post_id, rating: "explicit"}]);
} else if (s.value == 'reparent') {
if(post_id == id)
return false;
TagScript.run(post_id, "parent:" + id)
} else if (s.value == 'dupe') {
if(post_id == id)
return false;
TagScript.run(post_id, "duplicate parent:" + id)
} else if (s.value == 'lock-rating') {
Post.update_batch([{id: post_id, is_rating_locked: "1"}]);
} else if (s.value == 'lock-note') {
Post.update_batch([{id: post_id, is_note_locked: "1"}]);
} else if (s.value == 'flag') {
Post.flag(post_id)
} else if (s.value == "approve") {
Post.approve(post_id)
} else if (s.value == 'add-to-pool') {
Pool.add_post(post_id, 0)
} else if (s.value == "remove-from-pool") {
Pool.remove_post(post_id, PostModeMenu.pool_id);
} else if (s.value == "destroy") {
notice("Deleting post");
Post.make_request("/post/destroy.json", {id: post_id, reason: "Via post-mode"}, function() {
jQuery(event.target).parents('li').remove()
notice("Post deleted");
});
}
event.stopPropagation();
event.preventDefault();
},
dragging_from_post: null,
dragging_active: false,
dragging_list: null,
dragging_hash: null,
post_add_to_hovered_list: function(post_id)
{
var element = element = $$("#p" + post_id + " > .directlink");
if(element.length > 0)
{
element[0].addClassName("tag-script-applied");
Post.applied_list.push(element[0]);
}
if(!PostModeMenu.dragging_hash.get(post_id))
{
PostModeMenu.dragging_hash.set(post_id, true);
PostModeMenu.dragging_list.push(post_id);
}
},
post_mousedown: function(event, post_id)
{
if(event.button != 0)
return;
if(PostModeMenu.mode == "reparent-quick")
{
PostModeMenu.dragging_from_post = post_id;
PostModeMenu.post_begin_drag();
}
else if(PostModeMenu.mode == "apply-tag-script")
{
Post.reset_tag_script_applied();
PostModeMenu.dragging_from_post = post_id;
PostModeMenu.dragging_list = new Array;
PostModeMenu.dragging_hash = new Hash;
PostModeMenu.post_add_to_hovered_list(post_id);
}
else
return;
/* Prevent the mousedown from being processed; this keeps it from turning into
* a real drag action, which will suppress our mouseover/mouseout messages. We
* only do this when the tag script is enabled, so we don't mess with regular
* clicks. */
event.preventDefault();
event.stopPropagation();
},
post_begin_drag: function(type)
{
document.body.addClassName("dragging-to-post");
},
post_end_drag: function()
{
document.body.removeClassName("dragging-to-post");
PostModeMenu.dragging_from_post = null;
},
post_mouseup: function(event, post_id)
{
if(event.button != 0)
return;
if(!PostModeMenu.dragging_from_post)
return;
if(PostModeMenu.mode == "reparent-quick")
{
if(post_id)
{
notice("Updating post");
Post.update_batch([{ id: PostModeMenu.dragging_from_post, parent_id: post_id}]);
}
PostModeMenu.post_end_drag();
return;
}
else if(PostModeMenu.mode == "apply-tag-script")
{
if(post_id)
return;
/* We clicked or dragged some posts to apply a tag script; process it. */
var tag_script = TagScript.TagEditArea.value;
TagScript.run(PostModeMenu.dragging_list, tag_script);
PostModeMenu.dragging_from_post = null;
PostModeMenu.dragging_active = false;
PostModeMenu.dragging_list = null;
PostModeMenu.dragging_hash = null;
}
},
post_mouseover: function(event, post_id)
{
var post = $("p" + post_id);
var style = PostModeMenu.get_style_for_mode(PostModeMenu.mode)
post.down("span").setStyle(style)
if(PostModeMenu.mode != "apply-tag-script")
return;
if(!PostModeMenu.dragging_from_post)
return;
if(post_id != PostModeMenu.dragging_from_post)
PostModeMenu.dragging_active = true;
PostModeMenu.post_add_to_hovered_list(post_id);
},
post_mouseout: function(event, post_id)
{
var post = $("p" + post_id);
post.down("span").setStyle({background: ""});
},
apply_tag_script_to_all_posts: function()
{
var tag_script = TagScript.TagEditArea.value;
var post_ids = Post.posts.inject([], function(list, pair) {
list.push(pair[0]);
return list;
});
TagScript.run(post_ids, tag_script);
}
}
TagScript = {
TagEditArea: null,
load: function() {
this.TagEditArea.value = Cookie.get("tag-script")
},
save: function() {
Cookie.put("tag-script", this.TagEditArea.value)
},
init: function(element, x) {
this.TagEditArea = element
TagScript.load()
this.TagEditArea.observe("change", function(e) { TagScript.save() })
this.TagEditArea.observe("focus", function(e) { Post.reset_tag_script_applied() })
/* This mostly keeps the tag script field in sync between windows, but it
* doesn't work in Opera, which sends focus events before blur events. */
Event.on(window, 'unload', function() { TagScript.save() });
document.observe("focus", function(e) { TagScript.load() })
},
parse: function(script) {
return script.match(/\[.+?\]|\S+/g)
},
test: function(tags, predicate) {
var split_pred = predicate.match(/\S+/g)
var is_true = true
split_pred.each(function(x) {
if (x[0] == "-") {
if (tags.include(x.substr(1, 100))) {
is_true = false
throw $break
}
} else {
if (!tags.include(x)) {
is_true = false
throw $break
}
}
})
return is_true
},
process: function(tags, command) {
if (command.match(/^\[if/)) {
var match = command.match(/\[if\s+(.+?)\s*,\s*(.+?)\]/)
if (TagScript.test(tags, match[1])) {
return TagScript.process(tags, match[2])
} else {
return tags
}
} else if (command == "[reset]") {
return []
} else if (command[0] == "-" && command.indexOf("-pool:") != 0) {
return tags.reject(function(x) {return x == command.substr(1, 100)})
} else {
tags.push(command)
return tags
}
},
run: function(post_ids, tag_script, finished) {
if(!Object.isArray(post_ids))
post_ids = $A([post_ids]);
var commands = TagScript.parse(tag_script) || []
var posts = new Array;
post_ids.each(function(post_id) {
var post = Post.posts.get(post_id)
var old_tags = post.tags.join(" ")
commands.each(function(x) {
post.tags = TagScript.process(post.tags, x)
})
posts.push({
id: post_id,
old_tags: old_tags,
tags: post.tags.join(" ")
});
});
notice("Updating " + posts.length + (post_ids.length == 1? " post": " posts") );
Post.update_batch(posts, finished);
}
}
function PostQuickEdit(container)
{
this.container = container;
this.submit_event = this.submit_event.bindAsEventListener(this);
this.container.down("form").observe("submit", this.submit_event);
this.container.down(".cancel").observe("click", function(e) {
e.preventDefault();
this.hide();
}.bindAsEventListener(this));
this.container.down("#post_tags").observe("keydown", function(e) {
if(e.keyCode == Event.KEY_ESC)
{
e.stop();
this.hide();
return;
}
if(e.keyCode != Event.KEY_RETURN)
return;
this.submit_event(e);
}.bindAsEventListener(this));
}
PostQuickEdit.prototype.show = function(post_id)
{
Post.hover_info_pin(post_id);
var post = Post.posts.get(post_id);
this.post_id = post_id;
this.old_tags = post.tags.join(" ");
this.container.down("#post_tags").value = post.tags.join(" ") + " rating:" + post.rating.substr(0, 1) + " ";
this.container.show();
this.container.down("#post_tags").focus();
}
PostQuickEdit.prototype.hide = function()
{
this.container.hide();
Post.hover_info_pin(null);
}
PostQuickEdit.prototype.submit_event = function(e)
{
e.stop();
this.hide();
Post.update_batch([{id: this.post_id, tags: this.container.down("#post_tags").value, old_tags: this.old_tags}], function() {
notice("Post updated");
this.hide();
}.bind(this));
}