MetaFilter Thread Highlights

By Plutor Last update Apr 8, 2008 — Installed 179 times.
// ==UserScript==
// @name           MetaFilter Thread Highlights
// @namespace      http://plutor.org/
// @description    Adds tabs to comment listings on MetaFilter: "All comments", and "Favorited comments"
// @include        http://metafilter.com/*
// @include        http://*.metafilter.com/*
// ==/UserScript==

// Any comment with at least MINIMUMFAVORITES favorites will be displayed
// under the "Favorite comments" tab.
var MINIMUMFAVORITES = 5;

var tabset;
var tab_all;
var tab_fav;

function mfc_init() {
    var styleprefix = 'mefi';

    var url = location.href.toLowerCase();
    var styleprefix = url.match(/^https?:\/\/([^\/]*\.)?metafilter.com/);

    styleprefix = styleprefix[1];
    if (styleprefix == "metatalk." || styleprefix == 'podcast.') {
        styleprefix = "meta";
    } else if (styleprefix == "ask.") {
        styleprefix = "ask";
    } else if (styleprefix == "music.") {
        styleprefix = "mefi"; // No tabs stylesheet for music?
    } else {
        styleprefix = "mefi";
    }

    url = url.replace(/^https?:\/\/([^\/]*\.)?metafilter.com/, '');
    if (url.match(/^\/(\d+)/))
        mfc_init_thread(styleprefix);
}

function mfc_init_thread(styleprefix) {
    // Find the comments section and add the tabs
    var alldivs = document.getElementsByTagName('div');
    var post;
    for (var i=0; i<alldivs.length; ++i) {
        if (!post && alldivs[i].className == 'copy') {
            // This is the post
            post = alldivs[i];
            break;
        }
    }

    if (!post) return;

    // Add the tabs css
    head = document.getElementsByTagName('head')[0];
    if (!head) return;
    var stylelink = document.createElement('link');
    stylelink.rel = 'stylesheet';
    stylelink.type = 'text/css';
    stylelink.href = 'http://styles.metafilter.com/mefi/tabs-' + styleprefix + '.css';
    head.appendChild(stylelink);

    // Add the tabs right after the comments section
    tabset = document.createElement('ul');
    tabset.id = 'maintab'; //ugh
    tabset.className = 'shadetabs';
    tabset.style.textAlign = 'left';
    tabset.style.margin = '10px 60px 0 60px';
    tabset.style.paddingLeft = '10px';
    tab_all = document.createElement('li'); // First tab
    tab_all.className = 'selected';
    tab_all.style.cursor = 'pointer';
    var tablink = document.createElement('a');
    tablink.innerHTML = 'All comments';
    tablink.addEventListener('click', mfc_show_all, false);
    tab_all.appendChild(tablink);
    tabset.appendChild(tab_all);
    tab_fav = document.createElement('li');     // Second tab
    tab_fav.style.cursor = 'pointer';
    tablink = document.createElement('a');
    tablink.innerHTML = 'Favorite comments (&ge;' + MINIMUMFAVORITES + ")";
    tablink.addEventListener('click', mfc_show_favorites, false);
    tab_fav.appendChild(tablink);
    tabset.appendChild(tab_fav);

    post.parentNode.insertBefore( tabset, post.nextSibling );
}

function mfc_show_favorites() {
    if (!tabset || !tab_all || !tab_fav) return;
    tab_all.className = '';
    tab_fav.className = 'selected';

    // Do it
    var alldivs = document.getElementsByTagName('div');
    var showed = 0;
    for (var i=0; i<alldivs.length; ++i) {
        if (alldivs[i].className == 'comments' &&
            alldivs[i].id != 'prevDiv' && alldivs[i].id != 'prevDiv2') {
            // Change all of the trailing brs into margin
            var sib = alldivs[i].nextSibling;
            while (sib) {
                if (sib && sib.tagName) {
                    if (sib.tagName.toLowerCase() == 'br') {
                        var todelete = sib;
                        sib = sib.nextSibling;
                        todelete.parentNode.removeChild(todelete);
                    } else {
                        break;
                    }
                } else {
                    sib = sib.nextSibling;
                }
            }
            alldivs[i].style.marginBottom = '2em';

            // Then hide
            var commentspans = alldivs[i].getElementsByTagName('span');
            for (var j=0; j<commentspans.length; ++j) {
                if (commentspans[j].className == 'smallcopy' &&
                    commentspans[j].innerHTML.match(/^posted by/)) {
                    var matches = commentspans[j].innerHTML.match(/(\d+) favorites?/);
                    if (matches && matches.length > 1 &&
                        parseInt(matches[1]) >= MINIMUMFAVORITES) {
                        showed++;
                    } else {
                        alldivs[i].style.display = 'none';
                    }
                    break;
                } // is smallcopy
            } // loop spans
        } // is a comment
    } // loop divs
}

function mfc_show_all() {
    if (!tabset || !tab_all || !tab_fav) return;
    tab_all.className = 'selected';
    tab_fav.className = '';

    // Do it
    var alldivs = document.getElementsByTagName('div');
    for (var i=0; i<alldivs.length; ++i) {
        if (alldivs[i].className == 'comments' &&
            alldivs[i].id != 'prevDiv' && alldivs[i].id != 'prevDiv2') {
            alldivs[i].style.display = 'block';
        } // is a comment
    } // loop divs
}

mfc_init();