LF Quick Voting

By deathburger Last update Sep 19, 2005 — Installed 469 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// ==UserScript==
// @name          LF Quick Voting
// @namespace     http://users.linkfilter.net/~deathburger/
// @description	  Retrofit the Otter voting system onto Linkfilter
// @include       http://linkfilter.net/*
// @include       http://www.linkfilter.net/*
// @exclude       http://beta.linkfilter.net/*
// ==/UserScript==

/*
   This replaces the number links one normally votes with in favor of stars,
   and a behind-the-scenes vote so there is no page reload to give someone
   a vote.

   It has limitations, such as being unable to update the displayed averages.

   This is probably a poor choice of script for someone who is just getting
   their feet wet with Greasemonkey scripting.
*/

(function() {
  window.addEventListener("load", function(e) {
try{

var strs = document.getElementsByTagName("a");
var str, i;
var found = false;
var skin = readCookie("lfskin");
var voteurl = "";

for (i=0; str = strs[i]; ++i)
{
  if(str.getAttribute("href") && str.getAttribute("href").indexOf("/?cmd=vote;") != -1)
  {
    found = true;
    var url = str.getAttribute("href").split(";");
    var j,v,l;
    for(j=0;v=url[j];++j)
    {
	if(v && v.indexOf("rating=") != -1)
	{
	    v = v.split("=")[1];
	    break;
	}
    }
    for(j=0;l=url[j];++j)
    {
	if(l && l.indexOf("lid=") != -1)
	{
	    l = l.split("=")[1];
	    break;
	}
    }
    if(str.firstChild)
        str.removeChild(str.firstChild);
    if(str.previousSibling && str.previousSibling.nodeName == "#text")
    {
	var clip = (skin == "digital" ? 2 : (skin == "digitalsnow" ? 2 : (skin == "stripped" ? 21 : 20)));
	var info = document.createTextNode(str.previousSibling.nodeValue.substring(0, str.previousSibling.length - clip));
	str.parentNode.replaceChild(info, str.previousSibling);

/* This will get the current rating in Robot Dreams, but since it's not universal I can't use it. */
/*
	var rating = info.nodeValue.split("\n");
	rating = rating[rating.length-1].split(/Rating: /)
	rating = rating[rating.length-1].split(/ \/ /)[0];
	alert("'"+rating+"'");
*/
    }
    if(str.nextSibling && str.nextSibling.nodeName == "#text" && v == 10)
    {
	str.parentNode.replaceChild(makestars(l), str.nextSibling);
	voteurl = str.getAttribute("href").split(/;param_string=/)[0];
	voteurl = voteurl.substring(0,voteurl.length - 2);
	voteurl = location.href.split(/.net/)[0] + ".net" + voteurl;
	var votelink = document.createElement("a");
	votelink.setAttribute("href",voteurl);
	votelink.setAttribute("id","qv"+l);
        str.parentNode.appendChild(votelink);
    }
  }
  if(i == strs.length)
    break;
}

if(found)
{
    var buf =	'var currentvote = "";\
function voteover()\
{\
    var lid = currentvote.split("l")[1].split("v")[0];\
    var vote = currentvote.split("l")[1].split("v")[1];\
    var back, i;\
    var left = true;\
    for(i=1; back=document.getElementById("l"+lid+"v"+i); ++i)\
    {\
	back.setAttribute("src", left ? "'+redleft+'" : "'+redright+'");\
	left = !left;\
	if(i == vote)\
	    break;\
    }\
}\
function voteout()\
{\
    var lid = currentvote.split("l")[1].split("v")[0];\
    var back, i;\
    var left = true;\
    for(i=1; back=document.getElementById("l"+lid+"v"+i); ++i)\
    {\
	back.setAttribute("src", left ? "'+greyleft+'" : "'+greyright+'");\
	left = !left;\
	if(i > 11)\
	    break;\
    }\
}\
function dovote()\
{\
    var lid = currentvote.split("l")[1].split("v")[0];\
    var vote = currentvote.split("l")[1].split("v")[1];\
    var back, i;\
    var left = true;\
    for(i=1; back=document.getElementById("l"+lid+"v"+i); ++i)\
    {\
	if(i <= vote)\
	{\
	    back.setAttribute("src", left ? "'+purpleleft+'" : "'+purpleright+'");\
	    left = !left;\
	}\
	back.removeAttribute("title");\
	if(i == 10)\
	    break;\
    }\
    back.parentNode.removeAttribute("onmouseover");\
    back.parentNode.removeAttribute("onmouseout");\
    back.parentNode.setAttribute("title","You voted a "+vote+" on this link.");\
    var url = document.getElementById("qv"+lid).getAttribute("href")+vote;\
    var httpreq = new XMLHttpRequest();\
    httpreq.open("GET",url,true);\
    httpreq.send(null);\
}\
';
    document.injectScript(buf);
}

}catch(err){alert(err)}
// End of script
  }, false);
})();

