Mefi Contact Activity Sidebar Everywhere

By Plutor Last update Mar 3, 2009 — Installed 51 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

There are 2 previous versions of this script.

// ==UserScript==
// @name           Mefi Contact Activity Sidebar Everywhere
// @namespace      http://plutor.org/
// @description    Shows the contact activity sidebar on every subsite
// @include        http://*.metafilter.com/
// @include        http://www.metafilter.com/contribute/activity/contacts/
// @require        http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js
// ==/UserScript==

// DONE 2009-03-03:
// * Change URL to <http://www.metafilter.com/contact-news-mini.mefi>
// * Hide/show
// * Configurable on contact activity page
// * A little less ugly loading throbber

// TODO:
// * Ability to add sidebar to music and projects
// * Handle the blue

// ================================================================================

// THROBBER_SRC is the throbber image to use while loading
var THROBBER_SRC = 'data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7';

// CACHE_AGE represents the number of seconds to wait from one update of the
// contacts activity to the next
var CACHE_AGE = 30 * 60;     // 30 minutes

// ================================================================================

var userid = readCookie("USER_ID");
var now = Math.floor((new Date().getTime())/1000);

function is_logged_in() {
    if (!userid || userid <= 0) return 0;
    return 1;
}

// Taken from <http://www.quirksmode.org/js/cookies.html>
function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function get_config(subsite) {
    var config = {
        "www": 0,
        "metatalk": 1,
        "ask": 1,
        "projects": 0,
        "music": 0,
        "jobs": 1
    };

    // Get and parse JSON with GM_getValue
    var val = GM_getValue("config");
    if (val) {
        try {
            var c = eval(val);
            config = c;
        } catch (e) { }
    }

    if (subsite) {
        return config[subsite];
    } else {
        return config;
    }
}

function set_config(subsite, value) {
    var config = get_config();

    if (config[subsite] != undefined) {
        config[subsite] = value;
    }

    // Save JSON with GM_setValue
    var c = config.toSource();
    GM_setValue("config", c);
}

function get_subsite() {
    var loc = String(location.host);
    var subdomain = loc.replace(/\..*/, "");

    if (subdomain == "metafilter")    return "www"
    else                return subdomain
}

function prepare_sidebar() {
    var contact_activity = $('<div id="contact_activity"></div>')
        .css({
            'margin': 0,
            'background': 'transparent url(' + THROBBER_SRC + ') no-repeat left',
            'padding-left': '22px'
        })
        .html('<span class="smallcopy">Loading activity</span>');

    if ($(".sidebar").length > 0) {
        // prepend to sidebar
        $(".sidebar:first").prepend(contact_activity);
    } else {
        // TODO - Add a sidebar
        /* var html = '<div id="menufooter" class="sidebar" style="margin-top:10px;">'
             + contact_activity
             + '</div>';
        $("body").append(html); */
    }
}

function get_cache() {
    // Get and parse JSON with GM_getValue
    var val = GM_getValue("data");
    if (!val) return;

    return eval(val);
}

function set_cache(data) {
    data.stamp = now;

    // Save JSON with GM_setValue
    var val = data.toSource();

    GM_setValue("data", val);
}

function get_activity() {
    GM_xmlhttpRequest({
        method: "GET",
        url:    'http://www.metafilter.com/contact-news-mini.mefi',
        onload: handle_activity
    });
}

function handle_activity(d) {
    if (d.readyState == 4 && d.status == 200) {
        var content = d.responseText;
        set_cache( { "content": content } );        
        show_sidebar(content);
    }
}

