Google Reader

By tanguy Last update Nov 12, 2009 — Installed 1,167 times. Daily Installs: 0, 8, 3, 3, 2, 4, 2, 2, 5, 11, 2, 1, 2, 10, 3, 1, 3, 20, 9, 16, 8, 8, 5, 3, 3, 6, 3, 8, 3, 12, 4, 5

There are 5 previous versions of this script.

// ==UserScript==
// @name        Google Reader
// @namespace   http://fluidapp.com
// @description Reader features for Fluid
// @include     http://google.com/reader/*
// @include     http://*.google.com/reader/*
// @version		3.0
// @author      Todd Ditchendorf
// @author		Tanguy de Courson <tanguy@0x7a69.net>
// ==/UserScript==


(function() {
	
    if (!window.fluid) {
        return;
    }
    var focused = true;
	window.onfocus = function(){focused=true;};
	window.onblur = function(){focused=false;};
	
    var fluid_unread = 0;
	var old_fluid_unread = 0
    
    window.fluid.addDockMenuItem("Refresh", function() { refresh(); });
    
    function updateDockBadge() {
        var title = document.title;
        old_fluid_unread = fluid_unread || 0;

        if (title && title.length) {
            var start = title.indexOf("(");
            var end = title.indexOf(")");
            if (start > -1 && end > -1) {
                start++;
                fluid_unread = title.substring(start, end);
            } else {
                fluid_unread = 0;
            }
        }
        
        //set the dock badge
		/*
        if ((fluid_unread || 0) > 0) {
            window.fluid.setDockBadge(fluid_unread);
			
        } else {
            window.fluid.setDockBadge("");  
        }
        */
        //growl if there are more unread items than last time
        if ((fluid_unread || 0) > old_fluid_unread) 
		{
			window.fluid.setDockBadge(fluid_unread);
			if(!focused)
			{
				if(refresh())
					setTimeout(growleachnewnews, 5000);
			}
            fluid.showGrowlNotification({
                title: "Google Reader",
                description: (fluid_unread || "") + " unread item(s)",
                priority: 3,
				onclick: activate_window,
                sticky: false
            });
		
				
			
        }
		else if(fluid_unread == 0)
		{
			window.fluid.setDockBadge(""); 
		}
    }
    setInterval(function(){updateDockBadge();}, 6000);
	
	function refresh()
	{
		//alert(window.fluid.dockBadge);
		var refreshelm = document.getElementById('viewer-refresh');
		
		if(refreshelm)
		{
			var e = document.createEvent('MouseEvents');
			//e.initEvent('click', true, false);
			e.initMouseEvent("click", true, true, window,
			    0, 10, 0, 0, 0, false, false, false, false, 0, null);
			//document.getElementById('viewer-refresh').dispatchEvent(e);
			refreshelm.dispatchEvent(e);
			return true;
		}
		else
			return false;
	}
	function growleachnewnews()
	{
		
		//return;
		var news = getElementsByClassName('entry read');
		for(i=0; i < ((fluid_unread/1)-(old_fluid_unread/1)); i++)
		{
			var feed = news[i].getElementsByClassName('entry-source-title')[0].innerText;
			var preview = news[i].getElementsByClassName('entry-title')[0].innerHTML;
			//alert(i);
			
			fluid.showGrowlNotification({
				title: feed,
				description: preview,
				priority: 1,
				onclick: activate_window,
				identifier: "greader_" + i,
				sticky: false
			});
			
		}
	}
	function activate_window()
	{
		//alert('hi');
		window.fluid.activate();
		window.fluid.unhide()
		this.window.focus();
		window.focus();
		
	}
	function setfocused()
	{
		focused = true;
	}
	function notfocused()
	{
		focused = false;
	}

})();


/* === GETELEMENTSBYCLASSNAME ===
   Developed by Robert Nyman, http://www.robertnyman.com
   Code/licensing: http://code.google.com/p/getelementsbyclassname/
   ============================== */


var getElementsByClassName = function(className, tag, elm) {
    if (document.getElementsByClassName) {
        getElementsByClassName = function(className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
            nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null,
            returnElements = [],
            current;
            for (var i = 0, il = elements.length; i < il; i += 1) {
                current = elements[i];
                if (!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function(className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = "",
            xhtmlNamespace = "http://www.w3.org/1999/xhtml",
            namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace: null,
            returnElements = [],
            elements,
            node;
            for (var j = 0, jl = classes.length; j < jl; j += 1) {
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch(e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else {
        getElementsByClassName = function(className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = [],
            elements = (tag === "*" && elm.all) ? elm.all: elm.getElementsByTagName(tag),
            current,
            returnElements = [],
            match;
            for (var k = 0, kl = classes.length; k < kl; k += 1) {
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for (var l = 0, ll = elements.length; l < ll; l += 1) {
                current = elements[l];
                match = false;
                for (var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
};

/* === //GETELEMENTSBYCLASSNAME === */