Helgon.net new visitor awareness

By Henrik N Last update Oct 9, 2006 — Installed 708 times.
// ==UserScript==
// @name          Helgon.net new visitor awareness
// @namespace     http://henrik.nyh.se
// @description   Displays (next to the visitor counter on your user info page) the number of new visits since the last time you checked the visitor list. New visitors are highlighted in that list.
// @include       http://*helgon.net/*
// ==/UserScript==

// TODO: Possibly: Visitors page could XHR user info, so reloading visitors page without going by the user info page still keeps track of new visitors. Currently, constantly reloading the visitors page without visiting the user info page inbetween will not highlight those visits as "unseen" nor subsequently mark them as "seen", on the visitors page. Only the user info page learns of new visitors.

var href = location.href;

if (href.match(/userinfo/i) && $xs("//a[contains(translate(@href, 'USERSETUP', 'usersetup'), 'usersetup')]")) {
	// On own userinfo

	var visitors_link = $xs("//a[contains(translate(@href, 'VISITORS', 'visitors'), 'visitors')]");
	var visitor_count = parseInt(visitors_link.innerHTML);
	GM_setValue("visitor_count", visitor_count);
	var checked_count = GM_getValue("checked_count", 0);
	var to_check = visitor_count - checked_count;
	
	var change = document.createElement("span");
	change.innerHTML = '+' + to_check;
	if (to_check > 0)
		change.style.color = '#9F9';
	
	insert_after_counter(document.createTextNode(")"));	
	insert_after_counter(change);
	insert_after_counter(document.createTextNode(" ("));
	
} else if (href.match(/visitors/i) && $xs("//a[contains(translate(@href, 'LASTVISITS', 'lastvisits'), 'lastvisits')]")) {
	// On own visitors page
	
	GM_addStyle(
		"tr.GM_oldVisitor {opacity:0.4;}"
	);

	var visitor_count = GM_getValue("visitor_count");
	var checked_count = GM_getValue("checked_count", visitor_count);
	var to_check = visitor_count - checked_count;
	if (to_check > 20) to_check = 20;

	if (to_check) {
		var row, all_rows = $x("//td[.='Inloggad senast']/ancestor::table[1]//tr");
		
		for (var i = 2; row = all_rows[i]; i++) {
			if (i < 2+to_check) {  // New visitor
				if (i == 2) row.className += ' GM_lastNewVisitor';
				row.className += ' GM_newVisitor';
				if (i == 1+to_check) row.className += ' GM_firstNewVisitor';
			} else {  // Old visitor
				row.className += ' GM_oldVisitor';				
			}
		}
	}
	
	if (visitor_count)
		GM_setValue("checked_count", visitor_count);
}


function insert_after_counter(node) {
	visitors_link.parentNode.insertBefore(node, visitors_link.nextSibling);
}


function $x(query, root) {
	var results = [], snapshot = document.evaluate(query, root || document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0, j = snapshot.snapshotLength; i < j; i++) results.push(snapshot.snapshotItem(i));
	return results;
}
function $xs(query, root) { return document.evaluate(query, root || document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; }
function with_each(query, cb, root) {
	var results = $x(query, root);
	for (var i = 0, j = results.length; i < j; i++)
		cb(results[i]);
}