function show_sidebar(content) {
    if (!content || content.length < 1) return;

    var color = $("body").css('background-color') || '#638B9F';

    var contentdom = $(content);
    contentdom.filter("div").css( { 'border-bottom-color': color, 'text-align': 'left' } );
    contentdom.find(".smallcopy").css("font-size", "80%");

    $("#contact_activity").empty()
        .css({
            'background': 'transparent',
            'padding-left': 0
        })
        .append(contentdom)
        // Add footer
        .after('<div style="margin:10px 0px 10px 0px;padding-bottom:7px;text-align:center;font-size:10px;border-bottom:solid ' + color + ' 1px;">'
            + '<a id="toggle_activity" href="http://www.metafilter.com/javascript-required.mefi">Hide Activity</a> | '
            + '<a href="http://www.metafilter.com/contribute/activity/contacts/" target="_self">All Activity</a>'
            + '</div>');

     $("#toggle_activity")
        .click( function() {
            if ( $("#contact_activity").is(':visible') ) {
                // Turn off this subsite
                set_config(get_subsite(), 0);

                // Hide
                $("#contact_activity").slideUp();
                $(this).text("Show Activity");
            } else {
                // Turn on this subsite
                set_config(get_subsite(), 1);

                // Hide
                $("#contact_activity").slideDown();
                $(this).text("Hide Activity");
            }
            return false;
        } );
}

function init_config() {
    var config = get_config();

    $(".sidebar").eq(0).append(
        '<p class="sidebartext" style="margin-top:3em;margin-bottom:3px;">Show Activity On:</p>' +
        '<div style="padding:7px;">' +
            '<input name="visibleon_XXX" type="checkbox" value="www" style="vertical-align:middle;" checked disabled /> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi1.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' MetaFilter' +
        '</div>' +
        '<div style="padding:7px;">' +
            '<input name="visibleon" type="checkbox" value="ask" style="vertical-align:middle;"' +
            (config.ask ? ' checked="checked"' : '') + '/> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi3.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' Ask MetaFilter' +
        '</div>' +
        '<div style="padding:7px;">' +
            '<input name="visibleon" type="checkbox" value="metatalk" style="vertical-align:middle;"' +
            (config.metatalk ? ' checked="checked"' : '') + '/> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi5.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' MetaTalk' +
        '</div>' +
        /* '<div style="padding:7px;">' +
            '<input name="visibleon" type="checkbox" value="projects" style="vertical-align:middle;"' +
            (config.projects ? ' checked="checked"' : '') + '/> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi7.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' Projects' +
        '</div>' + */
        /* '<div style="padding:7px;">' +
            '<input name="visibleon" type="checkbox" value="music" style="vertical-align:middle;"' +
            (config.music ? ' checked="checked"' : '') + '/> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi8.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' Music' +
        '</div>' + */
        '<div style="padding:7px;">' +
            '<input name="visibleon" type="checkbox" value="jobs" style="vertical-align:middle;"' +
            (config.jobs ? ' checked="checked"' : '') + '/> ' +
            '<img src="http://images.metafilter.com/mefi/service-icons/mefi10.gif" style="vertical-align:middle;" width="16" height="16" border="0"/>' +
            ' Jobs' +
        '</div>' +
        '<div style="padding:7px;text-align:center;">' +
            '<input type="button" value="Save" class="button" id="savevisibleon"/>' +
        '</div>'
    );

    $("#savevisibleon").click( function() {
        // Save it
        $("input[name=visibleon]").each( function() {
            var key = $(this).attr("value");
            var val = $(this).attr("checked") ? 1 : 0;
            set_config(key, val);
        } );
        location.reload();
    } );
}

function init() {
    // Are we logged in?
    if (!is_logged_in()) return;

    // Are we on the contact activity page?
    if ( location.href.indexOf('/contribute/activity/contacts/') >= 0 ) {
        init_config();
        return;
    }

    // Are we in a subsite where it's configured on?
    if ( !get_config(get_subsite()) ) {
        return;
    }

    // Prepare
    prepare_sidebar();

    // Load the cache
    var data = get_cache();

    // If the cache is too old, load
    // <http://www.metafilter.com/contribute/activity/contacts/>
    if (!data || !data.stamp || (now - data.stamp > CACHE_AGE)) {
        data = get_activity();
    } else {
        show_sidebar(data.content);
    }
}

init();