// 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