Source for "Google Reader - "Mark as read" keyboard shortcuts"

By Spencer Thiel
Has 1 other script.


// ==UserScript==
// @name          Google Reader - "Mark as read" keyboard shortcuts
// @description   Three shortcuts that use existing google shortcuts to mark items as read. The first marks an item as read in list view and then moves to the next item. The second marks all items above the currently selected item as read. The third marks all items below the currently selected as read.
// @include       http://www.google.com/reader*
// @include       https://www.google.com/reader*
// ==/UserScript==

function simKeyPress(node) {
    var e = node.ownerDocument.createEvent("KeyboardEvent");
    //alert(node.parentNode.parentNode.className);
    if (node.parentNode.parentNode.className != 'entry overflow-settable read' && node.parentNode.parentNode.className != 'entry overflow-settable expanded read' && node.parentNode.parentNode.className != 'entry overflow-settable read expanded') {
	e.initKeyEvent('keypress', true, true, window, false, false, false, false, 77, 0x4D);
	node.dispatchEvent(e);
    }
    e.initKeyEvent('keypress', true, true, window, false, false, false, false, 78, 0x4E);
    node.dispatchEvent(e);
}

function simKeyPressBack(node) {
    var e = node.ownerDocument.createEvent("KeyboardEvent");
    //alert(node.parentNode.parentNode.className);
    if (node.parentNode.parentNode.className != 'entry overflow-settable read' && node.parentNode.parentNode.className != 'entry overflow-settable expanded read' && node.parentNode.parentNode.className != 'entry overflow-settable read expanded') {
	e.initKeyEvent('keypress', true, true, window, false, false, false, false, 77, 0x4D);
	node.dispatchEvent(e);
    }
    e.initKeyEvent('keypress', true, true, window, false, false, false, false, 80, 0x50);
    node.dispatchEvent(e);
}

function simulateClick(node) {
   var event = node.ownerDocument.createEvent("MouseEvents");
   event.initMouseEvent("click",
                        true, true, window, 1, 0, 0, 0, 0,
                        false, false, false, false, 0, null);
   node.dispatchEvent(event);
}

function markAsReadAndMoveOn(){
    var currentElement = document.getElementById('current-entry');
    var entryIcon = getEntryIconDiv(currentElement);
    simKeyPress(entryIcon);
}

function markUntilCurrentAsRead(){
    var currentElement = document.getElementById('current-entry');
    var allEntries = getAllEntries();

    for(var i=0;i<allEntries.length;i++){
	var entryIcon = getEntryIconDiv(allEntries[i]);
	var e = entryIcon.ownerDocument.createEvent("KeyboardEvent");
	e.initKeyEvent('keypress', true, true, window, false, false, false, false, 80, 0x50);
	entryIcon.dispatchEvent(e);
	if(allEntries[i] == currentElement){
	    break;
	}
    }

    for(var i=0;i<allEntries.length;i++){
	var entryIcon = getEntryIconDiv(allEntries[i]);
	simKeyPress(entryIcon);
	if(allEntries[i] == currentElement){
	    break;
	}
    }
}

function markUntilAfterAsRead(){
    //alert("after");
    var currentElement = document.getElementById('current-entry');
    var allEntries = getAllEntries();

    for(var i=allEntries.length - 1;i>0;i--){
	var entryIcon = getEntryIconDiv(allEntries[i]);
	var e = entryIcon.ownerDocument.createEvent("KeyboardEvent");
	e.initKeyEvent('keypress', true, true, window, false, false, false, false, 78, 0x4E);
	entryIcon.dispatchEvent(e);
	if(allEntries[i] == currentElement){
	    break;
	}
    }

    for(var i=allEntries.length - 1;i>0;i--){
	var entryIcon = getEntryIconDiv(allEntries[i]);
	simKeyPressBack(entryIcon);
	if(allEntries[i] == currentElement){
	    break;
	}
    }
}

function getEntryIconDiv(entry){
    var divs = entry.getElementsByTagName('div');
    for(var i=0;i<divs.length;i++){
	if(typeof(divs[i].className) != 'undefined' && divs[i].className == 'entry-icons') {
	    return divs[i];
	}
    }
    return null;
}

function getAllEntries(){
    var allDivs = document.getElementsByTagName('div');
    var allEntries = new Array();
    for(var i=0;i<allDivs.length;i++){		
	if(typeof(allDivs[i].className) != 'undefined' &&
	   allDivs[i].className == 'entry'
	   || allDivs[i].id == 'current-entry'
	   || allDivs[i].className == 'entry overflow-settable' 
	   || allDivs[i].className == 'entry overflow-settable read'
	   || allDivs[i].className == 'entry overflow-settable expanded'
	   || allDivs[i].className == 'entry overflow-settable expanded read'
	   || allDivs[i].className == 'entry overflow-settable read expanded'
	  ){
	    allEntries.push(allDivs[i]);
	}
    }
    return allEntries;
}


function keyPressEvent(event){
    var kcode = (event.keyCode)?event.keyCode:event.which;
    var k = String.fromCharCode(kcode);
    if(k == ','){
    	markAsReadAndMoveOn();
	event.preventDefault();
    } else if (k == 'U') {
	markUntilCurrentAsRead();
	event.preventDefault();
    } else if (k == 'I') {
	markUntilAfterAsRead();
	event.preventDefault();
    }
}

document.addEventListener("keypress", keyPressEvent, true);