//
// 	Author: Joaquin Cuenca [cuenca at loquo dot com]
//  Feb 2005
//

var STAR_ON = "/images/star-on.png";
var STAR_OFF = "/images/star-off.png";

function getExp(d)
{
	var exp = new Date();
	exp.setTime (exp.getTime() + d);
	return "; expires=" + exp.toGMTString();
}

function cookiesActivated()
{
	var c = document.cookie;
	document.cookie = "_a_=y" + getExp(1000);
	if (document.cookie.indexOf("_a_=y") == -1)
		return false;
	document.cookie = "_a_=y" + getExp(-1);
	return true;
}
	
function showFavs()
{
	if (!cookiesActivated())
		return;

  	// preload star-on
	var img = new Image();
	img.src = STAR_ON;
	img.src = STAR_OFF;

	// display things with a "fav" class
	var i, s = document.styleSheets;
	if (!s)
		return;
	var l1 = s.length;
	for (i = 0; i < l1; i++)
	{
		var r = s[i].cssRules;
		if (!r)
		{
			r = s[i].rules;
			if (!r)
				return;
		}

		var l2 = r.length;
		for (var j = 0; j < l2; j++)
		{
			if (r[j].selectorText == ".fav")
			{
				r[j].style["visibility"] = "visible";
				return;
			}
		}
	}
}

showFavs();

var nb_stars = 0;
var MAX_STARS = 300;

if (document.all && !document.getElementById)
{
	document.getElementById = function(id)
	{
		return document.all[id];
	}
}

function to64(N)
{
	var HexN = "", Q = Math.floor(Math.abs(N)), R;
	if (typeof N != 'number' || !isFinite(N))
		return "";

	while (true)
	{
		R=Q%64;
		HexN = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.".charAt(R)+HexN;
		Q=(Q-R)/64; if (Q==0) break;
	}
	return HexN;
}

function from64(st, i)
{
	var Q = 0, t = 0;
	var l = st.length;
	for (; i < l; i++)
	{
		var ch = st.charCodeAt(i);
		
		if (ch >= 65 && ch <= 90)
			t = (ch - 65);
		else if (ch >= 97 && ch <= 122)
			t = (ch - 71);
		else if (ch >= 48 && ch <= 57)
			t = (ch + 4);
		else if (ch == 45)
			t = 62;
		else if (ch == 46)
			t = 63;
		else break;
		Q = Q * 64 + t;
	}
	return Q;
}

function getCookie(key)
{
	var ck = document.cookie;
	if (typeof(ck) == "undefined")
		return "";
		
	var i = ck.indexOf(key + "=");
	var j = ck.indexOf(";", i);
	var st;
	if (i < 0)
		return "";
	if (j < 0)
		return ck.substring(i + 6);
	else
		return ck.substring(i + 6, j);
}

function setCookie(key, v)
{
	if (v.length == 0)
		document.cookie = key + "=" + getExp(-1000) + ";path=/";
	else
		document.cookie = key + "=" + v + getExp(356*24*60*60*1000) + ";path=/";
}

function search(s, i)
{
	var offset = 0;
	var j = 0;
	var l = s.length;
	while (j < l)
	{
		var n = from64(s, j);
		offset += n;
		if (offset >= i)
			return [j, offset - n];

		j = s.indexOf("_", j + 1) + 1;
	}
	return [l, offset];
}

function addOffset(s, x)
{
	if (s == "") return "";
	return to64(from64(s, 0) + x) + s.substring(s.indexOf("_", 0));
}

function updateStarsCount()
{
	var t = document.getElementById("s_quantity");
	if (t) t.innerHTML = nb_stars;
}

function off(i)
{
	var s = getCookie("stars");
	var j = search(s, i)[0];
	if (j < s.length)
	{
		var x = from64(s, j);
		s = s.substring(0, j) + addOffset(s.substring(s.indexOf("_", j) + 1), x);
		setCookie("stars", s);
	}
	nb_stars--;
	updateStarsCount();
}

function on(i)
{
	var s = getCookie("stars");
	var x;
	
	if (nb_stars >= MAX_STARS)
	{
		x = from64(s, 0);
		s = addOffset(s.substring(s.indexOf("_") + 1), x);
		var img = document.getElementById("star" + x);
		if (img) img.src = STAR_OFF;
	}
	else	
		nb_stars++;
		
	var a = search(s, i);
	x = to64(i - a[1]);
	if (a[0] < s.length)
		s = s.substring(0, a[0]) + x + "_" + addOffset(s.substring(a[0]), a[1] - i);
	else
		s += x + "_";

	setCookie("stars", s);
	updateStarsCount();
}

function sw(o)
{
	var i = o.id.substring("s_".length) * 1;
	if (o.src.indexOf(STAR_ON) >= 0)
	{
		o.src = STAR_OFF;
		off(i);
	}
	else
	{
		o.src = STAR_ON;
		on(i);
	}
}

function wr() { sw(this); }

function hookEventHandlers()
{
	if (!cookiesActivated())
		return;

	var i, x = document.images;
	for (i = 0; i < x.length; i++)
	{
		var c = " " + x[i].className + " ";
		if (c.indexOf(" fav ") >= 0 || c.indexOf(" fav_vis ") >= 0)
		{
			x[i].onclick = wr;
			x[i].ondblclick = wr;
		}
	}
	
}

function showFavsAlt()
{
	if (document.styleSheets)
		return;

	var i;
	var items = document.getElementsByTagName("*");
	var l = items.length;
	for (i = 0; i < l; i++)
	{
		var c = " " + items[i].className + " ";
		var j = c.indexOf(" fav ");
		if (j > -1)
			items[i].className = c.replace("fav", "fav_vis");
	}
}

function retrieveStarsAux(img_src)
{
	var s = getCookie("stars"), real_id = 0, j = 0, l = s.length, d;
	var stars_array;

	if (img_src == STAR_ON)
		d = 1;
	else
		d = -1;

	stars_array = s.split("_");

	nb_stars = 0;
	if (s.length > 0)
		nb_stars = stars_array.length - 1;

	updateStarsCount();

	for (id=0;  id < stars_array.length; id++)
	{
		var n = from64(stars_array[id], 0);
		real_id += n;
		var img = document.getElementById("s_" + real_id);
		if (img) img.src = img_src;
	}
}

function retrieveStars() { retrieveStarsAux(STAR_ON); }

function removeAll()
{
	retrieveStarsAux(STAR_OFF);
	setCookie("stars", "");
}