Cookie = { put: function(name, value, days) { if (days == null) { days = 365; } var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); var expires = "; expires=" + date.toGMTString(); document.cookie = name + "=" + encodeURIComponent(value) + expires + "; path=/"; }, raw_get: function(name) { var nameEq = name + "="; var ca = document.cookie.split(";"); for (var i = 0; i < ca.length; ++i) { var c = ca[i]; while (c.charAt(0) == " ") { c = c.substring(1, c.length); } if (c.indexOf(nameEq) == 0) { return c.substring(nameEq.length, c.length); } } return ""; }, get: function(name) { return this.unescape(this.raw_get(name)); }, remove: function(name) { Cookie.put(name, "", -1); }, unescape: function(val) { return decodeURIComponent(val.replace(/\+/g, " ")); }, setup: function() { if (location.href.match(/^\/(comment|pool|note|post)/) && this.get("tos") != "1") { // Setting location.pathname in Safari doesn't work, so manually extract the domain. var domain = location.href.match(/^(http:\/\/[^\/]+)/)[0]; location.href = domain + "/static/terms_of_service?url=" + location.href; return; } if (this.get("hide-upgrade-account") != "1") { if ($("upgrade-account")) { $("upgrade-account").show(); } } } } PostModeMenu = { init: function() { this.original_background_color = $(document.body).css("background-color") if (Cookie.get("mode") == "") { Cookie.put("mode", "view"); $("#mode-box select").val("view"); } else { $("#mode-box select").val(Cookie.get("mode")); } this.change(); }, change: function() { var s = $("#mode-box select").val(); Cookie.put("mode", s, 7); if (s == "view") { $(document.body).css({"background-color": this.original_background_color}); } else if (s == "edit") { $(document.body).css({"background-color": "#3A3"}); } else if (s == "add-fav") { $(document.body).css({"background-color": "#FFA"}); } else if (s == "remove-fav") { $(document.body).css({"background-color": "#FFA"}); } else if (s == "rating-q") { $(document.body).css({"background-color": "#AAA"}); } else if (s == "rating-s") { $(document.body).css({"background-color": "#6F6"}); } else if (s == "rating-e") { $(document.body).css({"background-color": "#F66"}); } else if (s == "vote-down") { $(document.body).css({"background-color": "#FAA"}); } else if (s == "vote-up") { $(document.body).css({"background-color": "#AFA"}); } else if (s == "lock-rating") { $(document.body).css({"background-color": "#AA3"}); } else if (s == "lock-note") { $(document.body).css({"background-color": "#3AA"}); } else if (s == "approve") { $(document.body).css({"background-color": "#26A"}); } else if (s == "unapprove") { $(document.body).css({"background-color": "#F66"}); } else if (s == "add-to-pool") { $(document.body).css({"background-color": "#26A"}); } else if (s == "apply-tag-script") { $(document.body).css({"background-color": "#A3A"}); } else if (s == "edit-tag-script") { $(document.body).css({"background-color": "#FFF"}); var script = Cookie.get("tag-script"); script = prompt("Enter a tag script", script); if (script) { Cookie.put("tag-script", script); $("#mode-box select").val("apply-tag-script"); } else { $("#mode-box select").val("view"); } this.change(); } else { $(document.body).css({"background-color": "#AFA"}); } }, click: function(post_id) { var s = $("#mode-box select").val(); if (s.value == "view") { return true; } else if (s.value == "add-fav") { Favorite.create(post_id); } else if (s.value == "remove-fav") { Favorite.destroy(post_id); } else if (s.value == "edit") { // TODO } else if (s.value == 'vote-down') { PostVote.create("down", post_id); } else if (s.value == 'vote-up') { PostVote.create("up", post_id); } else if (s.value == 'rating-q') { Post.update(post_id, {"post[rating]": "questionable"}); } else if (s.value == 'rating-s') { Post.update(post_id, {"post[rating]": "safe"}); } else if (s.value == 'rating-e') { Post.update(post_id, {"post[rating]": "explicit"}); } else if (s.value == 'lock-rating') { Post.update(post_id, {"post[is_rating_locked]": "1"}); } else if (s.value == 'lock-note') { Post.update(post_id, {"post[is_note_locked]": "1"}); } else if (s.value == 'unapprove') { Unapproval.create(post_id); } else if (s.value == "approve") { Post.update(post_id, {"post[is_pending]": "0"}); } else if (s.value == 'add-to-pool') { Pool.add_post(post_id, 0); } else if (s.value == "apply-tag-script") { var tag_script = Cookie.get("tag-script"); TagScript.run(post_id, tag_script); } return false } } TagScript = { 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] == "-") { return tags.reject(function(x) {return x == command.substr(1, 100)}) } else { tags.push(command) return tags } }, run: function(post_id, tag_script) { var commands = TagScript.parse(tag_script) var post = Post.posts.get(post_id) var old_tags = post.tags.join(" ") commands.each(function(x) { post.tags = TagScript.process(post.tags, x) }) Post.update(post_id, {"post[old_tags]": old_tags, "post[tags]": post.tags.join(" ")}) } } $(document).ready(function() { $("#mode-box select").click(PostModeMenu.change) PostModeMenu.init(); });