iWiW favorite friends

By KARASZI István Last update Jul 18, 2008 — Installed 280 times.
// Copyright 2008 Istvan Karaszi <iwiw@spam.raszi.hu>.
// All rights Reserved.

// ==UserScript==
// @name          iWiW favorite friends
// @namespace     http://userscripts.org/users/20715/scripts
// @description	  You can reach your favorite friends with only one click. This is the ultimate stalker ;)
// @include       http://*wiw.hu/*
// @include       https://*wiw.hu/*
// ==/UserScript==

const COOKIENAME = "iwiw-favorited-users";
const DATASEPARATOR = ":";
const NAMESEPARATOR = "|";
const CSSRULES = [
	"ul.favorites { background: #000066; list-style: none; padding: 5px; line-height: 15px; }",
	"ul.favorites li a { color: #fff !important; font-weight: bold; }",
	"ul.favorites li { display: inline; padding: 0 10px 5px 0; }"
];

var wLocation = String(window.location.href);
var wPath = String(window.location.pathname);

_appendCSSRules();

var favs = _getFavoritedUsers();
if (favs.length != 0) {
	_listFavorites();
}

_addButton();

function _appendCSSRules() {
	for (var i = 0; i < CSSRULES.length; i++) {
		GM_addStyle(CSSRULES[i])
	}
}

function _addButton() {
	if (!wPath.match(/^\/pages\/user\//)) return;

	var results = _XPath("//xhtml:div[contains(@class, 'inner_menu')]/xhtml:table[contains(@class, 'menu')]/xhtml:tr");
	if (!results.snapshotLength) return null;

	var menu = results.snapshotItem(0);

	var uidresults = _XPath("//xhtml:div[@id='im_sendmessage']//xhtml:a[contains(@href, 'userID')]", menu);
	if (!uidresults.snapshotLength) return null;

	var anchor = uidresults.snapshotItem(0);
	var uid = _getUserID(String(anchor.href));
	if (uid == null) return null;

	var favorites = _getFavoritedUsers();
	if (_isUserFavorited(uid, favorites) != null) return;

	var headresults = _XPath("//xhtml:head/xhtml:title");
	if (!headresults.snapshotLength) return null;

	var title = String(headresults.snapshotItem(0).textContent);
	var matches = title.match(/iWiW - (.*?) - Adatlap/);
	if (!matches || matches.length == 0) return null;

	var name = matches[1];

	var td = document.createElement("td");
	td.setAttribute("class", "usermenulinks");

	var div = document.createElement("div");
	div.setAttribute("id", "im_favorite");
	td.appendChild(div);

	var idiv = document.createElement("div");
	div.appendChild(idiv);

	var a = document.createElement("a");
	a.setAttribute("href", "#");
	idiv.appendChild(a);

	var s = document.createElement("span");
	a.appendChild(s);

	var si = document.createElement("span");
	si.textContent = "Kedvencekhez";
	s.appendChild(si);

	menu.appendChild(td);

	a.addEventListener("click", function() {
		_addFavoritedUser(uid, name);
		_listFavorites();
		menu.removeChild(td);
		return false;
	}, true);
}

function _listFavorites() {
	var results = _XPath("//xhtml:div[@id='head_wrapper_outer']");
	if (!results.snapshotLength) return null;

	var d = results.snapshotItem(0);

	var u;

	var favres = _XPath("//xhtml:ul[contains(@class, 'favorites')]");
	if (favres.snapshotLength == 1) {
		u = favres.snapshotItem(0);
		while (u.firstChild) {
			u.removeChild(u.firstChild);
		}
	} else {
		u = document.createElement("ul");
		u.setAttribute("class", "favorites");
	}

	var favorites = _getFavoritedUsers();

	for(var i = 0; i < favorites.length; i++) {
		var li = document.createElement("li");

		var uid = favorites[i].uid;

		var a = document.createElement("a");
		a.setAttribute("href", "/pages/user/userdata.jsp?userID=" + uid);
		a.textContent = favorites[i].name + " ";

		var r = document.createElement("a");
		r.setAttribute("href", "#");
		r.addEventListener("click", function() {
			var favorites = _getFavoritedUsers();
			_removeFavoritedUser(uid, favorites);
			_listFavorites();
			_addButton(); // if needed
		}, true);
		r.textContent = "(x)";

		li.appendChild(a);
		li.appendChild(r);

		u.appendChild(li);
	}

	d.appendChild(u);
}

function _getUserID( url ) {
	var regex = /userID=(\d+)/;
	var matches = url.match(regex);

	if (!matches || matches.length == 0) return null;

	return matches[1];
}

function _getFavoritedUsers() {
	var data = new String(GM_getValue(COOKIENAME, ""));
	var users = data.split(DATASEPARATOR);

	var favorites = [];
	for(var i = 0; i < users.length; i++) {
		var user = users[i];
		if (user.length == 0) continue;

		var d = user.split(NAMESEPARATOR, 2);
		if (d.length != 2) continue;

		favorites.push({
			uid:  d[0],
			name: d[1]
		});
	}

	return favorites;
}

function _setFavoritedUsers( data ) {
	var sd = [];

	for(var i = 0; i < data.length; i++) {
		sd.push(String(data[i].uid + NAMESEPARATOR + data[i].name));
	}

	GM_setValue(COOKIENAME, sd.join(DATASEPARATOR));
}

function _addFavoritedUser( uid, name ) {
	var favorites = _getFavoritedUsers();
	if (_isUserFavorited(uid, favorites) == null) {
		favorites.push({
			uid: uid,
			name: name
		});

		_setFavoritedUsers(favorites);
	}
}

function _isUserFavorited( uid, favorites ) {
	for(var i = 0; i < favorites.length; i++) {
		if (favorites[i].uid == uid) return i;
	}

	return null;
}

function _removeFavoritedUser( uid, favorites ) {
	var pos = _isUserFavorited(uid, favorites);
	if (pos != null) {
		favorites.splice(pos, 1);
		_setFavoritedUsers(favorites);
	}
}

function _XPath( query, context ) {
	if (!context) context = document;

	var d = context;
	if (context.ownerDocument) d = context.ownerDocument;

	return d.evaluate(query, context, nsResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

function nsResolver( prefix ) {
	var ns = {
		'xhtml' : 'http://www.w3.org/1999/xhtml'
	};

	return ns[prefix] || null;
}

// vim: ts=4 sw=4