Greasy Fork is available in English.

vBulletin Multi-Merge

Makes merge more powerful.

// ==UserScript==
// @name           vBulletin Multi-Merge
// @namespace      http://home.comcast.net/~mailerdaemon/
// @include        */postings.php
// @version 0.0.1.20140517011658
// @description Makes merge more powerful.
// ==/UserScript==

if(!String.prototype.trim) String.prototype.trim = function() { return this.replace(/^\s*/,'').replace(/\s*$/, ''); }

var form = null;
var url = null;
var sub = null;
form = document.forms.namedItem("vbform");
if(form == null)
{
//	GM_log("form == null");
	return;
}
url = form.elements.namedItem("mergethreadurl");
if(url == null)
{
//	GM_log("url == null");
	return;
}

for(i = 0; i<form.elements.length; i++)
	if(form.elements.item(i).type == "submit")
		sub = form.elements.item(i);
if(sub == null)
{
	GM_log("sub == null");
	return;
}

sub.type = "button";
sub.value = "Merge Multiple Threads";
sub.addEventListener("click", mysubmit, true);

textarea = document.createElement("textarea");
textarea.name = "mergethreadurls";
textarea.rows = "10";
textarea.cols = "80";
//textarea.value = "\n\n\n";
url.parentNode.replaceChild(textarea, url);
url = null;

var running = 0;
var done = true;

function mysubmit(e)
{
	done = false;
	sub.disabled = true;
	var title = form.elements.namedItem("title").value;
	var master = form.elements.namedItem("t").value;
	var urls = textarea.value.split(/[;\n]+/);
	for(i = 0; i < urls.length; ++i)
	{
		var j = urls[i].trim();
		if(j != "")
		{
			var Data = 's=&do=domergethread&t='+encodeURIComponent(master)+'&title='+encodeURIComponent(title)+'&mergethreadurl='+encodeURIComponent(urls[i]);
//			GM_log(j+"\n"+ Data);
//*
			++running;
			GM_xmlhttpRequest({
				method: 'POST',
				headers: {
					'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
					'Content-type': 'application/x-www-form-urlencoded'
				},
				url: 'http://forums.secondlife.com/postings.php',
				onload: function(responseDetails) {
//					GM_log('Request to merge threads returned ' + responseDetails.status + ' ' + responseDetails.statusText);
					--running;
					check();
				},
				data: Data
			});//*/
		}
	}
	done = true;
	check();
	return true;
}

function check()
{
	if(running == 0 && done)
	{
		sub.disabled = false;
		textarea.value = "";//"\n\n\n";
	}
}