452 lines
12 KiB
JavaScript
452 lines
12 KiB
JavaScript
|
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));
|
||
|
}
|
||
|
|