/* Set up the voting stars and their flicker killing container */
function makestars(id)
{
    var first = true;
    var span = document.createElement("span");
    span.setAttribute("onmouseover","voteover()");
    span.setAttribute("onmouseout","voteout()");
    for(i=1; i < 11; ++i)
    {
	var img = document.createElement("img");
	img.setAttribute("src",first ? greyleft : greyright);
	img.setAttribute("id","l"+id+"v"+i)
	img.setAttribute("title","Vote "+i+" on this link")
	img.setAttribute("onmouseover","currentvote = 'l"+id+"v"+i+"';")
	img.setAttribute("onclick","dovote();")
	img.setAttribute("border","0");
	span.appendChild(img);
	first = !first;
    }
    return span;
}
/* Script injector */
document.injectScript = function(data)
{
    var head = document.getElementsByTagName("head").item(0);
    var js = document.createTextNode(data);
    var script = document.createElement("script");
    script.setAttribute("language","Javascript");
    script.setAttribute("type","text/javascript");
    script.appendChild(js);
    head.appendChild(script);
}
function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

// Blue for the current average
var blueleft 	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%82%95%FFv%8A%FF%FB"+
			"%FC%FF%A4%B2%FF%5Cu%FF%BD%C7%FF%E1%E5%FF%E7%EB%FF%CD%D4%FF%9E"+
			"%AD%FF%F0%F3%FFLg%FF9W%FF%3F%5C%FF3R%FF%FF%FF%FF!%F9%04%01%00"+
			"%00%0F%00%2C%00%00%00%00%08%00%0F%00%40%041%F0%C9%F9%D4%3C%81"+
			"%B9F%25%E2%92%B08%C4%D1I%80%028%2C%0Bz%1A%13%16%C5I%D5%9DB%18"+
			"I2%FC%19%CF%C8%D5!l(%2B%D2%04%E1H%08%1E%11%00%3B";
var blueright	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00Jf%FF%D1%D9%FF%B3%B"+
			"E%FF%99%A9%FF%E6%EA%FF%F9%FA%FF9W%FF%C7%CF%FF%DC%E2%FF%80%93%"+
			"FFq%86%FF%5Dv%FF5T%FF%3F%5C%FF3R%FF%FF%FF%FF!%F9%04%01%00%00%"+
			"0F%00%2C%00%00%00%00%08%00%0F%00%40%043P%BCI_s%0E%0C%EAR%9D%C"+
			"5%C0%18%01%05%10%9F%E50%AC%B3%20%0C%B6%A5%C8PL%CA%FD%19%D2%0E"+
			"%04%C0%C0%01q%C1tP%C5%1E%0E%B3H%1D%1A%9EI%04%00%3B";
// Red on mouseover prior to voting, but only beyond the average
var redleft	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%FF%FC%FC%F8%B2%AB%"+
			"FE%F3%F2%FA%C7%C2%F5%86%7C%FD%E7%E5%FB%D4%D1%F8%AD%A6%F2gZ%F6"+
			"%91%88%F3ui%F6%9B%92%F0WI%F1%5CN%F0RC%FF%FF%FF!%F9%04%01%00%0"+
			"0%0F%00%2C%00%00%00%00%08%00%0F%00%40%042%F0%C9%F9%C4%2C%89%B"+
			"9F%A5%E1%12%808J%D1I%8B%908%2C%0Bz%1A%13%0E%C3I%D5%9DP%1EG%E0"+
			"%13%B2%87a%E4%EA(6%94%15ibp%1C%00%8F%08%00%3B";
