GMail Label Sorting

By Tim Smart Last update Dec 9, 2008 — Installed 632 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0

There are 3 previous versions of this script.

// ==UserScript==
// @name           GMail Label Sorting
// @namespace      http://userscripts.org/users/63868
// @description    Sort labels as you last used them.
// @include        http://*mail.google.com/mail*
// @include        https://*mail.google.com/mail*
// ==/UserScript==
function $(a,b){if(!a){return null}b=b||document;if(typeof a=="string"){if(s=a.match(/^(\\*|.*?)(?:([#.*@<])(.*))?$/)){var c=s[1];if(c==""){c="*"}var d=s[2];a=s[3]}else{return}if(d=="#"){return b.getElementById(a)}else{if(d=="."){var e=[];var f=b.getElementsByTagName(c);var g=new RegExp("\\b"+a+"\\b");for(var i=0;i<f.length;i++){if(f[i].className.match(g)){e.push(f[i])}}if(1>e.length){return null}return e}else{if(d=="@"){var h=new Array();var j=document.evaluate(a,b,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);var n;while(n=j.iterateNext()){h.push(n)}return h}else{if(d=="*"){var e=[];if(s=a.match(/(.+?)(?:=(.*?))?\|(.*)/)){var k=s[1];var l=s[2];var m=s[3]}else{return}var g=new RegExp(m);var f=b.getElementsByTagName(c);if(k=="h"){for(var i=0;i<f.length;i++){if(f[i].innerHTML.match(g)){e.push(f[i])}}}else{if(k=="t"){for(var i=0;i<f.length;i++){if(f[i].textContent.match(g)){e.push(f[i])}}}else{if(k=="a"){for(var i=0;i<f.length;i++){if(el=f[i].getAttribute(l)){if(el.match(g)){e.push(f[i])}}}}}}if(1>e.length){return null}return e}else{return b.getElementsByTagName(c)}}}}}else{if(a.nodeType){return a}else{if(a[0].nodeType){return a}}}return null}
var g=null;
var l=null;
var p=null;
var tb=null;
var ind=false;
var nre=new RegExp('^(.*?)(?:\\s*?\\([0-9]+\\))?$');
var la=[];
if(GM_getValue("last_used"))
{
	p=eval(GM_getValue("last_used"));
}
else{
	p=[];
	GM_setValue("last_used",p.toSource());
}
function um()
{
	var d=$('#canvas_frame',top.document).contentDocument;
	var m=null;
	var lbs=[];
	var lb={};
	var lbc=null;
	if(ms=$('div*h|^New labe<wbr>l\\.\\.\\.$',d))
	{
		for(var i=0;m=ms[i];i++)
		{
			lbs=[];
			while(m=m.nextSibling)
			{
				lb={};
				lb.n=m.textContent;
				if(lb.n.match('Remove label'))break;
				if(lb.ts=ts(lb.n))
				{
					lb.c=m;
					lbs.push(lb);
				}
			}
			if(0<lbs.length)
			{
				lbs.sort(function(d,e){return (d.ts-e.ts)});
				for(var j=0;lb=lbs[j];j++)
				{
					lbc=lb.c;
					lb.c.parentNode.removeChild(lb.c);
					ms[i].parentNode.insertBefore(lbc,ms[i].nextSibling);
				}
			}
		}
	}
	return;
}
function vc()
{
	var h=g.getActiveViewElement();
	var mas=$('div*h|^\\bMore Actions\\b',h);
	for(var i=0;i<mas.length;i++)
	{
		mas[i].addEventListener('click',function()
		{
			setTimeout(um,100);
			return;
		},false);
	}
	return;
}
function lc(h)
{
	var t=new Date().getTime();
	for(var i=0;i<p.length;i++)
	{
		if(p[i].n==h)
		{
			p[i].ts=t;
			GM_setValue("last_used",p.toSource());
			sort();
			return
		}
	}
	p.push({n:h,ts:t});
	GM_setValue("last_used",p.toSource());
	sort();
	return;
}
function ts(a)
{
	var b=0;
	for(var i=0;i<p.length;i++)
	{
		if(p[i].n==a)
		{
			return p[i].ts;
		}
	}
	return null
}

function sort()
{
	var t=null;
	var a=null;
	var b="";
	var c=null;
	t=$("table",l)[0];
	tb=$("tbody",t)[0];
	a=$("a",t);
	for(var i=0;i<a.length;i++)
	{
		if(ind===false)
		{
			a[i].addEventListener("click",function(){lc(this.innerHTML.match(nre)[1])},false);
		}
		c={};
		c.n=a[i].innerHTML.match(nre)[1];
		c.ts=ts(c.n);
		if(c.ts)
		{
			c.c=a[i].parentNode.parentNode.parentNode.parentNode;
			la.push(c);
		}
	}
	la.sort(function(d,e){return (d.ts-e.ts)});
	for(i=0;i<la.length;i++)
	{
		c=la[i].c;la[i].c.parentNode.removeChild(la[i].c);
		tb.insertBefore(c,tb.firstChild);
	}
	ind=true;
	return;
}
function init()
{
	var h="";
	try
	{
		l=g.getNavPaneElement();
		g.registerViewChangeCallback(vc);
	}
	catch(er)
	{
		window.location.reload();
		return;
	}
	l=$('h2*t|\\bLabels\\b',l)[0].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
	sort();
	return;
}
function fn(a)
{
	g=a;setTimeout(init,500);
	return;
}
unsafeWindow.gmonkey.load("1.0",fn)