// ==UserScript==
// @version 1.0: Initial version
// @name Gmail Show Unread only button
// @namespace http://code.google.com/p/ecmanaut/
// @description Adds a "Show Unread" button next to the search field, to only show unread mails / threads in the current view (using the search keyword "is:unread"). The button toggles to a "Show All" button when in unread-only mode.
// @include http://mail.google.com/mail/?*
// ==/UserScript==
var button = { q:'is:unread', add:'Show Unread', undo:'Show All' };
button.id = 'GM-' + button.q.replace(/\W/g, '-');
button.re = new RegExp( '(.*?\\S*)\\s*'+ button.q +'(\\s.*?\\S*)?\\s*$' );
var f = document.forms.namedItem('s'); // has search form
var q = f && f.elements.namedItem('q'); // the search query
var b = document.getElementById( button.id ); // our button
if( q ) {
!b && add_button();
update_button_title();
}
function add_button()
{
var p = q.parentNode, next = q.nextSibling;
b = document.createElement( 'input' );
b.id = button.id;
b.type = 'button';
p.insertBefore( document.createTextNode(' '), p.insertBefore( b, next ) );
b.addEventListener( 'click', toggle_show_unread, false );
}
function find_query_surroundings()
{
return q.value.match( button.re );
}
function update_button_title()
{
var unreadp = find_query_surroundings();
b.value = unreadp ? button.undo : button.add;
return unreadp;
}
function toggle_show_unread( e )
{
var query = find_query_surroundings();
if( query ) // is button.q present in current query?
q.value = query[1] + (query[2]||'');
else
q.value = (q.value ? q.value+' ' : '') + 'is:unread';
click( './/input[@value="Search\xA0Mail"]', f );
update_button_title();
}
function click( node, ctx )
{
node = typeof node == 'string' ? $x( node, ctx )[0] : node;
node.click();
}
function $x( xpath, root )
{
var doc = root ? root.evaluate ? root : root.ownerDocument : document;
var got = doc.evaluate( xpath, root||doc, null, 0, null ), next, result = [];
while( next = got.iterateNext() )
result.push( next );
return result;
}