There are 15 previous versions of this script.
// ==UserScript==
// @name Reddit Hide All
// @namespace http://userscripts.org/users/dbeck
// @description Adds a button next to the logo to Hide All
// @include http://reddit.com/*
// @include http://*.reddit.com/*
// @exclude http://www.reddit.com/comscore-iframe/*
// @exclude http://static.reddit.com/ads/*
// @version 4
// @date 2010.04.20
// @creator reddit@douglasbeck.com
// @homepage http://douglasbeck.com/scripts/reddit/
// ==/UserScript==
/*
if you have any comments or suggestions
send a reddit message to: dougletts
*/
var code_string = "(" + function() {
//helper funciton
function xpath(p, context) {
if(!context) context = document;
var i, arr = [], xpr = document.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for(i = 0; item = xpr.snapshotItem(i); i++)
arr.push(item);
return arr;
}
//grab list at top of page
var list = xpath("//div[@id='header-bottom-left']/ul")[0];
if(typeof list=="undefined"||!list) return;
//create link with hide functionality
var link = document.createElement('a');
link.setAttribute('href','#');
link.setAttribute('id','reddit-hide-all');
link.innerHTML = 'hide all';
link.addEventListener('click', function(event){
//ajax loading spinner
var spinner = {
lock : 0,
remove : function(){
--spinner.lock;
if(spinner.lock ==0)
$('#reddit-hide-all').css("background", "#EFF7FF");
},
add : function(){
//created ajax spinner with http://www.ajaxload.info/ #EFF7FF and #FF4500 (orangered)
//created data uri with http://www.sveinbjorn.org/dataurlmaker
$('#reddit-hide-all').css("background", 'url("data:image/gif;base64,R0lGODlhEAAQAPIAAO/3//9FAPLMwv'+
'pzQv9FAPiJYvafgvWqkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACw'+
'AAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwA'+
'AAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsA'+
'AAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAw'+
'AsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAA'+
'sAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwA'+
'AAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAA'+
'AAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAA'+
'AQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==") '+
'#EFF7FF no-repeat center');
}
};
// requests are now rate-limited in the default js, so I had to write my own function to process the requests.
// I actually like it better because it hides the link *after* the request is sent/completed, not before.
// I DON'T like how many ajax request this makes so I've submitted a feature request:
// http://code.reddit.com/ticket/576
$.fn.extend({
redditHide: function(op, parameters, link){
$.post(op, parameters, function(){
hide_thing($(link).parents("form"));
spinner.remove();
}, null);
return ++spinner.lock;
}
});
//grab & hide all
var links = document.getElementsByTagName('a');
var count = 0;
for(var i=0; i<links.length; i++){
if(links[i].innerHTML === 'hide' && $(links[i]).thing().css('display') === 'block'){
//add spinner background image
spinner.add();
// using just the onclick no longer works :(
// change_state(links[i], 'hide', hide_thing);
// looking at: http://code.reddit.com/browser/r2/r2/public/static/
// js/jquery.reddit.js?rev=77e51a304d1b4034614d75c5bf4c07b216400a42#L141
var form = $(links[i]).parents("form");
var id = $(links[i]).thing_id();
var op = '/api/hide';
var parameters = get_form_fields(form, {id: id});
if (reddit.logged) parameters.uh = reddit.modhash;
$().redditHide(op, parameters, links[i]);
++count;
}
}
if(count===0){
alert('None Found.');
}
// stop default click action
event.stopPropagation();
event.preventDefault();
}, true);
//create new list item with link
var item = document.createElement('li');
item.appendChild(link);
//insert at top of the list
var topItem = list.getElementsByTagName('li')[0];
list.insertBefore(item, topItem);
} + ")()";
// workaround for Google Chrome
// I realize this is NOT the nice way to do such things but from what I
// read there's no other way to access Reddit's native JS code
// (maybe one day 'hiding' will be added to the API)
var script = document.createElement('script');
script.type = 'text/javascript';
script.appendChild( document.createTextNode( code_string ) );
document.body.appendChild(script);