// ==UserScript==
// @name vBulletin Thread Split
// @description In the thread split interface it allows for toggling between summaries and posts. It makes splitting threads easier.
// @namespace http://home.comcast.net/~mailerdaemon/
// @include http://forums.secondlife.com/postings.php
// @version 0.0.1.20140517011141
// ==/UserScript==
//label[starts-with(@for,"checkpost")]
//td[text()="Split Thread" and @class="tcat"]
if(!String.prototype.trim) String.prototype.trim = function() { return this.replace(/^\s*/,'').replace(/\s*$/, ''); }//necessary evil
var base = $X('//td[text()="Split Thread" and @class="tcat"]/../../../..')
if(!base)
return;
var all = $X('//label[@for="cb_allbox"]');
var p = insertAfter(document.createElement("label"), insertAfter(document.createTextNode(" "), all));
var extended = p.insertBefore(document.createElement("input"),null);
extended.type="checkbox"
p.htmlFor=extended.id="cb_full";
insertAfter(document.createTextNode("Extended Information"), extended);
var posts = $Y('//label[starts-with(@for,"checkpost")]', base);
var i, post;
var toggles = new Array(posts.length);
for (i = 0; post = posts.snapshotItem(i); ++i)
{
var postnumber = post.htmlFor.replace("checkpost", "");
var table = GetParentNodeByTag(post, "TABLE");
var link = table.rows[2].cells[0];
link.style.cursor="pointer";
var a = table.getElementsByTagName("div")[0];
var b = insertAfter(document.createElement("div"), a);
b.style.cssText=a.style.cssText;
var t = buildToggle(postnumber, i + 1, a, b);
toggles[i] = t;
addEvent( link, "click", t);
// t();
}
addEvent( extended, "click", function(){
for(i = 0; f = toggles[i];i++)
f(extended.checked)
});
function buildToggle(postnumber, j, a, b)
{
return function Toggle(force){
if(force != (a.style.display == "none"))
{
if(b.innerHTML == "")
{
GM_xmlhttpRequest({
method: 'GET',
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Content-type': 'application/x-www-form-urlencoded'
},
url: "http://forums.secondlife.com/showpost.php?p="+postnumber+"&postcount="+j,
onload: function load(responseDetails){
b.innerHTML=responseDetails.responseText.replace(/^[\w\W]*?(<!-- icon and title -->[\w\W]*?|)(<!-- message -->[\w\W]*?<!-- \/ message -->)[\w\W]*$/, "$1$2");
a.style.display="none";
b.style.display="block";
// GM_log("got " + postnumber);
}
});
}
else
{
if(a.style.display == "none")
{
a.style.display="block";
b.style.display="none";
// GM_log("hide " + postnumber);
}
else
{
a.style.display="none";
b.style.display="block";
// GM_log("show " + postnumber);
}
}
}
}
}
function insertAfter(insert, after){return after.parentNode.insertBefore(insert, after.nextSibling);}
function $X(_xpath, node){return document.evaluate(_xpath, node?node:document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);}
function $Y(_xpath, node){return document.evaluate(_xpath, node?node:document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);}
function GetParentNodeByTag(child, tag, bad) {
tag = tag.toUpperCase();
while((child = child.parentNode) && child.tagName != tag);
return child?child:bad;
}
function addEvent( obj, type, fn ) {
if ( obj.attachEvent ) {
obj["e"+type+fn] = fn;
obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
obj.attachEvent( "on"+type, obj[type+fn] );
} else
obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
if ( obj.detachEvent ) {
obj.detachEvent( "on"+type, obj[type+fn] );
obj[type+fn] = obj["e"+type+fn] = null;
} else
obj.removeEventListener( type, fn, false );
}