eBay Forum Thread Ignore List

By thorbenhauer Last update Feb 8, 2008 — Installed 470 times.
// eBay Forum Thread Ignore List user script
// version 0.1.2
// 2008-02-08
// Copyright 2006-2008, thorbenhauer
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// -----------------------------------------------------------------------------
//
// Icon: Humility Icon Set
// by Andrew Fitzsimon and Chad 'gonZo' Rodrigue
// http://art.gnome.org/themes/icon/1136
// Released under the GPL license
//
// -----------------------------------------------------------------------------
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// -----------------------------------------------------------------------------
//
// ==UserScript==
// @name          eBay Forum Thread Ignore List
// @namespace     http://userscripts.org/users/9022
// @description   http://userscripts.org/scripts/show/7057
// @include       http://forums*.ebay.tld/*forum.jspa?*forumID=*
// ==/UserScript==
//
// -----------------------------------------------------------------------------

const ADDPNG = "data:image/png;base64," +
"iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI" +
"WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1ggMFQYHoMbyVQAAATpJREFUKM+dkrFOwlAUhv/TXguk" +
"SZM21HLBMOnQGHdfwImFnecwTr6CD0PiyO5ujEwMxDbSJkBSCLT09rpoK3KHxjOd3Pt/9/z57yEo" +
"yuFO4N/63UxkmL5MwyRKen81TAXyK07D+yE26QbRQ0RJlJxoNBUopcQhPSBPc0gpVRI1WKf+DTLT" +
"NYPOZYcIVB7aPdsTuUAhCrT7bc9gRvhzR0SIZ7Ek/86Xo8cR9EIvwUIUYN+55TKHxipjzGAYP43B" +
"VtsVJu8TiFxU4YjjQEiv3OhnOmafM5DhGIF5YdLv9FrnLa8/6GsAMH+eF7totygfAWH7sZUsW2a9" +
"bJkdT7ihkBhxANhH+8X6dd2ttQAEQpM1y772dxARuMXBLQ4iNaicqGkabMsue7UrRTWcRuBeu10A" +
"iN/iMF2mJ0v+BTdAbTHWdiw9AAAAAElFTkSuQmCC";

const REMPNG = "data:image/png;base64," +
"iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI" +
"WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1ggMFQYm7K/iCwAAANxJREFUKM/lkT1OAzEQhd94zJiw" +
"VVZCSlCUBg6wfY4SrpAj5Aq0FNwifU6RYiWKrRKE5MKRYNNge+jWRfYCiK988/+GMQZBRESZmVJK" +
"ir8Nj4nzxzlt3jZm9byanr/Pxr/7nysbqvvqNHuaEYEG0d05M3ET8C1z8CHnmNNQQATfebXLZvmw" +
"3q7BuQzPKcPCAgCiRhhrhpgVi93LDjb0Aft2jxRT2UOv3lNuu2F0nx1IajlVi4pUS7axxkgtkKkg" +
"fkVcPi659CD0x15pzBxXO2q2jbJjtK8twiHgP/ILeNlIABwUZR4AAAAASUVORK5CYII=";
               
const SHOPNG = "data:image/png;base64," +
"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI" +
"WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QgXEhwUkJb95QAAAkRJREFUOMulk11IU3EYxp+zczyT" +
"5YXZItqyUlgUJUR0YV4E3UQRGemNF11ENxFGiFajCyHoYhisi11E2Qd609ASwq9FZQkKZUH2MQt1" +
"sw/G5tTVzpnb2c7H/+1iJXNOu+i5fX/vy///vM/LERFyteOo0y0KXDMvCCBGSGtGtkAMAHdjytfW" +
"kssLyNO0fwZnG0/hUM0+RGMy7g5MYJ3FjHQ8gvejw/n4ygEwDCRTCiwCQzK5iIySRHERgQz9zyuW" +
"y4QCIhAYEYgIhLVlwn9q5YASCwCuICyWWFZ64Dhy6X5gInAQGQ0QeYDn1iuKAsMwcv5E0DQVYKnT" +
"3LaTJ5DRAbMIx67KUcHEC1esWza/az5/xlZh34S0mkE8kYSm60v9jDGw4o1wtlwsazhcVXbB3Y+P" +
"r1+EOV5wmiYHXNGFSKyuzXNbicsyjlWXY7/DCoOxJUs1TcfOraXY67Ci9c5LvBr2pebn4nWTA66o" +
"CQDoW9eYFJHOXXW307O3IfC8gL/5YoygM8KB3TaMfZnDk8E+SklKIwW9Y8tMpB/dndHpkMd18wEi" +
"v9Iwi9mIaDpDzR47wBfhVucjpOYWPDTj7Si4BQr3NPnH/c+7BkdAxAMch9ISMyrtG3CvewiJWHiI" +
"vj9sWnuNUrL+cf/TwBt/EGKRGdVV5egb/oDZr58CFFus+2cOKNYvqwn1eHtHl6RqOmZCcXweH4nL" +
"UqaW5nvlfJ7Lv8alwvaGWnuFrUdRNfycXainoLe3ILfagOxpX24FgCnf9WurMb8BM/YSOUNqJt4A" +
"AAAASUVORK5CYII=";

