diff --git a/review-badge-filter/review-badge-filter.user.js b/review-badge-filter/review-badge-filter.user.js
new file mode 100644
index 0000000..0e76f88
--- /dev/null
+++ b/review-badge-filter/review-badge-filter.user.js
@@ -0,0 +1,96 @@
+// ==UserScript==
+// @name Stack Exchange, Review Badge Filter
+// @namespace https://github.com/Glorfindel83/
+// @description Adds options to filter review queue badges by queue type
+// @updateURL https://raw.githubusercontent.com/Glorfindel83/SE-Userscripts/master/review-badge-filter/review-badge-filter.user.js
+// @downloadURL https://raw.githubusercontent.com/Glorfindel83/SE-Userscripts/master/review-badge-filter/review-badge-filter.user.js
+// @author Glorfindel
+// @match *://*.stackexchange.com/help/badges/*
+// @match *://*.stackoverflow.com/help/badges/*
+// @match *://*.superuser.com/help/badges/*
+// @match *://*.serverfault.com/help/badges/*
+// @match *://*.askubuntu.com/help/badges/*
+// @match *://*.stackapps.com/help/badges/*
+// @match *://*.mathoverflow.net/help/badges/*
+// @grant none//
+// @version 0.1
+// ==/UserScript==
+/* global $ */
+
+(function () {
+ "use strict";
+
+ // Link to /review present in badge description?
+ if ($("div.single-badge-title").find("a[href$='/review']").length == 0)
+ return;
+
+ // Create filters
+ var element = "
Filter on:
";
+ let queues = ["First Posts", "Late Answers", "Suggested Edits", "Low Quality Posts", "Close Votes", "Reopen Votes"];
+ queues.forEach(function(queue) {
+ element += "- " + queue + "
";
+ });
+ element += "
";
+ $("div.single-badge-count").append($(element));
+
+ // Determine current & last page number
+ let currentPage = parseInt($("div.pager span.current")[0].innerText);
+ var lastPage = 1;
+ let pageLinks = $("div.pager").find("a");
+ let baseLink = window.location.href.split('?')[0] + "?page=";
+ if (pageLinks.length != 0) {
+ // The last link is 'next', unless we're on the last page itself.
+ if ("next" == pageLinks[pageLinks.length - 1].innerText) {
+ // We need the one before to determine the # of pages.
+ lastPage = parseInt(pageLinks[pageLinks.length - 2].getAttribute("href").split("?page=")[1]);
+ } else {
+ lastPage = currentPage;
+ }
+ }
+ let table = $("div.single-badge-table")[1];
+
+ // Activate links
+ var clickedElement = null;
+ var rows = null;
+ Array.prototype.forEach.call(document.getElementsByClassName("review-badge-filter"), function(element) {
+ let type = element.innerText;
+ element.addEventListener("click", function() {
+ clickedElement = element.parentElement;
+ rows = [];
+ processPage(type, 1, lastPage);
+ }, false);
+ });
+
+ function processPage(type, page, lastPage) {
+ if (page > lastPage) {
+ // Show results
+ $(clickedElement).find("span")[0].innerText = "(" + rows.length + " time" + (rows.length == 1 ? "" : "s") + ")";
+ while (table.firstChild) {
+ table.removeChild(table.firstChild);
+ }
+ rows.forEach(function(row) {
+ table.appendChild(row);
+ });
+ // Remove pager
+ $("div.pager").remove();
+ return;
+ }
+ let selector = "div.single-badge-reason a:contains(" + type + ")";
+ if (page == currentPage) {
+ // Process current page
+ $(selector).each(function() {
+ rows.push(this.parentElement.parentElement);
+ });
+ processPage(type, page + 1, lastPage);
+ } else {
+ // Fetch page
+ $.get(baseLink + page, function (data) {
+ // Process fetched page
+ $(data).find(selector).each(function() {
+ rows.push(this.parentElement.parentElement);
+ });
+ processPage(type, page + 1, lastPage);
+ });
+ }
+ }
+})();