RateBeer Locals New Message Icon

By David Peters Last update Nov 8, 2005 — Installed 353 times.
// ==UserScript==

// @name           RateBeer Locals New Message Icon
// @description    Indicates when a new message has been posted to a locals group
// @include        http://www.ratebeer.com/*
// ==/UserScript==


// Copied from: http://www.netspade.com/articles/javascript/cookies.xml
function getCookie(name)
{
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1)
    {
        begin = dc.indexOf(prefix);
        if (begin !== 0) return null;
    }
    else
    {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end === -1)
    {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

// Copied from: http://www.netspade.com/articles/javascript/cookies.xml
function setCookie(name, value, expires, path, domain, secure)
{

    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");

}

// Copied from: http://www.netspade.com/articles/javascript/cookies.xml
function deleteCookie(name, path, domain)
{
    if (getCookie(name))
    {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

function setLocalsIcon(groupID)
{
  var box = document.createElement("div");
  box.style.border = "2px solid red";
  box.style.background = "orange";
  box.style.display = "inline";
  box.style.width = "40px";

  var link = document.createElement("a");
  link.href = "http://www.ratebeer.com/Groups/Group-View.asp?GroupID=" + groupID;
  link.innerHTML = "L";
  link.style.padding = "3px";

  box.appendChild(link);

  // Find the TD w/ the My Account link
  var allCells, thisCell;
  allCells = document.evaluate(
      "//td[child::a[@href='/messages.asp']][position()=1]",
      document,
      null,
      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
      null);

  if (allCells.snapshotLength > 0)
  {
    thisCell = allCells.snapshotItem(0);
    thisCell.insertBefore(box, thisCell.childNodes[0]);
  }
}

function getNewestMessageID(elem)
{
  var messageID = "";
  var linkStart = "/Groups/Message-Show.asp?MessageID=";

  var allLinks, thisLink;
  allLinks = document.evaluate(
      ".//a[starts-with(@href, '" + linkStart + "')][position()=1]",
      elem,
      null,
      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
      null);


  if (allLinks.snapshotLength > 0)
  {
    thisLink = allLinks.snapshotItem(0);

    var messageLink = thisLink.href;
    messageID = messageLink.substring(messageLink.indexOf(linkStart) + linkStart.length);
  }

  return messageID;
}

var g_monthOut = new Date(Date.now() + 24*60*60*1000*30); // Adds 30 days
var g_tenMinutesOut = new Date(Date.now() + 1000*60*10);
var g_groupID = getCookie("GroupID");
var g_location = String(window.location);

function setGroupID(groupID)
{
  setCookie("GroupID", groupID, g_monthOut, "/");
}

function setNewestMessageID(messageID)
{
  setCookie("NewestMessageID", messageID, g_monthOut, "/");
}

function setNewMessageFound()
{
  setCookie("NewMessageFound", "1", null, "/");
}

function setMessagesChecked()
{
  setCookie("MessagesChecked", "1", g_tenMinutesOut, "/");
}

if (g_location.indexOf("http://www.ratebeer.com/Groups/Group-View.asp") > -1)
{
  var groupIDName = "GroupID=";
  // the group ID of the page we're on
  var curGroupID = g_location.substring(g_location.indexOf(groupIDName) + groupIDName.length);

  if (getCookie("NewMessageFound") == "1")
  {
    // nuke the new message found cookie on the locals page for the selected group
    if (g_groupID == curGroupID)
    {
      deleteCookie("NewMessageFound", "/");
    }
    // Keep showing the icon for other groups
    else
    {
      setLocalsIcon(g_groupID);
    }
  }

  // Show the button for groups other than the current
  if (g_groupID != curGroupID)
  {

    // Find the Local Events label
    var elems, elem
    elems = document.evaluate(
        "//span[@class='greenbeerhed'][1]",
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null);

    if (elems.snapshotLength > 0)
    {
      elem = elems.snapshotItem(0);

      var btn = document.createElement("button");
      btn.innerHTML = "Display New Messages Icon for this Group";
      btn.onclick = function()
      {
        var groupID = g_location.substring(g_location.indexOf(groupIDName) + groupIDName.length);
        setGroupID(groupID);
        setLocalsIcon(groupID);

        var newestMessageID = getNewestMessageID(document);
        setNewestMessageID(newestMessageID);
        setMessagesChecked();


        alert("Success: group set to " + groupID + ".  The above orange icon is what you'll see when a new message arrives for this group.");
      }

      elem.parentNode.insertBefore(btn, elem);
      elem.parentNode.insertBefore(document.createElement("br"), elem);
    }
  }
}
else if(g_groupID)
{
  var messagesChecked = getCookie("MessagesChecked");
  var newMessageFound = getCookie("NewMessageFound");

  if (newMessageFound == "1")
  {
    setLocalsIcon(g_groupID);
  }
  // This will return null when the MessagesChecked cookie expires
  else if (!messagesChecked)
  {   
    // Check messages, get newest message ID, compare, and display icon if different
    var localsURL = "http://www.ratebeer.com/Groups/Group-View.asp?GroupID=" + g_groupID;

    GM_xmlhttpRequest({
        method: "GET",
        url: localsURL,
        headers: {
            "User-agent": "Mozilla/4.0 (compatible) Greasemonkey",
            "Accept": "application/atom+xml,application/xml,text/xml",
        },
        onload: function(responseDetails) {

          var prevNewestMessageID = getCookie("NewestMessageID");

          var tmp = document.createElement("div");
          tmp.innerHTML = responseDetails.responseText;

          var messageID = getNewestMessageID(tmp);

          if (messageID != "")
          {
            if (prevNewestMessageID)
            {
              if (prevNewestMessageID != messageID)
              {
                setNewestMessageID(messageID);
                setNewMessageFound();
                setLocalsIcon(g_groupID);
              }
            }
            else
            {
              // This should only fire when only the Group ID cookie is present - sort of an error condition
              setNewestMessageID(messageID);
              setLocalsIcon(g_groupID);
            }
            setMessagesChecked();
          }
        }
    });
  }
}