const HIDPNG = "data:image/png;base64," +
"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI" +
"WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QgXEiEqOx+o8AAAAixJREFUOMuV00toE1EUBuD/zExj" +
"Jp1kEvNq0hoT8jCVUHwQ40Y3PsBSqyg0bSpYu1AUKdiCqGApuBAVoRtxWwWXiuiiXSl04UZwJfii" +
"G23sRlJLmtdk7r0uBDE2aetZ3nv5OPznXBJCoFUljl29CQCfZ+/eavVGanVB4cH+So1NForVSYrl" +
"+v8LoMhg0uHRHl88N6QE4hnF49UeUWy4e1MAufscFrvl5YWRrK7ZLDC5QCi5z+l2qy/I2+/YuAO9" +
"/enJvqOxdCqKqlEDZ3Uoqo5gtCdm8TmerQtQ8PR0anfqcLb3AIgYTJNDCEAwE6orCE8wdIgi2emm" +
"AIUGzvrjXWPXL+UQcFlRM0wAvyckBIdgdXTGd8G3rWOMYrmRBoDC2Ywe0B9OTZynI+kuMGaCqLFV" +
"wQWIC4R27iev1/6AYkMZAKBE7zV/obDybvzyaDDS6UfVqOFnsYSAy4qF/DJm5j7AqVkhSAJJEiS5" +
"DaxWwdf389+dLucehTPz9o/FpcqNK1MLsMiATK5TAye2Dh8/+Fc4BGNlCd8+vS0Uy+ayWTYASYbu" +
"0O4oX+bujTYEmThzX1XVcVmWGwCSFJTqbTP1j08m1h/javlPeP+WsVrexCYKAc4BxjgMk6NmmDDq" +
"DCbjTd0mAGC3WtDhaUfIZ8feHX6kkwFYt8hAk4+nrDmRZQR8OpLb/fA4HVBtGnTNhnx+ESBpYyDe" +
"E8Xz2dd4Nf8GnANVgwEQKFUNxLvDa4BfNzK6un2Jkt0AAAAASUVORK5CYII=";