var redright	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%F5%91%88%F0WI%FD%E"+
			"8%E6%F3vj%FF%FA%F9%F2dV%F9%BD%B8%FC%DF%DC%F8%A9%A1%FC%D7%D3%F"+
			"4%82w%FB%C6%C1%F0TE%F1%5CN%F0RC%FF%FF%FF!%F9%04%01%00%00%0F%0"+
			"0%2C%00%00%00%00%08%00%0F%00%40%044%D0%BCI_s%AE%20%CA%40%9D%0"+
			"4%120%07U%08%9F%E50%AC3%1C%0C%B6%A5%07BL%CA%FD%05%D2%5E%24%40"+
			"%E0%E1%82q%00P%C4%DE%04%80%19%A4%16%0D%CF%24%02%00%3B";
// Purple for what you voted and for the average vote of others
var purpleleft	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%E7%85%E6%ED%A4%EC%"+
			"DE%5C%DD%F5%CE%F5%DCQ%DB%F9%E3%F9%E4y%E3%FE%FB%FE%FC%F1%FC%F2"+
			"%BF%F2%DFa%DF%D8%3C%D7%D8%3E%D7%D9D%D8%D78%D6%FF%FF%FF!%F9%04"+
			"%01%00%00%0F%00%2C%00%00%00%00%08%00%0F%00%40%042%F0%C9%F9%D0"+
			"%2C%86%B9F%E5%E0%D2A8J%D1I%00%028%2C%0Bz%8B%C3%84IrRv%87%08E%"+
			"E0%FB%86%85g%E4%EA%086%94%15i2p%04%0E%8F%08%00%3B";
var purpleright	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%EB%9C%EB%F8%DC%F8%"+
			"E6%83%E5%E3t%E2%FE%F9%FE%DCO%DB%D8%3E%D7%FA%E5%FA%F4%C8%F4%F0"+
			"%B4%F0%DFa%DE%F6%D3%F6%D7%3A%D6%D9D%D8%D78%D6%FF%FF%FF!%F9%04"+
			"%01%00%00%0F%00%2C%00%00%00%00%08%00%0F%00%40%0430%BDI_s%AE%0"+
			"0%EAD%9D%04%600%0BU%1C%9F%E50%AC%A3%04%06%B6%A5%01%40L%C3%FD%"+
			"19%D2%5E%2C%C0%05%E2p%C1tP%C5%1E%0E%A3H!%1A%9EI%04%00%3B";
// Grey for no average and beyond the average
var greyleft	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%AE%AE%AE%FD%FD%FD%"+
			"DE%DE%DE%BE%BE%BE%F1%F1%F1%E7%E7%E7%F8%F8%F8%CF%CF%CF%A6%A6%A"+
			"6%E4%E4%E4%D1%D1%D1%D2%D2%D2%9C%9C%9C%9F%9F%9F%99%99%99%FF%FF"+
			"%FF!%F9%04%01%00%00%0F%00%2C%00%00%00%00%08%00%0F%00%40%041%F"+
			"0%C9%F9%CC%24%83%B9Fe%E1R%808%00%D1I%8318%2C%0Bz%1A%13%0A%C2I"+
			"%D5%9DQ%1E%C7%E2g%92%C4%C8%D5%01l(%2B%D2%A4%E08%04%1E%11%00%3B";
var greyright	=	"data:image/gif,GIF89a%08%00%0F%00%B3%0F%00%BD%BD%BD%EE%EE%EE%"+
			"A7%A7%A7%E8%E8%E8%F3%F3%F3%B3%B3%B3%FC%FC%FC%9C%9C%9C%E3%E3%E"+
			"3%D9%D9%D9%CC%CC%CC%C2%C2%C2%9A%9A%9A%9F%9F%9F%99%99%99%FF%FF"+
			"%FF!%F9%04%01%00%00%0F%00%2C%00%00%00%00%08%00%0F%00%40%0450%"+
			"BDI_s%AE)%EA%40%9D%86r%1C%03%25%10%9F%E50%AC%23%04%07%B6%A5%8"+
			"1bL%C5%FD%1D%D2.%0C%C0%01%22p%C18%16%A8bo%02%C0%14R%88%86g%12"+
			"%01%00%3B";