GM_registerMenuCommand("Manually purge local blacklist", purgeLocalList);
var threads = document.evaluate("//table[@summary = 'List of threads']/tbody/" +
    "tr", document.body, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var threadSubjects = document.evaluate("//a[@class = 'threadRowSubject']/@href",
    document.body, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var threadIDs = new Array();
var params;
var param;
for (var i = 0; i < threadSubjects.snapshotLength; i++) {
    params = threadSubjects.snapshotItem(i).value.split("?")[1].split("&");
    for (var j = 0; j < params.length; j++) {
        param = params[j].split("=");
        if (param[0].toLowerCase() == "threadid") {
            threadIDs.push(param[1]);
        }
    }
}
var anchor = document.evaluate("//table[@summary = 'List of threads']/thead/" +
    "tr", document.body, null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
var domain = document.domain;
var blacklist = getLocalizedBlacklist(domain);
var blocked = new Array();
var switchPanel = document.createElement("th");
switchPanel.id = "switch";
switchPanel.setAttribute("style", "cursor: pointer;");
anchor.appendChild(switchPanel);
for (var i = 0; i < threads.snapshotLength; i++) {
    var panel = document.createElement("td");
    panel.id = "panel" + i;
    panel.setAttribute("style", "cursor: pointer;");
    if (searchList(blacklist, threadIDs[i]) < 0) {
        panel.appendChild(createImg("add", i));
    } else {
        threads.snapshotItem(i).style.display = "none";
        panel.appendChild(createImg("rem", i));
        blocked.push(i);
    }
    threads.snapshotItem(i).appendChild(panel);
}
if (blocked.length > 0) {
    switchPanel.appendChild(createImg("show", -1));
}
var lastTime = GM_getValue("time");
if (lastTime == null) {
    GM_setValue("time", (new Date()).getTime().toString());
} else {
    var newTime = (new Date()).getTime();
    if (newTime - lastTime > 3024000000) {
        purgeLocalList();
    }
}

function createImg(type, ID) {
    var img =  document.createElement("img");
    switch (type) {
        case "add":
            img.src = ADDPNG;
            img.title = "Add to blacklist";
            img.id = "add" + ID;
            img.setAttribute("style", "padding-left: 4px");
            img.addEventListener('click',
                function(event) {
                    add(event);
                }, true
            );
            return img;
        case "rem":
            img.src = REMPNG;
            img.title = "Remove from blacklist";
            img.id = "rem" + ID;
            img.setAttribute("style", "padding-left: 4px");
            img.addEventListener('click',
                function(event) {
                    remove(event);
                }, true
            );
            return img;
        case "show":
            img.src = SHOPNG;
            img.title = "Show all threads";
            img.setAttribute("style", "padding-left: 3px;");
            img.addEventListener('click',
                function(event) {
                    show(event);
                }, true
            );
            return img;
        case "hide":
            img.src = HIDPNG;
            img.title = "Hide blocked threads";
            img.setAttribute("style", "padding-left: 3px;");
            img.addEventListener('click',
                function(event) {
                    hide(event);
                }, true
            );
            return img;
        default:
            return null;
    }
}

function show(event) {
    var temp = document.getElementById("switch");
    temp.replaceChild(createImg("hide", -1), temp.firstChild);
    for (var i = 0; i < blocked.length; i++) {
        threads.snapshotItem(blocked[i]).style.display = "";
    }
}

function hide(event) {
    var temp = document.getElementById("switch");
    temp.replaceChild(createImg("show", -1), temp.firstChild);
    update();
}

function add(event) {
    var ID = event.target.id.slice(3, event.target.id.length);
    var temp = document.getElementById("panel" + ID);
    threads.snapshotItem(ID).style.display = "none";
    addToLocalizedBlacklist(domain, threadIDs[ID]);
    blocked.push(ID);
    temp.replaceChild(createImg("rem", ID), temp.firstChild);
    temp = document.getElementById("switch");
    if (temp.firstChild) {
        temp.replaceChild(createImg("show", -1), temp.firstChild);
    } else {
        temp.appendChild(createImg("show", -1));
    }
}

function remove(event) {
    var ID = event.target.id.slice(3, event.target.id.length);
    var temp = document.getElementById("panel" + ID);
    temp.replaceChild(createImg("add", ID), temp.firstChild);
    removeFromLocalizedBlacklist(domain, threadIDs[ID]);
    var index = searchList(blocked, ID);
    if (index >= 0) {
        blocked.splice(index, 1);
        if (blocked.length == 0) {
            temp = document.getElementById("switch");
            temp.removeChild(temp.firstChild);    
        }
    }
}

function update() {
    blacklist = getLocalizedBlacklist(domain);
    var panel;
    blocked = new Array();
    for (var i = 0; i < threads.snapshotLength; i++) {
        panel = document.getElementById("panel" + i);
        if (searchList(blacklist, threadIDs[i]) < 0) {
            panel.replaceChild(createImg("add", i), panel.firstChild);
            threads.snapshotItem(i).style.display = "";
        } else {
            panel.replaceChild(createImg("rem", i), panel.firstChild);
            threads.snapshotItem(i).style.display = "none";
            blocked.push(i);
        }
    }
}

function purgeLocalList() {
    GM_setValue("time", (new Date()).getTime().toString());
    var blacklistString = GM_getValue("blacklist");
    if (blacklistString != undefined && blacklistString.length > 0) {
        var localizedBlacklists = blacklistString.split("|||");
        var localizedBlacklist;
        for (var i = 0; i < localizedBlacklists.length; i++) {
            localizedBlacklist = localizedBlacklists[i].split("||");
            if (localizedBlacklist[0] == domain) {
                var threadIDs = localizedBlacklist[1].split("|");
                var regExp = /\[[0-9]*\]/;
                var threadIDsToKill = new Array();
                var counter = 0;
                for (var j = 0; j < threadIDs.length; j++) {
                    var baseURL =
                        document.location.href.split("forum.jspa?")[0];
                    GM_xmlhttpRequest({
                        xhRThreadID: threadIDs[j],
                        xhRIndex: i,
                        xhRLBl: localizedBlacklist,
                        method: 'GET',
                        url: baseURL + 'thread.jspa?threadID=' + threadIDs[j],
                        onload: function(responseDetails) {
                            if (responseDetails.status == 200) {
                                var matches =
                                    regExp.exec(responseDetails.responseText);
                                if (matches) {
                		            threadIDsToKill.push(this.xhRThreadID);
                		        }
                            }
                            counter++;
                            if (counter == threadIDs.length) {
                                aftermath(localizedBlacklists, this.xhRIndex,
                                    this.xhRLBl, threadIDs,
                                    threadIDsToKill);
                            }
                        }
                    });
                }
            }
        }
    }
    
}

function aftermath(localizedBlacklists, localizedBlacklistsIndex,
    localizedBlacklist, threadIDs, threadIDsToKill) {
    if (threadIDsToKill.length > 0) {
        for (var i = 0; i < threadIDsToKill.length; i++) {
            threadIDs.splice(searchList(threadIDs, threadIDsToKill[i]), 1);
        }
        if (threadIDs.length > 0) {
            localizedBlacklist[1] = threadIDs.join("|");
            localizedBlacklists[localizedBlacklistsIndex] =
               localizedBlacklist[0] + "||" + localizedBlacklist[1];
            GM_setValue("blacklist", localizedBlacklists.join("|||"));
        } else {
            localizedBlacklists.splice(localizedBlacklistsIndex, 1);
            GM_setValue("blacklist", localizedBlacklists.join("|||"));
        }
    }
}

function getLocalizedBlacklist(domain) {
    var blacklistString = GM_getValue("blacklist");
    if (blacklistString != undefined && blacklistString.length > 0) {
        var localizedBlacklists = blacklistString.split("|||");
        var localizedBlacklist;
        for (var i = 0; i < localizedBlacklists.length; i++) {
            localizedBlacklist = localizedBlacklists[i].split("||");
            if (localizedBlacklist[0] == domain) {
                return localizedBlacklist[1].split("|");
            }
        }
        return new Array();
    } else {
        return new Array();
    }
}

function addToLocalizedBlacklist(domain, threadID) {
    if (domain != undefined && domain.length > 0 && threadID != undefined &&
        threadID.length > 0) {
        var blacklistString = GM_getValue("blacklist");
        if (blacklistString != undefined && blacklistString.length > 0) {
            var localizedBlacklists = blacklistString.split("|||");
            var localizedBlacklist;
            var threadList;
            var index;
            for (var i = 0; i < localizedBlacklists.length; i++) {
                localizedBlacklist = localizedBlacklists[i].split("||");
                if (localizedBlacklist[0] == domain) {
                    threadList = localizedBlacklist[1].split("|");
                    index = searchList(threadList, threadID);
                    if (index < 0) {
                        threadList.push(threadID);
                        localizedBlacklist[1] = threadList.join("|");
                        localizedBlacklists[i] = localizedBlacklist[0] + "||" +
                            localizedBlacklist[1];
                        GM_setValue("blacklist",
                            localizedBlacklists.join("|||"));
                        return;
                    }
                }
            }
            localizedBlacklists.push(domain + "||" + threadID);
            GM_setValue("blacklist", localizedBlacklists.join("|||"));
        } else {
            GM_setValue("blacklist", domain + "||" + threadID);
        }
    }
}

function removeFromLocalizedBlacklist(domain, threadID) {
    if (domain != undefined && domain.length > 0 && threadID != undefined &&
        threadID.length > 0) {
        var blacklistString = GM_getValue("blacklist");
        if (blacklistString != undefined && blacklistString.length > 0) {
            var localizedBlacklists = blacklistString.split("|||");
            var localizedBlacklist;
            var threadList;
            var index;
            for (var i = 0; i < localizedBlacklists.length; i++) {
                localizedBlacklist = localizedBlacklists[i].split("||");
                if (localizedBlacklist[0] == domain) {
                    threadList = localizedBlacklist[1].split("|");
                    index = searchList(threadList, threadID);
                    if (index >= 0) {
                        threadList.splice(index, 1);
                        if (threadList.length > 0) {
                            localizedBlacklist[1] = threadList.join("|");
                            localizedBlacklists[i] = localizedBlacklist[0] +
                                "||" + localizedBlacklist[1];
                            GM_setValue("blacklist",
                                localizedBlacklists.join("|||"));
                            return;
                        } else {
                            localizedBlacklists.splice(i, 1);
                            GM_setValue("blacklist",
                                localizedBlacklists.join("|||"));
                        }
                    }
                }
            }
        }
    }
}

function searchList(list, ID) {
    for (var i = 0; i < list.length; i++) {
        if (list[i] == ID) {
            return i;
        }
    }
    return -1;
}